@evotecit/canopyx 0.3.18 → 0.3.21

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.
Files changed (133) hide show
  1. package/CanopyX.Html/Assets/canopyx-board.css +12 -12
  2. package/CanopyX.Html/Assets/canopyx-board.js +1 -1
  3. package/CanopyX.Html/Assets/canopyx-calendar.css +70 -57
  4. package/CanopyX.Html/Assets/canopyx-calendar.js +14 -14
  5. package/CanopyX.Html/Assets/canopyx-cell-range.css +4 -4
  6. package/CanopyX.Html/Assets/canopyx-cell-range.js +1 -1
  7. package/CanopyX.Html/Assets/canopyx-changes.css +55 -55
  8. package/CanopyX.Html/Assets/canopyx-changes.js +1 -1
  9. package/CanopyX.Html/Assets/canopyx-column-groups.css +5 -1
  10. package/CanopyX.Html/Assets/canopyx-column-groups.js +15 -9
  11. package/CanopyX.Html/Assets/canopyx-compare.css +4 -4
  12. package/CanopyX.Html/Assets/canopyx-compare.js +1 -1
  13. package/CanopyX.Html/Assets/canopyx-detail-rows.css +4 -4
  14. package/CanopyX.Html/Assets/canopyx-detail-rows.js +1 -1
  15. package/CanopyX.Html/Assets/canopyx-editing.css +3 -3
  16. package/CanopyX.Html/Assets/canopyx-editing.js +1 -1
  17. package/CanopyX.Html/Assets/canopyx-enhance.js +2 -2
  18. package/CanopyX.Html/Assets/canopyx-export.js +8 -8
  19. package/CanopyX.Html/Assets/canopyx-facets.css +19 -18
  20. package/CanopyX.Html/Assets/canopyx-facets.js +1 -1
  21. package/CanopyX.Html/Assets/canopyx-filter-editor.css +24 -24
  22. package/CanopyX.Html/Assets/canopyx-filter-editor.js +3 -3
  23. package/CanopyX.Html/Assets/canopyx-flow-checks.css +2 -2
  24. package/CanopyX.Html/Assets/canopyx-flow-checks.js +1 -1
  25. package/CanopyX.Html/Assets/canopyx-flow-command.css +3 -3
  26. package/CanopyX.Html/Assets/canopyx-flow-command.js +1 -1
  27. package/CanopyX.Html/Assets/canopyx-flow-dialog.css +2 -2
  28. package/CanopyX.Html/Assets/canopyx-flow-dialog.js +1 -1
  29. package/CanopyX.Html/Assets/canopyx-flow-drafts.css +2 -2
  30. package/CanopyX.Html/Assets/canopyx-flow-drafts.js +1 -1
  31. package/CanopyX.Html/Assets/canopyx-flow-entry.css +24 -23
  32. package/CanopyX.Html/Assets/canopyx-flow-entry.js +4 -4
  33. package/CanopyX.Html/Assets/canopyx-flow-host.css +2 -2
  34. package/CanopyX.Html/Assets/canopyx-flow-host.js +1 -1
  35. package/CanopyX.Html/Assets/canopyx-flow-module.mjs +4 -4
  36. package/CanopyX.Html/Assets/canopyx-flow-pick.css +4 -4
  37. package/CanopyX.Html/Assets/canopyx-flow-pick.js +1 -1
  38. package/CanopyX.Html/Assets/canopyx-flow-preview.css +1 -1
  39. package/CanopyX.Html/Assets/canopyx-flow-preview.js +1 -1
  40. package/CanopyX.Html/Assets/canopyx-flow-records.css +2 -2
  41. package/CanopyX.Html/Assets/canopyx-flow-records.js +1 -1
  42. package/CanopyX.Html/Assets/canopyx-flow-tasks.css +4 -4
  43. package/CanopyX.Html/Assets/canopyx-flow-tasks.js +1 -1
  44. package/CanopyX.Html/Assets/canopyx-flow.css +41 -41
  45. package/CanopyX.Html/Assets/canopyx-flow.js +1 -1
  46. package/CanopyX.Html/Assets/canopyx-format-editor.css +9 -9
  47. package/CanopyX.Html/Assets/canopyx-format-editor.js +1 -1
  48. package/CanopyX.Html/Assets/canopyx-formatting.css +13 -13
  49. package/CanopyX.Html/Assets/canopyx-formatting.js +3 -3
  50. package/CanopyX.Html/Assets/canopyx-forms.css +3 -3
  51. package/CanopyX.Html/Assets/canopyx-forms.js +1 -1
  52. package/CanopyX.Html/Assets/canopyx-grid-module.mjs +56 -46
  53. package/CanopyX.Html/Assets/canopyx-grid-options.css +8 -8
  54. package/CanopyX.Html/Assets/canopyx-grid-options.js +9 -2
  55. package/CanopyX.Html/Assets/canopyx-grid.css +99 -96
  56. package/CanopyX.Html/Assets/canopyx-grid.js +55 -45
  57. package/CanopyX.Html/Assets/canopyx-grouping.css +7 -7
  58. package/CanopyX.Html/Assets/canopyx-grouping.js +1 -1
  59. package/CanopyX.Html/Assets/canopyx-highlight.css +10 -10
  60. package/CanopyX.Html/Assets/canopyx-highlight.js +1 -1
  61. package/CanopyX.Html/Assets/canopyx-interactive.css +50 -49
  62. package/CanopyX.Html/Assets/canopyx-interactive.js +12 -11
  63. package/CanopyX.Html/Assets/canopyx-labels-de.js +4 -0
  64. package/CanopyX.Html/Assets/canopyx-labels-es.js +4 -0
  65. package/CanopyX.Html/Assets/canopyx-labels-fr.js +4 -0
  66. package/CanopyX.Html/Assets/canopyx-labels-it.js +4 -0
  67. package/CanopyX.Html/Assets/canopyx-labels-pl.js +4 -0
  68. package/CanopyX.Html/Assets/canopyx-layouts.css +9 -9
  69. package/CanopyX.Html/Assets/canopyx-layouts.js +2 -2
  70. package/CanopyX.Html/Assets/canopyx-link.css +3 -3
  71. package/CanopyX.Html/Assets/canopyx-link.js +3 -3
  72. package/CanopyX.Html/Assets/canopyx-links.js +2 -2
  73. package/CanopyX.Html/Assets/canopyx-live.css +2 -2
  74. package/CanopyX.Html/Assets/canopyx-live.js +1 -1
  75. package/CanopyX.Html/Assets/canopyx-matrix.css +31 -31
  76. package/CanopyX.Html/Assets/canopyx-matrix.js +1 -1
  77. package/CanopyX.Html/Assets/canopyx-module.mjs +13 -12
  78. package/CanopyX.Html/Assets/canopyx-pager.css +1 -1
  79. package/CanopyX.Html/Assets/canopyx-pager.js +1 -1
  80. package/CanopyX.Html/Assets/canopyx-path.css +8 -8
  81. package/CanopyX.Html/Assets/canopyx-path.js +1 -1
  82. package/CanopyX.Html/Assets/canopyx-pivot.css +10 -10
  83. package/CanopyX.Html/Assets/canopyx-pivot.js +3 -3
  84. package/CanopyX.Html/Assets/canopyx-plan.css +24 -17
  85. package/CanopyX.Html/Assets/canopyx-plan.js +13 -9
  86. package/CanopyX.Html/Assets/canopyx-record-panel.css +47 -42
  87. package/CanopyX.Html/Assets/canopyx-record-panel.js +16 -9
  88. package/CanopyX.Html/Assets/canopyx-reporting-module.mjs +59 -56
  89. package/CanopyX.Html/Assets/canopyx-reporting.css +104 -101
  90. package/CanopyX.Html/Assets/canopyx-reporting.js +58 -55
  91. package/CanopyX.Html/Assets/canopyx-stack.css +6 -6
  92. package/CanopyX.Html/Assets/canopyx-stack.js +1 -1
  93. package/CanopyX.Html/Assets/canopyx-time-slider.css +5 -5
  94. package/CanopyX.Html/Assets/canopyx-time-slider.js +1 -1
  95. package/CanopyX.Html/Assets/canopyx-timeline.css +19 -19
  96. package/CanopyX.Html/Assets/canopyx-timeline.js +2 -2
  97. package/CanopyX.Html/Assets/canopyx-tree-tools.css +21 -21
  98. package/CanopyX.Html/Assets/canopyx-tree-tools.js +3 -3
  99. package/CanopyX.Html/Assets/canopyx-ui-accordion.css +119 -0
  100. package/CanopyX.Html/Assets/canopyx-ui-accordion.js +33 -0
  101. package/CanopyX.Html/Assets/canopyx-ui-menu.css +7 -7
  102. package/CanopyX.Html/Assets/canopyx-ui-menu.js +1 -1
  103. package/CanopyX.Html/Assets/canopyx-ui-module.mjs +39 -0
  104. package/CanopyX.Html/Assets/canopyx-ui-navigation.css +9 -9
  105. package/CanopyX.Html/Assets/canopyx-ui-navigation.js +5 -5
  106. package/CanopyX.Html/Assets/canopyx-ui-overlays.css +5 -5
  107. package/CanopyX.Html/Assets/canopyx-ui-overlays.js +5 -2
  108. package/CanopyX.Html/Assets/canopyx-ui-picker.css +2 -2
  109. package/CanopyX.Html/Assets/canopyx-ui-picker.js +1 -1
  110. package/CanopyX.Html/Assets/canopyx-ui-stepper.css +12 -12
  111. package/CanopyX.Html/Assets/canopyx-ui-stepper.js +1 -1
  112. package/CanopyX.Html/Assets/canopyx-ui-tabs.css +9 -8
  113. package/CanopyX.Html/Assets/canopyx-ui-tabs.js +7 -4
  114. package/CanopyX.Html/Assets/canopyx-ui.css +119 -0
  115. package/CanopyX.Html/Assets/canopyx-ui.js +37 -0
  116. package/CanopyX.Html/Assets/canopyx-view-intents.css +1 -1
  117. package/CanopyX.Html/Assets/canopyx-view-intents.js +1 -1
  118. package/CanopyX.Html/Assets/canopyx.css +47 -46
  119. package/CanopyX.Html/Assets/canopyx.js +12 -11
  120. package/JavaScript/column-groups.d.ts +24 -4
  121. package/JavaScript/grid.d.ts +11 -1
  122. package/JavaScript/hosts.d.ts +2 -0
  123. package/JavaScript/locales/de.mjs +4 -0
  124. package/JavaScript/locales/es.mjs +4 -0
  125. package/JavaScript/locales/fr.mjs +4 -0
  126. package/JavaScript/locales/it.mjs +4 -0
  127. package/JavaScript/locales/pl.mjs +4 -0
  128. package/JavaScript/protocol.d.ts +3 -0
  129. package/JavaScript/records.d.ts +2 -0
  130. package/JavaScript/ui.d.ts +70 -2
  131. package/README.md +76 -206
  132. package/README.nuget.md +63 -87
  133. package/package.json +14 -1
@@ -18,14 +18,14 @@ background-position:top,bottom,left,right,0 0;background-repeat:no-repeat;
18
18
  .cx-data-grid .cx-row .cx-cell.cx-range-fill{outline:var(--cx-size-1px) dashed var(--cx-range-edge);outline-offset:calc(-1 * var(--hfx-focus-width,2px));}
19
19
  .cx-data-grid .cx-row .cx-cell:is(.cx-range,.cx-range-fill):not([data-cx-pin]){position:relative;}
20
20
  .cx-data-grid :is(.cx-range-handle,.cx-fill-handle){position:absolute;z-index:6;box-sizing:border-box;background:var(--cx-range-edge);touch-action:none;}
21
- .cx-data-grid .cx-range-handle{width:var(--cx-size-14px);height:var(--cx-size-14px);border:var(--cx-size-2px) solid var(--hfx-color-surface,light-dark(#ffffff,#16181c));border-radius:50%;box-shadow:0 0 0 var(--cx-size-1px) var(--cx-range-edge);}
21
+ .cx-data-grid .cx-range-handle{width:var(--cx-size-14px);height:var(--cx-size-14px);border:var(--cx-size-2px) solid var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));border-radius:50%;box-shadow:0 0 0 var(--cx-size-1px) var(--cx-range-edge);}
22
22
  .cx-data-grid .cx-range-handle-start{left:0;top:0;}
23
23
  .cx-data-grid .cx-range-handle-end{right:0;bottom:0;}
24
- .cx-data-grid .cx-fill-handle{right:0;bottom:0;width:var(--cx-size-7px);height:var(--cx-size-7px);border:var(--cx-size-1px) solid var(--hfx-color-surface,light-dark(#ffffff,#16181c));cursor:crosshair;}
24
+ .cx-data-grid .cx-fill-handle{right:0;bottom:0;width:var(--cx-size-7px);height:var(--cx-size-7px);border:var(--cx-size-1px) solid var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));cursor:crosshair;}
25
25
  .cx-data-grid .cx-fill-handle::before{content:"";position:absolute;inset:calc(var(--cx-size-6px) * -1);}
26
26
  .cx-data-grid .cx-paste-report{display:grid;grid-template-columns:1fr auto;align-items:center;gap:var(--cx-size-4px) var(--cx-size-8px);margin:0 0 var(--cx-size-6px);
27
- padding:var(--cx-size-6px) var(--cx-size-6px) var(--cx-size-6px) var(--cx-size-12px);border:var(--cx-size-1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));border-left:var(--cx-size-3px) solid var(--hfx-color-status-warn-fg,light-dark(#8c5c05,#eeb640));
28
- border-radius:var(--hfx-radius-sm,4px);background:var(--hfx-color-surface,light-dark(#ffffff,#16181c));font-size:var(--cx-size-13px);}
27
+ padding:var(--cx-size-6px) var(--cx-size-6px) var(--cx-size-6px) var(--cx-size-12px);border:var(--cx-size-1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));border-left:var(--cx-size-3px) solid var(--hfx-color-status-warn-fg,light-dark(#8c5c05,#eeb640));
28
+ border-radius:var(--hfx-radius-sm,4px);background:var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));font-size:var(--cx-size-13px);}
29
29
  .cx-data-grid .cx-paste-report p{margin:0;}
30
30
  .cx-data-grid .cx-paste-report details{grid-column:1 / -1;}
31
31
  .cx-data-grid .cx-paste-report summary{cursor:pointer;color:var(--hfx-color-accent-text,var(--hfx-color-accent,light-dark(#11776f,#37c9b8)));}
@@ -1,4 +1,4 @@
1
- (function(global){"use strict";const installed=new WeakSet();const part={version:"53c37a658f4f7afb",requires:["ui-menu"],install(context){if(installed.has(context.DataGrid.prototype))return;const{toneVariable,bindContextMenu,DataGrid,h,setText,fill,columnWidth,foldText,gridButton,gridIcon,gridDecorateButton,cellText,cellValue,isCellObject,numberFormat,gridFreeze,gridMomentFromParts,requireIdentifier,loadGridFilterEditor,CELL_CONTROLS,reachable,gridExportField}=context;const CR_LIMIT=200000;const crBad=problem=>{throw new Error("CanopyX: "+problem+".")};function crOptions(grid){const declared=grid.opts.rangeSelection??grid.view.rangeSelection,clipboard=Object.assign({},grid.view.clipboard,grid.opts.clipboard);const object=declared!==null&&typeof declared==="object"&&!Array.isArray(declared),range=object?declared:{};const flag=value=>value===undefined||typeof value==="boolean";if(declared!==undefined&&typeof declared!=="boolean"&&!object||!flag(range.enabled)||!flag(range.multiple)||!flag(range.fillHandle)||
1
+ (function(global){"use strict";const installed=new WeakSet();const part={version:"cb29468954702795",requires:["ui-menu"],install(context){if(installed.has(context.DataGrid.prototype))return;const{toneVariable,bindContextMenu,DataGrid,h,setText,fill,columnWidth,foldText,gridButton,gridIcon,gridDecorateButton,cellText,cellValue,isCellObject,numberFormat,gridFreeze,gridMomentFromParts,requireIdentifier,loadGridFilterEditor,CELL_CONTROLS,reachable,gridExportField}=context;const CR_LIMIT=200000;const crBad=problem=>{throw new Error("CanopyX: "+problem+".")};function crOptions(grid){const declared=grid.opts.rangeSelection??grid.view.rangeSelection,clipboard=Object.assign({},grid.view.clipboard,grid.opts.clipboard);const object=declared!==null&&typeof declared==="object"&&!Array.isArray(declared),range=object?declared:{};const flag=value=>value===undefined||typeof value==="boolean";if(declared!==undefined&&typeof declared!=="boolean"&&!object||!flag(range.enabled)||!flag(range.multiple)||!flag(range.fillHandle)||
2
2
  !flag(clipboard.copyHeaders)||!flag(clipboard.paste)||clipboard.copyValues!==undefined&&!["display","raw"].includes(clipboard.copyValues))
3
3
  crBad("rangeSelection takes true or { enabled, multiple, fillHandle }, and clipboard { copyHeaders, copyValues, paste }");return Object.freeze({enabled:declared===true||object&&range.enabled!==false,multiple:range.multiple!==false,fillHandle:!!range.fillHandle,headers:!!clipboard.copyHeaders,values:clipboard.copyValues||"display",paste:clipboard.paste!==false})}
4
4
  const crRows=grid=>grid.rowProjection||grid;function crBounds(grid){if(grid.rowProjection)return{first:0,last:grid.rowProjection.rowCount()- 1};const bounds=grid.rowBounds();return{first:Math.max(0,bounds.first),last:bounds.last}}
@@ -1,6 +1,6 @@
1
1
  /* The change views: a text diff,a change list and a propagation view (docs/changes.md). Tones mark what changed,and each change also
2
2
  has a sign,a badge or a symbol,so none relies on colour alone. */
3
- .cx-diff,.cx-changes,.cx-prop{--cx-size-112px:112px;--cx-size-150px:150px;--cx-chg-tint:9%;--cx-chg-strong:28%;min-width:0;color:var(--hfx-color-text,light-dark(#16181c,#f2f3f5));font:var(--hfx-control-font-size,calc(var(--hfx-type-body-size,0.875rem) - var(--cx-compact,0) * .0625rem))/1.4 var(--hfx-font-sans,"Segoe UI Variable Text","Segoe UI",system-ui,-apple-system,"Helvetica Neue",Arial,sans-serif);}
3
+ .cx-diff,.cx-changes,.cx-prop{--cx-size-112px:112px;--cx-size-150px:150px;--cx-chg-tint:9%;--cx-chg-strong:28%;min-width:0;color:var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)));font:var(--hfx-control-font-size,calc(var(--hfx-type-body-size,0.875rem) - var(--cx-compact,0) * .0625rem))/1.4 var(--hfx-font-sans,"Segoe UI Variable Text","Segoe UI",system-ui,-apple-system,"Helvetica Neue",Arial,sans-serif);}
4
4
  @media screen{.cx-host[data-cx-theme="dark"] :is(.cx-diff,.cx-changes,.cx-prop){--cx-chg-tint:15%;--cx-chg-strong:36%;}}
5
5
  @media screen and (prefers-color-scheme:dark){.cx-host[data-cx-theme="auto"] :is(.cx-diff,.cx-changes,.cx-prop){--cx-chg-tint:15%;--cx-chg-strong:36%;}}
6
6
  .cx-change-host:is([data-cx-height],[style*="height"]) > :is(.cx-diff,.cx-changes,.cx-prop){height:100%;overflow:auto;}
@@ -18,55 +18,55 @@
18
18
  .cx-diff-minus{color:var(--hfx-color-status-bad-fg,light-dark(#b8292a,#f47171));}
19
19
  .cx-diff-tools{display:flex;flex-wrap:wrap;align-items:center;gap:var(--cx-size-6px);}
20
20
  .cx-diff-notes{display:grid;gap:var(--cx-size-4px);}
21
- .cx-diff-note{padding:var(--cx-size-6px) var(--cx-size-10px);font-size:var(--cx-size-13px);color:var(--hfx-color-text,light-dark(#16181c,#f2f3f5));background:var(--hfx-color-hover,light-dark(#f5f5f5,#232529));border-inline-start:var(--cx-size-3px) solid var(--hfx-color-border-strong,light-dark(#cdd0d5,#363a42));border-radius:var(--hfx-radius-sm,4px);}
21
+ .cx-diff-note{padding:var(--cx-size-6px) var(--cx-size-10px);font-size:var(--cx-size-13px);color:var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)));background:var(--hfx-color-hover,light-dark(#f5f5f5,#232529));border-inline-start:var(--cx-size-3px) solid var(--hfx-color-border-strong,light-dark(#cdd0d5,#363a42));border-radius:var(--hfx-radius-sm,4px);}
22
22
  .cx-diff-note:is(.cx-tone-info,.cx-tone-warning,.cx-tone-danger,.cx-tone-success){border-inline-start-color:var(--cx-chg-note);}
23
23
  .cx-diff-note.cx-tone-info{--cx-chg-note:var(--hfx-color-status-info-fg,light-dark(#2b5fc0,#74a2f7));}
24
24
  .cx-diff-note.cx-tone-warning{--cx-chg-note:var(--hfx-color-status-warn-fg,light-dark(#8c5c05,#eeb640));}
25
25
  .cx-diff-note.cx-tone-danger{--cx-chg-note:var(--hfx-color-status-bad-fg,light-dark(#b8292a,#f47171));}
26
26
  .cx-diff-note.cx-tone-success{--cx-chg-note:var(--hfx-color-status-good-fg,light-dark(#177345,#4cc78a));}
27
- .cx-diff-state{padding:var(--cx-size-16px);color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));text-align:center;border:var(--cx-size-1px) dashed var(--hfx-color-border-strong,light-dark(#cdd0d5,#363a42));border-radius:var(--hfx-radius-control,var(--hfx-radius-md,6px));}
28
- .cx-diff-scroll{position:relative;flex:0 1 auto;min-height:0;max-height:var(--cx-diff-max-height,70vh);overflow:auto;background:var(--hfx-color-surface,light-dark(#ffffff,#16181c));border:var(--cx-size-1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));
27
+ .cx-diff-state{padding:var(--cx-size-16px);color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));text-align:center;border:var(--cx-size-1px) dashed var(--hfx-color-border-strong,light-dark(#cdd0d5,#363a42));border-radius:var(--hfx-radius-control,var(--hfx-radius-md,6px));}
28
+ .cx-diff-scroll{position:relative;flex:0 1 auto;min-height:0;max-height:var(--cx-diff-max-height,70vh);overflow:auto;background:var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));border:var(--cx-size-1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));
29
29
  border-radius:var(--hfx-radius-control,var(--hfx-radius-md,6px));font-family:var(--hfx-font-mono,"Cascadia Mono","Cascadia Code",Consolas,"SFMono-Regular",Menlo,monospace);font-size:var(--cx-size-12px);overscroll-behavior:contain;}
30
30
  .cx-change-host:is([data-cx-height],[style*="height"]) .cx-diff-scroll{flex:1 1 auto;max-height:none;}
31
31
  .cx-diff-frame{position:relative;display:flex;flex-direction:column;flex:0 1 auto;min-height:0;}
32
32
  .cx-change-host:is([data-cx-height],[style*="height"]) .cx-diff-frame{flex:1 1 auto;}
33
33
  .cx-diff-edge{position:absolute;top:calc(var(--cx-size-1px) + var(--cx-diff-head,0px));bottom:calc(var(--cx-size-1px) + var(--cx-diff-bar-x,0px));width:var(--cx-size-32px);z-index:3;pointer-events:none;
34
- --cx-diff-shade:color-mix(in srgb,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)) 26%,transparent);--cx-diff-line:color-mix(in srgb,var(--hfx-color-accent,light-dark(#11776f,#37c9b8)) 70%,transparent);}
34
+ --cx-diff-shade:color-mix(in srgb,var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5))) 26%,transparent);--cx-diff-line:color-mix(in srgb,var(--hfx-color-accent,light-dark(#11776f,#37c9b8)) 70%,transparent);}
35
35
  .cx-diff-edge-start{inset-inline-start:var(--cx-size-1px);background:linear-gradient(to right,var(--cx-diff-shade),transparent);border-inline-start:var(--cx-size-2px) solid var(--cx-diff-line);}
36
36
  .cx-diff-edge-end{inset-inline-end:calc(var(--cx-size-1px) + var(--cx-diff-bar-y,0px));background:linear-gradient(to left,var(--cx-diff-shade),transparent);border-inline-end:var(--cx-size-2px) solid var(--cx-diff-line);}
37
37
  .cx-diff-edge-start:dir(rtl){background:linear-gradient(to left,var(--cx-diff-shade),transparent);}
38
38
  .cx-diff-edge-end:dir(rtl){background:linear-gradient(to right,var(--cx-diff-shade),transparent);}
39
39
  :is(.cx-diff,.cx-changes) [data-cx-tip]{position:relative;}
40
40
  :is(.cx-diff,.cx-changes) [data-cx-tip]:not([data-cx-tip-off]):focus-visible::after{content:attr(data-cx-tip);position:absolute;bottom:calc(100% + var(--cx-size-6px));inset-inline-end:0;z-index:6;padding:var(--cx-size-2px) var(--cx-size-8px);
41
- font-size:var(--cx-size-12px);font-weight:400;line-height:1.4;white-space:nowrap;color:var(--hfx-color-surface,light-dark(#ffffff,#16181c));background:var(--hfx-color-text,light-dark(#16181c,#f2f3f5));border-radius:var(--hfx-radius-sm,4px);pointer-events:none;}
41
+ font-size:var(--cx-size-12px);font-weight:400;line-height:1.4;white-space:nowrap;color:var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));background:var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)));border-radius:var(--hfx-radius-sm,4px);pointer-events:none;}
42
42
  @media (hover:hover){
43
43
  :is(.cx-diff,.cx-changes) [data-cx-tip]:not([data-cx-tip-off]):hover::after{content:attr(data-cx-tip);position:absolute;bottom:calc(100% + var(--cx-size-6px));inset-inline-end:0;z-index:6;padding:var(--cx-size-2px) var(--cx-size-8px);
44
- font-size:var(--cx-size-12px);font-weight:400;line-height:1.4;white-space:nowrap;color:var(--hfx-color-surface,light-dark(#ffffff,#16181c));background:var(--hfx-color-text,light-dark(#16181c,#f2f3f5));border-radius:var(--hfx-radius-sm,4px);pointer-events:none;}
44
+ font-size:var(--cx-size-12px);font-weight:400;line-height:1.4;white-space:nowrap;color:var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));background:var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)));border-radius:var(--hfx-radius-sm,4px);pointer-events:none;}
45
45
  }
46
46
  .cx-diff-tools [data-cx-tip]::after{bottom:auto !important;top:calc(100% + var(--cx-size-6px));}
47
47
  .cx-diff-scroll:focus-visible{outline:var(--hfx-focus-width,2px) solid var(--hfx-color-focus-ring,light-dark(#02726a,#37c9b8));outline-offset:calc(var(--cx-size-2px) * -1);}
48
- .cx-diff-columns{position:sticky;top:0;z-index:2;display:grid;grid-template-columns:1fr 1fr;background:var(--hfx-color-surface-sunken,light-dark(#f7f8f9,#111317));border-bottom:var(--cx-size-1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));
49
- font-family:var(--hfx-font-sans,"Segoe UI Variable Text","Segoe UI",system-ui,-apple-system,"Helvetica Neue",Arial,sans-serif);font-size:var(--cx-size-12px);font-weight:600;color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));}
48
+ .cx-diff-columns{position:sticky;top:0;z-index:2;display:grid;grid-template-columns:1fr 1fr;background:var(--hfx-color-surface-sunken,light-dark(#f7f8f9,#111317));border-bottom:var(--cx-size-1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));
49
+ font-family:var(--hfx-font-sans,"Segoe UI Variable Text","Segoe UI",system-ui,-apple-system,"Helvetica Neue",Arial,sans-serif);font-size:var(--cx-size-12px);font-weight:600;color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));}
50
50
  .cx-diff-colhead{padding:var(--cx-size-4px) var(--cx-size-10px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
51
- .cx-diff-colhead + .cx-diff-colhead{border-inline-start:var(--cx-size-1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));}
51
+ .cx-diff-colhead + .cx-diff-colhead{border-inline-start:var(--cx-size-1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));}
52
52
  .cx-diff-canvas{position:relative;}
53
53
  .cx-diff-row{position:absolute;top:0;inset-inline-start:0;width:100%;height:20px;display:grid;grid-template-columns:var(--cx-diff-num) var(--cx-diff-num) 2ch minmax(0,1fr);line-height:20px;contain:layout style;}
54
54
  .cx-diff-split .cx-diff-pairrow{grid-template-columns:var(--cx-diff-num) minmax(0,1fr) var(--cx-diff-num) minmax(0,1fr);}
55
- .cx-diff-num{padding:0 var(--cx-size-8px);text-align:end;color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));font-variant-numeric:tabular-nums;user-select:none;}
56
- .cx-diff-pairrow .cx-diff-num:nth-child(3){border-inline-start:var(--cx-size-1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));}
57
- .cx-diff-sign{text-align:center;color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));user-select:none;}
55
+ .cx-diff-num{padding:0 var(--cx-size-8px);text-align:end;color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));font-variant-numeric:tabular-nums;user-select:none;}
56
+ .cx-diff-pairrow .cx-diff-num:nth-child(3){border-inline-start:var(--cx-size-1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));}
57
+ .cx-diff-sign{text-align:center;color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));user-select:none;}
58
58
  .cx-diff-code{padding-inline:var(--cx-size-6px) var(--cx-size-16px);white-space:pre;overflow:hidden;tab-size:4;}
59
59
  .cx-diff-del{--cx-chg-diff:var(--hfx-color-status-bad-fg,light-dark(#b8292a,#f47171));}
60
60
  .cx-diff-add{--cx-chg-diff:var(--hfx-color-status-good-fg,light-dark(#177345,#4cc78a));}
61
- .cx-diff-row:is(.cx-diff-del,.cx-diff-add),.cx-diff-pairrow .cx-diff-code:is(.cx-diff-del,.cx-diff-add){background:color-mix(in srgb,var(--cx-chg-diff) var(--cx-chg-tint),var(--hfx-color-surface,light-dark(#ffffff,#16181c)));}
61
+ .cx-diff-row:is(.cx-diff-del,.cx-diff-add),.cx-diff-pairrow .cx-diff-code:is(.cx-diff-del,.cx-diff-add){background:color-mix(in srgb,var(--cx-chg-diff) var(--cx-chg-tint),var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c))));}
62
62
  .cx-diff-row:is(.cx-diff-del,.cx-diff-add) :is(.cx-diff-num,.cx-diff-sign),.cx-diff-pairrow .cx-diff-num:is(.cx-diff-del,.cx-diff-add){
63
- color:color-mix(in srgb,var(--cx-chg-diff) 70%,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)));background:color-mix(in srgb,var(--cx-chg-diff) calc(var(--cx-chg-tint) * 1.8),var(--hfx-color-surface,light-dark(#ffffff,#16181c)));}
64
- .cx-diff-mark{color:inherit;text-decoration:none;border-radius:var(--cx-size-2px);background:color-mix(in srgb,var(--cx-chg-diff) var(--cx-chg-strong),var(--hfx-color-surface,light-dark(#ffffff,#16181c)));}
65
- .cx-diff-blank{background:repeating-linear-gradient(135deg,transparent 0 var(--cx-size-5px),color-mix(in srgb,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)) 55%,transparent) var(--cx-size-5px) var(--cx-size-6px));}
66
- .cx-diff-gaprow{background:var(--hfx-color-surface-sunken,light-dark(#f7f8f9,#111317));color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));}
63
+ color:color-mix(in srgb,var(--cx-chg-diff) 70%,var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5))));background:color-mix(in srgb,var(--cx-chg-diff) calc(var(--cx-chg-tint) * 1.8),var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c))));}
64
+ .cx-diff-mark{color:inherit;text-decoration:none;border-radius:var(--cx-size-2px);background:color-mix(in srgb,var(--cx-chg-diff) var(--cx-chg-strong),var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c))));}
65
+ .cx-diff-blank{background:repeating-linear-gradient(135deg,transparent 0 var(--cx-size-5px),color-mix(in srgb,var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30))) 55%,transparent) var(--cx-size-5px) var(--cx-size-6px));}
66
+ .cx-diff-gaprow{background:var(--hfx-color-surface-sunken,light-dark(#f7f8f9,#111317));color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));}
67
67
  .cx-diff-gap{grid-column:1 / -1;display:flex;align-items:center;gap:var(--cx-size-6px);padding:0 var(--cx-size-10px);font-family:var(--hfx-font-sans,"Segoe UI Variable Text","Segoe UI",system-ui,-apple-system,"Helvetica Neue",Arial,sans-serif);font-size:var(--cx-size-12px);}
68
68
  .cx-diff-expand{min-height:20px;padding:0 var(--cx-size-4px);font:inherit;color:var(--hfx-color-accent-text,light-dark(#02726a,#37c9b8));background:none;border:0;border-radius:var(--hfx-radius-sm,4px);cursor:pointer;}
69
- .cx-diff-expand::before{content:"\22EF ";color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));}
69
+ .cx-diff-expand::before{content:"\22EF ";color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));}
70
70
  .cx-diff-expand:hover{text-decoration:underline;}
71
71
  .cx-diff-current{box-shadow:inset var(--cx-size-3px) 0 0 var(--hfx-color-accent,light-dark(#11776f,#37c9b8));}
72
72
  .cx-diff-current:dir(rtl){box-shadow:inset calc(var(--cx-size-3px) * -1) 0 0 var(--hfx-color-accent,light-dark(#11776f,#37c9b8));}
@@ -78,33 +78,33 @@ color:color-mix(in srgb,var(--cx-chg-diff) 70%,var(--hfx-color-text,light-dark(#
78
78
  .cx-chg-kind{padding-inline-start:var(--hfx-space-1,0.25rem);}
79
79
  .cx-chg-count{font-size:var(--cx-size-13px);font-weight:600;font-variant-numeric:tabular-nums;}
80
80
  .cx-chg-switch{display:inline-flex;align-items:center;gap:var(--cx-size-6px);min-height:var(--cx-size-30px);font-size:var(--cx-size-13px);cursor:pointer;}
81
- .cx-chg-summary{margin-inline-start:auto;font-size:var(--cx-size-13px);color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));font-variant-numeric:tabular-nums;}
81
+ .cx-chg-summary{margin-inline-start:auto;font-size:var(--cx-size-13px);color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));font-variant-numeric:tabular-nums;}
82
82
  .cx-chg-printnote{display:none;}
83
83
  .cx-chg-tools{display:flex;flex-wrap:wrap;gap:var(--cx-size-6px);}
84
84
  .cx-chg-summary:empty ~ .cx-chg-tools{margin-inline-start:auto;}
85
85
  a.cx-chg-action{text-decoration:none;}
86
86
  .cx-chg-panel{display:grid;gap:var(--cx-size-6px);max-width:var(--cx-size-640px);margin:0 var(--cx-size-12px) var(--cx-size-10px) calc(var(--cx-size-30px) + var(--cx-size-16px));padding:var(--cx-size-10px) var(--cx-size-12px);
87
- background:var(--hfx-color-surface-sunken,light-dark(#f7f8f9,#111317));border:var(--cx-size-1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));border-radius:var(--hfx-radius-control,var(--hfx-radius-md,6px));}
87
+ background:var(--hfx-color-surface-sunken,light-dark(#f7f8f9,#111317));border:var(--cx-size-1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));border-radius:var(--hfx-radius-control,var(--hfx-radius-md,6px));}
88
88
  .cx-chg-barpanel > .cx-chg-panel{margin:var(--cx-size-8px) 0 0;}
89
89
  .cx-chg-asklabel{font-size:var(--cx-size-13px);font-weight:600;}
90
90
  .cx-chg-reasonbox{inline-size:100%;resize:vertical;}
91
91
  .cx-chg-reasonbox[aria-invalid="true"]{border-color:var(--hfx-color-status-bad-fg,light-dark(#b8292a,#f47171));}
92
- .cx-chg-hint{font-size:var(--cx-size-12px);color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));}
92
+ .cx-chg-hint{font-size:var(--cx-size-12px);color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));}
93
93
  .cx-chg-askerror{font-size:var(--cx-size-12px);font-weight:600;color:var(--hfx-color-status-bad-fg,light-dark(#b8292a,#f47171));}
94
94
  .cx-chg-askerror:empty{display:none;}
95
95
  .cx-chg-askbtns{display:flex;flex-wrap:wrap;gap:var(--cx-size-6px);}
96
96
  .cx-chg-note{margin:0;font-size:var(--cx-size-13px);}
97
97
  .cx-chg-badge{max-width:100%;overflow:hidden;text-overflow:ellipsis;}
98
98
  .cx-chg-list,.cx-chg-sublist,.cx-chg-reasons{list-style:none;margin:0;padding:0;}
99
- .cx-chg-list{border:var(--cx-size-1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));border-radius:var(--hfx-radius-control,var(--hfx-radius-md,6px));background:var(--hfx-color-surface,light-dark(#ffffff,#16181c));}
100
- .cx-chg-folder{display:flex;flex-wrap:wrap;align-items:baseline;gap:var(--cx-size-6px);padding:var(--cx-size-6px) var(--cx-size-12px);background:var(--hfx-color-surface-sunken,light-dark(#f7f8f9,#111317));border-bottom:var(--cx-size-1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));}
101
- .cx-chg-group + .cx-chg-group .cx-chg-folder{border-top:var(--cx-size-1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));}
99
+ .cx-chg-list{border:var(--cx-size-1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));border-radius:var(--hfx-radius-control,var(--hfx-radius-md,6px));background:var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));}
100
+ .cx-chg-folder{display:flex;flex-wrap:wrap;align-items:baseline;gap:var(--cx-size-6px);padding:var(--cx-size-6px) var(--cx-size-12px);background:var(--hfx-color-surface-sunken,light-dark(#f7f8f9,#111317));border-bottom:var(--cx-size-1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));}
101
+ .cx-chg-group + .cx-chg-group .cx-chg-folder{border-top:var(--cx-size-1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));}
102
102
  .cx-chg-foldername{font-family:var(--hfx-font-mono,"Cascadia Mono","Cascadia Code",Consolas,"SFMono-Regular",Menlo,monospace);font-size:var(--cx-size-12px);font-weight:600;overflow-wrap:anywhere;}
103
- .cx-chg-foldercount{font-size:var(--cx-size-12px);color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));}
104
- .cx-chg-item + .cx-chg-item{border-top:var(--cx-size-1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));}
103
+ .cx-chg-foldercount{font-size:var(--cx-size-12px);color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));}
104
+ .cx-chg-item + .cx-chg-item{border-top:var(--cx-size-1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));}
105
105
  .cx-chg-row{display:grid;grid-template-columns:var(--cx-size-30px) var(--cx-size-112px) minmax(0,1fr) auto auto;grid-template-areas:"toggle badge main meta actions";align-items:center;
106
106
  column-gap:var(--cx-size-10px);row-gap:var(--cx-size-4px);padding:var(--cx-size-6px) var(--cx-size-12px) var(--cx-size-6px) var(--cx-size-6px);}
107
- .cx-chg-toggle{grid-area:toggle;display:inline-flex;align-items:center;justify-content:center;width:var(--cx-size-30px);height:var(--cx-size-30px);padding:0;color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));background:none;border:0;border-radius:var(--hfx-radius-sm,4px);cursor:pointer;}
107
+ .cx-chg-toggle{grid-area:toggle;display:inline-flex;align-items:center;justify-content:center;width:var(--cx-size-30px);height:var(--cx-size-30px);padding:0;color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));background:none;border:0;border-radius:var(--hfx-radius-sm,4px);cursor:pointer;}
108
108
  .cx-chg-toggle .cx-chg-ico{transition:transform .12s;}
109
109
  .cx-chg-toggle[aria-expanded="true"] .cx-chg-ico{transform:rotate(90deg);}
110
110
  .cx-chg-toggle:dir(rtl) .cx-chg-ico{transform:scaleX(-1);}
@@ -113,10 +113,10 @@ column-gap:var(--cx-size-10px);row-gap:var(--cx-size-4px);padding:var(--cx-size-
113
113
  .cx-chg-main{grid-area:main;min-width:0;display:grid;gap:var(--cx-size-2px);}
114
114
  .cx-chg-title{display:flex;flex-wrap:wrap;align-items:baseline;gap:var(--cx-size-2px) var(--cx-size-8px);min-width:0;}
115
115
  .cx-chg-name{font-family:var(--hfx-font-mono,"Cascadia Mono","Cascadia Code",Consolas,"SFMono-Regular",Menlo,monospace);font-size:var(--cx-size-13px);font-weight:600;overflow-wrap:anywhere;}
116
- .cx-chg-from,.cx-chg-sub{font-size:var(--cx-size-12px);color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));overflow-wrap:anywhere;}
116
+ .cx-chg-from,.cx-chg-sub{font-size:var(--cx-size-12px);color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));overflow-wrap:anywhere;}
117
117
  .cx-chg-flags{display:flex;flex-wrap:wrap;gap:var(--cx-size-4px);}
118
118
  .cx-chg-flag{display:inline-flex;align-items:center;gap:var(--cx-size-4px);padding:var(--cx-size-1px) var(--cx-size-8px) var(--cx-size-1px) var(--cx-size-6px);font-size:var(--cx-size-12px);font-weight:600;
119
- color:var(--cx-chg-flag,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)));background:color-mix(in srgb,var(--cx-chg-flag,var(--hfx-color-text,light-dark(#16181c,#f2f3f5))) 12%,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));border-radius:var(--hfx-radius-sm,4px);}
119
+ color:var(--cx-chg-flag,var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5))));background:color-mix(in srgb,var(--cx-chg-flag,var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)))) 12%,var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c))));border-radius:var(--hfx-radius-sm,4px);}
120
120
  .cx-chg-flag .cx-chg-ico{width:var(--cx-size-12px);height:var(--cx-size-12px);}
121
121
  .cx-chg-flag.cx-tone-warning,.cx-chg-reason.cx-tone-warning{--cx-chg-flag:var(--hfx-color-status-warn-fg,light-dark(#8c5c05,#eeb640));}
122
122
  .cx-chg-flag.cx-tone-danger,.cx-chg-reason.cx-tone-danger{--cx-chg-flag:var(--hfx-color-status-bad-fg,light-dark(#b8292a,#f47171));}
@@ -126,26 +126,26 @@ color:var(--cx-chg-flag,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)));backg
126
126
  .cx-chg-size{text-align:end;font-variant-numeric:tabular-nums;white-space:nowrap;color:var(--hfx-color-text-secondary,light-dark(#4d525b,#b0b4bc));}
127
127
  .cx-chg-hash{display:inline-flex;align-items:center;gap:var(--cx-size-2px);min-width:calc(var(--cx-size-150px) + var(--cx-size-56px));white-space:nowrap;}
128
128
  .cx-chg-hashbtn{padding:var(--cx-size-1px) var(--cx-size-4px);font-family:var(--hfx-font-mono,"Cascadia Mono","Cascadia Code",Consolas,"SFMono-Regular",Menlo,monospace);font-size:var(--cx-size-12px);color:var(--hfx-color-text-secondary,light-dark(#4d525b,#b0b4bc));background:none;border:0;border-radius:var(--hfx-radius-sm,4px);cursor:copy;}
129
- .cx-chg-arrow{color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));}
129
+ .cx-chg-arrow{color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));}
130
130
  .cx-chg-actions{grid-area:actions;display:flex;gap:var(--cx-size-4px);justify-content:flex-end;}
131
131
  .cx-chg-action:not(.cx-chg-textaction){padding:0;inline-size:var(--hfx-control-height-sm,calc(28px - var(--cx-compact,0) * 4px));}
132
132
  .cx-chg-detail{display:grid;gap:var(--cx-size-10px);padding:var(--cx-size-4px) var(--cx-size-12px) var(--cx-size-12px) calc(var(--cx-size-30px) + var(--cx-size-16px));}
133
- .cx-chg-dhead{font-size:var(--cx-size-12px);font-weight:600;color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));text-transform:uppercase;letter-spacing:var(--cx-size-d04em);}
133
+ .cx-chg-dhead{font-size:var(--cx-size-12px);font-weight:600;color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));text-transform:uppercase;letter-spacing:var(--cx-size-d04em);}
134
134
  .cx-chg-reasons{display:grid;gap:var(--cx-size-4px);font-size:var(--cx-size-13px);}
135
- .cx-chg-reason{color:var(--cx-chg-flag,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)));}
135
+ .cx-chg-reason{color:var(--cx-chg-flag,var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5))));}
136
136
  .cx-chg-facts{border-collapse:collapse;font-size:var(--cx-size-13px);width:100%;max-width:var(--cx-size-640px);}
137
- .cx-chg-facts :is(th,td){padding:var(--cx-size-4px) var(--cx-size-10px);text-align:start;vertical-align:top;border-bottom:var(--cx-size-1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));}
138
- .cx-chg-facts thead th{font-size:var(--cx-size-12px);color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));font-weight:600;background:var(--hfx-color-surface-sunken,light-dark(#f7f8f9,#111317));}
139
- .cx-chg-facts tbody th{font-weight:400;color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));white-space:nowrap;}
137
+ .cx-chg-facts :is(th,td){padding:var(--cx-size-4px) var(--cx-size-10px);text-align:start;vertical-align:top;border-bottom:var(--cx-size-1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));}
138
+ .cx-chg-facts thead th{font-size:var(--cx-size-12px);color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));font-weight:600;background:var(--hfx-color-surface-sunken,light-dark(#f7f8f9,#111317));}
139
+ .cx-chg-facts tbody th{font-weight:400;color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));white-space:nowrap;}
140
140
  .cx-chg-mono{font-family:var(--hfx-font-mono,"Cascadia Mono","Cascadia Code",Consolas,"SFMono-Regular",Menlo,monospace);font-size:var(--cx-size-12px);overflow-wrap:anywhere;}
141
141
  .cx-chg-changed{font-weight:600;}
142
- .cx-chg-factnote{margin-top:var(--cx-size-2px);font-family:var(--hfx-font-sans,"Segoe UI Variable Text","Segoe UI",system-ui,-apple-system,"Helvetica Neue",Arial,sans-serif);font-size:var(--cx-size-12px);font-weight:400;color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));}
142
+ .cx-chg-factnote{margin-top:var(--cx-size-2px);font-family:var(--hfx-font-sans,"Segoe UI Variable Text","Segoe UI",system-ui,-apple-system,"Helvetica Neue",Arial,sans-serif);font-size:var(--cx-size-12px);font-weight:400;color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));}
143
143
  .cx-chg-facts.cx-chg-onevalue :is(th,td):first-child{width:28%;}
144
144
  .cx-chg-facts td.cx-tone-warning{color:var(--hfx-color-status-warn-fg,light-dark(#8c5c05,#eeb640));}
145
145
  .cx-chg-facts td.cx-tone-danger{color:var(--hfx-color-status-bad-fg,light-dark(#b8292a,#f47171));}
146
146
  .cx-chg-facts td.cx-tone-success{color:var(--hfx-color-status-good-fg,light-dark(#177345,#4cc78a));}
147
147
  .cx-chg-diff{--cx-diff-max-height:var(--cx-size-480px);min-width:0;}
148
- .cx-chg-empty{padding:var(--cx-size-16px);text-align:center;color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));border:var(--cx-size-1px) dashed var(--hfx-color-border,light-dark(#e2e4e7,#272a30));border-radius:var(--hfx-radius-control,var(--hfx-radius-md,6px));}
148
+ .cx-chg-empty{padding:var(--cx-size-16px);text-align:center;color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));border:var(--cx-size-1px) dashed var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));border-radius:var(--hfx-radius-control,var(--hfx-radius-md,6px));}
149
149
  .cx-chg-more{align-self:flex-start;}
150
150
  @container (max-width:700px){
151
151
  .cx-chg-row{grid-template-columns:var(--cx-size-30px) minmax(0,1fr) auto;grid-template-areas:"toggle badge actions" ". main main" ". meta meta";}
@@ -157,42 +157,42 @@ color:var(--cx-chg-flag,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)));backg
157
157
  .cx-prop{container-type:inline-size;display:flex;flex-direction:column;gap:var(--cx-size-10px);}
158
158
  .cx-prop-head{display:flex;flex-wrap:wrap;align-items:center;gap:var(--cx-size-6px) var(--cx-size-10px);}
159
159
  .cx-prop-summary{font-size:var(--cx-size-14px);}
160
- :is(.cx-prop-state,.cx-prop-key,.cx-prop-badge){display:inline-flex;align-items:center;gap:var(--cx-size-4px);font-weight:600;color:var(--cx-chg-state,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));}
161
- .cx-prop-state{padding:var(--cx-size-2px) var(--cx-size-8px) var(--cx-size-2px) var(--cx-size-6px);border-radius:var(--hfx-radius-sm,4px);background:color-mix(in srgb,var(--cx-chg-state,var(--hfx-color-text,light-dark(#16181c,#f2f3f5))) 10%,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));}
162
- .cx-prop-badge.cx-prop-attn{padding:0 var(--cx-size-6px) 0 var(--cx-size-4px);border-radius:var(--hfx-radius-sm,4px);background:color-mix(in srgb,var(--cx-chg-state) 12%,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));}
160
+ :is(.cx-prop-state,.cx-prop-key,.cx-prop-badge){display:inline-flex;align-items:center;gap:var(--cx-size-4px);font-weight:600;color:var(--cx-chg-state,var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d))));}
161
+ .cx-prop-state{padding:var(--cx-size-2px) var(--cx-size-8px) var(--cx-size-2px) var(--cx-size-6px);border-radius:var(--hfx-radius-sm,4px);background:color-mix(in srgb,var(--cx-chg-state,var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)))) 10%,var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c))));}
162
+ .cx-prop-badge.cx-prop-attn{padding:0 var(--cx-size-6px) 0 var(--cx-size-4px);border-radius:var(--hfx-radius-sm,4px);background:color-mix(in srgb,var(--cx-chg-state) 12%,var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c))));}
163
163
  :is(.cx-prop-state,.cx-prop-key,.cx-prop-badge,.cx-prop-fill).cx-tone-success{--cx-chg-state:var(--hfx-color-status-good-fg,light-dark(#177345,#4cc78a));}
164
164
  :is(.cx-prop-state,.cx-prop-key,.cx-prop-badge,.cx-prop-fill).cx-tone-warning{--cx-chg-state:var(--hfx-color-status-warn-fg,light-dark(#8c5c05,#eeb640));}
165
165
  :is(.cx-prop-state,.cx-prop-key,.cx-prop-badge,.cx-prop-fill).cx-tone-danger{--cx-chg-state:var(--hfx-color-status-bad-fg,light-dark(#b8292a,#f47171));}
166
- :is(.cx-prop-state,.cx-prop-key,.cx-prop-badge,.cx-prop-fill).cx-tone-muted{--cx-chg-state:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));}
166
+ :is(.cx-prop-state,.cx-prop-key,.cx-prop-badge,.cx-prop-fill).cx-tone-muted{--cx-chg-state:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));}
167
167
  .cx-prop-counts{display:flex;flex-wrap:wrap;gap:var(--cx-size-4px) var(--cx-size-16px);margin:0;padding:0;list-style:none;font-size:var(--cx-size-13px);}
168
168
  .cx-prop-count{display:inline-flex;align-items:center;gap:var(--cx-size-6px);}
169
- .cx-prop-key{font-weight:400;color:var(--hfx-color-text,light-dark(#16181c,#f2f3f5));}
169
+ .cx-prop-key{font-weight:400;color:var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)));}
170
170
  .cx-prop-key .cx-chg-ico{color:var(--cx-chg-state);}
171
171
  .cx-prop-number{font-weight:600;font-variant-numeric:tabular-nums;}
172
- .cx-prop-table{width:100%;border-collapse:collapse;font-size:var(--cx-size-13px);background:var(--hfx-color-surface,light-dark(#ffffff,#16181c));border:var(--cx-size-1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));border-radius:var(--hfx-radius-control,var(--hfx-radius-md,6px));}
173
- .cx-prop-table :is(th,td){padding:var(--cx-size-6px) var(--cx-size-10px);text-align:start;vertical-align:top;border-bottom:var(--cx-size-1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));}
174
- .cx-prop-table thead th{font-size:var(--cx-size-12px);font-weight:600;color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));background:var(--hfx-color-surface-sunken,light-dark(#f7f8f9,#111317));white-space:nowrap;}
172
+ .cx-prop-table{width:100%;border-collapse:collapse;font-size:var(--cx-size-13px);background:var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));border:var(--cx-size-1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));border-radius:var(--hfx-radius-control,var(--hfx-radius-md,6px));}
173
+ .cx-prop-table :is(th,td){padding:var(--cx-size-6px) var(--cx-size-10px);text-align:start;vertical-align:top;border-bottom:var(--cx-size-1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));}
174
+ .cx-prop-table thead th{font-size:var(--cx-size-12px);font-weight:600;color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));background:var(--hfx-color-surface-sunken,light-dark(#f7f8f9,#111317));white-space:nowrap;}
175
175
  .cx-prop-table tbody th{font-weight:600;}
176
176
  .cx-prop-group th{font-size:var(--cx-size-12px);font-weight:600;background:var(--hfx-color-row-alt,light-dark(#fafafa,#1d1f23));}
177
- .cx-prop-groupcount{font-weight:400;color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));}
177
+ .cx-prop-groupcount{font-weight:400;color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));}
178
178
  .cx-prop-name{margin-inline-end:var(--cx-size-6px);}
179
- .cx-prop-source{display:inline-block;padding:0 var(--cx-size-6px);font-size:var(--cx-size-11px);font-weight:600;color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));border:var(--cx-size-1px) solid var(--hfx-color-border-strong,light-dark(#cdd0d5,#363a42));border-radius:var(--hfx-radius-control,var(--hfx-radius-md,6px));}
180
- .cx-prop-sub,.cx-prop-delay,.cx-prop-none{display:block;font-size:var(--cx-size-12px);font-weight:400;color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));}
179
+ .cx-prop-source{display:inline-block;padding:0 var(--cx-size-6px);font-size:var(--cx-size-11px);font-weight:600;color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));border:var(--cx-size-1px) solid var(--hfx-color-border-strong,light-dark(#cdd0d5,#363a42));border-radius:var(--hfx-radius-control,var(--hfx-radius-md,6px));}
180
+ .cx-prop-sub,.cx-prop-delay,.cx-prop-none{display:block;font-size:var(--cx-size-12px);font-weight:400;color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));}
181
181
  .cx-prop-first,.cx-prop-last{white-space:nowrap;font-variant-numeric:tabular-nums;}
182
182
  .cx-prop-lanecell{width:var(--cx-size-160px);vertical-align:middle !important;}
183
183
  .cx-prop-lane{position:relative;height:var(--cx-size-8px);min-width:var(--cx-size-92px);background:var(--hfx-color-hover,light-dark(#f5f5f5,#232529));border-radius:var(--hfx-radius-control,var(--hfx-radius-md,6px));overflow:hidden;}
184
- .cx-prop-fill{height:100%;background:color-mix(in srgb,var(--cx-chg-state,var(--hfx-color-text-muted,light-dark(#626770,#8f949d))) 70%,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));border-radius:inherit;}
185
- .cx-prop-fill.cx-prop-open{background:repeating-linear-gradient(135deg,color-mix(in srgb,var(--cx-chg-state) 55%,var(--hfx-color-surface,light-dark(#ffffff,#16181c))) 0 var(--cx-size-4px),transparent var(--cx-size-4px) var(--cx-size-8px));}
184
+ .cx-prop-fill{height:100%;background:color-mix(in srgb,var(--cx-chg-state,var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)))) 70%,var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c))));border-radius:inherit;}
185
+ .cx-prop-fill.cx-prop-open{background:repeating-linear-gradient(135deg,color-mix(in srgb,var(--cx-chg-state) 55%,var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c)))) 0 var(--cx-size-4px),transparent var(--cx-size-4px) var(--cx-size-8px));}
186
186
  @container (max-width:560px){
187
187
  .cx-prop-table thead{display:none;}
188
188
  .cx-prop-table,.cx-prop-table tbody{display:block;}
189
- .cx-prop-table tr{display:grid;grid-template-columns:minmax(0,1fr) auto;grid-template-areas:"name state" "first last" "lane lane";column-gap:var(--cx-size-10px);padding:var(--cx-size-8px) var(--cx-size-10px);border-bottom:var(--cx-size-1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));}
189
+ .cx-prop-table tr{display:grid;grid-template-columns:minmax(0,1fr) auto;grid-template-areas:"name state" "first last" "lane lane";column-gap:var(--cx-size-10px);padding:var(--cx-size-8px) var(--cx-size-10px);border-bottom:var(--cx-size-1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));}
190
190
  .cx-prop-table tr.cx-prop-group{display:block;padding:var(--cx-size-6px) var(--cx-size-10px);background:var(--hfx-color-row-alt,light-dark(#fafafa,#1d1f23));}
191
191
  .cx-prop-table :is(th,td){display:block;padding:0;border:0;}
192
192
  .cx-prop-row > th{grid-area:name;}
193
193
  .cx-prop-statecell{grid-area:state;text-align:end;}
194
194
  .cx-prop-first{grid-area:first;margin-top:var(--cx-size-4px);}
195
- .cx-prop-last{grid-area:last;margin-top:var(--cx-size-4px);text-align:end;color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));}
195
+ .cx-prop-last{grid-area:last;margin-top:var(--cx-size-4px);text-align:end;color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));}
196
196
  .cx-prop-lanecell{grid-area:lane;width:auto;margin-top:var(--cx-size-6px);}
197
197
  }
198
198
  @media print{
@@ -204,9 +204,9 @@ color:var(--cx-chg-flag,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)));backg
204
204
  .cx-diff,.cx-changes,.cx-prop{-webkit-print-color-adjust:exact;print-color-adjust:exact;}
205
205
  .cx-diff-printtable{width:100%;border-collapse:collapse;font-family:var(--hfx-font-mono,"Cascadia Mono","Cascadia Code",Consolas,"SFMono-Regular",Menlo,monospace);font-size:var(--cx-size-11px);}
206
206
  .cx-diff-printtable td{padding:0 var(--cx-size-4px);vertical-align:top;}
207
- .cx-diff-printtable :is(.cx-diff-num,.cx-diff-sign){width:1%;white-space:nowrap;text-align:end;color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));}
207
+ .cx-diff-printtable :is(.cx-diff-num,.cx-diff-sign){width:1%;white-space:nowrap;text-align:end;color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));}
208
208
  .cx-diff-printtable .cx-diff-code{white-space:pre-wrap;word-break:break-all;}
209
- .cx-diff-printtable tr:is(.cx-diff-del,.cx-diff-add){background:color-mix(in srgb,var(--cx-chg-diff) 12%,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));}
209
+ .cx-diff-printtable tr:is(.cx-diff-del,.cx-diff-add){background:color-mix(in srgb,var(--cx-chg-diff) 12%,var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c))));}
210
210
  .cx-chg-row{grid-template-columns:var(--cx-size-112px) minmax(0,1fr) auto;grid-template-areas:"badge main meta";}
211
211
  .cx-chg-facts{table-layout:fixed;max-width:none;}
212
212
  .cx-chg-facts thead th:first-child{width:28%;}
@@ -1,4 +1,4 @@
1
- (function(global){"use strict";const installed=new WeakSet();const part={version:"419bb03b4580fd5c",install(context){if(installed.has(context.CHANGES_IMPL))return;const{CHANGES_IMPL,h,setText,fill,plural,numberFormat,gridFreeze,toneOf,applyTone,svgIcon,PROTOCOL}=context;function humanTimeFormat(lang,local,utcTemplate){const formatter=new Intl.DateTimeFormat(lang||undefined,{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit",hourCycle:"h23",timeZone:local?undefined:"UTC",...(local?{timeZoneName:"short"}:{})});return{format(value){const parts=formatter.formatToParts(new Date(value));const text=parts.map((part,index)=>part.type==="literal"&&parts[index+1]?.type==="timeZoneName"?part.value.replace(/\s/g,"\u00a0"):part.value).join("");
1
+ (function(global){"use strict";const installed=new WeakSet();const part={version:"7d9a526aa07a8838",install(context){if(installed.has(context.CHANGES_IMPL))return;const{CHANGES_IMPL,h,setText,fill,plural,numberFormat,gridFreeze,toneOf,applyTone,svgIcon,PROTOCOL}=context;function humanTimeFormat(lang,local,utcTemplate){const formatter=new Intl.DateTimeFormat(lang||undefined,{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit",hourCycle:"h23",timeZone:local?undefined:"UTC",...(local?{timeZoneName:"short"}:{})});return{format(value){const parts=formatter.formatToParts(new Date(value));const text=parts.map((part,index)=>part.type==="literal"&&parts[index+1]?.type==="timeZoneName"?part.value.replace(/\s/g,"\u00a0"):part.value).join("");
2
2
  return local?text:fill(utcTemplate||"{time} UTC",{time:text}).replace(/ (\S+)$/,"\u00a0$1");
3
3
  }}}
4
4
  const CHANGE_LABELS={changeInline:"Inline",changeSplit:"Side by side",changeLayout:"Layout",changeCopyDiff:"Copy diff",changeCopied:"Copied",changeCopyFailed:"Could not copy",changeNext:"Next change",changePrevious:"Previous change",changePosition:"Change {index} of {count}",changeShowLines:"[one]Show {count} more line[other]Show {count} more lines",changeHiddenLines:"[one]{count} unchanged line not included[other]{count} unchanged lines not included",changeLineCounts:"Lines added: {added}, removed: {removed}",changeLineAdded:"Added line {line}",changeLineRemoved:"Removed line {line}",changeLineContext:"Line {line}",changeBefore:"Before",changeAfter:"After",changeBinary:"Binary file: compared by size and hash, not by lines.",changeUnavailable:"The content of this file is not available.",changeIdentical:"The text did not change.",changeTruncated:"Some changes are not shown: the comparison was too large.",changeTooLarge:"These texts are too long to compare here.",changeDiffOf:"Changes in {name}",changeAdded:"Added",changeRemoved:"Removed",changeModified:"Modified",changeRenamed:"Renamed",changeFlaggedOnly:"Flagged only",changeFlaggedCount:"{count} flagged",changeNoItems:"No changes to show.",changeSize:"Size",changeHash:"Hash",changeTime:"Time",changeCopyHash:"Copy the full hash",changeDetails:"Details of {name}",changeFileCount:"[one]{count} file[other]{count} files",changeFrom:"from {path}",changeShowMore:"Show more",changeFlags:"Flags",changeFacts:"Details",changeRoot:"Top level",changeShown:"{shown} of {total} shown",changeFilter:"Show changes",changeActions:"Actions for {name}",changeConverged:"Converged",changePropagating:"Propagating",changeFault:"Fault",changeUnknown:"Unknown",changeReplica:"Replica",changeState:"State",changeFirstSeen:"First seen",changeLastSeen:"Last seen",changeTimeline:"Delay",changeNotSeen:"Not seen yet",changeDelay:"+{duration}",changeSource:"Source",changeProgress:"{converged} of {total} have the change",changeSeconds:"{count} s",changeMinutes:"{count} min",changeHours:"{count} h",changeDays:"{count} d",changeUtcTime:"{time} UTC",changeExportCsv:"Export CSV",changeExportJson:"Export JSON",changeReason:"Reason",changeReasonHint:"{action}: say why. The reason is kept with the action.",changeReasonRequired:"Enter a reason first.",changeCancel:"Cancel",changeUnclaimed:"This page cannot carry out “{action}” itself. Copy the request to pass it on.",changeCopyRequest:"Copy request",changeFiltered:"Filtered: {filters}",changePrintLimit:"[one]{count} more line is not printed.[other]{count} more lines are not printed."};function changeLabels(...sources){const labels={...CHANGE_LABELS};for(const source of sources){if(source==null)continue;if(typeof source!=="object"||Array.isArray(source))changeFail("labels must be an object of strings");for(const[name,text]of Object.entries(source)){if(!Object.hasOwn(labels,name)){if(/^change[A-Z]/.test(name)) changeFail("there is no change label '" + name + "'"); continue; }
@@ -1,12 +1,16 @@
1
1
  /* Column groups: header rows above the column headers (canopyx.column-groups.source),and the nested Columns menu. */
2
2
  .cx-data-grid .cx-hgroup-row{height:var(--hfx-table-header-height,calc(40px - var(--cx-compact,0) * 8px));}
3
3
  .cx-data-grid.cx-phone .cx-hgroup-row{height:var(--cx-size-32px);}
4
- .cx-data-grid .cx-hgroup{overflow:visible;justify-content:flex-start;border-bottom:var(--cx-size-1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));}
4
+ .cx-data-grid .cx-hgroup{overflow:visible;justify-content:flex-start;border-bottom:var(--cx-size-1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));}
5
5
  .cx-data-grid .cx-hgroup::after{top:0;bottom:0;}
6
6
  .cx-data-grid .cx-hgroup-row .cx-hcell:last-child::after{display:block;}
7
7
  .cx-data-grid .cx-hgroup-row .cx-hcell:last-child:not(.cx-hgroup)::after,.cx-data-grid .cx-hgroup-pad::after{display:none;}
8
8
  .cx-data-grid .cx-hgroup-title{position:sticky;left:calc(var(--cx-pin-left-w,0px) + var(--hfx-cell-padding-x,calc(12px - var(--cx-compact,0) * 4px)));min-width:0;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
9
9
  .cx-data-grid .cx-hgroup[data-cx-pin] .cx-hgroup-title{position:static;}
10
+ .cx-data-grid .cx-hband{background:color-mix(in srgb,var(--hfx-color-accent,light-dark(#11776f,#37c9b8)) 8%,var(--cx-grid-header,var(--hfx-color-surface-sunken,light-dark(#f7f8f9,#111317))));font-weight:var(--hfx-table-header-weight,var(--hfx-weight-semibold,600));border-inline-end:var(--hfx-border-width,1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));}
11
+ .cx-data-grid .cx-hband::after{display:none;}
12
+ .cx-data-grid .cx-hband-continuation .cx-hgroup-title{text-decoration:underline dotted;text-underline-offset:var(--cx-size-4px);}
13
+ .cx-data-grid .cx-hband-continuation .cx-hgroup-title::before{content:"↳ ";}
10
14
  .cx-data-grid .cx-hgroup .cx-column-move{flex:none;}
11
15
  .cx-data-grid .cx-hgroup.cx-drop-before{box-shadow:inset var(--cx-size-2px) 0 var(--hfx-color-accent,light-dark(#11776f,#37c9b8));}
12
16
  .cx-data-grid .cx-hgroup.cx-drop-after{box-shadow:inset var(--cx-size-neg-2px) 0 var(--hfx-color-accent,light-dark(#11776f,#37c9b8));}
@@ -1,8 +1,8 @@
1
- (function(global){"use strict";const installed=new WeakSet();const part={version:"cd6d93e033719439",install(context){if(installed.has(context.DataGrid.prototype))return;const{DataGrid,h,setText,fill,columnWidth,foldText,gridButton,gridIcon,gridDecorateButton,cellText,cellValue,isCellObject,numberFormat,gridFreeze,requireIdentifier,loadGridFilterEditor,CELL_CONTROLS,reachable}=context;const CG_DEPTH=3,CG_PINS=["left","none","right"];const cgBad=problem=>{throw new Error("CanopyX: column groups "+problem+".")};function cgRead(view){const declared=new Set(view.columns.map(column=>column.id)),owner=new Map(),byId=new Map();if(!Array.isArray(view.columnGroups)||view.columnGroups.length>1000)cgBad("must be an array of at most 1000 groups");const read=(input,parent,depth)=>{if(!input||typeof input!=="object"||Array.isArray(input))cgBad("must be objects");requireIdentifier(input.id,"column group ID");const columns=input.columns??[],groups=input.groups??[];if(byId.has(input.id)||typeof input.title!=="string"||!input.title.trim()||input.title.length>256||depth>CG_DEPTH||
1
+ (function(global){"use strict";const installed=new WeakSet();const part={version:"91abd99e8ff95b58",install(context){if(installed.has(context.DataGrid.prototype))return;const{DataGrid,h,setText,fill,columnWidth,foldText,gridButton,gridIcon,gridDecorateButton,cellText,cellValue,isCellObject,numberFormat,gridFreeze,requireIdentifier,loadGridFilterEditor,CELL_CONTROLS,reachable}=context;const CG_DEPTH=3,CG_PINS=["left","none","right"];const cgBad=problem=>{throw new Error("CanopyX: column groups "+problem+".")};function cgRead(view){const declared=new Set(view.columns.map(column=>column.id)),owner=new Map(),byId=new Map(),definitions=view.columnBands??view.columnGroups;if(!Array.isArray(definitions)||definitions.length>1000)cgBad("must be an array of at most 1000 groups");const read=(input,parent,depth)=>{if(!input||typeof input!=="object"||Array.isArray(input))cgBad("must be objects");requireIdentifier(input.id,"column group ID");const columns=input.columns??[],groups=input.groups??[];if(byId.has(input.id)||typeof input.title!=="string"||!input.title.trim()||input.title.length>256||depth>CG_DEPTH||
2
2
  !Array.isArray(columns)||!Array.isArray(groups)||!columns.length&&!groups.length||
3
- input.pinned!==undefined&&(parent||![null,"left","right"].includes(input.pinned)))
3
+ input.pinned!==undefined&&(view.columnBands!==undefined||parent||![null,"left","right"].includes(input.pinned)))
4
4
  cgBad("need unique IDs, titles, members, at most "+CG_DEPTH+" levels, and a pin only on a top-level group");const node={id:input.id,title:input.title,pinned:input.pinned,parent,depth,columns:[],groups:[],leaves:[]};byId.set(node.id,node);for(const id of columns){if(!declared.has(id)||owner.has(id))cgBad("name declared columns, each in one group at most");owner.set(id,node);node.columns.push(id)}
5
- for(const group of groups)node.groups.push(read(group,node,depth+1));return node};const roots=view.columnGroups.map(group=>read(group,null,1));const gather=node=>node.leaves=[...node.columns,...node.groups.flatMap(gather)];roots.forEach(gather);return{roots,byId,owner,depth:Math.max(0,...[...byId.values()].map(node=>node.depth))}}
5
+ for(const group of groups)node.groups.push(read(group,node,depth+1));return node};const roots=definitions.map(group=>read(group,null,1));const gather=node=>node.leaves=[...node.columns,...node.groups.flatMap(gather)];roots.forEach(gather);return{roots,byId,owner,depth:Math.max(0,...[...byId.values()].map(node=>node.depth))}}
6
6
  function cgPath(model,id){const path=[];for(let node=model.owner.get(id);node;node=node.parent)path.unshift(node);return path}
7
7
  function cgOrder(grid){const model=grid.columnGroupModel,rank=new Map(grid.columns.map((column,index)=>[column.id,index]));const byId=new Map(grid.columns.map(column=>[column.id,column]));const middle=ids=>ids.map(id=>rank.get(id)).sort((a,b)=>a-b)[(ids.length-1)>>1];const place=node=>[...node.columns.map(id=>({at:rank.get(id),ids:[id]})),...node.groups.map(group=>({at:middle(group.leaves),ids:place(group)}))]
8
8
  .sort((a,b)=>a.at-b.at).flatMap(item=>item.ids);const items=model.roots.map(root=>{const members=root.leaves.map(id=>byId.get(id)).sort((a,b)=>rank.get(a.id)- rank.get(b.id)),counts=new Map();for(const column of members)counts.set(column.pin||"none",(counts.get(column.pin||"none")||0)+ 1);let pin=members[0].pin||"none";for(const[side,count]of counts)if(count>counts.get(pin))pin=side;for(const column of members)column.pin=pin;return{at:middle(root.leaves),ids:place(root),pin}});for(const column of grid.columns)if(!model.owner.has(column.id))items.push({at:rank.get(column.id),ids:[column.id],pin:column.pin||"none"});items.sort((a,b)=>CG_PINS.indexOf(a.pin)- CG_PINS.indexOf(b.pin)||a.at-b.at);const order=items.flatMap(item=>item.ids);if(order.some((id,index)=>grid.columns[index].id!==id))grid.columns=order.map(id=>byId.get(id))}
@@ -13,10 +13,12 @@ const order=grid.columns.map(column=>column.id);return order.indexOf(cgFirst(gri
13
13
  function cgFirst(grid,id){const node=grid.columnGroupModel.byId.get(id);return node?grid.columns.find(column=>node.leaves.includes(column.id)).id:id}
14
14
  function cgTop(grid,node,first){const members=[...node.columns,...node.groups.map(group=>group.id)],order=grid.columns.map(column=>column.id);const at=id=>order.indexOf(cgFirst(grid,id));return members.sort((a,b)=>first?at(a)- at(b):at(b)- at(a))[0]}
15
15
  function cgMoved(grid,id,targetId,after){const model=grid.columnGroupModel,block=model.byId.get(id)?.leaves||[id],targetBlock=model.byId.get(targetId)?.leaves||[targetId];const order=grid.columns.map(column=>column.id).filter(item=>!block.includes(item));const positions=targetBlock.map(item=>order.indexOf(item)).filter(index=>index>=0);if(!positions.length)return null;order.splice(after?Math.max(...positions)+ 1:Math.min(...positions),0,...grid.columns.map(column=>column.id).filter(item=>block.includes(item)));return order}
16
- function cgHeader(grid){const model=grid.columnGroupModel,cols=grid.cols,paths=cols.map(column=>cgPath(model,column.id));const depth=Math.max(0,...paths.map(path=>path.length));for(const row of grid.groupRows||[])row.remove();grid.groupRows=[];grid.groupCells=[];for(let level=0;level<depth;level++){const row=h("div","cx-hrow cx-hgroup-row");row.setAttribute("role","row");row.setAttribute("aria-rowindex",String(level+1));for(let first=0;first<cols.length;){const node=paths[first][level];let end=first+1;if(node)while(end<cols.length&&paths[end][level]===node)end++;const cell=node?cgGroupCell(grid,node,first,end-first):h("div","cx-hcell cx-hgroup-pad");if(!node)cell.setAttribute("aria-hidden","true");cell._cxSpan={first,last:end-1};row.appendChild(cell);grid.groupCells.push(cell);first=end}
16
+ function cgHeader(grid){const model=grid.columnGroupModel,cols=grid.cols,paths=cols.map(column=>cgPath(model,column.id));const depth=Math.max(0,...paths.map(path=>path.length));for(const row of grid.groupRows||[])row.remove();grid.groupRows=[];grid.groupCells=[];for(let level=0;level<depth;level++){const row=h("div","cx-hrow cx-hgroup-row"),seen=new Set();row.setAttribute("role","row");row.setAttribute("aria-rowindex",String(level+1));for(let first=0;first<cols.length;){const node=paths[first][level];let end=first+1;if(node)while(end<cols.length&&paths[end][level]===node&&cols[end].effectivePin===cols[first].effectivePin)end++;const cell=node?cgGroupCell(grid,node,first,end-first):h("div","cx-hcell cx-hgroup-pad");if(node&&grid.view.columnBands!==undefined){cell.classList.add("cx-hband");cell.classList.toggle("cx-hband-continuation",seen.has(node));seen.add(node)}
17
+ if(!node)cell.setAttribute("aria-hidden","true");cell._cxSpan={first,last:end-1};row.appendChild(cell);grid.groupCells.push(cell);first=end}
17
18
  grid.groupRows.push(row)}
18
- grid.head.prepend(...grid.groupRows);grid.headRow.setAttribute("aria-rowindex",String(depth+1));grid.host.classList.toggle("cx-column-groups",depth>0);cgDepth(grid,depth);cgLayout(grid)}
19
- function cgGroupCell(grid,node,first,span){const cell=h("div","cx-hcell cx-hgroup"),title=h("span","cx-hgroup-title");cell.setAttribute("role","columnheader");cell.setAttribute("aria-colindex",String(first+1));cell.setAttribute("aria-colspan",String(span));cell.setAttribute("aria-label",node.title);cell.dataset.cxGroup=node.id;cell.dataset.cxLevel=String(node.depth);setText(title,node.title);title.title=node.title;cell.appendChild(title);if(grid.view.reporting?.columnReorder)cgMoveButton(grid,node,cell);cell.appendChild(cgGrip(grid,node));return cell}
19
+ grid.head.prepend(...grid.groupRows);grid.headRow.setAttribute("aria-rowindex",String(depth+1));grid.host.classList.toggle("cx-column-groups",depth>0);cgDepth(grid,depth);cgLayout(grid);grid.columnBandKey=cgBandKey(grid)}
20
+ function cgGroupCell(grid,node,first,span){const cell=h("div","cx-hcell cx-hgroup"),title=h("span","cx-hgroup-title");cell.setAttribute("role","columnheader");cell.setAttribute("aria-colindex",String(first+1));cell.setAttribute("aria-colspan",String(span));cell.setAttribute("aria-label",node.title);cell.dataset.cxGroup=node.id;cell.dataset.cxLevel=String(node.depth);setText(title,node.title);title.title=node.title;cell.appendChild(title);if(grid.view.columnBands===undefined){if(grid.view.reporting?.columnReorder)cgMoveButton(grid,node,cell);cell.appendChild(cgGrip(grid,node))}
21
+ return cell}
20
22
  function cgDepth(grid,depth){const previous=grid.headDepth||0;if(previous===depth)return;grid.headDepth=depth;const count=grid.grid.getAttribute("aria-rowcount");if(count&&count!=="-1")grid.grid.setAttribute("aria-rowcount",String(Number(count)- previous+depth));for(const row of[...grid.rendered.values(),...grid.pool])row._index=undefined;grid.scheduleRender()}
21
23
  function cgLayout(grid){const cells=grid.headCells||[],widths=cells.map(cell=>parseFloat(cell.style.width)||0);for(const row of grid.groupRows||[])row.style.width=grid.headRow.style.width;for(const cell of grid.groupCells||[]){const{first,last}=cell._cxSpan;if(last>=cells.length)continue;let width=0;for(let index=first;index<=last;index++)width +=widths[index];const head=cells[first],tail=cells[last],pin=head.dataset.cxPin;cell.style.width=width+"px";if(pin)cell.dataset.cxPin=pin;else cell.removeAttribute("data-cx-pin");cell.style.left=pin==="left"?head.style.left:"";cell.style.right=pin==="right"?tail.style.right:"";cell.classList.toggle("cx-pin-edge",cells.slice(first,last+1).some(item=>item.classList.contains("cx-pin-edge")));const grip=cell.querySelector(":scope > .cx-resize"),columns=grid.cols.slice(first,last+1);if(grip){grip.setAttribute("aria-valuemin",String(columns.reduce((sum,column)=>sum+column.minW,0)));grip.setAttribute("aria-valuemax",String(Math.min(2147483647,columns.reduce((sum,column)=>sum+column.maxW,0))));grip.setAttribute("aria-valuenow",String(Math.round(width)));grip.setAttribute("aria-valuetext",fill(grid.labels.columnWidth,{width:numberFormat(grid.lang).format(Math.round(width))}))}}
22
24
  grid.host.style.setProperty("--cx-pin-left-w",(grid.pinnedLeftWidth||0)+ "px")}
@@ -43,9 +45,13 @@ function cgChoose(grid,id,targetId,after){const node=grid.columnGroupModel.byId.
43
45
  const to=cgSibling(grid,id,targetId,after),order=to.id!==id&&cgMoved(grid,id,to.id,to.after);if(!order)return;if(!grid.columnGroupModel.owner.has(id))grid.columns.find(column=>column.id===id).pin=grid.columns.find(column=>column.id===cgFirst(grid,to.id)).pin;grid.setColumnOrder(order)}
44
46
  function cgDragChoice(grid,list,row,handle,id,event){if(event.button)return;event.preventDefault();handle.focus();handle.setPointerCapture(event.pointerId);let target=null;const clear=()=>{for(const item of list.querySelectorAll(".cx-drop-before,.cx-drop-after"))item.classList.remove("cx-drop-before","cx-drop-after")};handle.onpointermove=move=>{clear();target=null;const over=document.elementFromPoint(move.clientX,move.clientY)?.closest(".cx-grid-column-choice");if(!over||over===row||!list.contains(over))return;const box=over.getBoundingClientRect(),to=cgSibling(grid,id,over.dataset.cxColumn||over.dataset.cxGroup,move.clientY>box.top+box.height / 2);
45
47
  if(to.id===id)return;target=to;const marked=list.querySelector('[data-cx-column="'+CSS.escape(to.id)+ '"],[data-cx-group="'+CSS.escape(to.id)+ '"]');marked?.classList.add(to.after?"cx-drop-after":"cx-drop-before")};handle.onpointerup=handle.onpointercancel=up=>{handle.onpointermove=handle.onpointerup=handle.onpointercancel=null;clear();if(up.type==="pointerup"&&target)cgChoose(grid,id,target.id,target.after)}}
48
+ const cgBandKey=grid=>JSON.stringify(grid.cols.map(column=>[column.id,column.effectivePin||"none"]));function cgInstallPresentation(grid){const shared=Object.getPrototypeOf(grid);grid.buildHeader=function(...args){this.groupCells=[];this.columnBandsBuilding=true;try{shared.buildHeader.apply(this,args)}
49
+ finally{this.columnBandsBuilding=false}
50
+ cgHeader(this)};grid.applyWidths=function(...args){shared.applyWidths.apply(this,args);if(this.columnBandsBuilding||!this.cols||this.headCells?.length!==this.cols.length)return;if(this.columnBandKey!==cgBandKey(this))cgHeader(this);else cgLayout(this)};grid.lifetime.signal.addEventListener("abort",()=>{grid.host.classList.remove("cx-column-groups");grid.host.style.removeProperty("--cx-pin-left-w")},{once:true});grid.buildHeader();grid.render()}
46
51
  function cgColumn(grid,to){const node=grid.columnGroupModel.byId.get(to.id);if(!node)return grid.columns.find(column=>column.id===to.id);const members=grid.columns.filter(column=>node.leaves.includes(column.id));return to.after?members[members.length-1]:members[0]}
47
52
  function cgInstall(grid){const shared=Object.getPrototypeOf(grid);grid.buildHeader=function(){this.groupCells=[];cgOrder(this);shared.buildHeader.call(this);cgHeader(this)};grid.applyWidths=function(...args){shared.applyWidths.apply(this,args);if(this.cols&&this.headCells?.length===this.cols.length)cgUnsplit(this);cgLayout(this)};grid.setColumnPinned=function(id,pin){const root=cgPath(this.columnGroupModel,id)[0];if(root&&CG_PINS.includes(pin))for(const column of this.columns)if(root.leaves.includes(column.id))column.pin=pin;return shared.setColumnPinned.call(this,id,pin)};grid.moveReportingColumn=function(column,target,after){const to=cgSibling(this,column.id,target.id,after),landing=cgColumn(this,to);if(to.id!==column.id&&landing&&landing!==column)shared.moveReportingColumn.call(this,column,landing,to.after)};grid.moveColumnChoice=function(column,target,after){cgChoose(this,column.id,target.id,after)};grid.syncColumnControls=function(...args){return this.columnList?cgColumnControls(this):shared.syncColumnControls.apply(this,args)}}
48
- Object.assign(DataGrid.prototype,{startColumnGroups(){if(this.columnGroupModel||this.destroyed)return;if(!this.view.columnGroups?.length){this.columnGroupModel={roots:[],byId:new Map(),owner:new Map(),depth:0};return}
49
- const model=this.columnGroupModel=cgRead(this.view),byId=new Map(this.columns.map(column=>[column.id,column]));if(!this.initialState)for(const root of model.roots)if(root.pinned!==undefined)for(const id of root.leaves)byId.get(id).pin=root.pinned||"none";const titles=new Map();for(const node of model.byId.values())titles.set(node.title,(titles.get(node.title)||0)+ 1);for(const[id,node]of model.owner){const column=byId.get(id);column.section??=titles.get(node.title)>1?cgPath(model,id).map(group=>group.title).join(" · "):node.title}
53
+ Object.assign(DataGrid.prototype,{startColumnGroups(){if(this.columnGroupModel||this.destroyed)return;if(!(this.view.columnBands??this.view.columnGroups)?.length){this.columnGroupModel={roots:[],byId:new Map(),owner:new Map(),depth:0};return}
54
+ const model=this.columnGroupModel=cgRead(this.view),byId=new Map(this.columns.map(column=>[column.id,column]));if(this.view.columnBands!==undefined){cgInstallPresentation(this);return}
55
+ if(!this.initialState)for(const root of model.roots)if(root.pinned!==undefined)for(const id of root.leaves)byId.get(id).pin=root.pinned||"none";const titles=new Map();for(const node of model.byId.values())titles.set(node.title,(titles.get(node.title)||0)+ 1);for(const[id,node]of model.owner){const column=byId.get(id);column.section??=titles.get(node.title)>1?cgPath(model,id).map(group=>group.title).join(" · "):node.title}
50
56
  cgOrder(this);if(this.defaultState){const saved=new Map(this.defaultState.columns.map(column=>[column.id,column]));const declared={columnGroupModel:model,columns:this.defaultState.columns.map(entry=>({id:entry.id,pin:entry.pin??byId.get(entry.id).pin}))};for(const root of model.roots)if(root.pinned!==undefined)for(const column of declared.columns)if(root.leaves.includes(column.id))column.pin=root.pinned||"none";cgOrder(declared);this.defaultState.columns=declared.columns.map(column=>{const entry=saved.get(column.id);if("pin" in entry)entry.pin=column.pin||"none";return entry})}
51
- cgInstall(this);this.lifetime.signal.addEventListener("abort",()=>{this.cancelColumnDrag?.();this.host.classList.remove("cx-column-groups");this.host.style.removeProperty("--cx-pin-left-w")},{once:true});this.buildHeader();this.syncColumnControls();this.render()},getColumnGroups(){const model=this.columnGroupModel;if(!model?.roots.length)return[];const shown=new Set((this.cols||[]).map(column=>column.id)),order=this.columns.map(column=>column.id);const describe=node=>{const columns=order.filter(id=>node.leaves.includes(id));return Object.freeze({id:node.id,title:node.title,columns:Object.freeze(columns),visibleColumns:Object.freeze(columns.filter(id=>shown.has(id))),pin:this.columns.find(column=>column.id===columns[0]).pin||"none",groups:Object.freeze(cgSiblings(this,node).filter(id=>model.byId.has(id)).map(id=>describe(model.byId.get(id))))})};return Object.freeze(cgSiblings(this,null).filter(id=>model.byId.has(id)).map(id=>describe(model.byId.get(id))))},setColumnGroupVisible(id,visible){const node=this.columnGroupModel?.byId.get(id);if(!node||typeof visible!=="boolean"||this.destroyed)throw new Error("CanopyX: visibility needs a declared column group and a boolean.");const members=this.columns.filter(column=>node.leaves.includes(column.id));if(!visible&&this.columns.every(column=>column.hidden||members.includes(column)))throw new Error("CanopyX: keep at least one column visible.");for(const column of members)column.hidden=!visible;this.buildHeader();this.syncColumnControls();this.scheduleRender();this.noteViewPreferenceIntent?.();this.stateChanged()}});installed.add(context.DataGrid.prototype)}};(global.CanopyXParts||=[]).push(["column-groups",part])})(typeof window!=="undefined"?window:globalThis);
57
+ cgInstall(this);this.lifetime.signal.addEventListener("abort",()=>{this.cancelColumnDrag?.();this.host.classList.remove("cx-column-groups");this.host.style.removeProperty("--cx-pin-left-w")},{once:true});this.buildHeader();this.syncColumnControls();this.render()},getColumnGroups(){const model=this.columnGroupModel;if(!model?.roots.length)return[];const shown=new Set((this.cols||[]).map(column=>column.id)),order=this.columns.map(column=>column.id);const describe=node=>{const columns=order.filter(id=>node.leaves.includes(id));const pins=new Set(this.columns.filter(column=>columns.includes(column.id)).map(column=>column.pin||"none"));return Object.freeze({id:node.id,title:node.title,columns:Object.freeze(columns),visibleColumns:Object.freeze(columns.filter(id=>shown.has(id))),pin:pins.size>1?"mixed":[...pins][0],groups:Object.freeze(cgSiblings(this,node).filter(id=>model.byId.has(id)).map(id=>describe(model.byId.get(id))))})};return Object.freeze(cgSiblings(this,null).filter(id=>model.byId.has(id)).map(id=>describe(model.byId.get(id))))},getColumnBands(){return Object.freeze((this.groupCells||[]).filter(cell=>cell.dataset.cxGroup).map(cell=>{const{first,last}=cell._cxSpan;return Object.freeze({id:cell.dataset.cxGroup,title:cell.getAttribute("aria-label"),level:Number(cell.dataset.cxLevel),columnIndex:first+1,columnSpan:last-first+1,pin:cell.dataset.cxPin||"none",columns:Object.freeze(this.cols.slice(first,last+1).map(column=>column.id))})}))},setColumnGroupVisible(id,visible){if(this.view.columnBands!==undefined)throw new Error("CanopyX: presentation bands do not change column visibility; use setColumnVisible.");const node=this.columnGroupModel?.byId.get(id);if(!node||typeof visible!=="boolean"||this.destroyed)throw new Error("CanopyX: visibility needs a declared column group and a boolean.");const members=this.columns.filter(column=>node.leaves.includes(column.id));if(!visible&&this.columns.every(column=>column.hidden||members.includes(column)))throw new Error("CanopyX: keep at least one column visible.");for(const column of members)column.hidden=!visible;this.buildHeader();this.syncColumnControls();this.scheduleRender();this.noteViewPreferenceIntent?.();this.stateChanged()}});installed.add(context.DataGrid.prototype)}};(global.CanopyXParts||=[]).push(["column-groups",part])})(typeof window!=="undefined"?window:globalThis);
@@ -1,4 +1,4 @@
1
- .cx-compare-summary{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:var(--hfx-space-3,0.75rem) var(--hfx-space-6,2rem);width:100%;box-sizing:border-box;padding:calc(var(--hfx-space-1,0.25rem)*3.5) var(--hfx-space-4,1rem);border-block-end:var(--hfx-border-width,1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));background:var(--hfx-color-surface,light-dark(#ffffff,#16181c));color:var(--hfx-color-text,light-dark(#16181c,#f2f3f5));font:inherit;}
1
+ .cx-compare-summary{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:var(--hfx-space-3,0.75rem) var(--hfx-space-6,2rem);width:100%;box-sizing:border-box;padding:calc(var(--hfx-space-1,0.25rem)*3.5) var(--hfx-space-4,1rem);border-block-end:var(--hfx-border-width,1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));background:var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));color:var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)));font:inherit;}
2
2
  .cx-compare-counts{display:flex;flex-wrap:wrap;gap:calc(var(--hfx-space-1,0.25rem)*2.5) var(--hfx-space-6,2rem);}
3
3
  .cx-compare-count{display:inline-flex;align-items:baseline;gap:var(--hfx-space-1-5,6px);white-space:nowrap;}
4
4
  .cx-compare-count strong{font-size:var(--hfx-type-title-size,1.25rem);font-variant-numeric:tabular-nums;}
@@ -9,7 +9,7 @@
9
9
  .cx-compare-added{color:var(--hfx-color-status-good-fg,light-dark(#177345,#4cc78a));}
10
10
  .cx-compare-removed{color:var(--hfx-color-status-bad-fg,light-dark(#b8292a,#f47171));}
11
11
  .cx-compare-changed{color:var(--hfx-color-status-warn-fg,light-dark(#8c5c05,#eeb640));}
12
- .cx-compare-unchanged{color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));}
12
+ .cx-compare-unchanged{color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));}
13
13
  .cx-before-after{display:inline-flex;align-items:baseline;gap:var(--hfx-space-1-5,6px);max-width:100%;line-height:inherit;}
14
14
  .cx-wrap .cx-before-after{flex-wrap:wrap;}
15
15
  .cx-before-after del{color:var(--hfx-color-status-bad-fg,light-dark(#b8292a,#f47171));text-decoration-thickness:var(--hfx-border-width,1px);overflow-wrap:anywhere;}
@@ -28,10 +28,10 @@ body .cx-host.cx-compare-drawer{height:var(--cx-ui-viewport-block);min-height:0;
28
28
  .cx-compare-drawer .cx-drawer-body .cx-dl{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,2fr);gap:var(--hfx-space-3,0.75rem) var(--hfx-space-4,1rem);margin:0;padding:var(--hfx-space-3,0.75rem) 0;}
29
29
  .cx-compare-drawer .cx-dl dt{font-size:var(--hfx-type-small-size,0.8125rem);color:var(--hfx-color-text-secondary,light-dark(#4d525b,#b0b4bc));}
30
30
  .cx-compare-drawer .cx-dl dd{margin:0;}
31
- .cx-compare-record-changes{margin:0;padding:0 0 var(--hfx-space-3,0.75rem);border-bottom:var(--hfx-border-width,1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));}
31
+ .cx-compare-record-changes{margin:0;padding:0 0 var(--hfx-space-3,0.75rem);border-bottom:var(--hfx-border-width,1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));}
32
32
  .cx-compare-record-changes h3,.cx-compare-drawer .cx-drawer-body .cx-record-toggle{margin:0;font-size:var(--hfx-type-small-size,0.8125rem);font-weight:var(--hfx-weight-semibold,600);letter-spacing:normal;text-transform:none;color:var(--hfx-color-text-secondary,light-dark(#4d525b,#b0b4bc));}
33
33
  .cx-compare-drawer .cx-drawer-body .cx-record-toggle{padding:var(--hfx-space-3,0.75rem) 0 var(--hfx-space-1,0.25rem);justify-content:space-between;}
34
34
  .cx-compare-drawer[data-phone="true"] .cx-dl{grid-template-columns:minmax(0,1fr);gap:var(--hfx-space-1,0.25rem);}
35
35
  .cx-compare-drawer[data-phone="true"] .cx-dl dd{margin-block-end:var(--hfx-space-2,0.5rem);}
36
36
  @media (forced-colors:active){.cx-before-after del{color:CanvasText;}.cx-before-after ins{color:CanvasText;}}
37
- .cx-compare-removed-row .cx-before-after del{color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));}
37
+ .cx-compare-removed-row .cx-before-after del{color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));}
@@ -1,4 +1,4 @@
1
- (function(global){"use strict";const installed=new WeakSet();const part={version:"2df5f137f630380f",requires:["presenters"],install(context){if(installed.has(context.DataGrid.prototype))return;const{DataGrid,h,setText,fill,plural,cellValue,numberFormat,gridQueryStart,gridQuery}=context;const COMPARE_LABELS={compareSummary:"Dataset comparison",compareAdded:"Added",compareRemoved:"Removed",compareChanged:"Changed",compareUnchanged:"Unchanged",compareOnlyChanges:"Changed only",compareColumnChanges:"[one]{column}: {count} changed cell[other]{column}: {count} changed cells",compareChanges:"Changes"};function compareDefinition(grid){const value=grid.view.compare,columns=new Set(grid.columns.map(column=>column.id));if(!value||typeof value!=="object"||!columns.has(value.statusColumn)||
1
+ (function(global){"use strict";const installed=new WeakSet();const part={version:"46245b96483e9c30",requires:["presenters"],install(context){if(installed.has(context.DataGrid.prototype))return;const{DataGrid,h,setText,fill,plural,cellValue,numberFormat,gridQueryStart,gridQuery}=context;const COMPARE_LABELS={compareSummary:"Dataset comparison",compareAdded:"Added",compareRemoved:"Removed",compareChanged:"Changed",compareUnchanged:"Unchanged",compareOnlyChanges:"Changed only",compareColumnChanges:"[one]{column}: {count} changed cell[other]{column}: {count} changed cells",compareChanges:"Changes"};function compareDefinition(grid){const value=grid.view.compare,columns=new Set(grid.columns.map(column=>column.id));if(!value||typeof value!=="object"||!columns.has(value.statusColumn)||
2
2
  typeof value.onlyChanges!=="boolean"||!value.counts||!value.columns||
3
3
  ["added","removed","changed","unchanged"].some(name=>!Number.isSafeInteger(value.counts[name])||value.counts[name]<0)||
4
4
  Object.entries(value.columns).some(([id,count])=>!columns.has(id)||id===value.statusColumn||!Number.isSafeInteger(count)||count<0))
@@ -1,17 +1,17 @@
1
1
  /* ---------- detail rows: the expander,the row and the content inside the visible width ---------- */
2
- .cx-detail-toggle{flex:none;display:inline-grid;place-items:center;width:var(--cx-size-20px);height:var(--cx-size-20px);margin-inline-end:var(--cx-size-4px);padding:0;border:0;border-radius:var(--hfx-radius-sm,4px);background:transparent;color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));cursor:pointer;}
2
+ .cx-detail-toggle{flex:none;display:inline-grid;place-items:center;width:var(--cx-size-20px);height:var(--cx-size-20px);margin-inline-end:var(--cx-size-4px);padding:0;border:0;border-radius:var(--hfx-radius-sm,4px);background:transparent;color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));cursor:pointer;}
3
3
  .cx-detail-toggle::before{content:"";width:var(--cx-size-6px);height:var(--cx-size-6px);border-right:var(--cx-size-1d6px) solid currentColor;border-bottom:var(--cx-size-1d6px) solid currentColor;transform:translateX(var(--cx-size-neg-1px)) rotate(-45deg);transition:transform .12s;}
4
4
  .cx-detail-toggle[aria-expanded="true"]::before{transform:translateY(var(--cx-size-neg-1px)) rotate(45deg);}
5
- .cx-detail-toggle:hover{color:var(--hfx-color-text,light-dark(#16181c,#f2f3f5));background:var(--hfx-color-hover,light-dark(#f5f5f5,#232529));}
5
+ .cx-detail-toggle:hover{color:var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)));background:var(--hfx-color-hover,light-dark(#f5f5f5,#232529));}
6
6
  .cx-detail-toggle:focus-visible{outline:var(--hfx-focus-width,2px) solid var(--hfx-color-focus-ring,light-dark(#02726a,#37c9b8));outline-offset:var(--hfx-focus-offset,2px);}
7
7
  .cx-detail-toggle[aria-expanded="true"]{color:var(--hfx-color-accent,light-dark(#11776f,#37c9b8));}
8
8
  .cx-data-grid .cx-row.cx-detail-row{background:var(--hfx-color-row-alt,light-dark(#fafafa,#1d1f23));border-bottom:var(--cx-size-1px) solid var(--hfx-color-border-strong,light-dark(#cdd0d5,#363a42));}
9
9
  .cx-data-grid .cx-row.cx-detail-row:hover{background:var(--hfx-color-row-alt,light-dark(#fafafa,#1d1f23));}
10
10
  .cx-data-grid .cx-detail-cell{flex:none;width:100%;padding:0;border-right:0;overflow:visible;}
11
11
  .cx-data-grid .cx-detail-row .cx-detail-body{padding:var(--cx-size-10px) var(--cx-size-12px) var(--cx-size-12px);box-sizing:border-box;}
12
- .cx-detail-pending{color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));font-style:italic;}
12
+ .cx-detail-pending{color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));font-style:italic;}
13
13
  .cx-detail-error{margin:0 0 var(--cx-size-8px);color:var(--hfx-color-status-bad-fg,light-dark(#b8292a,#f47171));}
14
- .cx-detail-view{height:var(--cx-size-320px);border:var(--cx-size-1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));border-radius:var(--hfx-radius-control,var(--hfx-radius-md,6px));background:var(--hfx-color-surface,light-dark(#ffffff,#16181c));}
14
+ .cx-detail-view{height:var(--cx-size-320px);border:var(--cx-size-1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));border-radius:var(--hfx-radius-control,var(--hfx-radius-md,6px));background:var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));}
15
15
  .cx-detail-view.cx-host{padding:0;}
16
16
  .cx-phone .cx-detail-view{height:var(--cx-size-280px);}
17
17
  @media (prefers-reduced-motion:reduce){.cx-detail-toggle::before{transition:none;}}
@@ -1,4 +1,4 @@
1
- (function(global){"use strict";const installed=new WeakSet();const part={version:"e4150bb67f40d597",install(context){if(installed.has(context.DataGrid.prototype))return;const{DataGrid,GRID_ROWS,GRID_REPORTING,h,setText,fill,gridButton,gridFreeze,cellText,formatting,labelsFor,requireIdentifier,GridRowOffsets,TreeGrid,createDataGrid,createTreeGrid,disposeRowHostCells,OWN_ARROWS,hostHtml}=context;const ROWS_BASE={};for(const name of["render","renderPass","trimInactiveCache","syncRowOffsets","setFocus","onKey","fillRow","destroy"])
1
+ (function(global){"use strict";const installed=new WeakSet();const part={version:"1892f1fd9d035c0f",install(context){if(installed.has(context.DataGrid.prototype))return;const{DataGrid,GRID_ROWS,GRID_REPORTING,h,setText,fill,gridButton,gridFreeze,cellText,formatting,labelsFor,requireIdentifier,GridRowOffsets,TreeGrid,createDataGrid,createTreeGrid,disposeRowHostCells,OWN_ARROWS,hostHtml}=context;const ROWS_BASE={};for(const name of["render","renderPass","trimInactiveCache","syncRowOffsets","setFocus","onKey","fillRow","destroy"])
2
2
  ROWS_BASE[name]=DataGrid.prototype[name];GRID_ROWS.view=ROWS_BASE;function rowsLowerBound(list,value){let low=0,high=list.length;while(low<high){const middle=(low+high)>>>1;if(list[middle]<value)low=middle+1;else high=middle}
3
3
  return low}
4
4
  function rowsAtOrBefore(list,value,field){let low=0,high=list.length;while(low<high){const middle=(low+high)>>>1;if(list[middle][field]<=value)low=middle+1;else high=middle}
@@ -7,12 +7,12 @@
7
7
  .cx-data-grid .cx-cell.cx-editing > :not(.cx-editor-host){display:none;}
8
8
  .cx-editor-host{flex:1;min-width:0;height:100%;display:flex;align-items:center;}
9
9
  .cx-editor-combo{display:flex;flex:1;min-width:0;height:100%;align-items:center;}
10
- .cx-editor{box-sizing:border-box;width:100%;min-width:0;height:calc(100% - var(--cx-size-4px));margin:0;padding:0 var(--cx-size-6px);font:inherit;color:var(--hfx-color-text,light-dark(#16181c,#f2f3f5));background:var(--hfx-color-surface,light-dark(#ffffff,#16181c));border:var(--cx-size-1px) solid var(--hfx-color-accent,light-dark(#11776f,#37c9b8));border-radius:var(--hfx-radius-sm,4px);outline:none;color-scheme:inherit;}
10
+ .cx-editor{box-sizing:border-box;width:100%;min-width:0;height:calc(100% - var(--cx-size-4px));margin:0;padding:0 var(--cx-size-6px);font:inherit;color:var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)));background:var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));border:var(--cx-size-1px) solid var(--hfx-color-accent,light-dark(#11776f,#37c9b8));border-radius:var(--hfx-radius-sm,4px);outline:none;color-scheme:inherit;}
11
11
  .cx-editor:focus-visible{box-shadow:0 0 0 var(--cx-size-2px) var(--hfx-color-accent-subtle,light-dark(#e7f1f1,#1b3435));}
12
12
  .cx-editor[aria-invalid="true"]{border-color:var(--hfx-color-status-bad-fg,light-dark(#b8292a,#f47171));}
13
13
  .cx-kind-number .cx-editor{text-align:right;font-variant-numeric:tabular-nums;}
14
14
  .cx-editor.cx-editor-toggle{flex:none;width:var(--cx-size-18px);height:var(--cx-size-18px);margin:0 auto 0 var(--cx-size-6px);accent-color:var(--hfx-color-accent,light-dark(#11776f,#37c9b8));}
15
- .cx-edit-tip{position:fixed;inset:auto;margin:0;box-sizing:border-box;background:var(--hfx-color-surface-raised,light-dark(#ffffff,#1e2126));color:var(--hfx-color-text,light-dark(#16181c,#f2f3f5));border:var(--cx-size-1px) solid var(--hfx-color-border-strong,light-dark(#cdd0d5,#363a42));border-radius:var(--hfx-radius-overlay,var(--hfx-radius-lg,10px));box-shadow:var(--hfx-elevation-2,0 1px 2px rgba(22,24,28,.05),0 6px 18px -10px rgba(22,24,28,.18));font:var(--cx-size-13d5px)/1.4 var(--hfx-font-sans,"Segoe UI Variable Text","Segoe UI",system-ui,-apple-system,"Helvetica Neue",Arial,sans-serif);}
15
+ .cx-edit-tip{position:fixed;inset:auto;margin:0;box-sizing:border-box;background:var(--hfx-color-surface-raised,light-dark(#ffffff,#1e2126));color:var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)));border:var(--cx-size-1px) solid var(--hfx-color-border-strong,light-dark(#cdd0d5,#363a42));border-radius:var(--hfx-radius-overlay,var(--hfx-radius-lg,10px));box-shadow:var(--hfx-elevation-2,0 1px 2px rgba(22,24,28,.05),0 6px 18px -10px rgba(22,24,28,.18));font:var(--cx-size-13d5px)/1.4 var(--hfx-font-sans,"Segoe UI Variable Text","Segoe UI",system-ui,-apple-system,"Helvetica Neue",Arial,sans-serif);}
16
16
  .cx-edit-tip{max-width:var(--cx-size-280px);padding:var(--cx-size-6px) var(--cx-size-10px);border-left:var(--cx-size-3px) solid var(--hfx-color-status-bad-fg,light-dark(#b8292a,#f47171));white-space:normal;pointer-events:none;}
17
17
  .cx-editbar{display:flex;align-items:center;gap:var(--cx-size-4px);height:var(--hfx-control-height-md,calc(36px - var(--cx-compact,0) * 8px));padding:0 var(--cx-size-4px) 0 var(--cx-size-10px);border-radius:var(--hfx-radius-control,var(--hfx-radius-md,6px));background:var(--hfx-color-surface-sunken,light-dark(#f7f8f9,#111317));font-size:var(--cx-size-13d5px);}
18
18
  .cx-editbar[hidden]{display:none;}
@@ -30,7 +30,7 @@
30
30
  .cx-drawer.cx-edit-form.cx-phone .cx-dl dd .cx-editor{height:var(--cx-size-44px);}
31
31
  .cx-drawer.cx-edit-form .cx-editor-host{height:auto;}
32
32
  .cx-edit-message{margin-top:var(--cx-size-4px);font-size:var(--cx-size-13px);color:var(--hfx-color-status-bad-fg,light-dark(#b8292a,#f47171));}
33
- .cx-drawer-f{flex:none;display:flex;align-items:center;justify-content:flex-end;gap:var(--cx-size-8px);padding:var(--cx-size-12px) var(--cx-size-16px);border-top:var(--cx-size-1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));}
33
+ .cx-drawer-f{flex:none;display:flex;align-items:center;justify-content:flex-end;gap:var(--cx-size-8px);padding:var(--cx-size-12px) var(--cx-size-16px);border-top:var(--cx-size-1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));}
34
34
  .cx-drawer-summary{margin:0 auto 0 0;font-size:var(--cx-size-13px);color:var(--hfx-color-status-bad-fg,light-dark(#b8292a,#f47171));}
35
35
  @media (forced-colors:active){
36
36
  .cx-data-grid .cx-cell.cx-dirty{text-decoration:underline dotted;}
@@ -1,4 +1,4 @@
1
- (function(global){"use strict";const installed=new WeakSet();const part={version:"25fd83789bef4fcb",requires:["filter-editor","forms"],install(context){if(installed.has(context.DataGrid.prototype))return;const{DataGrid,FORMS_IMPL,h,setText,fill,gridButton,gridDecorateButton,GRID_ICONS,cellValue,cellText,isCellObject,gridFreeze,gridMomentFromParts,numberFormat,gridQuery,foldText,requireIdentifier,checkDocument,validateGridRows,inlineGridSource,PROTOCOL,boundedPattern,validateGridFacetPage,RECORD_IMPL}=context;const{EDIT_EDITORS,editOptions,formRuleSpec,formCheck,FORM_LABELS}=FORMS_IMPL;const EDIT_LABELS={...FORM_LABELS,gridEditCell:"Edit {column}",gridEditSave:"Save",gridEditCancel:"Cancel",gridEditDiscard:"Discard",gridEditUndo:"Undo",gridEditRedo:"Redo",gridEditEdited:"Edited",gridEditChanges:"Unsaved changes: {count}",gridEditErrors:"Errors: {count}",gridEditSaving:"Saving…",gridEditSaved:"Saved rows: {count}",gridEditFailed:"Rows not saved: {count}",gridEditConflict:"Someone else changed this row. Reload it and try again.",gridEditRejected:"Not saved: {error}",gridEditNotSaved:"Not saved.",gridEditUndone:"Undone: {column}",gridEditRedone:"Redone: {column}"};const editCopy=value=>gridFreeze(JSON.parse(JSON.stringify(value===undefined?null:value)));const editSame=(left,right)=>left===right||left==null&&right==null;const editScalar=value=>value===null||typeof value==="string"||typeof value==="boolean"||Number.isFinite(value);const editBad=(id,problem)=>{throw new Error("CanopyX: column "+id+" "+problem+".")};function editSpec(column,editors,columns){const id=column.id,raw=column.editor===undefined?{}:typeof column.editor==="string"?{type:column.editor}:column.editor;const rules=column.validation===undefined?{}:column.validation,object=value=>value&&typeof value==="object"&&!Array.isArray(value);if(!object(raw)||!object(rules))editBad(id,"has an invalid editor or validation");const type=raw.type??column.kind;if(typeof type!=="string"||!Object.hasOwn(editors,type))editBad(id,"names an editor nobody registered");const fits={number:["number"],text:["text"],toggle:["text"],date:["datetime","text"],datetime:["datetime","text"],time:["datetime","text"]}[type];if(fits&&!fits.includes(column.kind))editBad(id,"cannot use a "+type+" editor for its kind");const{pattern,rules:checks}=formRuleSpec(raw,rules,problem=>editBad(id,problem));const lookup=raw.lookup??(type==="lookup"?{}:null);if(lookup&&(!object(lookup)||lookup.column!==undefined&&!columns.some(item=>item.id===lookup.column)||
1
+ (function(global){"use strict";const installed=new WeakSet();const part={version:"88e4ca705a7eb0c3",requires:["filter-editor","forms"],install(context){if(installed.has(context.DataGrid.prototype))return;const{DataGrid,FORMS_IMPL,h,setText,fill,gridButton,gridDecorateButton,GRID_ICONS,cellValue,cellText,isCellObject,gridFreeze,gridMomentFromParts,numberFormat,gridQuery,foldText,requireIdentifier,checkDocument,validateGridRows,inlineGridSource,PROTOCOL,boundedPattern,validateGridFacetPage,RECORD_IMPL}=context;const{EDIT_EDITORS,editOptions,formRuleSpec,formCheck,FORM_LABELS}=FORMS_IMPL;const EDIT_LABELS={...FORM_LABELS,gridEditCell:"Edit {column}",gridEditSave:"Save",gridEditCancel:"Cancel",gridEditDiscard:"Discard",gridEditUndo:"Undo",gridEditRedo:"Redo",gridEditEdited:"Edited",gridEditChanges:"Unsaved changes: {count}",gridEditErrors:"Errors: {count}",gridEditSaving:"Saving…",gridEditSaved:"Saved rows: {count}",gridEditFailed:"Rows not saved: {count}",gridEditConflict:"Someone else changed this row. Reload it and try again.",gridEditRejected:"Not saved: {error}",gridEditNotSaved:"Not saved.",gridEditUndone:"Undone: {column}",gridEditRedone:"Redone: {column}"};const editCopy=value=>gridFreeze(JSON.parse(JSON.stringify(value===undefined?null:value)));const editSame=(left,right)=>left===right||left==null&&right==null;const editScalar=value=>value===null||typeof value==="string"||typeof value==="boolean"||Number.isFinite(value);const editBad=(id,problem)=>{throw new Error("CanopyX: column "+id+" "+problem+".")};function editSpec(column,editors,columns){const id=column.id,raw=column.editor===undefined?{}:typeof column.editor==="string"?{type:column.editor}:column.editor;const rules=column.validation===undefined?{}:column.validation,object=value=>value&&typeof value==="object"&&!Array.isArray(value);if(!object(raw)||!object(rules))editBad(id,"has an invalid editor or validation");const type=raw.type??column.kind;if(typeof type!=="string"||!Object.hasOwn(editors,type))editBad(id,"names an editor nobody registered");const fits={number:["number"],text:["text"],toggle:["text"],date:["datetime","text"],datetime:["datetime","text"],time:["datetime","text"]}[type];if(fits&&!fits.includes(column.kind))editBad(id,"cannot use a "+type+" editor for its kind");const{pattern,rules:checks}=formRuleSpec(raw,rules,problem=>editBad(id,problem));const lookup=raw.lookup??(type==="lookup"?{}:null);if(lookup&&(!object(lookup)||lookup.column!==undefined&&!columns.some(item=>item.id===lookup.column)||
2
2
  lookup.limit!==undefined&&!(Number.isInteger(lookup.limit)&&lookup.limit>=1&&lookup.limit<=50)||
3
3
  lookup.minLength!==undefined&&!(Number.isInteger(lookup.minLength)&&lookup.minLength>=0&&lookup.minLength<=16)))editBad(id,"has invalid lookup settings");return Object.freeze({id,column,type,editor:gridFreeze({...raw,type}),options:editOptions(raw.options,id),lookup:lookup&&Object.freeze({column:lookup.column??id,limit:lookup.limit??20,minLength:lookup.minLength??1}),pattern,rules:checks})}
4
4
  function editCell(original,value,text){if(!isCellObject(original)&&text===undefined)return value;const cell=isCellObject(original)?{...original}:{};delete cell.text;delete cell.searchText;delete cell.sort;delete cell.secondary;cell.value=value;if(text!==undefined)cell.text=text;return cell}