@evotecit/canopyx 0.3.18 → 0.3.20

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 (117) 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 +53 -42
  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 +53 -42
  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 +10 -8
  63. package/CanopyX.Html/Assets/canopyx-layouts.css +9 -9
  64. package/CanopyX.Html/Assets/canopyx-layouts.js +2 -2
  65. package/CanopyX.Html/Assets/canopyx-link.css +3 -3
  66. package/CanopyX.Html/Assets/canopyx-link.js +3 -3
  67. package/CanopyX.Html/Assets/canopyx-links.js +2 -2
  68. package/CanopyX.Html/Assets/canopyx-live.css +2 -2
  69. package/CanopyX.Html/Assets/canopyx-live.js +1 -1
  70. package/CanopyX.Html/Assets/canopyx-matrix.css +31 -31
  71. package/CanopyX.Html/Assets/canopyx-matrix.js +1 -1
  72. package/CanopyX.Html/Assets/canopyx-module.mjs +10 -8
  73. package/CanopyX.Html/Assets/canopyx-pager.css +1 -1
  74. package/CanopyX.Html/Assets/canopyx-pager.js +1 -1
  75. package/CanopyX.Html/Assets/canopyx-path.css +8 -8
  76. package/CanopyX.Html/Assets/canopyx-path.js +1 -1
  77. package/CanopyX.Html/Assets/canopyx-pivot.css +10 -10
  78. package/CanopyX.Html/Assets/canopyx-pivot.js +3 -3
  79. package/CanopyX.Html/Assets/canopyx-plan.css +24 -17
  80. package/CanopyX.Html/Assets/canopyx-plan.js +13 -9
  81. package/CanopyX.Html/Assets/canopyx-record-panel.css +47 -42
  82. package/CanopyX.Html/Assets/canopyx-record-panel.js +16 -9
  83. package/CanopyX.Html/Assets/canopyx-reporting-module.mjs +56 -52
  84. package/CanopyX.Html/Assets/canopyx-reporting.css +104 -101
  85. package/CanopyX.Html/Assets/canopyx-reporting.js +56 -52
  86. package/CanopyX.Html/Assets/canopyx-stack.css +6 -6
  87. package/CanopyX.Html/Assets/canopyx-stack.js +1 -1
  88. package/CanopyX.Html/Assets/canopyx-time-slider.css +5 -5
  89. package/CanopyX.Html/Assets/canopyx-time-slider.js +1 -1
  90. package/CanopyX.Html/Assets/canopyx-timeline.css +19 -19
  91. package/CanopyX.Html/Assets/canopyx-timeline.js +2 -2
  92. package/CanopyX.Html/Assets/canopyx-tree-tools.css +21 -21
  93. package/CanopyX.Html/Assets/canopyx-tree-tools.js +3 -3
  94. package/CanopyX.Html/Assets/canopyx-ui-menu.css +7 -7
  95. package/CanopyX.Html/Assets/canopyx-ui-menu.js +1 -1
  96. package/CanopyX.Html/Assets/canopyx-ui-navigation.css +5 -5
  97. package/CanopyX.Html/Assets/canopyx-ui-navigation.js +1 -1
  98. package/CanopyX.Html/Assets/canopyx-ui-overlays.css +5 -5
  99. package/CanopyX.Html/Assets/canopyx-ui-overlays.js +5 -2
  100. package/CanopyX.Html/Assets/canopyx-ui-picker.css +2 -2
  101. package/CanopyX.Html/Assets/canopyx-ui-picker.js +1 -1
  102. package/CanopyX.Html/Assets/canopyx-ui-stepper.css +12 -12
  103. package/CanopyX.Html/Assets/canopyx-ui-stepper.js +1 -1
  104. package/CanopyX.Html/Assets/canopyx-ui-tabs.css +8 -8
  105. package/CanopyX.Html/Assets/canopyx-ui-tabs.js +1 -1
  106. package/CanopyX.Html/Assets/canopyx-view-intents.css +1 -1
  107. package/CanopyX.Html/Assets/canopyx-view-intents.js +1 -1
  108. package/CanopyX.Html/Assets/canopyx.css +47 -46
  109. package/CanopyX.Html/Assets/canopyx.js +10 -8
  110. package/JavaScript/column-groups.d.ts +24 -4
  111. package/JavaScript/grid.d.ts +11 -1
  112. package/JavaScript/hosts.d.ts +2 -0
  113. package/JavaScript/protocol.d.ts +2 -0
  114. package/JavaScript/records.d.ts +2 -0
  115. package/README.md +76 -206
  116. package/README.nuget.md +63 -87
  117. package/package.json +1 -1
@@ -1,8 +1,8 @@
1
1
  /* The Layout menu: radio groups for the mode and the density. */
2
2
  .cx-chrome .cx-grid-layout > .cx-grid-panel{display:block;width:var(--cx-size-244px);padding:var(--hfx-space-1-5,6px) var(--hfx-space-2,0.5rem);}
3
3
  .cx-layout-group{padding:var(--hfx-space-1,0.25rem) 0;}
4
- .cx-layout-group + .cx-layout-group{border-top:var(--hfx-border-width,1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));margin-top:var(--hfx-space-1,0.25rem);padding-top:var(--hfx-space-2,0.5rem);}
5
- .cx-layout-title{padding:0 var(--hfx-space-1-5,6px) var(--hfx-space-1,0.25rem);font-size:var(--hfx-type-caption-size,0.75rem);font-weight:700;color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));}
4
+ .cx-layout-group + .cx-layout-group{border-top:var(--hfx-border-width,1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));margin-top:var(--hfx-space-1,0.25rem);padding-top:var(--hfx-space-2,0.5rem);}
5
+ .cx-layout-title{padding:0 var(--hfx-space-1-5,6px) var(--hfx-space-1,0.25rem);font-size:var(--hfx-type-caption-size,0.75rem);font-weight:700;color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));}
6
6
  .cx-layout-choice{display:flex;align-items:center;gap:var(--hfx-space-2,0.5rem);min-height:var(--cx-size-32px);padding:0 var(--hfx-space-1-5,6px);border-radius:var(--hfx-radius-sm,4px);cursor:pointer;}
7
7
  .cx-layout-choice:hover{background:var(--hfx-color-hover,light-dark(#f5f5f5,#232529));}
8
8
  .cx-layout-choice input{flex:none;width:var(--cx-size-16px);height:var(--cx-size-16px);margin:0;accent-color:var(--hfx-color-accent,light-dark(#11776f,#37c9b8));}
@@ -19,19 +19,19 @@
19
19
  .cx-data-grid[data-cx-layout="cards"] .cx-head{display:none;}
20
20
  .cx-chrome .cx-grid-sort > .cx-grid-panel{display:block;width:var(--cx-size-280px);padding:var(--hfx-space-1-5,6px) var(--hfx-space-2,0.5rem);}
21
21
  .cx-sort-list{display:flex;flex-direction:column;gap:var(--hfx-space-0-5,2px);}
22
- .cx-grid-sort .cx-grid-selection-controls{padding:var(--hfx-space-1,0.25rem) var(--hfx-space-1-5,6px) var(--hfx-space-2,0.5rem);margin-bottom:var(--hfx-space-1-5,6px);border-bottom:var(--hfx-border-width,1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));}
22
+ .cx-grid-sort .cx-grid-selection-controls{padding:var(--hfx-space-1,0.25rem) var(--hfx-space-1-5,6px) var(--hfx-space-2,0.5rem);margin-bottom:var(--hfx-space-1-5,6px);border-bottom:var(--hfx-border-width,1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));}
23
23
  .cx-sort-choice{display:flex;align-items:center;gap:var(--hfx-space-1,0.25rem);min-height:var(--cx-size-32px);}
24
24
  .cx-chrome .cx-sort-choice .cx-sort-column{flex:1;min-width:0;justify-content:start;border:0;border-radius:var(--hfx-radius-sm,4px);background:transparent;overflow:hidden;text-overflow:ellipsis;}
25
- .cx-chrome .cx-sort-choice span.cx-sort-column{padding:0 var(--cx-size-11px);color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));}
25
+ .cx-chrome .cx-sort-choice span.cx-sort-column{padding:0 var(--cx-size-11px);color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));}
26
26
  .cx-chrome .cx-sort-choice .cx-sort-column[aria-pressed="true"]{color:var(--hfx-color-accent-text,light-dark(#02726a,#37c9b8));background:var(--hfx-color-accent-subtle,light-dark(#e7f1f1,#1b3435));font-weight:600;}
27
27
  .cx-chrome .cx-sort-choice .cx-sort-menu{flex:none;border:0;background:transparent;color:var(--hfx-color-text-secondary,light-dark(#4d525b,#b0b4bc));}
28
28
  .cx-chrome.cx-phone .cx-grid-sort > summary{width:var(--cx-size-44px);font-size:0;padding:0;}
29
29
  .cx-chrome.cx-phone .cx-sort-choice{min-height:var(--cx-size-44px);}
30
30
  .cx-chrome.cx-phone .cx-sort-choice .cx-button{min-height:var(--cx-size-44px);}
31
- .cx-data-grid[data-cx-layout="cards"] .cx-grid{background:color-mix(in srgb,var(--hfx-color-surface,light-dark(#ffffff,#16181c)) 96%,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)));}
31
+ .cx-data-grid[data-cx-layout="cards"] .cx-grid{background:color-mix(in srgb,var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c))) 96%,var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5))));}
32
32
  .cx-data-grid[data-cx-layout="cards"] .cx-row:not(.cx-grid-group):not(.cx-detail-row){
33
33
  width:var(--cx-card-width) !important;min-width:0;height:var(--cx-card-height) !important;
34
- border:var(--hfx-border-width,1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));border-radius:var(--hfx-radius-container,var(--hfx-radius-lg,10px));background:var(--hfx-color-surface,light-dark(#ffffff,#16181c));
34
+ border:var(--hfx-border-width,1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));border-radius:var(--hfx-radius-container,var(--hfx-radius-lg,10px));background:var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));
35
35
  box-shadow:var(--hfx-elevation-1,0 1px 2px rgba(22,24,28,.06));
36
36
  }
37
37
  .cx-data-grid[data-cx-layout="cards"] .cx-row:not(.cx-status):not(.cx-grid-group){
@@ -49,13 +49,13 @@ grid-column:1/-1;height:var(--cx-card-title);flex-direction:row;align-items:cent
49
49
  .cx-data-grid[data-cx-layout="cards"] .cx-cell:is([data-cx-card="wide"],[data-cx-card="pill"],[data-cx-card="footer"]){grid-column:1/-1;}
50
50
  .cx-data-grid[data-cx-layout="cards"] .cx-cell[data-cx-label]::before{
51
51
  content:attr(data-cx-label) / "";display:block;flex:none;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
52
- font-size:var(--hfx-type-caption-size,0.75rem);font-weight:var(--hfx-weight-semibold,600);line-height:var(--hfx-type-caption-line-height,1.35);color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));
52
+ font-size:var(--hfx-type-caption-size,0.75rem);font-weight:var(--hfx-weight-semibold,600);line-height:var(--hfx-type-caption-line-height,1.35);color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));
53
53
  }
54
54
  .cx-data-grid[data-cx-layout="cards"] .cx-row > .cx-cell[data-cx-card="footer"]{
55
- flex-direction:row;justify-content:flex-start;gap:var(--hfx-space-1-5,6px);border-top:var(--hfx-border-width,1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));font-size:var(--hfx-type-caption-size,0.75rem);
55
+ flex-direction:row;justify-content:flex-start;gap:var(--hfx-space-1-5,6px);border-top:var(--hfx-border-width,1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));font-size:var(--hfx-type-caption-size,0.75rem);
56
56
  }
57
57
  .cx-data-grid[data-cx-layout="cards"] .cx-cell[data-cx-card="pill"] :is(.p-pill,.p-state){border-radius:var(--hfx-radius-pill,999px);max-width:100%;overflow:hidden;text-overflow:ellipsis;}
58
- .cx-data-grid[data-cx-layout="cards"] .cx-cell[data-cx-card="pill"] .p-state{padding:var(--hfx-space-0-5,2px) var(--hfx-space-2,0.5rem);background:color-mix(in srgb,currentColor 8%,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));}
58
+ .cx-data-grid[data-cx-layout="cards"] .cx-cell[data-cx-card="pill"] .p-state{padding:var(--hfx-space-0-5,2px) var(--hfx-space-2,0.5rem);background:color-mix(in srgb,currentColor 8%,var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c))));}
59
59
  .cx-data-grid[data-cx-layout="cards"] .cx-cell > :is(.cx-text,.cx-presenter-text){max-width:100%;}
60
60
  .cx-data-grid[data-cx-layout="cards"] .cx-card-templated > :not(.cx-card-slot):not(.cx-grid-row-select){display:none;}
61
61
  .cx-card-slot{display:block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:pre;}
@@ -1,11 +1,11 @@
1
- (function(global){"use strict";const installed=new WeakSet();const part={version:"077268d4fb78c464",install(context){if(installed.has(context.VIEW_MODES))return;const{VIEW_MODES,TreeGrid,h,setText,fill,numberFormat,foldText,cellText,cellValue,isCellObject,setAttr,toneOf,watchFlyout,densityRowHeight,layoutAnchor,layoutRows,layoutApplyTree,MAX_PROTOCOL_INTEGER,LAYOUT_DENSITIES,plural,svgIcon}=context;const CARD_METRICS={compact:{pad:12,field:36,gap:8,title:28},default:{pad:16,field:40,gap:10,title:30},comfortable:{pad:20,field:44,gap:12,title:32}};const CARD_MIN=280,CARD_GUTTER=16,CARD_COLUMN_GAP=16,CARD_WIDE=["longText","tags","list"];function cardWide(column){return!!column.wrap||!!column.flex||CARD_WIDE.includes(column.presenter?.kind)}
1
+ (function(global){"use strict";const installed=new WeakSet();const part={version:"90267e35e7edf3a4",install(context){if(installed.has(context.VIEW_MODES))return;const{VIEW_MODES,TreeGrid,h,setText,fill,numberFormat,foldText,cellText,cellValue,isCellObject,setAttr,toneOf,watchFlyout,densityRowHeight,layoutAnchor,layoutRows,layoutApplyTree,MAX_PROTOCOL_INTEGER,LAYOUT_DENSITIES,plural,svgIcon}=context;const CARD_METRICS={compact:{pad:12,field:36,gap:8,title:28},default:{pad:16,field:40,gap:10,title:30},comfortable:{pad:20,field:44,gap:12,title:32}};const CARD_MIN=280,CARD_GUTTER=16,CARD_COLUMN_GAP=16,CARD_WIDE=["longText","tags","list"];function cardWide(column){return!!column.wrap||!!column.flex||CARD_WIDE.includes(column.presenter?.kind)}
2
2
  function cardRole(column,index,columns){if(!index)return "title";if(["enum","state"].includes(column.presenter?.kind))return "pill";if(index===columns.length-1&&column.kind==="datetime")return "footer";return cardWide(column)?"wide":"field"}
3
3
  VIEW_MODES.cardRole=cardRole;function cardGeometry(view){const metrics={...CARD_METRICS[view.density]},available=Math.max(0,(view.grid.clientWidth||view.host.clientWidth)- 2*CARD_GUTTER);const lanes=view.rowProjection?1:Math.max(1,Math.floor((available+CARD_COLUMN_GAP)/ (CARD_MIN + CARD_COLUMN_GAP)));
4
4
  const width=Math.max(0,(available -(lanes-1)*CARD_COLUMN_GAP)/ lanes), fields = (view.cols || []).slice(1);
5
5
  const columns=width-2*metrics.pad>=264?2:1,span=columns;const font=parseFloat(getComputedStyle(view.grid).fontSize),clampLines=column=>Math.min(column.maxLines??2,2);if(fields.some(column=>column.wrap))metrics.field=Math.max(metrics.field,Math.ceil(11.5*1.35+1+font*1.4*Math.max(...fields.filter(column=>column.wrap).map(clampLines))));if(view.cols?.[0]?.wrap)metrics.title=Math.max(metrics.title,Math.ceil((font+1)*1.4*clampLines(view.cols[0])));let lines=0,used=0;fields.forEach((column,index)=>{const role=cardRole(column,index+1,view.cols),size=role==="field"?1:columns;if(used&&used+size>columns){lines++;used=0}
6
6
  used +=size;if(used===columns){lines++;used=0}});if(used)lines++;const height=2*metrics.pad+metrics.title+lines*(metrics.field+metrics.gap)+ 2;return{columns,span,lanes,width,metrics,height,pitch:height+CARD_COLUMN_GAP}}
7
7
  function cardStyle(view,geometry){const style=view.host.style,{metrics}=geometry;style.setProperty("--cx-card-cols",String(geometry.columns));style.setProperty("--cx-card-span",String(geometry.span));style.setProperty("--cx-card-pad",metrics.pad+"px");style.setProperty("--cx-card-field",metrics.field+"px");style.setProperty("--cx-card-gap",metrics.gap+"px");style.setProperty("--cx-card-title",metrics.title+"px");style.setProperty("--cx-card-width",geometry.width+"px");style.setProperty("--cx-card-height",geometry.height+"px");view.cardGeometry=geometry;cardMinHeight(view)}
8
- function cardMinHeight(view){const count=view.rowProjection?view.rowProjection.rowCount():Math.max(0,view.rowBounds().last-view.pageOffset+1);const bands=Math.ceil(count / view.cardGeometry.lanes), chrome = [...view.host.children].reduce((height, child) => height + (child === view.grid ? 0 : child.offsetHeight), 2);
8
+ function cardMinHeight(view){const count=view.rowProjection?view.rowProjection.rowCount():Math.max(0,view.rowBounds().last-view.pageOffset+1);if(!count&&view.fitEmpty)return;const bands=Math.ceil(count / view.cardGeometry.lanes), chrome = [...view.host.children].reduce((height, child) => height + (child === view.grid ? 0 : child.offsetHeight), 2);
9
9
  view.host.style.setProperty("--cx-min-h",chrome+Math.min(2,Math.max(1,bands))*view.cardGeometry.pitch+CARD_GUTTER+"px")}
10
10
  function cardTotal(view){const bounds=view.rowBounds(),count=Math.max(0,bounds.last-bounds.first+1);return count?Math.ceil(count / view.cardGeometry.lanes) * view.rowH + CARD_GUTTER : 0;
11
11
  }
@@ -1,13 +1,13 @@
1
1
  /* Linked views: external filter chips and highlighted rows. The info tone keeps both apart from the reader's own chips and selection. */
2
- .cx-has-linked,.cx-link-bar,.cx-link-chip{--cx-linked-bg:color-mix(in srgb,var(--hfx-color-status-info-fg,light-dark(#2b5fc0,#74a2f7)) 14%,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));}
2
+ .cx-has-linked,.cx-link-bar,.cx-link-chip{--cx-linked-bg:color-mix(in srgb,var(--hfx-color-status-info-fg,light-dark(#2b5fc0,#74a2f7)) 14%,var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c))));}
3
3
  .cx-has-linked .cx-row[data-cx-linked="true"]{background:var(--cx-linked-bg);}
4
4
  .cx-has-linked .cx-row[data-cx-linked="true"][aria-selected="true"]{background:color-mix(in srgb,var(--hfx-color-status-info-fg,light-dark(#2b5fc0,#74a2f7)) 14%,var(--hfx-color-accent-subtle,light-dark(#e7f1f1,#1b3435)));}
5
5
  .cx-has-linked .cx-row[data-cx-linked="true"] [data-cx-pin]{background:var(--cx-linked-bg);}
6
6
  .cx-has-linked .cx-row[data-cx-linked="true"] > :first-child{box-shadow:inset var(--cx-size-3px) 0 0 var(--hfx-color-status-info-fg,light-dark(#2b5fc0,#74a2f7));}
7
7
  .cx-link-bar{flex:none;display:flex;flex-wrap:wrap;gap:var(--cx-size-6px);padding:0 0 var(--cx-size-8px);min-width:0;}
8
- .cx-link-chip{max-width:100%;height:var(--cx-size-24px);min-height:var(--cx-size-24px);padding:0 var(--cx-size-9px);border:0;border-radius:var(--hfx-radius-control,var(--hfx-radius-md,6px));background:var(--cx-linked-bg);color:var(--hfx-color-text,light-dark(#16181c,#f2f3f5));font:inherit;font-size:var(--cx-size-13px);white-space:nowrap;overflow:hidden;cursor:pointer;}
8
+ .cx-link-chip{max-width:100%;height:var(--cx-size-24px);min-height:var(--cx-size-24px);padding:0 var(--cx-size-9px);border:0;border-radius:var(--hfx-radius-control,var(--hfx-radius-md,6px));background:var(--cx-linked-bg);color:var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)));font:inherit;font-size:var(--cx-size-13px);white-space:nowrap;overflow:hidden;cursor:pointer;}
9
9
  .cx-data-grid .cx-link-chip.cx-grid-chip{background:var(--cx-linked-bg);}
10
- .cx-link-chip:hover{background:color-mix(in srgb,var(--hfx-color-status-info-fg,light-dark(#2b5fc0,#74a2f7)) 22%,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));}
10
+ .cx-link-chip:hover{background:color-mix(in srgb,var(--hfx-color-status-info-fg,light-dark(#2b5fc0,#74a2f7)) 22%,var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c))));}
11
11
  .cx-link-chip: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);}
12
12
  @media (forced-colors:active){
13
13
  .cx-has-linked .cx-row[data-cx-linked="true"]{outline:var(--cx-size-2px) dashed Highlight;outline-offset:calc(-1 * var(--hfx-focus-width,2px));}
@@ -1,4 +1,4 @@
1
- (function(global){"use strict";const installed=new WeakSet();const part={version:"fd21dd4495607a16",install(context){if(installed.has(context.LINK_IMPL))return;const{LINK_IMPL,h,setText,filterChipContent,fill,numberFormat,cellValue,setAttr,cellMatches}=context;const{TreeGrid,DataGrid}=LINK_IMPL;const LINK_SOURCE=/^[A-Za-z0-9][\w.:-]{0,127}$/, LINK_MAX_KEYS = 10000, LINK_MAX_VALUES = 1000;
1
+ (function(global){"use strict";const installed=new WeakSet();const part={version:"7485f5c9875e9f9b",install(context){if(installed.has(context.LINK_IMPL))return;const{LINK_IMPL,h,setText,filterChipContent,fill,numberFormat,cellValue,setAttr,cellMatches}=context;const{TreeGrid,DataGrid}=LINK_IMPL;const LINK_SOURCE=/^[A-Za-z0-9][\w.:-]{0,127}$/, LINK_MAX_KEYS = 10000, LINK_MAX_VALUES = 1000;
2
2
  const linkText=(value,name,max)=>{if(value===undefined)return undefined;if(typeof value!=="string"||!/\S/.test(value) || value.length > max) throw new Error("CanopyX: link " + name + " must be visible text of at most " + max + " characters.");
3
3
  return value};const linkIsoDate=value=>typeof value==="string"&&/^\d{4}-\d\d-\d\dT.*(?:Z|[+-]\d\d:\d\d)$/.test(value) && Number.isFinite(Date.parse(value));
4
4
  function linkColumn(grid,field){const column=grid.view.columns.find(item=>item.id===field);if(!column)throw new Error("CanopyX: a link names the undeclared column '"+field+"'.");return column}
@@ -11,8 +11,8 @@ function linkCell(grid,record,field){return grid.kind==="tree"&&field===grid.vie
11
11
  function linkPredicates(filters){return filters.flatMap(filter=>filter.values?[{column:filter.field,operator:filter.values.length===1?"eq":"in",values:filter.values.slice()}]:
12
12
  [filter.range[0]==null?null:{column:filter.field,operator:"ge",values:[filter.range[0]]},filter.range[1]==null?null:{column:filter.field,operator:"le",values:[filter.range[1]]}].filter(Boolean))}
13
13
  function linkMatcher(grid){const predicates=linkPredicates(grid.linkFilters).map(predicate=>{const column=linkColumn(grid,predicate.column);return[predicate,column.kind===undefined?{...column,kind:"text"}:column]});return record=>predicates.every(([predicate,column])=>cellMatches(linkCell(grid,record,column.id),predicate,column))}
14
- const LINK_COMMON={setExternalFilter(source,filter){return this.linkSet(source,filter,"api")},clearExternalFilters(source){return source===undefined?this.linkApply([],"api"):this.linkSet(source,null,"api")},linkSet(source,filter,reason){if(typeof source!=="string"||!LINK_SOURCE.test(source))throw new Error("CanopyX: a link source is 1 to 128 letters, digits, '.', ':', '_' or '-'.");const list=filter==null?[]:(Array.isArray(filter)?filter:[filter]).map(item=>linkFilter(this,source,item));if(list.length>8)throw new Error("CanopyX: one source applies at most 8 external filters.");const next=(this.linkFilters||[]).filter(item=>item.source!==source).concat(list);if(next.length>32)throw new Error("CanopyX: a view takes at most 32 external filters.");return this.linkApply(next,reason)},async linkApply(next,reason){if(this.destroyed)return false;if(JSON.stringify(next)===JSON.stringify(this.linkFilters||[]))return this.linkPending||true;const pending=this.linkCommit(next,reason);this.linkPending=pending;try{return await pending}finally{if(this.linkPending===pending)this.linkPending=null}},linkChanged(reason){const committed=this.linkCommitted||[],last=committed[committed.length-1],count=this.linkCount();this.emit("externalfilter",{filters:this.getExternalFilters(),reason:reason||"api"});setText(this.live,!last?this.labels.linkCleared:count==null?fill(this.labels.linkFilteredBy,{source:last.sourceLabel,values:linkValuesText(this,last)}):
15
- fill(this.labels.linkFiltered,{source:last.sourceLabel,count:numberFormat(this.lang).format(count)}))},linkChip(source,run){const filters=this.linkCommitted.filter(item=>item.source===source),first=filters[0];const values=filters.map(item=>linkValuesText(this,item)).join("; ");const description=filters.map(item=>linkValuesText(this,item,true)).join("; ");const text=fill(this.labels.linkFilteredBy,{source:first.sourceLabel,values});const button=h("button","cx-button cx-link-chip" +(this.kind==="grid"?" cx-grid-chip":""));button.type="button";filterChipContent(button,text);button.title=fill(this.labels.linkFilteredBy,{source:first.sourceLabel,values:description});button.setAttribute("aria-label",fill(this.labels.linkRemoveFilter,{source:first.sourceLabel,values:description}));button.setAttribute("data-cx-condition","link-"+source);button.setAttribute("data-cx-link-source",source);button.onclick=()=>{button.focus({preventScroll:true});run()};return button},linkSources(){return Array.from(new Set((this.linkCommitted||[]).map(item=>item.source)))},linkRemove(source){try{this.linkSet(source,null,"user").catch(error=>{if(!error||error.name!=="AbortError")this.emit("error",{error})})}
14
+ const LINK_COMMON={setExternalFilter(source,filter){return this.linkSet(source,filter,"api")},clearExternalFilters(source){return source===undefined?this.linkApply([],"api"):this.linkSet(source,null,"api")},linkSet(source,filter,reason){if(typeof source!=="string"||!LINK_SOURCE.test(source))throw new Error("CanopyX: a link source is 1 to 128 letters, digits, '.', ':', '_' or '-'.");const list=filter==null?[]:(Array.isArray(filter)?filter:[filter]).map(item=>linkFilter(this,source,item));if(list.length>8)throw new Error("CanopyX: one source applies at most 8 external filters.");const sourceLabel=(Array.isArray(filter)?filter:[filter]).find(item=>item?.sourceLabel)?.sourceLabel;if(sourceLabel)for(const item of list)item.sourceLabel=sourceLabel;const next=(this.linkFilters||[]).filter(item=>item.source!==source).concat(list);if(next.length>32)throw new Error("CanopyX: a view takes at most 32 external filters.");return this.linkApply(next,reason)},async linkApply(next,reason){if(this.destroyed)return false;if(JSON.stringify(next)===JSON.stringify(this.linkFilters||[]))return this.linkPending||true;const pending=this.linkCommit(next,reason);this.linkPending=pending;try{return await pending}finally{if(this.linkPending===pending)this.linkPending=null}},linkChanged(reason){const committed=this.linkCommitted||[],last=committed[committed.length-1],count=this.linkCount();this.emit("externalfilter",{filters:this.getExternalFilters(),reason:reason||"api"});setText(this.live,!last?this.labels.linkCleared:count==null?fill(this.labels.linkFilteredBy,{source:last.sourceLabel,values:linkValuesText(this,last)}):
15
+ fill(this.labels.linkFiltered,{source:last.sourceLabel,count:numberFormat(this.lang).format(count)}))},linkChip(source,run){const filters=this.linkCommitted.filter(item=>item.source===source),first=filters[0];const caption=(item,describeRange=false)=>(filters.length>1&&!item.label?linkColumn(this,item.field).title+": ":"")+ linkValuesText(this,item,describeRange);const values=filters.map(item=>caption(item)).join(" · ");const description=filters.map(item=>caption(item,true)).join(" · ");const text=fill(this.labels.linkFilteredBy,{source:first.sourceLabel,values});const button=h("button","cx-button cx-link-chip" +(this.kind==="grid"?" cx-grid-chip":""));button.type="button";filterChipContent(button,text);button.title=fill(this.labels.linkFilteredBy,{source:first.sourceLabel,values:description});button.setAttribute("aria-label",fill(this.labels.linkRemoveFilter,{source:first.sourceLabel,values:description}));button.setAttribute("data-cx-condition","link-"+source);button.setAttribute("data-cx-link-source",source);button.onclick=()=>{button.focus({preventScroll:true});run()};return button},linkSources(){return Array.from(new Set((this.linkCommitted||[]).map(item=>item.source)))},linkRemove(source){try{this.linkSet(source,null,"user").catch(error=>{if(!error||error.name!=="AbortError")this.emit("error",{error})})}
16
16
  catch(error){this.emit("error",{error})}}};Object.assign(TreeGrid.prototype,LINK_COMMON);if(DataGrid)Object.assign(DataGrid.prototype,LINK_COMMON);if(DataGrid){const{gridQueryStart}=LINK_IMPL;const proto=DataGrid.prototype,SET_QUERY=proto.setQuery,FOR_CHANGE=proto.queryForChange,GET_STATE=proto.getState;const SUMMARY=proto.syncQuerySummary,CHROME=proto.syncGridChrome,NOTICE=proto.setNotice,DESTROY=proto.destroy;const same=(a,b)=>JSON.stringify(a)===JSON.stringify(b),LINK_OWN=LINK_IMPL.queryOwn;const strip=(filters,tail)=>{filters=filters||[];if(!tail||!tail.length||filters.length<tail.length)return filters;return tail.every((filter,index)=>same(filters[filters.length-tail.length+index],filter))?filters.slice(0,filters.length-tail.length):filters};const tailOf=(grid,pending)=>pending&&grid.pendingQuery&&grid.linkSent?grid.linkSent.ext:grid.linkAcceptedExt;Object.assign(proto,{setQuery(input,paging){const desired=this.linkFilters||[];if(!desired.length&&!this.linkAcceptedExt&&!this.linkSent)return SET_QUERY.call(this,input,paging);const ext=linkPredicates(desired),own=!input||!input.filters?[]:input[LINK_OWN]?input.filters:strip(input.filters,tailOf(this,true));const before=this.queryEpoch,promise=SET_QUERY.call(this,{...(input||{}),filters:own.concat(ext),[LINK_OWN]:undefined},paging);if(this.queryEpoch!==before)this.linkSent={epoch:this.queryEpoch,ext,desired:desired.slice()};return promise.catch(error=>{if((!error||error.name!=="AbortError")&&!this.destroyed&&!this.pendingQuery){if(this.lastFailedQuery&&this.linkSent?.epoch===this.queryEpoch)
17
17
  this.lastFailedQuery={...this.lastFailedQuery,filters:strip(this.lastFailedQuery.filters,this.linkSent.ext),[LINK_OWN]:true};this.linkFilters=(this.linkCommitted||[]).slice();this.linkReason=null;this.linkSent=null;this.syncQuerySummary()}
18
18
  throw error})},queryForChange(includeQueuedInput,includeExternal){const query=FOR_CHANGE.call(this,includeQueuedInput),tail=tailOf(this,true);if(includeExternal)return query;return tail&&query.filters?{...query,filters:strip(query.filters,tail),[LINK_OWN]:true}:query},getState(){const state=GET_STATE.call(this);if(!this.linkAcceptedExt)return state;const own=strip(state.query.filters,this.linkAcceptedExt);const kept=linkPredicates((this.linkCommitted||[]).filter(filter=>filter.persist)).filter(filter=>!own.some(item=>same(item,filter)));return{...state,query:{...state.query,filters:own.concat(kept)}}},async linkCommit(next,reason){this.linkFilters=next;this.linkReason=reason;if(!this.acceptedQuery&&!this.pendingQuery)await this.ready;try{await this.setQuery(gridQueryStart(this.queryForChange(true)));return true}
@@ -1,8 +1,8 @@
1
- (function(global){"use strict";const installed=new WeakSet();const part={version:"f1ab7e32b501ce37",install(context){if(installed.has(context.TreeGrid.prototype))return;const{TreeGrid,navigationScope}=context;Object.assign(TreeGrid.prototype,{deepLinkName(){return "cx."+encodeURIComponent(this.view.id)},hashParams(){return(global.location.hash||"").replace(/^#/, "").split("&").filter(Boolean);
1
+ (function(global){"use strict";const installed=new WeakSet();const part={version:"c6579c9401f0971d",install(context){if(installed.has(context.TreeGrid.prototype))return;const{TreeGrid,navigationScope}=context;Object.assign(TreeGrid.prototype,{deepLinkName(){return "cx."+encodeURIComponent(this.view.id)},hashParams(){return(global.location.hash||"").replace(/^#/, "").split("&").filter(Boolean);
2
2
  },currentLink(){if(this.opts.parseLink){return(global.location.hash||"").replace(/^#/, "");
3
3
  }
4
4
  const prefix=this.deepLinkName()+ "=";const param=this.hashParams().find((p)=>p.startsWith(prefix));return param?param.slice(prefix.length):null},openDeepLink(){const link=this.view.deepLink?this.currentLink():null;if(link!==this.link&&this.linkOpening)this.linkOpening.abort();if(link==null||link===this.link){if(link==null)this.link=null;return link!=null&&this.linkTask&&this.linkTask.link===link?this.linkTask.promise:Promise.resolve()}
5
- this.link=link;if(this.linkOpening)this.linkOpening.abort();const current=this.linkOpening=new AbortController();const promise=this.openLink(link,current);this.linkTask={link,promise};promise.then(()=>{if(this.linkTask&&this.linkTask.promise===promise)this.linkTask=null});return promise},async openLink(link,current){const navigation=navigationScope(this,current.signal,true);try{const ids=this.opts.parseLink?await navigation.wait(this.opts.parseLink(link)):link.split("/").filter(Boolean).map(decodeURIComponent);if(Array.isArray(ids)&&ids.length&&!navigation.cancelled()&&
5
+ this.link=link;if(this.linkOpening)this.linkOpening.abort();const current=this.linkOpening=new AbortController();const promise=this.openLink(link,current);this.linkTask={link,promise};promise.then(()=>{if(this.linkTask&&this.linkTask.promise===promise)this.linkTask=null});return promise},async openLink(link,current){const navigation=navigationScope(this,current.signal,true);const cancelled=navigation.cancelled;navigation.cancelled=()=>cancelled()||this.currentLink()!==link;try{const ids=this.opts.parseLink?await navigation.wait(this.opts.parseLink(link)):link.split("/").filter(Boolean).map(decodeURIComponent);if(Array.isArray(ids)&&ids.length&&!navigation.cancelled()&&
6
6
  !await this.navigatePath(ids,{select:true,focus:false},navigation)&&!navigation.cancelled()){this.link=null}}catch(e){if(!navigation.cancelled()){this.link=null;this.announce(e&&e.message?e.message:String(e))}}finally{const cancelled=navigation.cancelled();navigation.dispose();if(this.linkOpening===current){if(cancelled&&this.link===link)this.link=null;this.linkOpening=null}
7
7
  current.abort()}},writeDeepLink(w,revision=this.selectionRevision){if(!this.view.deepLink){return}
8
8
  let hash;if(this.opts.formatLink){let link=null;try{link=this.opts.formatLink(w?this.pathOf(w):[],w?w.h:null)}catch(e){if(global.console)global.console.error(e)}
@@ -1,8 +1,8 @@
1
1
  /* Live data: the order prompt sits in the toolbar (over the rows without one);changed cells flash (a still outline with reduced motion). */
2
2
  .cx-data-grid.cx-live-grid{position:relative;}
3
- .cx-data-grid .cx-live-bar{display:inline-flex;align-items:center;gap:var(--cx-size-6px);flex:none;max-width:100%;height:var(--hfx-control-height-md,calc(36px - var(--cx-compact,0) * 8px));padding:0 var(--cx-size-2px) 0 var(--cx-size-10px);border-radius:var(--hfx-radius-control,var(--hfx-radius-md,6px));background:var(--hfx-color-accent-subtle,light-dark(#e7f1f1,#1b3435));color:var(--hfx-color-text,light-dark(#16181c,#f2f3f5));font-size:var(--cx-size-13d5px);white-space:nowrap;}
3
+ .cx-data-grid .cx-live-bar{display:inline-flex;align-items:center;gap:var(--cx-size-6px);flex:none;max-width:100%;height:var(--hfx-control-height-md,calc(36px - var(--cx-compact,0) * 8px));padding:0 var(--cx-size-2px) 0 var(--cx-size-10px);border-radius:var(--hfx-radius-control,var(--hfx-radius-md,6px));background:var(--hfx-color-accent-subtle,light-dark(#e7f1f1,#1b3435));color:var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)));font-size:var(--cx-size-13d5px);white-space:nowrap;}
4
4
  .cx-data-grid .cx-live-bar[hidden]{display:none;}
5
- .cx-data-grid .cx-live-bar.cx-live-float{position:absolute;left:50%;z-index:4;transform:translateX(-50%);max-width:calc(100% - var(--cx-size-24px));border:var(--cx-size-1px) solid var(--hfx-color-border-strong,light-dark(#cdd0d5,#363a42));background:var(--hfx-color-surface,light-dark(#ffffff,#16181c));box-shadow:var(--hfx-elevation-2,0 1px 2px rgba(22,24,28,.05),0 6px 18px -10px rgba(22,24,28,.18));}
5
+ .cx-data-grid .cx-live-bar.cx-live-float{position:absolute;left:50%;z-index:4;transform:translateX(-50%);max-width:calc(100% - var(--cx-size-24px));border:var(--cx-size-1px) solid var(--hfx-color-border-strong,light-dark(#cdd0d5,#363a42));background:var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));box-shadow:var(--hfx-elevation-2,0 1px 2px rgba(22,24,28,.05),0 6px 18px -10px rgba(22,24,28,.18));}
6
6
  .cx-data-grid .cx-live-bar .cx-ico{flex:none;width:var(--cx-size-16px);height:var(--cx-size-16px);color:var(--hfx-color-accent,light-dark(#11776f,#37c9b8));}
7
7
  .cx-data-grid .cx-live-bar-text{overflow:hidden;text-overflow:ellipsis;}
8
8
  .cx-data-grid .cx-live-bar .cx-button{block-size:var(--hfx-control-height-sm,calc(28px - var(--cx-compact,0) * 4px));min-block-size:var(--hfx-control-height-sm,calc(28px - var(--cx-compact,0) * 4px));padding:0 var(--hfx-space-2,0.5rem);}
@@ -1,4 +1,4 @@
1
- (function(global){"use strict";const installed=new WeakSet();const part={version:"4ef2fb01714f877e",install(context){if(installed.has(context.DataGrid.prototype))return;const{DataGrid,h,setText,fill,gridButton,gridIcon,gridQuery,gridResultShape,gridQueryRows,gridCompare,gridOrder,gridIdOrder,validateGridRows,validateGridPage,validateGridCursorPage,gridFreeze,requireIdentifier,checkDocument,cellValue,PROTOCOL,GRID_REPORTING,GRID_CALCULATIONS,VIEW_MODES,inlineGridSource}=context;const LIVE_KEYS=new Set(["stableOrder","flash","batchMs","pollMs","load","announce","pauseWhenHidden"]);const LIVE_MAX_ROWS=100000;function liveOptions(view,options){const read=value=>{if(value===undefined||value===true||value===false)return{};if(!value||typeof value!=="object"||Array.isArray(value)||Object.keys(value).some(key=>!LIVE_KEYS.has(key)))
1
+ (function(global){"use strict";const installed=new WeakSet();const part={version:"78791b002a111843",install(context){if(installed.has(context.DataGrid.prototype))return;const{DataGrid,h,setText,fill,gridButton,gridIcon,gridQuery,gridResultShape,gridQueryRows,gridCompare,gridOrder,gridIdOrder,validateGridRows,validateGridPage,validateGridCursorPage,gridFreeze,requireIdentifier,checkDocument,cellValue,PROTOCOL,GRID_REPORTING,GRID_CALCULATIONS,VIEW_MODES,inlineGridSource}=context;const LIVE_KEYS=new Set(["stableOrder","flash","batchMs","pollMs","load","announce","pauseWhenHidden"]);const LIVE_MAX_ROWS=100000;function liveOptions(view,options){const read=value=>{if(value===undefined||value===true||value===false)return{};if(!value||typeof value!=="object"||Array.isArray(value)||Object.keys(value).some(key=>!LIVE_KEYS.has(key)))
2
2
  throw new Error("CanopyX: live takes stableOrder, flash, batchMs, pollMs, load, announce and pauseWhenHidden.");return value};const merged=options.live===false?{}:{...read(view.live),...read(options.live)},flash=merged.flash;const integer=(value,min,max)=>value===undefined||Number.isInteger(value)&&value>=min&&value<=max;if(["stableOrder","announce","pauseWhenHidden"].some(key=>merged[key]!==undefined&&typeof merged[key]!=="boolean")||
3
3
  !(flash===undefined||typeof flash==="boolean"||flash&&typeof flash==="object"&&Object.keys(flash).every(key=>key==="durationMs")&&integer(flash.durationMs,100,10000))||
4
4
  !integer(merged.batchMs,0,60000)||!(merged.pollMs===undefined||merged.pollMs===0||integer(merged.pollMs,250,86400000))||
@@ -1,38 +1,38 @@
1
1
  /* The matrix view: a sticky header with column labels written upwards,sticky row headers and totals,windowed cells. */
2
2
  .cx-matrix-host{display:block;}
3
3
  .cx-matrix [hidden]{display:none !important;}
4
- .cx-matrix{display:flex;flex-direction:column;gap:var(--cx-size-8px);box-sizing:border-box;max-height:100%;font:var(--hfx-control-font-size,calc(var(--hfx-type-body-size,0.875rem) - var(--cx-compact,0) * .0625rem))/1.35 var(--hfx-font-sans,"Segoe UI Variable Text","Segoe UI",system-ui,-apple-system,"Helvetica Neue",Arial,sans-serif);color:var(--hfx-color-text,light-dark(#16181c,#f2f3f5));
5
- --mx-line:color-mix(in srgb,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)) 70%,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));--mx-none:color-mix(in srgb,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)) 42%,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));
6
- --mx-raised:color-mix(in srgb,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)) 18%,transparent);}
4
+ .cx-matrix{display:flex;flex-direction:column;gap:var(--cx-size-8px);box-sizing:border-box;max-height:100%;font:var(--hfx-control-font-size,calc(var(--hfx-type-body-size,0.875rem) - var(--cx-compact,0) * .0625rem))/1.35 var(--hfx-font-sans,"Segoe UI Variable Text","Segoe UI",system-ui,-apple-system,"Helvetica Neue",Arial,sans-serif);color:var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)));
5
+ --mx-line:color-mix(in srgb,var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30))) 70%,var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c))));--mx-none:color-mix(in srgb,var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d))) 42%,var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c))));
6
+ --mx-raised:color-mix(in srgb,var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5))) 18%,transparent);}
7
7
  .cx-mx-bar{position:relative;display:flex;flex-wrap:wrap;align-items:center;gap:var(--cx-size-8px);}
8
8
  .cx-mx-search{flex:1 1 var(--cx-size-180px);max-width:var(--cx-size-320px);}
9
9
  .cx-mx-switch{display:inline-flex;align-items:center;gap:var(--cx-size-6px);min-height:var(--cx-size-24px);cursor:pointer;}
10
- .cx-mx-summary{margin-inline-start:auto;color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));font-size:var(--cx-size-13px);font-variant-numeric:tabular-nums;}
10
+ .cx-mx-summary{margin-inline-start:auto;color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));font-size:var(--cx-size-13px);font-variant-numeric:tabular-nums;}
11
11
  .cx-mx-panel{position:absolute;top:calc(100% + var(--cx-size-4px));inset-inline-start:0;z-index:30;box-sizing:border-box;width:min(var(--cx-size-340px),100%);max-height:var(--cx-size-60vh);
12
- overflow:auto;display:grid;gap:var(--cx-size-10px);padding:var(--cx-size-12px);background:var(--hfx-color-surface,light-dark(#ffffff,#16181c));border:var(--cx-size-1px) solid var(--hfx-color-border-strong,light-dark(#cdd0d5,#363a42));
12
+ overflow:auto;display:grid;gap:var(--cx-size-10px);padding:var(--cx-size-12px);background:var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));border:var(--cx-size-1px) solid var(--hfx-color-border-strong,light-dark(#cdd0d5,#363a42));
13
13
  border-radius:var(--hfx-radius-control,var(--hfx-radius-md,6px));box-shadow:var(--hfx-elevation-2,0 1px 2px rgba(22,24,28,.05),0 6px 18px -10px rgba(22,24,28,.18));}
14
- .cx-mx-field{display:grid;gap:var(--cx-size-4px);font-size:var(--cx-size-13px);color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));}
14
+ .cx-mx-field{display:grid;gap:var(--cx-size-4px);font-size:var(--cx-size-13px);color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));}
15
15
  .cx-mx-facet{display:grid;gap:var(--cx-size-4px);margin:0;padding:0;border:0;min-width:0;}
16
- .cx-mx-facet legend{padding:0 0 var(--cx-size-4px);font-size:var(--cx-size-13px);color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));}
17
- .cx-mx-keycount{color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));font-variant-numeric:tabular-nums;margin-inline-start:var(--cx-size-4px);}
16
+ .cx-mx-facet legend{padding:0 0 var(--cx-size-4px);font-size:var(--cx-size-13px);color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));}
17
+ .cx-mx-keycount{color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));font-variant-numeric:tabular-nums;margin-inline-start:var(--cx-size-4px);}
18
18
  .cx-mx-legend{display:flex;flex-wrap:wrap;gap:var(--cx-size-6px) var(--cx-size-16px);font-size:var(--cx-size-13px);}
19
19
  .cx-mx-key{display:inline-flex;align-items:center;gap:var(--cx-size-6px);}
20
20
  .cx-mx-swatch{display:inline-flex;align-items:center;justify-content:center;width:var(--cx-size-20px);height:var(--cx-size-20px);border-radius:var(--hfx-radius-sm,4px);
21
21
  border:var(--cx-size-1px) solid var(--mx-line);flex:none;}
22
- .cx-mx-swatch.cx-mx-none{background:var(--hfx-color-surface,light-dark(#ffffff,#16181c));}
22
+ .cx-mx-swatch.cx-mx-none{background:var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));}
23
23
  .cx-mx-swatch.cx-mx-none::after{content:"";width:var(--cx-size-3px);height:var(--cx-size-3px);border-radius:50%;background:var(--mx-none);}
24
- .cx-mx-scroll{position:relative;flex:0 1 auto;box-sizing:border-box;width:fit-content;max-width:100%;min-height:0;max-height:var(--cx-size-100vh);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));border-radius:var(--hfx-radius-control,var(--hfx-radius-md,6px));
24
+ .cx-mx-scroll{position:relative;flex:0 1 auto;box-sizing:border-box;width:fit-content;max-width:100%;min-height:0;max-height:var(--cx-size-100vh);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)));border-radius:var(--hfx-radius-control,var(--hfx-radius-md,6px));
25
25
  overscroll-behavior:contain;scrollbar-color:var(--cx-scrollbar-thumb,auto) var(--cx-scrollbar-track,auto);}
26
26
  [data-cx-chrome="embedded"] .cx-mx-scroll{border:0;border-radius:0;background:transparent;}
27
27
  .cx-mx-head{position:sticky;top:0;z-index:3;width:var(--mx-content-w);background:var(--hfx-color-surface-sunken,light-dark(#f7f8f9,#111317));}
28
28
  .cx-mx-head.cx-mx-raised{box-shadow:0 var(--cx-size-6px) var(--cx-size-8px) calc(var(--cx-size-6px) * -1) var(--mx-raised);}
29
29
  .cx-mx-band,.cx-mx-hrow,.cx-mx-frow{position:relative;display:flex;}
30
30
  .cx-mx-band{height:var(--mx-band-h);border-bottom:var(--cx-size-1px) solid var(--mx-line);}
31
- .cx-mx-hrow{height:var(--mx-head-h);border-bottom:var(--cx-size-1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));}
31
+ .cx-mx-hrow{height:var(--mx-head-h);border-bottom:var(--cx-size-1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));}
32
32
  .cx-mx-spacer{flex:none;width:var(--mx-cols-w);}
33
33
  .cx-mx-corner{position:sticky;inset-inline-start:0;z-index:2;box-sizing:border-box;flex:none;width:var(--mx-head-w);display:flex;flex-direction:column;justify-content:flex-end;
34
- gap:var(--cx-size-2px);padding:var(--cx-size-6px) var(--cx-size-10px);background:var(--hfx-color-surface-sunken,light-dark(#f7f8f9,#111317));border-inline-end:var(--cx-size-1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));
35
- font-size:var(--cx-size-12px);font-weight:600;color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));}
34
+ gap:var(--cx-size-2px);padding:var(--cx-size-6px) var(--cx-size-10px);background:var(--hfx-color-surface-sunken,light-dark(#f7f8f9,#111317));border-inline-end:var(--cx-size-1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));
35
+ font-size:var(--cx-size-12px);font-weight:600;color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));}
36
36
  .cx-mx-corner-columns{align-self:flex-end;}
37
37
  .cx-mx-corner-columns::after{content:" \2192";}
38
38
  .cx-mx-corner-rows::after{content:" \2193";}
@@ -40,23 +40,23 @@ font-size:var(--cx-size-12px);font-weight:600;color:var(--hfx-color-text-muted,l
40
40
  .cx-mx-hcell{position:absolute;top:0;bottom:0;box-sizing:border-box;width:var(--mx-cell-w);contain:strict;display:flex;align-items:flex-end;justify-content:center;padding-bottom:var(--cx-size-6px);
41
41
  border-inline-end:var(--cx-size-1px) solid var(--mx-line);font-size:var(--cx-size-12px);}
42
42
  .cx-mx-vlabel{writing-mode:vertical-rl;transform:rotate(180deg);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-height:calc(var(--mx-head-h) - var(--cx-size-12px));}
43
- .cx-mx-bcell{position:absolute;top:0;bottom:0;box-sizing:border-box;display:flex;align-items:center;padding:0 var(--cx-size-4px);border-inline-end:var(--cx-size-1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));
43
+ .cx-mx-bcell{position:absolute;top:0;bottom:0;box-sizing:border-box;display:flex;align-items:center;padding:0 var(--cx-size-4px);border-inline-end:var(--cx-size-1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));
44
44
  overflow:hidden;font-size:var(--cx-size-12px);font-weight:600;}
45
45
  .cx-mx-bandcorner,.cx-mx-bandend{background:var(--hfx-color-surface-sunken,light-dark(#f7f8f9,#111317));}
46
46
  .cx-mx-bcell .cx-mx-toggle{max-width:100%;overflow:hidden;}
47
47
  .cx-mx-bclip .cx-mx-toggle{visibility:hidden;}
48
48
  .cx-mx-total{position:sticky;inset-inline-end:0;z-index:2;box-sizing:border-box;flex:none;width:var(--mx-total-w);display:flex;align-items:center;justify-content:flex-end;
49
- padding:0 var(--cx-size-10px);background:var(--hfx-color-surface,light-dark(#ffffff,#16181c));border-inline-start:var(--cx-size-1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));font-variant-numeric:tabular-nums;font-weight:600;}
50
- .cx-mx-htotal{background:var(--hfx-color-surface-sunken,light-dark(#f7f8f9,#111317));align-items:flex-end;padding-bottom:var(--cx-size-6px);font-size:var(--cx-size-12px);color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));}
51
- .cx-mx-total.cx-mx-zero,.cx-mx-fcell.cx-mx-zero{font-weight:400;color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));}
49
+ padding:0 var(--cx-size-10px);background:var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));border-inline-start:var(--cx-size-1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));font-variant-numeric:tabular-nums;font-weight:600;}
50
+ .cx-mx-htotal{background:var(--hfx-color-surface-sunken,light-dark(#f7f8f9,#111317));align-items:flex-end;padding-bottom:var(--cx-size-6px);font-size:var(--cx-size-12px);color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));}
51
+ .cx-mx-total.cx-mx-zero,.cx-mx-fcell.cx-mx-zero{font-weight:400;color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));}
52
52
  .cx-mx-body{position:relative;width:var(--mx-content-w);}
53
53
  .cx-mx-row{position:absolute;top:0;inset-inline-start:0;display:flex;contain:layout style;width:var(--mx-content-w);height:var(--mx-row-h);box-sizing:border-box;border-bottom:var(--cx-size-1px) solid var(--mx-line);}
54
54
  .cx-mx-rowhead{position:sticky;inset-inline-start:0;z-index:2;box-sizing:border-box;flex:none;width:var(--mx-head-w);display:flex;align-items:center;gap:var(--cx-size-6px);
55
- min-width:0;padding:0 var(--cx-size-10px);background:var(--hfx-color-surface,light-dark(#ffffff,#16181c));border-inline-end:var(--cx-size-1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));white-space:nowrap;overflow:hidden;}
55
+ min-width:0;padding:0 var(--cx-size-10px);background:var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));border-inline-end:var(--cx-size-1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));white-space:nowrap;overflow:hidden;}
56
56
  .cx-mx-member .cx-mx-rowhead{padding-inline-start:var(--cx-size-24px);}
57
57
  .cx-mx-label{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;}
58
58
  .cx-mx-rowhead > .cx-mx-label{flex:none;max-width:100%;}
59
- .cx-mx-sub{color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));font-size:var(--cx-size-12px);overflow:hidden;text-overflow:ellipsis;}
59
+ .cx-mx-sub{color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));font-size:var(--cx-size-12px);overflow:hidden;text-overflow:ellipsis;}
60
60
  .cx-mx-heading{background:var(--hfx-color-surface-sunken,light-dark(#f7f8f9,#111317));}
61
61
  .cx-mx-heading .cx-mx-rowhead,.cx-mx-rolledrow .cx-mx-rowhead{width:auto;min-width:var(--mx-head-w);background:var(--hfx-color-surface-sunken,light-dark(#f7f8f9,#111317));font-weight:600;}
62
62
  .cx-mx-heading .cx-mx-total,.cx-mx-rolledrow .cx-mx-total{background:var(--hfx-color-surface-sunken,light-dark(#f7f8f9,#111317));}
@@ -66,7 +66,7 @@ min-width:0;padding:0 var(--cx-size-10px);background:var(--hfx-color-surface,lig
66
66
  .cx-mx-toggle:dir(rtl)[aria-expanded="true"]::before{transform:rotate(-90deg);}
67
67
  .cx-mx-hcell .cx-mx-toggle{flex-direction:column;}
68
68
  .cx-mx-cell{position:absolute;top:0;box-sizing:border-box;width:var(--mx-cell-w);height:100%;contain:strict;display:flex;align-items:center;justify-content:center;gap:var(--cx-size-2px);
69
- border-inline-end:var(--cx-size-1px) solid var(--mx-line);font-size:var(--cx-size-11px);font-variant-numeric:tabular-nums;cursor:pointer;color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));}
69
+ border-inline-end:var(--cx-size-1px) solid var(--mx-line);font-size:var(--cx-size-11px);font-variant-numeric:tabular-nums;cursor:pointer;color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));}
70
70
  .cx-mx-cell.cx-tone-danger{color:var(--hfx-color-status-bad-fg,light-dark(#b8292a,#f47171));}
71
71
  .cx-mx-cell.cx-tone-warning{color:var(--hfx-color-status-warn-fg,light-dark(#8c5c05,#eeb640));}
72
72
  .cx-mx-cell.cx-tone-info{color:var(--hfx-color-status-info-fg,light-dark(#2b5fc0,#74a2f7));}
@@ -79,9 +79,9 @@ border-inline-end:var(--cx-size-1px) solid var(--mx-line);font-size:var(--cx-siz
79
79
  .cx-mx-attn.cx-tone-warning{--mx-bg:var(--hfx-color-status-warn-bg,light-dark(#f8efde,#3b3322));}
80
80
  .cx-mx-attn.cx-tone-info{--mx-bg:var(--hfx-color-status-info-bg,light-dark(#e4ecfa,#262f41));}
81
81
  .cx-mx-attn.cx-tone-success{--mx-bg:var(--hfx-color-status-good-bg,light-dark(#e2f0e9,#1f362f));}
82
- .cx-mx-attn.cx-toned{color:var(--cx-t);--mx-bg:var(--cx-t-bg,color-mix(in srgb,var(--cx-t) 12%,var(--hfx-color-surface,light-dark(#ffffff,#16181c))));}
83
- .cx-host[data-cx-theme="dark"] .cx-mx-attn.cx-tone-danger{--mx-bg:color-mix(in srgb,var(--hfx-color-status-bad-bg,light-dark(#f9e4e4,#3c272a)) 62%,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));}
84
- @media (prefers-color-scheme:dark){.cx-host[data-cx-theme="auto"] .cx-mx-attn.cx-tone-danger{--mx-bg:color-mix(in srgb,var(--hfx-color-status-bad-bg,light-dark(#f9e4e4,#3c272a)) 62%,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));}}
82
+ .cx-mx-attn.cx-toned{color:var(--cx-t);--mx-bg:var(--cx-t-bg,color-mix(in srgb,var(--cx-t) 12%,var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c)))));}
83
+ .cx-host[data-cx-theme="dark"] .cx-mx-attn.cx-tone-danger{--mx-bg:color-mix(in srgb,var(--hfx-color-status-bad-bg,light-dark(#f9e4e4,#3c272a)) 62%,var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c))));}
84
+ @media (prefers-color-scheme:dark){.cx-host[data-cx-theme="auto"] .cx-mx-attn.cx-tone-danger{--mx-bg:color-mix(in srgb,var(--hfx-color-status-bad-bg,light-dark(#f9e4e4,#3c272a)) 62%,var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c))));}}
85
85
  .cx-mx-cell.cx-mx-self{cursor:default;background:repeating-linear-gradient(135deg,transparent 0 var(--cx-size-4px),var(--mx-line) var(--cx-size-4px) var(--cx-size-5px));}
86
86
  .cx-mx-cell.cx-mx-rolled{box-shadow:inset 0 0 0 var(--cx-size-1px) var(--mx-line);}
87
87
  .cx-mx-canvas{position:absolute;top:0;cursor:pointer;}
@@ -99,16 +99,16 @@ border-inline-end:var(--cx-size-1px) solid var(--mx-line);font-size:var(--cx-siz
99
99
  border-inline-end:var(--cx-size-1px) solid var(--mx-line);font-size:var(--cx-size-11px);font-weight:600;font-variant-numeric:tabular-nums;}
100
100
  .cx-mx-foot .cx-mx-total{background:var(--hfx-color-surface-sunken,light-dark(#f7f8f9,#111317));}
101
101
  .cx-matrix :is(.cx-mx-cell,.cx-mx-rowhead,.cx-mx-hcell,.cx-mx-total,.cx-mx-fcell,.cx-mx-corner):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);z-index:4;}
102
- .cx-mx-empty{padding:var(--cx-size-24px);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));}
102
+ .cx-mx-empty{padding:var(--cx-size-24px);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));}
103
103
  .cx-mx-tip{position:absolute;z-index:20;box-sizing:border-box;max-width:var(--cx-size-320px);padding:var(--cx-size-8px) var(--cx-size-10px);pointer-events:none;
104
104
  background:var(--hfx-color-surface-raised,light-dark(#ffffff,#1e2126));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));font-size:var(--cx-size-13px);
105
105
  box-shadow:var(--hfx-elevation-2,0 1px 2px rgba(22,24,28,.05),0 6px 18px -10px rgba(22,24,28,.18));}
106
106
  .cx-matrix{position:relative;}
107
107
  .cx-mx-tiptitle{font-weight:600;margin-bottom:var(--cx-size-4px);}
108
108
  .cx-mx-tiplist,.cx-mx-details{display:grid;grid-template-columns:auto 1fr;gap:var(--cx-size-2px) var(--cx-size-10px);margin:0;}
109
- .cx-mx-tiplist dt,.cx-mx-details dt{color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));}
109
+ .cx-mx-tiplist dt,.cx-mx-details dt{color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));}
110
110
  .cx-mx-tiplist dd,.cx-mx-details dd{margin:0;overflow-wrap:anywhere;}
111
- .cx-mx-dialog{box-sizing:border-box;width:min(var(--cx-size-420px),calc(100vw - var(--cx-size-32px)));padding:var(--cx-size-16px);color:var(--hfx-color-text,light-dark(#16181c,#f2f3f5));background:var(--hfx-color-surface,light-dark(#ffffff,#16181c));
111
+ .cx-mx-dialog{box-sizing:border-box;width:min(var(--cx-size-420px),calc(100vw - var(--cx-size-32px)));padding:var(--cx-size-16px);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)));
112
112
  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));}
113
113
  .cx-mx-dialog::backdrop{background:var(--hfx-color-overlay,light-dark(rgba(22,24,28,0.42),rgba(0,0,0,0.66)));}
114
114
  .cx-mx-dialoghead{display:flex;align-items:center;gap:var(--cx-size-10px);margin-bottom:var(--cx-size-12px);}
@@ -116,8 +116,8 @@ border:var(--cx-size-1px) solid var(--hfx-color-border-strong,light-dark(#cdd0d5
116
116
  .cx-mx-dialog .cx-mx-button{margin-top:var(--cx-size-16px);}
117
117
  .cx-mx-cards{display:grid;align-content:start;gap:var(--cx-size-8px);flex:0 1 auto;min-height:0;max-height:var(--cx-size-100vh);overflow:auto;overscroll-behavior:contain;}
118
118
  .cx-mx-cardlist,.cx-mx-cardcells{list-style:none;margin:0;padding:0;display:grid;gap:var(--cx-size-8px);}
119
- .cx-mx-card{padding:var(--cx-size-10px) var(--cx-size-12px);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));}
120
- .cx-mx-cardgroup{padding:var(--cx-size-4px) 0 0;font-size:var(--cx-size-13px);font-weight:600;color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));}
119
+ .cx-mx-card{padding:var(--cx-size-10px) var(--cx-size-12px);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)));}
120
+ .cx-mx-cardgroup{padding:var(--cx-size-4px) 0 0;font-size:var(--cx-size-13px);font-weight:600;color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));}
121
121
  .cx-mx-cardhead{display:flex;align-items:center;justify-content:space-between;gap:var(--cx-size-8px);font-weight:600;}
122
122
  .cx-mx-card .cx-mx-total{position:static;width:auto;padding:0;border:0;background:none;}
123
123
  .cx-mx-cardcells{gap:var(--cx-size-4px);margin-top:var(--cx-size-6px);}
@@ -134,14 +134,14 @@ border:var(--cx-size-1px) solid var(--hfx-color-border-strong,light-dark(#cdd0d5
134
134
  .cx-matrix .cx-mx-print{display:block;}
135
135
  .cx-matrix-host{max-height:none !important;}
136
136
  .cx-mx-printtable{border-collapse:collapse;font-size:var(--cx-size-11px);-webkit-print-color-adjust:exact;print-color-adjust:exact;}
137
- .cx-mx-printtable :is(th,td){border:var(--cx-size-1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));padding:var(--cx-size-2px) var(--cx-size-4px);text-align:center;}
137
+ .cx-mx-printtable :is(th,td){border:var(--cx-size-1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));padding:var(--cx-size-2px) var(--cx-size-4px);text-align:center;}
138
138
  .cx-mx-printtable thead th{background:var(--hfx-color-surface-sunken,light-dark(#f7f8f9,#111317));}
139
139
  .cx-mx-printtable :is(th[scope="row"],th[scope="rowgroup"]){text-align:start;}
140
140
  .cx-mx-printtable caption{text-align:start;font-weight:600;padding-bottom:var(--cx-size-6px);}
141
141
  .cx-mx-printgroup > th,.cx-mx-printgroup > td,.cx-mx-printrolled > th{background:var(--hfx-color-surface-sunken,light-dark(#f7f8f9,#111317));font-weight:600;}
142
- .cx-mx-printcount{font-weight:400;color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));}
142
+ .cx-mx-printcount{font-weight:400;color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));}
143
143
  .cx-mx-printmember{padding-inline-start:var(--cx-size-16px) !important;font-weight:400;}
144
- .cx-mx-printcell{color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));}
144
+ .cx-mx-printcell{color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));}
145
145
  .cx-mx-printcell.cx-tone-danger{color:var(--hfx-color-status-bad-fg,light-dark(#b8292a,#f47171));}
146
146
  .cx-mx-printcell.cx-tone-warning{color:var(--hfx-color-status-warn-fg,light-dark(#8c5c05,#eeb640));}
147
147
  .cx-mx-printcell.cx-tone-info{color:var(--hfx-color-status-info-fg,light-dark(#2b5fc0,#74a2f7));}
@@ -1,4 +1,4 @@
1
- (function(global){"use strict";const installed=new WeakSet();const part={version:"e5fa5cb0660b953a",install(context){if(installed.has(context.MATRIX_IMPL))return;const{MATRIX_IMPL,h,setText,fill,plural,foldText,numberFormat,gridFreeze,toneOf,applyTone,toneColors,AxisWindow,PROTOCOL}=context;const MATRIX_LABELS={matrixRows:"Rows",matrixColumns:"Columns",matrixSearch:"Find rows and columns",matrixSortBy:"Sort by",matrixGroupBy:"Group by",matrixByLabel:"Name",matrixByTotal:"Total",matrixAsListed:"As listed",matrixNoGrouping:"No groups",matrixDescending:"Descending",matrixOnlyProblems:"Only problems",matrixHideEmpty:"Hide empty rows and columns",matrixSize:"{rows} × {columns}",matrixShown:"Rows: {rows} of {totalRows}, columns: {columns} of {totalColumns}",matrixAttention:"Need attention: {count}",matrixLegend:"States",matrixFilter:"Filter",matrixClearFilters:"Clear filters",matrixNoMatches:"No rows or columns match.",matrixSelf:"Same item",matrixNoData:"No data",matrixCell:"{row} and {column}: {state}",matrixTotal:"Total",matrixItemTotal:"{item}: {count}",matrixExpandGroup:"Expand {group}",matrixCollapseGroup:"Collapse {group}",matrixGroupCount:"{count}",matrixCellCount:"Cells: {count}",matrixDetails:"Details",matrixClose:"Close",matrixValue:"Value",matrixState:"State",matrixAllClear:"Nothing needs attention",matrixShowMore:"Show more"};function matrixLabels(...sources){const labels={...MATRIX_LABELS};for(const source of sources){if(source==null)continue;if(typeof source!=="object"||Array.isArray(source))matrixFail("labels must be an object of strings");for(const[name,text]of Object.entries(source)){if(!Object.hasOwn(labels,name)){if(/^matrix[A-Z]/.test(name)) matrixFail("there is no matrix label '" + name + "'"); continue; }
1
+ (function(global){"use strict";const installed=new WeakSet();const part={version:"002a6d917bb4d638",install(context){if(installed.has(context.MATRIX_IMPL))return;const{MATRIX_IMPL,h,setText,fill,plural,foldText,numberFormat,gridFreeze,toneOf,applyTone,toneColors,AxisWindow,PROTOCOL}=context;const MATRIX_LABELS={matrixRows:"Rows",matrixColumns:"Columns",matrixSearch:"Find rows and columns",matrixSortBy:"Sort by",matrixGroupBy:"Group by",matrixByLabel:"Name",matrixByTotal:"Total",matrixAsListed:"As listed",matrixNoGrouping:"No groups",matrixDescending:"Descending",matrixOnlyProblems:"Only problems",matrixHideEmpty:"Hide empty rows and columns",matrixSize:"{rows} × {columns}",matrixShown:"Rows: {rows} of {totalRows}, columns: {columns} of {totalColumns}",matrixAttention:"Need attention: {count}",matrixLegend:"States",matrixFilter:"Filter",matrixClearFilters:"Clear filters",matrixNoMatches:"No rows or columns match.",matrixSelf:"Same item",matrixNoData:"No data",matrixCell:"{row} and {column}: {state}",matrixTotal:"Total",matrixItemTotal:"{item}: {count}",matrixExpandGroup:"Expand {group}",matrixCollapseGroup:"Collapse {group}",matrixGroupCount:"{count}",matrixCellCount:"Cells: {count}",matrixDetails:"Details",matrixClose:"Close",matrixValue:"Value",matrixState:"State",matrixAllClear:"Nothing needs attention",matrixShowMore:"Show more"};function matrixLabels(...sources){const labels={...MATRIX_LABELS};for(const source of sources){if(source==null)continue;if(typeof source!=="object"||Array.isArray(source))matrixFail("labels must be an object of strings");for(const[name,text]of Object.entries(source)){if(!Object.hasOwn(labels,name)){if(/^matrix[A-Z]/.test(name)) matrixFail("there is no matrix label '" + name + "'"); continue; }
2
2
  if(typeof text!=="string"||!/\S/.test(text)) matrixFail("label '" + name + "' must be a string with visible text");
3
3
  labels[name]=text}}
4
4
  return Object.freeze(labels)}
@@ -92,8 +92,8 @@ function trusted(kind,value){if(trustPolicy===undefined){try{trustPolicy=global.
92
92
  catch(_){trustPolicy=null}}
93
93
  return trustPolicy?trustPolicy["create"+kind](value):value}
94
94
  function hostHtml(element,html,sanitize,kind){const text=String(html??""),value=sanitize?sanitize(text,{kind}):text;if(value?.nodeType)element.replaceChildren(value);else if(typeof value==="string")element.innerHTML=trusted("HTML",value);else if(global.trustedTypes?.isHTML?.(value))element.innerHTML=value;else throw new Error("CanopyX: invalid sanitizeHtml result.")}
95
- const STATUS_FALLBACKS={"--hfx-color-status-bad-bg":"light-dark(#f9e4e4,#3c272a)","--hfx-color-status-bad-fg":"light-dark(#b8292a,#f47171)","--hfx-color-status-good-bg":"light-dark(#e2f0e9,#1f362f)","--hfx-color-status-good-fg":"light-dark(#177345,#4cc78a)","--hfx-color-status-info-bg":"light-dark(#e4ecfa,#262f41)","--hfx-color-status-info-fg":"light-dark(#2b5fc0,#74a2f7)","--hfx-color-status-neutral-bg":"light-dark(#eeeff0,#2a2c31)","--hfx-color-status-neutral-fg":"light-dark(#5b6069,#a0a5ae)","--hfx-color-status-warn-bg":"light-dark(#f8efde,#3b3322)","--hfx-color-status-warn-fg":"light-dark(#8c5c05,#eeb640)"};const MODE_ATTRIBUTES=["data-theme","data-cx-theme","data-hfx-mode","data-bs-theme","data-hfx-theme","data-hfx-tokens"];const THEME_ATTRIBUTES=[...MODE_ATTRIBUTES,"data-hfx-style","data-hfx-density","data-cx-fallback-mode","style","class"];function watchTheme(host,signal){const attributes=THEME_ATTRIBUTES;const previous=host.getAttribute("data-cx-fallback-mode");const refresh=()=>{const parent=host.parentElement&&getComputedStyle(host.parentElement);const inherited=parent?.colorScheme;let mode=null;if(!parent?.getPropertyValue("--hfx-color-surface").trim()){outer:for(let owner=host;owner;owner=owner.parentElement)for(const attribute of MODE_ATTRIBUTES){const value=owner.getAttribute(attribute);if(value==="light"||value==="dark"){mode=value;break outer}}}
96
- if(parent?.getPropertyValue("--hfx-color-surface").trim()||!mode&&inherited&&inherited!=="normal"){if(host.hasAttribute("data-cx-fallback-mode"))host.removeAttribute("data-cx-fallback-mode")}else if(host.getAttribute("data-cx-fallback-mode")!==(mode||"auto"))host.setAttribute("data-cx-fallback-mode",mode||"auto")};const observer=new MutationObserver(refresh);for(let owner=host;owner;owner=owner.parentElement)observer.observe(owner,{attributes:true,attributeFilter:attributes});refresh();const dispose=()=>{observer.disconnect();if(previous===null)host.removeAttribute("data-cx-fallback-mode");else host.setAttribute("data-cx-fallback-mode",previous)};signal?.addEventListener("abort",dispose,{once:true});return dispose}
95
+ const STATUS_FALLBACKS={"--hfx-color-status-bad-bg":"light-dark(#f9e4e4,#3c272a)","--hfx-color-status-bad-fg":"light-dark(#b8292a,#f47171)","--hfx-color-status-good-bg":"light-dark(#e2f0e9,#1f362f)","--hfx-color-status-good-fg":"light-dark(#177345,#4cc78a)","--hfx-color-status-info-bg":"light-dark(#e4ecfa,#262f41)","--hfx-color-status-info-fg":"light-dark(#2b5fc0,#74a2f7)","--hfx-color-status-neutral-bg":"light-dark(#eeeff0,#2a2c31)","--hfx-color-status-neutral-fg":"light-dark(#5b6069,#a0a5ae)","--hfx-color-status-warn-bg":"light-dark(#f8efde,#3b3322)","--hfx-color-status-warn-fg":"light-dark(#8c5c05,#eeb640)"};const MODE_ATTRIBUTES=["data-theme","data-cx-theme","data-hfx-mode","data-bs-theme","data-hfx-theme","data-hfx-tokens"];const THEME_ATTRIBUTES=[...MODE_ATTRIBUTES,"data-hfx-style","data-hfx-density","data-cx-fallback-mode","style","class"];function watchTheme(host,signal){const attributes=THEME_ATTRIBUTES;const previous=host.getAttribute("data-cx-fallback-mode");const refresh=()=>{const parent=host.parentElement&&getComputedStyle(host.parentElement);const inherited=parent?.colorScheme;const surface=parent&&["--hfx-color-surface-card","--hfx-color-surface"].some(name=>parent.getPropertyValue(name).trim());let mode=null;if(!surface){outer:for(let owner=host;owner;owner=owner.parentElement)for(const attribute of MODE_ATTRIBUTES){const value=owner.getAttribute(attribute);if(value==="light"||value==="dark"){mode=value;break outer}}}
96
+ if(surface||!mode&&inherited&&inherited!=="normal"){if(host.hasAttribute("data-cx-fallback-mode"))host.removeAttribute("data-cx-fallback-mode")}else if(host.getAttribute("data-cx-fallback-mode")!==(mode||"auto"))host.setAttribute("data-cx-fallback-mode",mode||"auto")};const observer=new MutationObserver(refresh);for(let owner=host;owner;owner=owner.parentElement)observer.observe(owner,{attributes:true,attributeFilter:attributes});refresh();const dispose=()=>{observer.disconnect();if(previous===null)host.removeAttribute("data-cx-fallback-mode");else host.setAttribute("data-cx-fallback-mode",previous)};signal?.addEventListener("abort",dispose,{once:true});return dispose}
97
97
  function overlayTheme(host,element,inherit=false){for(const name of["data-hfx-style","data-hfx-mode","data-hfx-density"]){const owner=host.closest("["+name+"]");if(owner&&!inherit)element.setAttribute(name,owner.getAttribute(name));else element.removeAttribute(name)}
98
98
  const theme=getComputedStyle(host),parent=inherit&&host.parentElement&&getComputedStyle(host.parentElement);element.style.colorScheme=theme.colorScheme;const copied=[];for(const name of theme)if((name.startsWith("--cx-")||name.startsWith("--hfx-"))&&(!parent||theme.getPropertyValue(name)!==parent.getPropertyValue(name))){element.style.setProperty(name,theme.getPropertyValue(name));copied.push(name)}
99
99
  return copied}
@@ -216,8 +216,9 @@ if(kind==="inline"){if(!Array.isArray(view.roots))throw new Error("CanopyX: inli
216
216
  throw new Error("CanopyX: unknown source kind '"+kind+"'.")}
217
217
  async function remoteJson(url,type,timeoutMs,lifetime,signal){const controller=new AbortController();const signals=Array.from(new Set([lifetime,signal].filter(Boolean)));const abort=()=>controller.abort();signals.forEach((item)=>{if(item.aborted)abort();else item.addEventListener("abort",abort,{once:true})});let timedOut=false;const timer=setTimeout(()=>{timedOut=true;abort()},timeoutMs);try{const response=await fetch(url,{headers:{Accept:"application/json"},signal:controller.signal});if(!response.ok){if(response.body)await response.body.cancel().catch(()=>{});throw new Error(response.status+" "+response.statusText)}
218
218
  return checkDocument(await response.json(),type)}catch(error){if(timedOut)throw new Error("CanopyX: remote request timed out after "+timeoutMs+" milliseconds.");throw error}finally{abort();clearTimeout(timer);signals.forEach((item)=>item.removeEventListener("abort",abort))}}
219
- class TreeGrid{constructor(host,options){const view=checkDocument(options.view,"view");requireIdentifier(view.id,"view ID");if(view.columns.some(column=>column.format!==undefined))throw new Error("CanopyX: number formats apply to flat grids only.");this.host=host;this.view=view;this.opts=options;for(const name of["isSelectable","beforeSelect","sanitizeHtml"]){if(options[name]!==undefined&&typeof options[name]!=="function")throw new Error("CanopyX: "+name+" must be a function.")}
220
- this.id="cx" + ++instanceSeq;this.lifetime=new AbortController();this.source=options.source||sourceFor(view,{signal:this.lifetime.signal,timeoutMs:options.requestTimeoutMs});this.queryAware=this.source.queryAware===true;this.dataLifetime=new AbortController();this.acceptedQuery=Object.freeze({version:1,sort:null,filters:Object.freeze([])});this.datasetRevision=null;this.rowH=view.rowHeight||40;this.pageSize=view.pageSize||100;this.retainedNodeLimit=options.retainedNodeLimit===undefined?1024:options.retainedNodeLimit;if(!validStructuralCount(this.retainedNodeLimit))throw new Error("CanopyX: retainedNodeLimit must be a nonnegative 32-bit integer.");this.inactiveNodeLimit=options.inactiveNodeLimit===undefined?4096:options.inactiveNodeLimit;if(!validStructuralCount(this.inactiveNodeLimit))throw new Error("CanopyX: inactiveNodeLimit must be a nonnegative 32-bit integer.");this.multi=view.selection==="multiple";this.lang=document.documentElement.lang||undefined;this.labels=labelsFor(view.labels,options.labels);this.tools=Object.assign({},view.toolbar,options.toolbar);if(Object.entries(this.tools).some(([name,value])=>!/^(search|filters|columns|views|export|more|matches|layout)$/.test(name) || typeof value !== "boolean"))
219
+ class TreeGrid{constructor(host,options){const view=checkDocument(options.view,"view");if(view.recordDrawerModal!==undefined&&typeof view.recordDrawerModal!=="boolean")
220
+ throw new Error("CanopyX: recordDrawerModal must be a Boolean.");requireIdentifier(view.id,"view ID");if(view.columns.some(column=>column.format!==undefined))throw new Error("CanopyX: number formats apply to flat grids only.");this.host=host;this.view=view;this.opts=options;for(const name of["isSelectable","beforeSelect","sanitizeHtml"]){if(options[name]!==undefined&&typeof options[name]!=="function")throw new Error("CanopyX: "+name+" must be a function.")}
221
+ do{this.id="cx" + ++instanceSeq}while(document.getElementById(this.id));this.lifetime=new AbortController();this.source=options.source||sourceFor(view,{signal:this.lifetime.signal,timeoutMs:options.requestTimeoutMs});this.queryAware=this.source.queryAware===true;this.dataLifetime=new AbortController();this.acceptedQuery=Object.freeze({version:1,sort:null,filters:Object.freeze([])});this.datasetRevision=null;this.rowH=view.rowHeight||40;this.pageSize=view.pageSize||100;this.retainedNodeLimit=options.retainedNodeLimit===undefined?1024:options.retainedNodeLimit;if(!validStructuralCount(this.retainedNodeLimit))throw new Error("CanopyX: retainedNodeLimit must be a nonnegative 32-bit integer.");this.inactiveNodeLimit=options.inactiveNodeLimit===undefined?4096:options.inactiveNodeLimit;if(!validStructuralCount(this.inactiveNodeLimit))throw new Error("CanopyX: inactiveNodeLimit must be a nonnegative 32-bit integer.");this.multi=view.selection==="multiple";this.lang=document.documentElement.lang||undefined;this.labels=labelsFor(view.labels,options.labels);this.tools=Object.assign({},view.toolbar,options.toolbar);if(Object.entries(this.tools).some(([name,value])=>!/^(search|filters|columns|views|export|more|matches|layout)$/.test(name) || typeof value !== "boolean"))
221
222
  throw new Error("CanopyX: toolbar options are booleans by control name.");this.local=view.timeZone==="local";this.fmt=formatting(this.lang,this.local,this.labels);this.kind="tree";this.plugins=viewPlugins(options,this.kind);const renderers=hostRenderers(options.renderers||{},view.columns,this.plugins);if(!options.formatLink!==!options.parseLink){throw new Error("CanopyX: formatLink and parseLink define one link scheme and are given together.")}
222
223
  this.columns=view.columns.map((column,index)=>({...column,hidden:index>0&&!!column.hidden,render:Object.hasOwn(renderers,column.id)?renderers[column.id]:null}));this.columns.forEach(prepareWidth);this.columns.forEach(validateColumnValues);this.keyMap=new Map();this.root={key:null,h:null,parent:null,level:0,idx:0,expanded:true,children:null,total:null,next:null,loading:false,error:null};if(!options.source&&(!view.source||view.source.kind==="inline")){this.root.inlineItems=view.roots||[]}
223
224
  this.rows=[];this.tops=[0];this.total=0;this.version=1;this.rendered=new Map();this.pool=[];this.focused=null;this.selected=new Set();this.anchor=null;this.filter=null;this.declaredFilter=null;this.filterExpand=false;this.activeFilters=new Set();this.sortState=null;this.typeBuf="";this.typeAt=0;this.rafId=0;this.iconTemplates=this.buildIcons(view.icons||{});this.initializing=true;this.prepareViewModes();this.build();this.buildToolbar();if(view.deepLink)loadPart(LINKS).catch(()=>{});this.ready=this.modesReady?Promise.all([this.init(),this.modesReady]).then(([result])=>result):this.init()}
@@ -412,7 +413,7 @@ if(accepted&&deferred&&revision===this.selectionRevision)
412
413
  this.notifySelection(w,Array.from(this.selected).map((selected)=>selected.h),revision)}},async retryPage(status){const parent=status.parent;await this.loadStatusPage(parent,status,parent.next||null)},typeAhead(e,i){if(e.key.length!==1||e.ctrlKey||e.metaKey||e.altKey){return false}
413
414
  const now=performance.now();const letter=e.key.toLowerCase();this.typeBuf=now-this.typeAt>TYPEAHEAD_MS?letter:this.typeBuf+letter;this.typeAt=now;const n=this.rows.length;const start=this.typeBuf.length===1?i+1:i;for(let k=0;k<n;k++){const w=this.rows[(start+k)%n];if(!w.status&&String(w.h.label).toLowerCase().startsWith(this.typeBuf)){this.setFocus(w);break}}
414
415
  return true},announce(message){setText(this.live,message)}});const CELL_CONTROLS="a[href],button,input,select,textarea,summary,[tabindex],[contenteditable]:not([contenteditable=false])," +
415
- "[role=button],[role=checkbox],[role=radio],[role=link],[role=switch],[role=tab],[role=menuitem],[role=textbox],[role=combobox]";const OWN_ARROWS=".cx-detail-body,textarea,select,[contenteditable]:not([contenteditable=false]),[aria-activedescendant]," +
416
+ "[role=button],[role=checkbox],[role=radio],[role=link],[role=switch],[role=tab],[role=menuitem],[role=textbox],[role=combobox]";const OWN_ARROWS=".cx-detail-body,.cx-phone-value,textarea,select,[contenteditable]:not([contenteditable=false]),[aria-activedescendant]," +
416
417
  "[role=textbox],[role=combobox],[role=spinbutton],[role=slider],[role=radio],[role=tab],[role=menuitem],[role=listbox],[role=tree],[role=grid]," +
417
418
  "input:not([type=button]):not([type=checkbox]):not([type=submit]):not([type=reset]):not([type=image]):not([type=file]):not([type=color])";function reachable(control){return!control.matches(":disabled")&&!control.closest("[inert],[aria-hidden=true]")&&
418
419
  (control.checkVisibility?control.checkVisibility({visibilityProperty:true}):control.getClientRects().length>0)}
@@ -532,11 +533,11 @@ close()}else{return}
532
533
  e.preventDefault()});input.addEventListener("blur",()=>{cancelNavigation();sequence++;clearTimeout(timer);clearTimeout(blurTimer);blurTimer=setTimeout(close,150)});this.cancelSearch=()=>{cancelNavigation();sequence++;clearTimeout(timer);clearTimeout(blurTimer);hits=[];close()};box.appendChild(input);box.appendChild(list);box.appendChild(status);bar.appendChild(box);this.searchInput=input}});function watchFlyout(anchorElement,panel,isOpen){const lifetime=new AbortController();let flyout=null,pending=null;const ready=()=>flyout?Promise.resolve(flyout):pending||=loadPart(SHARED_PARTS["ui-overlays"]).then(()=>{if(!lifetime.signal.aborted)flyout=UI_TOOLS.toolbarFlyout(anchorElement,panel,isOpen,lifetime.signal);return flyout}).catch(error=>{pending=null;throw error});const invoke=method=>{if(lifetime.signal.aborted||!isOpen())return;if(flyout){flyout[method]();return}
533
534
  ready().then(value=>{if(!lifetime.signal.aborted&&isOpen())value?.[method]()}).catch(error=>{if(!lifetime.signal.aborted)(anchorElement.closest(".cx-host")||anchorElement)
534
535
  .dispatchEvent(new CustomEvent("canopyx:error",{detail:{error},bubbles:true}))})};return{position:()=>invoke("position"),open:()=>invoke("open"),close:()=>flyout?.close(),dispose:()=>lifetime.abort()}}
535
- const PART_URL=typeof document!=="undefined"&&document.currentScript?.src;const PARTS={"ui-overlays":["68a7687b9c3c8a28","canopyx-ui-overlays.83acc4346a232940.js","canopyx-ui-overlays.bc49b6f13527aecd.css"],"ui-menu":["c86ee2a16b5a5a46","canopyx-ui-menu.1414af91bc295de8.js","canopyx-ui-menu.29b983c01571b5c3.css"],"ui-picker":["02ff3779dd1c1ef4","canopyx-ui-picker.7fc22075e98b3e14.js","canopyx-ui-picker.a10010ec2d8143ae.css"],"ui-navigation":["e7815ee277df3a57","canopyx-ui-navigation.86b48ef9eaffe773.js","canopyx-ui-navigation.4dd22a646eb71b44.css"],"ui-tabs":["96f562187c7e0732","canopyx-ui-tabs.4ea5e653f6919c8e.js","canopyx-ui-tabs.68bc5521fcc174fe.css"],"ui-stepper":["89aeb7d73c4b8160","canopyx-ui-stepper.0198464c5b259da1.js","canopyx-ui-stepper.fe35ecb9b43b2b2e.css"],"tree-tools":["ab6490d0ae0e0aff","canopyx-tree-tools.23262806ed53e5de.js","canopyx-tree-tools.9c5a978314bf0a86.css"],"export":["fa85a4b0e8aead4a","canopyx-export.f18d1ef109ccf0c6.js"],"office-export":["4fb7a4d570390ee9","canopyx-office-export.7e62c385b884e75b.js"],"links":["f1ab7e32b501ce37","canopyx-links.d96addeefb3eccf5.js"],"search":["521eebd6e1bbbd35","canopyx-search.14c69f4551c69f23.js"],"link":["fd21dd4495607a16","canopyx-link.5874879aadd6cefb.js","canopyx-link.b872151e9cbbd0ce.css"],"highlight":["459b28e174406d32","canopyx-highlight.10ef4bb28c5a8f5b.js","canopyx-highlight.ab1040f93cbb5dbb.css"],"layouts":["077268d4fb78c464","canopyx-layouts.9a318c748cde4c84.js","canopyx-layouts.18dbf5842f1c5efd.css"],"record-panel":["2a4059ade4ca1439","canopyx-record-panel.4f525c01ecbd0e07.js","canopyx-record-panel.f1d740569605e625.css"]},PART_CODE=new Map(),SHARED_PARTS={},partName=name=>typeof name==="string"&&/^[a-z][a-z\d-]{0,31}$/.test(name);
536
+ const PART_URL=typeof document!=="undefined"&&document.currentScript?.src;const PARTS={"ui-overlays":["8dc12c5deb018c2c","canopyx-ui-overlays.1e39ccf6db0a3df6.js","canopyx-ui-overlays.3668a9a74004ea8e.css"],"ui-menu":["352b1ee391133ff0","canopyx-ui-menu.f9abee36db8f6ad2.js","canopyx-ui-menu.2f3478cc5f5c272f.css"],"ui-picker":["d415103478faf52a","canopyx-ui-picker.13e544bd68aca998.js","canopyx-ui-picker.59c85a1988a287a9.css"],"ui-navigation":["d14b60f4d16a1cf3","canopyx-ui-navigation.02e11de5f457cc64.js","canopyx-ui-navigation.fb8bdcd8dba604c8.css"],"ui-tabs":["96b84956100933e7","canopyx-ui-tabs.f83f7ebb96c86512.js","canopyx-ui-tabs.bb8c7c70a8b5be2c.css"],"ui-stepper":["a31fd5d0b314cdef","canopyx-ui-stepper.dfddf053fc163c73.js","canopyx-ui-stepper.1d4a9db373b8d2f2.css"],"tree-tools":["ef0d06c82135ae2e","canopyx-tree-tools.1c4b9e286dde6065.js","canopyx-tree-tools.350dd0ee46757029.css"],"export":["15abf3205094bda6","canopyx-export.68b90138463329fe.js"],"office-export":["4fb7a4d570390ee9","canopyx-office-export.7e62c385b884e75b.js"],"links":["c6579c9401f0971d","canopyx-links.b25760079f57e6e1.js"],"search":["521eebd6e1bbbd35","canopyx-search.14c69f4551c69f23.js"],"link":["7485f5c9875e9f9b","canopyx-link.9066770aa822fe0f.js","canopyx-link.997fefec6b85f0c5.css"],"highlight":["5ebf0042011ba4fd","canopyx-highlight.ff11a0ca8e30102b.js","canopyx-highlight.9c26291cbcd0962b.css"],"layouts":["90267e35e7edf3a4","canopyx-layouts.058b8a396f909a79.js","canopyx-layouts.ca17f42babc4192a.css"],"record-panel":["cb6bcd1baf644a51","canopyx-record-panel.557c676822e8624f.js","canopyx-record-panel.174846a640de979f.css"]},PART_CODE=new Map(),SHARED_PARTS={},partName=name=>typeof name==="string"&&/^[a-z][a-z\d-]{0,31}$/.test(name);
536
537
  function registerPart(name,part){if(!partName(name)||!part||typeof part.version!=="string"||typeof part.install!=="function"||
537
538
  part.requires!==undefined&&!(Array.isArray(part.requires)&&part.requires.every(partName)))throw new Error("CanopyX: invalid part.");PART_CODE.set(name,part)}
538
539
  function definePart(View,name,label,context){const parts=View.prototype.parts||={};return parts[name]={name,label,context,parts}}
539
- function loadPart(part){return part.ready||=Promise.resolve().then(async()=>{const[version,scriptFile,styleFile]=Object.hasOwn(PARTS,part.name)?PARTS[part.name]:[];part.version=version;if(!version)throw new Error("CanopyX: this runtime has no "+part.label+".");if(PART_CODE.get(part.name)?.version!==part.version||part.styleReady===null){const find=type=>[...document.querySelectorAll('script[type="application/x-canopyx-'+type+'"][data-cx-version="'+part.version+'"]')].find(item=>!pageNonce||item.nonce===pageNonce);const payload=find(part.name),script=h("script"),embeddedStyle=styleFile&&find(part.name+"-style");if(payload){if(embeddedStyle){const style=h("style");style.nonce=payload.nonce;setText(style,embeddedStyle.textContent);document.head.appendChild(style)}
540
+ function loadPart(part){return part.ready||=Promise.resolve().then(async()=>{const[version,scriptFile,styleFile]=Object.hasOwn(PARTS,part.name)?PARTS[part.name]:[];part.version=version;if(!version)throw new Error("CanopyX: no "+part.label+".");if(PART_CODE.get(part.name)?.version!==part.version||part.styleReady===null){const find=type=>[...document.querySelectorAll('script[type="application/x-canopyx-'+type+'"][data-cx-version="'+part.version+'"]')].find(item=>!pageNonce||item.nonce===pageNonce);const payload=find(part.name),script=h("script"),embeddedStyle=styleFile&&find(part.name+"-style");if(payload){if(embeddedStyle){const style=h("style");style.nonce=payload.nonce;setText(style,embeddedStyle.textContent);document.head.appendChild(style)}
540
541
  script.textContent=trusted("Script",payload.textContent);script.nonce=payload.nonce;document.head.appendChild(script);script.remove()}else{const base=global.CanopyXFilterEditorBase,runtime=PART_URL||typeof base==="string"&&base||document.baseURI,hashed=PART_URL&&/\.[a-f\d]{16}\.js(?:[?#]|$)/.test(PART_URL);
541
542
  const load=(element,attribute,file,kind)=>new Promise((resolve,reject)=>{const url=new URL(file,runtime).href;element[attribute]=attribute==="src"?trusted("ScriptURL",url):url;element.onload=resolve;element.onerror=()=>{element.remove();reject(new Error("CanopyX: "+part.label+" "+kind+" unavailable."))};document.head.appendChild(withNonce(element))});const link=h("link");link.rel="stylesheet";const style=styleFile&&(part.styleReady||=load(link,"href",hashed?styleFile:"canopyx-"+part.name+".css","stylesheet")
542
543
  .catch(error=>{part.styleReady=null;throw error}));const code=PART_CODE.get(part.name)?.version===part.version||(part.scriptReady||=load(script,"src",hashed?scriptFile:"canopyx-"+part.name+".js","script")
@@ -756,7 +757,8 @@ this.dropRow=null}
756
757
  dropPlacement(event,row){const bounds=row.getBoundingClientRect(),fraction=(event.clientY-bounds.top)/ bounds.height;
757
758
  return fraction<0.25?"before":fraction>0.75?"after":"inside"}
758
759
  destroy(){this.clearDropRow();this.dragLease=null;super.destroy()}};function createTreeGrid(host,options){if(!host||!options||!options.view){throw new Error("CanopyX: createTreeGrid needs a host element and a view document.")}
759
- const existing=activeGrids.get(host);if(existing)return existing;const grid=new TreeGrid(host,options);const api=Object.assign({element:host,view:grid.view,ready:startPlugins(grid,()=>api),expandPath:(ids,o)=>grid.expandPath(ids,o),setFilter:(filter,o)=>{if(!grid.queryAware)grid.clearDeclaredFilters();grid.setFilter(filter,o)},setFilterActive:(id,active)=>grid.setFilterActive(id,active),setActiveFilters:(ids)=>grid.setActiveFilters(ids),updateActiveFilters:(change)=>grid.updateActiveFilters(change),getActiveFilters:()=>Array.from(grid.activeFilters),sort:(columnId,direction)=>grid.sort(columnId,direction),getQuery:()=>grid.getQuery(),setQuery:(query,options)=>grid.setQuery(query,options),setColumnVisible:(columnId,visible)=>grid.setColumnVisible(columnId,visible),setColumnWidth:(columnId,width)=>grid.setColumnWidth(columnId,width),setTreeColumnPinned:(pinned)=>grid.setTreeColumnPinned(pinned),setTimeZone:(zone)=>grid.setTimeZone(zone),getTimeZone:()=>(grid.local?"local":"utc"),refresh:()=>{grid.version++;grid.scheduleRender()},reload:(id,options)=>grid.reload(id,options),readLocation:()=>grid.readLocation(),getSelected:()=>Array.from(grid.selected).map((w)=>w.h),setSelection:(ids)=>grid.setSelection(ids),clearSelection:()=>grid.setSelection([]),selectAll:(options)=>grid.selectAll(options),focus:()=>{if(grid.destroyed)return;const target=grid.indexOf(grid.focused)>=0?grid.focused:grid.rows[0];if(target)grid.setFocus(target,true);else grid.grid.focus({preventScroll:true})},visibleRows:()=>grid.visibleRows(),toOutline:()=>grid.toOutline(),getState:()=>grid.getState(),setState:(state)=>grid.setState(state),getLayout:()=>grid.getLayout(),setLayout:(change)=>grid.setLayout(change),getMatches:()=>grid.getMatches(),setSearchHighlight:(enabled)=>grid.setSearchHighlight(enabled),nextMatch:(options)=>grid.nextMatch(options),previousMatch:(options)=>grid.previousMatch(options),search:(query,limit)=>grid.search(query,limit||(grid.view.search&&grid.view.search.maxResults)||20),loadMore:(id)=>{const w=id==null?grid.root:grid.keyMap.get(id);return w?grid.loadMore(w):Promise.resolve()},applyCounts:(doc)=>grid.applyCounts(doc),refreshCounts:(ids)=>grid.refreshCounts(ids),closeMenus:()=>grid.closeMenus?.(),destroy:()=>{grid.destroy();if(activeGrids.get(host)===api)activeGrids.delete(host);if(host.canopyx===api)delete host.canopyx}},grid.interactionApi&&grid.interactionApi(),linkApi(grid));for(const name of["prepareExport","exportAs","getSavedViews","saveView","applySavedView","removeSavedView","resetView","setColumnOrder","resetColumns","setColumnPinned","openDetails","openRecord"])
760
+ if(options.recordDrawerModal!==undefined&&typeof options.recordDrawerModal!=="boolean")
761
+ throw new Error("CanopyX: recordDrawerModal must be a Boolean.");const existing=activeGrids.get(host);if(existing)return existing;const grid=new TreeGrid(host,options);const api=Object.assign({element:host,view:grid.view,ready:startPlugins(grid,()=>api),expandPath:(ids,o)=>grid.expandPath(ids,o),setFilter:(filter,o)=>{if(!grid.queryAware)grid.clearDeclaredFilters();grid.setFilter(filter,o)},setFilterActive:(id,active)=>grid.setFilterActive(id,active),setActiveFilters:(ids)=>grid.setActiveFilters(ids),updateActiveFilters:(change)=>grid.updateActiveFilters(change),getActiveFilters:()=>Array.from(grid.activeFilters),sort:(columnId,direction)=>grid.sort(columnId,direction),getQuery:()=>grid.getQuery(),setQuery:(query,options)=>grid.setQuery(query,options),setColumnVisible:(columnId,visible)=>grid.setColumnVisible(columnId,visible),setColumnWidth:(columnId,width)=>grid.setColumnWidth(columnId,width),setTreeColumnPinned:(pinned)=>grid.setTreeColumnPinned(pinned),setTimeZone:(zone)=>grid.setTimeZone(zone),getTimeZone:()=>(grid.local?"local":"utc"),refresh:()=>{grid.version++;grid.scheduleRender()},reload:(id,options)=>grid.reload(id,options),readLocation:()=>grid.readLocation(),getSelected:()=>Array.from(grid.selected).map((w)=>w.h),setSelection:(ids)=>grid.setSelection(ids),clearSelection:()=>grid.setSelection([]),selectAll:(options)=>grid.selectAll(options),focus:()=>{if(grid.destroyed)return;const target=grid.indexOf(grid.focused)>=0?grid.focused:grid.rows[0];if(target)grid.setFocus(target,true);else grid.grid.focus({preventScroll:true})},visibleRows:()=>grid.visibleRows(),toOutline:()=>grid.toOutline(),getState:()=>grid.getState(),setState:(state)=>grid.setState(state),getLayout:()=>grid.getLayout(),setLayout:(change)=>grid.setLayout(change),getMatches:()=>grid.getMatches(),setSearchHighlight:(enabled)=>grid.setSearchHighlight(enabled),nextMatch:(options)=>grid.nextMatch(options),previousMatch:(options)=>grid.previousMatch(options),search:(query,limit)=>grid.search(query,limit||(grid.view.search&&grid.view.search.maxResults)||20),loadMore:(id)=>{const w=id==null?grid.root:grid.keyMap.get(id);return w?grid.loadMore(w):Promise.resolve()},applyCounts:(doc)=>grid.applyCounts(doc),refreshCounts:(ids)=>grid.refreshCounts(ids),closeMenus:()=>grid.closeMenus?.(),destroy:()=>{grid.destroy();if(activeGrids.get(host)===api)activeGrids.delete(host);if(host.canopyx===api)delete host.canopyx}},grid.interactionApi&&grid.interactionApi(),linkApi(grid));for(const name of["prepareExport","exportAs","getSavedViews","saveView","applySavedView","removeSavedView","resetView","setColumnOrder","resetColumns","setColumnPinned","openDetails","openRecord"])
760
762
  api[name]=(...args)=>{if(grid[name])return grid[name](...args);const error=new Error("CanopyX: "+name+" needs the tree tools part.");if(/^(exportAs|applySavedView|resetView|openDetails|openRecord)$/.test(name)) return Promise.reject(error);
761
763
  throw error};api.ready=linkReady(grid,api.ready);Object.freeze(api);activeGrids.set(host,api);host.setAttribute("data-canopyx-mounted","true");host.canopyx=api;recordStart(grid);return api}
762
764
  const configured=new Map();function configure(viewId,options){requireIdentifier(viewId,"view ID");if(!options||typeof options!=="object"){throw new Error("CanopyX: configure needs a view id and an options object.")}
@@ -3,7 +3,7 @@
3
3
  .cx-data-grid .cx-grid-pager .cx-pages{display:inline-flex;align-items:center;gap:var(--cx-size-4px);}
4
4
  .cx-data-grid .cx-grid-pager .cx-pages .cx-button{width:auto;min-width:var(--cx-size-30px);padding:0 var(--cx-size-8px);font-variant-numeric:tabular-nums;}
5
5
  .cx-data-grid .cx-grid-pager .cx-pages .cx-button[aria-current="page"]{border-color:var(--hfx-color-accent,light-dark(#11776f,#37c9b8));background:var(--hfx-color-accent-subtle,light-dark(#e7f1f1,#1b3435));color:var(--hfx-color-accent-text,light-dark(#02726a,#37c9b8));font-weight:600;}
6
- .cx-data-grid .cx-grid-pager .cx-gap{min-width:var(--cx-size-16px);text-align:center;color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));}
6
+ .cx-data-grid .cx-grid-pager .cx-gap{min-width:var(--cx-size-16px);text-align:center;color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));}
7
7
  .cx-phone .cx-grid-pager .cx-pages .cx-button{min-width:var(--cx-size-44px);}
8
8
  @media (forced-colors:active){
9
9
  .cx-data-grid .cx-grid-pager .cx-pages .cx-button[aria-current="page"]{border-color:Highlight;outline:var(--cx-size-2px) solid Highlight;}
@@ -1,4 +1,4 @@
1
- (function(global){"use strict";const installed=new WeakSet();const part={version:"3dcab112113081dd",install(context){if(installed.has(context.GRID_PAGER_IMPL))return;const{DataGrid,GRID_PAGER_IMPL,h,setText,fill,gridButton,gridOption,numberFormat,gridCountLabel}=context;const BUILD_PAGER=DataGrid.prototype.buildPager,SYNC_PAGER=DataGrid.prototype.syncPager;const PAGER_INFO=["range","sentence","none"];function pagerSettings(view){const pager=view.pager,fail=name=>{throw new Error("CanopyX: invalid pager "+name+".")};if(!pager||typeof pager!=="object"||Array.isArray(pager))fail("settings");const flag=(name,fallback)=>{if(pager[name]!==undefined&&typeof pager[name]!=="boolean")fail(name);return pager[name]===undefined?fallback:pager[name]};const numbers=pager.numbers===undefined?0:pager.numbers;if(!Number.isInteger(numbers)||numbers!==0&&(numbers<5||numbers>15))fail("numbers");if(pager.info!==undefined&&!PAGER_INFO.includes(pager.info))fail("info");let lengths=null;if(pager.lengths!==undefined){if(!Array.isArray(pager.lengths)||!pager.lengths.length||pager.lengths.length>16)fail("lengths");const seen=new Set();lengths=pager.lengths.map(entry=>{const item=entry!==null&&typeof entry==="object"?entry:{value:entry};if(item.value!=="all"&&!(Number.isInteger(item.value)&&item.value>=1&&item.value<=10000)||seen.has(item.value)||
1
+ (function(global){"use strict";const installed=new WeakSet();const part={version:"cc30dd4f6d3feeb0",install(context){if(installed.has(context.GRID_PAGER_IMPL))return;const{DataGrid,GRID_PAGER_IMPL,h,setText,fill,gridButton,gridOption,numberFormat,gridCountLabel}=context;const BUILD_PAGER=DataGrid.prototype.buildPager,SYNC_PAGER=DataGrid.prototype.syncPager;const PAGER_INFO=["range","sentence","none"];function pagerSettings(view){const pager=view.pager,fail=name=>{throw new Error("CanopyX: invalid pager "+name+".")};if(!pager||typeof pager!=="object"||Array.isArray(pager))fail("settings");const flag=(name,fallback)=>{if(pager[name]!==undefined&&typeof pager[name]!=="boolean")fail(name);return pager[name]===undefined?fallback:pager[name]};const numbers=pager.numbers===undefined?0:pager.numbers;if(!Number.isInteger(numbers)||numbers!==0&&(numbers<5||numbers>15))fail("numbers");if(pager.info!==undefined&&!PAGER_INFO.includes(pager.info))fail("info");let lengths=null;if(pager.lengths!==undefined){if(!Array.isArray(pager.lengths)||!pager.lengths.length||pager.lengths.length>16)fail("lengths");const seen=new Set();lengths=pager.lengths.map(entry=>{const item=entry!==null&&typeof entry==="object"?entry:{value:entry};if(item.value!=="all"&&!(Number.isInteger(item.value)&&item.value>=1&&item.value<=10000)||seen.has(item.value)||
2
2
  item.label!==undefined&&(typeof item.label!=="string"||!item.label.trim()||item.label.length>64))fail("lengths");seen.add(item.value);return{value:item.value,label:item.label}}).filter(item=>item.value!=="all"||view.source.kind==="inline")}
3
3
  return{lengths,numbers,info:pager.info||"range",lengthMenu:flag("lengthMenu",true),pageInput:flag("pageInput",!numbers),firstLast:flag("firstLast",true)}}
4
4
  function pagerWindow(current,count,max){const range=(start,end)=>Array.from({length:Math.max(0,end-start)},(_,index)=>start+index);if(count<=max)return range(0,count);if(current<max-3)return[...range(0,max-2),null,count-1];if(current>count-max+2)return[0,null,...range(count-max+2,count)];const inner=max-4,start=current-Math.floor((inner-1)/ 2);
@@ -1,14 +1,14 @@
1
1
  .cx-path-host > .cx-grid{display:none;}
2
- .cx-path{color:var(--hfx-color-text,light-dark(#16181c,#f2f3f5));font:var(--hfx-weight-regular,400) var(--hfx-type-body-size,0.875rem) var(--hfx-font-sans,"Segoe UI Variable Text","Segoe UI",system-ui,-apple-system,"Helvetica Neue",Arial,sans-serif);min-width:0;min-height:0;flex:1 1 auto;overflow:auto;padding:var(--hfx-space-4,1rem);}
2
+ .cx-path{color:var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)));font:var(--hfx-weight-regular,400) var(--hfx-type-body-size,0.875rem) var(--hfx-font-sans,"Segoe UI Variable Text","Segoe UI",system-ui,-apple-system,"Helvetica Neue",Arial,sans-serif);min-width:0;min-height:0;flex:1 1 auto;overflow:auto;padding:var(--hfx-space-4,1rem);}
3
3
  .cx-path-title-heading{font:var(--hfx-weight-semibold,600) var(--hfx-type-heading-size,0.9375rem) var(--hfx-font-sans,"Segoe UI Variable Text","Segoe UI",system-ui,-apple-system,"Helvetica Neue",Arial,sans-serif);line-height:var(--hfx-type-heading-line,1.4);margin:0 0 var(--hfx-space-3,0.75rem);}
4
- .cx-path-help,.cx-path-empty{margin:var(--hfx-space-2,0.5rem) 0 var(--hfx-space-4,1rem);color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));font-size:var(--hfx-type-caption-size,0.75rem);line-height:var(--hfx-type-body-line,1.5);}
4
+ .cx-path-help,.cx-path-empty{margin:var(--hfx-space-2,0.5rem) 0 var(--hfx-space-4,1rem);color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));font-size:var(--hfx-type-caption-size,0.75rem);line-height:var(--hfx-type-body-line,1.5);}
5
5
  .cx-path-chain{min-width:0;margin-bottom:var(--hfx-space-6,2rem);}
6
6
  .cx-path-heading{font:var(--hfx-weight-regular,400) var(--hfx-type-body-size,0.875rem) var(--hfx-font-sans,"Segoe UI Variable Text","Segoe UI",system-ui,-apple-system,"Helvetica Neue",Arial,sans-serif);font-size:var(--hfx-type-body-size,0.875rem);font-weight:var(--hfx-weight-semibold,600);margin:0 0 calc(var(--hfx-space-1,0.25rem)*2.5);overflow-wrap:anywhere;}
7
7
  .cx-path-hops{display:flex;align-items:stretch;gap:calc(var(--hfx-space-1,0.25rem)*7);margin:0;padding:var(--hfx-space-0-5,2px) var(--hfx-space-0-5,2px) var(--hfx-space-3,0.75rem);list-style:none;overflow-x:auto;}
8
- .cx-path-hop{position:relative;flex:1 0 calc(var(--hfx-space-1,0.25rem)*50);max-width:calc(var(--hfx-space-1,0.25rem)*70);min-width:0;padding:var(--hfx-space-3,0.75rem);box-sizing:border-box;border:var(--hfx-border-width,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));overflow-wrap:anywhere;}
8
+ .cx-path-hop{position:relative;flex:1 0 calc(var(--hfx-space-1,0.25rem)*50);max-width:calc(var(--hfx-space-1,0.25rem)*70);min-width:0;padding:var(--hfx-space-3,0.75rem);box-sizing:border-box;border:var(--hfx-border-width,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)));overflow-wrap:anywhere;}
9
9
  .cx-path-hop + .cx-path-hop::before{content:"";position:absolute;inset-inline-start:calc(-1 * var(--hfx-space-6,2rem));top:var(--hfx-space-6,2rem);inline-size:var(--hfx-space-5,1.5rem);border-block-start:calc(2 * var(--hfx-border-width,1px)) solid var(--hfx-color-accent,light-dark(#11776f,#37c9b8));}
10
10
  .cx-path-hop + .cx-path-hop::after{content:"";position:absolute;inset-inline-start:calc(-1 * var(--hfx-space-3,0.75rem));top:calc(var(--hfx-space-6,2rem) - var(--hfx-space-1,0.25rem));inline-size:var(--hfx-space-2,0.5rem);block-size:var(--hfx-space-2,0.5rem);border-block-start:calc(2 * var(--hfx-border-width,1px)) solid var(--hfx-color-accent,light-dark(#11776f,#37c9b8));border-inline-end:calc(2 * var(--hfx-border-width,1px)) solid var(--hfx-color-accent,light-dark(#11776f,#37c9b8));transform:rotate(45deg);}
11
- .cx-path-step{display:flex;flex-wrap:wrap;align-items:center;gap:var(--hfx-space-1,0.25rem) var(--hfx-space-2,0.5rem);margin-bottom:var(--hfx-space-2,0.5rem);color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));font-size:var(--hfx-type-caption-size,0.75rem);}
11
+ .cx-path-step{display:flex;flex-wrap:wrap;align-items:center;gap:var(--hfx-space-1,0.25rem) var(--hfx-space-2,0.5rem);margin-bottom:var(--hfx-space-2,0.5rem);color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));font-size:var(--hfx-type-caption-size,0.75rem);}
12
12
  .cx-path-endpoint{font-weight:var(--hfx-weight-semibold,600);}
13
13
  .cx-path-title{display:block;box-sizing:border-box;width:100%;height:auto;min-height:var(--hfx-control-height-lg,calc(44px - var(--cx-compact,0) * 8px));text-align:start;white-space:normal;overflow-wrap:anywhere;}
14
14
  .cx-path-label{margin:var(--hfx-space-2,0.5rem) 0;font-size:var(--hfx-type-caption-size,0.75rem);line-height:var(--hfx-type-body-line,1.5);}
@@ -29,12 +29,12 @@
29
29
  .cx-path-hop + .cx-path-hop::before{content:none;}
30
30
  .cx-path-title{display:block;box-sizing:border-box;width:100%;height:auto;min-height:var(--hfx-control-height-lg,calc(44px - var(--cx-compact,0) * 8px));text-align:start;white-space:normal;overflow-wrap:anywhere;}
31
31
  }
32
- .cx-path .cx-path-title{color:var(--hfx-color-text,light-dark(#16181c,#f2f3f5));font-weight:var(--hfx-weight-semibold,600);font-size:var(--hfx-type-body-size,0.875rem);line-height:var(--hfx-type-body-line,1.5);padding:0;border:0;border-radius:0;background:transparent;box-shadow:none;justify-content:flex-start;min-height:0;}
33
- .cx-path .cx-path-title:hover{color:var(--hfx-color-text,light-dark(#16181c,#f2f3f5));background:transparent;text-decoration:underline;}
32
+ .cx-path .cx-path-title{color:var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)));font-weight:var(--hfx-weight-semibold,600);font-size:var(--hfx-type-body-size,0.875rem);line-height:var(--hfx-type-body-line,1.5);padding:0;border:0;border-radius:0;background:transparent;box-shadow:none;justify-content:flex-start;min-height:0;}
33
+ .cx-path .cx-path-title:hover{color:var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)));background:transparent;text-decoration:underline;}
34
34
  .cx-path .cx-path-title: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);}
35
- .cx-path-endpoint{padding:var(--hfx-space-0-5,2px) var(--hfx-space-1-5,6px);border:var(--hfx-border-width,1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));border-radius:var(--hfx-radius-status,999px);color:var(--hfx-color-text,light-dark(#16181c,#f2f3f5));background:var(--hfx-color-surface-sunken,light-dark(#f7f8f9,#111317));}
35
+ .cx-path-endpoint{padding:var(--hfx-space-0-5,2px) var(--hfx-space-1-5,6px);border:var(--hfx-border-width,1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));border-radius:var(--hfx-radius-status,999px);color:var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)));background:var(--hfx-color-surface-sunken,light-dark(#f7f8f9,#111317));}
36
36
  .cx-path-disabled{background:var(--hfx-color-surface-sunken,light-dark(#f7f8f9,#111317));border-style:dashed;}
37
- .cx-path-disabled :is(.cx-path-title,.cx-path-label){color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));}
37
+ .cx-path-disabled :is(.cx-path-title,.cx-path-label){color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));}
38
38
  .cx-path-return{display:flex;align-items:center;gap:var(--hfx-space-2,0.5rem);color:var(--hfx-color-accent,light-dark(#11776f,#37c9b8));font-size:var(--hfx-type-caption-size,0.75rem);margin-block-start:var(--hfx-space-3,0.75rem);padding-block:var(--hfx-space-1,0.25rem);}
39
39
  .cx-path-return svg{inline-size:var(--hfx-space-6,2rem);block-size:var(--hfx-space-6,2rem);fill:none;stroke:currentColor;stroke-width:2;}
40
40
  @media(max-width:640px){
@@ -1,4 +1,4 @@
1
- (function(global){"use strict";const installed=new WeakSet();const part={version:"28b4b60b1851bf2e",install(context){if(installed.has(context.DataGrid.prototype))return;const{DataGrid,h,setText,fill,cellValue,cellText,badgeElement,applyTone,toneOf,PROTOCOL}=context;const PATH_TEXT={pathEmpty:"No paths to show",pathSource:"Source",pathTarget:"Target",pathStep:"Step {number} of {total}",pathCycle:"Cycle",pathForeign:"Foreign",pathDisabled:"Disabled",pathKeys:"Use Tab or arrow keys to browse steps; Enter or Space opens the record.",pathPartial:"Showing {shown} of {total} steps."};const PATH_FLAGS={cycle:"warning",foreign:"info",disabled:"muted"};function pathKeys(value,allowed){if(Object.keys(value).some(key=>!allowed.includes(key)))throw new Error("CanopyX: path settings have an unknown property.")}
1
+ (function(global){"use strict";const installed=new WeakSet();const part={version:"c6fa2dbab6a0dbaa",install(context){if(installed.has(context.DataGrid.prototype))return;const{DataGrid,h,setText,fill,cellValue,cellText,badgeElement,applyTone,toneOf,PROTOCOL}=context;const PATH_TEXT={pathEmpty:"No paths to show",pathSource:"Source",pathTarget:"Target",pathStep:"Step {number} of {total}",pathCycle:"Cycle",pathForeign:"Foreign",pathDisabled:"Disabled",pathKeys:"Use Tab or arrow keys to browse steps; Enter or Space opens the record.",pathPartial:"Showing {shown} of {total} steps."};const PATH_FLAGS={cycle:"warning",foreign:"info",disabled:"muted"};function pathKeys(value,allowed){if(Object.keys(value).some(key=>!allowed.includes(key)))throw new Error("CanopyX: path settings have an unknown property.")}
2
2
  function pathText(value,maximum=Infinity){if(typeof value!=="string"||!value.trim()||value.length>maximum||/[\u0000-\u001f\u007f-\u009f]/.test(value)) return false;
3
3
  for(let at=0;at<value.length;at++){const code=value.charCodeAt(at);if(code>=0xd800&&code<=0xdbff){const next=value.charCodeAt(++at);if(!(next>=0xdc00&&next<=0xdfff))return false}
4
4
  else if(code>=0xdc00&&code<=0xdfff)return false}