@agile-team/mach-table 0.31.2 → 0.32.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -1
- package/dist/adapter.cjs +1 -1
- package/dist/adapter.d.cts +20 -3
- package/dist/adapter.d.ts +20 -3
- package/dist/adapter.js +1 -1
- package/dist/analysis.cjs +3 -0
- package/dist/analysis.d.cts +60 -0
- package/dist/analysis.d.ts +60 -0
- package/dist/analysis.js +3 -0
- package/dist/{options-Bi_m5kXL.d.cts → api-pOhyuSQk.d.cts} +780 -754
- package/dist/{options-Bi_m5kXL.d.ts → api-pOhyuSQk.d.ts} +780 -754
- package/dist/{configuration-C9KYeIy1.d.ts → configuration-SYWVjGft.d.ts} +1 -1
- package/dist/{configuration-Bj_JwdTd.d.cts → configuration-gAE1eZuB.d.cts} +1 -1
- package/dist/index.cjs +6 -6
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +6 -6
- package/dist/mach-table.css +1 -1
- package/dist/multi-range.cjs +4 -0
- package/dist/multi-range.d.cts +13 -0
- package/dist/multi-range.d.ts +13 -0
- package/dist/multi-range.js +4 -0
- package/dist/ordering.cjs +1 -0
- package/dist/ordering.d.cts +93 -0
- package/dist/ordering.d.ts +93 -0
- package/dist/ordering.js +1 -0
- package/dist/preferences.cjs +1 -0
- package/dist/preferences.d.cts +71 -0
- package/dist/preferences.d.ts +71 -0
- package/dist/preferences.js +1 -0
- package/dist/server-side.cjs +1 -0
- package/dist/server-side.css +1 -0
- package/dist/server-side.css.d.ts +2 -0
- package/dist/server-side.d.cts +132 -0
- package/dist/server-side.d.ts +132 -0
- package/dist/server-side.js +1 -0
- package/dist/shared-Bi8hAuzn.d.cts +12 -0
- package/dist/shared-Bn77TiBm.d.ts +12 -0
- package/dist/workbench.cjs +1 -0
- package/dist/workbench.css +1 -0
- package/dist/workbench.css.d.ts +2 -0
- package/dist/workbench.d.cts +72 -0
- package/dist/workbench.d.ts +72 -0
- package/dist/workbench.js +1 -0
- package/dist/worker.d.cts +2 -2
- package/dist/worker.d.ts +2 -2
- package/package.json +72 -5
- /package/{styles → dist}/mach-table.css.d.ts +0 -0
package/dist/mach-table.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.mach-root{--mach-font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Arial, sans-serif;--mach-font-size: 13px;--mach-font-size-sm: 12px;--mach-header-font-weight: 650;--mach-cell-padding: 9px;--mach-row-h: 36px;--mach-header-h: 40px;--mach-primary: #2563eb;--mach-primary-weak: #dbeafe;--mach-success: #16a34a;--mach-warning: #d97706;--mach-danger: #dc2626;--mach-info: #0284c7;--mach-border-color: #e6eaf0;--mach-row-border-color: #eef1f6;--mach-cell-border-color: transparent;--mach-border-width: 1px;--mach-header-border-width: 1px;--mach-header-accent-color: #d9e1eb;--mach-header-bg: #f4f7fb;--mach-header-group-bg: #edf2f8;--mach-header-fg: #344054;--mach-body-bg: #ffffff;--mach-body-fg: #26303f;--mach-row-hover-bg: #f6f8fa;--mach-row-selected-bg: #eff6ff;--mach-zebra-bg: #fafbfd;--mach-cell-focus-color: #2563eb;--mach-focus-width: 1.5px;--mach-scrollbar-thumb: #c9d2dd;--mach-radius-sm: 4px;--mach-radius: 6px;--mach-radius-lg: 8px;--mach-shadow-sm: 0 1px 4px rgba(15, 23, 42, .08);--mach-shadow: 0 6px 20px rgba(15, 23, 42, .12);--mach-transition: .15s ease;--mach-z-overlay: 10;--mach-z-loading: 15;--mach-z-popup: 1000;--mach-z-menu: 1001;position:relative;display:flex;flex-direction:column;width:100%;height:100%;min-height:120px;overflow:hidden;font-family:var(--mach-font-family);font-size:var(--mach-font-size);color:var(--mach-body-fg);background:var(--mach-body-bg);outline:none;box-sizing:border-box;border:1px solid var(--mach-border-color);color-scheme:light;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-variant-numeric:tabular-nums;contain:layout style}.mach-root.mach-dom-layout--auto-height{height:auto;min-height:0}.mach-root.mach-dom-layout--auto-height .mach-body{flex:none}.mach-root.mach-dom-layout--auto-height .mach-body-viewport--scroll{overflow-y:hidden}.mach-toolbar{display:flex;align-items:center;justify-content:space-between;gap:10px;min-height:44px;padding:6px 8px;font:13px/1.4 var(--mach-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif);color:var(--mach-body-fg, #26303f);background:var(--mach-body-bg, #fff);border:1px solid var(--mach-border-color, #e6eaf0);border-bottom:0;border-radius:var(--mach-radius-lg, 8px) var(--mach-radius-lg, 8px) 0 0}.mach-toolbar__main,.mach-toolbar__aside{display:flex;align-items:center;gap:6px;min-width:0}.mach-toolbar__search{display:flex;align-items:center;gap:6px;width:min(240px,32vw);height:32px;padding:0 9px;color:#64748b;background:var(--mach-header-bg, #fafbfd);border:1px solid var(--mach-border-color, #e6eaf0);border-radius:6px;transition:border-color var(--mach-transition, .15s ease),box-shadow var(--mach-transition, .15s ease)}.mach-toolbar__search:focus-within{border-color:var(--mach-primary, #2563eb);box-shadow:0 0 0 2px color-mix(in srgb,var(--mach-primary, #2563eb) 12%,transparent)}.mach-toolbar__search input{min-width:0;width:100%;color:inherit;background:transparent;border:0;outline:0}.mach-toolbar__button,.mach-toolbar__select-host,.mach-toolbar__selection{height:32px;padding:0 10px;color:inherit;background:var(--mach-body-bg, #fff);border:1px solid var(--mach-border-color, #e6eaf0);border-radius:6px;cursor:pointer;transition:color var(--mach-transition, .15s ease),border-color var(--mach-transition, .15s ease),background var(--mach-transition, .15s ease)}.mach-toolbar__button{min-width:32px;padding:0 8px;font-size:16px}.mach-toolbar__button:hover:not(:disabled),.mach-toolbar__select-host:hover{color:var(--mach-primary, #2563eb);border-color:var(--mach-primary, #2563eb)}.mach-toolbar__button:disabled{cursor:not-allowed;opacity:.45}.mach-toolbar__selection{color:var(--mach-primary, #2563eb);background:var(--mach-primary-weak, #dbeafe);border-color:transparent;font-size:12px}.mach-toolbar__select-host{width:82px;padding:0}.mach-toolbar__select-control,.mach-toolbar__select-control .mach-select-trigger{width:100%;height:100%}.mach-toolbar__select-control .mach-select-trigger{border:0;border-radius:5px;background:transparent;box-shadow:none}@media(max-width:640px){.mach-toolbar{align-items:stretch;flex-direction:column}.mach-toolbar__main,.mach-toolbar__aside{flex-wrap:wrap}.mach-toolbar__search{flex:1;width:auto}}.mach-size--compact{--mach-font-size: 12px;--mach-cell-padding: 6px}.mach-size--normal{--mach-font-size: 13px;--mach-cell-padding: 9px}.mach-size--large{--mach-font-size: 14px;--mach-cell-padding: 12px}.mach-root.mach-cell-borders{--mach-cell-border-color: var(--mach-border-color)}.mach-root.mach-theme-dark,.mach-root.mach-theme-dark.mach-size--compact,.mach-root.mach-theme-dark.mach-size--normal,.mach-root.mach-theme-dark.mach-size--large{--mach-border-color: #26324a;--mach-row-border-color: #1c2740;--mach-header-accent-color: #33415e;--mach-header-bg: #101a2e;--mach-header-group-bg: #16213a;--mach-header-fg: #c3cee0;--mach-body-bg: #0d1526;--mach-body-fg: #dbe4f0;--mach-row-hover-bg: #142138;--mach-row-selected-bg: #14304f;--mach-zebra-bg: #0f1a2e;--mach-cell-focus-color: #60a5fa;--mach-primary: #60a5fa;--mach-primary-weak: #1e3a5f;--mach-scrollbar-thumb: #33415e;--mach-success: #4ade80;--mach-warning: #fbbf24;--mach-danger: #f87171;--mach-info: #38bdf8;--mach-shadow-sm: 0 1px 4px rgba(0, 0, 0, .4);--mach-shadow: 0 6px 20px rgba(0, 0, 0, .5);color-scheme:dark}.mach-root *,.mach-root *:before,.mach-root *:after{box-sizing:border-box}.mach-portal,.mach-portal *,.mach-portal *:before,.mach-portal *:after{box-sizing:border-box}.mach-root:focus-visible{outline:2px solid var(--mach-primary);outline-offset:-2px}.mach-header{display:flex;flex-shrink:0;width:100%;height:var(--mach-header-h);background:var(--mach-header-bg);border-bottom:var(--mach-header-border-width) solid var(--mach-header-accent-color);box-shadow:0 1px 2px color-mix(in srgb,var(--mach-header-fg) 8%,transparent);overflow:hidden;position:relative;z-index:3;user-select:none}.mach-body{display:flex;flex:1;min-height:0;width:100%;position:relative;overflow:hidden}.mach-pane{position:relative;overflow:hidden;flex-shrink:0}.mach-pane--center{flex:1 1 auto;min-width:0}.mach-pane--hidden{display:none}.mach-header-viewport{width:100%;height:100%;overflow:hidden}.mach-header-rows{position:relative;height:100%;width:100%}.mach-header-row{position:absolute;left:0}.mach-header-row .mach-header-cell{position:absolute;top:0}.mach-header-cell--group{justify-content:center;border-bottom:var(--mach-border-width) solid var(--mach-border-color);font-weight:var(--mach-header-font-weight);background:var(--mach-header-group-bg)}.mach-header-label--custom{display:inline-flex;align-items:center;min-width:0;overflow:hidden}.mach-header-cell{display:flex;align-items:center;gap:4px;padding:0 var(--mach-cell-padding);border-right:var(--mach-border-width) solid transparent;color:var(--mach-header-fg);font-weight:var(--mach-header-font-weight);font-size:var(--mach-font-size);letter-spacing:.15px;cursor:default;overflow:hidden;white-space:nowrap;background:var(--mach-header-bg);transition:color var(--mach-transition),background-color var(--mach-transition)}.mach-header-cell--leaf:hover{background:color-mix(in srgb,var(--mach-primary) 4%,var(--mach-header-bg))}.mach-header-cell.mach-header-cell--sorted{color:var(--mach-primary);background:color-mix(in srgb,var(--mach-primary) 5%,var(--mach-header-bg))}.mach-root.mach-cell-borders .mach-header-cell{border-right-color:var(--mach-border-color)}.mach-header-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;cursor:pointer}.mach-header-cell--selection{justify-content:center;gap:0;padding:0}.mach-header-cell--selection .mach-header-label:empty{display:none}.mach-sort-indicator{display:inline-flex;align-items:center;gap:3px;color:var(--mach-primary);flex-shrink:0}.mach-sort-indicator svg{width:10px;height:10px}.mach-sort-indicator:empty{display:none}.mach-sort-badge{font-size:9px;line-height:1;padding:1.5px 4px;border-radius:999px;background:var(--mach-primary-weak);color:var(--mach-primary);font-weight:600}.mach-filter-btn{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;padding:0;border:none;border-radius:var(--mach-radius-sm);background:transparent;color:inherit;opacity:.36;cursor:pointer;flex-shrink:0;transition:opacity var(--mach-transition),color var(--mach-transition),background-color var(--mach-transition)}.mach-filter-btn svg{width:12px;height:12px;pointer-events:none}.mach-header-cell:hover .mach-filter-btn,.mach-header-cell:hover .mach-menu-btn{opacity:.62}.mach-filter-btn:hover{opacity:1;background:var(--mach-row-hover-bg)}.mach-filter-btn--active{opacity:1;color:var(--mach-primary)}.mach-filter-tag{display:inline-flex;align-items:center;max-width:96px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:0 6px;height:16px;line-height:16px;border-radius:999px;background:var(--mach-primary-weak);color:var(--mach-primary);font-size:10px;font-weight:500;flex-shrink:0}.mach-menu-btn{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;padding:0;border:none;border-radius:var(--mach-radius-sm);background:transparent;color:inherit;opacity:.36;cursor:pointer;flex-shrink:0;font-size:12px;line-height:1;transition:opacity var(--mach-transition),color var(--mach-transition),background-color var(--mach-transition)}.mach-menu-btn:hover{opacity:1;background:var(--mach-row-hover-bg)}.mach-menu-btn svg{width:12px;height:12px;pointer-events:none}.mach-header-resize{position:absolute;top:0;right:0;width:8px;height:100%;cursor:col-resize;z-index:2;touch-action:none}.mach-header-resize:hover:after,.mach-header-resize--active:after{content:"";position:absolute;inset:0 3px;background:var(--mach-primary);opacity:.45;border-radius:1px}.mach-column-resize-guide{position:absolute;bottom:0;width:2px;pointer-events:none;background:var(--mach-primary);box-shadow:0 0 0 1px var(--mach-primary-weak);z-index:8}.mach-column-resize-label{position:absolute;top:6px;min-width:52px;padding:3px 7px;border-radius:var(--mach-radius-sm);color:#fff;background:var(--mach-primary);font:600 11px/1.5 var(--mach-font-family);text-align:center;white-space:nowrap;transform:translate(-50%);box-shadow:var(--mach-shadow-sm)}.mach-header-cell--dragging{opacity:.22}.mach-column-drag-ghost{position:fixed;top:0;left:0;z-index:calc(var(--mach-z-menu) + 1);display:flex;align-items:center;height:var(--mach-header-h);max-width:calc(100vw - 16px);padding:0 var(--mach-cell-padding);overflow:hidden;color:var(--mach-body-fg);font:var(--mach-header-font-weight) var(--mach-font-size)/1.3 var(--mach-font-family);text-overflow:ellipsis;white-space:nowrap;pointer-events:none;background:var(--mach-body-bg);border:1px solid var(--mach-primary);border-radius:var(--mach-radius);box-shadow:var(--mach-shadow);opacity:.96;will-change:transform}.mach-drop-indicator{position:absolute;top:3px;left:0;width:2px;height:calc(100% - 6px);border-radius:2px;background:var(--mach-primary);z-index:4;pointer-events:none;will-change:transform}.mach-root--dragging{cursor:grabbing}.mach-root--dragging .mach-header-cell,.mach-root--resizing .mach-header-cell{cursor:default}.mach-root--resizing{cursor:col-resize}.mach-body-viewport{position:relative;width:100%;height:100%;overflow:hidden}.mach-body-viewport--scroll{overflow:auto;overscroll-behavior:contain}.mach-body-viewport--scroll{scrollbar-width:thin;scrollbar-color:var(--mach-scrollbar-thumb) transparent}.mach-body-viewport--scroll::-webkit-scrollbar{width:10px;height:10px}.mach-body-viewport--scroll::-webkit-scrollbar-track{background:transparent}.mach-body-viewport--scroll::-webkit-scrollbar-thumb{background:var(--mach-scrollbar-thumb);border-radius:999px;border:3px solid transparent;background-clip:padding-box;transition:background-color var(--mach-transition)}.mach-body-viewport--scroll::-webkit-scrollbar-thumb:hover{background:color-mix(in srgb,var(--mach-scrollbar-thumb) 60%,var(--mach-primary));background-clip:padding-box}.mach-body-viewport--scroll::-webkit-scrollbar-thumb:active{background:var(--mach-primary);background-clip:padding-box}.mach-body-viewport--scroll::-webkit-scrollbar-corner{background:transparent}.mach-row-container{position:relative;width:100%}.mach-row{position:absolute;top:0;left:0;display:flex;width:100%;background:var(--mach-body-bg);border-bottom:var(--mach-border-width) solid var(--mach-row-border-color);contain:layout style}.mach-row,.mach-row .mach-cell{transition:background-color var(--mach-transition)}.mach-root.mach-striped .mach-row--odd,.mach-root.mach-striped .mach-row--odd .mach-cell{background:var(--mach-zebra-bg)}.mach-cell{position:absolute;top:0;display:flex;align-items:center;height:100%;padding:0 var(--mach-cell-padding);border-right:1px solid var(--mach-cell-border-color);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;cursor:default;line-height:calc(var(--mach-row-h) - 2px)}.mach-cell--loading{pointer-events:none}.mach-cell-loading-bar{display:block;height:8px;max-width:132px;border-radius:999px;background:linear-gradient(90deg,var(--mach-row-hover-bg),var(--mach-border-color),var(--mach-row-hover-bg));background-size:200% 100%;animation:mach-cell-loading 1.25s ease-in-out infinite}@keyframes mach-cell-loading{0%{background-position:200% 0}to{background-position:-200% 0}}@media(prefers-reduced-motion:reduce){.mach-cell-loading-bar{animation:none}}.mach-cell--num{justify-content:flex-end}.mach-cell--selection{justify-content:center;padding:0}.mach-cell--editing{padding:0 3px}.mach-cell--focus{box-shadow:inset 0 0 0 var(--mach-focus-width) var(--mach-cell-focus-color);border-radius:var(--mach-radius-sm);z-index:1}.mach-cell--selection.mach-cell--focus{box-shadow:none;border-radius:0;z-index:auto}.mach-row--hover,.mach-row--hover .mach-cell{background:var(--mach-row-hover-bg)}.mach-row--selected,.mach-row--selected .mach-cell{background:var(--mach-row-selected-bg)}.mach-row--selected.mach-row--hover,.mach-row--selected.mach-row--hover .mach-cell{background:var(--mach-row-selected-bg);filter:brightness(.985)}input.mach-row-checkbox,input.mach-select-all{width:13px;height:13px;margin:0;accent-color:var(--mach-primary);cursor:pointer;flex-shrink:0}.mach-detail-row{background:var(--mach-zebra-bg);z-index:0}.mach-detail{height:100%;overflow:auto;padding:10px 12px}.mach-cell--detail-toggle{justify-content:center;padding:0;cursor:pointer}.mach-detail-toggle{display:inline-flex;align-items:center;justify-content:center;width:100%;font-size:10px;color:var(--mach-header-fg);transition:transform .15s ease}.mach-detail-toggle--open{transform:rotate(90deg)}.mach-detail-toggle--loading{animation:mach-tree-spin .8s linear infinite;color:var(--mach-primary)}.mach-detail-toggle--error{color:#dc2626}@keyframes mach-tree-spin{to{transform:rotate(360deg)}}@media(prefers-reduced-motion:reduce){.mach-detail-toggle--loading{animation:none}}.mach-cell--group{cursor:pointer;background:var(--mach-header-bg)}.mach-row .mach-cell--group,.mach-row:has(.mach-cell--group){background:var(--mach-header-bg)}.mach-group-label{display:inline-flex;align-items:center;gap:5px;min-width:0;overflow:hidden}.mach-group-text{font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mach-group-count{color:var(--mach-header-fg);font-size:10px;flex-shrink:0;opacity:.8}.mach-tree-cell{display:inline-flex;align-items:center;gap:4px;min-width:0;width:100%}.mach-tree-indent{flex-shrink:0}.mach-tree-toggle{display:inline-flex;align-items:center;justify-content:center;flex:0 0 20px;width:20px;height:22px;padding:0;border:0;border-radius:var(--mach-radius-sm);color:var(--mach-header-fg);background:transparent;cursor:pointer}.mach-tree-toggle:hover,.mach-tree-toggle:focus-visible{color:var(--mach-primary);background:var(--mach-primary-weak)}.mach-tree-toggle:focus-visible{outline:1px solid var(--mach-primary);outline-offset:-1px}.mach-tree-toggle>.mach-detail-toggle{width:10px;line-height:1;color:inherit;pointer-events:none}.mach-tree-toggle>.mach-detail-toggle--loading{color:var(--mach-primary)}.mach-tree-toggle>.mach-detail-toggle--error{color:var(--mach-danger)}.mach-tree-toggle-spacer{flex:0 0 20px;width:20px}.mach-tree-text{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mach-cell--drag{justify-content:center;padding:0;cursor:grab}.mach-row-drag-handle{display:grid;place-items:center;width:26px;height:26px;padding:0;border:1px solid transparent;border-radius:var(--mach-radius-sm);color:var(--mach-header-fg);background:transparent;opacity:.55;cursor:grab;user-select:none;touch-action:none;transition:color var(--mach-transition),background var(--mach-transition),opacity var(--mach-transition)}.mach-row-drag-handle:before{content:"";width:10px;height:14px;background:radial-gradient(circle,currentColor 1.3px,transparent 1.5px) 0 0 / 5px 5px}.mach-row-drag-handle:hover:not(:disabled),.mach-row-drag-handle:focus-visible{opacity:1;color:var(--mach-primary);background:var(--mach-primary-weak);border-color:color-mix(in srgb,var(--mach-primary) 28%,transparent);outline:none}.mach-row-drag-handle:disabled{opacity:.2;cursor:not-allowed}.mach-row-drop-indicator{position:absolute;top:0;left:0;width:100%;height:2px;background:var(--mach-primary);box-shadow:0 0 0 1px color-mix(in srgb,var(--mach-body-bg) 65%,transparent);z-index:5;pointer-events:none;will-change:transform}.mach-row-drop-indicator:before{content:"";position:absolute;left:1px;top:-2px;width:6px;height:6px;border-radius:50%;background:var(--mach-primary)}.mach-pane--center .mach-row-drop-indicator:before,.mach-pane--right .mach-row-drop-indicator:before{display:none}.mach-row-drag-preview{position:absolute;top:0;left:0;z-index:var(--mach-z-overlay);max-width:min(216px,calc(100% - 16px));padding:9px 14px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border:1px solid color-mix(in srgb,var(--mach-primary) 35%,var(--mach-border-color));border-radius:var(--mach-radius);background:var(--mach-body-bg);color:var(--mach-body-fg);box-shadow:var(--mach-shadow);font-weight:600;pointer-events:none}.mach-root--row-dragging,.mach-root--row-dragging .mach-cell,.mach-root--row-dragging .mach-row-drag-handle{cursor:grabbing;user-select:none}.mach-root .mach-row--drag-source{opacity:.45}.mach-cell--index{color:var(--mach-header-fg);font-size:calc(var(--mach-font-size) - 1px)}.mach-editor-input.mach-editor-invalid,.mach-editor-invalid .mach-editor-input,.mach-editor-invalid .mach-select-trigger,.mach-editor-invalid input,.mach-editor-invalid select:not([hidden]){border-color:#ef4444!important;box-shadow:0 0 0 1px #ef444459}.mach-editor-validating{cursor:progress;opacity:.72}.mach-footer{display:flex;flex-shrink:0;width:100%;overflow:hidden;background:var(--mach-header-bg);border-top:1px solid var(--mach-border-color);font-weight:600;color:var(--mach-header-fg);position:relative;z-index:3}.mach-footer-row{position:relative;overflow:hidden;flex-shrink:0}.mach-footer-row--center{flex:1 1 auto;min-width:0}.mach-footer-cell{position:absolute;top:0;display:flex;align-items:center;padding:0 var(--mach-cell-padding);border-right:1px solid transparent;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;height:100%;font-variant-numeric:tabular-nums}.mach-root.mach-cell-borders .mach-footer-cell{border-right-color:var(--mach-border-color)}.mach-cell--range{background:color-mix(in srgb,var(--mach-primary) 7%,transparent)!important}.mach-cell--range:after{content:"";position:absolute;inset:0;z-index:2;border:0 solid var(--mach-primary);pointer-events:none}.mach-cell--range.mach-cell--range-top:after{border-top-width:1.5px}.mach-cell--range.mach-cell--range-bottom:after{border-bottom-width:1.5px}.mach-cell--range.mach-cell--range-left:after{border-left-width:1.5px}.mach-cell--range.mach-cell--range-right:after{border-right-width:1.5px}.mach-cell--range.mach-cell--focus{box-shadow:inset 0 0 0 var(--mach-focus-width) var(--mach-cell-focus-color)}.mach-cell--range.mach-cell--focus:after{display:none}.mach-context-menu{position:fixed;z-index:var(--mach-z-menu);display:flex;flex-direction:column;min-width:140px;padding:5px;background:var(--mach-body-bg);color:var(--mach-body-fg);border:1px solid var(--mach-border-color);border-radius:var(--mach-radius-lg);box-shadow:var(--mach-shadow);font-family:var(--mach-font-family);font-size:var(--mach-font-size)}.mach-context-menu-item{text-align:left;padding:6px 10px;border:none;border-radius:var(--mach-radius);background:transparent;color:inherit;font:inherit;cursor:pointer;white-space:nowrap}.mach-context-menu-item:hover{background:var(--mach-row-hover-bg);color:var(--mach-primary)}.mach-fill-handle{position:absolute;width:8px;height:8px;border-radius:2px;background:var(--mach-primary);border:1.5px solid var(--mach-body-bg);cursor:crosshair;z-index:6;box-shadow:0 0 0 1px #2563eb59}.mach-root--filling,.mach-root--filling *{user-select:none!important;cursor:crosshair!important}.mach-infinite-loading{position:absolute;left:50%;bottom:14px;transform:translate(-50%);display:flex;align-items:center;gap:8px;padding:5px 14px;border-radius:999px;background:var(--mach-body-bg);border:1px solid var(--mach-border-color);box-shadow:var(--mach-shadow-sm);color:var(--mach-header-fg);font-size:12px;z-index:var(--mach-z-loading)}.mach-infinite-loading .mach-spinner{width:14px;height:14px;border-width:2px}.mach-statusbar{display:flex;align-items:center;gap:18px;flex-shrink:0;height:28px;padding:0 12px;background:var(--mach-header-bg);border-top:1px solid var(--mach-border-color);color:var(--mach-header-fg);font-size:11px;overflow:hidden;white-space:nowrap;font-variant-numeric:tabular-nums}.mach-statusbar-item--rangeAggregate{margin-left:auto}.mach-pinned-rows{display:flex;width:100%;overflow:hidden;background:var(--mach-header-bg);flex-shrink:0;border-bottom:1px solid var(--mach-border-color)}.mach-pinned-rows--bottom{border-bottom:none;border-top:1px solid var(--mach-border-color)}.mach-pinned-viewport{flex:1 1 auto;min-width:0;overflow:hidden}.mach-pinned-seg{position:relative;overflow:hidden;flex-shrink:0}.mach-pinned-seg--center{position:relative}.mach-pinned-row{position:relative;width:100%;border-bottom:1px solid var(--mach-row-border-color)}.mach-pinned-row .mach-cell{position:absolute;top:0;background:var(--mach-header-bg);font-weight:600;color:var(--mach-header-fg)}.mach-pinned-row:last-child{border-bottom:none}.mach-cell--wrap{white-space:normal;word-break:break-word;line-height:1.45;align-items:flex-start;padding-top:5px;padding-bottom:5px}.mach-editor-input,.mach-editor-select-control .mach-select-trigger{width:100%;height:calc(var(--mach-row-h) - 8px);padding:0 6px;border:1px solid var(--mach-primary);border-radius:var(--mach-radius-sm);font-family:inherit;font-size:var(--mach-font-size);color:inherit;background:var(--mach-body-bg);outline:none}.mach-select-control{position:relative;display:inline-flex;min-width:0;font-family:var(--mach-font-family, inherit);font-size:var(--mach-font-size, 14px)}.mach-select-native[hidden]{display:none!important}.mach-select-trigger{display:flex;align-items:center;justify-content:space-between;gap:10px;min-width:0;height:34px;padding:0 10px;border:1px solid var(--mach-border-color, #e6eaf0);border-radius:var(--mach-radius, 6px);outline:none;color:var(--mach-body-fg, #1f2937);background:var(--mach-body-bg, #fff);font:inherit;line-height:1;text-align:left;cursor:pointer;transition:border-color var(--mach-transition, .15s ease),box-shadow var(--mach-transition, .15s ease),background-color var(--mach-transition, .15s ease)}.mach-select-trigger:hover{border-color:color-mix(in srgb,var(--mach-primary, #2563eb) 44%,var(--mach-border-color, #e6eaf0));background:color-mix(in srgb,var(--mach-primary, #2563eb) 3%,var(--mach-body-bg, #fff))}.mach-select-trigger:focus-visible,.mach-select-trigger[aria-expanded=true]{border-color:var(--mach-primary, #2563eb);box-shadow:0 0 0 3px color-mix(in srgb,var(--mach-primary, #2563eb) 12%,transparent)}.mach-select-value{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mach-select-caret{width:8px;height:8px;flex:0 0 auto;border-right:1.5px solid currentColor;border-bottom:1.5px solid currentColor;transform:translateY(-2px) rotate(45deg);transition:transform var(--mach-transition, .15s ease)}.mach-select-trigger[aria-expanded=true] .mach-select-caret{transform:translateY(2px) rotate(225deg)}.mach-select-listbox{position:fixed;z-index:var(--mach-z-menu, 1200);display:none;flex-direction:column;gap:2px;min-width:112px;max-width:min(320px,calc(100vw - 16px));max-height:min(244px,calc(100vh - 16px));padding:5px;overflow:auto;overscroll-behavior:contain;border:1px solid color-mix(in srgb,var(--mach-border-color, #e6eaf0) 88%,var(--mach-primary, #2563eb));border-radius:calc(var(--mach-radius-lg, 8px) + 1px);color:var(--mach-body-fg, #1f2937);background:var(--mach-body-bg, #fff);box-shadow:0 14px 36px color-mix(in srgb,var(--mach-body-fg, #1f2937) 18%,transparent),var(--mach-shadow-sm, 0 1px 3px rgba(15, 23, 42, .12));font-family:var(--mach-font-family, inherit);font-size:var(--mach-font-size, 14px);isolation:isolate}.mach-select-listbox--open{display:flex;animation:mach-select-listbox-in .12s ease-out}.mach-select-option{position:relative;display:flex;align-items:center;flex:0 0 auto;width:100%;min-height:32px;padding:0 30px 0 10px;border:0;border-radius:var(--mach-radius, 6px);outline:none;color:inherit;background:transparent;font:inherit;text-align:left;cursor:pointer;transition:color var(--mach-transition, .15s ease),background-color var(--mach-transition, .15s ease)}.mach-select-option:hover,.mach-select-option:focus-visible,.mach-select-option--active{color:var(--mach-primary, #2563eb);background:color-mix(in srgb,var(--mach-primary, #2563eb) 9%,var(--mach-body-bg, #fff))}.mach-select-option[aria-selected=true]{color:var(--mach-primary, #2563eb);background:color-mix(in srgb,var(--mach-primary, #2563eb) 13%,var(--mach-body-bg, #fff));font-weight:600}.mach-select-option[aria-selected=true]:after{content:"\2713";position:absolute;right:10px;font-size:12px;font-weight:700}.mach-select-option:disabled{opacity:.42;cursor:not-allowed}@keyframes mach-select-listbox-in{0%{transform:translateY(-3px) scale(.99)}to{transform:translateY(0) scale(1)}}.mach-select-listbox--above{transform-origin:bottom}.mach-filter-select-control{width:100%}.mach-filter-select-trigger{width:100%;background:color-mix(in srgb,var(--mach-header-bg) 62%,var(--mach-body-bg))}.mach-filter-listbox{width:auto}.mach-overlay{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:var(--mach-body-bg);z-index:var(--mach-z-overlay)}.mach-overlay-text{color:var(--mach-header-fg);font-size:var(--mach-font-size)}.mach-overlay-content{max-width:min(100%,320px)}.mach-loading{display:grid;justify-items:center;gap:14px;min-width:172px;padding:20px 24px}.mach-loading__visual{position:relative;display:grid;gap:8px;width:132px;padding:14px 16px;overflow:hidden;background:color-mix(in srgb,var(--mach-header-bg) 82%,var(--mach-body-bg));border:1px solid var(--mach-border-color);border-radius:var(--mach-radius-lg);box-shadow:var(--mach-shadow-sm)}.mach-loading__visual:before{content:"";position:absolute;inset:0;transform:translate(-100%);background:linear-gradient(100deg,transparent 20%,color-mix(in srgb,var(--mach-primary) 11%,transparent) 50%,transparent 80%);animation:mach-loading-sweep 1.35s ease-in-out infinite}.mach-loading__row{height:7px;border-radius:999px;background:color-mix(in srgb,var(--mach-primary) 13%,var(--mach-border-color))}.mach-loading__row:nth-child(2){width:82%}.mach-loading__row:nth-child(3){width:92%}.mach-loading__row:nth-child(4){width:66%}.mach-loading__status{display:inline-flex;align-items:center;gap:8px;color:var(--mach-header-fg);font-size:var(--mach-font-size-sm)}.mach-loading__spinner{width:14px;height:14px}.mach-loading__label{line-height:1}.mach-spinner{width:22px;height:22px;border:2px solid var(--mach-border-color);border-top-color:var(--mach-primary);border-radius:50%;animation:mach-spin .8s linear infinite}@keyframes mach-spin{to{transform:rotate(360deg)}}@keyframes mach-loading-sweep{to{transform:translate(100%)}}.mach-filter-panel{position:fixed;z-index:var(--mach-z-popup);display:flex;flex-direction:column;gap:10px;width:224px;max-width:calc(100vw - 16px);padding:12px;background:var(--mach-body-bg);color:var(--mach-body-fg);border:1px solid color-mix(in srgb,var(--mach-border-color) 88%,var(--mach-primary));border-radius:calc(var(--mach-radius-lg) + 2px);box-shadow:0 14px 36px color-mix(in srgb,var(--mach-body-fg) 16%,transparent),var(--mach-shadow-sm);font-family:var(--mach-font-family);font-size:var(--mach-font-size);animation:mach-filter-panel-in .14s ease-out}.mach-filter-body{display:flex;flex-direction:column;gap:8px}.mach-filter-input{width:100%;height:34px;padding:0 10px;border:1px solid var(--mach-border-color);border-radius:var(--mach-radius);font-family:inherit;font-size:var(--mach-font-size);color:inherit;background:var(--mach-body-bg);outline:none;transition:border-color var(--mach-transition),box-shadow var(--mach-transition)}.mach-filter-input:focus{border-color:var(--mach-primary);box-shadow:0 0 0 3px color-mix(in srgb,var(--mach-primary) 12%,transparent)}@keyframes mach-filter-panel-in{0%{opacity:0;transform:translateY(-3px) scale(.99)}}.mach-filter-set-list{max-height:220px;overflow:auto;display:flex;flex-direction:column;gap:1px;border:1px solid var(--mach-border-color);border-radius:var(--mach-radius);padding:4px}.mach-filter-set-item{display:flex;align-items:center;gap:6px;padding:3px 5px;border-radius:var(--mach-radius-sm);cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mach-filter-set-item:hover{background:var(--mach-row-hover-bg)}.mach-filter-set-item input{accent-color:var(--mach-primary);margin:0;width:13px;height:13px}.mach-filter-footer{display:flex;justify-content:flex-end;gap:6px}.mach-filter-footer button{padding:4px 12px;border-radius:var(--mach-radius);border:1px solid var(--mach-border-color);background:var(--mach-body-bg);color:inherit;font-family:inherit;font-size:var(--mach-font-size);cursor:pointer}.mach-filter-footer button:hover{border-color:var(--mach-primary);color:var(--mach-primary)}.mach-filter-btn-apply{background:var(--mach-primary)!important;border-color:var(--mach-primary)!important;color:#fff!important}.mach-filter-btn-apply:hover{opacity:.9;color:#fff!important}.mach-column-panel{min-width:220px;max-height:70vh;overflow:auto}.mach-column-panel[role=dialog]{width:min(440px,calc(100vw - 16px))}.mach-column-workbench-search{box-sizing:border-box;width:100%;height:30px;padding:0 9px;border:1px solid var(--mach-border-color);border-radius:var(--mach-radius);background:var(--mach-body-bg);color:var(--mach-body-fg);font:inherit;outline:none}.mach-column-workbench-search:focus{border-color:var(--mach-primary);box-shadow:0 0 0 2px var(--mach-primary-weak)}.mach-column-panel-title{font-weight:600;color:var(--mach-header-fg);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mach-column-panel-subtitle{font-size:11px;color:var(--mach-header-fg);margin-top:2px}.mach-column-panel-actions{display:flex;gap:6px;flex-wrap:wrap}.mach-column-panel-btn{flex:1;min-width:60px;padding:4px 8px;border-radius:var(--mach-radius);border:1px solid var(--mach-border-color);background:var(--mach-body-bg);color:inherit;font-family:inherit;font-size:12px;cursor:pointer;white-space:nowrap}.mach-column-panel-btn:hover{border-color:var(--mach-primary);color:var(--mach-primary)}.mach-column-panel-divider{height:1px;background:var(--mach-border-color);margin:4px 0}.mach-column-panel-list{max-height:280px;overflow:auto;display:flex;flex-direction:column;gap:1px;border:1px solid var(--mach-border-color);border-radius:var(--mach-radius);padding:4px}.mach-column-workbench-item{display:grid;grid-template-columns:minmax(120px,1fr) 108px 26px 26px;align-items:center;gap:4px;min-height:32px;padding:2px 3px;border-radius:var(--mach-radius)}.mach-column-workbench-item:hover{background:var(--mach-row-hover-bg)}.mach-column-workbench-label{display:flex;min-width:0;align-items:center;gap:7px;cursor:pointer}.mach-column-workbench-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mach-column-workbench-pin-control,.mach-column-workbench-move{height:26px;border:1px solid var(--mach-border-color);border-radius:var(--mach-radius);background:var(--mach-body-bg);color:inherit;font:inherit}.mach-column-workbench-pin-control{width:108px;border:0}.mach-column-workbench-pin-control .mach-select-trigger{width:100%;height:26px;padding:0 7px;border-radius:var(--mach-radius);font-size:12px;box-shadow:none}.mach-column-workbench-move{padding:0;cursor:pointer}.mach-column-workbench-move:disabled{cursor:not-allowed;opacity:.35}.mach-tag{display:inline-flex;align-items:center;gap:4px;padding:0 8px;height:20px;line-height:18px;border-radius:999px;font-size:var(--mach-font-size-sm);font-weight:500;white-space:nowrap}.mach-tag:before{content:"";width:5px;height:5px;border-radius:999px;background:currentColor}.mach-tag--success{color:var(--mach-success);background:color-mix(in srgb,var(--mach-success) 10%,transparent)}.mach-tag--warning{color:var(--mach-warning);background:color-mix(in srgb,var(--mach-warning) 12%,transparent)}.mach-tag--danger{color:var(--mach-danger);background:color-mix(in srgb,var(--mach-danger) 10%,transparent)}.mach-tag--info{color:var(--mach-info);background:color-mix(in srgb,var(--mach-info) 10%,transparent)}.mach-tag--neutral{color:var(--mach-header-fg);background:color-mix(in srgb,var(--mach-header-fg) 10%,transparent)}.mach-progress{display:flex;align-items:center;gap:6px;width:100%}.mach-progress__track{flex:1;min-width:0;height:6px;border-radius:999px;background:color-mix(in srgb,var(--mach-header-fg) 14%,transparent);overflow:hidden}.mach-progress__bar{height:100%;border-radius:999px;background:var(--mach-primary);transition:width var(--mach-transition)}.mach-progress__label{flex-shrink:0;font-size:var(--mach-font-size-sm);color:var(--mach-header-fg);font-variant-numeric:tabular-nums}.mach-link{color:var(--mach-primary);cursor:pointer}.mach-link:hover{text-decoration:underline}.mach-actions{display:inline-flex;align-items:center;gap:2px}.mach-sr-only{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.mach-action-btn{display:inline-flex;align-items:center;justify-content:center;min-width:24px;height:24px;padding:0 4px;border:none;border-radius:var(--mach-radius-sm);background:transparent;color:var(--mach-header-fg);font-size:var(--mach-font-size-sm);line-height:1;cursor:pointer;white-space:nowrap;transition:color var(--mach-transition),background-color var(--mach-transition),transform var(--mach-transition)}.mach-action-btn:hover{background:var(--mach-row-hover-bg);color:var(--mach-primary)}.mach-action-btn--danger:hover{background:color-mix(in srgb,var(--mach-danger) 10%,transparent);color:var(--mach-danger);transform:scale(1.06)}.mach-action-btn--success:hover{background:color-mix(in srgb,var(--mach-success) 12%,transparent);color:var(--mach-success);transform:scale(1.06)}.mach-action-btn--primary{color:var(--mach-primary)}.mach-action-btn--warning{color:var(--mach-warning)}.mach-action-btn--success,.mach-edit-control--confirm{color:var(--mach-success)}.mach-action-btn--danger{color:var(--mach-danger)}.mach-action-btn:focus-visible,.mach-edit-control:focus-visible,.mach-cell-edit-trigger:focus-visible,.mach-action-drawer__close:focus-visible{outline:2px solid color-mix(in srgb,var(--mach-primary) 65%,transparent);outline-offset:1px}.mach-action-btn:disabled{cursor:not-allowed;opacity:.4}.mach-action-btn--loading svg{animation:mach-spin .8s linear infinite}.mach-dictionary-value--loading{color:var(--mach-header-fg);opacity:.72}.mach-dictionary-value--error{text-decoration:underline dotted;text-underline-offset:3px}.mach-action-btn--icon{padding:0;width:24px}.mach-context-menu-item--danger{color:var(--mach-danger)}.mach-context-menu-item,.mach-action-drawer__item{display:flex;align-items:center;gap:9px}.mach-context-menu-item--primary,.mach-action-drawer__item--primary{color:var(--mach-primary)}.mach-context-menu-item--warning,.mach-action-drawer__item--warning{color:var(--mach-warning)}.mach-context-menu-item--success,.mach-action-drawer__item--success{color:var(--mach-success)}.mach-context-menu-item--danger,.mach-action-drawer__item--danger{color:var(--mach-danger)}.mach-action-drawer-backdrop{position:fixed;inset:0;z-index:calc(var(--mach-z-menu) + 2);background:#0f172a33;backdrop-filter:blur(1px)}.mach-action-drawer{position:absolute;top:0;right:0;display:flex;flex-direction:column;width:min(340px,calc(100vw - 24px));height:100%;background:var(--mach-body-bg);color:var(--mach-body-fg);border-left:1px solid var(--mach-border-color);box-shadow:-16px 0 40px #0f172a24;font-family:var(--mach-font-family);animation:mach-drawer-in .18s ease-out}.mach-action-drawer__header{display:flex;align-items:center;justify-content:space-between;min-height:56px;padding:0 16px 0 20px;border-bottom:1px solid var(--mach-border-color)}.mach-action-drawer__close{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;padding:0;border:0;border-radius:var(--mach-radius);background:transparent;color:var(--mach-header-fg);cursor:pointer}.mach-action-drawer__close:hover{color:var(--mach-primary);background:var(--mach-row-hover-bg)}.mach-action-drawer__body{display:flex;flex-direction:column;gap:4px;padding:12px;overflow:auto}.mach-action-drawer__item{width:100%;min-height:40px;padding:0 12px;border:0;border-radius:var(--mach-radius);background:transparent;font:inherit;text-align:left;cursor:pointer}.mach-action-drawer__item:hover:not(:disabled){background:var(--mach-row-hover-bg)}.mach-action-drawer__item:disabled{opacity:.4;cursor:not-allowed}@keyframes mach-drawer-in{0%{transform:translate(18px);opacity:0}to{transform:translate(0);opacity:1}}@media(max-width:640px){.mach-action-drawer{top:auto;bottom:0;width:100%;height:auto;max-height:min(70vh,520px);border-top:1px solid var(--mach-border-color);border-left:0;border-radius:var(--mach-radius-lg) var(--mach-radius-lg) 0 0;animation-name:mach-drawer-up}}@keyframes mach-drawer-up{0%{transform:translateY(18px);opacity:0}to{transform:translateY(0);opacity:1}}.mach-cell:has(.mach-cell-edit-trigger){padding-right:29px}.mach-cell-edit-trigger{position:absolute;right:5px;top:50%;display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;padding:0;transform:translateY(-50%);border:0;border-radius:var(--mach-radius-sm);background:transparent;color:var(--mach-header-fg);cursor:pointer;opacity:0;transition:opacity var(--mach-transition),color var(--mach-transition),background-color var(--mach-transition)}.mach-cell-edit-trigger svg{width:13px;height:13px}.mach-cell:hover .mach-cell-edit-trigger--hover,.mach-cell:focus-within .mach-cell-edit-trigger--hover,.mach-cell-edit-trigger--always{opacity:.72}.mach-cell-edit-trigger:hover{opacity:1;color:var(--mach-primary);background:color-mix(in srgb,var(--mach-primary) 9%,transparent)}.mach-cell--editing{overflow:visible;z-index:4}.mach-cell-editor-shell,.mach-row-editor-shell{display:flex;align-items:center;width:100%;min-width:0;gap:5px}.mach-cell-editor-shell>.mach-editor-input,.mach-cell-editor-shell>.mach-editor-select-control,.mach-cell-editor-shell>:not(.mach-cell-editor-controls),.mach-row-editor-shell>*{flex:1 1 auto;min-width:0}.mach-cell-editor-controls{display:inline-flex;flex:0 0 auto;align-items:center;gap:2px;padding:2px;border:1px solid var(--mach-border-color);border-radius:var(--mach-radius);background:var(--mach-body-bg);box-shadow:var(--mach-shadow-sm)}.mach-edit-control{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;padding:0;border:0;border-radius:var(--mach-radius-sm);background:transparent;color:var(--mach-header-fg);cursor:pointer;transition:color var(--mach-transition),background-color var(--mach-transition),transform var(--mach-transition)}.mach-edit-control svg{width:14px;height:14px}.mach-edit-control--confirm{color:var(--mach-success)}.mach-edit-control--confirm:hover{background:color-mix(in srgb,var(--mach-success) 12%,transparent);transform:scale(1.06)}.mach-edit-control--cancel{color:var(--mach-danger)}.mach-edit-control--cancel:hover{background:color-mix(in srgb,var(--mach-danger) 10%,transparent);transform:scale(1.06)}.mach-edit-control:disabled{opacity:.35;cursor:wait}.mach-row--editing,.mach-row--editing .mach-cell{background:color-mix(in srgb,var(--mach-primary) 3%,var(--mach-body-bg))}.mach-cell--row-editing .mach-editor-input,.mach-cell--row-editing .mach-editor-select-control .mach-select-trigger{border-color:color-mix(in srgb,var(--mach-primary) 45%,var(--mach-border-color));box-shadow:0 1px 2px #0f172a0a}.mach-cell--row-editing .mach-editor-input:focus,.mach-cell--row-editing .mach-editor-select-control .mach-select-trigger:focus-visible,.mach-cell--row-editing .mach-editor-select-control .mach-select-trigger[aria-expanded=true]{border-color:var(--mach-primary);box-shadow:0 0 0 2px color-mix(in srgb,var(--mach-primary) 12%,transparent)}.mach-tooltip{position:fixed;z-index:var(--mach-z-menu);max-width:320px;padding:6px 10px;border-radius:var(--mach-radius);background:var(--mach-body-fg);color:var(--mach-body-bg);font-size:var(--mach-font-size-sm);line-height:1.5;box-shadow:var(--mach-shadow);pointer-events:none;word-break:break-word}.mach-cell--flash{animation:mach-flash .8s ease-out}@keyframes mach-flash{0%{background-color:color-mix(in srgb,var(--mach-primary) 35%,transparent)}to{background-color:transparent}}.mach-context-menu-separator{height:1px;margin:4px 6px;background:var(--mach-border-color)}.mach-context-menu-item:disabled{opacity:.45;cursor:not-allowed}.mach-pagination{display:flex;align-items:center;justify-content:flex-end;gap:6px;flex-shrink:0;height:40px;padding:0 12px;background:var(--mach-body-bg);border-top:var(--mach-border-width) solid var(--mach-border-color);color:var(--mach-body-fg);font-size:var(--mach-font-size-sm);user-select:none}.mach-pagination-total{color:var(--mach-header-fg);margin-right:8px;font-variant-numeric:tabular-nums}.mach-pagination-page{min-width:72px;text-align:center;color:var(--mach-body-fg);font-variant-numeric:tabular-nums}.mach-pagination-btn{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;border:var(--mach-border-width) solid var(--mach-border-color);border-radius:var(--mach-radius-sm);background:var(--mach-body-bg);color:var(--mach-header-fg);font-size:13px;line-height:1;cursor:pointer;transition:border-color var(--mach-transition),color var(--mach-transition),background-color var(--mach-transition)}.mach-pagination-btn:hover:not(:disabled){border-color:var(--mach-primary);color:var(--mach-primary)}.mach-pagination-btn:disabled{opacity:.35;cursor:not-allowed}.mach-pagination-size-control{height:24px;margin-left:6px;width:92px;font-size:var(--mach-font-size-sm)}.mach-pagination-size-control .mach-select-trigger{width:100%;height:24px;padding:0 6px;border-width:var(--mach-border-width);border-radius:var(--mach-radius-sm);color:var(--mach-header-fg);box-shadow:none}.mach-watermark{position:absolute;inset:0;z-index:6;pointer-events:none;background-repeat:repeat}.mach-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;padding:32px 16px;min-height:160px}.mach-empty__icon{margin-bottom:6px}.mach-empty__title{font-size:var(--mach-font-size);color:var(--mach-body-fg);font-weight:500}.mach-empty__hint{font-size:var(--mach-font-size-sm);color:var(--mach-header-fg)}@media(prefers-reduced-motion:reduce){.mach-spinner,.mach-loading__visual:before{animation-duration:2.4s}}.mach-cell--center{justify-content:center}.mach-cell--right{justify-content:flex-end}.mach-header-cell--center .mach-header-label{text-align:center}.mach-header-cell--right .mach-header-label{text-align:right}@media(prefers-reduced-motion:reduce){.mach-root *,.mach-root *:before,.mach-root *:after{scroll-behavior:auto!important;animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}.mach-action-drawer{animation:none!important}}.mach-root{--mach-row-warning-bg: color-mix(in srgb, var(--mach-warning) 11%, var(--mach-body-bg));--mach-row-danger-bg: color-mix(in srgb, var(--mach-danger) 9%, var(--mach-body-bg));--mach-row-success-bg: color-mix(in srgb, var(--mach-success) 10%, var(--mach-body-bg));--mach-row-info-bg: color-mix(in srgb, var(--mach-info) 10%, var(--mach-body-bg))}.mach-row--styled[data-row-tone=warning]{--mach-row-rule-bg: var(--mach-row-warning-bg)}.mach-row--styled[data-row-tone=danger]{--mach-row-rule-bg: var(--mach-row-danger-bg)}.mach-row--styled[data-row-tone=success]{--mach-row-rule-bg: var(--mach-row-success-bg)}.mach-row--styled[data-row-tone=info]{--mach-row-rule-bg: var(--mach-row-info-bg)}.mach-root :is(.mach-row,.mach-pinned-row).mach-row--styled,.mach-root :is(.mach-row,.mach-pinned-row).mach-row--styled .mach-cell{background-color:var(--mach-row-rule-bg, var(--mach-body-bg));color:var(--mach-row-rule-fg, var(--mach-body-fg))}.mach-root .mach-row--styled.mach-row--hover,.mach-root .mach-row--styled.mach-row--hover .mach-cell{background-color:color-mix(in srgb,var(--mach-primary) 4%,var(--mach-row-rule-bg, var(--mach-body-bg)))}.mach-root .mach-row--styled.mach-row--selected,.mach-root .mach-row--styled.mach-row--selected .mach-cell{background-color:color-mix(in srgb,var(--mach-primary) 12%,var(--mach-row-rule-bg, var(--mach-body-bg)))}
|
|
1
|
+
.mach-root{--mach-font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Arial, sans-serif;--mach-font-size: 13px;--mach-font-size-sm: 12px;--mach-header-font-weight: 650;--mach-cell-padding: 9px;--mach-row-h: 36px;--mach-header-h: 40px;--mach-primary: #2563eb;--mach-primary-weak: #dbeafe;--mach-success: #16a34a;--mach-warning: #d97706;--mach-danger: #dc2626;--mach-info: #0284c7;--mach-border-color: #e6eaf0;--mach-row-border-color: #eef1f6;--mach-cell-border-color: transparent;--mach-border-width: 1px;--mach-header-border-width: 1px;--mach-header-accent-color: #d9e1eb;--mach-header-bg: #f4f7fb;--mach-header-group-bg: #edf2f8;--mach-header-fg: #344054;--mach-body-bg: #ffffff;--mach-body-fg: #26303f;--mach-row-hover-bg: #f6f8fa;--mach-row-selected-bg: #eff6ff;--mach-zebra-bg: #fafbfd;--mach-cell-focus-color: #2563eb;--mach-focus-width: 1.5px;--mach-scrollbar-thumb: #c9d2dd;--mach-radius-sm: 4px;--mach-radius: 6px;--mach-radius-lg: 8px;--mach-shadow-sm: 0 1px 4px rgba(15, 23, 42, .08);--mach-shadow: 0 6px 20px rgba(15, 23, 42, .12);--mach-transition: .15s ease;--mach-z-overlay: 10;--mach-z-loading: 15;--mach-z-popup: 1000;--mach-z-menu: 1001;position:relative;display:flex;flex-direction:column;width:100%;height:100%;min-height:120px;overflow:hidden;font-family:var(--mach-font-family);font-size:var(--mach-font-size);color:var(--mach-body-fg);background:var(--mach-body-bg);outline:none;box-sizing:border-box;border:1px solid var(--mach-border-color);color-scheme:light;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-variant-numeric:tabular-nums;contain:layout style}.mach-root.mach-dom-layout--auto-height{height:auto;min-height:0}.mach-root.mach-dom-layout--auto-height .mach-body{flex:none}.mach-root.mach-dom-layout--auto-height .mach-body-viewport--scroll{overflow-y:hidden}.mach-toolbar{display:flex;align-items:center;justify-content:space-between;gap:10px;min-height:44px;padding:6px 8px;font:13px/1.4 var(--mach-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif);color:var(--mach-body-fg, #26303f);background:var(--mach-body-bg, #fff);border:1px solid var(--mach-border-color, #e6eaf0);border-bottom:0;border-radius:var(--mach-radius-lg, 8px) var(--mach-radius-lg, 8px) 0 0}.mach-toolbar__main,.mach-toolbar__aside{display:flex;align-items:center;gap:6px;min-width:0}.mach-toolbar__search{display:flex;align-items:center;gap:6px;width:min(240px,32vw);height:32px;padding:0 9px;color:#64748b;background:var(--mach-header-bg, #fafbfd);border:1px solid var(--mach-border-color, #e6eaf0);border-radius:6px;transition:border-color var(--mach-transition, .15s ease),box-shadow var(--mach-transition, .15s ease)}.mach-toolbar__search:focus-within{border-color:var(--mach-primary, #2563eb);box-shadow:0 0 0 2px color-mix(in srgb,var(--mach-primary, #2563eb) 12%,transparent)}.mach-toolbar__search input{min-width:0;width:100%;color:inherit;background:transparent;border:0;outline:0}.mach-toolbar__button,.mach-toolbar__select-host,.mach-toolbar__selection{height:32px;padding:0 10px;color:inherit;background:var(--mach-body-bg, #fff);border:1px solid var(--mach-border-color, #e6eaf0);border-radius:6px;cursor:pointer;transition:color var(--mach-transition, .15s ease),border-color var(--mach-transition, .15s ease),background var(--mach-transition, .15s ease)}.mach-toolbar__button{min-width:32px;padding:0 8px;font-size:16px}.mach-toolbar__button:hover:not(:disabled),.mach-toolbar__select-host:hover{color:var(--mach-primary, #2563eb);border-color:var(--mach-primary, #2563eb)}.mach-toolbar__button:disabled{cursor:not-allowed;opacity:.45}.mach-toolbar__selection{color:var(--mach-primary, #2563eb);background:var(--mach-primary-weak, #dbeafe);border-color:transparent;font-size:12px}.mach-toolbar__select-host{width:82px;padding:0}.mach-toolbar__select-control,.mach-toolbar__select-control .mach-select-trigger{width:100%;height:100%}.mach-toolbar__select-control .mach-select-trigger{border:0;border-radius:5px;background:transparent;box-shadow:none}@media(max-width:640px){.mach-toolbar{align-items:stretch;flex-direction:column}.mach-toolbar__main,.mach-toolbar__aside{flex-wrap:wrap}.mach-toolbar__search{flex:1;width:auto}}.mach-size--compact{--mach-font-size: 12px;--mach-cell-padding: 6px}.mach-size--normal{--mach-font-size: 13px;--mach-cell-padding: 9px}.mach-size--large{--mach-font-size: 14px;--mach-cell-padding: 12px}.mach-root.mach-cell-borders{--mach-cell-border-color: var(--mach-border-color)}.mach-root.mach-theme-dark,.mach-root.mach-theme-dark.mach-size--compact,.mach-root.mach-theme-dark.mach-size--normal,.mach-root.mach-theme-dark.mach-size--large{--mach-border-color: #26324a;--mach-row-border-color: #1c2740;--mach-header-accent-color: #33415e;--mach-header-bg: #101a2e;--mach-header-group-bg: #16213a;--mach-header-fg: #c3cee0;--mach-body-bg: #0d1526;--mach-body-fg: #dbe4f0;--mach-row-hover-bg: #142138;--mach-row-selected-bg: #14304f;--mach-zebra-bg: #0f1a2e;--mach-cell-focus-color: #60a5fa;--mach-primary: #60a5fa;--mach-primary-weak: #1e3a5f;--mach-scrollbar-thumb: #33415e;--mach-success: #4ade80;--mach-warning: #fbbf24;--mach-danger: #f87171;--mach-info: #38bdf8;--mach-shadow-sm: 0 1px 4px rgba(0, 0, 0, .4);--mach-shadow: 0 6px 20px rgba(0, 0, 0, .5);color-scheme:dark}.mach-root *,.mach-root *:before,.mach-root *:after{box-sizing:border-box}.mach-portal,.mach-portal *,.mach-portal *:before,.mach-portal *:after{box-sizing:border-box}.mach-root:focus-visible{outline:2px solid var(--mach-primary);outline-offset:-2px}.mach-header{display:flex;flex-shrink:0;width:100%;height:var(--mach-header-h);background:var(--mach-header-bg);border-bottom:var(--mach-header-border-width) solid var(--mach-header-accent-color);box-shadow:0 1px 2px color-mix(in srgb,var(--mach-header-fg) 8%,transparent);overflow:hidden;position:relative;z-index:3;user-select:none}.mach-body{display:flex;flex:1;min-height:0;width:100%;position:relative;overflow:hidden}.mach-pane{position:relative;overflow:hidden;flex-shrink:0}.mach-pane--center{flex:1 1 auto;min-width:0}.mach-pane--hidden{display:none}.mach-header-viewport{width:100%;height:100%;overflow:hidden}.mach-header-rows{position:relative;height:100%;width:100%}.mach-header-row{position:absolute;left:0}.mach-header-row .mach-header-cell{position:absolute;top:0}.mach-header-cell--group{justify-content:center;border-bottom:var(--mach-border-width) solid var(--mach-border-color);font-weight:var(--mach-header-font-weight);background:var(--mach-header-group-bg)}.mach-header-label--custom{display:inline-flex;align-items:center;min-width:0;overflow:hidden}.mach-header-cell{display:flex;align-items:center;gap:4px;padding:0 var(--mach-cell-padding);border-right:var(--mach-border-width) solid transparent;color:var(--mach-header-fg);font-weight:var(--mach-header-font-weight);font-size:var(--mach-font-size);letter-spacing:.15px;cursor:default;overflow:hidden;white-space:nowrap;background:var(--mach-header-bg);transition:color var(--mach-transition),background-color var(--mach-transition)}.mach-header-cell--leaf:hover{background:color-mix(in srgb,var(--mach-primary) 4%,var(--mach-header-bg))}.mach-header-cell.mach-header-cell--sorted{color:var(--mach-primary);background:color-mix(in srgb,var(--mach-primary) 5%,var(--mach-header-bg))}.mach-root.mach-cell-borders .mach-header-cell{border-right-color:var(--mach-border-color)}.mach-header-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;cursor:pointer}.mach-header-cell--selection{justify-content:center;gap:0;padding:0}.mach-header-cell--selection .mach-header-label:empty{display:none}.mach-sort-indicator{display:inline-flex;align-items:center;gap:3px;color:var(--mach-primary);flex-shrink:0}.mach-sort-indicator svg{width:10px;height:10px}.mach-sort-indicator:empty{display:none}.mach-sort-badge{font-size:9px;line-height:1;padding:1.5px 4px;border-radius:999px;background:var(--mach-primary-weak);color:var(--mach-primary);font-weight:600}.mach-filter-btn{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;padding:0;border:none;border-radius:var(--mach-radius-sm);background:transparent;color:inherit;opacity:.36;cursor:pointer;flex-shrink:0;transition:opacity var(--mach-transition),color var(--mach-transition),background-color var(--mach-transition)}.mach-filter-btn svg{width:12px;height:12px;pointer-events:none}.mach-header-cell:hover .mach-filter-btn,.mach-header-cell:hover .mach-menu-btn{opacity:.62}.mach-filter-btn:hover{opacity:1;background:var(--mach-row-hover-bg)}.mach-filter-btn--active{opacity:1;color:var(--mach-primary)}.mach-filter-tag{display:inline-flex;align-items:center;max-width:96px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:0 6px;height:16px;line-height:16px;border-radius:999px;background:var(--mach-primary-weak);color:var(--mach-primary);font-size:10px;font-weight:500;flex-shrink:0}.mach-menu-btn{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;padding:0;border:none;border-radius:var(--mach-radius-sm);background:transparent;color:inherit;opacity:.36;cursor:pointer;flex-shrink:0;font-size:12px;line-height:1;transition:opacity var(--mach-transition),color var(--mach-transition),background-color var(--mach-transition)}.mach-menu-btn:hover{opacity:1;background:var(--mach-row-hover-bg)}.mach-menu-btn svg{width:12px;height:12px;pointer-events:none}.mach-header-resize{position:absolute;top:0;right:0;width:8px;height:100%;cursor:col-resize;z-index:2;touch-action:none}.mach-header-resize:hover:after,.mach-header-resize--active:after{content:"";position:absolute;inset:0 3px;background:var(--mach-primary);opacity:.45;border-radius:1px}.mach-column-resize-guide{position:absolute;bottom:0;width:2px;pointer-events:none;background:var(--mach-primary);box-shadow:0 0 0 1px var(--mach-primary-weak);z-index:8}.mach-column-resize-label{position:absolute;top:6px;min-width:52px;padding:3px 7px;border-radius:var(--mach-radius-sm);color:#fff;background:var(--mach-primary);font:600 11px/1.5 var(--mach-font-family);text-align:center;white-space:nowrap;transform:translate(-50%);box-shadow:var(--mach-shadow-sm)}.mach-header-cell--dragging{opacity:.22}.mach-column-drag-ghost{position:fixed;top:0;left:0;z-index:calc(var(--mach-z-menu) + 1);display:flex;align-items:center;height:var(--mach-header-h);max-width:calc(100vw - 16px);padding:0 var(--mach-cell-padding);overflow:hidden;color:var(--mach-body-fg);font:var(--mach-header-font-weight) var(--mach-font-size)/1.3 var(--mach-font-family);text-overflow:ellipsis;white-space:nowrap;pointer-events:none;background:var(--mach-body-bg);border:1px solid var(--mach-primary);border-radius:var(--mach-radius);box-shadow:var(--mach-shadow);opacity:.96;will-change:transform}.mach-drop-indicator{position:absolute;top:3px;left:0;width:2px;height:calc(100% - 6px);border-radius:2px;background:var(--mach-primary);z-index:4;pointer-events:none;will-change:transform}.mach-root--dragging{cursor:grabbing}.mach-root--dragging .mach-header-cell,.mach-root--resizing .mach-header-cell{cursor:default}.mach-root--resizing{cursor:col-resize}.mach-body-viewport{position:relative;width:100%;height:100%;overflow:hidden}.mach-body-viewport--scroll{overflow:auto;overscroll-behavior:contain;overflow-anchor:none}.mach-body-viewport--scroll{scrollbar-width:thin;scrollbar-color:var(--mach-scrollbar-thumb) transparent}.mach-body-viewport--scroll::-webkit-scrollbar{width:10px;height:10px}.mach-body-viewport--scroll::-webkit-scrollbar-track{background:transparent}.mach-body-viewport--scroll::-webkit-scrollbar-thumb{background:var(--mach-scrollbar-thumb);border-radius:999px;border:3px solid transparent;background-clip:padding-box;transition:background-color var(--mach-transition)}.mach-body-viewport--scroll::-webkit-scrollbar-thumb:hover{background:color-mix(in srgb,var(--mach-scrollbar-thumb) 60%,var(--mach-primary));background-clip:padding-box}.mach-body-viewport--scroll::-webkit-scrollbar-thumb:active{background:var(--mach-primary);background-clip:padding-box}.mach-body-viewport--scroll::-webkit-scrollbar-corner{background:transparent}.mach-row-container{position:relative;width:100%}.mach-row{position:absolute;top:0;left:0;display:flex;width:100%;background:var(--mach-body-bg);border-bottom:var(--mach-border-width) solid var(--mach-row-border-color);contain:layout style}.mach-row,.mach-row .mach-cell{transition:background-color var(--mach-transition)}.mach-root.mach-striped .mach-row--odd,.mach-root.mach-striped .mach-row--odd .mach-cell{background:var(--mach-zebra-bg)}.mach-cell{position:absolute;top:0;display:flex;align-items:center;height:100%;padding:0 var(--mach-cell-padding);border-right:1px solid var(--mach-cell-border-color);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;cursor:default;line-height:calc(var(--mach-row-h) - 2px)}.mach-cell--loading{pointer-events:none}.mach-cell-loading-bar{display:block;height:8px;max-width:132px;border-radius:999px;background:linear-gradient(90deg,var(--mach-row-hover-bg),var(--mach-border-color),var(--mach-row-hover-bg));background-size:200% 100%;animation:mach-cell-loading 1.25s ease-in-out infinite}@keyframes mach-cell-loading{0%{background-position:200% 0}to{background-position:-200% 0}}@media(prefers-reduced-motion:reduce){.mach-cell-loading-bar{animation:none}}.mach-cell--num{justify-content:flex-end}.mach-cell--selection{justify-content:center;padding:0}.mach-cell--editing{padding:0 3px}.mach-cell--focus{box-shadow:inset 0 0 0 var(--mach-focus-width) var(--mach-cell-focus-color);border-radius:var(--mach-radius-sm);z-index:1}.mach-cell--selection.mach-cell--focus{box-shadow:none;border-radius:0;z-index:auto}.mach-row--hover,.mach-row--hover .mach-cell{background:var(--mach-row-hover-bg)}.mach-row--selected,.mach-row--selected .mach-cell{background:var(--mach-row-selected-bg)}.mach-row--selected.mach-row--hover,.mach-row--selected.mach-row--hover .mach-cell{background:var(--mach-row-selected-bg);filter:brightness(.985)}input.mach-row-checkbox,input.mach-select-all{width:13px;height:13px;margin:0;accent-color:var(--mach-primary);cursor:pointer;flex-shrink:0}.mach-detail-row{background:var(--mach-zebra-bg);z-index:0}.mach-detail{height:100%;overflow:auto;padding:10px 12px}.mach-cell--detail-toggle{justify-content:center;padding:0;cursor:pointer}.mach-detail-toggle{display:inline-flex;align-items:center;justify-content:center;width:100%;font-size:10px;color:var(--mach-header-fg);transition:transform .15s ease}.mach-detail-toggle--open{transform:rotate(90deg)}.mach-detail-toggle--loading{animation:mach-tree-spin .8s linear infinite;color:var(--mach-primary)}.mach-detail-toggle--error{color:#dc2626}@keyframes mach-tree-spin{to{transform:rotate(360deg)}}@media(prefers-reduced-motion:reduce){.mach-detail-toggle--loading{animation:none}}.mach-cell--group{cursor:pointer;background:var(--mach-header-bg)}.mach-row .mach-cell--group,.mach-row:has(.mach-cell--group){background:var(--mach-header-bg)}.mach-group-label{display:inline-flex;align-items:center;gap:5px;min-width:0;overflow:hidden}.mach-group-text{font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mach-group-count{color:var(--mach-header-fg);font-size:10px;flex-shrink:0;opacity:.8}.mach-tree-cell{display:inline-flex;align-items:center;gap:4px;min-width:0;width:100%}.mach-tree-indent{flex-shrink:0}.mach-tree-toggle{display:inline-flex;align-items:center;justify-content:center;flex:0 0 20px;width:20px;height:22px;padding:0;border:0;border-radius:var(--mach-radius-sm);color:var(--mach-header-fg);background:transparent;cursor:pointer}.mach-tree-toggle:hover,.mach-tree-toggle:focus-visible{color:var(--mach-primary);background:var(--mach-primary-weak)}.mach-tree-toggle:focus-visible{outline:1px solid var(--mach-primary);outline-offset:-1px}.mach-tree-toggle>.mach-detail-toggle{width:10px;line-height:1;color:inherit;pointer-events:none}.mach-tree-toggle>.mach-detail-toggle--loading{color:var(--mach-primary)}.mach-tree-toggle>.mach-detail-toggle--error{color:var(--mach-danger)}.mach-tree-toggle-spacer{flex:0 0 20px;width:20px}.mach-tree-text{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mach-cell--drag{justify-content:center;padding:0;cursor:grab}.mach-row-drag-handle{display:grid;place-items:center;width:26px;height:26px;padding:0;border:1px solid transparent;border-radius:var(--mach-radius-sm);color:var(--mach-header-fg);background:transparent;opacity:.55;cursor:grab;user-select:none;touch-action:none;transition:color var(--mach-transition),background var(--mach-transition),opacity var(--mach-transition)}.mach-row-drag-handle:before{content:"";width:10px;height:14px;background:radial-gradient(circle,currentColor 1.3px,transparent 1.5px) 0 0 / 5px 5px}.mach-row-drag-handle:hover:not(:disabled),.mach-row-drag-handle:focus-visible{opacity:1;color:var(--mach-primary);background:var(--mach-primary-weak);border-color:color-mix(in srgb,var(--mach-primary) 28%,transparent);outline:none}.mach-row-drag-handle:disabled{opacity:.2;cursor:not-allowed}.mach-row-drop-indicator{position:absolute;top:0;left:0;width:100%;height:2px;background:var(--mach-primary);box-shadow:0 0 0 1px color-mix(in srgb,var(--mach-body-bg) 65%,transparent);z-index:5;pointer-events:none;will-change:transform}.mach-row-drop-indicator:before{content:"";position:absolute;left:1px;top:-2px;width:6px;height:6px;border-radius:50%;background:var(--mach-primary)}.mach-pane--center .mach-row-drop-indicator:before,.mach-pane--right .mach-row-drop-indicator:before{display:none}.mach-row-drag-preview{position:absolute;top:0;left:0;z-index:var(--mach-z-overlay);max-width:min(216px,calc(100% - 16px));padding:9px 14px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border:1px solid color-mix(in srgb,var(--mach-primary) 35%,var(--mach-border-color));border-radius:var(--mach-radius);background:var(--mach-body-bg);color:var(--mach-body-fg);box-shadow:var(--mach-shadow);font-weight:600;pointer-events:none}.mach-root--row-dragging,.mach-root--row-dragging .mach-cell,.mach-root--row-dragging .mach-row-drag-handle{cursor:grabbing;user-select:none}.mach-root .mach-row--drag-source{opacity:.45}.mach-cell--index{color:var(--mach-header-fg);font-size:calc(var(--mach-font-size) - 1px)}.mach-editor-input.mach-editor-invalid,.mach-editor-invalid .mach-editor-input,.mach-editor-invalid .mach-select-trigger,.mach-editor-invalid input,.mach-editor-invalid select:not([hidden]){border-color:#ef4444!important;box-shadow:0 0 0 1px #ef444459}.mach-editor-validating{cursor:progress;opacity:.72}.mach-footer{display:flex;flex-shrink:0;width:100%;overflow:hidden;background:var(--mach-header-bg);border-top:1px solid var(--mach-border-color);font-weight:600;color:var(--mach-header-fg);position:relative;z-index:3}.mach-footer-row{position:relative;overflow:hidden;flex-shrink:0}.mach-footer-row--center{flex:1 1 auto;min-width:0}.mach-footer-cell{position:absolute;top:0;display:flex;align-items:center;padding:0 var(--mach-cell-padding);border-right:1px solid transparent;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;height:100%;font-variant-numeric:tabular-nums}.mach-root.mach-cell-borders .mach-footer-cell{border-right-color:var(--mach-border-color)}.mach-cell--range{background:color-mix(in srgb,var(--mach-primary) 7%,transparent)!important}.mach-cell--range:after{content:"";position:absolute;inset:0;z-index:2;border:0 solid var(--mach-primary);pointer-events:none}.mach-cell--range.mach-cell--range-top:after{border-top-width:1.5px}.mach-cell--range.mach-cell--range-bottom:after{border-bottom-width:1.5px}.mach-cell--range.mach-cell--range-left:after{border-left-width:1.5px}.mach-cell--range.mach-cell--range-right:after{border-right-width:1.5px}.mach-cell--range.mach-cell--focus{box-shadow:inset 0 0 0 var(--mach-focus-width) var(--mach-cell-focus-color)}.mach-cell--range.mach-cell--focus:after{display:none}.mach-context-menu{position:fixed;z-index:var(--mach-z-menu);display:flex;flex-direction:column;min-width:140px;padding:5px;background:var(--mach-body-bg);color:var(--mach-body-fg);border:1px solid var(--mach-border-color);border-radius:var(--mach-radius-lg);box-shadow:var(--mach-shadow);font-family:var(--mach-font-family);font-size:var(--mach-font-size)}.mach-context-menu-item{text-align:left;padding:6px 10px;border:none;border-radius:var(--mach-radius);background:transparent;color:inherit;font:inherit;cursor:pointer;white-space:nowrap}.mach-context-menu-item:hover{background:var(--mach-row-hover-bg);color:var(--mach-primary)}.mach-fill-handle{position:absolute;width:8px;height:8px;border-radius:2px;background:var(--mach-primary);border:1.5px solid var(--mach-body-bg);cursor:crosshair;z-index:6;box-shadow:0 0 0 1px #2563eb59}.mach-root--filling,.mach-root--filling *{user-select:none!important;cursor:crosshair!important}.mach-infinite-loading{position:absolute;left:50%;bottom:14px;transform:translate(-50%);display:flex;align-items:center;gap:8px;padding:5px 14px;border-radius:999px;background:var(--mach-body-bg);border:1px solid var(--mach-border-color);box-shadow:var(--mach-shadow-sm);color:var(--mach-header-fg);font-size:12px;z-index:var(--mach-z-loading)}.mach-infinite-loading .mach-spinner{width:14px;height:14px;border-width:2px}.mach-statusbar{display:flex;align-items:center;gap:18px;flex-shrink:0;height:28px;padding:0 12px;background:var(--mach-header-bg);border-top:1px solid var(--mach-border-color);color:var(--mach-header-fg);font-size:11px;overflow:hidden;white-space:nowrap;font-variant-numeric:tabular-nums}.mach-statusbar-item--rangeAggregate{margin-left:auto}.mach-pinned-rows{display:flex;width:100%;overflow:hidden;background:var(--mach-header-bg);flex-shrink:0;border-bottom:1px solid var(--mach-border-color)}.mach-pinned-rows--bottom{border-bottom:none;border-top:1px solid var(--mach-border-color)}.mach-pinned-viewport{flex:1 1 auto;min-width:0;overflow:hidden}.mach-pinned-seg{position:relative;overflow:hidden;flex-shrink:0}.mach-pinned-seg--center{position:relative}.mach-pinned-row{position:relative;width:100%;border-bottom:1px solid var(--mach-row-border-color)}.mach-pinned-row .mach-cell{position:absolute;top:0;background:var(--mach-header-bg);font-weight:600;color:var(--mach-header-fg)}.mach-pinned-row:last-child{border-bottom:none}.mach-cell--wrap{white-space:normal;word-break:break-word;line-height:1.45;align-items:flex-start;padding-top:5px;padding-bottom:5px}.mach-editor-input,.mach-editor-select-control .mach-select-trigger{width:100%;height:calc(var(--mach-row-h) - 8px);padding:0 6px;border:1px solid var(--mach-primary);border-radius:var(--mach-radius-sm);font-family:inherit;font-size:var(--mach-font-size);color:inherit;background:var(--mach-body-bg);outline:none}.mach-select-control{position:relative;display:inline-flex;min-width:0;font-family:var(--mach-font-family, inherit);font-size:var(--mach-font-size, 14px)}.mach-select-native[hidden]{display:none!important}.mach-select-trigger{display:flex;align-items:center;justify-content:space-between;gap:10px;min-width:0;height:34px;padding:0 10px;border:1px solid var(--mach-border-color, #e6eaf0);border-radius:var(--mach-radius, 6px);outline:none;color:var(--mach-body-fg, #1f2937);background:var(--mach-body-bg, #fff);font:inherit;line-height:1;text-align:left;cursor:pointer;transition:border-color var(--mach-transition, .15s ease),box-shadow var(--mach-transition, .15s ease),background-color var(--mach-transition, .15s ease)}.mach-select-trigger:hover{border-color:color-mix(in srgb,var(--mach-primary, #2563eb) 44%,var(--mach-border-color, #e6eaf0));background:color-mix(in srgb,var(--mach-primary, #2563eb) 3%,var(--mach-body-bg, #fff))}.mach-select-trigger:focus-visible,.mach-select-trigger[aria-expanded=true]{border-color:var(--mach-primary, #2563eb);box-shadow:0 0 0 3px color-mix(in srgb,var(--mach-primary, #2563eb) 12%,transparent)}.mach-select-value{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mach-select-caret{width:8px;height:8px;flex:0 0 auto;border-right:1.5px solid currentColor;border-bottom:1.5px solid currentColor;transform:translateY(-2px) rotate(45deg);transition:transform var(--mach-transition, .15s ease)}.mach-select-trigger[aria-expanded=true] .mach-select-caret{transform:translateY(2px) rotate(225deg)}.mach-select-listbox{position:fixed;z-index:var(--mach-z-menu, 1200);display:none;flex-direction:column;gap:2px;min-width:112px;max-width:min(320px,calc(100vw - 16px));max-height:min(244px,calc(100vh - 16px));padding:5px;overflow:auto;overscroll-behavior:contain;border:1px solid color-mix(in srgb,var(--mach-border-color, #e6eaf0) 88%,var(--mach-primary, #2563eb));border-radius:calc(var(--mach-radius-lg, 8px) + 1px);color:var(--mach-body-fg, #1f2937);background:var(--mach-body-bg, #fff);box-shadow:0 14px 36px color-mix(in srgb,var(--mach-body-fg, #1f2937) 18%,transparent),var(--mach-shadow-sm, 0 1px 3px rgba(15, 23, 42, .12));font-family:var(--mach-font-family, inherit);font-size:var(--mach-font-size, 14px);isolation:isolate}.mach-select-listbox--open{display:flex;animation:mach-select-listbox-in .12s ease-out}.mach-select-option{position:relative;display:flex;align-items:center;flex:0 0 auto;width:100%;min-height:32px;padding:0 30px 0 10px;border:0;border-radius:var(--mach-radius, 6px);outline:none;color:inherit;background:transparent;font:inherit;text-align:left;cursor:pointer;transition:color var(--mach-transition, .15s ease),background-color var(--mach-transition, .15s ease)}.mach-select-option:hover,.mach-select-option:focus-visible,.mach-select-option--active{color:var(--mach-primary, #2563eb);background:color-mix(in srgb,var(--mach-primary, #2563eb) 9%,var(--mach-body-bg, #fff))}.mach-select-option[aria-selected=true]{color:var(--mach-primary, #2563eb);background:color-mix(in srgb,var(--mach-primary, #2563eb) 13%,var(--mach-body-bg, #fff));font-weight:600}.mach-select-option[aria-selected=true]:after{content:"\2713";position:absolute;right:10px;font-size:12px;font-weight:700}.mach-select-option:disabled{opacity:.42;cursor:not-allowed}@keyframes mach-select-listbox-in{0%{transform:translateY(-3px) scale(.99)}to{transform:translateY(0) scale(1)}}.mach-select-listbox--above{transform-origin:bottom}.mach-filter-select-control{width:100%}.mach-filter-select-trigger{width:100%;background:color-mix(in srgb,var(--mach-header-bg) 62%,var(--mach-body-bg))}.mach-filter-listbox{width:auto}.mach-overlay{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:var(--mach-body-bg);z-index:var(--mach-z-overlay)}.mach-overlay-text{color:var(--mach-header-fg);font-size:var(--mach-font-size)}.mach-overlay-content{max-width:min(100%,320px)}.mach-loading{display:grid;justify-items:center;gap:14px;min-width:172px;padding:20px 24px}.mach-loading__visual{position:relative;display:grid;gap:8px;width:132px;padding:14px 16px;overflow:hidden;background:color-mix(in srgb,var(--mach-header-bg) 82%,var(--mach-body-bg));border:1px solid var(--mach-border-color);border-radius:var(--mach-radius-lg);box-shadow:var(--mach-shadow-sm)}.mach-loading__visual:before{content:"";position:absolute;inset:0;transform:translate(-100%);background:linear-gradient(100deg,transparent 20%,color-mix(in srgb,var(--mach-primary) 11%,transparent) 50%,transparent 80%);animation:mach-loading-sweep 1.35s ease-in-out infinite}.mach-loading__row{height:7px;border-radius:999px;background:color-mix(in srgb,var(--mach-primary) 13%,var(--mach-border-color))}.mach-loading__row:nth-child(2){width:82%}.mach-loading__row:nth-child(3){width:92%}.mach-loading__row:nth-child(4){width:66%}.mach-loading__status{display:inline-flex;align-items:center;gap:8px;color:var(--mach-header-fg);font-size:var(--mach-font-size-sm)}.mach-loading__spinner{width:14px;height:14px}.mach-loading__label{line-height:1}.mach-spinner{width:22px;height:22px;border:2px solid var(--mach-border-color);border-top-color:var(--mach-primary);border-radius:50%;animation:mach-spin .8s linear infinite}@keyframes mach-spin{to{transform:rotate(360deg)}}@keyframes mach-loading-sweep{to{transform:translate(100%)}}.mach-filter-panel{position:fixed;z-index:var(--mach-z-popup);display:flex;flex-direction:column;gap:10px;width:224px;max-width:calc(100vw - 16px);padding:12px;background:var(--mach-body-bg);color:var(--mach-body-fg);border:1px solid color-mix(in srgb,var(--mach-border-color) 88%,var(--mach-primary));border-radius:calc(var(--mach-radius-lg) + 2px);box-shadow:0 14px 36px color-mix(in srgb,var(--mach-body-fg) 16%,transparent),var(--mach-shadow-sm);font-family:var(--mach-font-family);font-size:var(--mach-font-size);animation:mach-filter-panel-in .14s ease-out}.mach-filter-body{display:flex;flex-direction:column;gap:8px}.mach-filter-input{width:100%;height:34px;padding:0 10px;border:1px solid var(--mach-border-color);border-radius:var(--mach-radius);font-family:inherit;font-size:var(--mach-font-size);color:inherit;background:var(--mach-body-bg);outline:none;transition:border-color var(--mach-transition),box-shadow var(--mach-transition)}.mach-filter-input:focus{border-color:var(--mach-primary);box-shadow:0 0 0 3px color-mix(in srgb,var(--mach-primary) 12%,transparent)}@keyframes mach-filter-panel-in{0%{opacity:0;transform:translateY(-3px) scale(.99)}}.mach-filter-set-list{max-height:220px;overflow:auto;display:flex;flex-direction:column;gap:1px;border:1px solid var(--mach-border-color);border-radius:var(--mach-radius);padding:4px}.mach-filter-set-item{display:flex;align-items:center;gap:6px;padding:3px 5px;border-radius:var(--mach-radius-sm);cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mach-filter-set-item:hover{background:var(--mach-row-hover-bg)}.mach-filter-set-item input{accent-color:var(--mach-primary);margin:0;width:13px;height:13px}.mach-filter-footer{display:flex;justify-content:flex-end;gap:6px}.mach-filter-footer button{padding:4px 12px;border-radius:var(--mach-radius);border:1px solid var(--mach-border-color);background:var(--mach-body-bg);color:inherit;font-family:inherit;font-size:var(--mach-font-size);cursor:pointer}.mach-filter-footer button:hover{border-color:var(--mach-primary);color:var(--mach-primary)}.mach-filter-btn-apply{background:var(--mach-primary)!important;border-color:var(--mach-primary)!important;color:#fff!important}.mach-filter-btn-apply:hover{opacity:.9;color:#fff!important}.mach-column-panel{min-width:220px;max-height:70vh;overflow:auto}.mach-column-panel[role=dialog]{width:min(440px,calc(100vw - 16px))}.mach-column-workbench-search{box-sizing:border-box;width:100%;height:30px;padding:0 9px;border:1px solid var(--mach-border-color);border-radius:var(--mach-radius);background:var(--mach-body-bg);color:var(--mach-body-fg);font:inherit;outline:none}.mach-column-workbench-search:focus{border-color:var(--mach-primary);box-shadow:0 0 0 2px var(--mach-primary-weak)}.mach-column-panel-title{font-weight:600;color:var(--mach-header-fg);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mach-column-panel-subtitle{font-size:11px;color:var(--mach-header-fg);margin-top:2px}.mach-column-panel-actions{display:flex;gap:6px;flex-wrap:wrap}.mach-column-panel-btn{flex:1;min-width:60px;padding:4px 8px;border-radius:var(--mach-radius);border:1px solid var(--mach-border-color);background:var(--mach-body-bg);color:inherit;font-family:inherit;font-size:12px;cursor:pointer;white-space:nowrap}.mach-column-panel-btn:hover{border-color:var(--mach-primary);color:var(--mach-primary)}.mach-column-panel-divider{height:1px;background:var(--mach-border-color);margin:4px 0}.mach-column-panel-list{max-height:280px;overflow:auto;display:flex;flex-direction:column;gap:1px;border:1px solid var(--mach-border-color);border-radius:var(--mach-radius);padding:4px}.mach-column-workbench-item{display:grid;grid-template-columns:minmax(120px,1fr) 108px 26px 26px;align-items:center;gap:4px;min-height:32px;padding:2px 3px;border-radius:var(--mach-radius)}.mach-column-workbench-item:hover{background:var(--mach-row-hover-bg)}.mach-column-workbench-label{display:flex;min-width:0;align-items:center;gap:7px;cursor:pointer}.mach-column-workbench-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mach-column-workbench-pin-control,.mach-column-workbench-move{height:26px;border:1px solid var(--mach-border-color);border-radius:var(--mach-radius);background:var(--mach-body-bg);color:inherit;font:inherit}.mach-column-workbench-pin-control{width:108px;border:0}.mach-column-workbench-pin-control .mach-select-trigger{width:100%;height:26px;padding:0 7px;border-radius:var(--mach-radius);font-size:12px;box-shadow:none}.mach-column-workbench-move{padding:0;cursor:pointer}.mach-column-workbench-move:disabled{cursor:not-allowed;opacity:.35}.mach-tag{display:inline-flex;align-items:center;gap:4px;padding:0 8px;height:20px;line-height:18px;border-radius:999px;font-size:var(--mach-font-size-sm);font-weight:500;white-space:nowrap}.mach-tag:before{content:"";width:5px;height:5px;border-radius:999px;background:currentColor}.mach-tag--success{color:var(--mach-success);background:color-mix(in srgb,var(--mach-success) 10%,transparent)}.mach-tag--warning{color:var(--mach-warning);background:color-mix(in srgb,var(--mach-warning) 12%,transparent)}.mach-tag--danger{color:var(--mach-danger);background:color-mix(in srgb,var(--mach-danger) 10%,transparent)}.mach-tag--info{color:var(--mach-info);background:color-mix(in srgb,var(--mach-info) 10%,transparent)}.mach-tag--neutral{color:var(--mach-header-fg);background:color-mix(in srgb,var(--mach-header-fg) 10%,transparent)}.mach-progress{display:flex;align-items:center;gap:6px;width:100%}.mach-progress__track{flex:1;min-width:0;height:6px;border-radius:999px;background:color-mix(in srgb,var(--mach-header-fg) 14%,transparent);overflow:hidden}.mach-progress__bar{height:100%;border-radius:999px;background:var(--mach-primary);transition:width var(--mach-transition)}.mach-progress__label{flex-shrink:0;font-size:var(--mach-font-size-sm);color:var(--mach-header-fg);font-variant-numeric:tabular-nums}.mach-link{color:var(--mach-primary);cursor:pointer}.mach-link:hover{text-decoration:underline}.mach-actions{display:inline-flex;align-items:center;gap:2px}.mach-sr-only{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.mach-action-btn{display:inline-flex;align-items:center;justify-content:center;min-width:24px;height:24px;padding:0 4px;border:none;border-radius:var(--mach-radius-sm);background:transparent;color:var(--mach-header-fg);font-size:var(--mach-font-size-sm);line-height:1;cursor:pointer;white-space:nowrap;transition:color var(--mach-transition),background-color var(--mach-transition),transform var(--mach-transition)}.mach-action-btn:hover{background:var(--mach-row-hover-bg);color:var(--mach-primary)}.mach-action-btn--danger:hover{background:color-mix(in srgb,var(--mach-danger) 10%,transparent);color:var(--mach-danger);transform:scale(1.06)}.mach-action-btn--success:hover{background:color-mix(in srgb,var(--mach-success) 12%,transparent);color:var(--mach-success);transform:scale(1.06)}.mach-action-btn--primary{color:var(--mach-primary)}.mach-action-btn--warning{color:var(--mach-warning)}.mach-action-btn--success,.mach-edit-control--confirm{color:var(--mach-success)}.mach-action-btn--danger{color:var(--mach-danger)}.mach-action-btn:focus-visible,.mach-edit-control:focus-visible,.mach-cell-edit-trigger:focus-visible,.mach-action-drawer__close:focus-visible{outline:2px solid color-mix(in srgb,var(--mach-primary) 65%,transparent);outline-offset:1px}.mach-action-btn:disabled{cursor:not-allowed;opacity:.4}.mach-action-btn--loading svg{animation:mach-spin .8s linear infinite}.mach-dictionary-value--loading{color:var(--mach-header-fg);opacity:.72}.mach-dictionary-value--error{text-decoration:underline dotted;text-underline-offset:3px}.mach-action-btn--icon{padding:0;width:24px}.mach-context-menu-item--danger{color:var(--mach-danger)}.mach-context-menu-item,.mach-action-drawer__item{display:flex;align-items:center;gap:9px}.mach-context-menu-item--primary,.mach-action-drawer__item--primary{color:var(--mach-primary)}.mach-context-menu-item--warning,.mach-action-drawer__item--warning{color:var(--mach-warning)}.mach-context-menu-item--success,.mach-action-drawer__item--success{color:var(--mach-success)}.mach-context-menu-item--danger,.mach-action-drawer__item--danger{color:var(--mach-danger)}.mach-action-drawer-backdrop{position:fixed;inset:0;z-index:calc(var(--mach-z-menu) + 2);background:#0f172a33;backdrop-filter:blur(1px)}.mach-action-drawer{position:absolute;top:0;right:0;display:flex;flex-direction:column;width:min(340px,calc(100vw - 24px));height:100%;background:var(--mach-body-bg);color:var(--mach-body-fg);border-left:1px solid var(--mach-border-color);box-shadow:-16px 0 40px #0f172a24;font-family:var(--mach-font-family);animation:mach-drawer-in .18s ease-out}.mach-action-drawer__header{display:flex;align-items:center;justify-content:space-between;min-height:56px;padding:0 16px 0 20px;border-bottom:1px solid var(--mach-border-color)}.mach-action-drawer__close{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;padding:0;border:0;border-radius:var(--mach-radius);background:transparent;color:var(--mach-header-fg);cursor:pointer}.mach-action-drawer__close:hover{color:var(--mach-primary);background:var(--mach-row-hover-bg)}.mach-action-drawer__body{display:flex;flex-direction:column;gap:4px;padding:12px;overflow:auto}.mach-action-drawer__item{width:100%;min-height:40px;padding:0 12px;border:0;border-radius:var(--mach-radius);background:transparent;font:inherit;text-align:left;cursor:pointer}.mach-action-drawer__item:hover:not(:disabled){background:var(--mach-row-hover-bg)}.mach-action-drawer__item:disabled{opacity:.4;cursor:not-allowed}@keyframes mach-drawer-in{0%{transform:translate(18px);opacity:0}to{transform:translate(0);opacity:1}}@media(max-width:640px){.mach-action-drawer{top:auto;bottom:0;width:100%;height:auto;max-height:min(70vh,520px);border-top:1px solid var(--mach-border-color);border-left:0;border-radius:var(--mach-radius-lg) var(--mach-radius-lg) 0 0;animation-name:mach-drawer-up}}@keyframes mach-drawer-up{0%{transform:translateY(18px);opacity:0}to{transform:translateY(0);opacity:1}}.mach-cell:has(.mach-cell-edit-trigger){padding-right:29px}.mach-cell-edit-trigger{position:absolute;right:5px;top:50%;display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;padding:0;transform:translateY(-50%);border:0;border-radius:var(--mach-radius-sm);background:transparent;color:var(--mach-header-fg);cursor:pointer;opacity:0;transition:opacity var(--mach-transition),color var(--mach-transition),background-color var(--mach-transition)}.mach-cell-edit-trigger svg{width:13px;height:13px}.mach-cell:hover .mach-cell-edit-trigger--hover,.mach-cell:focus-within .mach-cell-edit-trigger--hover,.mach-cell-edit-trigger--always{opacity:.72}.mach-cell-edit-trigger:hover{opacity:1;color:var(--mach-primary);background:color-mix(in srgb,var(--mach-primary) 9%,transparent)}.mach-cell--editing{overflow:visible;z-index:4}.mach-cell-editor-shell,.mach-row-editor-shell{display:flex;align-items:center;width:100%;min-width:0;gap:5px}.mach-cell-editor-shell>.mach-editor-input,.mach-cell-editor-shell>.mach-editor-select-control,.mach-cell-editor-shell>:not(.mach-cell-editor-controls),.mach-row-editor-shell>*{flex:1 1 auto;min-width:0}.mach-cell-editor-controls{display:inline-flex;flex:0 0 auto;align-items:center;gap:2px;padding:2px;border:1px solid var(--mach-border-color);border-radius:var(--mach-radius);background:var(--mach-body-bg);box-shadow:var(--mach-shadow-sm)}.mach-edit-control{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;padding:0;border:0;border-radius:var(--mach-radius-sm);background:transparent;color:var(--mach-header-fg);cursor:pointer;transition:color var(--mach-transition),background-color var(--mach-transition),transform var(--mach-transition)}.mach-edit-control svg{width:14px;height:14px}.mach-edit-control--confirm{color:var(--mach-success)}.mach-edit-control--confirm:hover{background:color-mix(in srgb,var(--mach-success) 12%,transparent);transform:scale(1.06)}.mach-edit-control--cancel{color:var(--mach-danger)}.mach-edit-control--cancel:hover{background:color-mix(in srgb,var(--mach-danger) 10%,transparent);transform:scale(1.06)}.mach-edit-control:disabled{opacity:.35;cursor:wait}.mach-row--editing,.mach-row--editing .mach-cell{background:color-mix(in srgb,var(--mach-primary) 3%,var(--mach-body-bg))}.mach-cell--row-editing .mach-editor-input,.mach-cell--row-editing .mach-editor-select-control .mach-select-trigger{border-color:color-mix(in srgb,var(--mach-primary) 45%,var(--mach-border-color));box-shadow:0 1px 2px #0f172a0a}.mach-cell--row-editing .mach-editor-input:focus,.mach-cell--row-editing .mach-editor-select-control .mach-select-trigger:focus-visible,.mach-cell--row-editing .mach-editor-select-control .mach-select-trigger[aria-expanded=true]{border-color:var(--mach-primary);box-shadow:0 0 0 2px color-mix(in srgb,var(--mach-primary) 12%,transparent)}.mach-tooltip{position:fixed;z-index:var(--mach-z-menu);max-width:320px;padding:6px 10px;border-radius:var(--mach-radius);background:var(--mach-body-fg);color:var(--mach-body-bg);font-size:var(--mach-font-size-sm);line-height:1.5;box-shadow:var(--mach-shadow);pointer-events:none;word-break:break-word}.mach-cell--flash{animation:mach-flash .8s ease-out}@keyframes mach-flash{0%{background-color:color-mix(in srgb,var(--mach-primary) 35%,transparent)}to{background-color:transparent}}.mach-context-menu-separator{height:1px;margin:4px 6px;background:var(--mach-border-color)}.mach-context-menu-item:disabled{opacity:.45;cursor:not-allowed}.mach-pagination{display:flex;align-items:center;justify-content:flex-end;gap:6px;flex-shrink:0;height:40px;padding:0 12px;background:var(--mach-body-bg);border-top:var(--mach-border-width) solid var(--mach-border-color);color:var(--mach-body-fg);font-size:var(--mach-font-size-sm);user-select:none}.mach-pagination-total{color:var(--mach-header-fg);margin-right:8px;font-variant-numeric:tabular-nums}.mach-pagination-page{min-width:72px;text-align:center;color:var(--mach-body-fg);font-variant-numeric:tabular-nums}.mach-pagination-btn{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;border:var(--mach-border-width) solid var(--mach-border-color);border-radius:var(--mach-radius-sm);background:var(--mach-body-bg);color:var(--mach-header-fg);font-size:13px;line-height:1;cursor:pointer;transition:border-color var(--mach-transition),color var(--mach-transition),background-color var(--mach-transition)}.mach-pagination-btn:hover:not(:disabled){border-color:var(--mach-primary);color:var(--mach-primary)}.mach-pagination-btn:disabled{opacity:.35;cursor:not-allowed}.mach-pagination-size-control{height:24px;margin-left:6px;width:92px;font-size:var(--mach-font-size-sm)}.mach-pagination-size-control .mach-select-trigger{width:100%;height:24px;padding:0 6px;border-width:var(--mach-border-width);border-radius:var(--mach-radius-sm);color:var(--mach-header-fg);box-shadow:none}.mach-watermark{position:absolute;inset:0;z-index:6;pointer-events:none;background-repeat:repeat}.mach-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;padding:32px 16px;min-height:160px}.mach-empty__icon{margin-bottom:6px}.mach-empty__title{font-size:var(--mach-font-size);color:var(--mach-body-fg);font-weight:500}.mach-empty__hint{font-size:var(--mach-font-size-sm);color:var(--mach-header-fg)}@media(prefers-reduced-motion:reduce){.mach-spinner,.mach-loading__visual:before{animation-duration:2.4s}}.mach-cell--center{justify-content:center}.mach-cell--right{justify-content:flex-end}.mach-header-cell--center .mach-header-label{text-align:center}.mach-header-cell--right .mach-header-label{text-align:right}@media(prefers-reduced-motion:reduce){.mach-root *,.mach-root *:before,.mach-root *:after{scroll-behavior:auto!important;animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}.mach-action-drawer{animation:none!important}}.mach-root{--mach-row-warning-bg: color-mix(in srgb, var(--mach-warning) 11%, var(--mach-body-bg));--mach-row-danger-bg: color-mix(in srgb, var(--mach-danger) 9%, var(--mach-body-bg));--mach-row-success-bg: color-mix(in srgb, var(--mach-success) 10%, var(--mach-body-bg));--mach-row-info-bg: color-mix(in srgb, var(--mach-info) 10%, var(--mach-body-bg))}.mach-row--styled[data-row-tone=warning]{--mach-row-rule-bg: var(--mach-row-warning-bg)}.mach-row--styled[data-row-tone=danger]{--mach-row-rule-bg: var(--mach-row-danger-bg)}.mach-row--styled[data-row-tone=success]{--mach-row-rule-bg: var(--mach-row-success-bg)}.mach-row--styled[data-row-tone=info]{--mach-row-rule-bg: var(--mach-row-info-bg)}.mach-root :is(.mach-row,.mach-pinned-row).mach-row--styled,.mach-root :is(.mach-row,.mach-pinned-row).mach-row--styled .mach-cell{background-color:var(--mach-row-rule-bg, var(--mach-body-bg));color:var(--mach-row-rule-fg, var(--mach-body-fg))}.mach-root .mach-row--styled.mach-row--hover,.mach-root .mach-row--styled.mach-row--hover .mach-cell{background-color:color-mix(in srgb,var(--mach-primary) 4%,var(--mach-row-rule-bg, var(--mach-body-bg)))}.mach-root .mach-row--styled.mach-row--selected,.mach-root .mach-row--styled.mach-row--selected .mach-cell{background-color:color-mix(in srgb,var(--mach-primary) 12%,var(--mach-row-rule-bg, var(--mach-body-bg)))}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
"use strict";var u=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var D=Object.getOwnPropertyNames;var b=Object.prototype.hasOwnProperty;var G=(n,t)=>{for(var r in t)u(n,r,{get:t[r],enumerable:!0})},C=(n,t,r,e)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of D(t))!b.call(n,i)&&i!==r&&u(n,i,{get:()=>t[i],enumerable:!(e=A(t,i))||e.enumerable});return n};var E=n=>C(u({},"__esModule",{value:!0}),n);var F={};G(F,{createMultiRangeSelection:()=>S});module.exports=E(F);var m=Symbol.for("mach-table.adapter.lifecycle.v1");function y(n,t,r){return n.isDestroyed()?"":n[m]?.readCell(t,r)??""}function w(n,t){n.isDestroyed()||n[m]?.writeInput(t)}function v(n){return typeof n!="string"||n===""||/^[+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:[eE][+-]?\d+)?$/.test(n)?n:/^[\s\u0000-\u001f]*[=+\-@]/.test(n)?"'"+n:n}function I(n,t){let r=t?v(n):n,e=r==null?"":String(r);return/["\t\n\r]/.test(e)?'"'+e.replace(/"/g,'""')+'"':e}function x(n,t=!0){return n.map(r=>r.map(e=>I(e,t)).join(" ")).join(`
|
|
2
|
+
`)}var g=32,R=1e5;function d(n){let t=[...new Map(n.map(r=>[JSON.stringify(r.range),r])).values()];if(t.length>g)throw new RangeError("At most 32 ranges are supported.");if(t.reduce((r,e)=>r+e.rows.length*e.columns.length,0)>R)throw new RangeError("A multi-range operation may affect at most 100000 cells.");return t}function M(n){let t=n.columns.getWorkbenchItems().filter(r=>r.visible);return["left",null,"right"].flatMap(r=>t.filter(e=>e.pinned===r).map(e=>e.colId))}function S(){return new f}var f=class{constructor(){this.key="multi-range";this.context=null;this.saved=[];this.e=0;this.r=null}setup(t){if(this.context)throw new Error("Create a separate multi-range feature for each grid.");if(!t.api.getOption("enableRangeSelection"))throw new Error("Multi-range selection requires enableRangeSelection: true.");this.context=t;let r=null;t.onCleanup(()=>{cancelAnimationFrame(this.e),this.e=0;try{r?.disconnect()}finally{this.o(),this.saved=[],this.context===t&&(this.context=null)}});let{root:e}=t,i=(o,s)=>{t.addManagedDomListener(e,o,a=>{try{s(a)}catch(c){a.preventDefault(),a.stopImmediatePropagation(),t.reportError(c,"multi-range")}},!0)};i("mousedown",o=>this.s(o)),i("keydown",o=>this.a(o)),i("copy",o=>this.i(o)),i("cut",o=>this.i(o,!0)),t.addEventListener("rangeSelectionChanged",()=>this.t()),r=new MutationObserver(()=>this.t()),r.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["data-id","data-col-id"]}),t.addEventListener("modelUpdated",()=>this.clear())}snapshot(t){let r=this.context?.api;if(!r)return null;let e=M(r),i=e.indexOf(t.colId1),o=e.indexOf(t.colId2),s=Math.max(0,Math.min(t.row1,t.row2)),a=Math.min(r.rows.getCount()-1,Math.max(t.row1,t.row2));if(i<0||o<0||!Number.isInteger(s)||!Number.isInteger(a)||a<s)return null;let c=e.slice(Math.min(i,o),Math.max(i,o)+1);if((a-s+1)*c.length>R)throw new RangeError("A range may contain at most 100000 cells.");let h=[];for(let p=s;p<=a;p++){let l=r.rows.getAt(p);l?.data&&!l.isGroup&&!l.isDetail&&!l.loading&&h.push(l.id)}return{range:{row1:s,row2:a,colId1:e[Math.min(i,o)],colId2:e[Math.max(i,o)]},rows:h,columns:c}}n(){let t=this.context?.api.selection.getRange(),r=t?this.snapshot(t):null,e=r?[...this.saved,r]:[...this.saved];return d(e)}getRanges(){return this.n().map(t=>({...t.range}))}setRanges(t){if(!this.context)throw new Error("Install the multi-range feature before setting ranges.");if(t.length>g)throw new RangeError("At most 32 ranges are supported.");let r=d(t.map(e=>this.snapshot(e)).filter(e=>e!==null));this.context.api.selection.clearRange(),this.saved=r,this.t()}clear(){this.saved=[],this.context?.api.selection.clearRange(),this.o(),this.t()}getText(){let t=this.context?.api;return t?this.n().map(r=>x(r.rows.map(e=>r.columns.map(i=>y(t,e,i))))).join(`
|
|
3
|
+
|
|
4
|
+
`):""}clearValues(){let t=this.context?.api;if(!t)return;let r=new Map;for(let e of this.n())for(let i of e.rows)for(let o of e.columns)r.set(JSON.stringify([i,o]),{rowId:i,colId:o,value:null});w(t,[...r.values()])}s(t){if(!(!t.target.closest(".mach-cell")||t.button!==0)){if(t.ctrlKey||t.metaKey){let e=this.context?.api.selection.getRange(),i=e?this.snapshot(e):null,o=d(i?[...this.saved,i]:this.saved);if(o.length>=g)throw new RangeError("At most 32 ranges are supported.");this.saved=o}else t.shiftKey||(this.saved=[]);this.t()}}a(t){if(!t.target.closest("input,textarea,select,[contenteditable=true]")){if(t.key==="Escape"){this.clear();return}t.key!=="Delete"&&t.key!=="Backspace"||this.saved.length===0||this.n().length<2||(t.preventDefault(),t.stopImmediatePropagation(),this.clearValues())}}i(t,r=!1){t.target.closest("input,textarea,select,[contenteditable=true]")||this.saved.length===0||this.n().length<2||this.context?.api.getOption("suppressClipboard")||t.clipboardData&&(t.clipboardData.setData("text/plain",this.getText()),t.preventDefault(),t.stopImmediatePropagation(),r&&this.clearValues())}t(){!this.context||this.e||(this.e=requestAnimationFrame(()=>{this.e=0,this.l()}))}o(){this.r?.(),this.r=null}l(){if(this.o(),!this.context)return;let t=this.saved.map(e=>({rows:new Set(e.rows),columns:new Set(e.columns)})),r=[];for(let e of this.context.root.querySelectorAll(".mach-cell")){let i=e.closest(".mach-row");t.some(o=>o.rows.has(i?.dataset.id??"")&&o.columns.has(e.dataset.colId??""))&&(e.classList.add("mach-cell--multi-range"),r.push(e))}this.r=()=>r.forEach(e=>e.classList.remove("mach-cell--multi-range"))}};0&&(module.exports={createMultiRangeSelection});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { G as GridFeature, a as GridCellRange } from './api-pOhyuSQk.cjs';
|
|
2
|
+
|
|
3
|
+
interface MultiRangeSelection extends GridFeature {
|
|
4
|
+
getRanges(): GridCellRange[];
|
|
5
|
+
setRanges(ranges: readonly GridCellRange[]): void;
|
|
6
|
+
clear(): void;
|
|
7
|
+
getText(): string;
|
|
8
|
+
clearValues(): void;
|
|
9
|
+
}
|
|
10
|
+
/** Ctrl/Cmd adds rectangles; Core keeps owning the active rectangle and fill handle. */
|
|
11
|
+
declare function createMultiRangeSelection(): MultiRangeSelection;
|
|
12
|
+
|
|
13
|
+
export { type MultiRangeSelection, createMultiRangeSelection };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { G as GridFeature, a as GridCellRange } from './api-pOhyuSQk.js';
|
|
2
|
+
|
|
3
|
+
interface MultiRangeSelection extends GridFeature {
|
|
4
|
+
getRanges(): GridCellRange[];
|
|
5
|
+
setRanges(ranges: readonly GridCellRange[]): void;
|
|
6
|
+
clear(): void;
|
|
7
|
+
getText(): string;
|
|
8
|
+
clearValues(): void;
|
|
9
|
+
}
|
|
10
|
+
/** Ctrl/Cmd adds rectangles; Core keeps owning the active rectangle and fill handle. */
|
|
11
|
+
declare function createMultiRangeSelection(): MultiRangeSelection;
|
|
12
|
+
|
|
13
|
+
export { type MultiRangeSelection, createMultiRangeSelection };
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
var h=Symbol.for("mach-table.adapter.lifecycle.v1");function m(n,t,r){return n.isDestroyed()?"":n[h]?.readCell(t,r)??""}function y(n,t){n.isDestroyed()||n[h]?.writeInput(t)}function w(n){return typeof n!="string"||n===""||/^[+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:[eE][+-]?\d+)?$/.test(n)?n:/^[\s\u0000-\u001f]*[=+\-@]/.test(n)?"'"+n:n}function R(n,t){let r=t?w(n):n,e=r==null?"":String(r);return/["\t\n\r]/.test(e)?'"'+e.replace(/"/g,'""')+'"':e}function v(n,t=!0){return n.map(r=>r.map(e=>R(e,t)).join(" ")).join(`
|
|
2
|
+
`)}var d=32,x=1e5;function u(n){let t=[...new Map(n.map(r=>[JSON.stringify(r.range),r])).values()];if(t.length>d)throw new RangeError("At most 32 ranges are supported.");if(t.reduce((r,e)=>r+e.rows.length*e.columns.length,0)>x)throw new RangeError("A multi-range operation may affect at most 100000 cells.");return t}function A(n){let t=n.columns.getWorkbenchItems().filter(r=>r.visible);return["left",null,"right"].flatMap(r=>t.filter(e=>e.pinned===r).map(e=>e.colId))}function M(){return new g}var g=class{constructor(){this.key="multi-range";this.context=null;this.saved=[];this.e=0;this.r=null}setup(t){if(this.context)throw new Error("Create a separate multi-range feature for each grid.");if(!t.api.getOption("enableRangeSelection"))throw new Error("Multi-range selection requires enableRangeSelection: true.");this.context=t;let r=null;t.onCleanup(()=>{cancelAnimationFrame(this.e),this.e=0;try{r?.disconnect()}finally{this.o(),this.saved=[],this.context===t&&(this.context=null)}});let{root:e}=t,o=(i,s)=>{t.addManagedDomListener(e,i,a=>{try{s(a)}catch(c){a.preventDefault(),a.stopImmediatePropagation(),t.reportError(c,"multi-range")}},!0)};o("mousedown",i=>this.s(i)),o("keydown",i=>this.a(i)),o("copy",i=>this.i(i)),o("cut",i=>this.i(i,!0)),t.addEventListener("rangeSelectionChanged",()=>this.t()),r=new MutationObserver(()=>this.t()),r.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["data-id","data-col-id"]}),t.addEventListener("modelUpdated",()=>this.clear())}snapshot(t){let r=this.context?.api;if(!r)return null;let e=A(r),o=e.indexOf(t.colId1),i=e.indexOf(t.colId2),s=Math.max(0,Math.min(t.row1,t.row2)),a=Math.min(r.rows.getCount()-1,Math.max(t.row1,t.row2));if(o<0||i<0||!Number.isInteger(s)||!Number.isInteger(a)||a<s)return null;let c=e.slice(Math.min(o,i),Math.max(o,i)+1);if((a-s+1)*c.length>x)throw new RangeError("A range may contain at most 100000 cells.");let f=[];for(let p=s;p<=a;p++){let l=r.rows.getAt(p);l?.data&&!l.isGroup&&!l.isDetail&&!l.loading&&f.push(l.id)}return{range:{row1:s,row2:a,colId1:e[Math.min(o,i)],colId2:e[Math.max(o,i)]},rows:f,columns:c}}n(){let t=this.context?.api.selection.getRange(),r=t?this.snapshot(t):null,e=r?[...this.saved,r]:[...this.saved];return u(e)}getRanges(){return this.n().map(t=>({...t.range}))}setRanges(t){if(!this.context)throw new Error("Install the multi-range feature before setting ranges.");if(t.length>d)throw new RangeError("At most 32 ranges are supported.");let r=u(t.map(e=>this.snapshot(e)).filter(e=>e!==null));this.context.api.selection.clearRange(),this.saved=r,this.t()}clear(){this.saved=[],this.context?.api.selection.clearRange(),this.o(),this.t()}getText(){let t=this.context?.api;return t?this.n().map(r=>v(r.rows.map(e=>r.columns.map(o=>m(t,e,o))))).join(`
|
|
3
|
+
|
|
4
|
+
`):""}clearValues(){let t=this.context?.api;if(!t)return;let r=new Map;for(let e of this.n())for(let o of e.rows)for(let i of e.columns)r.set(JSON.stringify([o,i]),{rowId:o,colId:i,value:null});y(t,[...r.values()])}s(t){if(!(!t.target.closest(".mach-cell")||t.button!==0)){if(t.ctrlKey||t.metaKey){let e=this.context?.api.selection.getRange(),o=e?this.snapshot(e):null,i=u(o?[...this.saved,o]:this.saved);if(i.length>=d)throw new RangeError("At most 32 ranges are supported.");this.saved=i}else t.shiftKey||(this.saved=[]);this.t()}}a(t){if(!t.target.closest("input,textarea,select,[contenteditable=true]")){if(t.key==="Escape"){this.clear();return}t.key!=="Delete"&&t.key!=="Backspace"||this.saved.length===0||this.n().length<2||(t.preventDefault(),t.stopImmediatePropagation(),this.clearValues())}}i(t,r=!1){t.target.closest("input,textarea,select,[contenteditable=true]")||this.saved.length===0||this.n().length<2||this.context?.api.getOption("suppressClipboard")||t.clipboardData&&(t.clipboardData.setData("text/plain",this.getText()),t.preventDefault(),t.stopImmediatePropagation(),r&&this.clearValues())}t(){!this.context||this.e||(this.e=requestAnimationFrame(()=>{this.e=0,this.l()}))}o(){this.r?.(),this.r=null}l(){if(this.o(),!this.context)return;let t=this.saved.map(e=>({rows:new Set(e.rows),columns:new Set(e.columns)})),r=[];for(let e of this.context.root.querySelectorAll(".mach-cell")){let o=e.closest(".mach-row");t.some(i=>i.rows.has(o?.dataset.id??"")&&i.columns.has(e.dataset.colId??""))&&(e.classList.add("mach-cell--multi-range"),r.push(e))}this.r=()=>r.forEach(e=>e.classList.remove("mach-cell--multi-range"))}};export{M as createMultiRangeSelection};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var ie=Object.defineProperty;var Ne=Object.getOwnPropertyDescriptor;var Fe=Object.getOwnPropertyNames;var He=Object.prototype.hasOwnProperty;var qe=(r,e)=>{for(var t in e)ie(r,t,{get:e[t],enumerable:!0})},Be=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Fe(e))!He.call(r,o)&&o!==t&&ie(r,o,{get:()=>e[o],enumerable:!(n=Ne(e,o))||n.enumerable});return r};var Ke=r=>Be(ie({},"__esModule",{value:!0}),r);var et={};qe(et,{RowOrderConflictError:()=>P,createRowOrderController:()=>Ae,moveTreeNodes:()=>V,reorderRows:()=>X});module.exports=Ke(et);var Ue=new Set(["__proto__","prototype","constructor"]);function Ye(r){return typeof r!="string"||r.length===0?!1:r.split(".").every(t=>t.length>0&&!Ue.has(t))}function j(r,e){if(r==null||!Ye(e))return;if(e.indexOf(".")<0)return r[e];let n=r,o=0;for(;o<e.length;){if(n==null)return;let i=e.indexOf(".",o);if(i<0){n=n[e.slice(o)];break}n=n[e.slice(o,i)],o=i+1}return n}function _e(r,e){let t=typeof e.rowKey=="function"?e.rowKey(r):j(r,e.rowKey);if(t==null||String(t).length===0)throw new Error("[MachTable] Row ordering requires a non-empty stable row key.");return String(t)}function ze(r,e){let t=r[e];if(t==null)return[];if(!Array.isArray(t))throw new Error(`[MachTable] Tree ordering expects an array at "${e}".`);return t}function K(r,e,t,n){let o={entries:[],byId:new Map,byRow:new Map,children:new Map([[null,r]])},i=[...r].reverse().map(d=>({row:d,parentId:null,selectedAncestor:!1})),a=t.childrenKey??"children";for(;i.length;){let d=i.pop(),c=_e(d.row,t);if(o.byId.has(c))throw new Error(`[MachTable] Row ordering found duplicate or cyclic row key "${c}".`);let l=n?ze(d.row,a):[],h={...d,id:c,children:l};o.entries.push(h),o.byId.set(c,h),o.byRow.set(h.row,h),o.children.set(c,l);for(let f=l.length-1;f>=0;f--)i.push({row:l[f],parentId:c,selectedAncestor:d.selectedAncestor||e.has(c)})}return o}function $e(r){if(!["before","after","inside"].includes(r.position))throw new Error("[MachTable] Unknown row ordering position.");let e=[...new Set(r.rowIds.map(String))];if(!e.length)throw new Error("[MachTable] Row ordering requires at least one source row.");return{...r,rowIds:e,targetId:String(r.targetId)}}function ae(r,e){for(let n of e)if(!r.byId.has(n))throw new Error(`[MachTable] Ordering source "${n}" is unavailable.`);let t=new Set(e);return{selected:t,moved:r.entries.filter(n=>t.has(n.id)&&!n.selectedAncestor)}}function be(r,e,t,n){let o=r.byId.get(t.targetId);if(!o)throw new Error(`[MachTable] Ordering target "${t.targetId}" is unavailable.`);if(e.selected.has(o.id)||o.selectedAncestor)throw new Error("[MachTable] A row cannot be moved into or relative to its own subtree.");let i=t.position==="inside"?o.id:o.parentId,a=i===null?null:r.byId.get(i).row;if(n.canMove)for(let d of e.moved){let c=d.parentId===null?null:r.byId.get(d.parentId).row,l=n.canMove({row:d.row,previousParent:c,parent:a,target:o.row,intent:t});if(l===!1||typeof l=="string")throw new Error(typeof l=="string"?l:"[MachTable] This row cannot be moved to the selected parent.")}return i}function Re(r,e,t,n){let o=[...new Set(e.map(String))];if(!o.length)throw new Error("[MachTable] Row ordering requires at least one source row.");let i=K(r,new Set(o),t,n),a=ae(i,o);return d=>{if(!n&&d.position==="inside")throw new Error("[MachTable] Flat rows cannot have child destinations.");be(i,a,d,t)}}function We(r,e,t,n){let o=new Set(e.map(l=>l.id)),i=new Map;for(let l of e)i.has(l.parentId)||i.set(l.parentId,r.children.get(l.parentId).filter(h=>!o.has(r.byRow.get(h).id)));let a=i.get(t)??r.children.get(t),d=a.findIndex(l=>l===r.byId.get(n.targetId).row),c=n.position==="inside"?a.length:d+ +(n.position==="after");return i.set(t,[...a.slice(0,c),...e.map(l=>l.row),...a.slice(c)]),i}function ve(r,e){return r.length===e.length&&r.every((t,n)=>t===e[n])}function je(r,e,t,n){let o=new Map,i=n.childrenKey??"children";for(let d=e.entries.length-1;d>=0;d--){let c=e.entries[d],h=(t.get(c.id)??c.children).map(f=>o.get(f)??f);ve(c.children,h)||o.set(c.row,{...c.row,[i]:h})}let a=(t.get(null)??r).map(d=>o.get(d)??d);return ve(r,a)?r:a}function Xe(r,e,t,n){let o=t.indexOf(e[0].row),i=o+e.length;return{...r,rowIds:e.map(a=>a.id),beforeId:o>0?n.byRow.get(t[o-1]).id:null,afterId:i<t.length?n.byRow.get(t[i]).id:null}}function Te(r,e,t){let n=K(r.before,new Set(r.rowIds),e,t),o=new Map;for(let i of n.children.values())i.forEach((a,d)=>o.set(n.byRow.get(a).id,d));return ae(n,r.rowIds).moved.reverse().map(i=>{let a=n.children.get(i.parentId),d=o.get(i.id),c=a[d+1];if(c)return{rowIds:[i.id],targetId:n.byRow.get(c).id,position:"before"};if(i.parentId!==null)return{rowIds:[i.id],targetId:i.parentId,position:"inside"};let l=a[d-1];if(!l)throw new Error("[MachTable] Row ordering cannot restore an isolated root.");return{rowIds:[i.id],targetId:n.byRow.get(l).id,position:"after"}})}function Ie(r,e,t,n,o){if(!n.canMove)return;let i=K(r,new Set,n,o),a=K(e,new Set,n,o);for(let d of t)for(let c of d.rowIds){let l=i.byId.get(c),h=a.byId.get(c),f=h.parentId===null?null:i.byId.get(h.parentId).row,x=l.parentId===null?null:i.byId.get(l.parentId).row,E=n.canMove({row:l.row,previousParent:x,parent:f,target:i.byId.get(d.targetId).row,intent:d});if(E===!1||typeof E=="string")throw new Error(typeof E=="string"?E:"[MachTable] This row cannot be restored to its previous parent.")}}function De(r,e,t,n){let o=$e(e);if(!n&&o.position==="inside")throw new Error("[MachTable] Flat rows cannot have child destinations.");let i=K(r,new Set(o.rowIds),t,n),{moved:a,selected:d}=ae(i,o.rowIds),c=be(i,{moved:a,selected:d},o,t),l=We(i,a,c,o),h=je(r,i,l,t),f=Xe(o,a,l.get(c),i);return{before:r,after:h,intent:f,rowIds:f.rowIds,changed:r!==h}}function X(r,e,t){return De(r,e,t,!1)}function V(r,e,t){return De(r,e,t,!0)}function se(r,e,t){let n=document.createElement(r);if(e&&(n.className=e),t)for(let o of Object.keys(t))n.setAttribute(o,t[o]);return n}function M(r,e,t){return r<e?e:r>t?t:r}var de=Symbol.for("mach-table.adapter.lifecycle.v1");function J(r){return!r.isDestroyed()&&(r[de]?.canReplaceData()??!1)}function le(r,e){let t=r[de]?.rowDrag;return t?.original===e&&t.policy===r.getOption("rowDragPolicy")}function ce(r,e){let t=r[de];if(!t)return()=>{};t.rowDrag?.activeInteraction?.destroy();let n={original:e,policy:r.getOption("rowDragPolicy"),factory:o=>(n.activeInteraction=e(o),n.activeInteraction)};return t.rowDrag=n,()=>{n.activeInteraction?.destroy(),t.rowDrag===n&&(t.rowDrag=void 0)}}function Oe(r,e){return new Promise((t,n)=>{let o=()=>n(Object.assign(new Error("[MachTable] Operation cancelled."),{name:"AbortError"}));if(r.then(t,n).finally(()=>e.removeEventListener("abort",o)),e.aborted){o();return}e.addEventListener("abort",o,{once:!0})})}function ue(r,e,t){return r.replace("{a}",String(e)).replace("{b}",String(t))}function Ve(r,e,t){return r&&e>.25&&e<.75?"inside":t}function xe(r,e){let t=0,n=r.length;for(;t<n;){let o=t+n>>>1;r[o]<e?t=o+1:n=o}return t}function Je(r,e,t,n,o,i){let a=r.getOption("locale")??{},d=e>1?ue(a.rowDragSelection??"\u5DF2\u9009 {a} \u884C \u2192 \u7B2C {b} \u884C",e,n+1):ue(a.rowDragPosition??"\u7B2C {a} \u884C \u2192 \u7B2C {b} \u884C",t+1,n+1),c=o==="inside"?a.rowDragInside??"\u79FB\u5165":o==="before"?a.rowDragBefore??"\u4E4B\u524D":a.rowDragAfter??"\u4E4B\u540E";return{text:`${d} \xB7 ${c}`,indicatorStyle:o==="inside"?`height:${i}px;background:color-mix(in srgb,var(--mach-primary) 12%,transparent);box-shadow:inset 0 0 0 1px var(--mach-primary)`:void 0}}function Qe(r,e,t){let n={parents:new Map,siblings:new Map([[null,[]]]),depths:new Map},o=[...r].reverse().map(a=>({row:a,parent:null,depth:0})),i=e.childrenKey??"children";for(;o.length;){let{row:a,parent:d,depth:c}=o.pop(),l=String(typeof e.rowKey=="function"?e.rowKey(a):j(a,e.rowKey));if(n.depths.has(l))throw new Error("[MachTable] Row ordering requires unique, acyclic row keys.");n.depths.set(l,c),n.siblings.get(d).push(l),n.siblings.set(l,[]),d!==null&&n.parents.set(l,d);let h=t?a[i]:void 0;if(h!=null&&!Array.isArray(h))throw new Error("[MachTable] Row ordering children must be an array.");for(let f=(h?.length??0)-1;f>=0;f--)o.push({row:h[f],parent:l,depth:c+1})}return n}function Ee(r,e,t,n,o,i){let a=new Map;r.rows.forEach(u=>{!u.loading&&!u.isDetail&&!u.isGroup&&u.data!=null&&a.set(u.id,u)});let d=Qe(t,n,o),c=new Set(e.selected?[...d.depths.keys()].filter(u=>a.get(u)?.selected):[e.id]),l=[...c],h=u=>{let y=u;for(;y!==void 0;){if(c.has(y))return!0;y=d.parents.get(y)}return!1},f=new Map,x=new Map;for(let[u,y]of d.siblings){let m=y.filter(v=>!c.has(v));f.set(u,m),m.forEach((v,g)=>x.set(v,g))}let E=new Map,S=[],I=[],A=0;r.rows.forEachDisplayed(u=>{h(u.id)&&S.push(u.rowIndex),A=u.rowIndex+1;let y=d.depths.get(u.id)??0;for(;I.length&&(d.depths.get(I[I.length-1].id)??0)>=y;)E.set(I.pop().id,u.rowIndex);d.siblings.get(u.id)?.length&&I.push(u)});for(let u of I)E.set(u.id,A);return{rowIds:l,isSource:h,validate:()=>{for(let u of l){let y=a.get(u);if(y.treeLoading)return!1;let m=r.getOption("rowDragPolicy")?.canDrag?.({node:y,api:r});if(m===!1||typeof m=="string")return m}return!0},resolve:({targetNode:u,position:y,fraction:m,height:v})=>{let g=Ve(o,m,y);if(h(u.id))return"Cannot target own subtree.";if(!o&&g==="inside")return!1;let _=g==="inside"?u.id:d.parents.get(u.id)??null,C=f.get(_)??[],L=g==="inside"?C.length:(x.get(u.id)??0)+ +(g==="after"),G=g==="before"?u.rowIndex:E.get(u.id)??u.rowIndex+1,z=G-xe(S,G)+xe(S,e.rowIndex);return{intent:{rowIds:l,targetId:u.id,position:g,beforeId:C[L-1]??null,afterId:C[L]??null,expectedRevision:i},indicatorIndex:g==="inside"?u.rowIndex:g==="after"?E.get(u.id):void 0,toIndex:G,targetIndex:z,...Je(r,l.length,e.rowIndex,u.rowIndex,g,v)}},keyboardTarget:u=>{let y=e.id;for(;c.has(d.parents.get(y)??"");)y=d.parents.get(y);let m=d.siblings.get(d.parents.get(y)??null)??[],v=m.indexOf(y)+u;for(;v>=0&&v<m.length;){let g=m[v];if(!h(g)&&a.has(g))return a.get(g);v+=u}}}}var Q=class{constructor(e){this.host=e;this.drag=null;this.t=0;this.r=0;this.s=e=>{let t=this.drag;if(!(!t||e.pointerId!==t.pointerId)){if(t.clientX=e.clientX,t.clientY=e.clientY,!t.active){if(Math.abs(e.clientY-t.startY)<5)return;t.active=!0,this.host.root.classList.add("mach-root--row-dragging"),this.host.root.querySelectorAll(".mach-row").forEach(n=>n.classList.toggle("mach-row--drag-source",this.sourceContains(n.dataset.id??"")))}this.d()}};this.h=()=>{if(this.t=0,!!this.drag?.active){if(!this.current()){this.destroy();return}this.c(),this.g()&&this.d()}};this.a=e=>{let t=this.drag;if(!(!t||e.pointerId!==t.pointerId)){t.clientX=e.clientX,t.clientY=e.clientY,t.active&&this.current()&&this.c(),this.u();try{t.active&&t.drop?.valid&&this.o(e.clientX,e.clientY)&&this.current()&&this.commitDrop(t.drop)}finally{this.release()}}};this.l=e=>{e.key==="Escape"&&(e.preventDefault(),this.destroy())};this.n=e=>{e.type==="pointercancel"&&e.pointerId!==this.drag?.pointerId||this.destroy()}}begin(e){let t=this.host.containers.map(o=>{let i=se("div","mach-row-drop-indicator");return i.hidden=!0,o.append(i),i}),n=se("div","mach-row-drag-preview");n.setAttribute("role","status"),n.hidden=!0,this.host.root.append(n),this.drag={startY:e.clientY,clientX:e.clientX,clientY:e.clientY,pointerId:e.pointerId,indicators:t,preview:n,drop:null,active:!1},window.addEventListener("pointermove",this.s),window.addEventListener("pointerup",this.a),window.addEventListener("pointercancel",this.n),window.addEventListener("keydown",this.l),window.addEventListener("blur",this.n)}draggingSource(e){return this.drag?.active===!0&&this.sourceContains(e)}focusHandle(e,t=()=>!0){this.r=requestAnimationFrame(()=>{this.r=0,t()&&[...this.host.root.querySelectorAll(".mach-row-drag-handle")].find(n=>n.closest(".mach-row")?.dataset.id===e)?.focus()})}d(){this.t||(this.t=requestAnimationFrame(this.h))}o(e,t,n=0){let o=this.host.body.getBoundingClientRect();return e>=o.left&&e<=o.right&&t>=o.top-n&&t<=o.bottom+n}g(){let e=this.drag;if(!e||!this.o(e.clientX,e.clientY,28))return!1;let t=this.host.viewport,n=t.getBoundingClientRect(),o=Math.min(36,n.height/3);if(o<=0)return!1;let i=e.clientY<n.top+o?-Math.ceil(14*M((n.top+o-e.clientY)/o,0,1)):Math.ceil(14*M((e.clientY-n.bottom+o)/o,0,1)),a=t.scrollTop;return t.scrollTop=M(a+i,0,Math.max(0,t.scrollHeight-t.clientHeight)),t.scrollTop!==a}c(){let e=this.drag;if(!e?.active)return;let t=e.clientY-this.host.viewport.getBoundingClientRect().top+this.host.viewport.scrollTop,n=this.describe(t);e.drop=n;let o=this.o(e.clientX,e.clientY);for(let a of e.indicators)a.hidden=!o||!n?.valid,n&&(a.dataset.dropPosition=n.position??"",a.style.cssText=n.style??"",a.style.transform=`translate3d(0, ${this.host.getRowTop(n.boundary)}px, 0)`);let i=this.host.root.getBoundingClientRect();e.preview.hidden=!1,e.preview.textContent=o?n?.text??this.outsideText():this.outsideText(),e.preview.style.transform=`translate3d(${M(e.clientX-i.left+16,8,Math.max(8,i.width-224))}px, ${M(e.clientY-i.top+16,8,Math.max(8,i.height-48))}px, 0)`}u(){let e=this.drag;this.drag=null,window.removeEventListener("pointermove",this.s),window.removeEventListener("pointerup",this.a),window.removeEventListener("pointercancel",this.n),window.removeEventListener("keydown",this.l),window.removeEventListener("blur",this.n),cancelAnimationFrame(this.t),this.t=0,this.host.root?.classList.remove("mach-root--row-dragging"),this.host.root?.querySelectorAll(".mach-row--drag-source").forEach(t=>t.classList.remove("mach-row--drag-source")),e?.indicators.forEach(t=>t.remove()),e?.preview.remove()}destroy(){this.u(),this.release(),cancelAnimationFrame(this.r),this.r=0}};var Z=class extends Q{constructor(t,n,o){super(t);this.bridge=t;this.prepare=n;this.requestFocus=o;this.scope=null;this.i=!1}e(t,n,o){try{return n()}catch(i){return this.scope&&(this.scope.failed=!0),this.bridge.report(i,t),o}}p(t){return this.e("prepare",()=>{let n=this.bridge.capture(t),o=this.prepare(t);return this.scope={node:t,from:t.rowIndex,guard:n,session:o,sourceDecision:!0,failed:!1},this.scope.sourceDecision=o.validate(),this.scope},null)}start(t,n){this.destroy(),this.p(n)&&this.current()&&this.begin(t)}moveWithKeyboard(t,n){this.destroy();let o=this.p(n);if(!(!o||!this.current())){this.i=!0;try{let i=t.key==="ArrowUp"?-1:1,a=this.e("keyboardTarget",()=>o.session.keyboardTarget(i),void 0);a&&this.commitDrop(this.destination(a,i<0?0:1))}finally{this.i=!1,this.release()}}}isSource(t){return this.draggingSource(t.id)}current(){return!!(this.scope&&!this.scope.failed&&this.scope.guard.current()&&this.bridge.api.rows.getById(this.scope.node.id)===this.scope.node)}sourceContains(t){return this.e("isSource",()=>this.scope?.session.isSource(t)??!1,!1)}release(){this.scope=null}outsideText(){return this.bridge.api.getOption("locale")?.rowDragOutside??"\u79FB\u56DE\u8868\u683C\u5185\u653E\u7F6E \xB7 Esc \u53D6\u6D88"}describe(t){let n=this.bridge.api,o=M(this.host.findRowAt(t),0,n.rows.getCount()-1),i=n.rows.getAt(o);if(i?.isDetail&&(i=n.rows.getById(i.masterId)),!i)return null;let a=this.host.getRowTop(i.rowIndex),d=this.host.getRowTop(i.rowIndex+1)-a;return this.destination(i,(t-a)/Math.max(1,d))}destination(t,n){let o=this.scope,i=n<.5?"before":"after",a=this.host.getRowTop(t.rowIndex+1)-this.host.getRowTop(t.rowIndex),d=this.e("resolve",()=>o.session.resolve({targetNode:t,position:i,fraction:n,height:a}),!1),c=typeof o.sourceDecision=="string"?o.sourceDecision:typeof d=="string"?d:"\u6B64\u4F4D\u7F6E\u4E0D\u53EF\u653E\u7F6E",l={node:t,fraction:n,boundary:t.rowIndex,valid:!1,text:c};if(!d||typeof d=="string"||o.sourceDecision!==!0||t.loading||t.treeLoading||t.isGroup)return l;l.intent=d.intent,l.position=d.intent.position,l.toIndex=d.toIndex,l.targetIndex=d.targetIndex,l.boundary=d.indicatorIndex??t.rowIndex+ +(d.intent.position==="after"),l.style=d.indicatorStyle,l.text=d.text??c;let h=this.e("canDrop",()=>this.bridge.api.getOption("rowDragPolicy")?.canDrop?.({node:o.node,api:this.bridge.api,targetNode:t,intent:d.intent})??!0,!1);return l.valid=h===!0,typeof h=="string"&&(l.text=h),l}commitDrop(t){let n=this.scope;if(!n||!this.current()||this.e("validate",()=>n.session.validate(),!1)!==!0||!this.current())return!1;let o=this.destination(t.node,t.fraction);return!o.valid||!o.intent||!this.current()?!1:(this.i&&this.requestFocus(o.intent,i=>this.focusHandle(n.node.id,i)),this.bridge.emit(n.node,n.from,o.toIndex,o.targetIndex,o.intent),!0)}};function U(r,e,t){let n=[],o=[...r].reverse().map(a=>({row:a,parent:null})),i=new Set;for(;o.length;){let a=o.pop();if(i.has(a.row))throw new Error("[MachTable] Installed order contains duplicate or cyclic rows.");i.add(a.row),n.push(a);let d=t?a.row[e]??[]:[];for(let c=d.length-1;c>=0;c--)o.push({row:d[c],parent:a.row})}return n}function H(r,e,t,n){try{let o=U(r,t,n);return o.length===e.length&&o.every((i,a)=>i.row===e[a].row&&i.parent===e[a].parent)}catch{return!1}}function pe(r){let e=[];return r?.rows.forEach(t=>e.push({node:t,data:t.data})),e}function Y(r,e){if(!r)return!0;if(r.isDestroyed())return!1;let t=0,n=!0;return r.rows.forEach(o=>{let i=e[t++];(i?.node!==o||i.data!==o.data)&&(n=!1)}),n&&t===e.length}var ee=class{constructor(){this.entries=[];this.cursor=0}get canUndo(){return this.cursor>0}get canRedo(){return this.cursor<this.entries.length}peek(e){return this.entries[e==="undo"?this.cursor-1:this.cursor]}commit(e,t){e==="undo"?this.cursor--:e==="redo"?this.cursor++:(this.entries.splice(this.cursor),this.entries.push(t),this.entries.length>50&&this.entries.shift(),this.cursor=this.entries.length)}clear(){this.entries=[],this.cursor=0}};var P=class extends Error{constructor(t="The row order changed on the server. Reload before trying again.",n){super(t);this.serverRevision=n;this.name="RowOrderConflictError"}};function Ze(r){if(r?.status==="conflict")throw new P(r.message,r.revision);return r?.revision}function Se(r){if(r.targetId===null)throw new Error("[MachTable] Row ordering requires an existing destination.");return{...r,targetId:r.targetId}}function Ae(r){let e={status:"idle",error:null,revision:r.getRevision?.(),plan:null,canUndo:!1,canRedo:!1},t=0,n=!1,o=null,i=null,a=null,d=()=>{},c=()=>{},l=0,h=null,f=new ee,x=null,E=new Set,S=r.childrenKey??"children",I=null,A=()=>{f.clear(),x=null},u=()=>{if(!o)return!1;let s=o;return t++,o=null,i=null,s.abort(),!0},y=(s=e.status)=>({canUndo:!n&&s!=="saving"&&f.canUndo,canRedo:!n&&s!=="saving"&&f.canRedo}),m=s=>{e=Object.freeze({...s,...y(s.status)}),a&&!a.isDestroyed()&&a.view.refreshCells();let p=[w=>r.onStateChange?.(w),...E];for(let w of p)try{w?.(e)}catch(b){console.error("[MachTable] Row order state observer failed",b)}},v=()=>r.getRevision?.()??e.revision,g=(s=h)=>{s?.release(),h===s&&(h=null)},_=()=>{!i||i()||(u(),A(),g(),m({...e,status:"idle",plan:null,error:null}))},C=s=>new Z(s,p=>Ee(s.api,p,r.getRows(),r,r.treeData===!0,v()),(p,w)=>{g();let b=document.activeElement,T=N=>{N.target!==b&&N.target!==document.body&&g(R)},R={api:s.api,intent:p,restore:w,generation:t+1,release:()=>document.removeEventListener("focusin",T,!0)};h=R,document.addEventListener("focusin",T,!0)}),L=()=>{_(),!o&&x&&(x.api!==a||x.revision!==v()||!Y(a,x.nodes)||!H(r.getRows(),x.rows,S,r.treeData===!0))&&A();let s=y();(e.canUndo!==s.canUndo||e.canRedo!==s.canRedo)&&(e=Object.freeze({...e,...s}))},G=s=>{if(s===a){_(),le(s,C)||(c(),c=ce(s,C));return}let p=u();d(),c(),g(),A(),a=s,c=ce(s,C),d=s.on("cellValueChanged",()=>{l++;let w=f.canUndo||f.canRedo;A(),w&&m({...e,status:o?"saving":"idle",plan:o?e.plan:null,error:null})}),p&&m({...e,status:"idle",plan:null,error:null})},z=s=>{if(L(),n)throw new Error("[MachTable] The row order controller is disposed.");if(o)throw new Error("[MachTable] A row order save is already in progress.");let p=v();if(p!==void 0&&s.expectedRevision!==void 0&&s.expectedRevision!==p)throw new P;let w={...s,expectedRevision:s.expectedRevision??p};return(r.treeData?V:X)(r.getRows(),w,r)},he=async(s,p,w,b,T)=>{if(!s.changed)return s;let R=a;if(R&&!J(R))throw new Error("[MachTable] Save or discard edited rows before changing their order.");let N=++t;I=null;let $=new AbortController;o=$,i=null;let W=v(),Le=l,F=null,q=[],ye=!1,te=!1,re=W,me=D=>{if(!T)return;if(!D||T!==h||T.api!==a){g(T);return}let O=x;T.restore(()=>{let oe=O!==null&&O===x&&O.revision===v()&&Y(T.api,O.nodes)&&H(r.getRows(),O.rows,S,r.treeData===!0)&&h===T&&!n&&t===T.generation&&a===T.api&&le(T.api,C);return g(T),oe})},k=()=>!n&&t===N,ne=()=>k()&&(!R||a===R&&!R.isDestroyed())&&F!==null&&v()===W&&Y(R,q)&&H(r.getRows(),F,S,r.treeData===!0),ke=D=>{if(!ne()){k()&&!F&&m({...e,status:"error",error:D,plan:s});return}let O=!R||J(R),B=O?D:Object.assign(new Error("[MachTable] Row order could not be saved. Automatic rollback was skipped to preserve new edits. Save or discard those edits, then reload the row order."),{cause:D});if(O){i=null;try{r.applyRows(s.before),te=!0}catch(oe){B=Object.assign(new Error("[MachTable] Row order could not be saved or restored. Reload the row order before trying again."),{cause:D,rollbackError:oe})}}k()&&(te||A(),m({...e,status:D instanceof P?"conflict":"error",error:B}))},Ge=()=>{if(!k()){me(!1);return}let D=v(),O=!1;ye&&k()&&(D===W||D===re)&&Y(R,q)&&H(r.getRows(),F,S,r.treeData===!0)?(x={rows:F,nodes:q,api:R,revision:D},O=!0):te&&k()?(x={rows:U(r.getRows(),S,r.treeData===!0),nodes:pe(R),api:R,revision:D},O=H(r.getRows(),U(s.before,S,r.treeData===!0),S,r.treeData===!0)):A(),o===$&&(o=null,i=null,a&&!a.isDestroyed()&&a.view.refreshCells()),k()&&e.status==="saving"&&m({...e,status:"idle",plan:null}),L(),me(O)};try{r.applyRows(s.after),F=U(r.getRows(),S,r.treeData===!0),q=pe(R);let D=r.getRows(),O=q[0]?.node;if(i=R&&O?()=>!R.isDestroyed()&&R.rows.getById(O.id)===O:()=>r.getRows()===D,m({...e,status:"saving",error:null,plan:s}),!ne())return s;let B=Ze(await Oe(Promise.resolve(r.save?.(s.intent,{signal:$.signal,plan:s,operation:p,operations:w})),$.signal));return ne()&&(ye=!0,re=B??W,l===Le?f.commit(p,b):A(),m({...e,status:"saved",revision:re})),s}catch(D){throw ke(D),D}finally{Ge()}},we=async(s,p)=>{p!==h&&(p=void 0),h!==p&&g();let w=z(s);w.changed||g(p);let b=w.changed?Te(w,r,r.treeData===!0):[];return he(w,"move",[w.intent],{plan:w,inverse:b},p)},Ce=s=>we(s),ge=async s=>{if(g(),L(),n||o)throw new Error("[MachTable] Row ordering is unavailable while disposed or saving.");let p=f.peek(s);if(!p)throw new Error(`[MachTable] Nothing to ${s}.`);let w=(s==="undo"?p.inverse:[p.plan.intent]).map(N=>({...N,expectedRevision:v()})),b=r.getRows(),T=s==="undo"?p.plan.before:p.plan.after;Ie(b,T,w,r,r.treeData===!0);let R={before:b,after:T,intent:w[0],rowIds:p.plan.rowIds,changed:!0};return he(R,s,w,p)},Me=s=>{try{if(n||o)return!1;let p=r.getRows(),w=v();if(w!==void 0&&s.expectedRevision!==void 0&&s.expectedRevision!==w)return!1;let b=I?.rowIds===s.rowIds?I.sources:JSON.stringify(s.rowIds.map(String));return(!I||I.rows!==p||I.revision!==w||I.sources!==b)&&(I={rows:p,revision:w,sources:b,rowIds:s.rowIds,validate:Re(p,s.rowIds,r,r.treeData===!0)}),I.rowIds=s.rowIds,I.validate(s),!0}catch(p){return p instanceof Error?p.message:!1}},Pe=s=>{let p=s.intent;if(s.applied||!p)return;G(s.api);let w=t,b=h?.intent===p?h:void 0;Promise.resolve().then(()=>we(Se(p),b)).catch(T=>{b&&b.generation!==t&&g(b),!n&&t===w&&e.status!=="saving"&&m({...e,status:T instanceof P?"conflict":"error",error:T})})},fe=s=>n?!1:(G(s),o?"Wait for the current row order to finish saving.":J(s)||"Save or discard edited rows before changing their order.");return{get state(){return L(),e},bindings:{applyRowDrag:!1,rowDragPolicy:{canDrag:({api:s})=>fe(s),canDrop:({intent:s,api:p})=>{let w=fe(p);if(w!==!0)return w;try{return Me(Se(s))}catch(b){return b instanceof Error?b.message:!1}},getRevision:v},onRowDragEnd:Pe},preview:z,move:Ce,undo:()=>ge("undo"),redo:()=>ge("redo"),subscribe(s){return n?()=>{}:(E.add(s),()=>{E.delete(s)})},dispose(){n=!0,t++,o?.abort(),o=null,i=null,d(),c(),g(),A(),a&&!a.isDestroyed()&&a.view.refreshCells(),a=null,I=null,E.clear(),e=Object.freeze({...e,status:"idle",error:null,plan:null,canUndo:!1,canRedo:!1})}}}0&&(module.exports={RowOrderConflictError,createRowOrderController,moveTreeNodes,reorderRows});
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { c as GridOptions } from './api-pOhyuSQk.cjs';
|
|
2
|
+
|
|
3
|
+
/** Persist relative business IDs instead of viewport indexes or fractional ranks. */
|
|
4
|
+
interface RowOrderIntent {
|
|
5
|
+
rowIds: readonly string[];
|
|
6
|
+
targetId: string;
|
|
7
|
+
position: "before" | "after" | "inside";
|
|
8
|
+
expectedRevision?: string | number;
|
|
9
|
+
beforeId?: string | null;
|
|
10
|
+
afterId?: string | null;
|
|
11
|
+
}
|
|
12
|
+
interface RowOrderConstraint<TData> {
|
|
13
|
+
row: TData;
|
|
14
|
+
previousParent: TData | null;
|
|
15
|
+
parent: TData | null;
|
|
16
|
+
target: TData;
|
|
17
|
+
intent: RowOrderIntent;
|
|
18
|
+
}
|
|
19
|
+
interface RowOrderOptions<TData> {
|
|
20
|
+
rowKey: string | ((row: TData) => string | number);
|
|
21
|
+
/** Direct child-array property. Defaults to `children` for tree operations. */
|
|
22
|
+
childrenKey?: keyof TData & string;
|
|
23
|
+
/** Return a reason to make an invalid destination explainable to the user. */
|
|
24
|
+
canMove?(context: RowOrderConstraint<TData>): boolean | string;
|
|
25
|
+
}
|
|
26
|
+
interface RowOrderPlan<TData> {
|
|
27
|
+
before: readonly TData[];
|
|
28
|
+
after: readonly TData[];
|
|
29
|
+
intent: RowOrderIntent;
|
|
30
|
+
/** Selected descendants travel with their selected ancestor exactly once. */
|
|
31
|
+
rowIds: readonly string[];
|
|
32
|
+
changed: boolean;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** Pure stable-ID move. Input arrays and row objects are never mutated. */
|
|
36
|
+
declare function reorderRows<T>(rows: readonly T[], intent: RowOrderIntent, options: RowOrderOptions<T>): RowOrderPlan<T>;
|
|
37
|
+
/** Moves selected subtrees together, sharing every untouched branch by identity. */
|
|
38
|
+
declare function moveTreeNodes<T>(rows: readonly T[], intent: RowOrderIntent, options: RowOrderOptions<T>): RowOrderPlan<T>;
|
|
39
|
+
|
|
40
|
+
type Revision = string | number;
|
|
41
|
+
type RowOrderOperation = "move" | "undo" | "redo";
|
|
42
|
+
interface RowOrderSaveContext<TData> {
|
|
43
|
+
signal: AbortSignal;
|
|
44
|
+
plan: RowOrderPlan<TData>;
|
|
45
|
+
operation: RowOrderOperation;
|
|
46
|
+
/** Apply the complete ordered batch in one revision CAS, or persist plan.after atomically. */
|
|
47
|
+
operations: readonly RowOrderIntent[];
|
|
48
|
+
}
|
|
49
|
+
type RowOrderSaveResult = {
|
|
50
|
+
status?: "saved";
|
|
51
|
+
revision?: Revision;
|
|
52
|
+
} | {
|
|
53
|
+
status: "conflict";
|
|
54
|
+
revision?: Revision;
|
|
55
|
+
message?: string;
|
|
56
|
+
};
|
|
57
|
+
interface RowOrderState<TData> {
|
|
58
|
+
status: "idle" | "saving" | "saved" | "error" | "conflict";
|
|
59
|
+
error: unknown | null;
|
|
60
|
+
revision?: Revision;
|
|
61
|
+
plan: RowOrderPlan<TData> | null;
|
|
62
|
+
canUndo: boolean;
|
|
63
|
+
canRedo: boolean;
|
|
64
|
+
}
|
|
65
|
+
interface RowOrderControllerOptions<TData> extends RowOrderOptions<TData> {
|
|
66
|
+
getRows(): readonly TData[];
|
|
67
|
+
/** Install a complete immutable model. Refuse dirty edits before replacing grid data. */
|
|
68
|
+
applyRows(rows: readonly TData[]): void;
|
|
69
|
+
treeData?: boolean;
|
|
70
|
+
getRevision?(): Revision | undefined;
|
|
71
|
+
save?(intent: RowOrderIntent, context: RowOrderSaveContext<TData>): Promise<void | RowOrderSaveResult>;
|
|
72
|
+
onStateChange?(state: Readonly<RowOrderState<TData>>): void;
|
|
73
|
+
}
|
|
74
|
+
interface RowOrderController<TData> {
|
|
75
|
+
readonly state: Readonly<RowOrderState<TData>>;
|
|
76
|
+
bindings: Pick<GridOptions<TData>, "applyRowDrag" | "rowDragPolicy" | "onRowDragEnd"> & {
|
|
77
|
+
applyRowDrag: false;
|
|
78
|
+
};
|
|
79
|
+
preview(intent: RowOrderIntent): RowOrderPlan<TData>;
|
|
80
|
+
move(intent: RowOrderIntent): Promise<RowOrderPlan<TData>>;
|
|
81
|
+
undo(): Promise<RowOrderPlan<TData>>;
|
|
82
|
+
redo(): Promise<RowOrderPlan<TData>>;
|
|
83
|
+
subscribe(listener: (state: Readonly<RowOrderState<TData>>) => void): () => void;
|
|
84
|
+
dispose(): void;
|
|
85
|
+
}
|
|
86
|
+
declare class RowOrderConflictError extends Error {
|
|
87
|
+
readonly serverRevision?: Revision | undefined;
|
|
88
|
+
constructor(message?: string, serverRevision?: Revision | undefined);
|
|
89
|
+
}
|
|
90
|
+
/** Optimistic ordering owns only its own installed model and in-flight save. */
|
|
91
|
+
declare function createRowOrderController<T>(options: RowOrderControllerOptions<T>): RowOrderController<T>;
|
|
92
|
+
|
|
93
|
+
export { RowOrderConflictError, type RowOrderConstraint, type RowOrderController, type RowOrderControllerOptions, type RowOrderIntent, type RowOrderOperation, type RowOrderOptions, type RowOrderPlan, type RowOrderSaveContext, type RowOrderSaveResult, type RowOrderState, createRowOrderController, moveTreeNodes, reorderRows };
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { c as GridOptions } from './api-pOhyuSQk.js';
|
|
2
|
+
|
|
3
|
+
/** Persist relative business IDs instead of viewport indexes or fractional ranks. */
|
|
4
|
+
interface RowOrderIntent {
|
|
5
|
+
rowIds: readonly string[];
|
|
6
|
+
targetId: string;
|
|
7
|
+
position: "before" | "after" | "inside";
|
|
8
|
+
expectedRevision?: string | number;
|
|
9
|
+
beforeId?: string | null;
|
|
10
|
+
afterId?: string | null;
|
|
11
|
+
}
|
|
12
|
+
interface RowOrderConstraint<TData> {
|
|
13
|
+
row: TData;
|
|
14
|
+
previousParent: TData | null;
|
|
15
|
+
parent: TData | null;
|
|
16
|
+
target: TData;
|
|
17
|
+
intent: RowOrderIntent;
|
|
18
|
+
}
|
|
19
|
+
interface RowOrderOptions<TData> {
|
|
20
|
+
rowKey: string | ((row: TData) => string | number);
|
|
21
|
+
/** Direct child-array property. Defaults to `children` for tree operations. */
|
|
22
|
+
childrenKey?: keyof TData & string;
|
|
23
|
+
/** Return a reason to make an invalid destination explainable to the user. */
|
|
24
|
+
canMove?(context: RowOrderConstraint<TData>): boolean | string;
|
|
25
|
+
}
|
|
26
|
+
interface RowOrderPlan<TData> {
|
|
27
|
+
before: readonly TData[];
|
|
28
|
+
after: readonly TData[];
|
|
29
|
+
intent: RowOrderIntent;
|
|
30
|
+
/** Selected descendants travel with their selected ancestor exactly once. */
|
|
31
|
+
rowIds: readonly string[];
|
|
32
|
+
changed: boolean;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** Pure stable-ID move. Input arrays and row objects are never mutated. */
|
|
36
|
+
declare function reorderRows<T>(rows: readonly T[], intent: RowOrderIntent, options: RowOrderOptions<T>): RowOrderPlan<T>;
|
|
37
|
+
/** Moves selected subtrees together, sharing every untouched branch by identity. */
|
|
38
|
+
declare function moveTreeNodes<T>(rows: readonly T[], intent: RowOrderIntent, options: RowOrderOptions<T>): RowOrderPlan<T>;
|
|
39
|
+
|
|
40
|
+
type Revision = string | number;
|
|
41
|
+
type RowOrderOperation = "move" | "undo" | "redo";
|
|
42
|
+
interface RowOrderSaveContext<TData> {
|
|
43
|
+
signal: AbortSignal;
|
|
44
|
+
plan: RowOrderPlan<TData>;
|
|
45
|
+
operation: RowOrderOperation;
|
|
46
|
+
/** Apply the complete ordered batch in one revision CAS, or persist plan.after atomically. */
|
|
47
|
+
operations: readonly RowOrderIntent[];
|
|
48
|
+
}
|
|
49
|
+
type RowOrderSaveResult = {
|
|
50
|
+
status?: "saved";
|
|
51
|
+
revision?: Revision;
|
|
52
|
+
} | {
|
|
53
|
+
status: "conflict";
|
|
54
|
+
revision?: Revision;
|
|
55
|
+
message?: string;
|
|
56
|
+
};
|
|
57
|
+
interface RowOrderState<TData> {
|
|
58
|
+
status: "idle" | "saving" | "saved" | "error" | "conflict";
|
|
59
|
+
error: unknown | null;
|
|
60
|
+
revision?: Revision;
|
|
61
|
+
plan: RowOrderPlan<TData> | null;
|
|
62
|
+
canUndo: boolean;
|
|
63
|
+
canRedo: boolean;
|
|
64
|
+
}
|
|
65
|
+
interface RowOrderControllerOptions<TData> extends RowOrderOptions<TData> {
|
|
66
|
+
getRows(): readonly TData[];
|
|
67
|
+
/** Install a complete immutable model. Refuse dirty edits before replacing grid data. */
|
|
68
|
+
applyRows(rows: readonly TData[]): void;
|
|
69
|
+
treeData?: boolean;
|
|
70
|
+
getRevision?(): Revision | undefined;
|
|
71
|
+
save?(intent: RowOrderIntent, context: RowOrderSaveContext<TData>): Promise<void | RowOrderSaveResult>;
|
|
72
|
+
onStateChange?(state: Readonly<RowOrderState<TData>>): void;
|
|
73
|
+
}
|
|
74
|
+
interface RowOrderController<TData> {
|
|
75
|
+
readonly state: Readonly<RowOrderState<TData>>;
|
|
76
|
+
bindings: Pick<GridOptions<TData>, "applyRowDrag" | "rowDragPolicy" | "onRowDragEnd"> & {
|
|
77
|
+
applyRowDrag: false;
|
|
78
|
+
};
|
|
79
|
+
preview(intent: RowOrderIntent): RowOrderPlan<TData>;
|
|
80
|
+
move(intent: RowOrderIntent): Promise<RowOrderPlan<TData>>;
|
|
81
|
+
undo(): Promise<RowOrderPlan<TData>>;
|
|
82
|
+
redo(): Promise<RowOrderPlan<TData>>;
|
|
83
|
+
subscribe(listener: (state: Readonly<RowOrderState<TData>>) => void): () => void;
|
|
84
|
+
dispose(): void;
|
|
85
|
+
}
|
|
86
|
+
declare class RowOrderConflictError extends Error {
|
|
87
|
+
readonly serverRevision?: Revision | undefined;
|
|
88
|
+
constructor(message?: string, serverRevision?: Revision | undefined);
|
|
89
|
+
}
|
|
90
|
+
/** Optimistic ordering owns only its own installed model and in-flight save. */
|
|
91
|
+
declare function createRowOrderController<T>(options: RowOrderControllerOptions<T>): RowOrderController<T>;
|
|
92
|
+
|
|
93
|
+
export { RowOrderConflictError, type RowOrderConstraint, type RowOrderController, type RowOrderControllerOptions, type RowOrderIntent, type RowOrderOperation, type RowOrderOptions, type RowOrderPlan, type RowOrderSaveContext, type RowOrderSaveResult, type RowOrderState, createRowOrderController, moveTreeNodes, reorderRows };
|
package/dist/ordering.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var ke=new Set(["__proto__","prototype","constructor"]);function Ge(r){return typeof r!="string"||r.length===0?!1:r.split(".").every(t=>t.length>0&&!ke.has(t))}function j(r,e){if(r==null||!Ge(e))return;if(e.indexOf(".")<0)return r[e];let n=r,o=0;for(;o<e.length;){if(n==null)return;let i=e.indexOf(".",o);if(i<0){n=n[e.slice(o)];break}n=n[e.slice(o,i)],o=i+1}return n}function Ne(r,e){let t=typeof e.rowKey=="function"?e.rowKey(r):j(r,e.rowKey);if(t==null||String(t).length===0)throw new Error("[MachTable] Row ordering requires a non-empty stable row key.");return String(t)}function Fe(r,e){let t=r[e];if(t==null)return[];if(!Array.isArray(t))throw new Error(`[MachTable] Tree ordering expects an array at "${e}".`);return t}function K(r,e,t,n){let o={entries:[],byId:new Map,byRow:new Map,children:new Map([[null,r]])},i=[...r].reverse().map(d=>({row:d,parentId:null,selectedAncestor:!1})),a=t.childrenKey??"children";for(;i.length;){let d=i.pop(),c=Ne(d.row,t);if(o.byId.has(c))throw new Error(`[MachTable] Row ordering found duplicate or cyclic row key "${c}".`);let l=n?Fe(d.row,a):[],h={...d,id:c,children:l};o.entries.push(h),o.byId.set(c,h),o.byRow.set(h.row,h),o.children.set(c,l);for(let f=l.length-1;f>=0;f--)i.push({row:l[f],parentId:c,selectedAncestor:d.selectedAncestor||e.has(c)})}return o}function He(r){if(!["before","after","inside"].includes(r.position))throw new Error("[MachTable] Unknown row ordering position.");let e=[...new Set(r.rowIds.map(String))];if(!e.length)throw new Error("[MachTable] Row ordering requires at least one source row.");return{...r,rowIds:e,targetId:String(r.targetId)}}function ne(r,e){for(let n of e)if(!r.byId.has(n))throw new Error(`[MachTable] Ordering source "${n}" is unavailable.`);let t=new Set(e);return{selected:t,moved:r.entries.filter(n=>t.has(n.id)&&!n.selectedAncestor)}}function ve(r,e,t,n){let o=r.byId.get(t.targetId);if(!o)throw new Error(`[MachTable] Ordering target "${t.targetId}" is unavailable.`);if(e.selected.has(o.id)||o.selectedAncestor)throw new Error("[MachTable] A row cannot be moved into or relative to its own subtree.");let i=t.position==="inside"?o.id:o.parentId,a=i===null?null:r.byId.get(i).row;if(n.canMove)for(let d of e.moved){let c=d.parentId===null?null:r.byId.get(d.parentId).row,l=n.canMove({row:d.row,previousParent:c,parent:a,target:o.row,intent:t});if(l===!1||typeof l=="string")throw new Error(typeof l=="string"?l:"[MachTable] This row cannot be moved to the selected parent.")}return i}function be(r,e,t,n){let o=[...new Set(e.map(String))];if(!o.length)throw new Error("[MachTable] Row ordering requires at least one source row.");let i=K(r,new Set(o),t,n),a=ne(i,o);return d=>{if(!n&&d.position==="inside")throw new Error("[MachTable] Flat rows cannot have child destinations.");ve(i,a,d,t)}}function qe(r,e,t,n){let o=new Set(e.map(l=>l.id)),i=new Map;for(let l of e)i.has(l.parentId)||i.set(l.parentId,r.children.get(l.parentId).filter(h=>!o.has(r.byRow.get(h).id)));let a=i.get(t)??r.children.get(t),d=a.findIndex(l=>l===r.byId.get(n.targetId).row),c=n.position==="inside"?a.length:d+ +(n.position==="after");return i.set(t,[...a.slice(0,c),...e.map(l=>l.row),...a.slice(c)]),i}function me(r,e){return r.length===e.length&&r.every((t,n)=>t===e[n])}function Be(r,e,t,n){let o=new Map,i=n.childrenKey??"children";for(let d=e.entries.length-1;d>=0;d--){let c=e.entries[d],h=(t.get(c.id)??c.children).map(f=>o.get(f)??f);me(c.children,h)||o.set(c.row,{...c.row,[i]:h})}let a=(t.get(null)??r).map(d=>o.get(d)??d);return me(r,a)?r:a}function Ke(r,e,t,n){let o=t.indexOf(e[0].row),i=o+e.length;return{...r,rowIds:e.map(a=>a.id),beforeId:o>0?n.byRow.get(t[o-1]).id:null,afterId:i<t.length?n.byRow.get(t[i]).id:null}}function Re(r,e,t){let n=K(r.before,new Set(r.rowIds),e,t),o=new Map;for(let i of n.children.values())i.forEach((a,d)=>o.set(n.byRow.get(a).id,d));return ne(n,r.rowIds).moved.reverse().map(i=>{let a=n.children.get(i.parentId),d=o.get(i.id),c=a[d+1];if(c)return{rowIds:[i.id],targetId:n.byRow.get(c).id,position:"before"};if(i.parentId!==null)return{rowIds:[i.id],targetId:i.parentId,position:"inside"};let l=a[d-1];if(!l)throw new Error("[MachTable] Row ordering cannot restore an isolated root.");return{rowIds:[i.id],targetId:n.byRow.get(l).id,position:"after"}})}function Te(r,e,t,n,o){if(!n.canMove)return;let i=K(r,new Set,n,o),a=K(e,new Set,n,o);for(let d of t)for(let c of d.rowIds){let l=i.byId.get(c),h=a.byId.get(c),f=h.parentId===null?null:i.byId.get(h.parentId).row,x=l.parentId===null?null:i.byId.get(l.parentId).row,E=n.canMove({row:l.row,previousParent:x,parent:f,target:i.byId.get(d.targetId).row,intent:d});if(E===!1||typeof E=="string")throw new Error(typeof E=="string"?E:"[MachTable] This row cannot be restored to its previous parent.")}}function Ie(r,e,t,n){let o=He(e);if(!n&&o.position==="inside")throw new Error("[MachTable] Flat rows cannot have child destinations.");let i=K(r,new Set(o.rowIds),t,n),{moved:a,selected:d}=ne(i,o.rowIds),c=ve(i,{moved:a,selected:d},o,t),l=qe(i,a,c,o),h=Be(r,i,l,t),f=Ke(o,a,l.get(c),i);return{before:r,after:h,intent:f,rowIds:f.rowIds,changed:r!==h}}function oe(r,e,t){return Ie(r,e,t,!1)}function ie(r,e,t){return Ie(r,e,t,!0)}function ae(r,e,t){let n=document.createElement(r);if(e&&(n.className=e),t)for(let o of Object.keys(t))n.setAttribute(o,t[o]);return n}function M(r,e,t){return r<e?e:r>t?t:r}var se=Symbol.for("mach-table.adapter.lifecycle.v1");function X(r){return!r.isDestroyed()&&(r[se]?.canReplaceData()??!1)}function de(r,e){let t=r[se]?.rowDrag;return t?.original===e&&t.policy===r.getOption("rowDragPolicy")}function le(r,e){let t=r[se];if(!t)return()=>{};t.rowDrag?.activeInteraction?.destroy();let n={original:e,policy:r.getOption("rowDragPolicy"),factory:o=>(n.activeInteraction=e(o),n.activeInteraction)};return t.rowDrag=n,()=>{n.activeInteraction?.destroy(),t.rowDrag===n&&(t.rowDrag=void 0)}}function De(r,e){return new Promise((t,n)=>{let o=()=>n(Object.assign(new Error("[MachTable] Operation cancelled."),{name:"AbortError"}));if(r.then(t,n).finally(()=>e.removeEventListener("abort",o)),e.aborted){o();return}e.addEventListener("abort",o,{once:!0})})}function ce(r,e,t){return r.replace("{a}",String(e)).replace("{b}",String(t))}function Ue(r,e,t){return r&&e>.25&&e<.75?"inside":t}function Oe(r,e){let t=0,n=r.length;for(;t<n;){let o=t+n>>>1;r[o]<e?t=o+1:n=o}return t}function Ye(r,e,t,n,o,i){let a=r.getOption("locale")??{},d=e>1?ce(a.rowDragSelection??"\u5DF2\u9009 {a} \u884C \u2192 \u7B2C {b} \u884C",e,n+1):ce(a.rowDragPosition??"\u7B2C {a} \u884C \u2192 \u7B2C {b} \u884C",t+1,n+1),c=o==="inside"?a.rowDragInside??"\u79FB\u5165":o==="before"?a.rowDragBefore??"\u4E4B\u524D":a.rowDragAfter??"\u4E4B\u540E";return{text:`${d} \xB7 ${c}`,indicatorStyle:o==="inside"?`height:${i}px;background:color-mix(in srgb,var(--mach-primary) 12%,transparent);box-shadow:inset 0 0 0 1px var(--mach-primary)`:void 0}}function _e(r,e,t){let n={parents:new Map,siblings:new Map([[null,[]]]),depths:new Map},o=[...r].reverse().map(a=>({row:a,parent:null,depth:0})),i=e.childrenKey??"children";for(;o.length;){let{row:a,parent:d,depth:c}=o.pop(),l=String(typeof e.rowKey=="function"?e.rowKey(a):j(a,e.rowKey));if(n.depths.has(l))throw new Error("[MachTable] Row ordering requires unique, acyclic row keys.");n.depths.set(l,c),n.siblings.get(d).push(l),n.siblings.set(l,[]),d!==null&&n.parents.set(l,d);let h=t?a[i]:void 0;if(h!=null&&!Array.isArray(h))throw new Error("[MachTable] Row ordering children must be an array.");for(let f=(h?.length??0)-1;f>=0;f--)o.push({row:h[f],parent:l,depth:c+1})}return n}function xe(r,e,t,n,o,i){let a=new Map;r.rows.forEach(u=>{!u.loading&&!u.isDetail&&!u.isGroup&&u.data!=null&&a.set(u.id,u)});let d=_e(t,n,o),c=new Set(e.selected?[...d.depths.keys()].filter(u=>a.get(u)?.selected):[e.id]),l=[...c],h=u=>{let y=u;for(;y!==void 0;){if(c.has(y))return!0;y=d.parents.get(y)}return!1},f=new Map,x=new Map;for(let[u,y]of d.siblings){let m=y.filter(v=>!c.has(v));f.set(u,m),m.forEach((v,g)=>x.set(v,g))}let E=new Map,S=[],I=[],A=0;r.rows.forEachDisplayed(u=>{h(u.id)&&S.push(u.rowIndex),A=u.rowIndex+1;let y=d.depths.get(u.id)??0;for(;I.length&&(d.depths.get(I[I.length-1].id)??0)>=y;)E.set(I.pop().id,u.rowIndex);d.siblings.get(u.id)?.length&&I.push(u)});for(let u of I)E.set(u.id,A);return{rowIds:l,isSource:h,validate:()=>{for(let u of l){let y=a.get(u);if(y.treeLoading)return!1;let m=r.getOption("rowDragPolicy")?.canDrag?.({node:y,api:r});if(m===!1||typeof m=="string")return m}return!0},resolve:({targetNode:u,position:y,fraction:m,height:v})=>{let g=Ue(o,m,y);if(h(u.id))return"Cannot target own subtree.";if(!o&&g==="inside")return!1;let _=g==="inside"?u.id:d.parents.get(u.id)??null,C=f.get(_)??[],P=g==="inside"?C.length:(x.get(u.id)??0)+ +(g==="after"),G=g==="before"?u.rowIndex:E.get(u.id)??u.rowIndex+1,z=G-Oe(S,G)+Oe(S,e.rowIndex);return{intent:{rowIds:l,targetId:u.id,position:g,beforeId:C[P-1]??null,afterId:C[P]??null,expectedRevision:i},indicatorIndex:g==="inside"?u.rowIndex:g==="after"?E.get(u.id):void 0,toIndex:G,targetIndex:z,...Ye(r,l.length,e.rowIndex,u.rowIndex,g,v)}},keyboardTarget:u=>{let y=e.id;for(;c.has(d.parents.get(y)??"");)y=d.parents.get(y);let m=d.siblings.get(d.parents.get(y)??null)??[],v=m.indexOf(y)+u;for(;v>=0&&v<m.length;){let g=m[v];if(!h(g)&&a.has(g))return a.get(g);v+=u}}}}var V=class{constructor(e){this.host=e;this.drag=null;this.t=0;this.r=0;this.s=e=>{let t=this.drag;if(!(!t||e.pointerId!==t.pointerId)){if(t.clientX=e.clientX,t.clientY=e.clientY,!t.active){if(Math.abs(e.clientY-t.startY)<5)return;t.active=!0,this.host.root.classList.add("mach-root--row-dragging"),this.host.root.querySelectorAll(".mach-row").forEach(n=>n.classList.toggle("mach-row--drag-source",this.sourceContains(n.dataset.id??"")))}this.d()}};this.h=()=>{if(this.t=0,!!this.drag?.active){if(!this.current()){this.destroy();return}this.c(),this.g()&&this.d()}};this.a=e=>{let t=this.drag;if(!(!t||e.pointerId!==t.pointerId)){t.clientX=e.clientX,t.clientY=e.clientY,t.active&&this.current()&&this.c(),this.u();try{t.active&&t.drop?.valid&&this.o(e.clientX,e.clientY)&&this.current()&&this.commitDrop(t.drop)}finally{this.release()}}};this.l=e=>{e.key==="Escape"&&(e.preventDefault(),this.destroy())};this.n=e=>{e.type==="pointercancel"&&e.pointerId!==this.drag?.pointerId||this.destroy()}}begin(e){let t=this.host.containers.map(o=>{let i=ae("div","mach-row-drop-indicator");return i.hidden=!0,o.append(i),i}),n=ae("div","mach-row-drag-preview");n.setAttribute("role","status"),n.hidden=!0,this.host.root.append(n),this.drag={startY:e.clientY,clientX:e.clientX,clientY:e.clientY,pointerId:e.pointerId,indicators:t,preview:n,drop:null,active:!1},window.addEventListener("pointermove",this.s),window.addEventListener("pointerup",this.a),window.addEventListener("pointercancel",this.n),window.addEventListener("keydown",this.l),window.addEventListener("blur",this.n)}draggingSource(e){return this.drag?.active===!0&&this.sourceContains(e)}focusHandle(e,t=()=>!0){this.r=requestAnimationFrame(()=>{this.r=0,t()&&[...this.host.root.querySelectorAll(".mach-row-drag-handle")].find(n=>n.closest(".mach-row")?.dataset.id===e)?.focus()})}d(){this.t||(this.t=requestAnimationFrame(this.h))}o(e,t,n=0){let o=this.host.body.getBoundingClientRect();return e>=o.left&&e<=o.right&&t>=o.top-n&&t<=o.bottom+n}g(){let e=this.drag;if(!e||!this.o(e.clientX,e.clientY,28))return!1;let t=this.host.viewport,n=t.getBoundingClientRect(),o=Math.min(36,n.height/3);if(o<=0)return!1;let i=e.clientY<n.top+o?-Math.ceil(14*M((n.top+o-e.clientY)/o,0,1)):Math.ceil(14*M((e.clientY-n.bottom+o)/o,0,1)),a=t.scrollTop;return t.scrollTop=M(a+i,0,Math.max(0,t.scrollHeight-t.clientHeight)),t.scrollTop!==a}c(){let e=this.drag;if(!e?.active)return;let t=e.clientY-this.host.viewport.getBoundingClientRect().top+this.host.viewport.scrollTop,n=this.describe(t);e.drop=n;let o=this.o(e.clientX,e.clientY);for(let a of e.indicators)a.hidden=!o||!n?.valid,n&&(a.dataset.dropPosition=n.position??"",a.style.cssText=n.style??"",a.style.transform=`translate3d(0, ${this.host.getRowTop(n.boundary)}px, 0)`);let i=this.host.root.getBoundingClientRect();e.preview.hidden=!1,e.preview.textContent=o?n?.text??this.outsideText():this.outsideText(),e.preview.style.transform=`translate3d(${M(e.clientX-i.left+16,8,Math.max(8,i.width-224))}px, ${M(e.clientY-i.top+16,8,Math.max(8,i.height-48))}px, 0)`}u(){let e=this.drag;this.drag=null,window.removeEventListener("pointermove",this.s),window.removeEventListener("pointerup",this.a),window.removeEventListener("pointercancel",this.n),window.removeEventListener("keydown",this.l),window.removeEventListener("blur",this.n),cancelAnimationFrame(this.t),this.t=0,this.host.root?.classList.remove("mach-root--row-dragging"),this.host.root?.querySelectorAll(".mach-row--drag-source").forEach(t=>t.classList.remove("mach-row--drag-source")),e?.indicators.forEach(t=>t.remove()),e?.preview.remove()}destroy(){this.u(),this.release(),cancelAnimationFrame(this.r),this.r=0}};var J=class extends V{constructor(t,n,o){super(t);this.bridge=t;this.prepare=n;this.requestFocus=o;this.scope=null;this.i=!1}e(t,n,o){try{return n()}catch(i){return this.scope&&(this.scope.failed=!0),this.bridge.report(i,t),o}}p(t){return this.e("prepare",()=>{let n=this.bridge.capture(t),o=this.prepare(t);return this.scope={node:t,from:t.rowIndex,guard:n,session:o,sourceDecision:!0,failed:!1},this.scope.sourceDecision=o.validate(),this.scope},null)}start(t,n){this.destroy(),this.p(n)&&this.current()&&this.begin(t)}moveWithKeyboard(t,n){this.destroy();let o=this.p(n);if(!(!o||!this.current())){this.i=!0;try{let i=t.key==="ArrowUp"?-1:1,a=this.e("keyboardTarget",()=>o.session.keyboardTarget(i),void 0);a&&this.commitDrop(this.destination(a,i<0?0:1))}finally{this.i=!1,this.release()}}}isSource(t){return this.draggingSource(t.id)}current(){return!!(this.scope&&!this.scope.failed&&this.scope.guard.current()&&this.bridge.api.rows.getById(this.scope.node.id)===this.scope.node)}sourceContains(t){return this.e("isSource",()=>this.scope?.session.isSource(t)??!1,!1)}release(){this.scope=null}outsideText(){return this.bridge.api.getOption("locale")?.rowDragOutside??"\u79FB\u56DE\u8868\u683C\u5185\u653E\u7F6E \xB7 Esc \u53D6\u6D88"}describe(t){let n=this.bridge.api,o=M(this.host.findRowAt(t),0,n.rows.getCount()-1),i=n.rows.getAt(o);if(i?.isDetail&&(i=n.rows.getById(i.masterId)),!i)return null;let a=this.host.getRowTop(i.rowIndex),d=this.host.getRowTop(i.rowIndex+1)-a;return this.destination(i,(t-a)/Math.max(1,d))}destination(t,n){let o=this.scope,i=n<.5?"before":"after",a=this.host.getRowTop(t.rowIndex+1)-this.host.getRowTop(t.rowIndex),d=this.e("resolve",()=>o.session.resolve({targetNode:t,position:i,fraction:n,height:a}),!1),c=typeof o.sourceDecision=="string"?o.sourceDecision:typeof d=="string"?d:"\u6B64\u4F4D\u7F6E\u4E0D\u53EF\u653E\u7F6E",l={node:t,fraction:n,boundary:t.rowIndex,valid:!1,text:c};if(!d||typeof d=="string"||o.sourceDecision!==!0||t.loading||t.treeLoading||t.isGroup)return l;l.intent=d.intent,l.position=d.intent.position,l.toIndex=d.toIndex,l.targetIndex=d.targetIndex,l.boundary=d.indicatorIndex??t.rowIndex+ +(d.intent.position==="after"),l.style=d.indicatorStyle,l.text=d.text??c;let h=this.e("canDrop",()=>this.bridge.api.getOption("rowDragPolicy")?.canDrop?.({node:o.node,api:this.bridge.api,targetNode:t,intent:d.intent})??!0,!1);return l.valid=h===!0,typeof h=="string"&&(l.text=h),l}commitDrop(t){let n=this.scope;if(!n||!this.current()||this.e("validate",()=>n.session.validate(),!1)!==!0||!this.current())return!1;let o=this.destination(t.node,t.fraction);return!o.valid||!o.intent||!this.current()?!1:(this.i&&this.requestFocus(o.intent,i=>this.focusHandle(n.node.id,i)),this.bridge.emit(n.node,n.from,o.toIndex,o.targetIndex,o.intent),!0)}};function U(r,e,t){let n=[],o=[...r].reverse().map(a=>({row:a,parent:null})),i=new Set;for(;o.length;){let a=o.pop();if(i.has(a.row))throw new Error("[MachTable] Installed order contains duplicate or cyclic rows.");i.add(a.row),n.push(a);let d=t?a.row[e]??[]:[];for(let c=d.length-1;c>=0;c--)o.push({row:d[c],parent:a.row})}return n}function H(r,e,t,n){try{let o=U(r,t,n);return o.length===e.length&&o.every((i,a)=>i.row===e[a].row&&i.parent===e[a].parent)}catch{return!1}}function ue(r){let e=[];return r?.rows.forEach(t=>e.push({node:t,data:t.data})),e}function Y(r,e){if(!r)return!0;if(r.isDestroyed())return!1;let t=0,n=!0;return r.rows.forEach(o=>{let i=e[t++];(i?.node!==o||i.data!==o.data)&&(n=!1)}),n&&t===e.length}var Q=class{constructor(){this.entries=[];this.cursor=0}get canUndo(){return this.cursor>0}get canRedo(){return this.cursor<this.entries.length}peek(e){return this.entries[e==="undo"?this.cursor-1:this.cursor]}commit(e,t){e==="undo"?this.cursor--:e==="redo"?this.cursor++:(this.entries.splice(this.cursor),this.entries.push(t),this.entries.length>50&&this.entries.shift(),this.cursor=this.entries.length)}clear(){this.entries=[],this.cursor=0}};var k=class extends Error{constructor(t="The row order changed on the server. Reload before trying again.",n){super(t);this.serverRevision=n;this.name="RowOrderConflictError"}};function ze(r){if(r?.status==="conflict")throw new k(r.message,r.revision);return r?.revision}function Ee(r){if(r.targetId===null)throw new Error("[MachTable] Row ordering requires an existing destination.");return{...r,targetId:r.targetId}}function $e(r){let e={status:"idle",error:null,revision:r.getRevision?.(),plan:null,canUndo:!1,canRedo:!1},t=0,n=!1,o=null,i=null,a=null,d=()=>{},c=()=>{},l=0,h=null,f=new Q,x=null,E=new Set,S=r.childrenKey??"children",I=null,A=()=>{f.clear(),x=null},u=()=>{if(!o)return!1;let s=o;return t++,o=null,i=null,s.abort(),!0},y=(s=e.status)=>({canUndo:!n&&s!=="saving"&&f.canUndo,canRedo:!n&&s!=="saving"&&f.canRedo}),m=s=>{e=Object.freeze({...s,...y(s.status)}),a&&!a.isDestroyed()&&a.view.refreshCells();let p=[w=>r.onStateChange?.(w),...E];for(let w of p)try{w?.(e)}catch(b){console.error("[MachTable] Row order state observer failed",b)}},v=()=>r.getRevision?.()??e.revision,g=(s=h)=>{s?.release(),h===s&&(h=null)},_=()=>{!i||i()||(u(),A(),g(),m({...e,status:"idle",plan:null,error:null}))},C=s=>new J(s,p=>xe(s.api,p,r.getRows(),r,r.treeData===!0,v()),(p,w)=>{g();let b=document.activeElement,T=N=>{N.target!==b&&N.target!==document.body&&g(R)},R={api:s.api,intent:p,restore:w,generation:t+1,release:()=>document.removeEventListener("focusin",T,!0)};h=R,document.addEventListener("focusin",T,!0)}),P=()=>{_(),!o&&x&&(x.api!==a||x.revision!==v()||!Y(a,x.nodes)||!H(r.getRows(),x.rows,S,r.treeData===!0))&&A();let s=y();(e.canUndo!==s.canUndo||e.canRedo!==s.canRedo)&&(e=Object.freeze({...e,...s}))},G=s=>{if(s===a){_(),de(s,C)||(c(),c=le(s,C));return}let p=u();d(),c(),g(),A(),a=s,c=le(s,C),d=s.on("cellValueChanged",()=>{l++;let w=f.canUndo||f.canRedo;A(),w&&m({...e,status:o?"saving":"idle",plan:o?e.plan:null,error:null})}),p&&m({...e,status:"idle",plan:null,error:null})},z=s=>{if(P(),n)throw new Error("[MachTable] The row order controller is disposed.");if(o)throw new Error("[MachTable] A row order save is already in progress.");let p=v();if(p!==void 0&&s.expectedRevision!==void 0&&s.expectedRevision!==p)throw new k;let w={...s,expectedRevision:s.expectedRevision??p};return(r.treeData?ie:oe)(r.getRows(),w,r)},pe=async(s,p,w,b,T)=>{if(!s.changed)return s;let R=a;if(R&&!X(R))throw new Error("[MachTable] Save or discard edited rows before changing their order.");let N=++t;I=null;let $=new AbortController;o=$,i=null;let W=v(),Me=l,F=null,q=[],fe=!1,Z=!1,ee=W,ye=D=>{if(!T)return;if(!D||T!==h||T.api!==a){g(T);return}let O=x;T.restore(()=>{let re=O!==null&&O===x&&O.revision===v()&&Y(T.api,O.nodes)&&H(r.getRows(),O.rows,S,r.treeData===!0)&&h===T&&!n&&t===T.generation&&a===T.api&&de(T.api,C);return g(T),re})},L=()=>!n&&t===N,te=()=>L()&&(!R||a===R&&!R.isDestroyed())&&F!==null&&v()===W&&Y(R,q)&&H(r.getRows(),F,S,r.treeData===!0),Pe=D=>{if(!te()){L()&&!F&&m({...e,status:"error",error:D,plan:s});return}let O=!R||X(R),B=O?D:Object.assign(new Error("[MachTable] Row order could not be saved. Automatic rollback was skipped to preserve new edits. Save or discard those edits, then reload the row order."),{cause:D});if(O){i=null;try{r.applyRows(s.before),Z=!0}catch(re){B=Object.assign(new Error("[MachTable] Row order could not be saved or restored. Reload the row order before trying again."),{cause:D,rollbackError:re})}}L()&&(Z||A(),m({...e,status:D instanceof k?"conflict":"error",error:B}))},Le=()=>{if(!L()){ye(!1);return}let D=v(),O=!1;fe&&L()&&(D===W||D===ee)&&Y(R,q)&&H(r.getRows(),F,S,r.treeData===!0)?(x={rows:F,nodes:q,api:R,revision:D},O=!0):Z&&L()?(x={rows:U(r.getRows(),S,r.treeData===!0),nodes:ue(R),api:R,revision:D},O=H(r.getRows(),U(s.before,S,r.treeData===!0),S,r.treeData===!0)):A(),o===$&&(o=null,i=null,a&&!a.isDestroyed()&&a.view.refreshCells()),L()&&e.status==="saving"&&m({...e,status:"idle",plan:null}),P(),ye(O)};try{r.applyRows(s.after),F=U(r.getRows(),S,r.treeData===!0),q=ue(R);let D=r.getRows(),O=q[0]?.node;if(i=R&&O?()=>!R.isDestroyed()&&R.rows.getById(O.id)===O:()=>r.getRows()===D,m({...e,status:"saving",error:null,plan:s}),!te())return s;let B=ze(await De(Promise.resolve(r.save?.(s.intent,{signal:$.signal,plan:s,operation:p,operations:w})),$.signal));return te()&&(fe=!0,ee=B??W,l===Me?f.commit(p,b):A(),m({...e,status:"saved",revision:ee})),s}catch(D){throw Pe(D),D}finally{Le()}},he=async(s,p)=>{p!==h&&(p=void 0),h!==p&&g();let w=z(s);w.changed||g(p);let b=w.changed?Re(w,r,r.treeData===!0):[];return pe(w,"move",[w.intent],{plan:w,inverse:b},p)},Se=s=>he(s),we=async s=>{if(g(),P(),n||o)throw new Error("[MachTable] Row ordering is unavailable while disposed or saving.");let p=f.peek(s);if(!p)throw new Error(`[MachTable] Nothing to ${s}.`);let w=(s==="undo"?p.inverse:[p.plan.intent]).map(N=>({...N,expectedRevision:v()})),b=r.getRows(),T=s==="undo"?p.plan.before:p.plan.after;Te(b,T,w,r,r.treeData===!0);let R={before:b,after:T,intent:w[0],rowIds:p.plan.rowIds,changed:!0};return pe(R,s,w,p)},Ae=s=>{try{if(n||o)return!1;let p=r.getRows(),w=v();if(w!==void 0&&s.expectedRevision!==void 0&&s.expectedRevision!==w)return!1;let b=I?.rowIds===s.rowIds?I.sources:JSON.stringify(s.rowIds.map(String));return(!I||I.rows!==p||I.revision!==w||I.sources!==b)&&(I={rows:p,revision:w,sources:b,rowIds:s.rowIds,validate:be(p,s.rowIds,r,r.treeData===!0)}),I.rowIds=s.rowIds,I.validate(s),!0}catch(p){return p instanceof Error?p.message:!1}},Ce=s=>{let p=s.intent;if(s.applied||!p)return;G(s.api);let w=t,b=h?.intent===p?h:void 0;Promise.resolve().then(()=>he(Ee(p),b)).catch(T=>{b&&b.generation!==t&&g(b),!n&&t===w&&e.status!=="saving"&&m({...e,status:T instanceof k?"conflict":"error",error:T})})},ge=s=>n?!1:(G(s),o?"Wait for the current row order to finish saving.":X(s)||"Save or discard edited rows before changing their order.");return{get state(){return P(),e},bindings:{applyRowDrag:!1,rowDragPolicy:{canDrag:({api:s})=>ge(s),canDrop:({intent:s,api:p})=>{let w=ge(p);if(w!==!0)return w;try{return Ae(Ee(s))}catch(b){return b instanceof Error?b.message:!1}},getRevision:v},onRowDragEnd:Ce},preview:z,move:Se,undo:()=>we("undo"),redo:()=>we("redo"),subscribe(s){return n?()=>{}:(E.add(s),()=>{E.delete(s)})},dispose(){n=!0,t++,o?.abort(),o=null,i=null,d(),c(),g(),A(),a&&!a.isDestroyed()&&a.view.refreshCells(),a=null,I=null,E.clear(),e=Object.freeze({...e,status:"idle",error:null,plan:null,canUndo:!1,canRedo:!1})}}}export{k as RowOrderConflictError,$e as createRowOrderController,ie as moveTreeNodes,oe as reorderRows};
|