@ornery/ui-grid-vanilla 5.0.1 → 5.0.3
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/dist/adopt-styles.d.ts +1 -0
- package/dist/adopt-styles.d.ts.map +1 -1
- package/dist/browser/ui-grid-element.js +317 -89
- package/dist/components/grid-filter-cell/grid-filter-cell.template.d.ts.map +1 -1
- package/dist/components/grid-group-row/grid-group-row.d.ts +3 -0
- package/dist/components/grid-group-row/grid-group-row.d.ts.map +1 -1
- package/dist/components/grid-group-row/grid-group-row.template.d.ts +1 -0
- package/dist/components/grid-group-row/grid-group-row.template.d.ts.map +1 -1
- package/dist/framework-slots.d.ts +2 -0
- package/dist/framework-slots.d.ts.map +1 -1
- package/dist/grid-controller.d.ts +7 -1
- package/dist/grid-controller.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +234 -67
- package/dist/index.mjs +239 -69
- package/dist/pagination-range-label.d.ts +8 -0
- package/dist/pagination-range-label.d.ts.map +1 -0
- package/dist/patch.d.ts +1 -1
- package/dist/patch.d.ts.map +1 -1
- package/dist/render.d.ts.map +1 -1
- package/dist/templates/index.d.ts +2 -1
- package/dist/templates/index.d.ts.map +1 -1
- package/dist/ui-grid-standalone.element.d.ts +10 -0
- package/dist/ui-grid-standalone.element.d.ts.map +1 -1
- package/package.json +5 -5
- package/src/adopt-styles.ts +31 -1
- package/src/auto-resize.test.ts +4 -2
- package/src/components/grid-filter-cell/grid-filter-cell.template.ts +4 -3
- package/src/components/grid-group-row/grid-group-row.template.ts +6 -4
- package/src/components/grid-group-row/grid-group-row.ts +5 -1
- package/src/framework-slots.ts +38 -17
- package/src/grid-controller.ts +78 -15
- package/src/group-row.test.ts +66 -0
- package/src/index.integration.test.ts +34 -12
- package/src/index.ts +2 -1
- package/src/pagination-range-label.test.ts +85 -0
- package/src/pagination-range-label.ts +10 -0
- package/src/pagination-range.test.ts +60 -0
- package/src/patch.ts +31 -9
- package/src/render.pagination.test.ts +37 -0
- package/src/render.ts +34 -10
- package/src/row-height.test.ts +52 -0
- package/src/scrollbar-compensation.test.ts +52 -0
- package/src/selection-pinning.test.ts +39 -0
- package/src/slot-updates.test.ts +137 -0
- package/src/templates/index.ts +8 -4
- package/src/theming-hooks.test.ts +66 -0
- package/src/ui-grid-empty.template.ts +1 -1
- package/src/ui-grid-shell.template.ts +2 -2
- package/src/ui-grid-standalone.element.ts +41 -2
- package/tsup.config.ts +1 -0
|
@@ -1494,6 +1494,11 @@ function isGroupingEnabled(options) {
|
|
|
1494
1494
|
function canExpandRows(options) {
|
|
1495
1495
|
return options.enableExpandable === true && !!options.expandableRowTemplate;
|
|
1496
1496
|
}
|
|
1497
|
+
function getGroupingValue(row, column, field) {
|
|
1498
|
+
if (column?.groupingValue) return column.groupingValue(row.entity);
|
|
1499
|
+
if (column?.valueGetter || column?.field) return getCellValue(row.entity, column);
|
|
1500
|
+
return getPathValue(row.entity, field);
|
|
1501
|
+
}
|
|
1497
1502
|
function buildRowDisplayItems(rows, options) {
|
|
1498
1503
|
const items = [];
|
|
1499
1504
|
rows.forEach((row, visibleIndex) => {
|
|
@@ -1510,8 +1515,9 @@ function buildGroupedItems(rows, columns, options, groupBy, collapsedGroups, dep
|
|
|
1510
1515
|
}
|
|
1511
1516
|
const [currentField, ...rest] = groupBy;
|
|
1512
1517
|
const groups = /* @__PURE__ */ new Map();
|
|
1518
|
+
const column = columns.find((candidate) => candidate.name === currentField);
|
|
1513
1519
|
for (const row of rows) {
|
|
1514
|
-
const value = stringifyCellValue(
|
|
1520
|
+
const value = stringifyCellValue(getGroupingValue(row, column, currentField));
|
|
1515
1521
|
const key = value || "Unassigned";
|
|
1516
1522
|
const bucket = groups.get(key) ?? [];
|
|
1517
1523
|
bucket.push(row);
|
|
@@ -2435,6 +2441,9 @@ function resolveUiGridWasmAssetUrl(relativePath) {
|
|
|
2435
2441
|
const normalizedBase = normalizeUiGridWasmAssetBase(base);
|
|
2436
2442
|
return `${normalizedBase}${relativePath}`;
|
|
2437
2443
|
}
|
|
2444
|
+
function getConfiguredUiGridWasmAssetBase() {
|
|
2445
|
+
return configuredUiGridWasmAssetBase;
|
|
2446
|
+
}
|
|
2438
2447
|
function getUiGridWasmModulePath() {
|
|
2439
2448
|
return resolveUiGridWasmAssetUrl(uiGridWasmWebModuleRelativePath);
|
|
2440
2449
|
}
|
|
@@ -2449,31 +2458,86 @@ var defaultWasmSerializationAuditOptions = {
|
|
|
2449
2458
|
};
|
|
2450
2459
|
var wasmCore = null;
|
|
2451
2460
|
var wasmInitPromise = null;
|
|
2461
|
+
var wasmInitSource = null;
|
|
2462
|
+
var wasmInitGeneration = 0;
|
|
2463
|
+
var wasmInitState = "idle";
|
|
2452
2464
|
var auditedWasmCore = null;
|
|
2453
2465
|
var auditedWasmCoreSource = null;
|
|
2454
2466
|
var wasmSerializationAuditOptions = {
|
|
2455
2467
|
...defaultWasmSerializationAuditOptions
|
|
2456
2468
|
};
|
|
2457
2469
|
var warnedWasmAuditKeys = /* @__PURE__ */ new Set();
|
|
2470
|
+
function currentWasmInitSource() {
|
|
2471
|
+
return getConfiguredUiGridWasmAssetBase() ?? "package";
|
|
2472
|
+
}
|
|
2473
|
+
var wasmPackageLoader = null;
|
|
2474
|
+
async function loadWasmCoreModule() {
|
|
2475
|
+
if (!getConfiguredUiGridWasmAssetBase()) {
|
|
2476
|
+
if (!wasmPackageLoader) {
|
|
2477
|
+
throw new Error(
|
|
2478
|
+
"UI Grid WASM is opt-in: call enableUiGridWasmEngine() from @ornery/ui-grid-core/wasm, configure a WASM asset base, or register a module with registerUiGridWasmEngineFromModule()."
|
|
2479
|
+
);
|
|
2480
|
+
}
|
|
2481
|
+
return await wasmPackageLoader();
|
|
2482
|
+
}
|
|
2483
|
+
const module = await import(
|
|
2484
|
+
/* webpackIgnore: true */
|
|
2485
|
+
/* turbopackIgnore: true */
|
|
2486
|
+
/* @vite-ignore */
|
|
2487
|
+
getUiGridWasmModulePath()
|
|
2488
|
+
);
|
|
2489
|
+
if (typeof module.default !== "function") {
|
|
2490
|
+
throw new Error("UI Grid WASM web module does not export an initializer");
|
|
2491
|
+
}
|
|
2492
|
+
await module.default(getUiGridWasmBinaryPath());
|
|
2493
|
+
return module;
|
|
2494
|
+
}
|
|
2495
|
+
function registerWasmCoreModule(module) {
|
|
2496
|
+
wasmInitGeneration += 1;
|
|
2497
|
+
wasmCore = module;
|
|
2498
|
+
auditedWasmCore = null;
|
|
2499
|
+
auditedWasmCoreSource = null;
|
|
2500
|
+
wasmInitSource = "registered";
|
|
2501
|
+
wasmInitState = "ready";
|
|
2502
|
+
wasmInitPromise = Promise.resolve(true);
|
|
2503
|
+
}
|
|
2458
2504
|
async function initWasmCore() {
|
|
2459
2505
|
if (wasmCore) {
|
|
2460
2506
|
return true;
|
|
2461
2507
|
}
|
|
2462
|
-
|
|
2463
|
-
|
|
2464
|
-
|
|
2465
|
-
|
|
2466
|
-
|
|
2467
|
-
|
|
2468
|
-
|
|
2469
|
-
|
|
2470
|
-
|
|
2471
|
-
|
|
2472
|
-
|
|
2473
|
-
|
|
2474
|
-
|
|
2508
|
+
const source = currentWasmInitSource();
|
|
2509
|
+
if (wasmInitPromise && wasmInitSource === source) {
|
|
2510
|
+
return wasmInitPromise;
|
|
2511
|
+
}
|
|
2512
|
+
const generation = ++wasmInitGeneration;
|
|
2513
|
+
wasmInitSource = source;
|
|
2514
|
+
wasmInitState = "loading";
|
|
2515
|
+
wasmInitPromise = loadWasmCoreModule().then((module) => {
|
|
2516
|
+
if (generation !== wasmInitGeneration) {
|
|
2517
|
+
return wasmCore !== null;
|
|
2518
|
+
}
|
|
2519
|
+
wasmCore = module;
|
|
2520
|
+
auditedWasmCore = null;
|
|
2521
|
+
auditedWasmCoreSource = null;
|
|
2522
|
+
wasmInitState = "ready";
|
|
2523
|
+
return true;
|
|
2524
|
+
}).catch(() => {
|
|
2525
|
+
if (generation === wasmInitGeneration) {
|
|
2526
|
+
wasmInitState = "failed";
|
|
2527
|
+
}
|
|
2528
|
+
return false;
|
|
2529
|
+
});
|
|
2475
2530
|
return wasmInitPromise;
|
|
2476
2531
|
}
|
|
2532
|
+
function getWasmCoreInitializationState() {
|
|
2533
|
+
if (wasmCore) {
|
|
2534
|
+
return "ready";
|
|
2535
|
+
}
|
|
2536
|
+
if (wasmInitSource !== currentWasmInitSource()) {
|
|
2537
|
+
return "idle";
|
|
2538
|
+
}
|
|
2539
|
+
return wasmInitState;
|
|
2540
|
+
}
|
|
2477
2541
|
function readGlobalWasmSerializationAuditFlag() {
|
|
2478
2542
|
if (typeof globalThis === "undefined") {
|
|
2479
2543
|
return false;
|
|
@@ -2665,6 +2729,7 @@ function normalizeColumnForWasm(column) {
|
|
|
2665
2729
|
...column,
|
|
2666
2730
|
sortingAlgorithm: void 0,
|
|
2667
2731
|
valueGetter: void 0,
|
|
2732
|
+
groupingValue: void 0,
|
|
2668
2733
|
formatter: void 0,
|
|
2669
2734
|
headerRenderer: void 0,
|
|
2670
2735
|
cellTemplate: void 0,
|
|
@@ -2911,6 +2976,7 @@ function createGridApi(bindings) {
|
|
|
2911
2976
|
const sortChanged = new GridEvent();
|
|
2912
2977
|
const groupingChanged = new GridEvent();
|
|
2913
2978
|
const columnOrderChanged = new GridEvent();
|
|
2979
|
+
const columnSizeChanged = new GridEvent();
|
|
2914
2980
|
const benchmarkComplete = new GridEvent();
|
|
2915
2981
|
const paginationChanged = new GridEvent();
|
|
2916
2982
|
const rowExpandedStateChanged = new GridEvent();
|
|
@@ -3035,6 +3101,7 @@ function createGridApi(bindings) {
|
|
|
3035
3101
|
sortChanged: (listener) => sortChanged.subscribe(listener),
|
|
3036
3102
|
groupingChanged: (listener) => groupingChanged.subscribe(listener),
|
|
3037
3103
|
columnOrderChanged: (listener) => columnOrderChanged.subscribe(listener),
|
|
3104
|
+
columnSizeChanged: (listener) => columnSizeChanged.subscribe(listener),
|
|
3038
3105
|
benchmarkComplete: (listener) => benchmarkComplete.subscribe(listener)
|
|
3039
3106
|
},
|
|
3040
3107
|
raise: {
|
|
@@ -3049,6 +3116,7 @@ function createGridApi(bindings) {
|
|
|
3049
3116
|
sortChanged: (columnName, direction) => sortChanged.emit(columnName, direction),
|
|
3050
3117
|
groupingChanged: (groupBy) => groupingChanged.emit(groupBy),
|
|
3051
3118
|
columnOrderChanged: (order) => columnOrderChanged.emit(order),
|
|
3119
|
+
columnSizeChanged: (columnName, width) => columnSizeChanged.emit(columnName, width),
|
|
3052
3120
|
benchmarkComplete: (result) => benchmarkComplete.emit(result)
|
|
3053
3121
|
},
|
|
3054
3122
|
refresh: bindings.refresh,
|
|
@@ -3511,9 +3579,6 @@ function cancelGridCellEditCommand(gridApi, access) {
|
|
|
3511
3579
|
return { focusTarget: editingCell };
|
|
3512
3580
|
}
|
|
3513
3581
|
var registeredRustWasmBindings = null;
|
|
3514
|
-
function activeGridEngineBackend() {
|
|
3515
|
-
return registeredRustWasmBindings ? "rust-wasm" : "typescript";
|
|
3516
|
-
}
|
|
3517
3582
|
var RustBackedGridEngine = class {
|
|
3518
3583
|
buildPipeline(context) {
|
|
3519
3584
|
if (registeredRustWasmBindings) {
|
|
@@ -3523,11 +3588,8 @@ var RustBackedGridEngine = class {
|
|
|
3523
3588
|
}
|
|
3524
3589
|
};
|
|
3525
3590
|
var defaultGridEngine = new RustBackedGridEngine();
|
|
3526
|
-
|
|
3527
|
-
|
|
3528
|
-
if (!ready) {
|
|
3529
|
-
throw new Error("Failed to initialize UI Grid WASM module");
|
|
3530
|
-
}
|
|
3591
|
+
function registerUiGridWasmEngineFromModule(module) {
|
|
3592
|
+
registerWasmCoreModule(module);
|
|
3531
3593
|
}
|
|
3532
3594
|
function downloadGridCsvFile(csv, filename) {
|
|
3533
3595
|
if (typeof Blob === "undefined" || typeof URL === "undefined" || typeof document === "undefined") {
|
|
@@ -3744,7 +3806,8 @@ var FrameworkSlotBridge = class {
|
|
|
3744
3806
|
this.diffAndEmit(
|
|
3745
3807
|
this.lastExpandableRowSlots,
|
|
3746
3808
|
this.pendingExpandableRowSlots,
|
|
3747
|
-
"expandableRowSlotsChanged"
|
|
3809
|
+
"expandableRowSlotsChanged",
|
|
3810
|
+
(previous, current) => previous.context.row !== current.context.row || previous.rowIndex !== current.rowIndex || previous.context.expanded !== current.context.expanded
|
|
3748
3811
|
);
|
|
3749
3812
|
this.lastExpandableRowSlots = this.pendingExpandableRowSlots;
|
|
3750
3813
|
this.pendingExpandableRowSlots = /* @__PURE__ */ new Map();
|
|
@@ -3755,17 +3818,26 @@ var FrameworkSlotBridge = class {
|
|
|
3755
3818
|
);
|
|
3756
3819
|
this.lastGroupRowSlots = this.pendingGroupRowSlots;
|
|
3757
3820
|
this.pendingGroupRowSlots = /* @__PURE__ */ new Map();
|
|
3758
|
-
this.diffAndEmit(
|
|
3821
|
+
this.diffAndEmit(
|
|
3822
|
+
this.lastHeaderSlots,
|
|
3823
|
+
this.pendingHeaderSlots,
|
|
3824
|
+
"headerSlotsChanged",
|
|
3825
|
+
(previous, current) => previous.context.column !== current.context.column
|
|
3826
|
+
);
|
|
3759
3827
|
this.lastHeaderSlots = this.pendingHeaderSlots;
|
|
3760
3828
|
this.pendingHeaderSlots = /* @__PURE__ */ new Map();
|
|
3761
|
-
this.diffAndEmit(
|
|
3829
|
+
this.diffAndEmit(
|
|
3830
|
+
this.lastFilterSlots,
|
|
3831
|
+
this.pendingFilterSlots,
|
|
3832
|
+
"filterSlotsChanged",
|
|
3833
|
+
(previous, current) => previous.value !== current.value || previous.placeholder !== current.placeholder || previous.disabled !== current.disabled || previous.column !== current.column
|
|
3834
|
+
);
|
|
3762
3835
|
this.lastFilterSlots = this.pendingFilterSlots;
|
|
3763
3836
|
this.pendingFilterSlots = /* @__PURE__ */ new Map();
|
|
3764
|
-
this.diffAndEmitSingleton(
|
|
3765
|
-
|
|
3766
|
-
this.pendingEmptyStateSlot,
|
|
3837
|
+
this.diffAndEmitSingleton(this.lastEmptyStateSlot, this.pendingEmptyStateSlot, [
|
|
3838
|
+
"emptyStateSlotsChanged",
|
|
3767
3839
|
"emptyStateSlotChanged"
|
|
3768
|
-
);
|
|
3840
|
+
]);
|
|
3769
3841
|
this.lastEmptyStateSlot = this.pendingEmptyStateSlot;
|
|
3770
3842
|
this.pendingEmptyStateSlot = null;
|
|
3771
3843
|
}
|
|
@@ -3791,36 +3863,41 @@ var FrameworkSlotBridge = class {
|
|
|
3791
3863
|
flushRemovals() {
|
|
3792
3864
|
this.flush();
|
|
3793
3865
|
}
|
|
3794
|
-
diffAndEmit(previous, current, eventName) {
|
|
3866
|
+
diffAndEmit(previous, current, eventName, changed) {
|
|
3795
3867
|
const added = [];
|
|
3796
3868
|
const removed = [];
|
|
3869
|
+
const updated = [];
|
|
3797
3870
|
for (const [key, slot] of current) {
|
|
3798
|
-
|
|
3871
|
+
const before = previous.get(key);
|
|
3872
|
+
if (!before) added.push(slot);
|
|
3873
|
+
else if (changed?.(before, slot)) updated.push(slot);
|
|
3799
3874
|
}
|
|
3800
3875
|
for (const [key, slot] of previous) {
|
|
3801
3876
|
if (!current.has(key)) removed.push(slot);
|
|
3802
3877
|
}
|
|
3803
|
-
if (added.length === 0 && removed.length === 0) return;
|
|
3878
|
+
if (added.length === 0 && removed.length === 0 && updated.length === 0) return;
|
|
3804
3879
|
this.host.dispatchEvent(
|
|
3805
3880
|
new CustomEvent(eventName, {
|
|
3806
|
-
detail: { added, removed },
|
|
3881
|
+
detail: { added, removed, updated },
|
|
3807
3882
|
bubbles: false,
|
|
3808
3883
|
composed: false
|
|
3809
3884
|
})
|
|
3810
3885
|
);
|
|
3811
3886
|
}
|
|
3812
|
-
diffAndEmitSingleton(previous, current,
|
|
3887
|
+
diffAndEmitSingleton(previous, current, eventNames) {
|
|
3813
3888
|
if (previous === current) return;
|
|
3814
3889
|
if (!previous && !current) return;
|
|
3815
3890
|
const added = current ? [current] : [];
|
|
3816
3891
|
const removed = previous ? [previous] : [];
|
|
3817
|
-
|
|
3818
|
-
|
|
3819
|
-
|
|
3820
|
-
|
|
3821
|
-
|
|
3822
|
-
|
|
3823
|
-
|
|
3892
|
+
for (const eventName of eventNames) {
|
|
3893
|
+
this.host.dispatchEvent(
|
|
3894
|
+
new CustomEvent(eventName, {
|
|
3895
|
+
detail: { added, removed, updated: [] },
|
|
3896
|
+
bubbles: false,
|
|
3897
|
+
composed: false
|
|
3898
|
+
})
|
|
3899
|
+
);
|
|
3900
|
+
}
|
|
3824
3901
|
}
|
|
3825
3902
|
};
|
|
3826
3903
|
function setsEqual(a, b) {
|
|
@@ -4033,17 +4110,20 @@ function slotRegistryMarkup(cellSlots) {
|
|
|
4033
4110
|
function filterRowMarkup(templateColumns, filterCells) {
|
|
4034
4111
|
return `<div class="filter-grid ui-grid-header" style="grid-template-columns:${templateColumns}">${filterCells}</div>`;
|
|
4035
4112
|
}
|
|
4036
|
-
function
|
|
4037
|
-
return
|
|
4113
|
+
function virtualSpacerStyle(totalVirtualHeight, rowSize) {
|
|
4114
|
+
return `height:${totalVirtualHeight}px;--ui-grid-row-height:${rowSize}px`;
|
|
4115
|
+
}
|
|
4116
|
+
function bodyVirtualMarkup(templateColumns, totalVirtualHeight, virtualOffset, bodyContent, rowSize) {
|
|
4117
|
+
return `<div class="grid-virtual-spacer" style="${virtualSpacerStyle(totalVirtualHeight, rowSize)}"><div class="body-grid ui-grid-canvas grid-virtual-body" style="grid-template-columns:${templateColumns};top:${virtualOffset}px">${bodyContent}</div></div>`;
|
|
4038
4118
|
}
|
|
4039
4119
|
function bodyStaticMarkup(templateColumns, bodyContent) {
|
|
4040
4120
|
return `<div class="body-grid ui-grid-canvas" style="grid-template-columns:${templateColumns}">${bodyContent}</div>`;
|
|
4041
4121
|
}
|
|
4042
4122
|
function emptyDataMarkup(heading, description) {
|
|
4043
|
-
return `<div class="empty-state ui-grid-no-row-overlay"><strong>${heading}</strong><p>${description}</p></div>`;
|
|
4123
|
+
return `<div part="empty-state" class="empty-state ui-grid-no-row-overlay"><strong>${heading}</strong><p>${description}</p></div>`;
|
|
4044
4124
|
}
|
|
4045
4125
|
function expandableRowMarkup(expandableContent) {
|
|
4046
|
-
return `<div class="expandable-row ui-grid-row ui-grid-expandable-row" style="grid-column:1 / -1">${expandableContent}</div>`;
|
|
4126
|
+
return `<div part="expandable-row" class="expandable-row ui-grid-row ui-grid-expandable-row" style="grid-column:1 / -1">${expandableContent}</div>`;
|
|
4047
4127
|
}
|
|
4048
4128
|
function treeToggleMarkup(rowId, toggleLabel, iconViewBox, iconPath) {
|
|
4049
4129
|
return `<button type="button" class="row-toggle" data-action="toggle-tree" data-row="${rowId}" aria-label="${toggleLabel}">${iconMarkup("toggle-icon", iconViewBox, iconPath)}<span class="sr-only">${toggleLabel}</span></button>`;
|
|
@@ -4064,6 +4144,12 @@ function resizerMarkup(columnName, headerValue) {
|
|
|
4064
4144
|
return `<button type="button" class="column-resizer" data-action="resize" data-column="${columnName}" aria-label="Resize ${headerValue} column" title="Drag to resize, double-click to auto fit"></button>`;
|
|
4065
4145
|
}
|
|
4066
4146
|
|
|
4147
|
+
// src/pagination-range-label.ts
|
|
4148
|
+
function formatPaginationRangeLabel(range) {
|
|
4149
|
+
if (range.totalItems === 0) return "0 of 0";
|
|
4150
|
+
return `${range.firstRowIndex + 1}-${range.lastRowIndex + 1} of ${range.totalItems}`;
|
|
4151
|
+
}
|
|
4152
|
+
|
|
4067
4153
|
// src/utils/cell-class.ts
|
|
4068
4154
|
function bodyCellClass(isOdd, align, isPinned, isPinnedLeftLast, isPinnedRightFirst, isFocused, isEditing, isRowSelected, isRowFocused, isRowDirty, isRowSaving, isRowError, isCellInvalid) {
|
|
4069
4155
|
let cls = "body-cell ui-grid-cell";
|
|
@@ -4150,7 +4236,10 @@ function renderHeaderCell(el, column, sortEnabled, groupingEnabled, pinningEnabl
|
|
|
4150
4236
|
const selectAll = el.snapshot?.selectAll === true;
|
|
4151
4237
|
const showSelectAll = resolvedSel.enableSelectAll && resolvedSel.multiSelect;
|
|
4152
4238
|
const inner = showSelectAll ? `<button type="button" class="ui-grid-selection-select-all" data-action="select-all" aria-label="Select all rows"${selectAll ? ' aria-checked="true"' : ' aria-checked="false"'}><span class="ui-grid-selection-checkbox${selectAll ? " ui-grid-selection-checkbox-checked" : ""}"></span></button>` : "";
|
|
4153
|
-
|
|
4239
|
+
const pinOffset2 = controller.isPinned(column) ? controller.pinnedOffset(column) : null;
|
|
4240
|
+
const pinClass = pinOffset2 ? ` is-pinned${controller.isPinnedLeftLast(column) ? " is-pinned-left-last" : ""}` : "";
|
|
4241
|
+
const stickyStyle2 = pinOffset2 ? ` style="${escapeHtml(`${pinOffset2.side}:${pinOffset2.offset};`)}"` : "";
|
|
4242
|
+
return `<ui-grid-header-cell part="header-cell" class="header-cell ui-grid-selection-row-header${pinClass}"${stickyStyle2} data-column="selectionRowHeaderCol">${inner}</ui-grid-header-cell>`;
|
|
4154
4243
|
}
|
|
4155
4244
|
if (el.frameworkSlots.hasHeader(column.name)) {
|
|
4156
4245
|
el.frameworkSlots.stageHeader(column);
|
|
@@ -4158,7 +4247,16 @@ function renderHeaderCell(el, column, sortEnabled, groupingEnabled, pinningEnabl
|
|
|
4158
4247
|
const isPinned2 = controller.isPinned(column);
|
|
4159
4248
|
const pinOffset2 = isPinned2 ? controller.pinnedOffset(column) : null;
|
|
4160
4249
|
const stickyStyle2 = pinOffset2 ? `${pinOffset2.side}:${pinOffset2.offset};` : "";
|
|
4161
|
-
|
|
4250
|
+
const slotClassName = headerCellClass(
|
|
4251
|
+
false,
|
|
4252
|
+
isPinned2,
|
|
4253
|
+
controller.isPinnedLeftLast(column),
|
|
4254
|
+
controller.isPinnedRightFirst(column),
|
|
4255
|
+
false,
|
|
4256
|
+
false,
|
|
4257
|
+
false
|
|
4258
|
+
);
|
|
4259
|
+
return `<ui-grid-header-cell part="header-cell" class="${slotClassName}"${stickyStyle2 ? ` style="${escapeHtml(stickyStyle2)}"` : ""} data-column="${escapeHtml(column.name)}" data-pinned="${isPinned2}" data-sticky-style="${escapeHtml(stickyStyle2)}"><slot name="${escapeHtml(slotName)}"></slot></ui-grid-header-cell>`;
|
|
4162
4260
|
}
|
|
4163
4261
|
const sortDirection = controller.getSortDirection(column);
|
|
4164
4262
|
const sortLabel = controller.sortButtonLabel(column);
|
|
@@ -4189,13 +4287,14 @@ function renderHeaderCell(el, column, sortEnabled, groupingEnabled, pinningEnabl
|
|
|
4189
4287
|
isDragTarget,
|
|
4190
4288
|
isDragging
|
|
4191
4289
|
);
|
|
4192
|
-
return `<ui-grid-header-cell class="${className}"${isDraggable ? ' draggable="true"' : ""}${stickyStyle ? ` style="${escapeHtml(stickyStyle)}"` : ""} data-column="${escapeHtml(column.name)}" data-sort-active="${sortDirection !== SORT_DIRECTIONS.none}" data-pinned="${isPinned}" data-pinned-left-last="${isPinnedLeftLast}" data-pinned-right-first="${isPinnedRightFirst}" data-pin-menu-open="${isPinMenuOpen}" data-drag-target="${isDragTarget}" data-dragging="${isDragging}" data-draggable="${isDraggable}" data-sticky-style="${escapeHtml(stickyStyle)}"><span class="header-label">${headerValue}</span><span class="header-actions">${canSort ? `<button type="button" class="header-action" data-action="sort" data-column="${escapeHtml(column.name)}" aria-label="${escapeHtml(sortLabel)}">${el.icons.renderControlIcon(sortIconKey)}<span class="sr-only">${escapeHtml(sortLabel)}</span></button>` : ""}${canGroup ? `<button type="button" class="chip-action${controller.isColumnGrouped(column) ? " chip-action-active" : ""}" data-action="group" data-column="${escapeHtml(column.name)}" aria-label="${escapeHtml(groupingLabel)}">${el.icons.renderControlIcon("group")}<span class="sr-only">${escapeHtml(groupingLabel)}</span></button>` : ""}${canPin ? `<div class="pin-control${isPinMenuOpen ? " pin-control-open" : ""}"><button type="button" class="chip-action pin-trigger${isPinned ? " chip-action-active" : ""}" data-action="pin-trigger" data-column="${escapeHtml(column.name)}" aria-label="${escapeHtml(pinLabel)}">${el.icons.renderControlIcon("pin")}<span class="sr-only">${escapeHtml(pinLabel)}</span></button><div class="pin-menu" role="menu" aria-label="${escapeHtml(pinLabel)}"><button type="button" class="pin-menu-action" data-action="pin-left" data-column="${escapeHtml(column.name)}" aria-label="${escapeHtml(el.snapshot?.labels.pinLeft ?? "Pin left")}">${el.icons.renderIconWithClass("control-icon", "pinLeft")}<span class="sr-only">${escapeHtml(el.snapshot?.labels.pinLeft ?? "Pin left")}</span></button><button type="button" class="pin-menu-action" data-action="pin-right" data-column="${escapeHtml(column.name)}" aria-label="${escapeHtml(el.snapshot?.labels.pinRight ?? "Pin right")}">${el.icons.renderIconWithClass("control-icon", "pinRight")}<span class="sr-only">${escapeHtml(el.snapshot?.labels.pinRight ?? "Pin right")}</span></button></div></div>` : ""}</span>${resizerHtml}</ui-grid-header-cell>`;
|
|
4290
|
+
return `<ui-grid-header-cell part="header-cell" class="${className}"${isDraggable ? ' draggable="true"' : ""}${stickyStyle ? ` style="${escapeHtml(stickyStyle)}"` : ""} data-column="${escapeHtml(column.name)}" data-sort-active="${sortDirection !== SORT_DIRECTIONS.none}" data-pinned="${isPinned}" data-pinned-left-last="${isPinnedLeftLast}" data-pinned-right-first="${isPinnedRightFirst}" data-pin-menu-open="${isPinMenuOpen}" data-drag-target="${isDragTarget}" data-dragging="${isDragging}" data-draggable="${isDraggable}" data-sticky-style="${escapeHtml(stickyStyle)}"><span class="header-label" part="header-label">${headerValue}</span><span class="header-actions" part="header-actions">${canSort ? `<button type="button" class="header-action" data-action="sort" data-column="${escapeHtml(column.name)}" aria-label="${escapeHtml(sortLabel)}">${el.icons.renderControlIcon(sortIconKey)}<span class="sr-only">${escapeHtml(sortLabel)}</span></button>` : ""}${canGroup ? `<button type="button" class="chip-action${controller.isColumnGrouped(column) ? " chip-action-active" : ""}" data-action="group" data-column="${escapeHtml(column.name)}" aria-label="${escapeHtml(groupingLabel)}">${el.icons.renderControlIcon("group")}<span class="sr-only">${escapeHtml(groupingLabel)}</span></button>` : ""}${canPin ? `<div class="pin-control${isPinMenuOpen ? " pin-control-open" : ""}"><button type="button" class="chip-action pin-trigger${isPinned ? " chip-action-active" : ""}" data-action="pin-trigger" data-column="${escapeHtml(column.name)}" aria-label="${escapeHtml(pinLabel)}">${el.icons.renderControlIcon("pin")}<span class="sr-only">${escapeHtml(pinLabel)}</span></button><div class="pin-menu" part="pin-menu" role="menu" aria-label="${escapeHtml(pinLabel)}"><button type="button" class="pin-menu-action" data-action="pin-left" data-column="${escapeHtml(column.name)}" aria-label="${escapeHtml(el.snapshot?.labels.pinLeft ?? "Pin left")}">${el.icons.renderIconWithClass("control-icon", "pinLeft")}<span class="sr-only">${escapeHtml(el.snapshot?.labels.pinLeft ?? "Pin left")}</span></button><button type="button" class="pin-menu-action" data-action="pin-right" data-column="${escapeHtml(column.name)}" aria-label="${escapeHtml(el.snapshot?.labels.pinRight ?? "Pin right")}">${el.icons.renderIconWithClass("control-icon", "pinRight")}<span class="sr-only">${escapeHtml(el.snapshot?.labels.pinRight ?? "Pin right")}</span></button></div></div>` : ""}</span>${resizerHtml}</ui-grid-header-cell>`;
|
|
4193
4291
|
}
|
|
4194
4292
|
function renderFilterCell(el, column) {
|
|
4195
4293
|
if (column.name === "selectionRowHeaderCol") {
|
|
4196
4294
|
const pinOffset2 = el.controller.isPinned(column) ? el.controller.pinnedOffset(column) : null;
|
|
4197
4295
|
const stickyStyle2 = pinOffset2 ? `${pinOffset2.side}:${pinOffset2.offset};` : "";
|
|
4198
|
-
|
|
4296
|
+
const pinClass = pinOffset2 ? " is-pinned" : "";
|
|
4297
|
+
return `<div part="filter-cell" class="filter-cell ui-grid-selection-row-header${pinClass}" data-column="selectionRowHeaderCol"${stickyStyle2 ? ` style="${escapeHtml(stickyStyle2)}"` : ""}></div>`;
|
|
4199
4298
|
}
|
|
4200
4299
|
const value = el.snapshot?.activeFilters[column.name] ?? "";
|
|
4201
4300
|
const controller = el.controller;
|
|
@@ -4205,9 +4304,10 @@ function renderFilterCell(el, column) {
|
|
|
4205
4304
|
if (el.frameworkSlots.hasFilter(column.name)) {
|
|
4206
4305
|
el.frameworkSlots.stageFilter(column, value, controller.filterPlaceholder(column), !canFilter);
|
|
4207
4306
|
const slotName = filterSlotName(column);
|
|
4208
|
-
|
|
4307
|
+
const pinClass = pinOffset ? ` is-pinned${controller.isPinnedLeftLast(column) ? " is-pinned-left-last" : ""}${controller.isPinnedRightFirst(column) ? " is-pinned-right-first" : ""}` : "";
|
|
4308
|
+
return `<div part="filter-cell" class="filter-cell ui-grid-filter-container${pinClass}" data-column="${escapeHtml(column.name)}"${stickyStyle ? ` style="${escapeHtml(stickyStyle)}"` : ""}><slot name="${escapeHtml(slotName)}"></slot></div>`;
|
|
4209
4309
|
}
|
|
4210
|
-
return `<ui-grid-filter-cell data-column="${escapeHtml(column.name)}" data-value="${escapeHtml(value)}" data-placeholder="${escapeHtml(controller.filterPlaceholder(column))}" data-disabled="${!canFilter}" data-pinned="${controller.isPinned(column)}" data-pinned-left-last="${controller.isPinnedLeftLast(column)}" data-pinned-right-first="${controller.isPinnedRightFirst(column)}" data-sticky-style="${escapeHtml(stickyStyle)}"></ui-grid-filter-cell>`;
|
|
4310
|
+
return `<ui-grid-filter-cell part="filter-cell" data-column="${escapeHtml(column.name)}" data-value="${escapeHtml(value)}" data-placeholder="${escapeHtml(controller.filterPlaceholder(column))}" data-disabled="${!canFilter}" data-pinned="${controller.isPinned(column)}" data-pinned-left-last="${controller.isPinnedLeftLast(column)}" data-pinned-right-first="${controller.isPinnedRightFirst(column)}" data-sticky-style="${escapeHtml(stickyStyle)}"></ui-grid-filter-cell>`;
|
|
4211
4311
|
}
|
|
4212
4312
|
function renderDisplayItem(el, item, displayIndex) {
|
|
4213
4313
|
if (!el.snapshot || !el.controller) return "";
|
|
@@ -4216,12 +4316,12 @@ function renderDisplayItem(el, item, displayIndex) {
|
|
|
4216
4316
|
if (el.frameworkSlots.hasGroupRow()) {
|
|
4217
4317
|
el.frameworkSlots.stageGroupRow(group);
|
|
4218
4318
|
const slotName = groupRowSlotName(group);
|
|
4219
|
-
return `<div class="group-row ui-grid-row ui-grid-group-row" data-group="${escapeHtml(group.id)}" style="grid-column:1 / -1"><slot name="${escapeHtml(slotName)}"></slot></div>`;
|
|
4319
|
+
return `<div part="group-row" class="group-row ui-grid-row ui-grid-group-row" data-group="${escapeHtml(group.id)}" style="grid-column:1 / -1"><slot name="${escapeHtml(slotName)}"></slot></div>`;
|
|
4220
4320
|
}
|
|
4221
4321
|
const iconKey = group.collapsed ? "groupCollapsed" : "groupExpanded";
|
|
4222
4322
|
const icon = el.icons.resolve(iconKey);
|
|
4223
4323
|
const disclosureLabel = el.controller.groupDisclosureLabel(group);
|
|
4224
|
-
return `<ui-grid-group-row data-action="toggle-group" data-group="${escapeHtml(group.id)}" data-collapsed="${group.collapsed ? "true" : "false"}" data-field="${escapeHtml(group.field)}" data-label="${escapeHtml(group.label)}" data-count="${group.count}" data-depth="${group.depth}" data-disclosure-label="${escapeHtml(disclosureLabel)}" data-icon-path="${icon.path}" data-icon-view-box="${icon.viewBox ?? "0 0 24 24"}" data-rows-suffix="${escapeHtml(el.
|
|
4324
|
+
return `<ui-grid-group-row part="group-row" data-action="toggle-group" data-group="${escapeHtml(group.id)}" data-collapsed="${group.collapsed ? "true" : "false"}" data-field="${escapeHtml(group.field)}" data-column-label="${escapeHtml(el.controller.groupColumnLabel(group))}" data-label="${escapeHtml(group.label)}" data-count="${group.count}" data-depth="${group.depth}" data-disclosure-label="${escapeHtml(disclosureLabel)}" data-icon-path="${icon.path}" data-icon-view-box="${icon.viewBox ?? "0 0 24 24"}" data-rows-suffix="${escapeHtml(el.controller.groupRowsSuffix(group))}"></ui-grid-group-row>`;
|
|
4225
4325
|
}
|
|
4226
4326
|
if (item.kind === "expandable") {
|
|
4227
4327
|
const row = item.row;
|
|
@@ -4288,7 +4388,7 @@ function renderBodyCell(el, row, column, displayIndex) {
|
|
|
4288
4388
|
isCellInvalid
|
|
4289
4389
|
);
|
|
4290
4390
|
const titleAttr = isCellInvalid ? ` title="${escapeHtml(controller.gridApi.validate.getTitleFormattedErrors(row.entity, column))}"` : "";
|
|
4291
|
-
return `<ui-grid-body-cell class="${className}" tabindex="0"${stickyStyle ? ` style="${escapeHtml(stickyStyle)}"` : ""}${titleAttr} data-row="${escapeHtml(rowId)}" data-column="${escapeHtml(columnName)}" data-odd="${displayIndex % 2 !== 0}" data-align="${escapeHtml(align)}" data-pinned="${isPinned}" data-pinned-left-last="${isPinnedLeftLast}" data-pinned-right-first="${isPinnedRightFirst}" data-focused="${isFocused}" data-editing="${editing}" data-sticky-style="${escapeHtml(stickyStyle)}"><div class="cell-shell" style="padding-inline-start:${escapeHtml(controller.cellIndent(row, column))}">${treeToggle}${expandToggle}<div class="cell-content">${content}</div></div></ui-grid-body-cell>`;
|
|
4391
|
+
return `<ui-grid-body-cell part="body-cell" class="${className}" tabindex="0"${stickyStyle ? ` style="${escapeHtml(stickyStyle)}"` : ""}${titleAttr} data-row="${escapeHtml(rowId)}" data-column="${escapeHtml(columnName)}" data-odd="${displayIndex % 2 !== 0}" data-align="${escapeHtml(align)}" data-pinned="${isPinned}" data-pinned-left-last="${isPinnedLeftLast}" data-pinned-right-first="${isPinnedRightFirst}" data-focused="${isFocused}" data-editing="${editing}" data-sticky-style="${escapeHtml(stickyStyle)}"><div class="cell-shell" style="padding-inline-start:${escapeHtml(controller.cellIndent(row, column))}">${treeToggle}${expandToggle}<div class="cell-content">${content}</div></div></ui-grid-body-cell>`;
|
|
4292
4392
|
}
|
|
4293
4393
|
function renderCellShellContents(el, row, column, displayIndex, editing, templateMarkupMap) {
|
|
4294
4394
|
const controller = el.controller;
|
|
@@ -4326,7 +4426,12 @@ function renderPagination(el, snapshot) {
|
|
|
4326
4426
|
const pageSizes = snapshot.options.paginationPageSizes ?? [10, 25, 50, 100];
|
|
4327
4427
|
const prevIcon = el.icons.resolve("paginationPrev");
|
|
4328
4428
|
const nextIcon = el.icons.resolve("paginationNext");
|
|
4329
|
-
|
|
4429
|
+
const rangeLabel = formatPaginationRangeLabel({
|
|
4430
|
+
firstRowIndex: snapshot.firstRowIndex,
|
|
4431
|
+
lastRowIndex: snapshot.lastRowIndex,
|
|
4432
|
+
totalItems: snapshot.pipeline.totalItems
|
|
4433
|
+
});
|
|
4434
|
+
return `<ui-grid-pagination part="pagination" data-range-label="${escapeHtml(rangeLabel)}" data-current-page="${snapshot.currentPage}" data-total-pages="${snapshot.totalPages}" data-page-label="${escapeHtml(snapshot.labels.paginationPage)}" data-of-label="${escapeHtml(snapshot.labels.paginationOf)}" data-prev-label="${escapeHtml(snapshot.labels.paginationPrevious)}" data-next-label="${escapeHtml(snapshot.labels.paginationNext)}" data-rows-label="${escapeHtml(snapshot.labels.paginationRows)}" data-prev-icon-path="${prevIcon.path}" data-prev-icon-view-box="${prevIcon.viewBox ?? "0 0 24 24"}" data-next-icon-path="${nextIcon.path}" data-next-icon-view-box="${nextIcon.viewBox ?? "0 0 24 24"}" data-page-sizes="${escapeHtml(JSON.stringify(pageSizes))}" data-page-size="${snapshot.pageSize}" data-prev-disabled="${snapshot.currentPage <= 1}" data-next-disabled="${snapshot.currentPage >= snapshot.totalPages}"></ui-grid-pagination>`;
|
|
4330
4435
|
}
|
|
4331
4436
|
function renderSlotRegistry(columns) {
|
|
4332
4437
|
const cellSlots = columns.map((column) => `<slot name="${escapeHtml(`cell-${column.name}`)}"></slot>`).join("");
|
|
@@ -4509,7 +4614,7 @@ function renderPatch(el, plan, root) {
|
|
|
4509
4614
|
reconcilePagination(el, root, snapshot, paginationEnabled && showPagination);
|
|
4510
4615
|
el.frameworkSlots.flush();
|
|
4511
4616
|
}
|
|
4512
|
-
function reconcileBodyRoot(el, root, kind, options, labels, templateColumns, virtualOffset, totalVirtualHeight) {
|
|
4617
|
+
function reconcileBodyRoot(el, root, kind, options, labels, templateColumns, virtualOffset, totalVirtualHeight, rowSize) {
|
|
4513
4618
|
const bodyViewport = root.querySelector(".grid-body-viewport");
|
|
4514
4619
|
if (!bodyViewport) return null;
|
|
4515
4620
|
const currentEmpty = bodyViewport.querySelector(":scope > .empty-state");
|
|
@@ -4546,7 +4651,7 @@ function reconcileBodyRoot(el, root, kind, options, labels, templateColumns, vir
|
|
|
4546
4651
|
return currentVirtual.querySelector(".grid-virtual-body");
|
|
4547
4652
|
}
|
|
4548
4653
|
const fresh2 = createFromMarkup(
|
|
4549
|
-
bodyVirtualMarkup(templateColumns, totalVirtualHeight, virtualOffset, "")
|
|
4654
|
+
bodyVirtualMarkup(templateColumns, totalVirtualHeight, virtualOffset, "", rowSize)
|
|
4550
4655
|
);
|
|
4551
4656
|
if (fresh2) swapBodyChild(bodyViewport, currentNode, fresh2);
|
|
4552
4657
|
return fresh2?.querySelector(".grid-virtual-body") ?? null;
|
|
@@ -4578,15 +4683,26 @@ function reconcilePagination(el, root, snapshot, shouldShow) {
|
|
|
4578
4683
|
function patchFilterCells(el, filterGrid, snapshot) {
|
|
4579
4684
|
const controller = el.controller;
|
|
4580
4685
|
const existing = /* @__PURE__ */ new Map();
|
|
4581
|
-
for (const e of filterGrid.querySelectorAll(
|
|
4686
|
+
for (const e of filterGrid.querySelectorAll(
|
|
4687
|
+
"ui-grid-filter-cell[data-column], .ui-grid-filter-container[data-column]"
|
|
4688
|
+
)) {
|
|
4582
4689
|
const column = e.dataset["column"];
|
|
4583
4690
|
if (column) existing.set(column, e);
|
|
4584
4691
|
}
|
|
4585
4692
|
for (const column of snapshot.visibleColumns) {
|
|
4586
|
-
const target = existing.get(column.name);
|
|
4587
|
-
if (!target) continue;
|
|
4588
4693
|
const value = snapshot.activeFilters[column.name] ?? "";
|
|
4589
4694
|
const canFilter = controller.isColumnFilterable(column);
|
|
4695
|
+
if (el.frameworkSlots.hasFilter(column.name)) {
|
|
4696
|
+
el.frameworkSlots.stageFilter(column, value, controller.filterPlaceholder(column), !canFilter);
|
|
4697
|
+
const target2 = existing.get(column.name);
|
|
4698
|
+
const pinOffset2 = controller.isPinned(column) ? controller.pinnedOffset(column) : null;
|
|
4699
|
+
if (target2) {
|
|
4700
|
+
setAttr(target2, "style", pinOffset2 ? `${pinOffset2.side}:${pinOffset2.offset};` : "");
|
|
4701
|
+
}
|
|
4702
|
+
continue;
|
|
4703
|
+
}
|
|
4704
|
+
const target = existing.get(column.name);
|
|
4705
|
+
if (!target) continue;
|
|
4590
4706
|
const pinOffset = controller.isPinned(column) ? controller.pinnedOffset(column) : null;
|
|
4591
4707
|
const stickyStyle = pinOffset ? `${pinOffset.side}:${pinOffset.offset};` : "";
|
|
4592
4708
|
setAttr(target, "data-value", value);
|
|
@@ -4609,7 +4725,8 @@ function patchBodyRegion(el, root, snapshot, options, labels, templateColumns, v
|
|
|
4609
4725
|
labels,
|
|
4610
4726
|
templateColumns,
|
|
4611
4727
|
virtualOffset,
|
|
4612
|
-
totalVirtualHeight
|
|
4728
|
+
totalVirtualHeight,
|
|
4729
|
+
snapshot.rowSize
|
|
4613
4730
|
);
|
|
4614
4731
|
if (!hasRows) {
|
|
4615
4732
|
el.lastItemsFingerprint = "";
|
|
@@ -4618,8 +4735,9 @@ function patchBodyRegion(el, root, snapshot, options, labels, templateColumns, v
|
|
|
4618
4735
|
const itemsFingerprint = fingerprintItems(itemsToRender);
|
|
4619
4736
|
if (virtualizationEnabled) {
|
|
4620
4737
|
const spacer = root.querySelector(".grid-virtual-spacer");
|
|
4621
|
-
|
|
4622
|
-
|
|
4738
|
+
const spacerStyle = virtualSpacerStyle(totalVirtualHeight, snapshot.rowSize);
|
|
4739
|
+
if (spacer && spacer.getAttribute("style") !== spacerStyle) {
|
|
4740
|
+
spacer.setAttribute("style", spacerStyle);
|
|
4623
4741
|
el.lastTotalVirtualHeight = totalVirtualHeight;
|
|
4624
4742
|
}
|
|
4625
4743
|
if (bodyContainer) {
|
|
@@ -4780,19 +4898,19 @@ function buildRowFingerprint(row, displayIndex, visibleColumns) {
|
|
|
4780
4898
|
return `${displayIndex}|${flags}|${row.treeLevel}|${row.height}|${row.expandedRowHeight}|${invalidBits}`;
|
|
4781
4899
|
}
|
|
4782
4900
|
function patchGroupRow(el, target, group) {
|
|
4783
|
-
const snapshot = el.snapshot;
|
|
4784
4901
|
const controller = el.controller;
|
|
4785
4902
|
const iconKey = group.collapsed ? "groupCollapsed" : "groupExpanded";
|
|
4786
4903
|
const icon = el.icons.resolve(iconKey);
|
|
4787
4904
|
setAttr(target, "data-collapsed", group.collapsed ? "true" : "false");
|
|
4788
4905
|
setAttr(target, "data-field", group.field);
|
|
4906
|
+
setAttr(target, "data-column-label", controller.groupColumnLabel(group));
|
|
4789
4907
|
setAttr(target, "data-label", group.label);
|
|
4790
4908
|
setAttr(target, "data-count", String(group.count));
|
|
4791
4909
|
setAttr(target, "data-depth", String(group.depth));
|
|
4792
4910
|
setAttr(target, "data-disclosure-label", controller.groupDisclosureLabel(group));
|
|
4793
4911
|
setAttr(target, "data-icon-path", icon.path);
|
|
4794
4912
|
setAttr(target, "data-icon-view-box", icon.viewBox ?? "0 0 24 24");
|
|
4795
|
-
setAttr(target, "data-rows-suffix",
|
|
4913
|
+
setAttr(target, "data-rows-suffix", controller.groupRowsSuffix(group));
|
|
4796
4914
|
}
|
|
4797
4915
|
function patchBodyCell(el, cell, row, column, displayIndex, templateMarkupMap) {
|
|
4798
4916
|
const controller = el.controller;
|
|
@@ -4871,7 +4989,11 @@ function patchPagination(el, paginationEl, snapshot) {
|
|
|
4871
4989
|
setAttr(
|
|
4872
4990
|
paginationEl,
|
|
4873
4991
|
"data-range-label",
|
|
4874
|
-
|
|
4992
|
+
formatPaginationRangeLabel({
|
|
4993
|
+
firstRowIndex: snapshot.firstRowIndex,
|
|
4994
|
+
lastRowIndex: snapshot.lastRowIndex,
|
|
4995
|
+
totalItems: snapshot.pipeline.totalItems
|
|
4996
|
+
})
|
|
4875
4997
|
);
|
|
4876
4998
|
setAttr(paginationEl, "data-current-page", String(snapshot.currentPage));
|
|
4877
4999
|
setAttr(paginationEl, "data-total-pages", String(snapshot.totalPages));
|
|
@@ -5847,6 +5969,7 @@ var VanillaGridController = class {
|
|
|
5847
5969
|
columnWidthOverrides = {};
|
|
5848
5970
|
viewportWidth = 0;
|
|
5849
5971
|
currentPage = 1;
|
|
5972
|
+
lastOptionsCurrentPage;
|
|
5850
5973
|
pageSize = 0;
|
|
5851
5974
|
editingCell = null;
|
|
5852
5975
|
editingValue = "";
|
|
@@ -5875,10 +5998,10 @@ var VanillaGridController = class {
|
|
|
5875
5998
|
visibleColumns = [];
|
|
5876
5999
|
apiRegistered = false;
|
|
5877
6000
|
disposed = false;
|
|
5878
|
-
wasmEngineInitRequested = false;
|
|
5879
6001
|
subscribers = /* @__PURE__ */ new Set();
|
|
5880
6002
|
gridApi;
|
|
5881
6003
|
constructor(options) {
|
|
6004
|
+
this.syncPaginationCurrentPage(options);
|
|
5882
6005
|
this.options = options;
|
|
5883
6006
|
this.labels = resolveGridLabels2(options.labels);
|
|
5884
6007
|
this.validatorRegistry = createGridValidatorRegistry2(this.labels);
|
|
@@ -6089,7 +6212,15 @@ var VanillaGridController = class {
|
|
|
6089
6212
|
this.disposeLanguageListener = null;
|
|
6090
6213
|
this.subscribers.clear();
|
|
6091
6214
|
}
|
|
6215
|
+
syncPaginationCurrentPage(options) {
|
|
6216
|
+
const page = options.paginationCurrentPage;
|
|
6217
|
+
if (page !== void 0 && page !== this.lastOptionsCurrentPage) {
|
|
6218
|
+
this.currentPage = Number.isFinite(page) ? Math.max(1, Math.floor(page)) : 1;
|
|
6219
|
+
}
|
|
6220
|
+
this.lastOptionsCurrentPage = page;
|
|
6221
|
+
}
|
|
6092
6222
|
setOptions(options) {
|
|
6223
|
+
this.syncPaginationCurrentPage(options);
|
|
6093
6224
|
this.options = options;
|
|
6094
6225
|
this.labels = resolveGridLabels2(options.labels);
|
|
6095
6226
|
const rebuiltDefaults = createGridValidatorRegistry2(this.labels);
|
|
@@ -6855,8 +6986,10 @@ var VanillaGridController = class {
|
|
|
6855
6986
|
}
|
|
6856
6987
|
setColumnWidthOverride(columnName, widthPx) {
|
|
6857
6988
|
const nextWidth = `${Math.max(88, Math.round(widthPx))}px`;
|
|
6989
|
+
if (this.columnWidthOverrides[columnName] === nextWidth) return;
|
|
6858
6990
|
this.columnWidthOverrides = { ...this.columnWidthOverrides, [columnName]: nextWidth };
|
|
6859
6991
|
this.refresh();
|
|
6992
|
+
this.gridApi.core.raise.columnSizeChanged(columnName, nextWidth);
|
|
6860
6993
|
}
|
|
6861
6994
|
/** Returns the grid-template-columns string as if `columnName` had the given width,
|
|
6862
6995
|
* without triggering a full refresh. Used for smooth drag-resize DOM updates. */
|
|
@@ -6928,22 +7061,42 @@ var VanillaGridController = class {
|
|
|
6928
7061
|
if (typeof condition === "boolean") return condition;
|
|
6929
7062
|
return condition({ row: row.entity, column, rowIndex: row.index });
|
|
6930
7063
|
}
|
|
7064
|
+
// Pin state as laid out: the selection row-header column sits in front of
|
|
7065
|
+
// the left-pinned columns, so it is pinned with them (#7399).
|
|
7066
|
+
layoutPinnedColumns() {
|
|
7067
|
+
const pinned = this.pinnedColumns;
|
|
7068
|
+
if (pinned[SELECTION_COLUMN] !== void 0) return pinned;
|
|
7069
|
+
if (!Object.values(pinned).includes("left")) return pinned;
|
|
7070
|
+
if (this.visibleColumns[0]?.name !== SELECTION_COLUMN) return pinned;
|
|
7071
|
+
return { [SELECTION_COLUMN]: "left", ...pinned };
|
|
7072
|
+
}
|
|
6931
7073
|
isPinned(column) {
|
|
6932
|
-
return this.
|
|
7074
|
+
return this.layoutPinnedColumns()[column.name] !== void 0;
|
|
6933
7075
|
}
|
|
6934
7076
|
isPinnedLeftLast(column) {
|
|
6935
|
-
const
|
|
7077
|
+
const pinned = this.layoutPinnedColumns();
|
|
7078
|
+
const leftPinned = this.visibleColumns.filter((c) => pinned[c.name] === "left");
|
|
6936
7079
|
return leftPinned.length > 0 && leftPinned[leftPinned.length - 1].name === column.name;
|
|
6937
7080
|
}
|
|
6938
7081
|
isPinnedRightFirst(column) {
|
|
6939
|
-
const
|
|
7082
|
+
const pinned = this.layoutPinnedColumns();
|
|
7083
|
+
const rightPinned = this.visibleColumns.filter((c) => pinned[c.name] === "right");
|
|
6940
7084
|
return rightPinned.length > 0 && rightPinned[0].name === column.name;
|
|
6941
7085
|
}
|
|
6942
7086
|
groupDisclosureLabel(group) {
|
|
6943
7087
|
return gridGroupDisclosureLabel2(group.collapsed, this.labels);
|
|
6944
7088
|
}
|
|
7089
|
+
groupColumnLabel(group) {
|
|
7090
|
+
const column = this.options.columnDefs.find((candidate) => candidate.name === group.field);
|
|
7091
|
+
return column ? headerLabel2(column) : group.field;
|
|
7092
|
+
}
|
|
7093
|
+
groupRowsSuffix(group) {
|
|
7094
|
+
const plural = this.labels.groupRowsSuffix;
|
|
7095
|
+
if (group.count !== 1) return plural;
|
|
7096
|
+
return this.labels.groupRowSuffixOne ?? GROUP_ROW_SUFFIX_ONE[plural] ?? plural;
|
|
7097
|
+
}
|
|
6945
7098
|
pinnedOffset(column) {
|
|
6946
|
-
return computePinnedOffset2(this.visibleColumns, this.
|
|
7099
|
+
return computePinnedOffset2(this.visibleColumns, this.layoutPinnedColumns(), column);
|
|
6947
7100
|
}
|
|
6948
7101
|
displayValue(row, column) {
|
|
6949
7102
|
return formatGridCellDisplayValue2(buildGridCellContext2(row, column));
|
|
@@ -7149,17 +7302,24 @@ var VanillaGridController = class {
|
|
|
7149
7302
|
}
|
|
7150
7303
|
this.emit();
|
|
7151
7304
|
}
|
|
7305
|
+
awaitingWasmEngine = false;
|
|
7306
|
+
// WASM is opt-in (#7396). The grid starts a load only when the app set a
|
|
7307
|
+
// WASM asset base; otherwise it waits for a load the app started. Either
|
|
7308
|
+
// way it refreshes once WASM is ready so it switches engines.
|
|
7152
7309
|
maybeEnableWasmEngine() {
|
|
7153
|
-
|
|
7310
|
+
const state = getWasmCoreInitializationState();
|
|
7311
|
+
const optedIn = state === "loading" || state === "idle" && getConfiguredUiGridWasmAssetBase() !== null;
|
|
7312
|
+
if (this.awaitingWasmEngine || !optedIn) {
|
|
7154
7313
|
return;
|
|
7155
7314
|
}
|
|
7156
|
-
this.
|
|
7157
|
-
void
|
|
7158
|
-
|
|
7315
|
+
this.awaitingWasmEngine = true;
|
|
7316
|
+
void initWasmCore().then((ready) => {
|
|
7317
|
+
this.awaitingWasmEngine = false;
|
|
7318
|
+
if (ready && !this.disposed) {
|
|
7159
7319
|
this.refresh();
|
|
7160
7320
|
}
|
|
7161
7321
|
}).catch(() => {
|
|
7162
|
-
this.
|
|
7322
|
+
this.awaitingWasmEngine = false;
|
|
7163
7323
|
});
|
|
7164
7324
|
}
|
|
7165
7325
|
emit() {
|
|
@@ -7204,9 +7364,14 @@ var VanillaGridController = class {
|
|
|
7204
7364
|
this.pageSize
|
|
7205
7365
|
);
|
|
7206
7366
|
}
|
|
7367
|
+
// Core's index helpers describe the slice, which external paging skips; the
|
|
7368
|
+
// range shown and returned by the API is where this page sits in totalItems.
|
|
7369
|
+
rangeOptions() {
|
|
7370
|
+
return this.options.useExternalPagination === true ? { ...this.options, useExternalPagination: false } : this.options;
|
|
7371
|
+
}
|
|
7207
7372
|
getFirstRowIndex() {
|
|
7208
7373
|
return getFirstRowIndexValue2(
|
|
7209
|
-
this.
|
|
7374
|
+
this.rangeOptions(),
|
|
7210
7375
|
this.currentPage,
|
|
7211
7376
|
this.pipeline.totalItems,
|
|
7212
7377
|
this.pageSize
|
|
@@ -7214,7 +7379,7 @@ var VanillaGridController = class {
|
|
|
7214
7379
|
}
|
|
7215
7380
|
getLastRowIndex() {
|
|
7216
7381
|
return getLastRowIndexValue2(
|
|
7217
|
-
this.
|
|
7382
|
+
this.rangeOptions(),
|
|
7218
7383
|
this.currentPage,
|
|
7219
7384
|
this.pipeline.totalItems,
|
|
7220
7385
|
this.pageSize
|
|
@@ -7619,13 +7784,17 @@ var VanillaGridController = class {
|
|
|
7619
7784
|
};
|
|
7620
7785
|
}
|
|
7621
7786
|
};
|
|
7787
|
+
var SELECTION_COLUMN = "selectionRowHeaderCol";
|
|
7788
|
+
var GROUP_ROW_SUFFIX_ONE = {
|
|
7789
|
+
rows: "row",
|
|
7790
|
+
lignes: "ligne",
|
|
7791
|
+
Zeilen: "Zeile",
|
|
7792
|
+
filas: "fila"
|
|
7793
|
+
};
|
|
7622
7794
|
function createVanillaGridController(options) {
|
|
7623
7795
|
return new VanillaGridController(options);
|
|
7624
7796
|
}
|
|
7625
7797
|
|
|
7626
|
-
// scss-inline:/home/runner/work/ui-grid/ui-grid/projects/ui-grid-vanilla/src/ui-grid-shell.scss
|
|
7627
|
-
var ui_grid_shell_default = ':host{--_ui-grid-border-color: var(--ui-grid-border-color, var(--app-ui-grid-border-color, #d4d4d8));--_ui-grid-header-background: var( --ui-grid-header-background, var(--app-ui-grid-header-background, #f3f4f6) );--_ui-grid-row-odd: var(--ui-grid-row-odd, var(--app-ui-grid-row-odd, #fcfcfd));--_ui-grid-row-even: var(--ui-grid-row-even, var(--app-ui-grid-row-even, #f7f7f8));--_ui-grid-row-hover: var( --ui-grid-row-hover, var( --app-ui-grid-row-hover, color-mix(in srgb, var(--_ui-grid-accent) 4%, var(--_ui-grid-surface)) ) );--_ui-grid-row-focus-background: var( --ui-grid-row-focus-background, var( --app-ui-grid-row-focus-background, color-mix(in srgb, var(--_ui-grid-accent) 9%, var(--_ui-grid-surface)) ) );--_ui-grid-cell-color: var(--ui-grid-cell-color, var(--app-ui-grid-cell-color, #111827));--_ui-grid-muted-color: var(--ui-grid-muted-color, var(--app-ui-grid-muted-color, #6b7280));--_ui-grid-surface: var(--ui-grid-surface, var(--app-ui-grid-surface, #ffffff));--_ui-grid-radius: var(--ui-grid-radius, var(--app-ui-grid-radius, 4px));--_ui-grid-shadow: var( --ui-grid-shadow, var(--app-ui-grid-shadow, 0 10px 24px rgba(15, 23, 42, 0.08)) );--_ui-grid-header-weight: var(--ui-grid-header-weight, var(--app-ui-grid-header-weight, 700));--_ui-grid-accent: var(--ui-grid-accent, var(--app-ui-grid-accent, #2563eb));--_ui-grid-group-background: var( --ui-grid-group-background, var(--app-ui-grid-group-background, #eceff3) );--_ui-grid-status-active-bg: var( --ui-grid-status-active-bg, var(--app-ui-grid-status-active-bg, rgba(22, 163, 74, 0.14)) );--_ui-grid-status-active-color: var( --ui-grid-status-active-color, var(--app-ui-grid-status-active-color, #166534) );--_ui-grid-status-expansion-bg: var( --ui-grid-status-expansion-bg, var(--app-ui-grid-status-expansion-bg, rgba(37, 99, 235, 0.14)) );--_ui-grid-status-expansion-color: var( --ui-grid-status-expansion-color, var(--app-ui-grid-status-expansion-color, #1d4ed8) );--_ui-grid-status-enterprise-bg: var( --ui-grid-status-enterprise-bg, var(--app-ui-grid-status-enterprise-bg, rgba(15, 118, 110, 0.14)) );--_ui-grid-status-enterprise-color: var( --ui-grid-status-enterprise-color, var(--app-ui-grid-status-enterprise-color, #115e59) );--_ui-grid-status-pilot-bg: var( --ui-grid-status-pilot-bg, var(--app-ui-grid-status-pilot-bg, rgba(234, 88, 12, 0.14)) );--_ui-grid-status-pilot-color: var( --ui-grid-status-pilot-color, var(--app-ui-grid-status-pilot-color, #c2410c) );--_ui-grid-shell-gap: var(--ui-grid-shell-gap, var(--app-ui-grid-shell-gap, 1.5rem));--_ui-grid-hero-gap: var(--ui-grid-hero-gap, var(--app-ui-grid-hero-gap, 1.5rem));--_ui-grid-hero-padding-block: var( --ui-grid-hero-padding-block, var(--app-ui-grid-hero-padding-block, 1rem) );--_ui-grid-eyebrow-margin-block-end: var( --ui-grid-eyebrow-margin-block-end, var(--app-ui-grid-eyebrow-margin-block-end, 0.5rem) );--_ui-grid-eyebrow-letter-spacing: var( --ui-grid-eyebrow-letter-spacing, var(--app-ui-grid-eyebrow-letter-spacing, 0.18em) );--_ui-grid-eyebrow-font-size: var( --ui-grid-eyebrow-font-size, var(--app-ui-grid-eyebrow-font-size, 0.72rem) );--_ui-grid-hero-title-font-size: var( --ui-grid-hero-title-font-size, var(--app-ui-grid-hero-title-font-size, clamp(1.4rem, 2vw, 2rem)) );--_ui-grid-hero-title-line-height: var( --ui-grid-hero-title-line-height, var(--app-ui-grid-hero-title-line-height, 1.1) );--_ui-grid-hero-deck-max-width: var( --ui-grid-hero-deck-max-width, var(--app-ui-grid-hero-deck-max-width, 56ch) );--_ui-grid-hero-deck-margin-block-start: var( --ui-grid-hero-deck-margin-block-start, var(--app-ui-grid-hero-deck-margin-block-start, 0.75rem) );--_ui-grid-hero-actions-gap: var( --ui-grid-hero-actions-gap, var(--app-ui-grid-hero-actions-gap, 1rem) );--_ui-grid-action-radius: var(--ui-grid-action-radius, var(--app-ui-grid-action-radius, 999px));--_ui-grid-action-padding-block: var( --ui-grid-action-padding-block, var(--app-ui-grid-action-padding-block, 0.8rem) );--_ui-grid-action-padding-inline: var( --ui-grid-action-padding-inline, var(--app-ui-grid-action-padding-inline, 1.1rem) );--_ui-grid-stats-card-min-width: var( --ui-grid-stats-card-min-width, var(--app-ui-grid-stats-card-min-width, 8rem) );--_ui-grid-stats-card-padding-block: var( --ui-grid-stats-card-padding-block, var(--app-ui-grid-stats-card-padding-block, 0.85rem) );--_ui-grid-stats-card-padding-inline: var( --ui-grid-stats-card-padding-inline, var(--app-ui-grid-stats-card-padding-inline, 1rem) );--_ui-grid-stats-card-value-font-size: var( --ui-grid-stats-card-value-font-size, var(--app-ui-grid-stats-card-value-font-size, 1.9rem) );--_ui-grid-metrics-gap: var(--ui-grid-metrics-gap, var(--app-ui-grid-metrics-gap, 1rem));--_ui-grid-metric-card-padding-block: var( --ui-grid-metric-card-padding-block, var(--app-ui-grid-metric-card-padding-block, 1rem) );--_ui-grid-metric-card-padding-inline: var( --ui-grid-metric-card-padding-inline, var(--app-ui-grid-metric-card-padding-inline, 1.1rem) );--_ui-grid-metric-value-font-size: var( --ui-grid-metric-value-font-size, var(--app-ui-grid-metric-value-font-size, 1.3rem) );--_ui-grid-toolbar-gap: var(--ui-grid-toolbar-gap, var(--app-ui-grid-toolbar-gap, 1rem));--_ui-grid-toolbar-padding-block: var( --ui-grid-toolbar-padding-block, var(--app-ui-grid-toolbar-padding-block, 1rem) );--_ui-grid-toolbar-padding-inline: var( --ui-grid-toolbar-padding-inline, var(--app-ui-grid-toolbar-padding-inline, 1.25rem) );--_ui-grid-toolbar-inline-gap: var( --ui-grid-toolbar-inline-gap, var(--app-ui-grid-toolbar-inline-gap, 0.4rem) );--_ui-grid-overflow-x: var(--ui-grid-overflow-x, var(--app-ui-grid-overflow-x, auto));--_ui-grid-overflow-y: var(--ui-grid-overflow-y, var(--app-ui-grid-overflow-y, auto));--_ui-grid-header-z-index: var(--ui-grid-header-z-index, var(--app-ui-grid-header-z-index, 3));--_ui-grid-pinned-cell-z-index: var( --ui-grid-pinned-cell-z-index, var(--app-ui-grid-pinned-cell-z-index, 2) );--_ui-grid-pin-menu-open-z-index: var( --ui-grid-pin-menu-open-z-index, var(--app-ui-grid-pin-menu-open-z-index, 8) );--_ui-grid-pin-menu-z-index: var(--ui-grid-pin-menu-z-index, var(--app-ui-grid-pin-menu-z-index, 20));--_ui-grid-header-cell-gap: var( --ui-grid-header-cell-gap, var(--app-ui-grid-header-cell-gap, 0.75rem) );--_ui-grid-header-cell-padding-block: var( --ui-grid-header-cell-padding-block, var(--app-ui-grid-header-cell-padding-block, 0.85rem) );--_ui-grid-header-cell-padding-inline: var( --ui-grid-header-cell-padding-inline, var(--app-ui-grid-header-cell-padding-inline, 1rem) );--_ui-grid-header-cell-background-active: var( --ui-grid-header-cell-background-active, var( --app-ui-grid-header-cell-background-active, color-mix(in srgb, var(--_ui-grid-accent) 8%, var(--_ui-grid-header-background)) ) );--_ui-grid-pinned-divider-shadow-left: var( --ui-grid-pinned-divider-shadow-left, var( --app-ui-grid-pinned-divider-shadow-left, 2px 0 4px rgba(0, 0, 0, 0.06) ) );--_ui-grid-pinned-divider-shadow-right: var( --ui-grid-pinned-divider-shadow-right, var( --app-ui-grid-pinned-divider-shadow-right, -2px 0 4px rgba(0, 0, 0, 0.06) ) );--_ui-grid-pinned-divider-clip-left: var( --ui-grid-pinned-divider-clip-left, var(--app-ui-grid-pinned-divider-clip-left, inset(0 -4px 0 0)) );--_ui-grid-pinned-divider-clip-right: var( --ui-grid-pinned-divider-clip-right, var(--app-ui-grid-pinned-divider-clip-right, inset(0 0 0 -4px)) );--_ui-grid-header-actions-gap: var( --ui-grid-header-actions-gap, var(--app-ui-grid-header-actions-gap, 0.4rem) );--_ui-grid-control-size: var(--ui-grid-control-size, var(--app-ui-grid-control-size, 2rem));--_ui-grid-control-radius: var( --ui-grid-control-radius, var(--app-ui-grid-control-radius, 999px) );--_ui-grid-control-icon-size: var( --ui-grid-control-icon-size, var(--app-ui-grid-control-icon-size, 1rem) );--_ui-grid-control-background: var( --ui-grid-control-background, var(--app-ui-grid-control-background, var(--_ui-grid-surface)) );--_ui-grid-control-border-color: var( --ui-grid-control-border-color, var(--app-ui-grid-control-border-color, var(--_ui-grid-border-color)) );--_ui-grid-control-color: var( --ui-grid-control-color, var(--app-ui-grid-control-color, var(--_ui-grid-muted-color)) );--_ui-grid-control-background-active: var( --ui-grid-control-background-active, var( --app-ui-grid-control-background-active, color-mix(in srgb, var(--_ui-grid-accent) 12%, var(--_ui-grid-surface)) ) );--_ui-grid-control-border-color-active: var( --ui-grid-control-border-color-active, var( --app-ui-grid-control-border-color-active, color-mix(in srgb, var(--_ui-grid-accent) 35%, var(--_ui-grid-border-color)) ) );--_ui-grid-control-color-active: var( --ui-grid-control-color-active, var(--app-ui-grid-control-color-active, var(--_ui-grid-accent)) );--_ui-grid-pin-menu-offset-block-start: var( --ui-grid-pin-menu-offset-block-start, var(--app-ui-grid-pin-menu-offset-block-start, 0.35rem) );--_ui-grid-pin-menu-gap: var(--ui-grid-pin-menu-gap, var(--app-ui-grid-pin-menu-gap, 0.25rem));--_ui-grid-pin-menu-padding: var( --ui-grid-pin-menu-padding, var(--app-ui-grid-pin-menu-padding, 0.25rem) );--_ui-grid-pin-menu-radius: var(--ui-grid-pin-menu-radius, var(--app-ui-grid-pin-menu-radius, 999px));--_ui-grid-pin-menu-shadow: var( --ui-grid-pin-menu-shadow, var( --app-ui-grid-pin-menu-shadow, 0 10px 24px color-mix(in srgb, var(--_ui-grid-cell-color) 10%, transparent) ) );--_ui-grid-pin-menu-action-size: var( --ui-grid-pin-menu-action-size, var(--app-ui-grid-pin-menu-action-size, 1.75rem) );--_ui-grid-pin-control-collapsed-size: var( --ui-grid-pin-control-collapsed-size, var(--app-ui-grid-pin-control-collapsed-size, 1px) );--_ui-grid-pin-control-transition-duration: var( --ui-grid-pin-control-transition-duration, var(--app-ui-grid-pin-control-transition-duration, 160ms) );--_ui-grid-pin-control-transition-easing: var( --ui-grid-pin-control-transition-easing, var(--app-ui-grid-pin-control-transition-easing, cubic-bezier(0.22, 1, 0.36, 1)) );--_ui-grid-pin-menu-scale-closed: var( --ui-grid-pin-menu-scale-closed, var(--app-ui-grid-pin-menu-scale-closed, 0.72) );--_ui-grid-filter-cell-padding-block-start: var( --ui-grid-filter-cell-padding-block-start, var(--app-ui-grid-filter-cell-padding-block-start, 0.75rem) );--_ui-grid-filter-cell-padding-block-end: var( --ui-grid-filter-cell-padding-block-end, var(--app-ui-grid-filter-cell-padding-block-end, 1rem) );--_ui-grid-filter-cell-padding-inline: var( --ui-grid-filter-cell-padding-inline, var(--app-ui-grid-filter-cell-padding-inline, 1rem) );--_ui-grid-filter-input-padding-block: var( --ui-grid-filter-input-padding-block, var(--app-ui-grid-filter-input-padding-block, 0.55rem) );--_ui-grid-filter-input-padding-inline: var( --ui-grid-filter-input-padding-inline, var(--app-ui-grid-filter-input-padding-inline, 0.7rem) );--_ui-grid-filter-input-focus-outline: var( --ui-grid-filter-input-focus-outline, var( --app-ui-grid-filter-input-focus-outline, 2px solid color-mix(in srgb, var(--_ui-grid-accent) 18%, transparent) ) );--_ui-grid-body-cell-padding-block: var( --ui-grid-body-cell-padding-block, var(--app-ui-grid-body-cell-padding-block, 0.95rem) );--_ui-grid-body-cell-padding-inline: var( --ui-grid-body-cell-padding-inline, var(--app-ui-grid-body-cell-padding-inline, 1rem) );--_ui-grid-cell-shell-gap: var(--ui-grid-cell-shell-gap, var(--app-ui-grid-cell-shell-gap, 0.55rem));--_ui-grid-row-toggle-size: var(--ui-grid-row-toggle-size, var(--app-ui-grid-row-toggle-size, 1.55rem));--_ui-grid-row-toggle-radius: var( --ui-grid-row-toggle-radius, var(--app-ui-grid-row-toggle-radius, 999px) );--_ui-grid-toggle-icon-size: var( --ui-grid-toggle-icon-size, var(--app-ui-grid-toggle-icon-size, 1.1rem) );--_ui-grid-group-disclosure-icon-size: var( --ui-grid-group-disclosure-icon-size, var(--app-ui-grid-group-disclosure-icon-size, 0.9rem) );--_ui-grid-pagination-icon-size: var( --ui-grid-pagination-icon-size, var(--app-ui-grid-pagination-icon-size, 1.2rem) );--_ui-grid-expandable-row-padding-block: var( --ui-grid-expandable-row-padding-block, var(--app-ui-grid-expandable-row-padding-block, 1rem) );--_ui-grid-expandable-row-padding-inline: var( --ui-grid-expandable-row-padding-inline, var(--app-ui-grid-expandable-row-padding-inline, 1.25rem) );--_ui-grid-expandable-row-background: var( --ui-grid-expandable-row-background, var( --app-ui-grid-expandable-row-background, color-mix(in srgb, var(--_ui-grid-accent) 4%, var(--_ui-grid-surface)) ) );--_ui-grid-cell-focus-background: var( --ui-grid-cell-focus-background, var( --app-ui-grid-cell-focus-background, color-mix(in srgb, var(--_ui-grid-accent) 14%, var(--_ui-grid-surface)) ) );--_ui-grid-cell-focus-ring: var( --ui-grid-cell-focus-ring, var( --app-ui-grid-cell-focus-ring, inset 0 0 0 1px color-mix(in srgb, var(--_ui-grid-accent) 28%, transparent) ) );--_ui-grid-cell-editing-background: var( --ui-grid-cell-editing-background, var( --app-ui-grid-cell-editing-background, color-mix(in srgb, var(--_ui-grid-accent) 7%, var(--_ui-grid-surface)) ) );--_ui-grid-cell-editor-border-color: var( --ui-grid-cell-editor-border-color, var( --app-ui-grid-cell-editor-border-color, color-mix(in srgb, var(--_ui-grid-accent) 45%, var(--_ui-grid-border-color)) ) );--_ui-grid-cell-editor-radius: var( --ui-grid-cell-editor-radius, var(--app-ui-grid-cell-editor-radius, calc(var(--_ui-grid-radius) - 1px)) );--_ui-grid-cell-editor-padding-block: var( --ui-grid-cell-editor-padding-block, var(--app-ui-grid-cell-editor-padding-block, 0.45rem) );--_ui-grid-cell-editor-padding-inline: var( --ui-grid-cell-editor-padding-inline, var(--app-ui-grid-cell-editor-padding-inline, 0.55rem) );--_ui-grid-cell-editor-focus-outline: var( --ui-grid-cell-editor-focus-outline, var( --app-ui-grid-cell-editor-focus-outline, 2px solid color-mix(in srgb, var(--_ui-grid-accent) 18%, transparent) ) );--_ui-grid-group-row-gap: var(--ui-grid-group-row-gap, var(--app-ui-grid-group-row-gap, 0.9rem));--_ui-grid-group-row-padding-block: var( --ui-grid-group-row-padding-block, var(--app-ui-grid-group-row-padding-block, 0.9rem) );--_ui-grid-group-row-padding-inline: var( --ui-grid-group-row-padding-inline, var(--app-ui-grid-group-row-padding-inline, 1rem) );--_ui-grid-drag-preview-shadow: var( --ui-grid-drag-preview-shadow, var(--app-ui-grid-drag-preview-shadow, 0 12px 30px rgba(15, 23, 42, 0.16)) );--_ui-grid-drag-preview-radius: var( --ui-grid-drag-preview-radius, var(--app-ui-grid-drag-preview-radius, 0.9rem) );--_ui-grid-drag-placeholder-opacity: var( --ui-grid-drag-placeholder-opacity, var(--app-ui-grid-drag-placeholder-opacity, 0.3) );--_ui-grid-drag-placeholder-background: var( --ui-grid-drag-placeholder-background, var( --app-ui-grid-drag-placeholder-background, color-mix(in srgb, var(--_ui-grid-accent) 9%, var(--_ui-grid-header-background)) ) );--_ui-grid-drag-placeholder-border: var( --ui-grid-drag-placeholder-border, var( --app-ui-grid-drag-placeholder-border, 1px dashed color-mix(in srgb, var(--_ui-grid-accent) 45%, var(--_ui-grid-border-color)) ) );--_ui-grid-drag-placeholder-shadow: var( --ui-grid-drag-placeholder-shadow, var( --app-ui-grid-drag-placeholder-shadow, inset 0 0 0 1px color-mix(in srgb, var(--_ui-grid-accent) 18%, transparent) ) );--_ui-grid-empty-state-gap: var( --ui-grid-empty-state-gap, var(--app-ui-grid-empty-state-gap, 0.35rem) );--_ui-grid-empty-state-min-height: var( --ui-grid-empty-state-min-height, var(--app-ui-grid-empty-state-min-height, 16rem) );--_ui-grid-empty-state-padding: var( --ui-grid-empty-state-padding, var(--app-ui-grid-empty-state-padding, 2rem) );--_ui-grid-pagination-gap: var(--ui-grid-pagination-gap, var(--app-ui-grid-pagination-gap, 1rem));--_ui-grid-pagination-padding-block: var( --ui-grid-pagination-padding-block, var(--app-ui-grid-pagination-padding-block, 0.85rem) );--_ui-grid-pagination-padding-inline: var( --ui-grid-pagination-padding-inline, var(--app-ui-grid-pagination-padding-inline, 1.25rem) );--_ui-grid-pagination-controls-gap: var( --ui-grid-pagination-controls-gap, var(--app-ui-grid-pagination-controls-gap, 0.75rem) );--_ui-grid-pagination-size-gap: var( --ui-grid-pagination-size-gap, var(--app-ui-grid-pagination-size-gap, 0.4rem) );--_ui-grid-pagination-button-padding-block: var( --ui-grid-pagination-button-padding-block, var(--app-ui-grid-pagination-button-padding-block, 0.45rem) );--_ui-grid-pagination-button-padding-inline: var( --ui-grid-pagination-button-padding-inline, var(--app-ui-grid-pagination-button-padding-inline, 0.8rem) );--_ui-grid-pagination-select-padding-block: var( --ui-grid-pagination-select-padding-block, var(--app-ui-grid-pagination-select-padding-block, 0.35rem) );--_ui-grid-pagination-select-padding-inline: var( --ui-grid-pagination-select-padding-inline, var(--app-ui-grid-pagination-select-padding-inline, 0.55rem) );--_ui-grid-status-pill-padding-block: var( --ui-grid-status-pill-padding-block, var(--app-ui-grid-status-pill-padding-block, 0.2rem) );--_ui-grid-status-pill-padding-inline: var( --ui-grid-status-pill-padding-inline, var(--app-ui-grid-status-pill-padding-inline, 0.55rem) );--_ui-grid-status-pill-radius: var( --ui-grid-status-pill-radius, var(--app-ui-grid-status-pill-radius, 999px) );--_ui-grid-status-pill-font-size: var( --ui-grid-status-pill-font-size, var(--app-ui-grid-status-pill-font-size, 0.85rem) );--_ui-grid-status-pill-default-bg: var( --ui-grid-status-pill-default-bg, var(--app-ui-grid-status-pill-default-bg, rgba(15, 23, 42, 0.07)) );display:block;color:var(--_ui-grid-cell-color)}:host *,:host *::before,:host *::after{--ui-grid-border-color: var(--_ui-grid-border-color);--ui-grid-header-background: var(--_ui-grid-header-background);--ui-grid-row-odd: var(--_ui-grid-row-odd);--ui-grid-row-even: var(--_ui-grid-row-even);--ui-grid-row-hover: var(--_ui-grid-row-hover);--ui-grid-row-focus-background: var(--_ui-grid-row-focus-background);--ui-grid-cell-color: var(--_ui-grid-cell-color);--ui-grid-muted-color: var(--_ui-grid-muted-color);--ui-grid-surface: var(--_ui-grid-surface);--ui-grid-radius: var(--_ui-grid-radius);--ui-grid-shadow: var(--_ui-grid-shadow);--ui-grid-header-weight: var(--_ui-grid-header-weight);--ui-grid-accent: var(--_ui-grid-accent);--ui-grid-group-background: var(--_ui-grid-group-background);--ui-grid-status-active-bg: var(--_ui-grid-status-active-bg);--ui-grid-status-active-color: var(--_ui-grid-status-active-color);--ui-grid-status-expansion-bg: var(--_ui-grid-status-expansion-bg);--ui-grid-status-expansion-color: var(--_ui-grid-status-expansion-color);--ui-grid-status-enterprise-bg: var(--_ui-grid-status-enterprise-bg);--ui-grid-status-enterprise-color: var(--_ui-grid-status-enterprise-color);--ui-grid-status-pilot-bg: var(--_ui-grid-status-pilot-bg);--ui-grid-status-pilot-color: var(--_ui-grid-status-pilot-color);--ui-grid-shell-gap: var(--_ui-grid-shell-gap);--ui-grid-hero-gap: var(--_ui-grid-hero-gap);--ui-grid-hero-padding-block: var(--_ui-grid-hero-padding-block);--ui-grid-eyebrow-margin-block-end: var(--_ui-grid-eyebrow-margin-block-end);--ui-grid-eyebrow-letter-spacing: var(--_ui-grid-eyebrow-letter-spacing);--ui-grid-eyebrow-font-size: var(--_ui-grid-eyebrow-font-size);--ui-grid-hero-title-font-size: var(--_ui-grid-hero-title-font-size);--ui-grid-hero-title-line-height: var(--_ui-grid-hero-title-line-height);--ui-grid-hero-deck-max-width: var(--_ui-grid-hero-deck-max-width);--ui-grid-hero-deck-margin-block-start: var(--_ui-grid-hero-deck-margin-block-start);--ui-grid-hero-actions-gap: var(--_ui-grid-hero-actions-gap);--ui-grid-action-radius: var(--_ui-grid-action-radius);--ui-grid-action-padding-block: var(--_ui-grid-action-padding-block);--ui-grid-action-padding-inline: var(--_ui-grid-action-padding-inline);--ui-grid-stats-card-min-width: var(--_ui-grid-stats-card-min-width);--ui-grid-stats-card-padding-block: var(--_ui-grid-stats-card-padding-block);--ui-grid-stats-card-padding-inline: var(--_ui-grid-stats-card-padding-inline);--ui-grid-stats-card-value-font-size: var(--_ui-grid-stats-card-value-font-size);--ui-grid-metrics-gap: var(--_ui-grid-metrics-gap);--ui-grid-metric-card-padding-block: var(--_ui-grid-metric-card-padding-block);--ui-grid-metric-card-padding-inline: var(--_ui-grid-metric-card-padding-inline);--ui-grid-metric-value-font-size: var(--_ui-grid-metric-value-font-size);--ui-grid-toolbar-gap: var(--_ui-grid-toolbar-gap);--ui-grid-toolbar-padding-block: var(--_ui-grid-toolbar-padding-block);--ui-grid-toolbar-padding-inline: var(--_ui-grid-toolbar-padding-inline);--ui-grid-toolbar-inline-gap: var(--_ui-grid-toolbar-inline-gap);--ui-grid-overflow-x: var(--_ui-grid-overflow-x);--ui-grid-overflow-y: var(--_ui-grid-overflow-y);--ui-grid-header-z-index: var(--_ui-grid-header-z-index);--ui-grid-pinned-cell-z-index: var(--_ui-grid-pinned-cell-z-index);--ui-grid-pin-menu-open-z-index: var(--_ui-grid-pin-menu-open-z-index);--ui-grid-pin-menu-z-index: var(--_ui-grid-pin-menu-z-index);--ui-grid-header-cell-gap: var(--_ui-grid-header-cell-gap);--ui-grid-header-cell-padding-block: var(--_ui-grid-header-cell-padding-block);--ui-grid-header-cell-padding-inline: var(--_ui-grid-header-cell-padding-inline);--ui-grid-header-cell-background-active: var(--_ui-grid-header-cell-background-active);--ui-grid-pinned-divider-shadow-left: var(--_ui-grid-pinned-divider-shadow-left);--ui-grid-pinned-divider-shadow-right: var(--_ui-grid-pinned-divider-shadow-right);--ui-grid-pinned-divider-clip-left: var(--_ui-grid-pinned-divider-clip-left);--ui-grid-pinned-divider-clip-right: var(--_ui-grid-pinned-divider-clip-right);--ui-grid-header-actions-gap: var(--_ui-grid-header-actions-gap);--ui-grid-control-size: var(--_ui-grid-control-size);--ui-grid-control-radius: var(--_ui-grid-control-radius);--ui-grid-control-icon-size: var(--_ui-grid-control-icon-size);--ui-grid-control-background: var(--_ui-grid-control-background);--ui-grid-control-border-color: var(--_ui-grid-control-border-color);--ui-grid-control-color: var(--_ui-grid-control-color);--ui-grid-control-background-active: var(--_ui-grid-control-background-active);--ui-grid-control-border-color-active: var(--_ui-grid-control-border-color-active);--ui-grid-control-color-active: var(--_ui-grid-control-color-active);--ui-grid-pin-menu-offset-block-start: var(--_ui-grid-pin-menu-offset-block-start);--ui-grid-pin-menu-gap: var(--_ui-grid-pin-menu-gap);--ui-grid-pin-menu-padding: var(--_ui-grid-pin-menu-padding);--ui-grid-pin-menu-radius: var(--_ui-grid-pin-menu-radius);--ui-grid-pin-menu-shadow: var(--_ui-grid-pin-menu-shadow);--ui-grid-pin-menu-action-size: var(--_ui-grid-pin-menu-action-size);--ui-grid-pin-control-collapsed-size: var(--_ui-grid-pin-control-collapsed-size);--ui-grid-pin-control-transition-duration: var(--_ui-grid-pin-control-transition-duration);--ui-grid-pin-control-transition-easing: var(--_ui-grid-pin-control-transition-easing);--ui-grid-pin-menu-scale-closed: var(--_ui-grid-pin-menu-scale-closed);--ui-grid-filter-cell-padding-block-start: var(--_ui-grid-filter-cell-padding-block-start);--ui-grid-filter-cell-padding-block-end: var(--_ui-grid-filter-cell-padding-block-end);--ui-grid-filter-cell-padding-inline: var(--_ui-grid-filter-cell-padding-inline);--ui-grid-filter-input-padding-block: var(--_ui-grid-filter-input-padding-block);--ui-grid-filter-input-padding-inline: var(--_ui-grid-filter-input-padding-inline);--ui-grid-filter-input-focus-outline: var(--_ui-grid-filter-input-focus-outline);--ui-grid-body-cell-padding-block: var(--_ui-grid-body-cell-padding-block);--ui-grid-body-cell-padding-inline: var(--_ui-grid-body-cell-padding-inline);--ui-grid-cell-shell-gap: var(--_ui-grid-cell-shell-gap);--ui-grid-row-toggle-size: var(--_ui-grid-row-toggle-size);--ui-grid-row-toggle-radius: var(--_ui-grid-row-toggle-radius);--ui-grid-toggle-icon-size: var(--_ui-grid-toggle-icon-size);--ui-grid-group-disclosure-icon-size: var(--_ui-grid-group-disclosure-icon-size);--ui-grid-pagination-icon-size: var(--_ui-grid-pagination-icon-size);--ui-grid-expandable-row-padding-block: var(--_ui-grid-expandable-row-padding-block);--ui-grid-expandable-row-padding-inline: var(--_ui-grid-expandable-row-padding-inline);--ui-grid-expandable-row-background: var(--_ui-grid-expandable-row-background);--ui-grid-cell-focus-background: var(--_ui-grid-cell-focus-background);--ui-grid-cell-focus-ring: var(--_ui-grid-cell-focus-ring);--ui-grid-cell-editing-background: var(--_ui-grid-cell-editing-background);--ui-grid-cell-editor-border-color: var(--_ui-grid-cell-editor-border-color);--ui-grid-cell-editor-radius: var(--_ui-grid-cell-editor-radius);--ui-grid-cell-editor-padding-block: var(--_ui-grid-cell-editor-padding-block);--ui-grid-cell-editor-padding-inline: var(--_ui-grid-cell-editor-padding-inline);--ui-grid-cell-editor-focus-outline: var(--_ui-grid-cell-editor-focus-outline);--ui-grid-group-row-gap: var(--_ui-grid-group-row-gap);--ui-grid-group-row-padding-block: var(--_ui-grid-group-row-padding-block);--ui-grid-group-row-padding-inline: var(--_ui-grid-group-row-padding-inline);--ui-grid-drag-preview-shadow: var(--_ui-grid-drag-preview-shadow);--ui-grid-drag-preview-radius: var(--_ui-grid-drag-preview-radius);--ui-grid-drag-placeholder-opacity: var(--_ui-grid-drag-placeholder-opacity);--ui-grid-drag-placeholder-background: var(--_ui-grid-drag-placeholder-background);--ui-grid-drag-placeholder-border: var(--_ui-grid-drag-placeholder-border);--ui-grid-drag-placeholder-shadow: var(--_ui-grid-drag-placeholder-shadow);--ui-grid-empty-state-gap: var(--_ui-grid-empty-state-gap);--ui-grid-empty-state-min-height: var(--_ui-grid-empty-state-min-height);--ui-grid-empty-state-padding: var(--_ui-grid-empty-state-padding);--ui-grid-pagination-gap: var(--_ui-grid-pagination-gap);--ui-grid-pagination-padding-block: var(--_ui-grid-pagination-padding-block);--ui-grid-pagination-padding-inline: var(--_ui-grid-pagination-padding-inline);--ui-grid-pagination-controls-gap: var(--_ui-grid-pagination-controls-gap);--ui-grid-pagination-size-gap: var(--_ui-grid-pagination-size-gap);--ui-grid-pagination-button-padding-block: var(--_ui-grid-pagination-button-padding-block);--ui-grid-pagination-button-padding-inline: var(--_ui-grid-pagination-button-padding-inline);--ui-grid-pagination-select-padding-block: var(--_ui-grid-pagination-select-padding-block);--ui-grid-pagination-select-padding-inline: var(--_ui-grid-pagination-select-padding-inline);--ui-grid-status-pill-padding-block: var(--_ui-grid-status-pill-padding-block);--ui-grid-status-pill-padding-inline: var(--_ui-grid-status-pill-padding-inline);--ui-grid-status-pill-radius: var(--_ui-grid-status-pill-radius);--ui-grid-status-pill-font-size: var(--_ui-grid-status-pill-font-size);--ui-grid-status-pill-default-bg: var(--_ui-grid-status-pill-default-bg);box-sizing:border-box}:host{isolation:isolate;contain:layout paint}.grid-shell{display:grid;gap:var(--ui-grid-shell-gap)}.grid-hero{display:flex;justify-content:space-between;gap:var(--ui-grid-hero-gap);align-items:end;padding:var(--ui-grid-hero-padding-block) 0;color:var(--ui-grid-cell-color)}.eyebrow{margin:0 0 var(--ui-grid-eyebrow-margin-block-end);text-transform:uppercase;letter-spacing:var(--ui-grid-eyebrow-letter-spacing);font-size:var(--ui-grid-eyebrow-font-size);color:var(--ui-grid-muted-color)}h1{margin:0;font-size:var(--ui-grid-hero-title-font-size);line-height:var(--ui-grid-hero-title-line-height)}.deck{max-width:var(--ui-grid-hero-deck-max-width);margin:var(--ui-grid-hero-deck-margin-block-start) 0 0;color:var(--ui-grid-muted-color)}.hero-actions{display:flex;gap:var(--ui-grid-hero-actions-gap);align-items:center;flex-wrap:wrap}.action{border:0;border-radius:var(--ui-grid-action-radius);padding:var(--ui-grid-action-padding-block) var(--ui-grid-action-padding-inline);font:inherit;cursor:pointer}.action-secondary{background:var(--ui-grid-surface);color:var(--ui-grid-cell-color);border:1px solid var(--ui-grid-border-color)}.stats-card{min-width:var(--ui-grid-stats-card-min-width);padding:var(--ui-grid-stats-card-padding-block) var(--ui-grid-stats-card-padding-inline);border-radius:var(--ui-grid-radius);background:var(--ui-grid-surface);border:1px solid var(--ui-grid-border-color);display:grid}.stats-card span{font-size:var(--ui-grid-stats-card-value-font-size);font-weight:700}.stats-card small{color:var(--ui-grid-muted-color)}.grid-frame{display:grid;grid-template-rows:auto minmax(0, 1fr) auto;height:100%;min-height:0;border-radius:var(--ui-grid-radius);background:var(--ui-grid-surface);border:1px solid var(--ui-grid-border-color);box-shadow:var(--ui-grid-shadow);overflow:hidden}.metrics-strip{display:grid;grid-template-columns:repeat(4, minmax(0, 1fr));gap:var(--ui-grid-metrics-gap)}.metrics-strip article{padding:var(--ui-grid-metric-card-padding-block) var(--ui-grid-metric-card-padding-inline);border-radius:var(--ui-grid-radius);background:var(--ui-grid-surface);border:1px solid var(--ui-grid-border-color);display:grid}.metrics-strip strong{font-size:var(--ui-grid-metric-value-font-size)}.metrics-strip span{color:var(--ui-grid-muted-color)}.grid-toolbar{display:flex;justify-content:space-between;gap:var(--ui-grid-toolbar-gap);padding:var(--ui-grid-toolbar-padding-block) var(--ui-grid-toolbar-padding-inline);align-items:center;background:var(--ui-grid-header-background);border-bottom:1px solid var(--ui-grid-border-color)}.grid-toolbar div{display:flex;gap:var(--ui-grid-toolbar-inline-gap);align-items:baseline}.grid-toolbar p{margin:0;color:var(--ui-grid-muted-color)}.grid-table{position:relative;height:100%;min-height:0;width:100%;min-width:0;display:flex;flex-direction:column;background:var(--ui-grid-surface);overflow-anchor:none}.grid-header-strip,.grid-filter-strip{flex:0 0 auto;position:sticky;z-index:var(--ui-grid-header-z-index);background:var(--ui-grid-surface);overflow:hidden}.grid-header-strip{top:0}.grid-filter-strip{top:var(--ui-grid-header-sticky-top, 0px)}.grid-body-viewport{flex:1 1 auto;min-height:0;overflow-x:auto;overflow-anchor:none;overscroll-behavior-x:none}.header-grid,.filter-grid,.body-grid{display:grid;width:100%;min-width:max-content}.header-cell,.filter-cell,.body-cell,.group-row{min-width:0}.header-cell{display:grid;grid-template-columns:minmax(0, 1fr) auto;gap:var(--ui-grid-header-cell-gap);padding:var(--ui-grid-header-cell-padding-block) var(--ui-grid-header-cell-padding-inline);border-bottom:1px solid var(--ui-grid-border-color);background:var(--ui-grid-header-background);font-weight:var(--ui-grid-header-weight);align-items:center;position:relative}.header-cell.is-active{background:var(--ui-grid-header-cell-background-active)}.header-cell[draggable=true]{cursor:grab}.header-cell.is-dragging{opacity:.6}.header-cell.is-drag-target{background:color-mix(in srgb, var(--ui-grid-accent) 9%, var(--ui-grid-header-background));border:1px dashed color-mix(in srgb, var(--ui-grid-accent) 45%, var(--ui-grid-border-color));box-shadow:inset 0 0 0 1px color-mix(in srgb, var(--ui-grid-accent) 18%, transparent)}.header-cell.is-pin-menu-open{z-index:var(--ui-grid-pin-menu-open-z-index)}.header-cell.is-pinned,.filter-cell.is-pinned,.body-cell.is-pinned{position:sticky;z-index:var(--ui-grid-pinned-cell-z-index);background:var(--ui-grid-surface)}.header-cell.is-pinned{background:var(--ui-grid-header-background)}.body-cell.is-pinned.body-cell-odd{background:var(--ui-grid-row-odd)}.body-cell.is-pinned:not(.body-cell-odd){background:var(--ui-grid-row-even)}.header-cell.is-pinned-left-last,.filter-cell.is-pinned-left-last,.body-cell.is-pinned-left-last{box-shadow:var(--ui-grid-pinned-divider-shadow-left);clip-path:var(--ui-grid-pinned-divider-clip-left)}.header-cell.is-pinned-right-first,.filter-cell.is-pinned-right-first,.body-cell.is-pinned-right-first{box-shadow:var(--ui-grid-pinned-divider-shadow-right);clip-path:var(--ui-grid-pinned-divider-clip-right)}.header-label{min-width:0;display:block;white-space:nowrap;overflow:hidden;text-overflow:clip;hyphens:none}.header-actions{display:inline-flex;align-items:center;gap:var(--ui-grid-header-actions-gap);justify-self:end}.column-resizer{position:absolute;top:0;right:-4px;width:8px;height:100%;padding:0;border:0;background:rgba(0,0,0,0);cursor:col-resize;z-index:5}.column-resizer::after{content:"";position:absolute;top:20%;bottom:20%;left:50%;width:2px;transform:translateX(-50%);border-radius:999px;background:color-mix(in srgb, var(--_ui-grid-border-color) 80%, transparent);opacity:0;transition:opacity 120ms ease}.header-cell:hover .column-resizer::after,.column-resizer:focus-visible::after{opacity:1}.pin-control{position:relative;display:inline-grid;place-items:center;justify-items:center;min-width:var(--ui-grid-control-size);overflow:hidden}.header-action,.chip-action{display:inline-flex;align-items:center;justify-content:center;width:var(--ui-grid-control-size);height:var(--ui-grid-control-size);display:flex;border:0;background:var(--ui-grid-control-background);padding:0;font:inherit;border-radius:var(--ui-grid-control-radius);cursor:pointer}.header-action-disabled{cursor:default}.header-action svg,.chip-action svg{width:var(--ui-grid-control-icon-size);height:var(--ui-grid-control-icon-size);fill:currentColor}.header-action{color:var(--ui-grid-control-color);border:1px solid var(--ui-grid-control-border-color)}.header-cell.is-active .header-action{color:var(--ui-grid-control-color-active);border-color:var(--ui-grid-control-border-color-active)}.chip-action{border:1px solid var(--ui-grid-control-border-color);color:var(--ui-grid-control-color)}.chip-action-active{background:var(--ui-grid-control-background-active);border-color:var(--ui-grid-control-border-color-active);color:var(--ui-grid-control-color-active)}.pin-trigger{grid-area:1/1;transform-origin:center;transition:width var(--ui-grid-pin-control-transition-duration) var(--ui-grid-pin-control-transition-easing),height var(--ui-grid-pin-control-transition-duration) var(--ui-grid-pin-control-transition-easing),opacity var(--ui-grid-pin-control-transition-duration) var(--ui-grid-pin-control-transition-easing),transform var(--ui-grid-pin-control-transition-duration) var(--ui-grid-pin-control-transition-easing),border-color var(--ui-grid-pin-control-transition-duration) var(--ui-grid-pin-control-transition-easing),background-color var(--ui-grid-pin-control-transition-duration) var(--ui-grid-pin-control-transition-easing),color var(--ui-grid-pin-control-transition-duration) var(--ui-grid-pin-control-transition-easing)}.pin-menu{grid-area:1/1;z-index:var(--ui-grid-pin-menu-z-index);display:grid;grid-auto-rows:var(--ui-grid-pin-menu-action-size);gap:var(--ui-grid-pin-menu-gap);padding:var(--ui-grid-pin-menu-padding);border:1px solid var(--ui-grid-border-color);border-radius:var(--ui-grid-pin-menu-radius);background:var(--ui-grid-surface);box-shadow:var(--ui-grid-pin-menu-shadow);justify-items:center;align-items:center;width:var(--ui-grid-control-size);max-height:var(--ui-grid-pin-control-collapsed-size);opacity:0;pointer-events:none;transform:scale(var(--ui-grid-pin-menu-scale-closed));transform-origin:center;transition:max-height var(--ui-grid-pin-control-transition-duration) var(--ui-grid-pin-control-transition-easing),opacity var(--ui-grid-pin-control-transition-duration) var(--ui-grid-pin-control-transition-easing),transform var(--ui-grid-pin-control-transition-duration) var(--ui-grid-pin-control-transition-easing),padding var(--ui-grid-pin-control-transition-duration) var(--ui-grid-pin-control-transition-easing),border-color var(--ui-grid-pin-control-transition-duration) var(--ui-grid-pin-control-transition-easing),box-shadow var(--ui-grid-pin-control-transition-duration) var(--ui-grid-pin-control-transition-easing)}.pin-control-open{align-items:start}.pin-control-open .pin-trigger{width:var(--ui-grid-pin-control-collapsed-size);height:var(--ui-grid-pin-control-collapsed-size);opacity:0;transform:scale(0.72);pointer-events:none}.pin-control-open .pin-menu{max-height:calc(var(--ui-grid-pin-menu-action-size)*2 + var(--ui-grid-pin-menu-gap) + var(--ui-grid-pin-menu-padding)*2);opacity:1;pointer-events:auto;transform:scale(1)}.pin-menu-action{display:inline-flex;align-items:center;justify-content:center;width:var(--ui-grid-pin-menu-action-size);height:var(--ui-grid-pin-menu-action-size);border:0;border-radius:var(--ui-grid-control-radius);background:rgba(0,0,0,0);color:var(--ui-grid-control-color);cursor:pointer}.pin-menu-action:hover,.pin-menu-action:focus-visible{outline:0;background:var(--ui-grid-control-background-active);color:var(--ui-grid-control-color-active)}.pin-menu-action svg{width:var(--ui-grid-control-icon-size);height:var(--ui-grid-control-icon-size);fill:currentColor}.body-cell{padding:var(--ui-grid-body-cell-padding-block) var(--ui-grid-body-cell-padding-inline);border-bottom:1px solid var(--ui-grid-border-color);color:var(--ui-grid-cell-color);background:var(--ui-grid-row-even);outline:0}.body-cell.body-cell-odd{background:var(--ui-grid-row-odd)}.cell-shell{display:flex;align-items:center;gap:var(--ui-grid-cell-shell-gap);min-width:0}.cell-value{min-width:0;flex:1 1 auto}.row-toggle{border:1px solid var(--ui-grid-border-color);background:var(--ui-grid-surface);color:var(--ui-grid-cell-color);width:var(--ui-grid-row-toggle-size);height:var(--ui-grid-row-toggle-size);border-radius:var(--ui-grid-row-toggle-radius);display:inline-flex;align-items:center;justify-content:center;cursor:pointer;flex:0 0 auto;padding:0;font:inherit}.toggle-icon{width:var(--ui-grid-toggle-icon-size);height:var(--ui-grid-toggle-icon-size);fill:currentColor;pointer-events:none}.group-disclosure-icon{width:var(--ui-grid-group-disclosure-icon-size);height:var(--ui-grid-group-disclosure-icon-size)}.pagination-icon{width:var(--ui-grid-pagination-icon-size);height:var(--ui-grid-pagination-icon-size);fill:currentColor}.expandable-row{padding:var(--ui-grid-expandable-row-padding-block) var(--ui-grid-expandable-row-padding-inline);border-bottom:1px solid var(--ui-grid-border-color);background:var(--ui-grid-expandable-row-background)}.body-grid>.body-cell:hover:not(.row-focused):not(.cell-focused):not(.cell-editing){background:var(--ui-grid-row-hover);box-shadow:inset 0 0 0 1px color-mix(in srgb, var(--ui-grid-accent) 10%, transparent)}.body-cell.row-focused,.body-grid>.body-cell.row-focused{background:var(--ui-grid-row-focus-background)}.body-cell.cell-focused,.body-grid>.body-cell.cell-focused{background:var(--ui-grid-cell-focus-background);box-shadow:var(--ui-grid-cell-focus-ring)}.body-cell.cell-editing,.body-grid>.body-cell.cell-editing{background:var(--ui-grid-cell-editing-background)}.cell-editor{display:block;width:100%;min-width:0;max-width:100%;border:1px solid var(--ui-grid-cell-editor-border-color);border-radius:var(--ui-grid-cell-editor-radius);background:var(--ui-grid-surface);color:var(--ui-grid-cell-color);padding:var(--ui-grid-cell-editor-padding-block) var(--ui-grid-cell-editor-padding-inline);font:inherit}.cell-editor:focus{outline:var(--ui-grid-cell-editor-focus-outline)}.grid-viewport{width:100%}.grid-virtual-spacer{position:relative;width:max-content;min-width:100%}.grid-virtual-body{position:absolute;left:0}.body-cell.align-center{text-align:center}.body-cell.align-end{text-align:right}.empty-state{display:grid;place-items:center;gap:var(--ui-grid-empty-state-gap);min-height:var(--ui-grid-empty-state-min-height);text-align:center;padding:var(--ui-grid-empty-state-padding);color:var(--ui-grid-muted-color);background:var(--ui-grid-surface)}.empty-state p,.empty-state strong{margin:0}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0}.status-pill{display:inline-flex;align-items:center;justify-content:center;padding:var(--ui-grid-status-pill-padding-block) var(--ui-grid-status-pill-padding-inline);border-radius:var(--ui-grid-status-pill-radius);background:var(--ui-grid-status-pill-default-bg);color:var(--ui-grid-cell-color);font-size:var(--ui-grid-status-pill-font-size);font-weight:700}.status-pill-enterprise{background:var(--ui-grid-status-enterprise-bg);color:var(--ui-grid-status-enterprise-color)}.status-pill-active{background:var(--ui-grid-status-active-bg);color:var(--ui-grid-status-active-color)}.status-pill-expansion{background:var(--ui-grid-status-expansion-bg);color:var(--ui-grid-status-expansion-color)}.status-pill-pilot{background:var(--ui-grid-status-pilot-bg);color:var(--ui-grid-status-pilot-color)}@media(max-width: 900px){.metrics-strip{grid-template-columns:repeat(2, minmax(0, 1fr))}.grid-hero,.grid-toolbar{grid-template-columns:1fr;display:grid}.hero-actions{justify-content:space-between}}@media(max-width: 640px){.metrics-strip{grid-template-columns:1fr}}.ui-grid-row-selected,.body-cell.ui-grid-row-selected{background:var(--ui-grid-row-selected-bg, var(--app-ui-grid-row-selected-bg, color-mix(in srgb, var(--ui-grid-accent, #2563eb) 22%, var(--ui-grid-surface, #ffffff))));color:var(--ui-grid-row-selected-color, var(--app-ui-grid-row-selected-color, var(--ui-grid-cell-color)))}.body-cell.ui-grid-row-selected.body-cell-odd{background:var(--ui-grid-row-selected-bg-odd, var(--app-ui-grid-row-selected-bg-odd, color-mix(in srgb, var(--ui-grid-accent, #2563eb) 26%, var(--ui-grid-surface, #ffffff))))}.ui-grid-row-focused,.body-cell.ui-grid-row-focused{outline:1px dashed var(--ui-grid-accent, #2563eb);outline-offset:-1px}.body-cell[data-column=selectionRowHeaderCol],.header-cell[data-column=selectionRowHeaderCol],.filter-cell[data-column=selectionRowHeaderCol]{padding:0 !important;cursor:pointer;user-select:none;-webkit-user-select:none;display:flex;align-items:center;justify-content:center}.body-cell[data-column=selectionRowHeaderCol]>.cell-shell,.body-cell[data-column=selectionRowHeaderCol]>.cell-shell>.cell-content{padding:0 !important;padding-inline-start:0 !important;margin:0;width:100%;height:100%;display:flex;align-items:center;justify-content:center}.filter-cell[data-column=selectionRowHeaderCol]{padding:0;background:var(--_ui-grid-header-background, var(--ui-grid-header-background, transparent));border-bottom:1px solid var(--_ui-grid-border-color, var(--ui-grid-border-color, transparent))}.ui-grid-selection-row-header-buttons{display:inline-flex;align-items:center;justify-content:center;width:100%;height:100%;cursor:pointer}.ui-grid-selection-checkbox{display:inline-block;width:16px;height:16px;box-sizing:border-box;border:2px solid currentColor;border-radius:3px;background:rgba(0,0,0,0);color:var(--ui-grid-cell-color, currentColor);position:relative;transition:background 120ms ease,border-color 120ms ease,color 120ms ease;opacity:.7}.ui-grid-selection-row-header-buttons:hover .ui-grid-selection-checkbox{opacity:1;color:var(--ui-grid-accent, var(--_ui-grid-accent, #2563eb))}.ui-grid-selection-checkbox-checked{background:var(--ui-grid-accent, var(--_ui-grid-accent, #2563eb));color:var(--ui-grid-accent, var(--_ui-grid-accent, #2563eb));border-color:var(--ui-grid-accent, var(--_ui-grid-accent, #2563eb));opacity:1}.ui-grid-selection-checkbox-checked::after{content:"";position:absolute;left:3px;top:0;width:5px;height:9px;border:2px solid var(--ui-grid-surface, var(--_ui-grid-surface, #ffffff));border-top:0;border-left:0;transform:rotate(45deg)}.ui-grid-selection-checkbox-disabled{opacity:.3;cursor:not-allowed}.ui-grid-selection-select-all{display:inline-flex;align-items:center;justify-content:center;background:rgba(0,0,0,0);border:0;padding:0;margin:0;cursor:pointer;width:100%;height:100%}.ui-grid-selection-select-all:focus-visible{outline:2px solid var(--_ui-grid-accent, var(--ui-grid-accent, #2563eb));outline-offset:-2px}.grid-body-viewport:has([data-column=selectionRowHeaderCol]){user-select:none;-webkit-user-select:none}.body-cell.ui-grid-row-dirty{color:var(--ui-grid-row-dirty-color, var(--app-ui-grid-row-dirty-color, #610B38));background:var(--ui-grid-row-dirty-bg, var(--app-ui-grid-row-dirty-bg, color-mix(in srgb, var(--ui-grid-accent, #2563eb) 8%, var(--ui-grid-surface, #ffffff))))}.body-cell.ui-grid-row-saving{color:var(--ui-grid-row-saving-color, var(--app-ui-grid-row-saving-color, #848484)) !important;opacity:var(--ui-grid-row-saving-opacity, 0.75);cursor:progress}.body-cell.ui-grid-row-error{color:var(--ui-grid-row-error-color, var(--app-ui-grid-row-error-color, #FF0000)) !important;background:var(--ui-grid-row-error-bg, var(--app-ui-grid-row-error-bg, color-mix(in srgb, #ff0000 14%, var(--ui-grid-surface, #ffffff))))}.body-cell.ui-grid-cell-invalid{position:relative;background:var(--ui-grid-cell-invalid-bg, var(--app-ui-grid-cell-invalid-bg, color-mix(in srgb, #ff0000 10%, var(--ui-grid-surface, #ffffff))))}.body-cell.ui-grid-cell-invalid::after{content:"";position:absolute;top:0;right:0;width:0;height:0;border-style:solid;border-width:0 var(--ui-grid-cell-invalid-marker-size, 8px) var(--ui-grid-cell-invalid-marker-size, 8px) 0;border-color:rgba(0,0,0,0) var(--ui-grid-cell-invalid-marker-color, #ff0000) rgba(0,0,0,0) rgba(0,0,0,0);pointer-events:none}.filter-cell{padding:var(--ui-grid-filter-cell-padding-block-start) var(--ui-grid-filter-cell-padding-inline) var(--ui-grid-filter-cell-padding-block-end);border-bottom:1px solid var(--ui-grid-border-color);background:var(--ui-grid-header-background)}.filter-cell input{width:100%;min-width:0;box-sizing:border-box;border:1px solid var(--ui-grid-border-color);border-radius:var(--ui-grid-radius);background:var(--ui-grid-surface);padding:var(--ui-grid-filter-input-padding-block) var(--ui-grid-filter-input-padding-inline);font:inherit}.filter-cell input:focus{outline:var(--ui-grid-filter-input-focus-outline);border-color:var(--ui-grid-accent)}.group-row{display:flex;align-items:center;gap:var(--ui-grid-group-row-gap);border:0;width:100%;padding:var(--ui-grid-group-row-padding-block) var(--ui-grid-group-row-padding-inline);background:var(--ui-grid-group-background);border-bottom:1px solid var(--ui-grid-border-color);color:var(--ui-grid-cell-color);cursor:pointer;text-align:left}.group-row span,.group-row small{color:var(--ui-grid-muted-color)}.pagination-bar{display:flex;align-items:center;justify-content:space-between;gap:var(--ui-grid-pagination-gap);padding:var(--ui-grid-pagination-padding-block) var(--ui-grid-pagination-padding-inline);border-top:1px solid var(--ui-grid-border-color);background:var(--ui-grid-header-background)}.pagination-bar p{margin:0;color:var(--ui-grid-muted-color)}.pagination-controls{display:flex;align-items:center;gap:var(--ui-grid-pagination-controls-gap);flex-wrap:wrap}.pagination-button{padding:var(--ui-grid-pagination-button-padding-block) var(--ui-grid-pagination-button-padding-inline)}.pagination-size{display:inline-flex;align-items:center;gap:var(--ui-grid-pagination-size-gap)}.pagination-size select{border:1px solid var(--ui-grid-border-color);border-radius:var(--ui-grid-radius);background:var(--ui-grid-surface);padding:var(--ui-grid-pagination-select-padding-block) var(--ui-grid-pagination-select-padding-inline);font:inherit}';
|
|
7628
|
-
|
|
7629
7798
|
// src/adopt-styles.ts
|
|
7630
7799
|
var sheetsSupported = null;
|
|
7631
7800
|
function supportsAdoptedStyleSheets() {
|
|
@@ -7659,9 +7828,36 @@ function adoptStyles(shadowRoot, css, key) {
|
|
|
7659
7828
|
sheetCache.set(key, sheet);
|
|
7660
7829
|
}
|
|
7661
7830
|
if (!shadowRoot.adoptedStyleSheets.includes(sheet)) {
|
|
7662
|
-
shadowRoot.adoptedStyleSheets
|
|
7831
|
+
const own = shadowRoot.adoptedStyleSheets.filter((s) => !isUserSheet(shadowRoot, s));
|
|
7832
|
+
shadowRoot.adoptedStyleSheets = [...own, sheet, ...userSheetsOf(shadowRoot)];
|
|
7663
7833
|
}
|
|
7664
7834
|
}
|
|
7835
|
+
var userSheets = /* @__PURE__ */ new WeakMap();
|
|
7836
|
+
function userSheetsOf(shadowRoot) {
|
|
7837
|
+
return userSheets.get(shadowRoot) ?? [];
|
|
7838
|
+
}
|
|
7839
|
+
function isUserSheet(shadowRoot, sheet) {
|
|
7840
|
+
return userSheetsOf(shadowRoot).includes(sheet);
|
|
7841
|
+
}
|
|
7842
|
+
function addUserStyles(shadowRoot, css) {
|
|
7843
|
+
if (!supportsAdoptedStyleSheets()) {
|
|
7844
|
+
const styleEl = document.createElement("style");
|
|
7845
|
+
styleEl.textContent = css;
|
|
7846
|
+
shadowRoot.append(styleEl);
|
|
7847
|
+
return () => styleEl.remove();
|
|
7848
|
+
}
|
|
7849
|
+
const sheet = new CSSStyleSheet();
|
|
7850
|
+
sheet.replaceSync(css);
|
|
7851
|
+
userSheets.set(shadowRoot, [...userSheetsOf(shadowRoot), sheet]);
|
|
7852
|
+
shadowRoot.adoptedStyleSheets = [...shadowRoot.adoptedStyleSheets, sheet];
|
|
7853
|
+
return () => {
|
|
7854
|
+
userSheets.set(shadowRoot, userSheetsOf(shadowRoot).filter((s) => s !== sheet));
|
|
7855
|
+
shadowRoot.adoptedStyleSheets = shadowRoot.adoptedStyleSheets.filter((s) => s !== sheet);
|
|
7856
|
+
};
|
|
7857
|
+
}
|
|
7858
|
+
|
|
7859
|
+
// scss-inline:/home/runner/work/ui-grid/ui-grid/projects/ui-grid-vanilla/src/ui-grid-shell.scss
|
|
7860
|
+
var ui_grid_shell_default = ':host{--_ui-grid-border-color: var(--ui-grid-border-color, var(--app-ui-grid-border-color, #d4d4d8));--_ui-grid-header-background: var( --ui-grid-header-background, var(--app-ui-grid-header-background, #f3f4f6) );--_ui-grid-row-odd: var(--ui-grid-row-odd, var(--app-ui-grid-row-odd, #fcfcfd));--_ui-grid-row-even: var(--ui-grid-row-even, var(--app-ui-grid-row-even, #f7f7f8));--_ui-grid-row-hover: var( --ui-grid-row-hover, var( --app-ui-grid-row-hover, color-mix(in srgb, var(--_ui-grid-accent) 4%, var(--_ui-grid-surface)) ) );--_ui-grid-row-focus-background: var( --ui-grid-row-focus-background, var( --app-ui-grid-row-focus-background, color-mix(in srgb, var(--_ui-grid-accent) 9%, var(--_ui-grid-surface)) ) );--_ui-grid-cell-color: var(--ui-grid-cell-color, var(--app-ui-grid-cell-color, #111827));--_ui-grid-muted-color: var(--ui-grid-muted-color, var(--app-ui-grid-muted-color, #6b7280));--_ui-grid-surface: var(--ui-grid-surface, var(--app-ui-grid-surface, #ffffff));--_ui-grid-radius: var(--ui-grid-radius, var(--app-ui-grid-radius, 4px));--_ui-grid-shadow: var( --ui-grid-shadow, var(--app-ui-grid-shadow, 0 10px 24px rgba(15, 23, 42, 0.08)) );--_ui-grid-header-weight: var(--ui-grid-header-weight, var(--app-ui-grid-header-weight, 700));--_ui-grid-accent: var(--ui-grid-accent, var(--app-ui-grid-accent, #2563eb));--_ui-grid-group-background: var( --ui-grid-group-background, var(--app-ui-grid-group-background, #eceff3) );--_ui-grid-status-active-bg: var( --ui-grid-status-active-bg, var(--app-ui-grid-status-active-bg, rgba(22, 163, 74, 0.14)) );--_ui-grid-status-active-color: var( --ui-grid-status-active-color, var(--app-ui-grid-status-active-color, #166534) );--_ui-grid-status-expansion-bg: var( --ui-grid-status-expansion-bg, var(--app-ui-grid-status-expansion-bg, rgba(37, 99, 235, 0.14)) );--_ui-grid-status-expansion-color: var( --ui-grid-status-expansion-color, var(--app-ui-grid-status-expansion-color, #1d4ed8) );--_ui-grid-status-enterprise-bg: var( --ui-grid-status-enterprise-bg, var(--app-ui-grid-status-enterprise-bg, rgba(15, 118, 110, 0.14)) );--_ui-grid-status-enterprise-color: var( --ui-grid-status-enterprise-color, var(--app-ui-grid-status-enterprise-color, #115e59) );--_ui-grid-status-pilot-bg: var( --ui-grid-status-pilot-bg, var(--app-ui-grid-status-pilot-bg, rgba(234, 88, 12, 0.14)) );--_ui-grid-status-pilot-color: var( --ui-grid-status-pilot-color, var(--app-ui-grid-status-pilot-color, #c2410c) );--_ui-grid-shell-gap: var(--ui-grid-shell-gap, var(--app-ui-grid-shell-gap, 1.5rem));--_ui-grid-hero-gap: var(--ui-grid-hero-gap, var(--app-ui-grid-hero-gap, 1.5rem));--_ui-grid-hero-padding-block: var( --ui-grid-hero-padding-block, var(--app-ui-grid-hero-padding-block, 1rem) );--_ui-grid-eyebrow-margin-block-end: var( --ui-grid-eyebrow-margin-block-end, var(--app-ui-grid-eyebrow-margin-block-end, 0.5rem) );--_ui-grid-eyebrow-letter-spacing: var( --ui-grid-eyebrow-letter-spacing, var(--app-ui-grid-eyebrow-letter-spacing, 0.18em) );--_ui-grid-eyebrow-font-size: var( --ui-grid-eyebrow-font-size, var(--app-ui-grid-eyebrow-font-size, 0.72rem) );--_ui-grid-hero-title-font-size: var( --ui-grid-hero-title-font-size, var(--app-ui-grid-hero-title-font-size, clamp(1.4rem, 2vw, 2rem)) );--_ui-grid-hero-title-line-height: var( --ui-grid-hero-title-line-height, var(--app-ui-grid-hero-title-line-height, 1.1) );--_ui-grid-hero-deck-max-width: var( --ui-grid-hero-deck-max-width, var(--app-ui-grid-hero-deck-max-width, 56ch) );--_ui-grid-hero-deck-margin-block-start: var( --ui-grid-hero-deck-margin-block-start, var(--app-ui-grid-hero-deck-margin-block-start, 0.75rem) );--_ui-grid-hero-actions-gap: var( --ui-grid-hero-actions-gap, var(--app-ui-grid-hero-actions-gap, 1rem) );--_ui-grid-action-radius: var(--ui-grid-action-radius, var(--app-ui-grid-action-radius, 999px));--_ui-grid-action-padding-block: var( --ui-grid-action-padding-block, var(--app-ui-grid-action-padding-block, 0.8rem) );--_ui-grid-action-padding-inline: var( --ui-grid-action-padding-inline, var(--app-ui-grid-action-padding-inline, 1.1rem) );--_ui-grid-stats-card-min-width: var( --ui-grid-stats-card-min-width, var(--app-ui-grid-stats-card-min-width, 8rem) );--_ui-grid-stats-card-padding-block: var( --ui-grid-stats-card-padding-block, var(--app-ui-grid-stats-card-padding-block, 0.85rem) );--_ui-grid-stats-card-padding-inline: var( --ui-grid-stats-card-padding-inline, var(--app-ui-grid-stats-card-padding-inline, 1rem) );--_ui-grid-stats-card-value-font-size: var( --ui-grid-stats-card-value-font-size, var(--app-ui-grid-stats-card-value-font-size, 1.9rem) );--_ui-grid-metrics-gap: var(--ui-grid-metrics-gap, var(--app-ui-grid-metrics-gap, 1rem));--_ui-grid-metric-card-padding-block: var( --ui-grid-metric-card-padding-block, var(--app-ui-grid-metric-card-padding-block, 1rem) );--_ui-grid-metric-card-padding-inline: var( --ui-grid-metric-card-padding-inline, var(--app-ui-grid-metric-card-padding-inline, 1.1rem) );--_ui-grid-metric-value-font-size: var( --ui-grid-metric-value-font-size, var(--app-ui-grid-metric-value-font-size, 1.3rem) );--_ui-grid-toolbar-gap: var(--ui-grid-toolbar-gap, var(--app-ui-grid-toolbar-gap, 1rem));--_ui-grid-toolbar-padding-block: var( --ui-grid-toolbar-padding-block, var(--app-ui-grid-toolbar-padding-block, 1rem) );--_ui-grid-toolbar-padding-inline: var( --ui-grid-toolbar-padding-inline, var(--app-ui-grid-toolbar-padding-inline, 1.25rem) );--_ui-grid-toolbar-inline-gap: var( --ui-grid-toolbar-inline-gap, var(--app-ui-grid-toolbar-inline-gap, 0.4rem) );--_ui-grid-overflow-x: var(--ui-grid-overflow-x, var(--app-ui-grid-overflow-x, auto));--_ui-grid-overflow-y: var(--ui-grid-overflow-y, var(--app-ui-grid-overflow-y, auto));--_ui-grid-header-z-index: var(--ui-grid-header-z-index, var(--app-ui-grid-header-z-index, 3));--_ui-grid-pinned-cell-z-index: var( --ui-grid-pinned-cell-z-index, var(--app-ui-grid-pinned-cell-z-index, 2) );--_ui-grid-pin-menu-open-z-index: var( --ui-grid-pin-menu-open-z-index, var(--app-ui-grid-pin-menu-open-z-index, 8) );--_ui-grid-pin-menu-z-index: var(--ui-grid-pin-menu-z-index, var(--app-ui-grid-pin-menu-z-index, 20));--_ui-grid-header-cell-gap: var( --ui-grid-header-cell-gap, var(--app-ui-grid-header-cell-gap, 0.75rem) );--_ui-grid-header-cell-padding-block: var( --ui-grid-header-cell-padding-block, var(--app-ui-grid-header-cell-padding-block, 0.85rem) );--_ui-grid-header-cell-padding-inline: var( --ui-grid-header-cell-padding-inline, var(--app-ui-grid-header-cell-padding-inline, 1rem) );--_ui-grid-header-cell-background-active: var( --ui-grid-header-cell-background-active, var( --app-ui-grid-header-cell-background-active, color-mix(in srgb, var(--_ui-grid-accent) 8%, var(--_ui-grid-header-background)) ) );--_ui-grid-pinned-divider-shadow-left: var( --ui-grid-pinned-divider-shadow-left, var( --app-ui-grid-pinned-divider-shadow-left, 2px 0 4px rgba(0, 0, 0, 0.06) ) );--_ui-grid-pinned-divider-shadow-right: var( --ui-grid-pinned-divider-shadow-right, var( --app-ui-grid-pinned-divider-shadow-right, -2px 0 4px rgba(0, 0, 0, 0.06) ) );--_ui-grid-pinned-divider-clip-left: var( --ui-grid-pinned-divider-clip-left, var(--app-ui-grid-pinned-divider-clip-left, inset(0 -4px 0 0)) );--_ui-grid-pinned-divider-clip-right: var( --ui-grid-pinned-divider-clip-right, var(--app-ui-grid-pinned-divider-clip-right, inset(0 0 0 -4px)) );--_ui-grid-header-actions-gap: var( --ui-grid-header-actions-gap, var(--app-ui-grid-header-actions-gap, 0.4rem) );--_ui-grid-control-size: var(--ui-grid-control-size, var(--app-ui-grid-control-size, 2rem));--_ui-grid-control-radius: var( --ui-grid-control-radius, var(--app-ui-grid-control-radius, 999px) );--_ui-grid-control-icon-size: var( --ui-grid-control-icon-size, var(--app-ui-grid-control-icon-size, 1rem) );--_ui-grid-control-background: var( --ui-grid-control-background, var(--app-ui-grid-control-background, var(--_ui-grid-surface)) );--_ui-grid-control-border-color: var( --ui-grid-control-border-color, var(--app-ui-grid-control-border-color, var(--_ui-grid-border-color)) );--_ui-grid-control-color: var( --ui-grid-control-color, var(--app-ui-grid-control-color, var(--_ui-grid-muted-color)) );--_ui-grid-control-background-active: var( --ui-grid-control-background-active, var( --app-ui-grid-control-background-active, color-mix(in srgb, var(--_ui-grid-accent) 12%, var(--_ui-grid-surface)) ) );--_ui-grid-control-border-color-active: var( --ui-grid-control-border-color-active, var( --app-ui-grid-control-border-color-active, color-mix(in srgb, var(--_ui-grid-accent) 35%, var(--_ui-grid-border-color)) ) );--_ui-grid-control-color-active: var( --ui-grid-control-color-active, var(--app-ui-grid-control-color-active, var(--_ui-grid-accent)) );--_ui-grid-pin-menu-offset-block-start: var( --ui-grid-pin-menu-offset-block-start, var(--app-ui-grid-pin-menu-offset-block-start, 0.35rem) );--_ui-grid-pin-menu-gap: var(--ui-grid-pin-menu-gap, var(--app-ui-grid-pin-menu-gap, 0.25rem));--_ui-grid-pin-menu-padding: var( --ui-grid-pin-menu-padding, var(--app-ui-grid-pin-menu-padding, 0.25rem) );--_ui-grid-pin-menu-radius: var(--ui-grid-pin-menu-radius, var(--app-ui-grid-pin-menu-radius, 999px));--_ui-grid-pin-menu-shadow: var( --ui-grid-pin-menu-shadow, var( --app-ui-grid-pin-menu-shadow, 0 10px 24px color-mix(in srgb, var(--_ui-grid-cell-color) 10%, transparent) ) );--_ui-grid-pin-menu-direction: var( --ui-grid-pin-menu-direction, var(--app-ui-grid-pin-menu-direction, row) );--_ui-grid-pin-menu-action-size: var( --ui-grid-pin-menu-action-size, var(--app-ui-grid-pin-menu-action-size, 1.75rem) );--_ui-grid-pin-control-collapsed-size: var( --ui-grid-pin-control-collapsed-size, var(--app-ui-grid-pin-control-collapsed-size, 1px) );--_ui-grid-pin-control-transition-duration: var( --ui-grid-pin-control-transition-duration, var(--app-ui-grid-pin-control-transition-duration, 160ms) );--_ui-grid-pin-control-transition-easing: var( --ui-grid-pin-control-transition-easing, var(--app-ui-grid-pin-control-transition-easing, cubic-bezier(0.22, 1, 0.36, 1)) );--_ui-grid-pin-menu-scale-closed: var( --ui-grid-pin-menu-scale-closed, var(--app-ui-grid-pin-menu-scale-closed, 0.72) );--_ui-grid-filter-cell-padding-block-start: var( --ui-grid-filter-cell-padding-block-start, var(--app-ui-grid-filter-cell-padding-block-start, 0.75rem) );--_ui-grid-filter-cell-padding-block-end: var( --ui-grid-filter-cell-padding-block-end, var(--app-ui-grid-filter-cell-padding-block-end, 1rem) );--_ui-grid-filter-cell-padding-inline: var( --ui-grid-filter-cell-padding-inline, var(--app-ui-grid-filter-cell-padding-inline, 1rem) );--_ui-grid-filter-input-padding-block: var( --ui-grid-filter-input-padding-block, var(--app-ui-grid-filter-input-padding-block, 0.55rem) );--_ui-grid-filter-input-padding-inline: var( --ui-grid-filter-input-padding-inline, var(--app-ui-grid-filter-input-padding-inline, 0.7rem) );--_ui-grid-filter-input-focus-outline: var( --ui-grid-filter-input-focus-outline, var( --app-ui-grid-filter-input-focus-outline, 2px solid color-mix(in srgb, var(--_ui-grid-accent) 18%, transparent) ) );--_ui-grid-body-cell-padding-block: var( --ui-grid-body-cell-padding-block, var(--app-ui-grid-body-cell-padding-block, 0.95rem) );--_ui-grid-body-cell-padding-inline: var( --ui-grid-body-cell-padding-inline, var(--app-ui-grid-body-cell-padding-inline, 1rem) );--_ui-grid-body-cell-align: var(--ui-grid-body-cell-align, var(--app-ui-grid-body-cell-align, start));--_ui-grid-cell-shell-gap: var(--ui-grid-cell-shell-gap, var(--app-ui-grid-cell-shell-gap, 0.55rem));--_ui-grid-row-toggle-size: var(--ui-grid-row-toggle-size, var(--app-ui-grid-row-toggle-size, 1.55rem));--_ui-grid-row-toggle-radius: var( --ui-grid-row-toggle-radius, var(--app-ui-grid-row-toggle-radius, 999px) );--_ui-grid-toggle-icon-size: var( --ui-grid-toggle-icon-size, var(--app-ui-grid-toggle-icon-size, 1.1rem) );--_ui-grid-group-disclosure-icon-size: var( --ui-grid-group-disclosure-icon-size, var(--app-ui-grid-group-disclosure-icon-size, 0.9rem) );--_ui-grid-pagination-icon-size: var( --ui-grid-pagination-icon-size, var(--app-ui-grid-pagination-icon-size, 1.2rem) );--_ui-grid-expandable-row-padding-block: var( --ui-grid-expandable-row-padding-block, var(--app-ui-grid-expandable-row-padding-block, 1rem) );--_ui-grid-expandable-row-padding-inline: var( --ui-grid-expandable-row-padding-inline, var(--app-ui-grid-expandable-row-padding-inline, 1.25rem) );--_ui-grid-expandable-row-background: var( --ui-grid-expandable-row-background, var( --app-ui-grid-expandable-row-background, color-mix(in srgb, var(--_ui-grid-accent) 4%, var(--_ui-grid-surface)) ) );--_ui-grid-cell-focus-background: var( --ui-grid-cell-focus-background, var( --app-ui-grid-cell-focus-background, color-mix(in srgb, var(--_ui-grid-accent) 14%, var(--_ui-grid-surface)) ) );--_ui-grid-cell-focus-ring: var( --ui-grid-cell-focus-ring, var( --app-ui-grid-cell-focus-ring, inset 0 0 0 1px color-mix(in srgb, var(--_ui-grid-accent) 28%, transparent) ) );--_ui-grid-cell-editing-background: var( --ui-grid-cell-editing-background, var( --app-ui-grid-cell-editing-background, color-mix(in srgb, var(--_ui-grid-accent) 7%, var(--_ui-grid-surface)) ) );--_ui-grid-cell-editor-border-color: var( --ui-grid-cell-editor-border-color, var( --app-ui-grid-cell-editor-border-color, color-mix(in srgb, var(--_ui-grid-accent) 45%, var(--_ui-grid-border-color)) ) );--_ui-grid-cell-editor-radius: var( --ui-grid-cell-editor-radius, var(--app-ui-grid-cell-editor-radius, calc(var(--_ui-grid-radius) - 1px)) );--_ui-grid-cell-editor-padding-block: var( --ui-grid-cell-editor-padding-block, var(--app-ui-grid-cell-editor-padding-block, 0.45rem) );--_ui-grid-cell-editor-padding-inline: var( --ui-grid-cell-editor-padding-inline, var(--app-ui-grid-cell-editor-padding-inline, 0.55rem) );--_ui-grid-cell-editor-focus-outline: var( --ui-grid-cell-editor-focus-outline, var( --app-ui-grid-cell-editor-focus-outline, 2px solid color-mix(in srgb, var(--_ui-grid-accent) 18%, transparent) ) );--_ui-grid-group-row-gap: var(--ui-grid-group-row-gap, var(--app-ui-grid-group-row-gap, 0.9rem));--_ui-grid-group-row-padding-block: var( --ui-grid-group-row-padding-block, var(--app-ui-grid-group-row-padding-block, 0.9rem) );--_ui-grid-group-row-padding-inline: var( --ui-grid-group-row-padding-inline, var(--app-ui-grid-group-row-padding-inline, 1rem) );--_ui-grid-drag-preview-shadow: var( --ui-grid-drag-preview-shadow, var(--app-ui-grid-drag-preview-shadow, 0 12px 30px rgba(15, 23, 42, 0.16)) );--_ui-grid-drag-preview-radius: var( --ui-grid-drag-preview-radius, var(--app-ui-grid-drag-preview-radius, 0.9rem) );--_ui-grid-drag-placeholder-opacity: var( --ui-grid-drag-placeholder-opacity, var(--app-ui-grid-drag-placeholder-opacity, 0.3) );--_ui-grid-drag-placeholder-background: var( --ui-grid-drag-placeholder-background, var( --app-ui-grid-drag-placeholder-background, color-mix(in srgb, var(--_ui-grid-accent) 9%, var(--_ui-grid-header-background)) ) );--_ui-grid-drag-placeholder-border: var( --ui-grid-drag-placeholder-border, var( --app-ui-grid-drag-placeholder-border, 1px dashed color-mix(in srgb, var(--_ui-grid-accent) 45%, var(--_ui-grid-border-color)) ) );--_ui-grid-drag-placeholder-shadow: var( --ui-grid-drag-placeholder-shadow, var( --app-ui-grid-drag-placeholder-shadow, inset 0 0 0 1px color-mix(in srgb, var(--_ui-grid-accent) 18%, transparent) ) );--_ui-grid-empty-state-gap: var( --ui-grid-empty-state-gap, var(--app-ui-grid-empty-state-gap, 0.35rem) );--_ui-grid-empty-state-min-height: var( --ui-grid-empty-state-min-height, var(--app-ui-grid-empty-state-min-height, 16rem) );--_ui-grid-empty-state-padding: var( --ui-grid-empty-state-padding, var(--app-ui-grid-empty-state-padding, 2rem) );--_ui-grid-pagination-gap: var(--ui-grid-pagination-gap, var(--app-ui-grid-pagination-gap, 1rem));--_ui-grid-pagination-padding-block: var( --ui-grid-pagination-padding-block, var(--app-ui-grid-pagination-padding-block, 0.85rem) );--_ui-grid-pagination-padding-inline: var( --ui-grid-pagination-padding-inline, var(--app-ui-grid-pagination-padding-inline, 1.25rem) );--_ui-grid-pagination-controls-gap: var( --ui-grid-pagination-controls-gap, var(--app-ui-grid-pagination-controls-gap, 0.75rem) );--_ui-grid-pagination-size-gap: var( --ui-grid-pagination-size-gap, var(--app-ui-grid-pagination-size-gap, 0.4rem) );--_ui-grid-pagination-button-padding-block: var( --ui-grid-pagination-button-padding-block, var(--app-ui-grid-pagination-button-padding-block, 0.45rem) );--_ui-grid-pagination-button-padding-inline: var( --ui-grid-pagination-button-padding-inline, var(--app-ui-grid-pagination-button-padding-inline, 0.8rem) );--_ui-grid-pagination-select-padding-block: var( --ui-grid-pagination-select-padding-block, var(--app-ui-grid-pagination-select-padding-block, 0.35rem) );--_ui-grid-pagination-select-padding-inline: var( --ui-grid-pagination-select-padding-inline, var(--app-ui-grid-pagination-select-padding-inline, 0.55rem) );--_ui-grid-status-pill-padding-block: var( --ui-grid-status-pill-padding-block, var(--app-ui-grid-status-pill-padding-block, 0.2rem) );--_ui-grid-status-pill-padding-inline: var( --ui-grid-status-pill-padding-inline, var(--app-ui-grid-status-pill-padding-inline, 0.55rem) );--_ui-grid-status-pill-radius: var( --ui-grid-status-pill-radius, var(--app-ui-grid-status-pill-radius, 999px) );--_ui-grid-status-pill-font-size: var( --ui-grid-status-pill-font-size, var(--app-ui-grid-status-pill-font-size, 0.85rem) );--_ui-grid-status-pill-default-bg: var( --ui-grid-status-pill-default-bg, var(--app-ui-grid-status-pill-default-bg, rgba(15, 23, 42, 0.07)) );display:block;color:var(--_ui-grid-cell-color)}:host *,:host *::before,:host *::after{--ui-grid-border-color: var(--_ui-grid-border-color);--ui-grid-header-background: var(--_ui-grid-header-background);--ui-grid-row-odd: var(--_ui-grid-row-odd);--ui-grid-row-even: var(--_ui-grid-row-even);--ui-grid-row-hover: var(--_ui-grid-row-hover);--ui-grid-row-focus-background: var(--_ui-grid-row-focus-background);--ui-grid-cell-color: var(--_ui-grid-cell-color);--ui-grid-muted-color: var(--_ui-grid-muted-color);--ui-grid-surface: var(--_ui-grid-surface);--ui-grid-radius: var(--_ui-grid-radius);--ui-grid-shadow: var(--_ui-grid-shadow);--ui-grid-header-weight: var(--_ui-grid-header-weight);--ui-grid-accent: var(--_ui-grid-accent);--ui-grid-group-background: var(--_ui-grid-group-background);--ui-grid-status-active-bg: var(--_ui-grid-status-active-bg);--ui-grid-status-active-color: var(--_ui-grid-status-active-color);--ui-grid-status-expansion-bg: var(--_ui-grid-status-expansion-bg);--ui-grid-status-expansion-color: var(--_ui-grid-status-expansion-color);--ui-grid-status-enterprise-bg: var(--_ui-grid-status-enterprise-bg);--ui-grid-status-enterprise-color: var(--_ui-grid-status-enterprise-color);--ui-grid-status-pilot-bg: var(--_ui-grid-status-pilot-bg);--ui-grid-status-pilot-color: var(--_ui-grid-status-pilot-color);--ui-grid-shell-gap: var(--_ui-grid-shell-gap);--ui-grid-hero-gap: var(--_ui-grid-hero-gap);--ui-grid-hero-padding-block: var(--_ui-grid-hero-padding-block);--ui-grid-eyebrow-margin-block-end: var(--_ui-grid-eyebrow-margin-block-end);--ui-grid-eyebrow-letter-spacing: var(--_ui-grid-eyebrow-letter-spacing);--ui-grid-eyebrow-font-size: var(--_ui-grid-eyebrow-font-size);--ui-grid-hero-title-font-size: var(--_ui-grid-hero-title-font-size);--ui-grid-hero-title-line-height: var(--_ui-grid-hero-title-line-height);--ui-grid-hero-deck-max-width: var(--_ui-grid-hero-deck-max-width);--ui-grid-hero-deck-margin-block-start: var(--_ui-grid-hero-deck-margin-block-start);--ui-grid-hero-actions-gap: var(--_ui-grid-hero-actions-gap);--ui-grid-action-radius: var(--_ui-grid-action-radius);--ui-grid-action-padding-block: var(--_ui-grid-action-padding-block);--ui-grid-action-padding-inline: var(--_ui-grid-action-padding-inline);--ui-grid-stats-card-min-width: var(--_ui-grid-stats-card-min-width);--ui-grid-stats-card-padding-block: var(--_ui-grid-stats-card-padding-block);--ui-grid-stats-card-padding-inline: var(--_ui-grid-stats-card-padding-inline);--ui-grid-stats-card-value-font-size: var(--_ui-grid-stats-card-value-font-size);--ui-grid-metrics-gap: var(--_ui-grid-metrics-gap);--ui-grid-metric-card-padding-block: var(--_ui-grid-metric-card-padding-block);--ui-grid-metric-card-padding-inline: var(--_ui-grid-metric-card-padding-inline);--ui-grid-metric-value-font-size: var(--_ui-grid-metric-value-font-size);--ui-grid-toolbar-gap: var(--_ui-grid-toolbar-gap);--ui-grid-toolbar-padding-block: var(--_ui-grid-toolbar-padding-block);--ui-grid-toolbar-padding-inline: var(--_ui-grid-toolbar-padding-inline);--ui-grid-toolbar-inline-gap: var(--_ui-grid-toolbar-inline-gap);--ui-grid-overflow-x: var(--_ui-grid-overflow-x);--ui-grid-overflow-y: var(--_ui-grid-overflow-y);--ui-grid-header-z-index: var(--_ui-grid-header-z-index);--ui-grid-pinned-cell-z-index: var(--_ui-grid-pinned-cell-z-index);--ui-grid-pin-menu-open-z-index: var(--_ui-grid-pin-menu-open-z-index);--ui-grid-pin-menu-z-index: var(--_ui-grid-pin-menu-z-index);--ui-grid-header-cell-gap: var(--_ui-grid-header-cell-gap);--ui-grid-header-cell-padding-block: var(--_ui-grid-header-cell-padding-block);--ui-grid-header-cell-padding-inline: var(--_ui-grid-header-cell-padding-inline);--ui-grid-header-cell-background-active: var(--_ui-grid-header-cell-background-active);--ui-grid-pinned-divider-shadow-left: var(--_ui-grid-pinned-divider-shadow-left);--ui-grid-pinned-divider-shadow-right: var(--_ui-grid-pinned-divider-shadow-right);--ui-grid-pinned-divider-clip-left: var(--_ui-grid-pinned-divider-clip-left);--ui-grid-pinned-divider-clip-right: var(--_ui-grid-pinned-divider-clip-right);--ui-grid-header-actions-gap: var(--_ui-grid-header-actions-gap);--ui-grid-control-size: var(--_ui-grid-control-size);--ui-grid-control-radius: var(--_ui-grid-control-radius);--ui-grid-control-icon-size: var(--_ui-grid-control-icon-size);--ui-grid-control-background: var(--_ui-grid-control-background);--ui-grid-control-border-color: var(--_ui-grid-control-border-color);--ui-grid-control-color: var(--_ui-grid-control-color);--ui-grid-control-background-active: var(--_ui-grid-control-background-active);--ui-grid-control-border-color-active: var(--_ui-grid-control-border-color-active);--ui-grid-control-color-active: var(--_ui-grid-control-color-active);--ui-grid-pin-menu-offset-block-start: var(--_ui-grid-pin-menu-offset-block-start);--ui-grid-pin-menu-gap: var(--_ui-grid-pin-menu-gap);--ui-grid-pin-menu-padding: var(--_ui-grid-pin-menu-padding);--ui-grid-pin-menu-radius: var(--_ui-grid-pin-menu-radius);--ui-grid-pin-menu-shadow: var(--_ui-grid-pin-menu-shadow);--ui-grid-pin-menu-direction: var(--_ui-grid-pin-menu-direction);--ui-grid-pin-menu-action-size: var(--_ui-grid-pin-menu-action-size);--ui-grid-pin-control-collapsed-size: var(--_ui-grid-pin-control-collapsed-size);--ui-grid-pin-control-transition-duration: var(--_ui-grid-pin-control-transition-duration);--ui-grid-pin-control-transition-easing: var(--_ui-grid-pin-control-transition-easing);--ui-grid-pin-menu-scale-closed: var(--_ui-grid-pin-menu-scale-closed);--ui-grid-filter-cell-padding-block-start: var(--_ui-grid-filter-cell-padding-block-start);--ui-grid-filter-cell-padding-block-end: var(--_ui-grid-filter-cell-padding-block-end);--ui-grid-filter-cell-padding-inline: var(--_ui-grid-filter-cell-padding-inline);--ui-grid-filter-input-padding-block: var(--_ui-grid-filter-input-padding-block);--ui-grid-filter-input-padding-inline: var(--_ui-grid-filter-input-padding-inline);--ui-grid-filter-input-focus-outline: var(--_ui-grid-filter-input-focus-outline);--ui-grid-body-cell-padding-block: var(--_ui-grid-body-cell-padding-block);--ui-grid-body-cell-padding-inline: var(--_ui-grid-body-cell-padding-inline);--ui-grid-body-cell-align: var(--_ui-grid-body-cell-align);--ui-grid-cell-shell-gap: var(--_ui-grid-cell-shell-gap);--ui-grid-row-toggle-size: var(--_ui-grid-row-toggle-size);--ui-grid-row-toggle-radius: var(--_ui-grid-row-toggle-radius);--ui-grid-toggle-icon-size: var(--_ui-grid-toggle-icon-size);--ui-grid-group-disclosure-icon-size: var(--_ui-grid-group-disclosure-icon-size);--ui-grid-pagination-icon-size: var(--_ui-grid-pagination-icon-size);--ui-grid-expandable-row-padding-block: var(--_ui-grid-expandable-row-padding-block);--ui-grid-expandable-row-padding-inline: var(--_ui-grid-expandable-row-padding-inline);--ui-grid-expandable-row-background: var(--_ui-grid-expandable-row-background);--ui-grid-cell-focus-background: var(--_ui-grid-cell-focus-background);--ui-grid-cell-focus-ring: var(--_ui-grid-cell-focus-ring);--ui-grid-cell-editing-background: var(--_ui-grid-cell-editing-background);--ui-grid-cell-editor-border-color: var(--_ui-grid-cell-editor-border-color);--ui-grid-cell-editor-radius: var(--_ui-grid-cell-editor-radius);--ui-grid-cell-editor-padding-block: var(--_ui-grid-cell-editor-padding-block);--ui-grid-cell-editor-padding-inline: var(--_ui-grid-cell-editor-padding-inline);--ui-grid-cell-editor-focus-outline: var(--_ui-grid-cell-editor-focus-outline);--ui-grid-group-row-gap: var(--_ui-grid-group-row-gap);--ui-grid-group-row-padding-block: var(--_ui-grid-group-row-padding-block);--ui-grid-group-row-padding-inline: var(--_ui-grid-group-row-padding-inline);--ui-grid-drag-preview-shadow: var(--_ui-grid-drag-preview-shadow);--ui-grid-drag-preview-radius: var(--_ui-grid-drag-preview-radius);--ui-grid-drag-placeholder-opacity: var(--_ui-grid-drag-placeholder-opacity);--ui-grid-drag-placeholder-background: var(--_ui-grid-drag-placeholder-background);--ui-grid-drag-placeholder-border: var(--_ui-grid-drag-placeholder-border);--ui-grid-drag-placeholder-shadow: var(--_ui-grid-drag-placeholder-shadow);--ui-grid-empty-state-gap: var(--_ui-grid-empty-state-gap);--ui-grid-empty-state-min-height: var(--_ui-grid-empty-state-min-height);--ui-grid-empty-state-padding: var(--_ui-grid-empty-state-padding);--ui-grid-pagination-gap: var(--_ui-grid-pagination-gap);--ui-grid-pagination-padding-block: var(--_ui-grid-pagination-padding-block);--ui-grid-pagination-padding-inline: var(--_ui-grid-pagination-padding-inline);--ui-grid-pagination-controls-gap: var(--_ui-grid-pagination-controls-gap);--ui-grid-pagination-size-gap: var(--_ui-grid-pagination-size-gap);--ui-grid-pagination-button-padding-block: var(--_ui-grid-pagination-button-padding-block);--ui-grid-pagination-button-padding-inline: var(--_ui-grid-pagination-button-padding-inline);--ui-grid-pagination-select-padding-block: var(--_ui-grid-pagination-select-padding-block);--ui-grid-pagination-select-padding-inline: var(--_ui-grid-pagination-select-padding-inline);--ui-grid-status-pill-padding-block: var(--_ui-grid-status-pill-padding-block);--ui-grid-status-pill-padding-inline: var(--_ui-grid-status-pill-padding-inline);--ui-grid-status-pill-radius: var(--_ui-grid-status-pill-radius);--ui-grid-status-pill-font-size: var(--_ui-grid-status-pill-font-size);--ui-grid-status-pill-default-bg: var(--_ui-grid-status-pill-default-bg);box-sizing:border-box}:host{isolation:isolate;contain:layout paint}.grid-shell{display:grid;gap:var(--ui-grid-shell-gap)}.grid-hero{display:flex;justify-content:space-between;gap:var(--ui-grid-hero-gap);align-items:end;padding:var(--ui-grid-hero-padding-block) 0;color:var(--ui-grid-cell-color)}.eyebrow{margin:0 0 var(--ui-grid-eyebrow-margin-block-end);text-transform:uppercase;letter-spacing:var(--ui-grid-eyebrow-letter-spacing);font-size:var(--ui-grid-eyebrow-font-size);color:var(--ui-grid-muted-color)}h1{margin:0;font-size:var(--ui-grid-hero-title-font-size);line-height:var(--ui-grid-hero-title-line-height)}.deck{max-width:var(--ui-grid-hero-deck-max-width);margin:var(--ui-grid-hero-deck-margin-block-start) 0 0;color:var(--ui-grid-muted-color)}.hero-actions{display:flex;gap:var(--ui-grid-hero-actions-gap);align-items:center;flex-wrap:wrap}.action{border:0;border-radius:var(--ui-grid-action-radius);padding:var(--ui-grid-action-padding-block) var(--ui-grid-action-padding-inline);font:inherit;cursor:pointer}.action-secondary{background:var(--ui-grid-surface);color:var(--ui-grid-cell-color);border:1px solid var(--ui-grid-border-color)}.stats-card{min-width:var(--ui-grid-stats-card-min-width);padding:var(--ui-grid-stats-card-padding-block) var(--ui-grid-stats-card-padding-inline);border-radius:var(--ui-grid-radius);background:var(--ui-grid-surface);border:1px solid var(--ui-grid-border-color);display:grid}.stats-card span{font-size:var(--ui-grid-stats-card-value-font-size);font-weight:700}.stats-card small{color:var(--ui-grid-muted-color)}.grid-frame{display:grid;grid-template-rows:auto minmax(0, 1fr) auto;height:100%;min-height:0;border-radius:var(--ui-grid-radius);background:var(--ui-grid-surface);border:1px solid var(--ui-grid-border-color);box-shadow:var(--ui-grid-shadow);overflow:hidden}.metrics-strip{display:grid;grid-template-columns:repeat(4, minmax(0, 1fr));gap:var(--ui-grid-metrics-gap)}.metrics-strip article{padding:var(--ui-grid-metric-card-padding-block) var(--ui-grid-metric-card-padding-inline);border-radius:var(--ui-grid-radius);background:var(--ui-grid-surface);border:1px solid var(--ui-grid-border-color);display:grid}.metrics-strip strong{font-size:var(--ui-grid-metric-value-font-size)}.metrics-strip span{color:var(--ui-grid-muted-color)}.grid-toolbar{display:flex;justify-content:space-between;gap:var(--ui-grid-toolbar-gap);padding:var(--ui-grid-toolbar-padding-block) var(--ui-grid-toolbar-padding-inline);align-items:center;background:var(--ui-grid-header-background);border-bottom:1px solid var(--ui-grid-border-color)}.grid-toolbar div{display:flex;gap:var(--ui-grid-toolbar-inline-gap);align-items:baseline}.grid-toolbar p{margin:0;color:var(--ui-grid-muted-color)}.grid-table{position:relative;height:100%;min-height:0;width:100%;min-width:0;display:flex;flex-direction:column;background:var(--ui-grid-surface);overflow-anchor:none}.grid-header-strip,.grid-filter-strip{flex:0 0 auto;position:sticky;z-index:var(--ui-grid-header-z-index);background:var(--ui-grid-surface);overflow:hidden;width:calc(100% - var(--ui-grid-scrollbar-width, 0px))}.grid-header-strip{top:0}.grid-filter-strip{top:var(--ui-grid-header-sticky-top, 0px)}.grid-body-viewport{flex:1 1 auto;min-height:0;overflow-x:auto;overflow-anchor:none;overscroll-behavior-x:none}.header-grid,.filter-grid,.body-grid{display:grid;width:100%;min-width:max-content}.header-cell,.filter-cell,.body-cell,.group-row{min-width:0}.header-cell{display:grid;grid-template-columns:minmax(0, 1fr) auto;gap:var(--ui-grid-header-cell-gap);padding:var(--ui-grid-header-cell-padding-block) var(--ui-grid-header-cell-padding-inline);border-bottom:1px solid var(--ui-grid-border-color);background:var(--ui-grid-header-background);font-weight:var(--ui-grid-header-weight);align-items:center;position:relative}.header-cell.is-active{background:var(--ui-grid-header-cell-background-active)}.header-cell[draggable=true]{cursor:grab}.header-cell.is-dragging{opacity:.6}.header-cell.is-drag-target{background:color-mix(in srgb, var(--ui-grid-accent) 9%, var(--ui-grid-header-background));border:1px dashed color-mix(in srgb, var(--ui-grid-accent) 45%, var(--ui-grid-border-color));box-shadow:inset 0 0 0 1px color-mix(in srgb, var(--ui-grid-accent) 18%, transparent)}.header-cell.is-pinned.is-pin-menu-open{z-index:var(--ui-grid-pin-menu-open-z-index)}.header-cell.is-pin-menu-open:not(.is-pinned){z-index:max(0,var(--ui-grid-pinned-cell-z-index) - 1)}.header-cell.is-pinned,.filter-cell.is-pinned,.body-cell.is-pinned{position:sticky;z-index:var(--ui-grid-pinned-cell-z-index);background:var(--ui-grid-surface)}.header-cell.is-pinned{background:var(--ui-grid-header-background)}.body-cell.is-pinned.body-cell-odd{background:var(--ui-grid-row-odd)}.body-cell.is-pinned:not(.body-cell-odd){background:var(--ui-grid-row-even)}.header-cell.is-pinned-left-last,.filter-cell.is-pinned-left-last,.body-cell.is-pinned-left-last{box-shadow:var(--ui-grid-pinned-divider-shadow-left);clip-path:var(--ui-grid-pinned-divider-clip-left)}.header-cell.is-pinned-right-first,.filter-cell.is-pinned-right-first,.body-cell.is-pinned-right-first{box-shadow:var(--ui-grid-pinned-divider-shadow-right);clip-path:var(--ui-grid-pinned-divider-clip-right)}.header-label{min-width:0;display:block;white-space:nowrap;overflow:hidden;text-overflow:clip;hyphens:none}.header-actions{display:inline-flex;align-items:center;gap:var(--ui-grid-header-actions-gap);justify-self:end}.column-resizer{position:absolute;top:0;right:-4px;width:8px;height:100%;padding:0;border:0;background:rgba(0,0,0,0);cursor:col-resize;z-index:5}.column-resizer::after{content:"";position:absolute;top:20%;bottom:20%;left:50%;width:2px;transform:translateX(-50%);border-radius:999px;background:color-mix(in srgb, var(--_ui-grid-border-color) 80%, transparent);opacity:0;transition:opacity 120ms ease}.header-cell:hover .column-resizer::after,.column-resizer:focus-visible::after{opacity:1}.pin-control{position:relative;display:inline-grid;place-items:center;justify-items:center;min-width:var(--ui-grid-control-size);overflow:hidden}.header-action,.chip-action{display:inline-flex;align-items:center;justify-content:center;width:var(--ui-grid-control-size);height:var(--ui-grid-control-size);display:flex;border:0;background:var(--ui-grid-control-background);padding:0;font:inherit;border-radius:var(--ui-grid-control-radius);cursor:pointer}.header-action-disabled{cursor:default}.header-action svg,.chip-action svg{width:var(--ui-grid-control-icon-size);height:var(--ui-grid-control-icon-size);fill:currentColor}.header-action{color:var(--ui-grid-control-color);border:1px solid var(--ui-grid-control-border-color)}.header-cell.is-active .header-action{color:var(--ui-grid-control-color-active);border-color:var(--ui-grid-control-border-color-active)}.chip-action{border:1px solid var(--ui-grid-control-border-color);color:var(--ui-grid-control-color)}.chip-action-active{background:var(--ui-grid-control-background-active);border-color:var(--ui-grid-control-border-color-active);color:var(--ui-grid-control-color-active)}.pin-trigger{grid-area:1/1;transform-origin:center;transition:width var(--ui-grid-pin-control-transition-duration) var(--ui-grid-pin-control-transition-easing),height var(--ui-grid-pin-control-transition-duration) var(--ui-grid-pin-control-transition-easing),opacity var(--ui-grid-pin-control-transition-duration) var(--ui-grid-pin-control-transition-easing),transform var(--ui-grid-pin-control-transition-duration) var(--ui-grid-pin-control-transition-easing),border-color var(--ui-grid-pin-control-transition-duration) var(--ui-grid-pin-control-transition-easing),background-color var(--ui-grid-pin-control-transition-duration) var(--ui-grid-pin-control-transition-easing),color var(--ui-grid-pin-control-transition-duration) var(--ui-grid-pin-control-transition-easing)}.pin-menu{grid-area:1/1;z-index:var(--ui-grid-pin-menu-z-index);display:grid;grid-auto-flow:var(--ui-grid-pin-menu-direction);grid-auto-rows:var(--ui-grid-pin-menu-action-size);grid-auto-columns:var(--ui-grid-pin-menu-action-size);gap:var(--ui-grid-pin-menu-gap);padding:var(--ui-grid-pin-menu-padding);border:1px solid var(--ui-grid-border-color);border-radius:var(--ui-grid-pin-menu-radius);background:var(--ui-grid-surface);box-shadow:var(--ui-grid-pin-menu-shadow);justify-items:center;align-items:center;width:var(--ui-grid-control-size);max-height:var(--ui-grid-pin-control-collapsed-size);opacity:0;pointer-events:none;transform:scale(var(--ui-grid-pin-menu-scale-closed));transform-origin:center;transition:max-height var(--ui-grid-pin-control-transition-duration) var(--ui-grid-pin-control-transition-easing),opacity var(--ui-grid-pin-control-transition-duration) var(--ui-grid-pin-control-transition-easing),transform var(--ui-grid-pin-control-transition-duration) var(--ui-grid-pin-control-transition-easing),padding var(--ui-grid-pin-control-transition-duration) var(--ui-grid-pin-control-transition-easing),border-color var(--ui-grid-pin-control-transition-duration) var(--ui-grid-pin-control-transition-easing),box-shadow var(--ui-grid-pin-control-transition-duration) var(--ui-grid-pin-control-transition-easing)}.pin-control-open{align-items:start;overflow:visible}.pin-control-open .pin-trigger{width:var(--ui-grid-pin-control-collapsed-size);height:var(--ui-grid-pin-control-collapsed-size);opacity:0;transform:scale(0.72);pointer-events:none}.pin-control-open .pin-menu{max-height:calc(var(--ui-grid-pin-menu-action-size)*2 + var(--ui-grid-pin-menu-gap) + var(--ui-grid-pin-menu-padding)*2);width:max-content;min-width:var(--ui-grid-control-size);opacity:1;pointer-events:auto;transform:scale(1)}.pin-menu-action{display:inline-flex;align-items:center;justify-content:center;width:var(--ui-grid-pin-menu-action-size);height:var(--ui-grid-pin-menu-action-size);border:0;border-radius:var(--ui-grid-control-radius);background:rgba(0,0,0,0);color:var(--ui-grid-control-color);cursor:pointer}.pin-menu-action:hover,.pin-menu-action:focus-visible{outline:0;background:var(--ui-grid-control-background-active);color:var(--ui-grid-control-color-active)}.pin-menu-action svg{width:var(--ui-grid-control-icon-size);height:var(--ui-grid-control-icon-size);fill:currentColor}.body-cell{display:grid;grid-template-columns:minmax(0, 1fr);align-items:var(--ui-grid-body-cell-align);padding:var(--ui-grid-body-cell-padding-block) var(--ui-grid-body-cell-padding-inline);border-bottom:1px solid var(--ui-grid-border-color);color:var(--ui-grid-cell-color);background:var(--ui-grid-row-even);outline:0}.body-cell.body-cell-odd{background:var(--ui-grid-row-odd)}.cell-shell{display:flex;align-items:center;gap:var(--ui-grid-cell-shell-gap);min-width:0}.cell-value{min-width:0;flex:1 1 auto}.row-toggle{border:1px solid var(--ui-grid-border-color);background:var(--ui-grid-surface);color:var(--ui-grid-cell-color);width:var(--ui-grid-row-toggle-size);height:var(--ui-grid-row-toggle-size);border-radius:var(--ui-grid-row-toggle-radius);display:inline-flex;align-items:center;justify-content:center;cursor:pointer;flex:0 0 auto;padding:0;font:inherit}.toggle-icon{width:var(--ui-grid-toggle-icon-size);height:var(--ui-grid-toggle-icon-size);fill:currentColor;pointer-events:none}.group-disclosure-icon{width:var(--ui-grid-group-disclosure-icon-size);height:var(--ui-grid-group-disclosure-icon-size)}.pagination-icon{width:var(--ui-grid-pagination-icon-size);height:var(--ui-grid-pagination-icon-size);fill:currentColor}.expandable-row{padding:var(--ui-grid-expandable-row-padding-block) var(--ui-grid-expandable-row-padding-inline);border-bottom:1px solid var(--ui-grid-border-color);background:var(--ui-grid-expandable-row-background)}.body-grid>.body-cell:hover:not(.row-focused):not(.cell-focused):not(.cell-editing){background:var(--ui-grid-row-hover);box-shadow:inset 0 0 0 1px color-mix(in srgb, var(--ui-grid-accent) 10%, transparent)}.body-cell.row-focused,.body-grid>.body-cell.row-focused{background:var(--ui-grid-row-focus-background)}.body-cell.cell-focused,.body-grid>.body-cell.cell-focused{background:var(--ui-grid-cell-focus-background);box-shadow:var(--ui-grid-cell-focus-ring)}.body-cell.cell-editing,.body-grid>.body-cell.cell-editing{background:var(--ui-grid-cell-editing-background)}.cell-editor{display:block;width:100%;min-width:0;max-width:100%;border:1px solid var(--ui-grid-cell-editor-border-color);border-radius:var(--ui-grid-cell-editor-radius);background:var(--ui-grid-surface);color:var(--ui-grid-cell-color);padding:var(--ui-grid-cell-editor-padding-block) var(--ui-grid-cell-editor-padding-inline);font:inherit}.cell-editor:focus{outline:var(--ui-grid-cell-editor-focus-outline)}.grid-viewport{width:100%}.grid-virtual-spacer{position:relative;width:max-content;min-width:100%}.grid-virtual-body{position:absolute;left:0}.grid-virtual-body>:not(.expandable-row){box-sizing:border-box;height:var(--ui-grid-row-height);overflow:hidden}.body-cell.align-center{text-align:center}.body-cell.align-end{text-align:right}.empty-state{display:grid;place-items:center;gap:var(--ui-grid-empty-state-gap);min-height:var(--ui-grid-empty-state-min-height);text-align:center;padding:var(--ui-grid-empty-state-padding);color:var(--ui-grid-muted-color);background:var(--ui-grid-surface)}.empty-state p,.empty-state strong{margin:0}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0}.status-pill{display:inline-flex;align-items:center;justify-content:center;padding:var(--ui-grid-status-pill-padding-block) var(--ui-grid-status-pill-padding-inline);border-radius:var(--ui-grid-status-pill-radius);background:var(--ui-grid-status-pill-default-bg);color:var(--ui-grid-cell-color);font-size:var(--ui-grid-status-pill-font-size);font-weight:700}.status-pill-enterprise{background:var(--ui-grid-status-enterprise-bg);color:var(--ui-grid-status-enterprise-color)}.status-pill-active{background:var(--ui-grid-status-active-bg);color:var(--ui-grid-status-active-color)}.status-pill-expansion{background:var(--ui-grid-status-expansion-bg);color:var(--ui-grid-status-expansion-color)}.status-pill-pilot{background:var(--ui-grid-status-pilot-bg);color:var(--ui-grid-status-pilot-color)}@media(max-width: 900px){.metrics-strip{grid-template-columns:repeat(2, minmax(0, 1fr))}.grid-hero,.grid-toolbar{grid-template-columns:1fr;display:grid}.hero-actions{justify-content:space-between}}@media(max-width: 640px){.metrics-strip{grid-template-columns:1fr}}.ui-grid-row-selected,.body-cell.ui-grid-row-selected{background:var(--ui-grid-row-selected-bg, var(--app-ui-grid-row-selected-bg, color-mix(in srgb, var(--ui-grid-accent, #2563eb) 22%, var(--ui-grid-surface, #ffffff))));color:var(--ui-grid-row-selected-color, var(--app-ui-grid-row-selected-color, var(--ui-grid-cell-color)))}.body-cell.ui-grid-row-selected.body-cell-odd{background:var(--ui-grid-row-selected-bg-odd, var(--app-ui-grid-row-selected-bg-odd, color-mix(in srgb, var(--ui-grid-accent, #2563eb) 26%, var(--ui-grid-surface, #ffffff))))}.ui-grid-row-focused,.body-cell.ui-grid-row-focused{outline:1px dashed var(--ui-grid-accent, #2563eb);outline-offset:-1px}.body-cell[data-column=selectionRowHeaderCol],.header-cell[data-column=selectionRowHeaderCol],.filter-cell[data-column=selectionRowHeaderCol]{padding:0 !important;cursor:pointer;user-select:none;-webkit-user-select:none;display:flex;align-items:center;justify-content:center}.body-cell[data-column=selectionRowHeaderCol]>.cell-shell,.body-cell[data-column=selectionRowHeaderCol]>.cell-shell>.cell-content{padding:0 !important;padding-inline-start:0 !important;margin:0;width:100%;height:100%;display:flex;align-items:center;justify-content:center}.filter-cell[data-column=selectionRowHeaderCol]{padding:0;background:var(--_ui-grid-header-background, var(--ui-grid-header-background, transparent));border-bottom:1px solid var(--_ui-grid-border-color, var(--ui-grid-border-color, transparent))}.ui-grid-selection-row-header-buttons{display:inline-flex;align-items:center;justify-content:center;width:100%;height:100%;cursor:pointer}.ui-grid-selection-checkbox{display:inline-block;width:16px;height:16px;box-sizing:border-box;border:2px solid currentColor;border-radius:3px;background:rgba(0,0,0,0);color:var(--ui-grid-cell-color, currentColor);position:relative;transition:background 120ms ease,border-color 120ms ease,color 120ms ease;opacity:.7}.ui-grid-selection-row-header-buttons:hover .ui-grid-selection-checkbox{opacity:1;color:var(--ui-grid-accent, var(--_ui-grid-accent, #2563eb))}.ui-grid-selection-checkbox-checked{background:var(--ui-grid-accent, var(--_ui-grid-accent, #2563eb));color:var(--ui-grid-accent, var(--_ui-grid-accent, #2563eb));border-color:var(--ui-grid-accent, var(--_ui-grid-accent, #2563eb));opacity:1}.ui-grid-selection-checkbox-checked::after{content:"";position:absolute;left:3px;top:0;width:5px;height:9px;border:2px solid var(--ui-grid-surface, var(--_ui-grid-surface, #ffffff));border-top:0;border-left:0;transform:rotate(45deg)}.ui-grid-selection-checkbox-disabled{opacity:.3;cursor:not-allowed}.ui-grid-selection-select-all{display:inline-flex;align-items:center;justify-content:center;background:rgba(0,0,0,0);border:0;padding:0;margin:0;cursor:pointer;width:100%;height:100%}.ui-grid-selection-select-all:focus-visible{outline:2px solid var(--_ui-grid-accent, var(--ui-grid-accent, #2563eb));outline-offset:-2px}.grid-body-viewport:has([data-column=selectionRowHeaderCol]){user-select:none;-webkit-user-select:none}.body-cell.ui-grid-row-dirty{color:var(--ui-grid-row-dirty-color, var(--app-ui-grid-row-dirty-color, #610B38));background:var(--ui-grid-row-dirty-bg, var(--app-ui-grid-row-dirty-bg, color-mix(in srgb, var(--ui-grid-accent, #2563eb) 8%, var(--ui-grid-surface, #ffffff))))}.body-cell.ui-grid-row-saving{color:var(--ui-grid-row-saving-color, var(--app-ui-grid-row-saving-color, #848484)) !important;opacity:var(--ui-grid-row-saving-opacity, 0.75);cursor:progress}.body-cell.ui-grid-row-error{color:var(--ui-grid-row-error-color, var(--app-ui-grid-row-error-color, #FF0000)) !important;background:var(--ui-grid-row-error-bg, var(--app-ui-grid-row-error-bg, color-mix(in srgb, #ff0000 14%, var(--ui-grid-surface, #ffffff))))}.body-cell.ui-grid-cell-invalid{position:relative;background:var(--ui-grid-cell-invalid-bg, var(--app-ui-grid-cell-invalid-bg, color-mix(in srgb, #ff0000 10%, var(--ui-grid-surface, #ffffff))))}.body-cell.ui-grid-cell-invalid::after{content:"";position:absolute;top:0;right:0;width:0;height:0;border-style:solid;border-width:0 var(--ui-grid-cell-invalid-marker-size, 8px) var(--ui-grid-cell-invalid-marker-size, 8px) 0;border-color:rgba(0,0,0,0) var(--ui-grid-cell-invalid-marker-color, #ff0000) rgba(0,0,0,0) rgba(0,0,0,0);pointer-events:none}.filter-cell{padding:var(--ui-grid-filter-cell-padding-block-start) var(--ui-grid-filter-cell-padding-inline) var(--ui-grid-filter-cell-padding-block-end);border-bottom:1px solid var(--ui-grid-border-color);background:var(--ui-grid-header-background)}.filter-cell input{width:100%;min-width:0;box-sizing:border-box;border:1px solid var(--ui-grid-border-color);border-radius:var(--ui-grid-radius);background:var(--ui-grid-surface);padding:var(--ui-grid-filter-input-padding-block) var(--ui-grid-filter-input-padding-inline);font:inherit}.filter-cell input:focus{outline:var(--ui-grid-filter-input-focus-outline);border-color:var(--ui-grid-accent)}.group-row{display:flex;align-items:center;gap:var(--ui-grid-group-row-gap);border:0;width:100%;padding:var(--ui-grid-group-row-padding-block) var(--ui-grid-group-row-padding-inline);background:var(--ui-grid-group-background);border-bottom:1px solid var(--ui-grid-border-color);color:var(--ui-grid-cell-color);cursor:pointer;text-align:left}.group-row span,.group-row small{color:var(--ui-grid-muted-color)}.pagination-bar{display:flex;align-items:center;justify-content:space-between;gap:var(--ui-grid-pagination-gap);padding:var(--ui-grid-pagination-padding-block) var(--ui-grid-pagination-padding-inline);border-top:1px solid var(--ui-grid-border-color);background:var(--ui-grid-header-background)}.pagination-bar p{margin:0;color:var(--ui-grid-muted-color)}.pagination-controls{display:flex;align-items:center;gap:var(--ui-grid-pagination-controls-gap);flex-wrap:wrap}.pagination-button{padding:var(--ui-grid-pagination-button-padding-block) var(--ui-grid-pagination-button-padding-inline)}.pagination-size{display:inline-flex;align-items:center;gap:var(--ui-grid-pagination-size-gap)}.pagination-size select{border:1px solid var(--ui-grid-border-color);border-radius:var(--ui-grid-radius);background:var(--ui-grid-surface);padding:var(--ui-grid-pagination-select-padding-block) var(--ui-grid-pagination-select-padding-inline);font:inherit}';
|
|
7665
7861
|
|
|
7666
7862
|
// src/ui-grid-empty.template.ts
|
|
7667
7863
|
var STYLE_KEY = {};
|
|
@@ -7670,7 +7866,7 @@ function emptyTemplate(ctx) {
|
|
|
7670
7866
|
connect(root) {
|
|
7671
7867
|
if (!root) return;
|
|
7672
7868
|
adoptStyles(root, ui_grid_shell_default, STYLE_KEY);
|
|
7673
|
-
root.innerHTML = `<section class="grid-shell ui-grid-shell"><div class="empty-state ui-grid-no-row-overlay"><strong>${ctx.message}</strong></div></section>`;
|
|
7869
|
+
root.innerHTML = `<section class="grid-shell ui-grid-shell"><div part="empty-state" class="empty-state ui-grid-no-row-overlay"><strong>${ctx.message}</strong></div></section>`;
|
|
7674
7870
|
}
|
|
7675
7871
|
};
|
|
7676
7872
|
}
|
|
@@ -7683,7 +7879,7 @@ function gridShellTemplate(ctx) {
|
|
|
7683
7879
|
const target = root ?? ctx.shadowRoot;
|
|
7684
7880
|
if (!target) return;
|
|
7685
7881
|
adoptStyles(target, ui_grid_shell_default, STYLE_KEY2);
|
|
7686
|
-
target.innerHTML = `${ctx.slotRegistry}<section class="grid-frame ui-grid" role="grid" aria-label="${ctx.gridTitle}"><div class="grid-table ui-grid-contents-wrapper" style="${ctx.gridTableStyle}"><div class="grid-header-strip"><div class="header-grid ui-grid-header ui-grid-header-canvas" style="grid-template-columns:${ctx.templateColumns}">` + ctx.headerContent + `</div></div><div class="grid-filter-strip">` + ctx.filterRowContent + `</div><div class="grid-body-viewport" style="${ctx.bodyViewportStyle}">` + ctx.bodyContent + `</div>` + ctx.paginationContent + `</div></section>`;
|
|
7882
|
+
target.innerHTML = `${ctx.slotRegistry}<section class="grid-frame ui-grid" part="grid-frame" role="grid" aria-label="${ctx.gridTitle}"><div class="grid-table ui-grid-contents-wrapper" style="${ctx.gridTableStyle}"><div class="grid-header-strip"><div class="header-grid ui-grid-header ui-grid-header-canvas" part="header" style="grid-template-columns:${ctx.templateColumns}">` + ctx.headerContent + `</div></div><div class="grid-filter-strip">` + ctx.filterRowContent + `</div><div class="grid-body-viewport" style="${ctx.bodyViewportStyle}">` + ctx.bodyContent + `</div>` + ctx.paginationContent + `</div></section>`;
|
|
7687
7883
|
}
|
|
7688
7884
|
};
|
|
7689
7885
|
}
|
|
@@ -7695,7 +7891,7 @@ var grid_filter_cell_default = ":host{display:block;box-sizing:border-box;paddin
|
|
|
7695
7891
|
var STYLE_KEY3 = {};
|
|
7696
7892
|
function renderFilterCell2(ctx, shadowRoot) {
|
|
7697
7893
|
adoptStyles(shadowRoot, grid_filter_cell_default, STYLE_KEY3);
|
|
7698
|
-
shadowRoot.innerHTML = `<input class="ui-grid-filter-input" data-role="filter" data-column="${ctx.columnName}" placeholder="${ctx.placeholder}" value="${ctx.value}">`;
|
|
7894
|
+
shadowRoot.innerHTML = `<input class="ui-grid-filter-input" data-role="filter" data-column="${escapeHtml(ctx.columnName)}" placeholder="${escapeHtml(ctx.placeholder)}" value="${escapeHtml(ctx.value)}">`;
|
|
7699
7895
|
}
|
|
7700
7896
|
|
|
7701
7897
|
// src/components/grid-filter-cell/grid-filter-cell.ts
|
|
@@ -7798,7 +7994,7 @@ var grid_group_row_default = ".sr-only{position:absolute;width:1px;height:1px;pa
|
|
|
7798
7994
|
var STYLE_KEY4 = {};
|
|
7799
7995
|
function renderGroupRow(ctx, shadowRoot) {
|
|
7800
7996
|
adoptStyles(shadowRoot, grid_group_row_default, STYLE_KEY4);
|
|
7801
|
-
shadowRoot.innerHTML = `<svg class="toggle-icon group-disclosure-icon" viewBox="${ctx.iconViewBox}" aria-hidden="true" focusable="false"><path d="${ctx.iconPath}"></path></svg><span class="sr-only">${ctx.disclosureLabel}</span><strong>${ctx.field}: ${ctx.label}</strong><span>${ctx.count} ${ctx.rowsSuffix}</span>`;
|
|
7997
|
+
shadowRoot.innerHTML = `<svg class="toggle-icon group-disclosure-icon" viewBox="${escapeHtml(ctx.iconViewBox)}" aria-hidden="true" focusable="false"><path d="${escapeHtml(ctx.iconPath)}"></path></svg><span class="sr-only">${escapeHtml(ctx.disclosureLabel)}</span><strong>${escapeHtml(ctx.columnLabel || ctx.field)}: ${escapeHtml(ctx.label)}</strong><span>${escapeHtml(ctx.count)} ${escapeHtml(ctx.rowsSuffix)}</span>`;
|
|
7802
7998
|
}
|
|
7803
7999
|
|
|
7804
8000
|
// src/components/grid-group-row/grid-group-row.ts
|
|
@@ -7806,6 +8002,8 @@ var UIGridGroupRow = class _UIGridGroupRow extends HTMLElement {
|
|
|
7806
8002
|
static TAG = "ui-grid-group-row";
|
|
7807
8003
|
/** The grouping field name (e.g. "category"). */
|
|
7808
8004
|
field = "";
|
|
8005
|
+
/** The grouped column's header (e.g. "Category"); falls back to `field`. */
|
|
8006
|
+
columnLabel = "";
|
|
7809
8007
|
/** The group value label (e.g. "Fruit"). */
|
|
7810
8008
|
label = "";
|
|
7811
8009
|
/** Number of rows in this group. */
|
|
@@ -7827,6 +8025,7 @@ var UIGridGroupRow = class _UIGridGroupRow extends HTMLElement {
|
|
|
7827
8025
|
"data-group",
|
|
7828
8026
|
"data-collapsed",
|
|
7829
8027
|
"data-field",
|
|
8028
|
+
"data-column-label",
|
|
7830
8029
|
"data-label",
|
|
7831
8030
|
"data-count",
|
|
7832
8031
|
"data-depth",
|
|
@@ -7847,6 +8046,7 @@ var UIGridGroupRow = class _UIGridGroupRow extends HTMLElement {
|
|
|
7847
8046
|
render() {
|
|
7848
8047
|
const depth = parseInt(this.getAttribute("data-depth") ?? "0", 10);
|
|
7849
8048
|
this.field = this.getAttribute("data-field") ?? "";
|
|
8049
|
+
this.columnLabel = this.getAttribute("data-column-label") ?? "";
|
|
7850
8050
|
this.label = this.getAttribute("data-label") ?? "";
|
|
7851
8051
|
this.count = this.getAttribute("data-count") ?? "0";
|
|
7852
8052
|
this.disclosureLabel = this.getAttribute("data-disclosure-label") ?? "";
|
|
@@ -8398,6 +8598,10 @@ var UiGridStandaloneElement = class extends HTMLElement {
|
|
|
8398
8598
|
this.icons.setOverrides(this.activeOptions.iconOverrides ?? {});
|
|
8399
8599
|
this.ensureController(this.buildEffectiveOptions(this.activeOptions));
|
|
8400
8600
|
}
|
|
8601
|
+
/** Append application CSS after the grid styles; return a removal callback. */
|
|
8602
|
+
addStyles(cssText) {
|
|
8603
|
+
return addUserStyles(this.ensureShadowRoot(), cssText);
|
|
8604
|
+
}
|
|
8401
8605
|
/**
|
|
8402
8606
|
* Declare which slots are framework-rendered. When a slot is flagged, the
|
|
8403
8607
|
* element renders a `<slot name="…">` placeholder at the usual site instead
|
|
@@ -8418,6 +8622,7 @@ var UiGridStandaloneElement = class extends HTMLElement {
|
|
|
8418
8622
|
setFrameworkRenderedSlots(config) {
|
|
8419
8623
|
if (this.frameworkSlots.configure(config)) {
|
|
8420
8624
|
this.lastRowStateFingerprints.clear();
|
|
8625
|
+
this.lastStructureKey = null;
|
|
8421
8626
|
this.render();
|
|
8422
8627
|
}
|
|
8423
8628
|
}
|
|
@@ -8800,6 +9005,9 @@ var UiGridStandaloneElement = class extends HTMLElement {
|
|
|
8800
9005
|
this.templateObserver?.disconnect();
|
|
8801
9006
|
this.templateObserver = null;
|
|
8802
9007
|
this.teardownAutoResize();
|
|
9008
|
+
this.scrollbarObserver?.disconnect();
|
|
9009
|
+
this.scrollbarObserver = null;
|
|
9010
|
+
this.observedBodyViewport = null;
|
|
8803
9011
|
if (this.scrollFrame !== null) {
|
|
8804
9012
|
cancelAnimationFrame(this.scrollFrame);
|
|
8805
9013
|
this.scrollFrame = null;
|
|
@@ -9072,8 +9280,27 @@ var UiGridStandaloneElement = class extends HTMLElement {
|
|
|
9072
9280
|
this.render();
|
|
9073
9281
|
});
|
|
9074
9282
|
}
|
|
9283
|
+
this.syncScrollbarCompensation(root);
|
|
9075
9284
|
this.autoAdjustHeight(snapshot);
|
|
9076
9285
|
}
|
|
9286
|
+
scrollbarObserver = null;
|
|
9287
|
+
observedBodyViewport = null;
|
|
9288
|
+
// The header and filter strips have no scrollbar, so they are narrowed by the
|
|
9289
|
+
// body viewport's to keep right-pinned cells and scroll range aligned (#7402).
|
|
9290
|
+
syncScrollbarCompensation(root) {
|
|
9291
|
+
const frame = root.querySelector(".grid-frame");
|
|
9292
|
+
const viewport = root.querySelector(".grid-body-viewport");
|
|
9293
|
+
if (!frame || !viewport) return;
|
|
9294
|
+
const width = `${Math.max(0, viewport.offsetWidth - viewport.clientWidth)}px`;
|
|
9295
|
+
if (frame.style.getPropertyValue("--ui-grid-scrollbar-width") !== width) {
|
|
9296
|
+
frame.style.setProperty("--ui-grid-scrollbar-width", width);
|
|
9297
|
+
}
|
|
9298
|
+
if (viewport === this.observedBodyViewport || typeof ResizeObserver === "undefined") return;
|
|
9299
|
+
this.scrollbarObserver ??= new ResizeObserver(() => this.syncScrollbarCompensation(root));
|
|
9300
|
+
if (this.observedBodyViewport) this.scrollbarObserver.unobserve(this.observedBodyViewport);
|
|
9301
|
+
this.scrollbarObserver.observe(viewport);
|
|
9302
|
+
this.observedBodyViewport = viewport;
|
|
9303
|
+
}
|
|
9077
9304
|
/** @internal */
|
|
9078
9305
|
inAutoAdjust = false;
|
|
9079
9306
|
lastAutoHeight = 0;
|
|
@@ -9218,7 +9445,7 @@ var UiGridStandaloneElement = class extends HTMLElement {
|
|
|
9218
9445
|
snapshot.visibleColumns.map((column) => this.renderFilterCell(column)).join("")
|
|
9219
9446
|
) : "";
|
|
9220
9447
|
const bodyContent = itemsToRender.map((item, index) => this.renderDisplayItem(item, startIndex + index)).join("");
|
|
9221
|
-
const body = snapshot.pipeline.displayItems.length > 0 ? virtualizationEnabled ? bodyVirtualMarkup(templateColumns, totalVirtualHeight, virtualOffset, bodyContent) : bodyStaticMarkup(templateColumns, bodyContent) : this.renderEmptyState(
|
|
9448
|
+
const body = snapshot.pipeline.displayItems.length > 0 ? virtualizationEnabled ? bodyVirtualMarkup(templateColumns, totalVirtualHeight, virtualOffset, bodyContent, snapshot.rowSize) : bodyStaticMarkup(templateColumns, bodyContent) : this.renderEmptyState(
|
|
9222
9449
|
options.emptyMessage ?? labels.emptyHeading,
|
|
9223
9450
|
labels.emptyDescription
|
|
9224
9451
|
);
|
|
@@ -9247,8 +9474,8 @@ var UiGridStandaloneElement = class extends HTMLElement {
|
|
|
9247
9474
|
renderPatch(plan, root) {
|
|
9248
9475
|
renderPatch(this, plan, root);
|
|
9249
9476
|
}
|
|
9250
|
-
reconcileBodyRoot(root, kind, options, labels, templateColumns, virtualOffset, totalVirtualHeight) {
|
|
9251
|
-
return reconcileBodyRoot(this, root, kind, options, labels, templateColumns, virtualOffset, totalVirtualHeight);
|
|
9477
|
+
reconcileBodyRoot(root, kind, options, labels, templateColumns, virtualOffset, totalVirtualHeight, rowSize) {
|
|
9478
|
+
return reconcileBodyRoot(this, root, kind, options, labels, templateColumns, virtualOffset, totalVirtualHeight, rowSize);
|
|
9252
9479
|
}
|
|
9253
9480
|
reconcilePagination(root, snapshot, shouldShow) {
|
|
9254
9481
|
reconcilePagination(this, root, snapshot, shouldShow);
|
|
@@ -9455,6 +9682,7 @@ async function defineStandaloneUiGridElement(tagName = "ui-grid-element") {
|
|
|
9455
9682
|
// src/index.ts
|
|
9456
9683
|
async function registerVanillaUiGridRustModule(module, input) {
|
|
9457
9684
|
await module.default(input);
|
|
9685
|
+
registerUiGridWasmEngineFromModule(module);
|
|
9458
9686
|
}
|
|
9459
9687
|
async function mountVanillaUiGrid(target, options, rustModule, tagName = "ui-grid-element") {
|
|
9460
9688
|
if (rustModule) {
|