@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,31 +1,31 @@
1
1
  .cx-board-host > .cx-grid{display:none;}
2
- .cx-board{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;display:flex;flex-direction:column;}
2
+ .cx-board{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;display:flex;flex-direction:column;}
3
3
  .cx-board-tools{display:flex;align-items:center;gap:calc(var(--hfx-space-1,0.25rem)*2.5);margin:var(--hfx-space-2,0.5rem) 0;}
4
4
  .cx-board-tools label{font-weight:var(--hfx-weight-semibold,600);}
5
5
  .cx-board select{max-width:100%;}
6
- .cx-board-help{color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));font-size:var(--hfx-type-caption-size,0.75rem);margin:calc(var(--hfx-space-1,0.25rem)*2.5) 0;}
6
+ .cx-board-help{color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));font-size:var(--hfx-type-caption-size,0.75rem);margin:calc(var(--hfx-space-1,0.25rem)*2.5) 0;}
7
7
  .cx-board-lanes{display:grid;flex:1 1 auto;min-height:0;grid-auto-flow:column;grid-auto-columns:minmax(calc(var(--hfx-space-1,0.25rem)*65),1fr);gap:calc(var(--hfx-space-1,0.25rem)*3.5);overflow-x:auto;padding-bottom:calc(var(--hfx-space-1,0.25rem)*2.5);}
8
- .cx-board-lane{display:flex;flex-direction:column;min-width:0;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:color-mix(in srgb,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)) 3%,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));overflow:hidden;}
9
- .cx-board-heading{display:flex;align-items:center;justify-content:space-between;gap:var(--hfx-space-2,0.5rem);padding:var(--hfx-space-3,0.75rem);border-bottom:var(--hfx-border-width,1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));}
8
+ .cx-board-lane{display:flex;flex-direction:column;min-width:0;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:color-mix(in srgb,var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5))) 3%,var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c))));overflow:hidden;}
9
+ .cx-board-heading{display:flex;align-items:center;justify-content:space-between;gap:var(--hfx-space-2,0.5rem);padding:var(--hfx-space-3,0.75rem);border-bottom:var(--hfx-border-width,1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));}
10
10
  .cx-board-heading h3{margin:0;font-size:var(--hfx-type-body-size,0.875rem);font-weight:var(--hfx-weight-semibold,600);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
11
- .cx-board-count{font-size:var(--hfx-type-caption-size,0.75rem);font-variant-numeric:tabular-nums;color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));white-space:nowrap;}
11
+ .cx-board-count{font-size:var(--hfx-type-caption-size,0.75rem);font-variant-numeric:tabular-nums;color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));white-space:nowrap;}
12
12
  .cx-board-full .cx-board-count{color:var(--hfx-color-status-warn-fg,light-dark(#8c5c05,#eeb640));font-weight:var(--hfx-weight-semibold,600);}
13
13
  .cx-board-scroll{flex:1 1 auto;min-height:0;overflow:auto;overscroll-behavior:contain;outline-offset:calc(var(--hfx-space-1,0.25rem)*-0.5);}
14
14
  .cx-board-canvas{position:relative;min-height:calc(var(--hfx-space-1,0.25rem)*16);}
15
- .cx-board-card{position:absolute;left:var(--hfx-space-2,0.5rem);right:var(--hfx-space-2,0.5rem);box-sizing:border-box;height:auto;margin-bottom:var(--hfx-space-2,0.5rem);padding:var(--hfx-space-3,0.75rem);background:var(--hfx-color-surface,light-dark(#ffffff,#16181c));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));display:flex;flex-direction:column;gap:var(--hfx-space-2,0.5rem);}
15
+ .cx-board-card{position:absolute;left:var(--hfx-space-2,0.5rem);right:var(--hfx-space-2,0.5rem);box-sizing:border-box;height:auto;margin-bottom:var(--hfx-space-2,0.5rem);padding:var(--hfx-space-3,0.75rem);background:var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));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));display:flex;flex-direction:column;gap:var(--hfx-space-2,0.5rem);}
16
16
  .cx-board-card:hover{border-color:var(--hfx-color-accent,light-dark(#11776f,#37c9b8));}
17
17
  .cx-board-card: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);}
18
18
  .cx-board-card[draggable=true]{cursor:grab;}
19
19
  .cx-board .cx-board-title{display:flex;align-items:flex-start;text-align:start;width:100%;min-width:0;overflow:hidden;white-space:normal;min-block-size:calc(2 * var(--hfx-type-body-size,0.875rem) * var(--hfx-type-body-line,1.5));}
20
20
  .cx-board-title > span{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2;overflow:hidden;}
21
21
  .cx-board-fields{display:grid;grid-template-columns:minmax(calc(var(--hfx-space-1,0.25rem)*12),auto) minmax(0,1fr);gap:var(--hfx-space-1,0.25rem) var(--hfx-space-3,0.75rem);margin:0;font-size:var(--hfx-type-caption-size,0.75rem);}
22
- .cx-board-fields dt{color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
22
+ .cx-board-fields dt{color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
23
23
  .cx-board-fields dd{margin:0;text-align:end;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
24
24
  .cx-board-move{margin-top:auto;width:100%;font-size:var(--hfx-type-caption-size,0.75rem) !important;}
25
- .cx-board-swimlane{position:absolute;margin:0;padding:var(--hfx-space-2,0.5rem) var(--hfx-space-3,0.75rem);box-sizing:border-box;height:calc(var(--hfx-space-1,0.25rem)*9);left:0;right:0;color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));font-size:var(--hfx-type-caption-size,0.75rem);font-weight:var(--hfx-weight-semibold,600);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
26
- .cx-board-empty{color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));margin:calc(var(--hfx-space-1,0.25rem)*4.5) var(--hfx-space-3,0.75rem);font-size:var(--hfx-type-caption-size,0.75rem);}
25
+ .cx-board-swimlane{position:absolute;margin:0;padding:var(--hfx-space-2,0.5rem) var(--hfx-space-3,0.75rem);box-sizing:border-box;height:calc(var(--hfx-space-1,0.25rem)*9);left:0;right:0;color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));font-size:var(--hfx-type-caption-size,0.75rem);font-weight:var(--hfx-weight-semibold,600);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
26
+ .cx-board-empty{color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));margin:calc(var(--hfx-space-1,0.25rem)*4.5) var(--hfx-space-3,0.75rem);font-size:var(--hfx-type-caption-size,0.75rem);}
27
27
  .cx-board-drop{outline:var(--hfx-focus-width,2px) solid var(--hfx-color-accent,light-dark(#11776f,#37c9b8));outline-offset:calc(var(--hfx-focus-offset,2px)*-1);}
28
- .cx-board-warning{padding:calc(var(--hfx-space-1,0.25rem)*2.5);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));}
28
+ .cx-board-warning{padding:calc(var(--hfx-space-1,0.25rem)*2.5);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));}
29
29
  @media (min-width: 641px){.cx-board-tools{display:none;}}
30
30
  @media (max-width: 640px){
31
31
  .cx-board-lanes{display:block;overflow-x:hidden;}
@@ -42,8 +42,8 @@
42
42
  .cx-board-canvas{height:auto !important;}
43
43
  .cx-board-card,.cx-board-swimlane{position:relative;top:auto !important;left:auto;right:auto;margin:var(--hfx-space-2,0.5rem);break-inside:avoid;}
44
44
  }
45
- .cx-board .cx-board-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;}
46
- .cx-board .cx-board-title:hover{color:var(--hfx-color-text,light-dark(#16181c,#f2f3f5));background:transparent;text-decoration:underline;}
45
+ .cx-board .cx-board-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;}
46
+ .cx-board .cx-board-title:hover{color:var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)));background:transparent;text-decoration:underline;}
47
47
  .cx-board .cx-board-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);}
48
48
  .cx-board-tools{padding-inline:var(--hfx-space-3,0.75rem);}
49
49
  .cx-board-help{position:absolute;inline-size:var(--hfx-border-width,1px);block-size:var(--hfx-border-width,1px);overflow:hidden;clip-path:inset(50%);white-space:nowrap;}
@@ -1,4 +1,4 @@
1
- (function(global){"use strict";const installed=new WeakSet();const part={version:"31d8984cbdc39866",install(context){if(installed.has(context.DataGrid.prototype))return;const{DataGrid,h,setText,fill,cellValue,cellText,gridScalar,gridQueryRows,gridQuery,validateGridPage,validateGridCursorPage,numberFormat,PROTOCOL}=context;const BOARD_TEXT={boardLane:"Lane",boardUnassigned:"Unassigned",boardEmpty:"No records in this lane",boardWip:"{count} / {limit}",boardWipFull:"{lane} has reached its work limit ({limit}).",boardMove:"Move to lane",boardMoved:"{title} moved to {lane}.",boardRejected:"Move was not accepted.",boardPending:"Waiting for the host to accept the move…",boardPartial:"Showing the first {count} records. Narrow the filters to see the rest.",boardKeys:"Use Alt+Left or Alt+Right to move between lanes; Up and Down to browse cards."};const boardKey=(value,column)=>JSON.stringify(column?gridScalar(value,column):value??null);const boardText=(grid,row,id)=>cellText(row.cells[id],grid.columns.find(column=>column.id===id),grid.fmt);function boardScalar(value){return value==null||["string","number","boolean"].includes(typeof value)&&(typeof value!=="number"||Number.isFinite(value))}
1
+ (function(global){"use strict";const installed=new WeakSet();const part={version:"dd02be00df77f53a",install(context){if(installed.has(context.DataGrid.prototype))return;const{DataGrid,h,setText,fill,cellValue,cellText,gridScalar,gridQueryRows,gridQuery,validateGridPage,validateGridCursorPage,numberFormat,PROTOCOL}=context;const BOARD_TEXT={boardLane:"Lane",boardUnassigned:"Unassigned",boardEmpty:"No records in this lane",boardWip:"{count} / {limit}",boardWipFull:"{lane} has reached its work limit ({limit}).",boardMove:"Move to lane",boardMoved:"{title} moved to {lane}.",boardRejected:"Move was not accepted.",boardPending:"Waiting for the host to accept the move…",boardPartial:"Showing the first {count} records. Narrow the filters to see the rest.",boardKeys:"Use Alt+Left or Alt+Right to move between lanes; Up and Down to browse cards."};const boardKey=(value,column)=>JSON.stringify(column?gridScalar(value,column):value??null);const boardText=(grid,row,id)=>cellText(row.cells[id],grid.columns.find(column=>column.id===id),grid.fmt);function boardScalar(value){return value==null||["string","number","boolean"].includes(typeof value)&&(typeof value!=="number"||Number.isFinite(value))}
2
2
  function boardSettings(grid){const input=grid.view.board,known=id=>typeof id==="string"&&grid.columns.some(column=>column.id===id);if(!input||!known(input.column)||input.titleColumn!==undefined&&!known(input.titleColumn)||
3
3
  input.swimlaneColumn!==undefined&&(!known(input.swimlaneColumn)||input.swimlaneColumn===input.column)||
4
4
  input.fields!==undefined&&(!Array.isArray(input.fields)||input.fields.length>8||new Set(input.fields).size!==input.fields.length||input.fields.some(id=>!known(id)))||
@@ -1,21 +1,29 @@
1
1
  /* Calendar: month,week,day,N-day,agenda and year views of a grid's records, under the grid's own toolbar. */
2
2
  .cx-calendar > :is(.cx-grid,.cx-grid-pager,.cx-grid-notice,.cx-grid-status){display:none!important;}
3
- .cx-calendar .cx-cal{flex:1 1 auto;min-height:0;display:flex;flex-direction:column;position:relative;background:var(--hfx-color-surface,light-dark(#ffffff,#16181c));}
4
- .cx-cal-bar{flex:none;display:flex;flex-wrap:wrap;align-items:center;gap:var(--cx-size-8px) var(--cx-size-12px);padding:var(--cx-size-8px) var(--cx-size-12px);border-bottom:var(--cx-size-1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));}
3
+ .cx-calendar .cx-cal{flex:1 1 auto;min-height:0;display:flex;flex-direction:column;position:relative;background:var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));}
4
+ .cx-cal-bar{flex:none;display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:var(--cx-size-8px) var(--cx-size-12px);padding:var(--cx-size-8px) var(--cx-size-12px);border-bottom:var(--cx-size-1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));}
5
+ .cx-cal-bar > .cx-spacer{display:none;}
6
+ .cx-cal-bar > .cx-cal-jumpbox{grid-column:3;}
7
+ .cx-cal-bar > .cx-cal-views{grid-column:1;grid-row:2;justify-self:start;}
8
+ .cx-cal-bar > .cx-cal-zoom{grid-column:2;grid-row:2;justify-self:end;}
9
+ .cx-cal-bar > .cx-cal-print{grid-column:3;grid-row:2;justify-self:end;}
10
+ .cx-plan-calendar .cx-cal-bar{display:flex;flex-wrap:nowrap;}
11
+ .cx-plan-calendar .cx-cal-bar > .cx-cal-title{flex:1 1 auto;}
12
+ .cx-plan-calendar .cx-cal-bar > .cx-cal-jumpbox{margin-inline-start:auto;}
5
13
  .cx-cal-nav{display:flex;align-items:center;gap:var(--cx-size-4px);}
6
- .cx-cal-title{margin:0;min-width:0;font-size:var(--cx-size-17px);font-weight:600;line-height:1.3;color:var(--hfx-color-text,light-dark(#16181c,#f2f3f5));white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
14
+ .cx-cal-title{margin:0;min-width:0;font-size:var(--cx-size-17px);font-weight:600;line-height:1.3;color:var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)));white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
7
15
  .cx-cal-ico{width:var(--cx-size-16px);height:var(--cx-size-16px);flex:none;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;}
8
16
  .cx-cal-bar .cx-cal-view-select{display:none;}
9
- .cx-cal-notice{flex:none;padding:var(--cx-size-6px) var(--cx-size-12px);font-size:var(--cx-size-13px);color:var(--hfx-color-text-secondary,light-dark(#4d525b,#b0b4bc));background:var(--hfx-color-surface-sunken,light-dark(#f7f8f9,#111317));border-bottom:var(--cx-size-1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));}
17
+ .cx-cal-notice{flex:none;padding:var(--cx-size-6px) var(--cx-size-12px);font-size:var(--cx-size-13px);color:var(--hfx-color-text-secondary,light-dark(#4d525b,#b0b4bc));background:var(--hfx-color-surface-sunken,light-dark(#f7f8f9,#111317));border-bottom:var(--cx-size-1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));}
10
18
  .cx-cal-notice.cx-cal-error{color:var(--hfx-color-status-bad-fg,light-dark(#b8292a,#f47171));}
11
19
  .cx-cal-body{flex:1 1 auto;min-height:0;overflow:auto;position:relative;}
12
20
  .cx-cal-rpick > button{flex:none;min-width:var(--cx-size-34px);}
13
21
  .cx-cal-shared{font-size:var(--cx-size-11px);line-height:var(--cx-size-16px);border:var(--cx-size-1px) solid currentColor;border-radius:var(--hfx-radius-status,999px);padding-inline:var(--cx-size-4px);align-self:flex-start;}
14
- .cx-cal-ev.cx-cal-shared-active{outline:var(--hfx-focus-width,2px) solid var(--cx-ev);outline-offset:var(--hfx-focus-offset,2px);background:color-mix(in srgb,var(--cx-ev) 25%,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));}
15
- .cx-cal-empty{margin:0;padding:var(--cx-size-24px) var(--cx-size-16px);color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));text-align:center;}
16
- .cx-cal-ev{--cx-ev:var(--hfx-color-accent,light-dark(#11776f,#37c9b8));--cx-ev-bg:var(--hfx-color-accent-subtle,light-dark(#e7f1f1,#1b3435));position:relative;display:flex;align-items:center;gap:var(--cx-size-4px);min-width:0;margin:0;padding:0 var(--cx-size-6px);border:0;border-radius:var(--hfx-radius-sm,4px);background:var(--cx-ev-bg);color:var(--hfx-color-text,light-dark(#16181c,#f2f3f5));font:inherit;font-size:var(--cx-size-12d5px);line-height:var(--cx-size-18px);text-align:start;cursor:pointer;overflow:hidden;white-space:nowrap;box-shadow:inset var(--cx-size-3px) 0 0 var(--cx-ev);}
22
+ .cx-cal-ev.cx-cal-shared-active{outline:var(--hfx-focus-width,2px) solid var(--cx-ev);outline-offset:var(--hfx-focus-offset,2px);background:color-mix(in srgb,var(--cx-ev) 25%,var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c))));}
23
+ .cx-cal-empty{margin:0;padding:var(--cx-size-24px) var(--cx-size-16px);color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));text-align:center;}
24
+ .cx-cal-ev{--cx-ev:var(--hfx-color-accent,light-dark(#11776f,#37c9b8));--cx-ev-bg:var(--hfx-color-accent-subtle,light-dark(#e7f1f1,#1b3435));position:relative;display:flex;align-items:center;gap:var(--cx-size-4px);min-width:0;margin:0;padding:0 var(--cx-size-6px);border:0;border-radius:var(--hfx-radius-sm,4px);background:var(--cx-ev-bg);color:var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)));font:inherit;font-size:var(--cx-size-12d5px);line-height:var(--cx-size-18px);text-align:start;cursor:pointer;overflow:hidden;white-space:nowrap;box-shadow:inset var(--cx-size-3px) 0 0 var(--cx-ev);}
17
25
  :where(.cx-cal-rtl) .cx-cal-ev{box-shadow:inset calc(-1 * var(--cx-size-3px)) 0 0 var(--cx-ev);}
18
- .cx-cal-ev:hover{background:color-mix(in srgb,var(--cx-ev) 22%,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));}
26
+ .cx-cal-ev:hover{background:color-mix(in srgb,var(--cx-ev) 22%,var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c))));}
19
27
  .cx-cal-ev: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);z-index:6;}
20
28
  .cx-cal-ev-title{min-width:0;overflow:hidden;text-overflow:ellipsis;}
21
29
  .cx-cal-ev-time{flex:none;color:var(--hfx-color-text-secondary,light-dark(#4d525b,#b0b4bc));font-variant-numeric:tabular-nums;}
@@ -32,20 +40,20 @@
32
40
  [data-cx-event-style="strong"] .cx-cal-ev:is(.cx-cal-ev-bar,.cx-cal-ev-block,.cx-cal-ev-lane) :is(.cx-cal-ev-time,.cx-cal-ev-sub,.cx-cal-ico){color:inherit;opacity:.88;}
33
41
  .cx-cal-month{display:flex;flex-direction:column;min-height:100%;}
34
42
  .cx-cal-dow,.cx-cal-week{display:grid;grid-template-columns:repeat(var(--cx-cal-cols),minmax(0,1fr));}
35
- .cx-cal-dow{position:sticky;top:0;z-index:7;background:var(--hfx-color-surface-sunken,light-dark(#f7f8f9,#111317));border-bottom:var(--cx-size-1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));}
43
+ .cx-cal-dow{position:sticky;top:0;z-index:7;background:var(--hfx-color-surface-sunken,light-dark(#f7f8f9,#111317));border-bottom:var(--cx-size-1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));}
36
44
  .cx-cal-dowc{padding:var(--cx-size-6px) var(--cx-size-8px);font-size:var(--cx-size-12px);font-weight:700;color:var(--hfx-color-text-secondary,light-dark(#4d525b,#b0b4bc));overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
37
45
  .cx-cal-weeks{flex:1 1 auto;display:flex;flex-direction:column;}
38
- .cx-cal-week{flex:1 0 auto;position:relative;border-bottom:var(--cx-size-1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));}
39
- .cx-cal-day{min-width:0;padding:var(--cx-size-3px) var(--cx-size-4px);border-inline-end:var(--cx-size-1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));outline:none;}
46
+ .cx-cal-week{flex:1 0 auto;position:relative;border-bottom:var(--cx-size-1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));}
47
+ .cx-cal-day{min-width:0;padding:var(--cx-size-3px) 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)));outline:none;}
40
48
  .cx-cal-day:last-child{border-inline-end:0;}
41
- .cx-cal-day.cx-cal-out{background:color-mix(in srgb,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)) 2.5%,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));}
42
- .cx-cal-out .cx-cal-num{color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));}
49
+ .cx-cal-day.cx-cal-out{background:color-mix(in srgb,var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5))) 2.5%,var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c))));}
50
+ .cx-cal-out .cx-cal-num{color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));}
43
51
  .cx-cal-num{display:inline-grid;place-items:center;min-width:var(--cx-size-22px);height:var(--cx-size-22px);padding:0 var(--cx-size-5px);border-radius:var(--cx-size-11px);font-size:var(--cx-size-13px);font-weight:600;font-variant-numeric:tabular-nums;cursor:pointer;}
44
52
  .cx-cal-num:hover{background:var(--hfx-color-hover,light-dark(#f5f5f5,#232529));}
45
53
  .cx-cal-today > .cx-cal-num,.cx-cal-today > .cx-cal-num:hover{background:var(--hfx-color-accent,light-dark(#11776f,#37c9b8));color:var(--hfx-color-accent-contrast,light-dark(#ffffff,#0c0d10));}
46
54
  .cx-cal-day:focus-visible{outline:var(--hfx-focus-width,2px) solid var(--hfx-color-focus-ring,light-dark(#02726a,#37c9b8));outline-offset:calc(-1 * var(--cx-size-2px));}
47
55
  .cx-cal-day[aria-selected="true"],.cx-cal-slot[aria-selected="true"],.cx-cal-allcell[aria-selected="true"]{background:var(--hfx-color-accent-subtle,light-dark(#e7f1f1,#1b3435));}
48
- .cx-cal-day.cx-cal-bgday{background:color-mix(in srgb,var(--cx-bg-tone) 9%,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));}
56
+ .cx-cal-day.cx-cal-bgday{background:color-mix(in srgb,var(--cx-bg-tone) 9%,var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c))));}
49
57
  .cx-cal-bglabel{float:inline-end;max-width:70%;margin-top:var(--cx-size-3px);font-size:var(--cx-size-11d5px);color:var(--hfx-color-text-secondary,light-dark(#4d525b,#b0b4bc));overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
50
58
  .cx-cal-week > .cx-cal-day > :is(.cx-cal-ev,.cx-cal-more-btn){position:absolute;height:var(--cx-size-20px);top:calc(var(--cx-size-26px) + var(--l) * var(--cx-size-22px));inset-inline-start:calc(100% * var(--c) / var(--cx-cal-cols) + var(--cx-size-3px));}
51
59
  .cx-cal-week > .cx-cal-day > .cx-cal-ev{width:calc(100% * var(--s) / var(--cx-cal-cols) - var(--cx-size-6px));}
@@ -54,10 +62,10 @@
54
62
  .cx-cal-more-btn: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);}
55
63
  .cx-cal-dots{display:flex;justify-content:center;gap:var(--cx-size-3px);margin-top:var(--cx-size-2px);}
56
64
  .cx-cal-dots > i{width:var(--cx-size-6px);height:var(--cx-size-6px);border-radius:50%;background:var(--cx-ev,var(--hfx-color-accent,light-dark(#11776f,#37c9b8)));}
57
- .cx-cal-daylist{padding:var(--cx-size-8px) var(--cx-size-12px) var(--cx-size-12px);border-top:var(--cx-size-1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));}
65
+ .cx-cal-daylist{padding:var(--cx-size-8px) var(--cx-size-12px) var(--cx-size-12px);border-top:var(--cx-size-1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));}
58
66
  .cx-cal-daylist-h{margin:var(--cx-size-4px) 0 var(--cx-size-6px);font-size:var(--cx-size-14px);font-weight:600;}
59
67
  .cx-cal-daylist > .cx-cal-ev{width:100%;min-height:var(--cx-size-44px);}
60
- .cx-cal-more{position:absolute;z-index:20;max-height:var(--cx-size-360px);overflow:auto;padding:var(--cx-size-8px);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-overlay,var(--hfx-radius-lg,10px));box-shadow:var(--hfx-elevation-2,0 1px 2px rgba(22,24,28,.05),0 6px 18px -10px rgba(22,24,28,.18));}
68
+ .cx-cal-more{position:absolute;z-index:20;max-height:var(--cx-size-360px);overflow:auto;padding:var(--cx-size-8px);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-overlay,var(--hfx-radius-lg,10px));box-shadow:var(--hfx-elevation-2,0 1px 2px rgba(22,24,28,.05),0 6px 18px -10px rgba(22,24,28,.18));}
61
69
  .cx-cal-more-top{display:flex;align-items:center;gap:var(--cx-size-8px);margin-bottom:var(--cx-size-6px);}
62
70
  .cx-cal-more-h{flex:1;margin:0;font-size:var(--cx-size-13d5px);font-weight:600;}
63
71
  .cx-cal-more-list{display:flex;flex-direction:column;gap:var(--cx-size-2px);}
@@ -67,18 +75,18 @@
67
75
  .cx-cal-more-list > .cx-cal-ev > :is(.cx-cal-ev-time,.cx-cal-ico){flex:none;white-space:nowrap;}
68
76
  .cx-cal-more{max-width:min(var(--cx-size-360px),calc(100vw - var(--cx-size-24px)));}
69
77
  .cx-cal-time{display:flex;flex-direction:column;height:100%;min-height:0;}
70
- .cx-cal-thead{flex:none;background:var(--hfx-color-surface,light-dark(#ffffff,#16181c));border-bottom:var(--cx-size-1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));}
78
+ .cx-cal-thead{flex:none;background:var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));border-bottom:var(--cx-size-1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));}
71
79
  .cx-cal-trow,.cx-cal-srow{display:flex;min-width:0;}
72
80
  .cx-cal-trow > .cx-cal-corner,.cx-cal-trow > .cx-cal-stime,.cx-cal-srow > .cx-cal-stime{flex:0 0 var(--cx-cal-gutter);width:var(--cx-cal-gutter);}
73
- .cx-cal-dayhead{flex:1 1 0;min-width:0;display:flex;align-items:baseline;justify-content:center;gap:var(--cx-size-6px);padding:var(--cx-size-6px) var(--cx-size-4px);border-inline-start:var(--cx-size-1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));font-size:var(--cx-size-13px);color:var(--hfx-color-text-secondary,light-dark(#4d525b,#b0b4bc));cursor:pointer;white-space:nowrap;overflow:hidden;}
74
- .cx-cal-daynum{font-size:var(--cx-size-17px);font-weight:600;color:var(--hfx-color-text,light-dark(#16181c,#f2f3f5));font-variant-numeric:tabular-nums;}
81
+ .cx-cal-dayhead{flex:1 1 0;min-width:0;display:flex;align-items:baseline;justify-content:center;gap:var(--cx-size-6px);padding:var(--cx-size-6px) var(--cx-size-4px);border-inline-start:var(--cx-size-1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));font-size:var(--cx-size-13px);color:var(--hfx-color-text-secondary,light-dark(#4d525b,#b0b4bc));cursor:pointer;white-space:nowrap;overflow:hidden;}
82
+ .cx-cal-daynum{font-size:var(--cx-size-17px);font-weight:600;color:var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)));font-variant-numeric:tabular-nums;}
75
83
  .cx-cal-dayhead.cx-cal-today .cx-cal-daynum{display:inline-grid;place-items:center;min-width:var(--cx-size-28px);height:var(--cx-size-28px);border-radius:var(--cx-size-14px);background:var(--hfx-color-accent,light-dark(#11776f,#37c9b8));color:var(--hfx-color-accent-contrast,light-dark(#ffffff,#0c0d10));}
76
- .cx-cal-rheads,.cx-cal-gheads{border-top:var(--cx-size-1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));}
77
- .cx-cal-ghead{flex:1 1 0;min-width:0;padding:var(--cx-size-4px) var(--cx-size-6px);border-inline-start:var(--cx-size-1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));font-size:var(--cx-size-12px);font-weight:700;color:var(--hfx-color-text,light-dark(#16181c,#f2f3f5));text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
78
- .cx-cal-rhead{flex:1 1 0;min-width:0;padding:var(--cx-size-4px) var(--cx-size-6px);border-inline-start:var(--cx-size-1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));font-size:var(--cx-size-12px);font-weight:600;color:var(--hfx-color-text-secondary,light-dark(#4d525b,#b0b4bc));text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
79
- .cx-cal-allrow{position:relative;min-height:calc(var(--cx-cal-lanes,1) * var(--cx-size-22px) + var(--cx-size-8px));border-top:var(--cx-size-1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));}
80
- .cx-cal-alllabel{padding-block-start:var(--cx-size-6px);padding-inline-end:var(--cx-size-8px);font-size:var(--cx-size-11d5px);color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));text-align:end;}
81
- .cx-cal-allcell{flex:1 1 0;min-width:0;border-inline-start:var(--cx-size-1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));outline:none;}
84
+ .cx-cal-rheads,.cx-cal-gheads{border-top:var(--cx-size-1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));}
85
+ .cx-cal-ghead{flex:1 1 0;min-width:0;padding:var(--cx-size-4px) var(--cx-size-6px);border-inline-start:var(--cx-size-1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));font-size:var(--cx-size-12px);font-weight:700;color:var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)));text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
86
+ .cx-cal-rhead{flex:1 1 0;min-width:0;padding:var(--cx-size-4px) var(--cx-size-6px);border-inline-start:var(--cx-size-1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));font-size:var(--cx-size-12px);font-weight:600;color:var(--hfx-color-text-secondary,light-dark(#4d525b,#b0b4bc));text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
87
+ .cx-cal-allrow{position:relative;min-height:calc(var(--cx-cal-lanes,1) * var(--cx-size-22px) + var(--cx-size-8px));border-top:var(--cx-size-1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));}
88
+ .cx-cal-alllabel{padding-block-start:var(--cx-size-6px);padding-inline-end:var(--cx-size-8px);font-size:var(--cx-size-11d5px);color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));text-align:end;}
89
+ .cx-cal-allcell{flex:1 1 0;min-width:0;border-inline-start:var(--cx-size-1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));outline:none;}
82
90
  .cx-cal-allcell:focus-visible,.cx-cal-slot:focus-visible{outline:var(--hfx-focus-width,2px) solid var(--hfx-color-focus-ring,light-dark(#02726a,#37c9b8));outline-offset:calc(-1 * var(--cx-size-2px));}
83
91
  .cx-cal-allrow > .cx-cal-allcell > :is(.cx-cal-ev,.cx-cal-more-btn){position:absolute;height:var(--cx-size-20px);top:calc(var(--cx-size-4px) + var(--l) * var(--cx-size-22px));inset-inline-start:calc(var(--cx-cal-gutter) + (100% - var(--cx-cal-gutter)) * var(--c) / var(--cx-cal-n) + var(--cx-size-2px));}
84
92
  .cx-cal-allrow > .cx-cal-allcell > .cx-cal-ev{width:calc((100% - var(--cx-cal-gutter)) * var(--s) / var(--cx-cal-n) - var(--cx-size-4px));}
@@ -86,10 +94,10 @@
86
94
  .cx-cal-scroll{flex:1 1 auto;min-height:0;overflow-y:auto;overflow-x:hidden;max-height:var(--cx-cal-slots-height,none);}
87
95
  .cx-cal-slots{position:relative;}
88
96
  .cx-cal-srow{height:var(--cx-size-24px);}
89
- .cx-cal-stime{padding:0 var(--cx-size-8px);font-size:var(--cx-size-11d5px);line-height:1;color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));text-align:end;font-variant-numeric:tabular-nums;transform:translateY(calc(-1 * var(--cx-size-6px)));}
97
+ .cx-cal-stime{padding:0 var(--cx-size-8px);font-size:var(--cx-size-11d5px);line-height:1;color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));text-align:end;font-variant-numeric:tabular-nums;transform:translateY(calc(-1 * var(--cx-size-6px)));}
90
98
  .cx-cal-srow:first-child > .cx-cal-stime{transform:none;padding-top:var(--cx-size-2px);}
91
- .cx-cal-slot{flex:1 1 0;min-width:0;border-inline-start:var(--cx-size-1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));border-top:var(--cx-size-1px) solid color-mix(in srgb,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)) 50%,transparent);outline:none;}
92
- .cx-cal-hour > .cx-cal-slot{border-top-color:var(--hfx-color-border,light-dark(#e2e4e7,#272a30));}
99
+ .cx-cal-slot{flex:1 1 0;min-width:0;border-inline-start:var(--cx-size-1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));border-top:var(--cx-size-1px) solid color-mix(in srgb,var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30))) 50%,transparent);outline:none;}
100
+ .cx-cal-hour > .cx-cal-slot{border-top-color:var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));}
93
101
  .cx-cal-slots .cx-cal-ev-block{position:absolute;z-index:2;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:0;padding:var(--cx-size-2px) var(--cx-size-6px);white-space:normal;line-height:var(--cx-size-16px);
94
102
  inset-inline-start:calc(var(--cx-cal-gutter) + (100% - var(--cx-cal-gutter)) * (var(--d) + var(--c) / var(--k)) / var(--cx-cal-n) + var(--cx-size-2px));width:calc((100% - var(--cx-cal-gutter)) * var(--sp) / var(--k) / var(--cx-cal-n) - var(--cx-size-4px));
95
103
  top:calc(var(--t) * var(--cx-cal-ppm) + var(--cx-size-1px));height:calc(var(--h) * var(--cx-cal-ppm) - var(--cx-size-2px));}
@@ -104,18 +112,18 @@ top:calc(var(--t) * var(--cx-cal-ppm) + var(--cx-size-1px));height:calc(var(--h)
104
112
  .cx-cal-slots .cx-cal-ev-block:is(.cx-cal-short,.cx-cal-marker) > .cx-cal-ev-title{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;}
105
113
  .cx-cal-slots .cx-cal-ev-block:is(.cx-cal-short,.cx-cal-marker) > .cx-cal-ev-time{flex:none;}
106
114
  .cx-cal-slots .cx-cal-ev-block.cx-cal-short > :is(.cx-cal-ev-sub,.cx-cal-ev-status){display:none;}
107
- .cx-cal-slots .cx-cal-ev-block.cx-cal-marker{height:var(--cx-size-20px);transform:translateY(calc(-1 * var(--cx-size-10px)));flex-direction:row;align-items:center;gap:var(--cx-size-4px);background:var(--hfx-color-surface,light-dark(#ffffff,#16181c));box-shadow:inset 0 0 0 var(--cx-size-1px) var(--cx-ev);border-radius:var(--hfx-radius-control,var(--hfx-radius-md,6px));white-space:nowrap;}
115
+ .cx-cal-slots .cx-cal-ev-block.cx-cal-marker{height:var(--cx-size-20px);transform:translateY(calc(-1 * var(--cx-size-10px)));flex-direction:row;align-items:center;gap:var(--cx-size-4px);background:var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));box-shadow:inset 0 0 0 var(--cx-size-1px) var(--cx-ev);border-radius:var(--hfx-radius-control,var(--hfx-radius-md,6px));white-space:nowrap;}
108
116
  .cx-cal-slots .cx-cal-ev-block.cx-cal-marker::before{content:"";flex:none;width:var(--cx-size-8px);height:var(--cx-size-8px);border-radius:50%;background:var(--cx-ev);}
109
117
  .cx-cal-slots .cx-cal-ev-block.cx-cal-marker > :is(.cx-cal-ev-sub,.cx-cal-ev-status){display:none;}
110
118
  .cx-cal-shade{position:absolute;z-index:1;pointer-events:none;overflow:hidden;inset-inline-start:calc(var(--cx-cal-gutter) + (100% - var(--cx-cal-gutter)) * var(--d) / var(--cx-cal-n));width:calc((100% - var(--cx-cal-gutter)) / var(--cx-cal-n));top:calc(var(--t) * var(--cx-cal-ppm));height:calc(var(--h) * var(--cx-cal-ppm));}
111
119
  .cx-cal-shade > span{display:block;padding:var(--cx-size-2px) var(--cx-size-6px);font-size:var(--cx-size-11d5px);color:var(--hfx-color-text-secondary,light-dark(#4d525b,#b0b4bc));white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
112
- .cx-cal-shade.cx-cal-off{background:color-mix(in srgb,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)) 4%,transparent);}
113
- .cx-cal-shade.cx-cal-unavailable{background:repeating-linear-gradient(135deg,color-mix(in srgb,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)) 8%,transparent) 0 var(--cx-size-6px),transparent var(--cx-size-6px) var(--cx-size-12px));}
120
+ .cx-cal-shade.cx-cal-off{background:color-mix(in srgb,var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5))) 4%,transparent);}
121
+ .cx-cal-shade.cx-cal-unavailable{background:repeating-linear-gradient(135deg,color-mix(in srgb,var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5))) 8%,transparent) 0 var(--cx-size-6px),transparent var(--cx-size-6px) var(--cx-size-12px));}
114
122
  .cx-cal-shade.cx-cal-bgrange{background:color-mix(in srgb,var(--cx-bg-tone) 11%,transparent);box-shadow:inset var(--cx-size-2px) 0 0 color-mix(in srgb,var(--cx-bg-tone) 55%,transparent);}
115
123
  :where(.cx-cal-rtl) .cx-cal-shade.cx-cal-bgrange{box-shadow:inset calc(-1 * var(--cx-size-2px)) 0 0 color-mix(in srgb,var(--cx-bg-tone) 55%,transparent);}
116
124
  .cx-cal-now{position:absolute;z-index:1;height:var(--cx-size-2px);pointer-events:none;background:var(--hfx-color-status-bad-fg,light-dark(#b8292a,#f47171));inset-inline-start:calc(var(--cx-cal-gutter) + (100% - var(--cx-cal-gutter)) * var(--d) / var(--cx-cal-n));width:calc((100% - var(--cx-cal-gutter)) * var(--sp) / var(--cx-cal-n));top:calc(var(--t) * var(--cx-cal-ppm) - var(--cx-size-1px));}
117
125
  .cx-cal-now::before{content:"";position:absolute;inset-inline-start:calc(-1 * var(--cx-size-4px));top:calc(-1 * var(--cx-size-3px));width:var(--cx-size-8px);height:var(--cx-size-8px);border-radius:50%;background:inherit;}
118
- .cx-cal-agroup{border-bottom:var(--cx-size-1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));}
126
+ .cx-cal-agroup{border-bottom:var(--cx-size-1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));}
119
127
  .cx-cal-ahead{position:sticky;top:0;z-index:2;background:var(--hfx-color-surface-sunken,light-dark(#f7f8f9,#111317));}
120
128
  .cx-cal-ahead-c{display:flex;align-items:baseline;gap:var(--cx-size-8px);padding:var(--cx-size-6px) var(--cx-size-12px);font-weight:600;}
121
129
  .cx-cal-aweekday{font-weight:400;color:var(--hfx-color-text-secondary,light-dark(#4d525b,#b0b4bc));}
@@ -129,62 +137,67 @@ top:calc(var(--t) * var(--cx-cal-ppm) + var(--cx-size-1px));height:calc(var(--h)
129
137
  .cx-cal-ev-item > .cx-cal-ev-title{font-weight:600;overflow-wrap:anywhere;}
130
138
  .cx-cal-ev-item > .cx-cal-ico{margin-inline-start:0;}
131
139
  .cx-cal-ev-item > .cx-cal-ev-status.cx-cal-status-tone .p-dot{display:none;}
132
- .cx-cal-ev-item > .cx-cal-ev-status .p-state{padding:0 var(--cx-size-8px);border-radius:var(--hfx-radius-control,var(--hfx-radius-md,6px));background:var(--cx-ev-bg);color:var(--hfx-color-text,light-dark(#16181c,#f2f3f5));font-size:var(--cx-size-12px);line-height:var(--cx-size-20px);}
133
- .cx-cal-year{display:grid;grid-template-columns:repeat(auto-fill,minmax(var(--cx-size-210px),1fr));gap:var(--cx-size-16px) var(--cx-size-20px);padding:var(--cx-size-16px);}
140
+ .cx-cal-ev-item > .cx-cal-ev-status .p-state{padding:0 var(--cx-size-8px);border-radius:var(--hfx-radius-control,var(--hfx-radius-md,6px));background:var(--cx-ev-bg);color:var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)));font-size:var(--cx-size-12px);line-height:var(--cx-size-20px);}
141
+ .cx-cal-year{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,var(--cx-size-280px)),1fr));gap:var(--cx-size-16px) var(--cx-size-20px);padding:var(--cx-size-16px);}
134
142
  .cx-cal-ymonth-h{margin:0 0 var(--cx-size-6px);font-size:var(--cx-size-14px);font-weight:600;}
135
143
  .cx-cal-ygrid{display:flex;flex-direction:column;gap:var(--cx-size-2px);}
136
144
  .cx-cal-ydow,.cx-cal-yweek{display:grid;grid-template-columns:repeat(var(--cx-cal-cols),minmax(0,1fr));gap:var(--cx-size-2px);}
137
- .cx-cal-ydow > .cx-cal-dowc{padding:0;text-align:center;font-size:var(--cx-size-11px);color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));}
145
+ .cx-cal-ydow > .cx-cal-dowc{padding:0;text-align:center;font-size:var(--cx-size-11px);color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));}
138
146
  .cx-cal-yday{height:var(--cx-size-26px);display:grid;place-items:center;border-radius:var(--hfx-radius-sm,4px);font-size:var(--cx-size-12px);font-variant-numeric:tabular-nums;cursor:pointer;outline:none;}
147
+ .cx-cal-yday[data-cx-heat]{position:relative;font-weight:var(--hfx-weight-semibold,600);}
148
+ .cx-cal-yday[data-cx-heat]::after{content:"";position:absolute;inset-block-end:var(--hfx-space-0-5,2px);inset-inline-start:calc(50% - var(--hfx-space-0-5,2px));width:var(--hfx-space-1,0.25rem);height:var(--hfx-space-1,0.25rem);border-radius:50%;background:var(--hfx-color-accent,light-dark(#11776f,#37c9b8));}
149
+ .cx-cal-yday[data-cx-heat="4"]::after{background:currentColor;}
139
150
  .cx-cal-yday:hover{box-shadow:inset 0 0 0 var(--cx-size-1px) var(--hfx-color-border-strong,light-dark(#cdd0d5,#363a42));}
140
- :is(.cx-cal-yday,.cx-cal-yswatch)[data-cx-heat="1"]{background:color-mix(in srgb,var(--hfx-color-accent,light-dark(#11776f,#37c9b8)) 14%,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));}
141
- :is(.cx-cal-yday,.cx-cal-yswatch)[data-cx-heat="2"]{background:color-mix(in srgb,var(--hfx-color-accent,light-dark(#11776f,#37c9b8)) 30%,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));}
142
- :is(.cx-cal-yday,.cx-cal-yswatch)[data-cx-heat="3"]{background:color-mix(in srgb,var(--hfx-color-accent,light-dark(#11776f,#37c9b8)) 50%,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));}
151
+ :is(.cx-cal-yday,.cx-cal-yswatch)[data-cx-heat="1"]{background:color-mix(in srgb,var(--hfx-color-accent,light-dark(#11776f,#37c9b8)) 14%,var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c))));}
152
+ :is(.cx-cal-yday,.cx-cal-yswatch)[data-cx-heat="2"]{background:color-mix(in srgb,var(--hfx-color-accent,light-dark(#11776f,#37c9b8)) 30%,var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c))));}
153
+ :is(.cx-cal-yday,.cx-cal-yswatch)[data-cx-heat="3"]{background:color-mix(in srgb,var(--hfx-color-accent,light-dark(#11776f,#37c9b8)) 50%,var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c))));}
143
154
  :is(.cx-cal-yday,.cx-cal-yswatch)[data-cx-heat="4"]{background:var(--hfx-color-accent,light-dark(#11776f,#37c9b8));color:var(--hfx-color-accent-contrast,light-dark(#ffffff,#0c0d10));}
144
155
  .cx-cal-jumpbox{position:relative;display:inline-flex;}
145
156
  .cx-cal-bare > :is(.cx-toolbar,.cx-grid-query-summary,.cx-pager){display:none!important;}
146
157
  .cx-cal-no-search > .cx-toolbar .cx-search,.cx-cal-no-filters > .cx-toolbar .cx-grid-filters,.cx-cal-no-columns > .cx-toolbar .cx-grid-columns,
147
158
  .cx-cal-no-views > .cx-toolbar .cx-grid-views,.cx-cal-no-export > .cx-toolbar .cx-grid-export,.cx-cal-no-more > .cx-toolbar .cx-grid-overflow{display:none;}
148
- .cx-cal-pad{background:color-mix(in srgb,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)) 2%,transparent);}
149
- .cx-cal-invalid{background:repeating-linear-gradient(135deg,color-mix(in srgb,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)) 5%,transparent) 0 var(--cx-size-6px),transparent var(--cx-size-6px) var(--cx-size-12px));color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));}
150
- .cx-cal-wknum{float:inline-end;margin-inline-start:var(--cx-size-4px);font-size:var(--cx-size-11px);line-height:var(--cx-size-20px);color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));font-variant-numeric:tabular-nums;}
159
+ .cx-cal-pad{background:color-mix(in srgb,var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5))) 2%,transparent);}
160
+ .cx-cal-invalid{background:repeating-linear-gradient(135deg,color-mix(in srgb,var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5))) 5%,transparent) 0 var(--cx-size-6px),transparent var(--cx-size-6px) var(--cx-size-12px));color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));}
161
+ .cx-cal-wknum{float:inline-end;margin-inline-start:var(--cx-size-4px);font-size:var(--cx-size-11px);line-height:var(--cx-size-20px);color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));font-variant-numeric:tabular-nums;}
151
162
  .cx-cal-lhead > .cx-cal-wknum{position:static;margin-inline-start:auto;}
152
163
  .cx-calendar:not([data-cx-calendar-view="mini"]) .cx-cal-day > .cx-cal-num:hover{text-decoration:underline;cursor:pointer;}
153
- .cx-cal-mini{width:min(100%,var(--cx-size-360px));height:auto;min-height:0;flex:none;margin:var(--cx-size-12px) auto;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));overflow:hidden;}
164
+ .cx-cal-mini{width:calc(100% - 2 * var(--cx-size-12px));max-width:calc(3 * var(--cx-size-280px));height:auto;min-height:0;flex:none;margin:var(--cx-size-12px) auto;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));overflow:hidden;}/* lint-allow layout: calendar width follows the host with a readable day-cell limit */
154
165
  .cx-cal-mini .cx-cal-week{min-height:var(--cx-size-34px)!important;flex:none;}
155
166
  .cx-cal-mini .cx-cal-day{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--cx-size-2px) 0;cursor:pointer;}
156
167
  .cx-cal-mini .cx-cal-num{font-size:var(--cx-size-12px);}
157
168
  .cx-cal-mini .cx-cal-wknum{display:none;}
158
169
  .cx-cal-mini .cx-cal-dots{margin-top:var(--cx-size-1px);}
159
- .cx-cal-mini .cx-cal-dots > i{width:var(--cx-size-4px);height:var(--cx-size-4px);}
170
+ .cx-cal-mini .cx-cal-dots > i{width:var(--hfx-space-1-5,6px);height:var(--hfx-space-1-5,6px);}
160
171
  .cx-cal-mini .cx-cal-day[aria-selected="true"] > .cx-cal-num{display:inline-grid;place-items:center;min-width:var(--cx-size-22px);height:var(--cx-size-22px);border-radius:var(--cx-size-11px);background:var(--hfx-color-accent,light-dark(#11776f,#37c9b8));color:var(--hfx-color-accent-contrast,light-dark(#ffffff,#0c0d10));}
172
+ .cx-cal-mini .cx-cal-day[data-cx-listed] > .cx-cal-num{outline:var(--hfx-focus-width,2px) solid var(--hfx-color-accent,light-dark(#11776f,#37c9b8));outline-offset:calc(-1 * var(--hfx-focus-width,2px));}
161
173
  .cx-cal-mini .cx-cal-dowc{text-align:center;padding:var(--cx-size-4px) 0;font-size:var(--cx-size-11px);}
162
174
  .cx-cal-months{display:flex;flex-direction:column;gap:var(--cx-size-16px);padding:var(--cx-size-8px) 0 var(--cx-size-16px);}
163
- .cx-cal-mtitle{position:sticky;top:0;z-index:8;margin:0;padding:var(--cx-size-6px) var(--cx-size-12px);background:var(--hfx-color-surface,light-dark(#ffffff,#16181c));font-size:var(--cx-size-14px);font-weight:600;}
175
+ .cx-cal-mtitle{position:sticky;top:0;z-index:8;margin:0;padding:var(--cx-size-6px) var(--cx-size-12px);background:var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));font-size:var(--cx-size-14px);font-weight:600;}
164
176
  .cx-cal-months .cx-cal-month{min-height:0;}
165
177
  .cx-cal-months .cx-cal-dow{position:static;}
166
178
  .cx-cal-list{min-height:100%;}
167
179
  .cx-cal-lrow{display:grid;grid-template-columns:repeat(var(--cx-cal-cols),minmax(0,1fr));min-height:100%;}
168
- .cx-cal-lday{position:relative;display:flex;flex-direction:column;gap:var(--cx-size-6px);min-width:0;padding:var(--cx-size-8px);border-inline-start:var(--cx-size-1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));outline:none;}
180
+ .cx-cal-lday{position:relative;display:flex;flex-direction:column;gap:var(--cx-size-6px);min-width:0;padding:var(--cx-size-8px);border-inline-start:var(--cx-size-1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));outline:none;}
169
181
  .cx-cal-lday:first-child{border-inline-start:0;}
170
182
  .cx-cal-lday:focus-visible{outline:var(--hfx-focus-width,2px) solid var(--hfx-color-focus-ring,light-dark(#02726a,#37c9b8));outline-offset:calc(-1 * var(--cx-size-2px));}
171
- .cx-cal-lhead{display:flex;align-items:baseline;gap:var(--cx-size-6px);padding-bottom:var(--cx-size-6px);border-bottom:var(--cx-size-1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));font-size:var(--cx-size-13px);color:var(--hfx-color-text-secondary,light-dark(#4d525b,#b0b4bc));}
172
- .cx-cal-lhead > .cx-cal-num{font-size:var(--cx-size-17px);font-weight:600;color:var(--hfx-color-text,light-dark(#16181c,#f2f3f5));}
183
+ .cx-cal-lhead{display:flex;align-items:baseline;gap:var(--cx-size-6px);padding-bottom:var(--cx-size-6px);border-bottom:var(--cx-size-1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));font-size:var(--cx-size-13px);color:var(--hfx-color-text-secondary,light-dark(#4d525b,#b0b4bc));}
184
+ .cx-cal-lhead > .cx-cal-num{font-size:var(--cx-size-17px);font-weight:600;color:var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)));}
173
185
  .cx-cal-lday.cx-cal-today .cx-cal-lhead > .cx-cal-num{color:var(--hfx-color-accent-text,light-dark(#02726a,#37c9b8));}
174
186
  .cx-cal-lday > .cx-cal-ev-item{font-size:var(--cx-size-13px);}
175
187
  .cx-cal-list:not(.cx-cal-list-day) .cx-cal-lday > .cx-cal-ev-item > .cx-cal-ev-title{flex:1 0 100%;order:1;}
176
- .cx-cal-list:not(.cx-cal-list-day) .cx-cal-lday > .cx-cal-ev-item > .cx-cal-ev-time{flex:1 1 0;min-width:0;}
188
+ .cx-cal-list:not(.cx-cal-list-day) .cx-cal-lday > .cx-cal-ev-item > .cx-cal-ev-time{flex:none;white-space:nowrap;font-size:var(--hfx-type-caption-size,0.75rem);}
189
+ .cx-cal-list:not(.cx-cal-list-day) .cx-cal-lday > .cx-cal-ev-item > .cx-cal-ico{margin-inline-start:0;}
177
190
  .cx-cal-list:not(.cx-cal-list-day) .cx-cal-lday > .cx-cal-ev-item > :is(.cx-cal-ev-sub,.cx-cal-ev-status){order:2;}
178
- .cx-cal-lday > .cx-cal-empty{margin:0;color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));font-size:var(--cx-size-12px);}
191
+ .cx-cal-lday > .cx-cal-empty{margin:0;color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));font-size:var(--cx-size-12px);}
179
192
  .cx-cal-phone .cx-cal-lrow{grid-template-columns:minmax(0,1fr);}
180
- .cx-cal-phone .cx-cal-day.cx-cal-lday{align-items:stretch;justify-content:flex-start;min-height:0;padding:var(--cx-size-8px) var(--cx-size-12px);text-align:start;border-inline-start:0;border-top:var(--cx-size-1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));}
193
+ .cx-cal-phone .cx-cal-day.cx-cal-lday{align-items:stretch;justify-content:flex-start;min-height:0;padding:var(--cx-size-8px) var(--cx-size-12px);text-align:start;border-inline-start:0;border-top:var(--cx-size-1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));}
181
194
  .cx-cal-ylist{display:flex;flex-direction:column;gap:var(--cx-size-2px);margin:var(--cx-size-8px) 0 0;padding:0;list-style:none;}
182
195
  .cx-cal-ylist > li{display:flex;align-items:center;gap:var(--cx-size-6px);min-width:0;}
183
- .cx-cal-yl-day{flex:none;min-width:var(--cx-size-18px);font-size:var(--cx-size-11d5px);color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));text-align:end;font-variant-numeric:tabular-nums;}
196
+ .cx-cal-yl-day{flex:none;min-width:var(--cx-size-18px);font-size:var(--cx-size-11d5px);color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));text-align:end;font-variant-numeric:tabular-nums;}
184
197
  .cx-cal-ylist .cx-cal-ev{flex:1;min-width:0;height:var(--cx-size-22px);font-size:var(--cx-size-12px);}
185
198
  .cx-cal-yl-morebtn{padding:0 var(--cx-size-6px);border:0;background:transparent;color:var(--hfx-color-accent-text,light-dark(#02726a,#37c9b8));font:inherit;font-size:var(--cx-size-12px);font-weight:600;cursor:pointer;}
186
199
  .cx-cal-yl-morebtn:focus-visible{outline:var(--hfx-focus-width,2px) solid var(--hfx-color-focus-ring,light-dark(#02726a,#37c9b8));}
187
- :is(.cx-cal-details,.cx-cal-hover){position:absolute;z-index:21;display:flex;flex-direction:column;gap:var(--cx-size-4px);padding:var(--cx-size-10px) var(--cx-size-12px);background:var(--hfx-color-surface-raised,light-dark(#ffffff,#1e2126));color:var(--hfx-color-text,light-dark(#16181c,#f2f3f5));border:var(--cx-size-1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));border-radius:var(--hfx-radius-overlay,var(--hfx-radius-lg,10px));box-shadow:var(--hfx-elevation-2,0 1px 2px rgba(22,24,28,.05),0 6px 18px -10px rgba(22,24,28,.18));font-size:var(--cx-size-13px);line-height:1.4;}
200
+ :is(.cx-cal-details,.cx-cal-hover){position:absolute;z-index:21;display:flex;flex-direction:column;gap:var(--cx-size-4px);padding:var(--cx-size-10px) var(--cx-size-12px);background:var(--hfx-color-surface-raised,light-dark(#ffffff,#1e2126));color:var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)));border:var(--cx-size-1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));border-radius:var(--hfx-radius-overlay,var(--hfx-radius-lg,10px));box-shadow:var(--hfx-elevation-2,0 1px 2px rgba(22,24,28,.05),0 6px 18px -10px rgba(22,24,28,.18));font-size:var(--cx-size-13px);line-height:1.4;}
188
201
  .cx-cal-hover{pointer-events:none;}
189
202
  .cx-cal-det-top{display:flex;align-items:flex-start;gap:var(--cx-size-8px);}
190
203
  .cx-cal-det-title{flex:1;min-width:0;margin:0;font-size:var(--cx-size-14px);font-weight:600;overflow-wrap:anywhere;}
@@ -200,14 +213,14 @@ top:calc(var(--t) * var(--cx-cal-ppm) + var(--cx-size-1px));height:calc(var(--h)
200
213
  .cx-cal-ylegend > span:last-child{margin-inline-start:var(--cx-size-4px);}
201
214
  .cx-cal-yday.cx-cal-today{box-shadow:inset 0 0 0 var(--cx-size-2px) var(--hfx-color-accent,light-dark(#11776f,#37c9b8));font-weight:700;}
202
215
  .cx-cal-yday: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);}
203
- .cx-cal-phone .cx-cal-bar{gap:var(--cx-size-6px);padding:var(--cx-size-6px) var(--cx-size-8px);}
216
+ .cx-cal-phone .cx-cal-bar{display:flex;flex-wrap:wrap;gap:var(--cx-size-6px);padding:var(--cx-size-6px) var(--cx-size-8px);}
204
217
  .cx-cal-phone .cx-cal-bar .cx-cal-views{display:none;}
205
218
  .cx-cal-phone .cx-cal-bar .cx-cal-view-select:not([hidden]){display:block;margin-inline-start:auto;}
206
219
  .cx-cal-phone .cx-cal-bar .cx-cal-jumpbox{display:none;}
207
220
  .cx-cal-phone .cx-cal-title{order:3;flex-basis:100%;font-size:var(--cx-size-14px);}
208
221
  .cx-cal-phone .cx-cal-day{display:flex;flex-direction:column;align-items:center;padding:var(--cx-size-2px) 0;cursor:pointer;}
209
222
  .cx-cal-phone .cx-cal-month{min-height:0;}
210
- .cx-cal-rpick{display:flex;align-items:center;gap:var(--cx-size-8px);height:var(--cx-size-44px);padding:0 var(--cx-size-8px);border-bottom:var(--cx-size-1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));}
223
+ .cx-cal-rpick{display:flex;align-items:center;gap:var(--cx-size-8px);height:var(--cx-size-44px);padding:0 var(--cx-size-8px);border-bottom:var(--cx-size-1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));}
211
224
  .cx-cal-rpick-select{flex:1 1 auto;}
212
225
  .cx-cal-rpick + .cx-cal-time{height:calc(100% - var(--cx-size-44px));}
213
226
  .cx-cal-phone .cx-cal-weeks,.cx-cal-phone .cx-cal-week{flex:none;}
@@ -217,7 +230,7 @@ top:calc(var(--t) * var(--cx-cal-ppm) + var(--cx-size-1px));height:calc(var(--h)
217
230
  [data-cx-calendar-editable] .cx-cal-ev{touch-action:pan-x pan-y;}
218
231
  .cx-cal-ev.cx-cal-dragging{opacity:.45;}
219
232
  .cx-cal-drag,.cx-cal-ev.cx-cal-dragging,.cx-cal-ghost{cursor:grabbing;}
220
- .cx-cal-ghost{position:absolute;z-index:8;pointer-events:none;padding:var(--cx-size-2px) var(--cx-size-6px);border:var(--cx-size-2px) dashed var(--hfx-color-accent,light-dark(#11776f,#37c9b8));border-radius:var(--hfx-radius-sm,4px);background:color-mix(in srgb,var(--hfx-color-accent,light-dark(#11776f,#37c9b8)) 12%,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));color:var(--hfx-color-text,light-dark(#16181c,#f2f3f5));font-size:var(--cx-size-12px);font-weight:600;line-height:var(--cx-size-16px);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;}
233
+ .cx-cal-ghost{position:absolute;z-index:8;pointer-events:none;padding:var(--cx-size-2px) var(--cx-size-6px);border:var(--cx-size-2px) dashed var(--hfx-color-accent,light-dark(#11776f,#37c9b8));border-radius:var(--hfx-radius-sm,4px);background:color-mix(in srgb,var(--hfx-color-accent,light-dark(#11776f,#37c9b8)) 12%,var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c))));color:var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)));font-size:var(--cx-size-12px);font-weight:600;line-height:var(--cx-size-16px);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;}
221
234
  .cx-cal-ghost.cx-cal-conflict{border-color:var(--hfx-color-status-bad-fg,light-dark(#b8292a,#f47171));background:var(--hfx-color-status-bad-bg,light-dark(#f9e4e4,#3c272a));color:var(--hfx-color-status-bad-fg,light-dark(#b8292a,#f47171));}
222
235
  .cx-cal-slots > .cx-cal-ghost-block{inset-inline-start:calc(var(--cx-cal-gutter) + (100% - var(--cx-cal-gutter)) * var(--d) / var(--cx-cal-n) + var(--cx-size-2px));width:calc((100% - var(--cx-cal-gutter)) / var(--cx-cal-n) - var(--cx-size-4px));top:calc(var(--t) * var(--cx-cal-ppm));height:calc(var(--h) * var(--cx-cal-ppm));white-space:normal;}
223
236
  .cx-cal-week > .cx-cal-day > .cx-cal-ghost-bar{top:var(--cx-size-24px);height:var(--cx-size-22px);inset-inline-start:calc(100% * var(--c) / var(--cx-cal-cols) + var(--cx-size-2px));width:calc(100% * var(--s) / var(--cx-cal-cols) - var(--cx-size-4px));}
@@ -245,7 +258,7 @@ top:calc(var(--t) * var(--cx-cal-ppm) + var(--cx-size-1px));height:calc(var(--h)
245
258
  .cx-cal-dow,.cx-cal-ahead{position:static;}
246
259
  }
247
260
  .cx-cal-rtl .cx-cal-prev svg,.cx-cal-rtl .cx-cal-next svg{transform:scaleX(-1);}
248
- :is(.cx-cal-create,.cx-cal-ask){position:absolute;z-index:22;display:flex;flex-direction:column;gap:var(--cx-size-6px);margin:0;padding:var(--cx-size-12px);background:var(--hfx-color-surface-raised,light-dark(#ffffff,#1e2126));color:var(--hfx-color-text,light-dark(#16181c,#f2f3f5));border:var(--cx-size-1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));border-radius:var(--hfx-radius-overlay,var(--hfx-radius-lg,10px));box-shadow:var(--hfx-elevation-2,0 1px 2px rgba(22,24,28,.05),0 6px 18px -10px rgba(22,24,28,.18));font-size:var(--cx-size-13px);line-height:1.4;}
261
+ :is(.cx-cal-create,.cx-cal-ask){position:absolute;z-index:22;display:flex;flex-direction:column;gap:var(--cx-size-6px);margin:0;padding:var(--cx-size-12px);background:var(--hfx-color-surface-raised,light-dark(#ffffff,#1e2126));color:var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)));border:var(--cx-size-1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));border-radius:var(--hfx-radius-overlay,var(--hfx-radius-lg,10px));box-shadow:var(--hfx-elevation-2,0 1px 2px rgba(22,24,28,.05),0 6px 18px -10px rgba(22,24,28,.18));font-size:var(--cx-size-13px);line-height:1.4;}
249
262
  .cx-cal-create-h{margin:0;font-size:var(--cx-size-14px);font-weight:600;}
250
263
  .cx-cal-create-l{margin-top:var(--cx-size-4px);font-weight:600;color:var(--hfx-color-text-secondary,light-dark(#4d525b,#b0b4bc));font-size:var(--cx-size-12px);}
251
264
  .cx-cal-create .cx-cal-occurrence-remove{margin-inline-end:auto;color:var(--hfx-color-status-bad-fg,light-dark(#b8292a,#f47171));}
@@ -255,7 +268,7 @@ top:calc(var(--t) * var(--cx-cal-ppm) + var(--cx-size-1px));height:calc(var(--h)
255
268
  .cx-cal-ask-actions .cx-btn{justify-content:flex-start;}
256
269
  .cx-cal-legend{display:flex;flex-wrap:wrap;align-items:center;gap:var(--cx-size-6px);padding:0 var(--cx-size-12px) var(--cx-size-8px);}
257
270
  .cx-cal-src-swatch{width:var(--cx-size-10px);height:var(--cx-size-10px);border-radius:50%;background:var(--cx-ev,var(--hfx-color-accent,light-dark(#11776f,#37c9b8)));border:var(--cx-size-2px) solid var(--cx-ev,var(--hfx-color-accent,light-dark(#11776f,#37c9b8)));}
258
- .cx-cal-src[aria-pressed="true"]{border-color:var(--hfx-color-border,light-dark(#e2e4e7,#272a30));background:var(--hfx-color-surface,light-dark(#ffffff,#16181c));color:var(--hfx-color-text,light-dark(#16181c,#f2f3f5));}
271
+ .cx-cal-src[aria-pressed="true"]{border-color:var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));background:var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));color:var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)));}
259
272
  .cx-cal-src[aria-pressed="false"]{color:var(--hfx-color-text-secondary,light-dark(#4d525b,#b0b4bc));}
260
273
  .cx-cal-src[aria-pressed="false"] span{text-decoration:line-through;}
261
274
  .cx-cal-src[aria-pressed="false"] .cx-cal-src-swatch{background:transparent;}
@@ -1,4 +1,4 @@
1
- (function(global){"use strict";const installed=new WeakSet();const part={version:"4762fd2f9e9d1617",requires:["ui-menu"],install(context){if(installed.has(context.DataGrid.prototype))return;const{toneVariable,bindContextMenu,DataGrid,h,setText,fill,plural,gridButton,gridIcon,gridFreeze,cellText,cellValue,isCellObject,gridQuery,gridQueryRows,gridResultShape,gridPresenterTone,validateGridRows,repairGridCell,validateGridPage,validateGridCursorPage,validStructuralCount,checkDocument,numberFormat,HostCellContext,disposeHostSlot,loadPart,PROTOCOL}=context;const CALENDAR_LABELS={calendarToday:"Today",calendarPrevious:"Previous period",calendarNext:"Next period",calendarViews:"Calendar view",calendarMonth:"Month",calendarWeek:"Week",calendarDay:"Day",calendarDays:"{count} days",calendarAgenda:"Agenda",calendarYear:"Year",calendarTimeline:"Timeline",calendarGoTo:"Go to date",calendarAllDay:"All day",calendarMore:"+{count} more",calendarMoreLabel:"Show {count} more events on {date}",calendarDayEvents:"Events on {date}",calendarNoEvents:"No events in this period",calendarEvents:"[one]{count} event[other]{count} events",calendarShowing:"{view}, {range}",calendarRepeats:"Repeats",calendarTruncated:"Showing the first {count} events. Narrow the period or the filters to see the rest.",calendarLoading:"Loading events…",calendarLoadError:"Could not load events: {error}",calendarNow:"Now",calendarZoom:"Zoom",calendarZoomHour:"Hours",calendarZoomDay:"Days",calendarZoomWeek:"Weeks",calendarZoomMonth:"Months",calendarZoomQuarter:"Quarters",calendarResources:"Resources",calendarCapacity:"Concurrent events",calendarCapacityAt:"{count} at once",calendarBusy:"{hours} h busy",calendarOverlaps:"[one]{count} overlap[other]{count} overlaps",calendarUnavailable:"Unavailable",calendarOutsideHours:"Outside working hours",calendarConflict:"Overlaps {title}",calendarNotAllowed:"{resource} cannot take this event",calendarMoved:"{title} moved to {time}",calendarResized:"{title} now ends {time}",calendarSeriesMoved:"Every occurrence of {title} moved",calendarSeriesTime:"Only the time of a whole series can be moved here.",calendarMoveHelp:"Arrow keys move, Shift with arrow keys changes the end, Alt with Up or Down changes the resource, Enter saves, Escape cancels.",calendarEdit:"Move or resize {title}",calendarSaveFailed:"{title} was not saved: {error}",calendarExport:"iCalendar (.ics)",calendarTimeRange:"{start} – {end}",calendarSelected:"Selected {range}",calendarLane:"{resource}, {events}",calendarHighlighted:"[one]{count} event highlighted[other]{count} events highlighted",calendarMini:"Mini month",calendarWeekList:"Week list",calendarDayList:"Day list",calendarMonths:"Months",calendarWeekNumber:"Week {number}",calendarWeekShort:"W{number}",calendarNewEvent:"New event",calendarEventTitle:"Title",calendarCreate:"Add",calendarCancel:"Cancel",calendarCreated:"{title} added on {time}",calendarReceived:"{title} scheduled on {time}",calendarOccurrenceTitle:"Change a repeating event",calendarOccurrenceReadOnly:"This part of the series cannot be saved because some values are read-only.",calendarEditOccurrence:"Edit this occurrence",calendarRemoveOccurrence:"Remove this occurrence",calendarOccurrenceScope:"Only {date} changes; other dates of {title} stay as they are.",calendarSharedResources:"{count} {resources}",calendarResourceWindow:"{resources} {start}–{end} of {total}",calendarThisEvent:"This event",calendarThisAndFollowing:"This and following events",calendarAllEvents:"All events",calendarSources:"Calendars",calendarImportFailed:"Could not read {source}: {error}",calendarActions:"Actions for {title}",calendarOpen:"Open",calendarMove:"Move",calendarNewHere:"New event here",calendarOutsideRange:"Outside the dates this calendar shows",calendarClose:"Close",calendarDetailsOf:"Details of {title}"};function calLabelsFor(labels){const out={...CALENDAR_LABELS};for(const name of Object.keys(CALENDAR_LABELS))if(Object.hasOwn(labels,name))out[name]=labels[name];return Object.freeze(out)}
1
+ (function(global){"use strict";const installed=new WeakSet();const part={version:"e11aad6b723ddf23",requires:["ui-menu"],install(context){if(installed.has(context.DataGrid.prototype))return;const{toneVariable,bindContextMenu,DataGrid,h,setText,fill,plural,gridButton,gridIcon,gridFreeze,cellText,cellValue,isCellObject,gridQuery,gridQueryRows,gridResultShape,gridPresenterTone,validateGridRows,repairGridCell,validateGridPage,validateGridCursorPage,validStructuralCount,checkDocument,numberFormat,HostCellContext,disposeHostSlot,loadPart,PROTOCOL}=context;const CALENDAR_LABELS={calendarToday:"Today",calendarPrevious:"Previous period",calendarNext:"Next period",calendarViews:"Calendar view",calendarMonth:"Month",calendarWeek:"Week",calendarDay:"Day",calendarDays:"{count} days",calendarAgenda:"Agenda",calendarYear:"Year",calendarTimeline:"Timeline",calendarGoTo:"Go to date",calendarAllDay:"All day",calendarMore:"+{count} more",calendarMoreLabel:"Show {count} more events on {date}",calendarDayEvents:"Events on {date}",calendarNoEvents:"No events in this period",calendarEvents:"[one]{count} event[other]{count} events",calendarShowing:"{view}, {range}",calendarRepeats:"Repeats",calendarTruncated:"Showing the first {count} events. Narrow the period or the filters to see the rest.",calendarLoading:"Loading events…",calendarLoadError:"Could not load events: {error}",calendarNow:"Now",calendarZoom:"Zoom",calendarZoomHour:"Hours",calendarZoomDay:"Days",calendarZoomWeek:"Weeks",calendarZoomMonth:"Months",calendarZoomQuarter:"Quarters",calendarResources:"Resources",calendarCapacity:"Concurrent events",calendarCapacityAt:"{count} at once",calendarBusy:"{hours} h busy",calendarOverlaps:"[one]{count} overlap[other]{count} overlaps",calendarUnavailable:"Unavailable",calendarOutsideHours:"Outside working hours",calendarConflict:"Overlaps {title}",calendarNotAllowed:"{resource} cannot take this event",calendarMoved:"{title} moved to {time}",calendarResized:"{title} now ends {time}",calendarSeriesMoved:"Every occurrence of {title} moved",calendarSeriesTime:"Only the time of a whole series can be moved here.",calendarMoveHelp:"Arrow keys move, Shift with arrow keys changes the end, Alt with Up or Down changes the resource, Enter saves, Escape cancels.",calendarEdit:"Move or resize {title}",calendarSaveFailed:"{title} was not saved: {error}",calendarExport:"iCalendar (.ics)",calendarTimeRange:"{start} – {end}",calendarSelected:"Selected {range}",calendarLane:"{resource}, {events}",calendarHighlighted:"[one]{count} event highlighted[other]{count} events highlighted",calendarMini:"Mini month",calendarWeekList:"Week list",calendarDayList:"Day list",calendarMonths:"Months",calendarWeekNumber:"Week {number}",calendarWeekShort:"W{number}",calendarNewEvent:"New event",calendarEventTitle:"Title",calendarCreate:"Add",calendarCancel:"Cancel",calendarCreated:"{title} added on {time}",calendarReceived:"{title} scheduled on {time}",calendarOccurrenceTitle:"Change a repeating event",calendarOccurrenceReadOnly:"This part of the series cannot be saved because some values are read-only.",calendarEditOccurrence:"Edit this occurrence",calendarRemoveOccurrence:"Remove this occurrence",calendarOccurrenceScope:"Only {date} changes; other dates of {title} stay as they are.",calendarSharedResources:"{count} {resources}",calendarResourceWindow:"{resources} {start}–{end} of {total}",calendarThisEvent:"This event",calendarThisAndFollowing:"This and following events",calendarAllEvents:"All events",calendarSources:"Calendars",calendarImportFailed:"Could not read {source}: {error}",calendarActions:"Actions for {title}",calendarOpen:"Open",calendarMove:"Move",calendarNewHere:"New event here",calendarOutsideRange:"Outside the dates this calendar shows",calendarClose:"Close",calendarDetailsOf:"Details of {title}"};function calLabelsFor(labels){const out={...CALENDAR_LABELS};for(const name of Object.keys(CALENDAR_LABELS))if(Object.hasOwn(labels,name))out[name]=labels[name];return Object.freeze(out)}
2
2
  function calCount(grid,template,count,values){return fill(plural(template,count,grid.lang),{...values,count:numberFormat(grid.lang).format(count)})}
3
3
  const CAL_DAY=86400000,CAL_MINUTE=60000,CAL_HOUR=3600000;const calZones=new Map();function calDayNumber(y,m,d){return Math.floor(Date.UTC(y,m-1,d)/ CAL_DAY); }
4
4
  function calDayParts(day){const date=new Date(day*CAL_DAY);return{y:date.getUTCFullYear(),m:date.getUTCMonth()+ 1,d:date.getUTCDate(),dow:date.getUTCDay()}}
@@ -30,7 +30,7 @@ const CAL_SUNDAY_REGIONS=/^(?:US|CA|MX|BR|JP|KR|TW|HK|IL|PH|IN|ZA|SA|AR|CO|PE|VE
30
30
  function calFirstDay(lang){try{const locale=new Intl.Locale(lang||"en-US"),info=typeof locale.getWeekInfo==="function"?locale.getWeekInfo():locale.weekInfo;if(info&&Number.isInteger(info.firstDay))return info.firstDay%7;const region=locale.maximize().region;return CAL_SUNDAY_REGIONS.test(region||"")?0:region?1:0}catch(_){return 1}}
31
31
  function calFormats(lang,zone){const cache=new Map(),timeZone=zone.name==="utc"?"UTC":zone.name==="local"?undefined:zone.name;const make=(options,dayFormat)=>{const key=JSON.stringify(options)+(dayFormat?"d":"t");let format=cache.get(key);if(!format){const settings={...options,timeZone:dayFormat?"UTC":timeZone};try{format=new Intl.DateTimeFormat(lang||undefined,settings)}catch(_){format=new Intl.DateTimeFormat(undefined,settings)}
32
32
  cache.set(key,format)}
33
- return format};const day=(options,value)=>make(options,true).format(new Date(value*CAL_DAY));const range=(options,from,to)=>{if(from===to)return day(options,from);const format=make(options,true);try{return format.formatRange(new Date(from*CAL_DAY),new Date(to*CAL_DAY))}catch(_){return format.format(new Date(from*CAL_DAY))+ " – "+format.format(new Date(to*CAL_DAY))}};return{lang,day,range,monthTitle:value=>day({month:"long",year:"numeric"},value),monthName:value=>day({month:"long"},value),monthShort:value=>day({month:"short"},value),weekday:(value,width)=>day({weekday:width||"short"},value),dayNumber:value=>day({day:"numeric"},value),dayHeader:value=>day({weekday:"short",day:"numeric"},value),longDay:value=>day({weekday:"long",day:"numeric",month:"long",year:"numeric"},value),shortDay:value=>day({day:"numeric",month:"short"},value),date:value=>day({day:"numeric",month:"short",year:"numeric"},value),year:value=>day({year:"numeric"},value),dayRange:(from,to)=>range({day:"numeric",month:"short",year:"numeric"},from,to),monthRange:(from,to)=>range({month:"short",year:"numeric"},from,to),time:value=>make({hour:"numeric",minute:"2-digit"}).format(new Date(value)),hour:minutes=>make({hour:"numeric"},true).format(new Date(minutes*CAL_MINUTE)),clock:minutes=>make({hour:"numeric",minute:"2-digit"},true).format(new Date(minutes*CAL_MINUTE)),number:value=>numberFormat(lang).format(value)}}
33
+ return format};const day=(options,value)=>make(options,true).format(new Date(value*CAL_DAY));const range=(options,from,to)=>{if(from===to)return day(options,from);const format=make(options,true);try{return format.formatRange(new Date(from*CAL_DAY),new Date(to*CAL_DAY))}catch(_){return format.format(new Date(from*CAL_DAY))+ " – "+format.format(new Date(to*CAL_DAY))}};return{lang,day,range,monthTitle:value=>day({month:"long",year:"numeric"},value),monthName:value=>day({month:"long"},value),monthShort:value=>day({month:"short"},value),weekday:(value,width)=>day({weekday:width||"short"},value),dayNumber:value=>day({day:"numeric"},value),dayHeader:value=>day({weekday:"short",day:"numeric"},value),longDay:value=>day({weekday:"long",day:"numeric",month:"long",year:"numeric"},value),shortDay:value=>day({day:"numeric",month:"short"},value),date:value=>day({day:"numeric",month:"short",year:"numeric"},value),year:value=>day({year:"numeric"},value),dayRange:(from,to)=>range({day:"numeric",month:"short",year:"numeric"},from,to),monthRange:(from,to)=>range({month:"short",year:"numeric"},from,to),time:value=>make({hour:"numeric",minute:"2-digit"}).format(new Date(value)),timeRange:(from,to)=>make({hour:"numeric",minute:"2-digit"}).formatRange(new Date(from),new Date(to)),hour:minutes=>make({hour:"numeric"},true).format(new Date(minutes*CAL_MINUTE)),clock:minutes=>make({hour:"numeric",minute:"2-digit"},true).format(new Date(minutes*CAL_MINUTE)),number:value=>numberFormat(lang).format(value)}}
34
34
  const CAL_VIEWS=["month","week","day","days","agenda","year","timeline","mini","weekList","dayList","months"],CAL_ZOOMS=["hour","day","week","month","quarter"];const CAL_KEYS=new Set(["start","end","title","subtitle","allDay","resource","resourceIds","status","recurrence","exceptions","series","recurrenceId","display","seriesEnd","view","views","date","days","firstDay","hiddenDays","slotMinutes","minTime","maxTime","scrollTime","workingHours","nowIndicator","eventLimit","eventStyle","timeZone","editable","resources","zoom","zooms","capacity","ranges","availability","limit","phone","toolbar","details","description","tone","source","sources","create","drop","occurrence","weekNumbers","navLinks","validRange","fixedWeeks","outsideDays","span","menu","hover","yearEvents","agendaSpan","months","print"]);const CAL_TONE=/^[a-z][a-z0-9-]{0,31}$/;
35
35
  function calInvalid(message){throw new Error("CanopyX: "+message)}
36
36
  function calDays(list,name){if(!Array.isArray(list)||list.length>7||new Set(list).size!==list.length||list.some(day=>!Number.isInteger(day)||day<0||day>6))calInvalid(name+" lists weekdays 0 to 6.");return new Set(list)}
@@ -124,13 +124,13 @@ zoom.addEventListener("change",()=>this.setCalendarZoom(zoom.value));if(this.cal
124
124
  const print=this.cal.print?button(this.labels.gridPrint||"Print","print",()=>global.print(),"print"):null;bar.append(nav,this.calTitle,h("span","cx-spacer"),jumpBox,zoom,views,select,...(print?[print]:[]));return bar},calViewName(view){const labels=this.calLabels;return view==="days"?fill(labels.calendarDays,{count:this.calDaysCount()}):labels["calendar"+view[0].toUpperCase()+ view.slice(1)]},calDaysCount(){return this.calPhone&&this.cal.days>3?3:this.cal.days},calSyncBar(announce){const view=this.calView,range=this.calRange;for(const[name,item]of this.calViewButtons){item.setAttribute("aria-pressed",String(name===view));item.classList.toggle("active",name===view)}
125
125
  this.calViewSelect.value=view;this.calZoomSelect.hidden=view!=="timeline"||this.cal.zooms.length<2;this.calZoomSelect.value=this.calZoom;const title=this.calRangeTitle();setText(this.calTitle,title);this.calJump.value=calDayText(this.calDate);if(this.calJumpButton){setText(this.calJumpButton,this.calFmt.date(this.calDate));this.calJumpButton.setAttribute("aria-label",this.calLabels.calendarGoTo+", "+this.calFmt.date(this.calDate));this.calJumpButton.title=this.calLabels.calendarGoTo}
126
126
  const today=this.calZone.day(Date.now());this.calTodayButton.setAttribute("aria-disabled",String(today>=range.firstDay&&today<=range.lastDay||!this.calInValid({firstDay:today,lastDay:today})));if(this.cal.validRange)for(const[button,direction]of[[this.calPrev,-1],[this.calNextButton,1]])button.setAttribute("aria-disabled",String(!this.calInValid(this.calRangeOf(view,this.calStepDate(direction)))));if(announce)this.calAnnounce(fill(this.calLabels.calendarShowing,{view:this.calViewName(view),range:title}))},calRangeTitle(){const fmt=this.calFmt,range=this.calRange;switch(this.calView){case "month":case "mini":return fmt.monthTitle(this.calDate);case "agenda":{const span=this.cal.agendaSpan;return span==="month"?fmt.monthTitle(this.calDate):span==="year"?fmt.year(this.calDate):span==="day"?fmt.longDay(range.firstDay):fmt.dayRange(range.firstDay,range.lastDay)}
127
- case "months":return fmt.monthRange(range.firstDay,range.lastDay);case "year":return fmt.year(this.calDate);case "day":case "dayList":return this.calPhone?fmt.shortDay(range.firstDay)+ ", "+fmt.year(range.firstDay):fmt.longDay(range.firstDay);case "timeline":return this.calTimelineTitle?this.calTimelineTitle():fmt.dayRange(range.firstDay,range.lastDay);default:return fmt.dayRange(range.firstDay,range.lastDay)}},calAnnounce(text){clearTimeout(this.calAnnounceTimer);this.calAnnounceTimer=setTimeout(()=>{if(!this.destroyed)setText(this.calLive,text)},150)}});const CAL_ROW_COPIES=new WeakMap();Object.assign(DataGrid.prototype,{calTimeText(event){if(event.allDay)return this.calLabels.calendarAllDay;const fmt=this.calFmt,labels=this.calLabels;if(event.marker)return fmt.time(event.start);if(event.ed>event.sd)return fill(labels.calendarTimeRange,{start:fmt.shortDay(event.sd)+ " "+fmt.time(event.start),end:fmt.shortDay(event.ed)+ " "+fmt.time(event.end)});return fill(labels.calendarTimeRange,{start:fmt.time(event.start),end:fmt.time(event.end)})},calStatusText(event){const column=this.cal.status;return column?cellText(event.row.cells[column.id],column,this.fmt):""},calEventName(event){const parts=[event.title,event.allDay&&event.ed>event.sd?this.calFmt.dayRange(event.sd,event.ed):this.calTimeText(event)];const status=this.calStatusText(event);if(status)parts.push(status);if(event.subtitle)parts.push(event.subtitle);if(this.calResourceName)parts.push(...this.calEventResources(event).map(id=>this.calResourceName(id)));if(this.calEventResources(event).length>1)parts.push(calCount(this,this.calLabels.calendarSharedResources,this.calEventResources(event).length,{resources:this.calLabels.calendarResources.toLocaleLowerCase(this.lang)}));if(event.recurring)parts.push(this.calLabels.calendarRepeats);return parts.filter(Boolean).join(", ")},calDisposeEventRenderers(container){const slots=this.calHostSlots;if(!container)this.calHostSlots=null;for(const slot of slots||[])if(!container||container.contains(slot.content)){slots.delete(slot);disposeHostSlot(slot)}},calEventElement(event,kind){const element=h("button","cx-cal-ev cx-cal-ev-"+kind +(event.marker?" cx-cal-marker":"")+(event.allDay?" cx-cal-allday":""));element.type="button";element.tabIndex=-1;element.dataset.cxEvent=event.id;element.dataset.cxRecord=event.key;element._calEvent=event;if(event.tone){element.dataset.cxTone=event.tone;element.style.setProperty("--cx-ev",event.tone==="neutral"?"var(--hfx-color-status-neutral-fg,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)))":toneVariable(event.tone,false,"var(--hfx-color-accent,light-dark(#11776f,#37c9b8))"));element.style.setProperty("--cx-ev-bg",toneVariable(event.tone,true,"color-mix(in srgb,var(--cx-ev) 14%,var(--hfx-color-surface,light-dark(#ffffff,#16181c)))"))}
128
- if(event.color){element.style.setProperty("--cx-ev",event.color);element.style.setProperty("--cx-ev-bg","color-mix(in srgb,var(--cx-ev) 14%,var(--hfx-color-surface,light-dark(#ffffff,#16181c)))")}
127
+ case "months":return fmt.monthRange(range.firstDay,range.lastDay);case "year":return fmt.year(this.calDate);case "day":case "dayList":return this.calPhone?fmt.shortDay(range.firstDay)+ ", "+fmt.year(range.firstDay):fmt.longDay(range.firstDay);case "timeline":return this.calTimelineTitle?this.calTimelineTitle():fmt.dayRange(range.firstDay,range.lastDay);default:return fmt.dayRange(range.firstDay,range.lastDay)}},calAnnounce(text){clearTimeout(this.calAnnounceTimer);this.calAnnounceTimer=setTimeout(()=>{if(!this.destroyed)setText(this.calLive,text)},150)}});const CAL_ROW_COPIES=new WeakMap();Object.assign(DataGrid.prototype,{calTimeText(event,day){if(event.allDay)return this.calLabels.calendarAllDay;const fmt=this.calFmt,labels=this.calLabels;if(event.marker)return fmt.time(event.start);if(day!==undefined&&event.ed>event.sd)return day===event.sd?fmt.time(event.start):day===event.ed?fmt.time(event.end):labels.calendarAllDay;if(event.ed>event.sd)return fill(labels.calendarTimeRange,{start:fmt.shortDay(event.sd)+ " "+fmt.time(event.start),end:fmt.shortDay(event.ed)+ " "+fmt.time(event.end)});if(day!==undefined)return fmt.timeRange(event.start,event.end);return fill(labels.calendarTimeRange,{start:fmt.time(event.start),end:fmt.time(event.end)})},calStatusText(event){const column=this.cal.status;return column?cellText(event.row.cells[column.id],column,this.fmt):""},calEventName(event){const parts=[event.title,event.allDay&&event.ed>event.sd?this.calFmt.dayRange(event.sd,event.ed):this.calTimeText(event)];const status=this.calStatusText(event);if(status)parts.push(status);if(event.subtitle)parts.push(event.subtitle);if(this.calResourceName)parts.push(...this.calEventResources(event).map(id=>this.calResourceName(id)));if(this.calEventResources(event).length>1)parts.push(calCount(this,this.calLabels.calendarSharedResources,this.calEventResources(event).length,{resources:this.calLabels.calendarResources.toLocaleLowerCase(this.lang)}));if(event.recurring)parts.push(this.calLabels.calendarRepeats);return parts.filter(Boolean).join(", ")},calDisposeEventRenderers(container){const slots=this.calHostSlots;if(!container)this.calHostSlots=null;for(const slot of slots||[])if(!container||container.contains(slot.content)){slots.delete(slot);disposeHostSlot(slot)}},calEventElement(event,kind,day){const element=h("button","cx-cal-ev cx-cal-ev-"+kind +(event.marker?" cx-cal-marker":"")+(event.allDay?" cx-cal-allday":""));element.type="button";element.tabIndex=-1;element.dataset.cxEvent=event.id;element.dataset.cxRecord=event.key;element._calEvent=event;if(event.tone){element.dataset.cxTone=event.tone;element.style.setProperty("--cx-ev",event.tone==="neutral"?"var(--hfx-color-status-neutral-fg,var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d))))":toneVariable(event.tone,false,"var(--hfx-color-accent,light-dark(#11776f,#37c9b8))"));element.style.setProperty("--cx-ev-bg",toneVariable(event.tone,true,"color-mix(in srgb,var(--cx-ev) 14%,var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c))))"))}
128
+ if(event.color){element.style.setProperty("--cx-ev",event.color);element.style.setProperty("--cx-ev-bg","color-mix(in srgb,var(--cx-ev) 14%,var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c))))")}
129
129
  element.setAttribute("aria-label",this.calEventName(event));const assignments=this.calEventResources(event);if(assignments.length>1){element.title=this.calEventName(event);const mark=(kind,on)=>{this[kind]=on?event.id:this[kind]===event.id?null:this[kind];for(const card of this.calRoot.querySelectorAll(".cx-cal-ev"))card.classList.toggle("cx-cal-shared-active",card.dataset.cxEvent===this.calSharedHover||card.dataset.cxEvent===this.calSharedFocus)};element.addEventListener("pointerenter",()=>mark("calSharedHover",true));element.addEventListener("pointerleave",()=>mark("calSharedHover",false));element.addEventListener("focus",()=>mark("calSharedFocus",true));element.addEventListener("blur",()=>mark("calSharedFocus",false))}
130
130
  if(!event.base?.external&&this.linkHighlight?.has(event.key))element.dataset.cxLinked="true";const template=this.opts.calendar?.render;if(typeof template==="function"){let copy=CAL_ROW_COPIES.get(event.row);if(copy?.version!==this.calVersion){copy={version:this.calVersion,row:gridFreeze(JSON.parse(JSON.stringify(event.row)))};CAL_ROW_COPIES.set(event.row,copy)}
131
131
  const row=copy.row;try{if(template({event:this.calPublicEvent(event),row,element,kind,labels:this.calLabels})===true)return element}
132
132
  catch(error){this.emit("error",{error});element.textContent=""}}
133
- const time=h("span","cx-cal-ev-time"),title=h("span","cx-cal-ev-title");if(!event.allDay&&kind!=="bar"&&kind!=="lane"){setText(time,kind==="item"?this.calTimeText(event):this.calFmt.time(event.start));element.appendChild(time)}
133
+ const time=h("span","cx-cal-ev-time"),title=h("span","cx-cal-ev-title");if(!event.allDay&&kind!=="bar"&&kind!=="lane"){setText(time,kind==="item"?this.calTimeText(event,day):this.calFmt.time(event.start));element.appendChild(time)}
134
134
  setText(title,event.title);element.appendChild(title);if(assignments.length>1){const shared=h("span","cx-cal-shared");setText(shared,calCount(this,this.calLabels.calendarSharedResources,assignments.length,{resources:this.calLabels.calendarResources.toLocaleLowerCase(this.lang)}));shared.setAttribute("aria-hidden","true");element.appendChild(shared)}
135
135
  if(kind==="block"||kind==="item"||kind==="lane"){if(event.subtitle){const subtitle=h("span","cx-cal-ev-sub");setText(subtitle,event.subtitle);element.appendChild(subtitle)}
136
136
  const column=this.cal.status;if(column&&(kind!=="lane")&&cellValue(event.row.cells[column.id])!=null){const statusClass="cx-cal-ev-status" +(event.base?.toneFromStatus?" cx-cal-status-tone":"");let status=h("span",statusClass);let drawn=false;if(column.render){const slot={content:status},context=new HostCellContext(slot,column.id,undefined,undefined,this.columns.indexOf(column));(this.calHostSlots||=new Set()).add(slot);try{drawn=column.render(event.row,status,context)===true}
@@ -158,24 +158,24 @@ budget.rows+rows>budget.limit?"JSON feeds exceed the combined event limit of "+b
158
158
  function calJsonRows(items,source){if(!Array.isArray(items)||items.length>5000)throw new Error("A JSON feed is an array of at most 5,000 events.");const ids=new Set(),identity=id=>"json:"+JSON.stringify([source,id]);return items.map((item,index)=>{if(!item||typeof item!=="object"||Array.isArray(item)||typeof item.title!=="string"||item.title.length>1000||
159
159
  typeof item.start!=="string"||!Number.isFinite(calInstant(item.start.length===10?item.start+"T00:00:00Z":item.start))||
160
160
  item.end!=null&&(typeof item.end!=="string"||!Number.isFinite(calInstant(item.end.length===10?item.end+"T00:00:00Z":item.end))))throw new Error("A JSON event needs a title and ISO start/end values.");const id=item.id??String(index+1);if(typeof id!=="string"||!CAL_ID.test(id)||ids.has(id))throw new Error("JSON event ids must be unique identifiers.");ids.add(id);for(const name of["description","resource","recurrence","exceptions","series","recurrenceId"])if(item[name]!=null&&(typeof item[name]!=="string"||item[name].length>10000))throw new Error("Invalid JSON event "+name+".");if(item.allDay!==undefined&&typeof item.allDay!=="boolean")throw new Error("JSON allDay is a boolean.");const allDay=item.allDay??item.start.length===10,normalize=value=>value?.length===10?value+"T00:00:00Z":value;return{id:identity(id),external:source,cells:{},fields:{title:item.title,start:normalize(item.start),end:normalize(item.end),allDay,description:item.description||"",resource:item.resource||null,resourceIds:calResourceIds(item.resourceIds),recurrence:item.recurrence,exceptions:item.exceptions,series:item.series?identity(item.series):null,recurrenceId:normalize(item.recurrenceId)}}})}
161
- const CAL_LANE=22,CAL_NUMBER=26;const calDayOrder=(a,b)=>(b.allDay-a.allDay)||a.start-b.start||(a.id<b.id?-1:1);Object.assign(DataGrid.prototype,{calWeekdays(){const days=[];for(let i=0;i<7;i++){const dow=(this.cal.firstDay+i)%7;if(!this.cal.hidden.has(dow))days.push(dow)}
161
+ const CAL_LANE=22,CAL_NUMBER=26;function calMonthLanes(items,columns,limit){const bar=item=>calInAllDayRow(item.event)||item.event.ed>item.event.sd;const ordered=items.slice().sort((a,b)=>Number(bar(b))- Number(bar(a))||(bar(a)?(b.to-b.from)-(a.to-a.from):0));const reserved=new Array(columns).fill(false);let visible,counts,busy,changed;do{visible=[];counts=new Array(columns).fill(0);busy=Array.from({length:columns},()=>[]);changed=false;const shown=new Set();for(const item of ordered){const someColumn=predicate=>{for(let col=item.from;col<=item.to;col++)if(predicate(col))return true;return false};let lane=0;while(someColumn(col=>busy[col][lane]))lane++;if(someColumn(col=>lane>=limit-Number(reserved[col])))continue;visible.push({...item,lane});shown.add(item.event);for(let col=item.from;col<=item.to;col++){busy[col][lane]=true;counts[col]++}}
162
+ for(const item of items)for(let col=item.from;col<=item.to;col++){if(!reserved[col]&&!shown.has(item.event)){reserved[col]=true;changed=true}}}while(changed);return{visible,counts,more:busy.map(lanes=>lanes.length)}}
163
+ const calDayOrder=(a,b)=>(b.allDay-a.allDay)||a.start-b.start||(a.id<b.id?-1:1);Object.assign(DataGrid.prototype,{calWeekdays(){const days=[];for(let i=0;i<7;i++){const dow=(this.cal.firstDay+i)%7;if(!this.cal.hidden.has(dow))days.push(dow)}
162
164
  return days},calWeekdayRow(className,corner){const row=h("div",className),fmt=this.calFmt;row.setAttribute("role","row");if(corner){const cell=h("div","cx-cal-corner");cell.setAttribute("role","columnheader");setText(cell,corner===true?"":corner);row.appendChild(cell)}
163
165
  for(const dow of this.calWeekdays()){const cell=h("div","cx-cal-dowc"),day=calDayNumber(2023,1,1)+ dow;cell.setAttribute("role","columnheader");cell.setAttribute("aria-label",fmt.weekday(day,"long"));setText(cell,fmt.weekday(day,this.calPhone?"narrow":"short"));row.appendChild(cell)}
164
166
  return row},calDayName(day,count,ranges){const parts=[this.calFmt.longDay(day)];if(day===this.calZone.day(Date.now()))parts.push(this.calLabels.calendarToday);for(const range of ranges||[])parts.push(range.label);parts.push(count?calCount(this,this.calLabels.calendarEvents,count):this.calLabels.calendarNoEvents);return parts.join(", ")},calBackgroundsOn(day,resource,partial){const out=[];for(const range of this.calRanges)if(range.sd<=day&&range.ed>=day&&(resource===undefined?!range.inverse||range.resource==null:range.resource==null||range.resource===resource)&&
165
167
  (partial||!range.inverse||range.start<=this.calZone.start(day)&&range.end>=this.calZone.start(day+1)))out.push(range);for(const event of this.calEvents)if(event.background&&event.sd<=day&&event.ed>=day&&(resource===undefined||!this.calEventResources(event).length||this.calHasResource(event,resource)))
166
168
  out.push({id:event.id,label:event.title,tone:event.tone||"info",kind:"background",sd:event.sd,ed:event.ed,start:event.start,end:event.end,resource:event.resource});return out},calPaintMonth(){const range=this.calRange,body=this.calBody,weekCount=Math.round((range.lastDay-range.firstDay+1)/ 7);
167
169
  const available=body.clientHeight-CAL_NUMBER-4,rowHeight=this.calPhone?44:Math.max(96,Math.floor(available / weekCount));
168
- this.calCells=new Map();const grid=this.calMonthGrid(range.firstDay,range.lastDay,range.month,{rowHeight,dots:this.calPhone,outside:this.cal.outsideDays,labelledBy:this.calTitle.id});body.replaceChildren(grid);this.calGrid=grid;if(this.calPhone){const day=this.calFocus?.day??this.calDate;body.appendChild(this.calDayList(day));this.calMarkListedDay(day)}},calMonthGrid(first,last,monthStart,options){const weekdays=this.calWeekdays(),today=this.calZone.day(Date.now()),month=calDayParts(monthStart).m,monthEnd=calAddMonths(monthStart,1)- 1;const events=this.calEvents.filter(event=>!event.background),rowHeight=options.rowHeight,valid=this.cal.validRange;const grid=h("div","cx-cal-month" +(options.className?" "+options.className:""));grid.setAttribute("role","grid");if(options.labelledBy)grid.setAttribute("aria-labelledby",options.labelledBy);grid.setAttribute("aria-readonly",String(!this.cal.editable&&!this.cal.create));grid.style.setProperty("--cx-cal-cols",String(weekdays.length));grid.appendChild(this.calWeekdayRow("cx-cal-dow"));const weeks=h("div","cx-cal-weeks");weeks.setAttribute("role","rowgroup");grid.appendChild(weeks);const fit=Math.max(1,Math.floor((rowHeight-CAL_NUMBER-4)/ CAL_LANE));
170
+ this.calCells=new Map();const grid=this.calMonthGrid(range.firstDay,range.lastDay,range.month,{rowHeight,dots:this.calPhone,outside:this.cal.outsideDays,labelledBy:this.calTitle.id});body.replaceChildren(grid);this.calGrid=grid;if(this.calPhone){const day=this.calFocus?.day??this.calDate;body.appendChild(this.calDayList(day));this.calMarkListedDay(day)}},calMonthGrid(first,last,monthStart,options){const weekdays=this.calWeekdays(),today=this.calZone.day(Date.now()),month=calDayParts(monthStart).m,monthEnd=calAddMonths(monthStart,1)- 1;const events=this.calEvents.filter(event=>!event.background),rowHeight=options.rowHeight,valid=this.cal.validRange;const grid=h("div","cx-cal-month" +(options.className?" "+options.className:""));grid.setAttribute("role","grid");if(options.labelledBy)grid.setAttribute("aria-labelledby",options.labelledBy);grid.setAttribute("aria-readonly",String(!this.cal.editable&&!this.cal.create));grid.style.setProperty("--cx-cal-cols",String(weekdays.length));grid.appendChild(this.calWeekdayRow("cx-cal-dow"));const weeks=h("div","cx-cal-weeks");weeks.setAttribute("role","rowgroup");grid.appendChild(weeks);const fit=Math.max(1,Math.floor((rowHeight-CAL_NUMBER)/ CAL_LANE));
169
171
  const limit=this.calPrinting?Infinity:options.dots?0:this.cal.eventLimit==="auto"?fit:Math.min(this.cal.eventLimit,Math.max(fit,1));for(let week=first;week<=last;week +=7){const row=h("div","cx-cal-week"),columns=new Map();row.setAttribute("role","row");row.style.minHeight=rowHeight+"px";if(this.cal.weekNumbers){const number=this.calWeekNumber(week+3);row.setAttribute("aria-label",fill(this.calLabels.calendarWeekNumber,{number}));row.dataset.cxWeek=String(number)}
170
172
  weekdays.forEach((dow,index)=>columns.set(week +(dow-this.cal.firstDay+7)%7,index));const shown=[...columns.keys()].sort((a,b)=>a-b);const outside=day=>day<monthStart||day>monthEnd,pad=day=>!options.outside&&outside(day);const order=new Map(shown.map((day,index)=>[day,index])),cells=[];for(const day of shown){if(pad(day)){const empty=h("div","cx-cal-pad");empty.setAttribute("role","gridcell");empty.style.gridColumn=String(order.get(day)+ 1);cells.push(empty);row.appendChild(empty);continue}
171
173
  const invalid=valid&&(day<valid.first||day>valid.last);const cell=h("div","cx-cal-day" +(calDayParts(day).m!==month?" cx-cal-out":"")+(day===today?" cx-cal-today":"")+(invalid?" cx-cal-invalid":""));cell.setAttribute("role","gridcell");cell.tabIndex=-1;cell.dataset.cxDay=String(day);if(invalid)cell.setAttribute("aria-disabled","true");if(day===today)cell.setAttribute("aria-current","date");const number=h("span","cx-cal-num");setText(number,this.calFmt.dayNumber(day));number.setAttribute("aria-hidden","true");cell.appendChild(number);if(this.cal.weekNumbers&&cells.every(item=>item.classList.contains("cx-cal-pad"))){const wk=h("span","cx-cal-wknum");setText(wk,fill(this.calLabels.calendarWeekShort,{number:row.dataset.cxWeek}));wk.setAttribute("aria-hidden","true");cell.appendChild(wk)}
172
174
  cell.style.gridColumn=String(order.get(day)+ 1);cells.push(cell);this.calCells.set(day,cell);row.appendChild(cell)}
173
- const weekEvents=events.filter(event=>event.sd<=week+6&&event.ed>=week);const placed=calLanes(weekEvents,week,week+6,day=>order.has(day)&&!pad(day)?order.get(day):-1);if(this.calPrinting)row.style.minHeight=Math.max(rowHeight,CAL_NUMBER+6 +(Math.max(-1,...placed.map(item=>item.lane))+ 1)*CAL_LANE)+ "px";const totals=new Array(shown.length).fill(0);for(const item of placed)for(let col=item.from;col<=item.to;col++)totals[col]++;const dayLimit=totals.map(total=>total>limit?Math.max(0,limit-1):limit),visible=new Array(shown.length).fill(0);for(const item of placed){let run=null;const flush=()=>{if(!run)return;const event=item.event,bar=calInAllDayRow(event)||event.ed>event.sd,element=this.calEventElement(event,bar?"bar":"chip");element.style.setProperty("--c",String(run.from));element.style.setProperty("--s",String(run.to-run.from+1));element.style.setProperty("--l",String(item.lane));if(event.sd<shown[run.from])element.classList.add("cx-cal-cont-start");if(event.ed>shown[run.to])element.classList.add("cx-cal-cont-end");cells[run.from].appendChild(element);run=null};for(let col=item.from;col<=item.to;col++){if(item.lane<dayLimit[col]){visible[col]++;if(run)run.to=col;else run={from:col,to:col}}
174
- else flush()}
175
- flush()}
175
+ const weekEvents=events.filter(event=>event.sd<=week+6&&event.ed>=week);const placed=calLanes(weekEvents,week,week+6,day=>order.has(day)&&!pad(day)?order.get(day):-1);const totals=new Array(shown.length).fill(0);for(const item of placed)for(let col=item.from;col<=item.to;col++)totals[col]++;const layout=calMonthLanes(placed,shown.length,limit);if(this.calPrinting)row.style.minHeight=Math.max(rowHeight,CAL_NUMBER+6 +(Math.max(-1,...layout.visible.map(item=>item.lane))+ 1)*CAL_LANE)+ "px";for(const item of layout.visible){const event=item.event,bar=calInAllDayRow(event)||event.ed>event.sd,element=this.calEventElement(event,bar?"bar":"chip");element.style.setProperty("--c",String(item.from));element.style.setProperty("--s",String(item.to-item.from+1));element.style.setProperty("--l",String(item.lane));if(event.sd<shown[item.from])element.classList.add("cx-cal-cont-start");if(event.ed>shown[item.to])element.classList.add("cx-cal-cont-end");cells[item.from].appendChild(element)}
176
176
  cells.forEach((cell,col)=>{if(cell.classList.contains("cx-cal-pad"))return;const day=shown[col],backgrounds=this.calBackgroundsOn(day);if(backgrounds.length){cell.classList.add("cx-cal-bgday");cell.style.setProperty("--cx-bg-tone",toneVariable(backgrounds[0].tone,false,"var(--hfx-color-status-info-fg,light-dark(#2b5fc0,#74a2f7))"));if(backgrounds[0].sd===day||col===0){const label=h("span","cx-cal-bglabel");setText(label,backgrounds[0].label);label.setAttribute("aria-hidden","true");cell.appendChild(label)}}
177
- const hidden=totals[col]- visible[col];cell.setAttribute("aria-label",this.calDayName(day,totals[col],backgrounds));if(options.dots&&totals[col]){const dots=h("span","cx-cal-dots");dots.setAttribute("aria-hidden","true");for(const item of placed.filter(entry=>entry.from<=col&&entry.to>=col).slice(0,3)){const dot=h("i");if(item.event.tone)dot.style.setProperty("--cx-ev",toneVariable(item.event.tone,false,"var(--hfx-color-accent,light-dark(#11776f,#37c9b8))"));dots.appendChild(dot)}
178
- cell.appendChild(dots)}else if(hidden>0){const more=gridButton(fill(this.calLabels.calendarMore,{count:numberFormat(this.lang).format(hidden)}),()=>{});more.className="cx-cal-more-btn";more.tabIndex=-1;more.dataset.cxDay=String(day);more.setAttribute("aria-label",fill(this.calLabels.calendarMoreLabel,{count:numberFormat(this.lang).format(hidden),date:this.calFmt.longDay(day)}));more.style.setProperty("--l",String(dayLimit[col]));more.style.setProperty("--c",String(col));cell.appendChild(more)}});weeks.appendChild(row)}
177
+ const hidden=totals[col]- layout.counts[col];cell.setAttribute("aria-label",this.calDayName(day,totals[col],backgrounds));if(options.dots&&totals[col]){const dots=h("span","cx-cal-dots");dots.setAttribute("aria-hidden","true");for(const item of placed.filter(entry=>entry.from<=col&&entry.to>=col).slice(0,3)){const dot=h("i");if(item.event.tone)dot.style.setProperty("--cx-ev",toneVariable(item.event.tone,false,"var(--hfx-color-accent,light-dark(#11776f,#37c9b8))"));dots.appendChild(dot)}
178
+ cell.appendChild(dots)}else if(hidden>0){const more=gridButton(fill(this.calLabels.calendarMore,{count:numberFormat(this.lang).format(hidden)}),()=>{});more.className="cx-cal-more-btn";more.tabIndex=-1;more.dataset.cxDay=String(day);more.setAttribute("aria-label",fill(this.calLabels.calendarMoreLabel,{count:numberFormat(this.lang).format(hidden),date:this.calFmt.longDay(day)}));more.style.setProperty("--l",String(layout.more[col]));more.style.setProperty("--c",String(col));cell.appendChild(more)}});weeks.appendChild(row)}
179
179
  return grid},calWeekNumber(day){if(this.cal.weekNumbers!=="locale"){const thursday=day -(calDow(day)+ 6)%7+3,year=calDayParts(thursday).y;return Math.floor((thursday-calDayNumber(year,1,1))/ 7) + 1;
180
180
  }
181
181
  let minimal=1;try{const locale=new Intl.Locale(this.lang);minimal=(locale.getWeekInfo?.()||locale.weekInfo)?.minimalDays||1}catch{minimal=1}
@@ -192,10 +192,10 @@ this.calFocus={day,minutes:this.calFocus?.minutes??null,event:null};if(!inside){
192
192
  if(this.calPhone&&view==="month"){const list=this.calBody.querySelector(".cx-cal-daylist");if(list){this.calDisposeEventRenderers(list);list.replaceWith(this.calDayList(day))}
193
193
  this.calMarkListedDay(day);const count=this.calEventsOn(day).length;this.calAnnounce(this.calFmt.longDay(day)+ ", " +(count?calCount(this,this.calLabels.calendarEvents,count):this.calLabels.calendarNoEvents))}
194
194
  this.calRestoreFocus(true)}});const CAL_DAY_GRIDS=["month","mini","months","weekList","dayList"];function calDayGrid(view){return CAL_DAY_GRIDS.includes(view)}
195
- Object.assign(DataGrid.prototype,{calPaintMini(){const range=this.calRange;this.calCells=new Map();const grid=this.calMonthGrid(range.firstDay,range.lastDay,range.month,{rowHeight:34,dots:true,outside:this.cal.outsideDays,labelledBy:this.calTitle.id,className:"cx-cal-mini"});grid.setAttribute("data-cx-finish-allow","empty-band");this.calBody.replaceChildren(grid);this.calGrid=grid},calPaintMonths(){const range=this.calRange,stack=h("div","cx-cal-months");this.calCells=new Map();for(let month=range.month;month<=range.lastDay;month=calAddMonths(month,1)){const section=h("section","cx-cal-mblock"),title=h("h3","cx-cal-mtitle"),last=calAddMonths(month,1)- 1;title.id=this.id+"-cal-m"+month;setText(title,this.calFmt.monthTitle(month));const first=calWeekStart(month,this.cal.firstDay),end=calWeekStart(last,this.cal.firstDay)+ 6;section.append(title,this.calMonthGrid(first,end,month,{rowHeight:92,dots:this.calPhone,outside:false,labelledBy:title.id}));stack.appendChild(section)}
195
+ Object.assign(DataGrid.prototype,{calPaintMini(){const range=this.calRange;this.calCells=new Map();const grid=this.calMonthGrid(range.firstDay,range.lastDay,range.month,{rowHeight:34,dots:true,outside:this.cal.outsideDays,labelledBy:this.calTitle.id,className:"cx-cal-mini"});grid.setAttribute("data-cx-finish-allow","empty-band");this.calBody.replaceChildren(grid);this.calGrid=grid;this.calMarkListedDay(this.calDate)},calPaintMonths(){const range=this.calRange,stack=h("div","cx-cal-months");this.calCells=new Map();for(let month=range.month;month<=range.lastDay;month=calAddMonths(month,1)){const section=h("section","cx-cal-mblock"),title=h("h3","cx-cal-mtitle"),last=calAddMonths(month,1)- 1;title.id=this.id+"-cal-m"+month;setText(title,this.calFmt.monthTitle(month));const first=calWeekStart(month,this.cal.firstDay),end=calWeekStart(last,this.cal.firstDay)+ 6;section.append(title,this.calMonthGrid(first,end,month,{rowHeight:92,dots:this.calPhone,outside:false,labelledBy:title.id}));stack.appendChild(section)}
196
196
  this.calBody.replaceChildren(stack);this.calGrid=stack},calPaintList(){const range=this.calRange,days=this.calShownDays(range.firstDay,range.lastDay),today=this.calZone.day(Date.now()),valid=this.cal.validRange,fmt=this.calFmt;const grid=h("div","cx-cal-list" +(days.length===1?" cx-cal-list-day":"")),row=h("div","cx-cal-lrow");grid.setAttribute("role","grid");grid.setAttribute("aria-labelledby",this.calTitle.id);grid.setAttribute("aria-readonly",String(!this.cal.editable&&!this.cal.create));row.setAttribute("role","row");grid.style.setProperty("--cx-cal-cols",String(days.length));this.calCells=new Map();for(const day of days){const events=this.calEventsOn(day),invalid=valid&&(day<valid.first||day>valid.last);const cell=h("div","cx-cal-day cx-cal-lday" +(day===today?" cx-cal-today":"")+(invalid?" cx-cal-invalid":""));cell.setAttribute("role","gridcell");cell.tabIndex=-1;cell.dataset.cxDay=String(day);if(invalid)cell.setAttribute("aria-disabled","true");if(day===today)cell.setAttribute("aria-current","date");cell.setAttribute("aria-label",this.calDayName(day,events.length,this.calBackgroundsOn(day)));const head=h("div","cx-cal-lhead"),name=h("span","cx-cal-dayname"),number=h("span","cx-cal-num");head.setAttribute("aria-hidden","true");setText(name,fmt.weekday(day,days.length===1?"long":"short"));setText(number,fmt.dayNumber(day));head.append(name,number);if(this.cal.weekNumbers&&day===days[0]){const wk=h("span","cx-cal-wknum");setText(wk,fill(this.calLabels.calendarWeekShort,{number:this.calWeekNumber(day)}));head.appendChild(wk)}
197
197
  cell.appendChild(head);if(!events.length){const empty=h("p","cx-cal-empty");setText(empty,this.calLabels.calendarNoEvents);empty.setAttribute("aria-hidden","true");cell.appendChild(empty)}
198
- for(const event of events)cell.appendChild(this.calEventElement(event,"item"));const backgrounds=this.calBackgroundsOn(day);if(backgrounds.length){cell.classList.add("cx-cal-bgday");cell.style.setProperty("--cx-bg-tone",toneVariable(backgrounds[0].tone,false,"var(--hfx-color-status-info-fg,light-dark(#2b5fc0,#74a2f7))"))}
198
+ for(const event of events)cell.appendChild(this.calEventElement(event,"item",day));const backgrounds=this.calBackgroundsOn(day);if(backgrounds.length){cell.classList.add("cx-cal-bgday");cell.style.setProperty("--cx-bg-tone",toneVariable(backgrounds[0].tone,false,"var(--hfx-color-status-info-fg,light-dark(#2b5fc0,#74a2f7))"))}
199
199
  this.calCells.set(day,cell);row.appendChild(cell)}
200
200
  grid.appendChild(row);this.calBody.replaceChildren(grid);this.calGrid=grid}});const CAL_SLOT_PX=24,CAL_GUTTER=64,CAL_ALLDAY_LANES=3;Object.assign(DataGrid.prototype,{calTimeColumns(days){const all=this.calResourceColumns?.()||null;this.calResourcePages=null;if(!all){this.calTimeWindow=null;return days.map(day=>({day,resource:null}))}
201
201
  const size=this.calPhone&&!this.calPrinting&&all.length>2?(days.length===1?2:1):all.length,pages=Math.ceil(all.length / size);