@evotecit/canopyx 0.3.18 → 0.3.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CanopyX.Html/Assets/canopyx-board.css +12 -12
- package/CanopyX.Html/Assets/canopyx-board.js +1 -1
- package/CanopyX.Html/Assets/canopyx-calendar.css +70 -57
- package/CanopyX.Html/Assets/canopyx-calendar.js +14 -14
- package/CanopyX.Html/Assets/canopyx-cell-range.css +4 -4
- package/CanopyX.Html/Assets/canopyx-cell-range.js +1 -1
- package/CanopyX.Html/Assets/canopyx-changes.css +55 -55
- package/CanopyX.Html/Assets/canopyx-changes.js +1 -1
- package/CanopyX.Html/Assets/canopyx-column-groups.css +5 -1
- package/CanopyX.Html/Assets/canopyx-column-groups.js +15 -9
- package/CanopyX.Html/Assets/canopyx-compare.css +4 -4
- package/CanopyX.Html/Assets/canopyx-compare.js +1 -1
- package/CanopyX.Html/Assets/canopyx-detail-rows.css +4 -4
- package/CanopyX.Html/Assets/canopyx-detail-rows.js +1 -1
- package/CanopyX.Html/Assets/canopyx-editing.css +3 -3
- package/CanopyX.Html/Assets/canopyx-editing.js +1 -1
- package/CanopyX.Html/Assets/canopyx-enhance.js +2 -2
- package/CanopyX.Html/Assets/canopyx-export.js +8 -8
- package/CanopyX.Html/Assets/canopyx-facets.css +19 -18
- package/CanopyX.Html/Assets/canopyx-facets.js +1 -1
- package/CanopyX.Html/Assets/canopyx-filter-editor.css +24 -24
- package/CanopyX.Html/Assets/canopyx-filter-editor.js +3 -3
- package/CanopyX.Html/Assets/canopyx-flow-checks.css +2 -2
- package/CanopyX.Html/Assets/canopyx-flow-checks.js +1 -1
- package/CanopyX.Html/Assets/canopyx-flow-command.css +3 -3
- package/CanopyX.Html/Assets/canopyx-flow-command.js +1 -1
- package/CanopyX.Html/Assets/canopyx-flow-dialog.css +2 -2
- package/CanopyX.Html/Assets/canopyx-flow-dialog.js +1 -1
- package/CanopyX.Html/Assets/canopyx-flow-drafts.css +2 -2
- package/CanopyX.Html/Assets/canopyx-flow-drafts.js +1 -1
- package/CanopyX.Html/Assets/canopyx-flow-entry.css +24 -23
- package/CanopyX.Html/Assets/canopyx-flow-entry.js +4 -4
- package/CanopyX.Html/Assets/canopyx-flow-host.css +2 -2
- package/CanopyX.Html/Assets/canopyx-flow-host.js +1 -1
- package/CanopyX.Html/Assets/canopyx-flow-module.mjs +4 -4
- package/CanopyX.Html/Assets/canopyx-flow-pick.css +4 -4
- package/CanopyX.Html/Assets/canopyx-flow-pick.js +1 -1
- package/CanopyX.Html/Assets/canopyx-flow-preview.css +1 -1
- package/CanopyX.Html/Assets/canopyx-flow-preview.js +1 -1
- package/CanopyX.Html/Assets/canopyx-flow-records.css +2 -2
- package/CanopyX.Html/Assets/canopyx-flow-records.js +1 -1
- package/CanopyX.Html/Assets/canopyx-flow-tasks.css +4 -4
- package/CanopyX.Html/Assets/canopyx-flow-tasks.js +1 -1
- package/CanopyX.Html/Assets/canopyx-flow.css +41 -41
- package/CanopyX.Html/Assets/canopyx-flow.js +1 -1
- package/CanopyX.Html/Assets/canopyx-format-editor.css +9 -9
- package/CanopyX.Html/Assets/canopyx-format-editor.js +1 -1
- package/CanopyX.Html/Assets/canopyx-formatting.css +13 -13
- package/CanopyX.Html/Assets/canopyx-formatting.js +3 -3
- package/CanopyX.Html/Assets/canopyx-forms.css +3 -3
- package/CanopyX.Html/Assets/canopyx-forms.js +1 -1
- package/CanopyX.Html/Assets/canopyx-grid-module.mjs +56 -46
- package/CanopyX.Html/Assets/canopyx-grid-options.css +8 -8
- package/CanopyX.Html/Assets/canopyx-grid-options.js +9 -2
- package/CanopyX.Html/Assets/canopyx-grid.css +99 -96
- package/CanopyX.Html/Assets/canopyx-grid.js +55 -45
- package/CanopyX.Html/Assets/canopyx-grouping.css +7 -7
- package/CanopyX.Html/Assets/canopyx-grouping.js +1 -1
- package/CanopyX.Html/Assets/canopyx-highlight.css +10 -10
- package/CanopyX.Html/Assets/canopyx-highlight.js +1 -1
- package/CanopyX.Html/Assets/canopyx-interactive.css +50 -49
- package/CanopyX.Html/Assets/canopyx-interactive.js +12 -11
- package/CanopyX.Html/Assets/canopyx-labels-de.js +4 -0
- package/CanopyX.Html/Assets/canopyx-labels-es.js +4 -0
- package/CanopyX.Html/Assets/canopyx-labels-fr.js +4 -0
- package/CanopyX.Html/Assets/canopyx-labels-it.js +4 -0
- package/CanopyX.Html/Assets/canopyx-labels-pl.js +4 -0
- package/CanopyX.Html/Assets/canopyx-layouts.css +9 -9
- package/CanopyX.Html/Assets/canopyx-layouts.js +2 -2
- package/CanopyX.Html/Assets/canopyx-link.css +3 -3
- package/CanopyX.Html/Assets/canopyx-link.js +3 -3
- package/CanopyX.Html/Assets/canopyx-links.js +2 -2
- package/CanopyX.Html/Assets/canopyx-live.css +2 -2
- package/CanopyX.Html/Assets/canopyx-live.js +1 -1
- package/CanopyX.Html/Assets/canopyx-matrix.css +31 -31
- package/CanopyX.Html/Assets/canopyx-matrix.js +1 -1
- package/CanopyX.Html/Assets/canopyx-module.mjs +13 -12
- package/CanopyX.Html/Assets/canopyx-pager.css +1 -1
- package/CanopyX.Html/Assets/canopyx-pager.js +1 -1
- package/CanopyX.Html/Assets/canopyx-path.css +8 -8
- package/CanopyX.Html/Assets/canopyx-path.js +1 -1
- package/CanopyX.Html/Assets/canopyx-pivot.css +10 -10
- package/CanopyX.Html/Assets/canopyx-pivot.js +3 -3
- package/CanopyX.Html/Assets/canopyx-plan.css +24 -17
- package/CanopyX.Html/Assets/canopyx-plan.js +13 -9
- package/CanopyX.Html/Assets/canopyx-record-panel.css +47 -42
- package/CanopyX.Html/Assets/canopyx-record-panel.js +16 -9
- package/CanopyX.Html/Assets/canopyx-reporting-module.mjs +59 -56
- package/CanopyX.Html/Assets/canopyx-reporting.css +104 -101
- package/CanopyX.Html/Assets/canopyx-reporting.js +58 -55
- package/CanopyX.Html/Assets/canopyx-stack.css +6 -6
- package/CanopyX.Html/Assets/canopyx-stack.js +1 -1
- package/CanopyX.Html/Assets/canopyx-time-slider.css +5 -5
- package/CanopyX.Html/Assets/canopyx-time-slider.js +1 -1
- package/CanopyX.Html/Assets/canopyx-timeline.css +19 -19
- package/CanopyX.Html/Assets/canopyx-timeline.js +2 -2
- package/CanopyX.Html/Assets/canopyx-tree-tools.css +21 -21
- package/CanopyX.Html/Assets/canopyx-tree-tools.js +3 -3
- package/CanopyX.Html/Assets/canopyx-ui-accordion.css +119 -0
- package/CanopyX.Html/Assets/canopyx-ui-accordion.js +33 -0
- package/CanopyX.Html/Assets/canopyx-ui-menu.css +7 -7
- package/CanopyX.Html/Assets/canopyx-ui-menu.js +1 -1
- package/CanopyX.Html/Assets/canopyx-ui-module.mjs +39 -0
- package/CanopyX.Html/Assets/canopyx-ui-navigation.css +9 -9
- package/CanopyX.Html/Assets/canopyx-ui-navigation.js +5 -5
- package/CanopyX.Html/Assets/canopyx-ui-overlays.css +5 -5
- package/CanopyX.Html/Assets/canopyx-ui-overlays.js +5 -2
- package/CanopyX.Html/Assets/canopyx-ui-picker.css +2 -2
- package/CanopyX.Html/Assets/canopyx-ui-picker.js +1 -1
- package/CanopyX.Html/Assets/canopyx-ui-stepper.css +12 -12
- package/CanopyX.Html/Assets/canopyx-ui-stepper.js +1 -1
- package/CanopyX.Html/Assets/canopyx-ui-tabs.css +9 -8
- package/CanopyX.Html/Assets/canopyx-ui-tabs.js +7 -4
- package/CanopyX.Html/Assets/canopyx-ui.css +119 -0
- package/CanopyX.Html/Assets/canopyx-ui.js +37 -0
- package/CanopyX.Html/Assets/canopyx-view-intents.css +1 -1
- package/CanopyX.Html/Assets/canopyx-view-intents.js +1 -1
- package/CanopyX.Html/Assets/canopyx.css +47 -46
- package/CanopyX.Html/Assets/canopyx.js +12 -11
- package/JavaScript/column-groups.d.ts +24 -4
- package/JavaScript/grid.d.ts +11 -1
- package/JavaScript/hosts.d.ts +2 -0
- package/JavaScript/locales/de.mjs +4 -0
- package/JavaScript/locales/es.mjs +4 -0
- package/JavaScript/locales/fr.mjs +4 -0
- package/JavaScript/locales/it.mjs +4 -0
- package/JavaScript/locales/pl.mjs +4 -0
- package/JavaScript/protocol.d.ts +3 -0
- package/JavaScript/records.d.ts +2 -0
- package/JavaScript/ui.d.ts +70 -2
- package/README.md +76 -206
- package/README.nuget.md +63 -87
- package/package.json +14 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
(function(global){"use strict";const installed=new WeakSet();const part={version:"
|
|
1
|
+
(function(global){"use strict";const installed=new WeakSet();const part={version:"002a6d917bb4d638",install(context){if(installed.has(context.MATRIX_IMPL))return;const{MATRIX_IMPL,h,setText,fill,plural,foldText,numberFormat,gridFreeze,toneOf,applyTone,toneColors,AxisWindow,PROTOCOL}=context;const MATRIX_LABELS={matrixRows:"Rows",matrixColumns:"Columns",matrixSearch:"Find rows and columns",matrixSortBy:"Sort by",matrixGroupBy:"Group by",matrixByLabel:"Name",matrixByTotal:"Total",matrixAsListed:"As listed",matrixNoGrouping:"No groups",matrixDescending:"Descending",matrixOnlyProblems:"Only problems",matrixHideEmpty:"Hide empty rows and columns",matrixSize:"{rows} × {columns}",matrixShown:"Rows: {rows} of {totalRows}, columns: {columns} of {totalColumns}",matrixAttention:"Need attention: {count}",matrixLegend:"States",matrixFilter:"Filter",matrixClearFilters:"Clear filters",matrixNoMatches:"No rows or columns match.",matrixSelf:"Same item",matrixNoData:"No data",matrixCell:"{row} and {column}: {state}",matrixTotal:"Total",matrixItemTotal:"{item}: {count}",matrixExpandGroup:"Expand {group}",matrixCollapseGroup:"Collapse {group}",matrixGroupCount:"{count}",matrixCellCount:"Cells: {count}",matrixDetails:"Details",matrixClose:"Close",matrixValue:"Value",matrixState:"State",matrixAllClear:"Nothing needs attention",matrixShowMore:"Show more"};function matrixLabels(...sources){const labels={...MATRIX_LABELS};for(const source of sources){if(source==null)continue;if(typeof source!=="object"||Array.isArray(source))matrixFail("labels must be an object of strings");for(const[name,text]of Object.entries(source)){if(!Object.hasOwn(labels,name)){if(/^matrix[A-Z]/.test(name)) matrixFail("there is no matrix label '" + name + "'"); continue; }
|
|
2
2
|
if(typeof text!=="string"||!/\S/.test(text)) matrixFail("label '" + name + "' must be a string with visible text");
|
|
3
3
|
labels[name]=text}}
|
|
4
4
|
return Object.freeze(labels)}
|
|
@@ -77,8 +77,7 @@ function fill(template,values){return template.replace(/\{(\w+)\}/g, (match, nam
|
|
|
77
77
|
const pluralRules=new Map();function plural(template,count,lang){if(!template.startsWith("["))return template;const forms={};for(const match of template.matchAll(/\[(zero|one|two|few|many|other)\]([^[]*)/g)) forms[match[1]] = match[2];
|
|
78
78
|
let rules=pluralRules.get(lang);if(!rules){try{rules=new Intl.PluralRules(lang||"en")}catch(_){rules=new Intl.PluralRules("en")}pluralRules.set(lang,rules)}
|
|
79
79
|
return forms[rules.select(Number(count))]??forms.other??template}
|
|
80
|
-
let DEFAULT_LABELS=Object.freeze({searchPlaceholder:"Search",searchResults:"Search results",searchResultCount:"{count} results",searchResultCountOfTotal:"{count} of {total} results",searchResultCountOfMany:"{count} of many results",searchNoResults:"No results",searchTooShort:"Type at least {min} characters",searchWordTooShort:"Type a word of at least {min} characters",searchFailed:"Search failed: {error}",columns:"Columns",hiddenColumns:"[one]+{count} column[other]+{count} columns",visibleColumns:"Visible columns",resizeColumn:"Resize {column}",columnWidth:"{width} pixels",loading:"Loading…",loadError:"Could not load: {error} (Enter to retry)",queryFailed:"Could not update the view: {error}",showMore:"Show more ({loaded} of {total} loaded)",showMoreUnknownTotal:"Show more ({loaded} loaded)",pageLoaded:"{loaded} of {total} loaded",itemsLoaded:"{count} items",yes:"Yes",no:"No",utcTime:"{time} UTC",localTime:"{time} local time",mountError:"This view could not be displayed: {error}"});function labelsFor(...sources){const labels=Object.assign({},DEFAULT_LABELS);for(const source of sources){if(source==null)continue;if(typeof source!=="object"||Array.isArray(source))throw new Error("CanopyX: labels must be an object of strings.");Object.keys(source).forEach((name)=>{
|
|
81
|
-
if(!Object.hasOwn(DEFAULT_LABELS,name)&&!/^(?:gridEdit|format|calendar|flow|matrix|change|board|plan|path|stack|time|compare|viewIntent)[A-Z]\w{0,63}$/.test(name) && !uiLabel) throw new Error("CanopyX: there is no label '" + name + "'.");
|
|
80
|
+
let DEFAULT_LABELS=Object.freeze({searchPlaceholder:"Search",searchResults:"Search results",searchResultCount:"{count} results",searchResultCountOfTotal:"{count} of {total} results",searchResultCountOfMany:"{count} of many results",searchNoResults:"No results",searchTooShort:"Type at least {min} characters",searchWordTooShort:"Type a word of at least {min} characters",searchFailed:"Search failed: {error}",columns:"Columns",hiddenColumns:"[one]+{count} column[other]+{count} columns",visibleColumns:"Visible columns",resizeColumn:"Resize {column}",columnWidth:"{width} pixels",loading:"Loading…",loadError:"Could not load: {error} (Enter to retry)",queryFailed:"Could not update the view: {error}",showMore:"Show more ({loaded} of {total} loaded)",showMoreUnknownTotal:"Show more ({loaded} loaded)",pageLoaded:"{loaded} of {total} loaded",itemsLoaded:"{count} items",yes:"Yes",no:"No",utcTime:"{time} UTC",localTime:"{time} local time",mountError:"This view could not be displayed: {error}"});function labelsFor(...sources){const labels=Object.assign({},DEFAULT_LABELS);for(const source of sources){if(source==null)continue;if(typeof source!=="object"||Array.isArray(source))throw new Error("CanopyX: labels must be an object of strings.");Object.keys(source).forEach((name)=>{if(!Object.hasOwn(DEFAULT_LABELS,name)&&!/^(?:gridEdit|format|calendar|flow|matrix|change|board|plan|path|stack|time|compare|viewIntent|tabs|stepper|accordion|dialog|drawer|state)[A-Z]\w{0,63}$/.test(name)) throw new Error("CanopyX: there is no label '" + name + "'.");
|
|
82
81
|
if(typeof source[name]!=="string"||!/\S/.test(source[name])) throw new Error("CanopyX: label '" + name + "' must be a string with visible text.");
|
|
83
82
|
if((name==="utcTime"||name==="localTime")&&source[name].indexOf("{time}")<0)throw new Error("CanopyX: label '"+name+"' must hold {time}.");labels[name]=source[name]})}
|
|
84
83
|
return Object.freeze(labels)}
|
|
@@ -92,8 +91,8 @@ function trusted(kind,value){if(trustPolicy===undefined){try{trustPolicy=global.
|
|
|
92
91
|
catch(_){trustPolicy=null}}
|
|
93
92
|
return trustPolicy?trustPolicy["create"+kind](value):value}
|
|
94
93
|
function hostHtml(element,html,sanitize,kind){const text=String(html??""),value=sanitize?sanitize(text,{kind}):text;if(value?.nodeType)element.replaceChildren(value);else if(typeof value==="string")element.innerHTML=trusted("HTML",value);else if(global.trustedTypes?.isHTML?.(value))element.innerHTML=value;else throw new Error("CanopyX: invalid sanitizeHtml result.")}
|
|
95
|
-
const STATUS_FALLBACKS={"--hfx-color-status-bad-bg":"light-dark(#f9e4e4,#3c272a)","--hfx-color-status-bad-fg":"light-dark(#b8292a,#f47171)","--hfx-color-status-good-bg":"light-dark(#e2f0e9,#1f362f)","--hfx-color-status-good-fg":"light-dark(#177345,#4cc78a)","--hfx-color-status-info-bg":"light-dark(#e4ecfa,#262f41)","--hfx-color-status-info-fg":"light-dark(#2b5fc0,#74a2f7)","--hfx-color-status-neutral-bg":"light-dark(#eeeff0,#2a2c31)","--hfx-color-status-neutral-fg":"light-dark(#5b6069,#a0a5ae)","--hfx-color-status-warn-bg":"light-dark(#f8efde,#3b3322)","--hfx-color-status-warn-fg":"light-dark(#8c5c05,#eeb640)"};const MODE_ATTRIBUTES=["data-theme","data-cx-theme","data-hfx-mode","data-bs-theme","data-hfx-theme","data-hfx-tokens"];const THEME_ATTRIBUTES=[...MODE_ATTRIBUTES,"data-hfx-style","data-hfx-density","data-cx-fallback-mode","style","class"];function watchTheme(host,signal){const attributes=THEME_ATTRIBUTES;const previous=host.getAttribute("data-cx-fallback-mode");const refresh=()=>{const parent=host.parentElement&&getComputedStyle(host.parentElement);const inherited=parent?.colorScheme;
|
|
96
|
-
if(
|
|
94
|
+
const STATUS_FALLBACKS={"--hfx-color-status-bad-bg":"light-dark(#f9e4e4,#3c272a)","--hfx-color-status-bad-fg":"light-dark(#b8292a,#f47171)","--hfx-color-status-good-bg":"light-dark(#e2f0e9,#1f362f)","--hfx-color-status-good-fg":"light-dark(#177345,#4cc78a)","--hfx-color-status-info-bg":"light-dark(#e4ecfa,#262f41)","--hfx-color-status-info-fg":"light-dark(#2b5fc0,#74a2f7)","--hfx-color-status-neutral-bg":"light-dark(#eeeff0,#2a2c31)","--hfx-color-status-neutral-fg":"light-dark(#5b6069,#a0a5ae)","--hfx-color-status-warn-bg":"light-dark(#f8efde,#3b3322)","--hfx-color-status-warn-fg":"light-dark(#8c5c05,#eeb640)"};const MODE_ATTRIBUTES=["data-theme","data-cx-theme","data-hfx-mode","data-bs-theme","data-hfx-theme","data-hfx-tokens"];const THEME_ATTRIBUTES=[...MODE_ATTRIBUTES,"data-hfx-style","data-hfx-density","data-cx-fallback-mode","style","class"];function watchTheme(host,signal){const attributes=THEME_ATTRIBUTES;const previous=host.getAttribute("data-cx-fallback-mode");const refresh=()=>{const parent=host.parentElement&&getComputedStyle(host.parentElement);const inherited=parent?.colorScheme;const surface=parent&&["--hfx-color-surface-card","--hfx-color-surface"].some(name=>parent.getPropertyValue(name).trim());let mode=null;if(!surface){outer:for(let owner=host;owner;owner=owner.parentElement)for(const attribute of MODE_ATTRIBUTES){const value=owner.getAttribute(attribute);if(value==="light"||value==="dark"){mode=value;break outer}}}
|
|
95
|
+
if(surface||!mode&&inherited&&inherited!=="normal"){if(host.hasAttribute("data-cx-fallback-mode"))host.removeAttribute("data-cx-fallback-mode")}else if(host.getAttribute("data-cx-fallback-mode")!==(mode||"auto"))host.setAttribute("data-cx-fallback-mode",mode||"auto")};const observer=new MutationObserver(refresh);for(let owner=host;owner;owner=owner.parentElement)observer.observe(owner,{attributes:true,attributeFilter:attributes});refresh();const dispose=()=>{observer.disconnect();if(previous===null)host.removeAttribute("data-cx-fallback-mode");else host.setAttribute("data-cx-fallback-mode",previous)};signal?.addEventListener("abort",dispose,{once:true});return dispose}
|
|
97
96
|
function overlayTheme(host,element,inherit=false){for(const name of["data-hfx-style","data-hfx-mode","data-hfx-density"]){const owner=host.closest("["+name+"]");if(owner&&!inherit)element.setAttribute(name,owner.getAttribute(name));else element.removeAttribute(name)}
|
|
98
97
|
const theme=getComputedStyle(host),parent=inherit&&host.parentElement&&getComputedStyle(host.parentElement);element.style.colorScheme=theme.colorScheme;const copied=[];for(const name of theme)if((name.startsWith("--cx-")||name.startsWith("--hfx-"))&&(!parent||theme.getPropertyValue(name)!==parent.getPropertyValue(name))){element.style.setProperty(name,theme.getPropertyValue(name));copied.push(name)}
|
|
99
98
|
return copied}
|
|
@@ -216,8 +215,9 @@ if(kind==="inline"){if(!Array.isArray(view.roots))throw new Error("CanopyX: inli
|
|
|
216
215
|
throw new Error("CanopyX: unknown source kind '"+kind+"'.")}
|
|
217
216
|
async function remoteJson(url,type,timeoutMs,lifetime,signal){const controller=new AbortController();const signals=Array.from(new Set([lifetime,signal].filter(Boolean)));const abort=()=>controller.abort();signals.forEach((item)=>{if(item.aborted)abort();else item.addEventListener("abort",abort,{once:true})});let timedOut=false;const timer=setTimeout(()=>{timedOut=true;abort()},timeoutMs);try{const response=await fetch(url,{headers:{Accept:"application/json"},signal:controller.signal});if(!response.ok){if(response.body)await response.body.cancel().catch(()=>{});throw new Error(response.status+" "+response.statusText)}
|
|
218
217
|
return checkDocument(await response.json(),type)}catch(error){if(timedOut)throw new Error("CanopyX: remote request timed out after "+timeoutMs+" milliseconds.");throw error}finally{abort();clearTimeout(timer);signals.forEach((item)=>item.removeEventListener("abort",abort))}}
|
|
219
|
-
class TreeGrid{constructor(host,options){const view=checkDocument(options.view,"view");
|
|
220
|
-
|
|
218
|
+
class TreeGrid{constructor(host,options){const view=checkDocument(options.view,"view");if(view.recordDrawerModal!==undefined&&typeof view.recordDrawerModal!=="boolean")
|
|
219
|
+
throw new Error("CanopyX: recordDrawerModal must be a Boolean.");requireIdentifier(view.id,"view ID");if(view.columns.some(column=>column.format!==undefined))throw new Error("CanopyX: number formats apply to flat grids only.");this.host=host;this.view=view;this.opts=options;for(const name of["isSelectable","beforeSelect","sanitizeHtml"]){if(options[name]!==undefined&&typeof options[name]!=="function")throw new Error("CanopyX: "+name+" must be a function.")}
|
|
220
|
+
do{this.id="cx" + ++instanceSeq}while(document.getElementById(this.id));this.lifetime=new AbortController();this.source=options.source||sourceFor(view,{signal:this.lifetime.signal,timeoutMs:options.requestTimeoutMs});this.queryAware=this.source.queryAware===true;this.dataLifetime=new AbortController();this.acceptedQuery=Object.freeze({version:1,sort:null,filters:Object.freeze([])});this.datasetRevision=null;this.rowH=view.rowHeight||40;this.pageSize=view.pageSize||100;this.retainedNodeLimit=options.retainedNodeLimit===undefined?1024:options.retainedNodeLimit;if(!validStructuralCount(this.retainedNodeLimit))throw new Error("CanopyX: retainedNodeLimit must be a nonnegative 32-bit integer.");this.inactiveNodeLimit=options.inactiveNodeLimit===undefined?4096:options.inactiveNodeLimit;if(!validStructuralCount(this.inactiveNodeLimit))throw new Error("CanopyX: inactiveNodeLimit must be a nonnegative 32-bit integer.");this.multi=view.selection==="multiple";this.lang=document.documentElement.lang||undefined;this.labels=labelsFor(view.labels,options.labels);this.tools=Object.assign({},view.toolbar,options.toolbar);if(Object.entries(this.tools).some(([name,value])=>!/^(search|filters|columns|views|export|more|matches|layout)$/.test(name) || typeof value !== "boolean"))
|
|
221
221
|
throw new Error("CanopyX: toolbar options are booleans by control name.");this.local=view.timeZone==="local";this.fmt=formatting(this.lang,this.local,this.labels);this.kind="tree";this.plugins=viewPlugins(options,this.kind);const renderers=hostRenderers(options.renderers||{},view.columns,this.plugins);if(!options.formatLink!==!options.parseLink){throw new Error("CanopyX: formatLink and parseLink define one link scheme and are given together.")}
|
|
222
222
|
this.columns=view.columns.map((column,index)=>({...column,hidden:index>0&&!!column.hidden,render:Object.hasOwn(renderers,column.id)?renderers[column.id]:null}));this.columns.forEach(prepareWidth);this.columns.forEach(validateColumnValues);this.keyMap=new Map();this.root={key:null,h:null,parent:null,level:0,idx:0,expanded:true,children:null,total:null,next:null,loading:false,error:null};if(!options.source&&(!view.source||view.source.kind==="inline")){this.root.inlineItems=view.roots||[]}
|
|
223
223
|
this.rows=[];this.tops=[0];this.total=0;this.version=1;this.rendered=new Map();this.pool=[];this.focused=null;this.selected=new Set();this.anchor=null;this.filter=null;this.declaredFilter=null;this.filterExpand=false;this.activeFilters=new Set();this.sortState=null;this.typeBuf="";this.typeAt=0;this.rafId=0;this.iconTemplates=this.buildIcons(view.icons||{});this.initializing=true;this.prepareViewModes();this.build();this.buildToolbar();if(view.deepLink)loadPart(LINKS).catch(()=>{});this.ready=this.modesReady?Promise.all([this.init(),this.modesReady]).then(([result])=>result):this.init()}
|
|
@@ -412,7 +412,7 @@ if(accepted&&deferred&&revision===this.selectionRevision)
|
|
|
412
412
|
this.notifySelection(w,Array.from(this.selected).map((selected)=>selected.h),revision)}},async retryPage(status){const parent=status.parent;await this.loadStatusPage(parent,status,parent.next||null)},typeAhead(e,i){if(e.key.length!==1||e.ctrlKey||e.metaKey||e.altKey){return false}
|
|
413
413
|
const now=performance.now();const letter=e.key.toLowerCase();this.typeBuf=now-this.typeAt>TYPEAHEAD_MS?letter:this.typeBuf+letter;this.typeAt=now;const n=this.rows.length;const start=this.typeBuf.length===1?i+1:i;for(let k=0;k<n;k++){const w=this.rows[(start+k)%n];if(!w.status&&String(w.h.label).toLowerCase().startsWith(this.typeBuf)){this.setFocus(w);break}}
|
|
414
414
|
return true},announce(message){setText(this.live,message)}});const CELL_CONTROLS="a[href],button,input,select,textarea,summary,[tabindex],[contenteditable]:not([contenteditable=false])," +
|
|
415
|
-
"[role=button],[role=checkbox],[role=radio],[role=link],[role=switch],[role=tab],[role=menuitem],[role=textbox],[role=combobox]";const OWN_ARROWS=".cx-detail-body,textarea,select,[contenteditable]:not([contenteditable=false]),[aria-activedescendant]," +
|
|
415
|
+
"[role=button],[role=checkbox],[role=radio],[role=link],[role=switch],[role=tab],[role=menuitem],[role=textbox],[role=combobox]";const OWN_ARROWS=".cx-detail-body,.cx-phone-value,textarea,select,[contenteditable]:not([contenteditable=false]),[aria-activedescendant]," +
|
|
416
416
|
"[role=textbox],[role=combobox],[role=spinbutton],[role=slider],[role=radio],[role=tab],[role=menuitem],[role=listbox],[role=tree],[role=grid]," +
|
|
417
417
|
"input:not([type=button]):not([type=checkbox]):not([type=submit]):not([type=reset]):not([type=image]):not([type=file]):not([type=color])";function reachable(control){return!control.matches(":disabled")&&!control.closest("[inert],[aria-hidden=true]")&&
|
|
418
418
|
(control.checkVisibility?control.checkVisibility({visibilityProperty:true}):control.getClientRects().length>0)}
|
|
@@ -532,11 +532,11 @@ close()}else{return}
|
|
|
532
532
|
e.preventDefault()});input.addEventListener("blur",()=>{cancelNavigation();sequence++;clearTimeout(timer);clearTimeout(blurTimer);blurTimer=setTimeout(close,150)});this.cancelSearch=()=>{cancelNavigation();sequence++;clearTimeout(timer);clearTimeout(blurTimer);hits=[];close()};box.appendChild(input);box.appendChild(list);box.appendChild(status);bar.appendChild(box);this.searchInput=input}});function watchFlyout(anchorElement,panel,isOpen){const lifetime=new AbortController();let flyout=null,pending=null;const ready=()=>flyout?Promise.resolve(flyout):pending||=loadPart(SHARED_PARTS["ui-overlays"]).then(()=>{if(!lifetime.signal.aborted)flyout=UI_TOOLS.toolbarFlyout(anchorElement,panel,isOpen,lifetime.signal);return flyout}).catch(error=>{pending=null;throw error});const invoke=method=>{if(lifetime.signal.aborted||!isOpen())return;if(flyout){flyout[method]();return}
|
|
533
533
|
ready().then(value=>{if(!lifetime.signal.aborted&&isOpen())value?.[method]()}).catch(error=>{if(!lifetime.signal.aborted)(anchorElement.closest(".cx-host")||anchorElement)
|
|
534
534
|
.dispatchEvent(new CustomEvent("canopyx:error",{detail:{error},bubbles:true}))})};return{position:()=>invoke("position"),open:()=>invoke("open"),close:()=>flyout?.close(),dispose:()=>lifetime.abort()}}
|
|
535
|
-
const PART_URL=typeof document!=="undefined"&&document.currentScript?.src;const PARTS={"ui-overlays":["
|
|
535
|
+
const PART_URL=typeof document!=="undefined"&&document.currentScript?.src;const PARTS={"ui-overlays":["24afaa117ebf3fb5","canopyx-ui-overlays.dedc42d3a501a387.js","canopyx-ui-overlays.3668a9a74004ea8e.css"],"ui-menu":["352b1ee391133ff0","canopyx-ui-menu.f9abee36db8f6ad2.js","canopyx-ui-menu.2f3478cc5f5c272f.css"],"ui-picker":["d415103478faf52a","canopyx-ui-picker.13e544bd68aca998.js","canopyx-ui-picker.59c85a1988a287a9.css"],"ui-navigation":["2553d01c5276d56a","canopyx-ui-navigation.c4ebc214197f140d.js","canopyx-ui-navigation.0afd07bbdc5aecb5.css"],"ui-tabs":["19ece8184f3daf4a","canopyx-ui-tabs.6cd35b2afd89f530.js","canopyx-ui-tabs.7bb6c6f1341e87e9.css"],"ui-stepper":["5682c49db1b85314","canopyx-ui-stepper.96973189b0f6e0c4.js","canopyx-ui-stepper.1d4a9db373b8d2f2.css"],"ui-accordion":["1424f075b78d0ccd","canopyx-ui-accordion.d0d5daa7f73d0859.js","canopyx-ui-accordion.a3ef9c27cea5b7a4.css"],"tree-tools":["ef0d06c82135ae2e","canopyx-tree-tools.1c4b9e286dde6065.js","canopyx-tree-tools.350dd0ee46757029.css"],"export":["15abf3205094bda6","canopyx-export.68b90138463329fe.js"],"office-export":["4fb7a4d570390ee9","canopyx-office-export.7e62c385b884e75b.js"],"links":["c6579c9401f0971d","canopyx-links.b25760079f57e6e1.js"],"search":["521eebd6e1bbbd35","canopyx-search.14c69f4551c69f23.js"],"link":["7485f5c9875e9f9b","canopyx-link.9066770aa822fe0f.js","canopyx-link.997fefec6b85f0c5.css"],"highlight":["5ebf0042011ba4fd","canopyx-highlight.ff11a0ca8e30102b.js","canopyx-highlight.9c26291cbcd0962b.css"],"layouts":["90267e35e7edf3a4","canopyx-layouts.058b8a396f909a79.js","canopyx-layouts.ca17f42babc4192a.css"],"record-panel":["cb6bcd1baf644a51","canopyx-record-panel.557c676822e8624f.js","canopyx-record-panel.174846a640de979f.css"]},PART_CODE=new Map(),SHARED_PARTS={},partName=name=>typeof name==="string"&&/^[a-z][a-z\d-]{0,31}$/.test(name);
|
|
536
536
|
function registerPart(name,part){if(!partName(name)||!part||typeof part.version!=="string"||typeof part.install!=="function"||
|
|
537
537
|
part.requires!==undefined&&!(Array.isArray(part.requires)&&part.requires.every(partName)))throw new Error("CanopyX: invalid part.");PART_CODE.set(name,part)}
|
|
538
538
|
function definePart(View,name,label,context){const parts=View.prototype.parts||={};return parts[name]={name,label,context,parts}}
|
|
539
|
-
function loadPart(part){return part.ready||=Promise.resolve().then(async()=>{const[version,scriptFile,styleFile]=Object.hasOwn(PARTS,part.name)?PARTS[part.name]:[];part.version=version;if(!version)throw new Error("CanopyX:
|
|
539
|
+
function loadPart(part){return part.ready||=Promise.resolve().then(async()=>{const[version,scriptFile,styleFile]=Object.hasOwn(PARTS,part.name)?PARTS[part.name]:[];part.version=version;if(!version)throw new Error("CanopyX: no "+part.label+".");if(PART_CODE.get(part.name)?.version!==part.version||part.styleReady===null){const find=type=>[...document.querySelectorAll('script[type="application/x-canopyx-'+type+'"][data-cx-version="'+part.version+'"]')].find(item=>!pageNonce||item.nonce===pageNonce);const payload=find(part.name),script=h("script"),embeddedStyle=styleFile&&find(part.name+"-style");if(payload){if(embeddedStyle){const style=h("style");style.nonce=payload.nonce;setText(style,embeddedStyle.textContent);document.head.appendChild(style)}
|
|
540
540
|
script.textContent=trusted("Script",payload.textContent);script.nonce=payload.nonce;document.head.appendChild(script);script.remove()}else{const base=global.CanopyXFilterEditorBase,runtime=PART_URL||typeof base==="string"&&base||document.baseURI,hashed=PART_URL&&/\.[a-f\d]{16}\.js(?:[?#]|$)/.test(PART_URL);
|
|
541
541
|
const load=(element,attribute,file,kind)=>new Promise((resolve,reject)=>{const url=new URL(file,runtime).href;element[attribute]=attribute==="src"?trusted("ScriptURL",url):url;element.onload=resolve;element.onerror=()=>{element.remove();reject(new Error("CanopyX: "+part.label+" "+kind+" unavailable."))};document.head.appendChild(withNonce(element))});const link=h("link");link.rel="stylesheet";const style=styleFile&&(part.styleReady||=load(link,"href",hashed?styleFile:"canopyx-"+part.name+".css","stylesheet")
|
|
542
542
|
.catch(error=>{part.styleReady=null;throw error}));const code=PART_CODE.get(part.name)?.version===part.version||(part.scriptReady||=load(script,"src",hashed?scriptFile:"canopyx-"+part.name+".js","script")
|
|
@@ -594,7 +594,7 @@ const wanted=Array.from(new Set(ids||this.rows.filter((w)=>!w.status).map((w)=>w
|
|
|
594
594
|
const navigation=navigationScope(this,this.dataLifetime.signal);let doc;try{doc=await navigation.wait(this.source.counts(wanted,this.sourceRequest(this.dataLifetime.signal)))}
|
|
595
595
|
finally{navigation.dispose()}
|
|
596
596
|
if(navigation.cancelled())return null;if(this.queryAware)snapshotRevision(doc,this.datasetRevision);checkDocument(doc,"counts");this.applyCounts(Object.assign({},doc,{items:doc.items.filter(item=>{const captured=mine.get(item.id);return captured&&this.keyMap.get(item.id)===captured.w&&captured.w.countRevision===captured.revision})}),true);return doc}});function UiHost(){}
|
|
597
|
-
const UI_IMPL={},UI_TOOLS={},uiInstances=new WeakMap();const UI_KINDS={tabs:"ui-tabs",stepper:"ui-stepper",menu:"ui-menu",dialog:"ui-overlays",drawer:"ui-overlays",popover:"ui-overlays",tooltip:"ui-overlays"};const uiContext=()=>({UI_IMPL,UI_TOOLS,h,setText,fill,watchTheme,overlayTheme,hostHtml});for(const name of
|
|
597
|
+
const UI_IMPL={},UI_TOOLS={},uiInstances=new WeakMap();const UI_KINDS={tabs:"ui-tabs",stepper:"ui-stepper",accordion:"ui-accordion",menu:"ui-menu",dialog:"ui-overlays",drawer:"ui-overlays",popover:"ui-overlays",tooltip:"ui-overlays"};const uiContext=()=>({UI_IMPL,UI_TOOLS,h,setText,fill,watchTheme,overlayTheme,hostHtml});for(const name of Object.keys(PARTS).filter(part=>part.startsWith("ui-")))SHARED_PARTS[name]=definePart(UiHost,name,name.replace("ui-","UI "),uiContext);function createUi(kind,target,options={}){const root=typeof target==="string"?document.querySelector(target):target;if(root?.nodeType!==1)throw new Error("CanopyX: "+kind+" needs an element.");let registrations=uiInstances.get(root);if(!registrations)uiInstances.set(root,registrations=new Map());if(registrations.has(kind))return registrations.get(kind);const lifetime=new AbortController();watchTheme(root,lifetime.signal);let instance=null;const ready=loadPart(SHARED_PARTS[UI_KINDS[kind]]).then(()=>{if(lifetime.signal.aborted)throw new DOMException("UI component destroyed.","AbortError");instance=UI_IMPL[kind](root,options,lifetime.signal);return instance.ready||instance});const api={element:root,ready:ready.then(()=>api),destroy(){if(lifetime.signal.aborted)return;lifetime.abort();instance?.destroy?.();registrations.delete(kind)}};for(const name of["select","getSelected","refresh","preparePrint","open","close","next","back","skip","finish","setStepState","getState","toggle","getOpen","filter"])api[name]=(...args)=>{if(lifetime.signal.aborted)throw new Error("CanopyX: UI component destroyed.");return instance?instance[name]?.(...args):ready.then(()=>instance[name]?.(...args))};api.ready.catch(error=>{if(error.name!=="AbortError")root.dispatchEvent(new CustomEvent("canopyx:error",{detail:{error},bubbles:true}))});registrations.set(kind,Object.freeze(api));return api}
|
|
598
598
|
function bindContextMenu(target,items,options={}){if(typeof target!=="string"&&target?.nodeType!==1)throw new Error("CanopyX: contextMenu needs an element or selector.");if(typeof target==="string")document.documentElement.matches(target);let disposed=false,cleanup=null;const dispose=()=>{disposed=true;cleanup?.()};dispose.ready=loadPart(SHARED_PARTS["ui-menu"]).then(()=>{if(!disposed)cleanup=UI_IMPL.contextMenu(target,items,options)});dispose.open=(...args)=>disposed?false:cleanup?cleanup.open(...args):dispose.ready.then(()=>!disposed&&cleanup.open(...args));dispose.close=(...args)=>cleanup?.close(...args);return dispose}
|
|
599
599
|
function mountUi(root=document){const mounted=[];for(const kind of Object.keys(UI_KINDS)){const selector="[data-cx-"+kind+"]",nodes=[...root.querySelectorAll(selector)];if(root.matches?.(selector))nodes.unshift(root);for(const element of nodes){if(kind==="menu"&&element.parentElement?.closest(selector))continue;if(kind==="stepper"&&["report","static"].includes(element.dataset.mode))continue;mounted.push(createUi(kind,element))}}
|
|
600
600
|
return mounted}
|
|
@@ -756,7 +756,8 @@ this.dropRow=null}
|
|
|
756
756
|
dropPlacement(event,row){const bounds=row.getBoundingClientRect(),fraction=(event.clientY-bounds.top)/ bounds.height;
|
|
757
757
|
return fraction<0.25?"before":fraction>0.75?"after":"inside"}
|
|
758
758
|
destroy(){this.clearDropRow();this.dragLease=null;super.destroy()}};function createTreeGrid(host,options){if(!host||!options||!options.view){throw new Error("CanopyX: createTreeGrid needs a host element and a view document.")}
|
|
759
|
-
|
|
759
|
+
if(options.recordDrawerModal!==undefined&&typeof options.recordDrawerModal!=="boolean")
|
|
760
|
+
throw new Error("CanopyX: recordDrawerModal must be a Boolean.");const existing=activeGrids.get(host);if(existing)return existing;const grid=new TreeGrid(host,options);const api=Object.assign({element:host,view:grid.view,ready:startPlugins(grid,()=>api),expandPath:(ids,o)=>grid.expandPath(ids,o),setFilter:(filter,o)=>{if(!grid.queryAware)grid.clearDeclaredFilters();grid.setFilter(filter,o)},setFilterActive:(id,active)=>grid.setFilterActive(id,active),setActiveFilters:(ids)=>grid.setActiveFilters(ids),updateActiveFilters:(change)=>grid.updateActiveFilters(change),getActiveFilters:()=>Array.from(grid.activeFilters),sort:(columnId,direction)=>grid.sort(columnId,direction),getQuery:()=>grid.getQuery(),setQuery:(query,options)=>grid.setQuery(query,options),setColumnVisible:(columnId,visible)=>grid.setColumnVisible(columnId,visible),setColumnWidth:(columnId,width)=>grid.setColumnWidth(columnId,width),setTreeColumnPinned:(pinned)=>grid.setTreeColumnPinned(pinned),setTimeZone:(zone)=>grid.setTimeZone(zone),getTimeZone:()=>(grid.local?"local":"utc"),refresh:()=>{grid.version++;grid.scheduleRender()},reload:(id,options)=>grid.reload(id,options),readLocation:()=>grid.readLocation(),getSelected:()=>Array.from(grid.selected).map((w)=>w.h),setSelection:(ids)=>grid.setSelection(ids),clearSelection:()=>grid.setSelection([]),selectAll:(options)=>grid.selectAll(options),focus:()=>{if(grid.destroyed)return;const target=grid.indexOf(grid.focused)>=0?grid.focused:grid.rows[0];if(target)grid.setFocus(target,true);else grid.grid.focus({preventScroll:true})},visibleRows:()=>grid.visibleRows(),toOutline:()=>grid.toOutline(),getState:()=>grid.getState(),setState:(state)=>grid.setState(state),getLayout:()=>grid.getLayout(),setLayout:(change)=>grid.setLayout(change),getMatches:()=>grid.getMatches(),setSearchHighlight:(enabled)=>grid.setSearchHighlight(enabled),nextMatch:(options)=>grid.nextMatch(options),previousMatch:(options)=>grid.previousMatch(options),search:(query,limit)=>grid.search(query,limit||(grid.view.search&&grid.view.search.maxResults)||20),loadMore:(id)=>{const w=id==null?grid.root:grid.keyMap.get(id);return w?grid.loadMore(w):Promise.resolve()},applyCounts:(doc)=>grid.applyCounts(doc),refreshCounts:(ids)=>grid.refreshCounts(ids),closeMenus:()=>grid.closeMenus?.(),destroy:()=>{grid.destroy();if(activeGrids.get(host)===api)activeGrids.delete(host);if(host.canopyx===api)delete host.canopyx}},grid.interactionApi&&grid.interactionApi(),linkApi(grid));for(const name of["prepareExport","exportAs","getSavedViews","saveView","applySavedView","removeSavedView","resetView","setColumnOrder","resetColumns","setColumnPinned","openDetails","openRecord"])
|
|
760
761
|
api[name]=(...args)=>{if(grid[name])return grid[name](...args);const error=new Error("CanopyX: "+name+" needs the tree tools part.");if(/^(exportAs|applySavedView|resetView|openDetails|openRecord)$/.test(name)) return Promise.reject(error);
|
|
761
762
|
throw error};api.ready=linkReady(grid,api.ready);Object.freeze(api);activeGrids.set(host,api);host.setAttribute("data-canopyx-mounted","true");host.canopyx=api;recordStart(grid);return api}
|
|
762
763
|
const configured=new Map();function configure(viewId,options){requireIdentifier(viewId,"view ID");if(!options||typeof options!=="object"){throw new Error("CanopyX: configure needs a view id and an options object.")}
|
|
@@ -770,4 +771,4 @@ function mount(root,automatic){const scope=root||document;const created=[];const
|
|
|
770
771
|
const message=err&&err.message?err.message:String(err);let labels=DEFAULT_LABELS;for(const attempt of[()=>labelsFor(view&&view.labels,view&&configured.has(view.id)?configured.get(view.id).labels:null),()=>labelsFor(view&&view.labels)]){try{labels=attempt();break}catch(e){labels=DEFAULT_LABELS}}
|
|
771
772
|
const notice=document.createElement("div");notice.className="cx-mount-error";notice.setAttribute("role","alert");setText(notice,fill(labels.mountError,{error:message}));host.classList.add("cx-host");host.setAttribute("data-canopyx-mounted","true");host.setAttribute("data-cx-error",message);host.appendChild(notice);if(global.console)global.console.error(err)};const selector="[data-canopyx-host]:not([data-canopyx-mounted])";(scope.matches?.(selector)?[scope]:scope.querySelectorAll(selector)).forEach((host)=>{const config=host.querySelector("script.cx-config"),mode=host.getAttribute("data-cx-mount");if(!config||(automatic===true&&mode==="manual")){return}
|
|
772
773
|
if(mode==="visible"&&host!==scope&&global.IntersectionObserver)return mountWhenVisible(host);watcher?.unobserve(host);host.setAttribute("data-canopyx-mounted","true");let view=null;try{view=JSON.parse(config.textContent);if(view===Object(view))parsedViews.add(view);const flow=view&&view.kind==="flow"&&typeof FLOW_API==="object",matrix=view&&view.type==="matrix"&&typeof MATRIX_API==="object";const change=view&&typeof CHANGE_VIEW_TYPES==="object"&&Object.hasOwn(CHANGE_VIEW_TYPES,view.type)?CHANGE_VIEW_TYPES[view.type]:null;const create=flow?FLOW_API.createFlow:matrix?MATRIX_API.createMatrix:change?change:view&&view.type==="grid"&&typeof createDataGrid==="function"?createDataGrid:createTreeGrid;const api=create(host,Object.assign({},view&&configured.get(view.id),flow?{flow:view}:{view}));created.push(api);api.ready.catch((err)=>{if(view.type!=="grid"&&!matrix&&!change&&activeGrids.get(host)===api&&host.canopyx===api)showError(host,err,api,view)})}catch(err){showError(host,err,null,view)}});mountUi(scope);return created}
|
|
773
|
-
global.CanopyX=Object.freeze(Object.assign({protocol:PROTOCOL,createTreeGrid,configure,unconfigure,mount:(root)=>mount(root,false),sources:Object.freeze({inline:inlineSource,sidecar:sidecarSource,remote:remoteSource}),badge:hostBadge,labels:DEFAULT_LABELS,registerExportFormat,use,registerPart,setNonce},typeof GRID_API==="object"?GRID_API:{},typeof FLOW_API==="object"?FLOW_API:{},typeof MATRIX_API==="object"?MATRIX_API:{},typeof CHANGES_API==="object"?CHANGES_API:{},UI_API));if(typeof document!=="undefined"){const navigation=global.performance&&performance.getEntriesByType?performance.getEntriesByType("navigation")[0]:null;if(document.readyState==="loading"||(document.readyState==="interactive"&&navigation&&navigation.domContentLoadedEventStart===0)){document.addEventListener("DOMContentLoaded",()=>mount(document,true))}else{mount(document,true)}}})(runtimeHost);const CanopyX=runtimeHost.CanopyX;const{protocol,createTreeGrid,configure,unconfigure,mount,sources,badge,labels,registerExportFormat,use,registerPart,setNonce, mountUi,contextMenu,tabs,stepper,dialog,drawer,popover,tooltip,menu}=CanopyX;export{protocol,createTreeGrid,configure,unconfigure,mount,sources,badge,labels,registerExportFormat,use,registerPart,setNonce, mountUi,contextMenu,tabs,stepper,dialog,drawer,popover,tooltip,menu};export default CanopyX;
|
|
774
|
+
global.CanopyX=Object.freeze(Object.assign({protocol:PROTOCOL,createTreeGrid,configure,unconfigure,mount:(root)=>mount(root,false),sources:Object.freeze({inline:inlineSource,sidecar:sidecarSource,remote:remoteSource}),badge:hostBadge,labels:DEFAULT_LABELS,registerExportFormat,use,registerPart,setNonce},typeof GRID_API==="object"?GRID_API:{},typeof FLOW_API==="object"?FLOW_API:{},typeof MATRIX_API==="object"?MATRIX_API:{},typeof CHANGES_API==="object"?CHANGES_API:{},UI_API));if(typeof document!=="undefined"){const navigation=global.performance&&performance.getEntriesByType?performance.getEntriesByType("navigation")[0]:null;if(document.readyState==="loading"||(document.readyState==="interactive"&&navigation&&navigation.domContentLoadedEventStart===0)){document.addEventListener("DOMContentLoaded",()=>mount(document,true))}else{mount(document,true)}}})(runtimeHost);const CanopyX=runtimeHost.CanopyX;const{protocol,createTreeGrid,configure,unconfigure,mount,sources,badge,labels,registerExportFormat,use,registerPart,setNonce, mountUi,contextMenu,tabs,stepper,accordion,dialog,drawer,popover,tooltip,menu}=CanopyX;export{protocol,createTreeGrid,configure,unconfigure,mount,sources,badge,labels,registerExportFormat,use,registerPart,setNonce, mountUi,contextMenu,tabs,stepper,accordion,dialog,drawer,popover,tooltip,menu};export default CanopyX;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
.cx-data-grid .cx-grid-pager .cx-pages{display:inline-flex;align-items:center;gap:var(--cx-size-4px);}
|
|
4
4
|
.cx-data-grid .cx-grid-pager .cx-pages .cx-button{width:auto;min-width:var(--cx-size-30px);padding:0 var(--cx-size-8px);font-variant-numeric:tabular-nums;}
|
|
5
5
|
.cx-data-grid .cx-grid-pager .cx-pages .cx-button[aria-current="page"]{border-color:var(--hfx-color-accent,light-dark(#11776f,#37c9b8));background:var(--hfx-color-accent-subtle,light-dark(#e7f1f1,#1b3435));color:var(--hfx-color-accent-text,light-dark(#02726a,#37c9b8));font-weight:600;}
|
|
6
|
-
.cx-data-grid .cx-grid-pager .cx-gap{min-width:var(--cx-size-16px);text-align:center;color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));}
|
|
6
|
+
.cx-data-grid .cx-grid-pager .cx-gap{min-width:var(--cx-size-16px);text-align:center;color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));}
|
|
7
7
|
.cx-phone .cx-grid-pager .cx-pages .cx-button{min-width:var(--cx-size-44px);}
|
|
8
8
|
@media (forced-colors:active){
|
|
9
9
|
.cx-data-grid .cx-grid-pager .cx-pages .cx-button[aria-current="page"]{border-color:Highlight;outline:var(--cx-size-2px) solid Highlight;}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
(function(global){"use strict";const installed=new WeakSet();const part={version:"
|
|
1
|
+
(function(global){"use strict";const installed=new WeakSet();const part={version:"cc30dd4f6d3feeb0",install(context){if(installed.has(context.GRID_PAGER_IMPL))return;const{DataGrid,GRID_PAGER_IMPL,h,setText,fill,gridButton,gridOption,numberFormat,gridCountLabel}=context;const BUILD_PAGER=DataGrid.prototype.buildPager,SYNC_PAGER=DataGrid.prototype.syncPager;const PAGER_INFO=["range","sentence","none"];function pagerSettings(view){const pager=view.pager,fail=name=>{throw new Error("CanopyX: invalid pager "+name+".")};if(!pager||typeof pager!=="object"||Array.isArray(pager))fail("settings");const flag=(name,fallback)=>{if(pager[name]!==undefined&&typeof pager[name]!=="boolean")fail(name);return pager[name]===undefined?fallback:pager[name]};const numbers=pager.numbers===undefined?0:pager.numbers;if(!Number.isInteger(numbers)||numbers!==0&&(numbers<5||numbers>15))fail("numbers");if(pager.info!==undefined&&!PAGER_INFO.includes(pager.info))fail("info");let lengths=null;if(pager.lengths!==undefined){if(!Array.isArray(pager.lengths)||!pager.lengths.length||pager.lengths.length>16)fail("lengths");const seen=new Set();lengths=pager.lengths.map(entry=>{const item=entry!==null&&typeof entry==="object"?entry:{value:entry};if(item.value!=="all"&&!(Number.isInteger(item.value)&&item.value>=1&&item.value<=10000)||seen.has(item.value)||
|
|
2
2
|
item.label!==undefined&&(typeof item.label!=="string"||!item.label.trim()||item.label.length>64))fail("lengths");seen.add(item.value);return{value:item.value,label:item.label}}).filter(item=>item.value!=="all"||view.source.kind==="inline")}
|
|
3
3
|
return{lengths,numbers,info:pager.info||"range",lengthMenu:flag("lengthMenu",true),pageInput:flag("pageInput",!numbers),firstLast:flag("firstLast",true)}}
|
|
4
4
|
function pagerWindow(current,count,max){const range=(start,end)=>Array.from({length:Math.max(0,end-start)},(_,index)=>start+index);if(count<=max)return range(0,count);if(current<max-3)return[...range(0,max-2),null,count-1];if(current>count-max+2)return[0,null,...range(count-max+2,count)];const inner=max-4,start=current-Math.floor((inner-1)/ 2);
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
.cx-path-host > .cx-grid{display:none;}
|
|
2
|
-
.cx-path{color:var(--hfx-color-text,light-dark(#16181c,#f2f3f5));font:var(--hfx-weight-regular,400) var(--hfx-type-body-size,0.875rem) var(--hfx-font-sans,"Segoe UI Variable Text","Segoe UI",system-ui,-apple-system,"Helvetica Neue",Arial,sans-serif);min-width:0;min-height:0;flex:1 1 auto;overflow:auto;padding:var(--hfx-space-4,1rem);}
|
|
2
|
+
.cx-path{color:var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)));font:var(--hfx-weight-regular,400) var(--hfx-type-body-size,0.875rem) var(--hfx-font-sans,"Segoe UI Variable Text","Segoe UI",system-ui,-apple-system,"Helvetica Neue",Arial,sans-serif);min-width:0;min-height:0;flex:1 1 auto;overflow:auto;padding:var(--hfx-space-4,1rem);}
|
|
3
3
|
.cx-path-title-heading{font:var(--hfx-weight-semibold,600) var(--hfx-type-heading-size,0.9375rem) var(--hfx-font-sans,"Segoe UI Variable Text","Segoe UI",system-ui,-apple-system,"Helvetica Neue",Arial,sans-serif);line-height:var(--hfx-type-heading-line,1.4);margin:0 0 var(--hfx-space-3,0.75rem);}
|
|
4
|
-
.cx-path-help,.cx-path-empty{margin:var(--hfx-space-2,0.5rem) 0 var(--hfx-space-4,1rem);color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));font-size:var(--hfx-type-caption-size,0.75rem);line-height:var(--hfx-type-body-line,1.5);}
|
|
4
|
+
.cx-path-help,.cx-path-empty{margin:var(--hfx-space-2,0.5rem) 0 var(--hfx-space-4,1rem);color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));font-size:var(--hfx-type-caption-size,0.75rem);line-height:var(--hfx-type-body-line,1.5);}
|
|
5
5
|
.cx-path-chain{min-width:0;margin-bottom:var(--hfx-space-6,2rem);}
|
|
6
6
|
.cx-path-heading{font:var(--hfx-weight-regular,400) var(--hfx-type-body-size,0.875rem) var(--hfx-font-sans,"Segoe UI Variable Text","Segoe UI",system-ui,-apple-system,"Helvetica Neue",Arial,sans-serif);font-size:var(--hfx-type-body-size,0.875rem);font-weight:var(--hfx-weight-semibold,600);margin:0 0 calc(var(--hfx-space-1,0.25rem)*2.5);overflow-wrap:anywhere;}
|
|
7
7
|
.cx-path-hops{display:flex;align-items:stretch;gap:calc(var(--hfx-space-1,0.25rem)*7);margin:0;padding:var(--hfx-space-0-5,2px) var(--hfx-space-0-5,2px) var(--hfx-space-3,0.75rem);list-style:none;overflow-x:auto;}
|
|
8
|
-
.cx-path-hop{position:relative;flex:1 0 calc(var(--hfx-space-1,0.25rem)*50);max-width:calc(var(--hfx-space-1,0.25rem)*70);min-width:0;padding:var(--hfx-space-3,0.75rem);box-sizing:border-box;border:var(--hfx-border-width,1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));border-radius:var(--hfx-radius-control,var(--hfx-radius-md,6px));background:var(--hfx-color-surface,light-dark(#ffffff,#16181c));overflow-wrap:anywhere;}
|
|
8
|
+
.cx-path-hop{position:relative;flex:1 0 calc(var(--hfx-space-1,0.25rem)*50);max-width:calc(var(--hfx-space-1,0.25rem)*70);min-width:0;padding:var(--hfx-space-3,0.75rem);box-sizing:border-box;border:var(--hfx-border-width,1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));border-radius:var(--hfx-radius-control,var(--hfx-radius-md,6px));background:var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));overflow-wrap:anywhere;}
|
|
9
9
|
.cx-path-hop + .cx-path-hop::before{content:"";position:absolute;inset-inline-start:calc(-1 * var(--hfx-space-6,2rem));top:var(--hfx-space-6,2rem);inline-size:var(--hfx-space-5,1.5rem);border-block-start:calc(2 * var(--hfx-border-width,1px)) solid var(--hfx-color-accent,light-dark(#11776f,#37c9b8));}
|
|
10
10
|
.cx-path-hop + .cx-path-hop::after{content:"";position:absolute;inset-inline-start:calc(-1 * var(--hfx-space-3,0.75rem));top:calc(var(--hfx-space-6,2rem) - var(--hfx-space-1,0.25rem));inline-size:var(--hfx-space-2,0.5rem);block-size:var(--hfx-space-2,0.5rem);border-block-start:calc(2 * var(--hfx-border-width,1px)) solid var(--hfx-color-accent,light-dark(#11776f,#37c9b8));border-inline-end:calc(2 * var(--hfx-border-width,1px)) solid var(--hfx-color-accent,light-dark(#11776f,#37c9b8));transform:rotate(45deg);}
|
|
11
|
-
.cx-path-step{display:flex;flex-wrap:wrap;align-items:center;gap:var(--hfx-space-1,0.25rem) var(--hfx-space-2,0.5rem);margin-bottom:var(--hfx-space-2,0.5rem);color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));font-size:var(--hfx-type-caption-size,0.75rem);}
|
|
11
|
+
.cx-path-step{display:flex;flex-wrap:wrap;align-items:center;gap:var(--hfx-space-1,0.25rem) var(--hfx-space-2,0.5rem);margin-bottom:var(--hfx-space-2,0.5rem);color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));font-size:var(--hfx-type-caption-size,0.75rem);}
|
|
12
12
|
.cx-path-endpoint{font-weight:var(--hfx-weight-semibold,600);}
|
|
13
13
|
.cx-path-title{display:block;box-sizing:border-box;width:100%;height:auto;min-height:var(--hfx-control-height-lg,calc(44px - var(--cx-compact,0) * 8px));text-align:start;white-space:normal;overflow-wrap:anywhere;}
|
|
14
14
|
.cx-path-label{margin:var(--hfx-space-2,0.5rem) 0;font-size:var(--hfx-type-caption-size,0.75rem);line-height:var(--hfx-type-body-line,1.5);}
|
|
@@ -29,12 +29,12 @@
|
|
|
29
29
|
.cx-path-hop + .cx-path-hop::before{content:none;}
|
|
30
30
|
.cx-path-title{display:block;box-sizing:border-box;width:100%;height:auto;min-height:var(--hfx-control-height-lg,calc(44px - var(--cx-compact,0) * 8px));text-align:start;white-space:normal;overflow-wrap:anywhere;}
|
|
31
31
|
}
|
|
32
|
-
.cx-path .cx-path-title{color:var(--hfx-color-text,light-dark(#16181c,#f2f3f5));font-weight:var(--hfx-weight-semibold,600);font-size:var(--hfx-type-body-size,0.875rem);line-height:var(--hfx-type-body-line,1.5);padding:0;border:0;border-radius:0;background:transparent;box-shadow:none;justify-content:flex-start;min-height:0;}
|
|
33
|
-
.cx-path .cx-path-title:hover{color:var(--hfx-color-text,light-dark(#16181c,#f2f3f5));background:transparent;text-decoration:underline;}
|
|
32
|
+
.cx-path .cx-path-title{color:var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)));font-weight:var(--hfx-weight-semibold,600);font-size:var(--hfx-type-body-size,0.875rem);line-height:var(--hfx-type-body-line,1.5);padding:0;border:0;border-radius:0;background:transparent;box-shadow:none;justify-content:flex-start;min-height:0;}
|
|
33
|
+
.cx-path .cx-path-title:hover{color:var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)));background:transparent;text-decoration:underline;}
|
|
34
34
|
.cx-path .cx-path-title:focus-visible{outline:var(--hfx-focus-width,2px) solid var(--hfx-color-focus-ring,light-dark(#02726a,#37c9b8));outline-offset:var(--hfx-focus-offset,2px);}
|
|
35
|
-
.cx-path-endpoint{padding:var(--hfx-space-0-5,2px) var(--hfx-space-1-5,6px);border:var(--hfx-border-width,1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));border-radius:var(--hfx-radius-status,999px);color:var(--hfx-color-text,light-dark(#16181c,#f2f3f5));background:var(--hfx-color-surface-sunken,light-dark(#f7f8f9,#111317));}
|
|
35
|
+
.cx-path-endpoint{padding:var(--hfx-space-0-5,2px) var(--hfx-space-1-5,6px);border:var(--hfx-border-width,1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));border-radius:var(--hfx-radius-status,999px);color:var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)));background:var(--hfx-color-surface-sunken,light-dark(#f7f8f9,#111317));}
|
|
36
36
|
.cx-path-disabled{background:var(--hfx-color-surface-sunken,light-dark(#f7f8f9,#111317));border-style:dashed;}
|
|
37
|
-
.cx-path-disabled :is(.cx-path-title,.cx-path-label){color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));}
|
|
37
|
+
.cx-path-disabled :is(.cx-path-title,.cx-path-label){color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));}
|
|
38
38
|
.cx-path-return{display:flex;align-items:center;gap:var(--hfx-space-2,0.5rem);color:var(--hfx-color-accent,light-dark(#11776f,#37c9b8));font-size:var(--hfx-type-caption-size,0.75rem);margin-block-start:var(--hfx-space-3,0.75rem);padding-block:var(--hfx-space-1,0.25rem);}
|
|
39
39
|
.cx-path-return svg{inline-size:var(--hfx-space-6,2rem);block-size:var(--hfx-space-6,2rem);fill:none;stroke:currentColor;stroke-width:2;}
|
|
40
40
|
@media(max-width:640px){
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
(function(global){"use strict";const installed=new WeakSet();const part={version:"
|
|
1
|
+
(function(global){"use strict";const installed=new WeakSet();const part={version:"c6fa2dbab6a0dbaa",install(context){if(installed.has(context.DataGrid.prototype))return;const{DataGrid,h,setText,fill,cellValue,cellText,badgeElement,applyTone,toneOf,PROTOCOL}=context;const PATH_TEXT={pathEmpty:"No paths to show",pathSource:"Source",pathTarget:"Target",pathStep:"Step {number} of {total}",pathCycle:"Cycle",pathForeign:"Foreign",pathDisabled:"Disabled",pathKeys:"Use Tab or arrow keys to browse steps; Enter or Space opens the record.",pathPartial:"Showing {shown} of {total} steps."};const PATH_FLAGS={cycle:"warning",foreign:"info",disabled:"muted"};function pathKeys(value,allowed){if(Object.keys(value).some(key=>!allowed.includes(key)))throw new Error("CanopyX: path settings have an unknown property.")}
|
|
2
2
|
function pathText(value,maximum=Infinity){if(typeof value!=="string"||!value.trim()||value.length>maximum||/[\u0000-\u001f\u007f-\u009f]/.test(value)) return false;
|
|
3
3
|
for(let at=0;at<value.length;at++){const code=value.charCodeAt(at);if(code>=0xd800&&code<=0xdbff){const next=value.charCodeAt(++at);if(!(next>=0xdc00&&next<=0xdfff))return false}
|
|
4
4
|
else if(code>=0xdc00&&code<=0xdfff)return false}
|
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
.cx-pivot-active > :is(.cx-grid,.cx-groupbar,.cx-grid-pager,.cx-grid-status,.cx-grid-summary){display:none !important;}
|
|
2
2
|
.cx-host.cx-pivot-active{min-height:0;}
|
|
3
3
|
body.cx-page > .cx-host.cx-pivot-active,body.cx-page > .cx-main > .cx-host.cx-pivot-active{height:auto;max-height:100dvh;min-height:0;}
|
|
4
|
-
.cx-pivot{display:flex;flex:1 1 auto;min-height:0;flex-direction:column;overflow:hidden;background:var(--hfx-color-surface,light-dark(#ffffff,#16181c));color:var(--hfx-color-text,light-dark(#16181c,#f2f3f5));}
|
|
4
|
+
.cx-pivot{display:flex;flex:1 1 auto;min-height:0;flex-direction:column;overflow:hidden;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)));}
|
|
5
5
|
.cx-pivot[hidden]{display:none;}
|
|
6
|
-
.cx-pivot-zones{display:flex;flex-wrap:wrap;align-items:center;gap:var(--hfx-space-2,0.5rem);padding:calc(var(--hfx-space-1,0.25rem)*2.5) var(--hfx-space-3,0.75rem);border-bottom:var(--hfx-border-width,1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));}
|
|
6
|
+
.cx-pivot-zones{display:flex;flex-wrap:wrap;align-items:center;gap:var(--hfx-space-2,0.5rem);padding:calc(var(--hfx-space-1,0.25rem)*2.5) 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)));}
|
|
7
7
|
.cx-pivot-zone{display:flex;align-items:center;gap:var(--hfx-space-1-5,6px);min-width:0;max-width:100%;}
|
|
8
8
|
.cx-pivot-zone > span:first-child{color:var(--hfx-color-text-secondary,light-dark(#4d525b,#b0b4bc));font-size:var(--hfx-type-caption-size,0.75rem);}
|
|
9
9
|
.cx-pivot-zone .cx-gchip{block-size:var(--hfx-control-height-sm,calc(28px - var(--cx-compact,0) * 4px));max-width:180px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
|
|
10
10
|
.cx-pivot-zone .cx-gchip-name{overflow:hidden;text-overflow:ellipsis;}
|
|
11
11
|
.cx-pivot-scroll{min-height:0;min-width:0;overflow:auto;flex:1 1 auto;}
|
|
12
12
|
.cx-pivot-table{border-collapse:separate;border-spacing:0;font-size:var(--hfx-type-small-size,0.8125rem);width:max-content;min-width:100%;font-variant-numeric:tabular-nums;}
|
|
13
|
-
.cx-pivot-table :is(th,td){padding:calc(var(--hfx-space-1,0.25rem)*1.75) calc(var(--hfx-space-1,0.25rem)*2.5);border-bottom:var(--hfx-border-width,1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));border-right:var(--hfx-border-width,1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));vertical-align:middle;}
|
|
14
|
-
.cx-pivot-table thead th{--cx-pivot-header-layer:1;background:var(--hfx-table-header-background,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));color:var(--hfx-color-text-secondary,light-dark(#4d525b,#b0b4bc));text-align:right;position:sticky;top:0;z-index:var(--cx-pivot-header-layer);}
|
|
13
|
+
.cx-pivot-table :is(th,td){padding:calc(var(--hfx-space-1,0.25rem)*1.75) calc(var(--hfx-space-1,0.25rem)*2.5);border-bottom:var(--hfx-border-width,1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));border-right:var(--hfx-border-width,1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));vertical-align:middle;}
|
|
14
|
+
.cx-pivot-table thead th{--cx-pivot-header-layer:1;background:var(--hfx-table-header-background,var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c))));color:var(--hfx-color-text-secondary,light-dark(#4d525b,#b0b4bc));text-align:right;position:sticky;top:0;z-index:var(--cx-pivot-header-layer);}
|
|
15
15
|
.cx-pivot-table thead th > span{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
|
|
16
|
-
.cx-pivot-table th[scope=row]{text-align:left;white-space:nowrap;padding-left:calc(var(--hfx-space-3,0.75rem) + var(--cx-pivot-depth,0) * var(--hfx-space-6,2rem));position:sticky;left:0;background:var(--hfx-color-surface,light-dark(#ffffff,#16181c));}
|
|
16
|
+
.cx-pivot-table th[scope=row]{text-align:left;white-space:nowrap;padding-left:calc(var(--hfx-space-3,0.75rem) + var(--cx-pivot-depth,0) * var(--hfx-space-6,2rem));position:sticky;left:0;background:var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));}
|
|
17
17
|
.cx-pivot-table td{text-align:right;}
|
|
18
|
-
.cx-pivot-table tbody tr:hover{background:color-mix(in srgb,var(--hfx-color-accent,light-dark(#11776f,#37c9b8)) 5%,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));}
|
|
19
|
-
.cx-pivot-subtotal{font-weight:var(--hfx-weight-semibold,600);background:color-mix(in srgb,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)) 3%,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));}
|
|
20
|
-
.cx-pivot-table tfoot{font-weight:var(--hfx-weight-display,600);position:sticky;bottom:0;background:var(--hfx-color-surface,light-dark(#ffffff,#16181c));}
|
|
18
|
+
.cx-pivot-table tbody tr:hover{background:color-mix(in srgb,var(--hfx-color-accent,light-dark(#11776f,#37c9b8)) 5%,var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c))));}
|
|
19
|
+
.cx-pivot-subtotal{font-weight:var(--hfx-weight-semibold,600);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))));}
|
|
20
|
+
.cx-pivot-table tfoot{font-weight:var(--hfx-weight-display,600);position:sticky;bottom:0;background:var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));}
|
|
21
21
|
.cx-pivot-cell,.cx-pivot-value-menu{border:0;background:transparent;color:inherit;font:inherit;cursor:pointer;padding:var(--hfx-space-0-5,2px) 0;}
|
|
22
22
|
.cx-pivot-cell{width:100%;text-align:right;min-width:72px;}
|
|
23
23
|
.cx-pivot-cell:hover,.cx-pivot-value-menu:hover{color:var(--hfx-color-accent,light-dark(#11776f,#37c9b8));text-decoration:underline;}
|
|
@@ -32,7 +32,7 @@ body.cx-page > .cx-host.cx-pivot-active,body.cx-page > .cx-main > .cx-host.cx-pi
|
|
|
32
32
|
.cx-pivot-editor :is(select,input){min-width:0;}
|
|
33
33
|
.cx-pivot-editor .cx-pivot-setting{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--hfx-space-2,0.5rem);}
|
|
34
34
|
.cx-pivot-setting > :is(span,input){grid-column:1/-1;}
|
|
35
|
-
.cx-pivot-return{padding:var(--hfx-space-2,0.5rem) var(--hfx-space-3,0.75rem);border-bottom:var(--hfx-border-width,1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));}
|
|
35
|
+
.cx-pivot-return{padding:var(--hfx-space-2,0.5rem) 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)));}
|
|
36
36
|
@media (max-width:640px){
|
|
37
37
|
.cx-pivot-zones{gap:var(--hfx-space-1-5,6px);padding:var(--hfx-space-2,0.5rem);}
|
|
38
38
|
.cx-pivot-zone{width:100%;}
|
|
@@ -70,6 +70,6 @@ body.cx-page > .cx-host.cx-pivot-active,body.cx-page > .cx-main > .cx-host.cx-pi
|
|
|
70
70
|
.cx-pivot-table th[scope=row]{position:static;}
|
|
71
71
|
}
|
|
72
72
|
.cx-pivot-column-jump{margin-inline-start:var(--hfx-space-1,0.25rem);}
|
|
73
|
-
.cx-pivot-column-jump::before{content:"
|
|
73
|
+
.cx-pivot-column-jump::before{content:"⇥" / "";}
|
|
74
74
|
.cx-pivot-table thead th:first-child[rowspan]{white-space:nowrap;}
|
|
75
75
|
@media print{.cx-pivot-column-jump{display:none !important;}}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
(function(global){"use strict";const installed=new WeakSet();const part={version:"
|
|
1
|
+
(function(global){"use strict";const installed=new WeakSet();const part={version:"577443c67c7ed719",requires:["grouping","values","buckets"],install(context){if(installed.has(context.GRID_PIVOT))return;const{DataGrid,GRID_PIVOT,GRID_ROWS,GRID_SHOW_AS,GRID_SHOW_AS_MODES,GRID_BUCKETS,GRID_CALCULATIONS,h,setText,fill,gridButton,gridFreeze,gridQuery,gridQueryStart,gridQueryRows,gridScalar,cellValue,cellText,gridKeyCompare,gridOrder,numberFormat,formatting,gridExportSignal,validateGridPage,checkDocument,validStructuralCount,gridOperationActive,pivotDefinition,pivotIntent,pivotRequestOf,showAsMode,showAsCaption,reportingAggregateName,reportingValueText,UI_IMPL,UI_TOOLS}=context;const pivotColumn=(grid,id)=>grid.view.columns.find(column=>column.id===id);function pivotRaw(grid,level,row){const column=pivotColumn(grid,level.column),value=gridScalar(row.cells[column.id],column);return level.bucket?GRID_BUCKETS.key(level.bucket,value):column.kind==="datetime"&&value!==null?new Date(value).toISOString().replace(".000Z","Z"):value}
|
|
2
2
|
function pivotKey(axis,path,levels,grid){return axis+path.map((value,index)=>{const kind=pivotColumn(grid,levels[index].column).kind;const text=value===null?"z":!levels[index].bucket&&kind==="datetime"?"d"+Date.parse(value):
|
|
3
3
|
typeof value==="string"?"s"+value:typeof value==="boolean"?value?"b1":"b0":"n"+String(value);return "|"+text.length+":"+text}).join("")}
|
|
4
4
|
function pivotCompare(grid,levels,left,right){for(let index=0;index<Math.min(left.length,right.length);index++){const level=levels[index],column=level.bucket?{kind:"number"}:pivotColumn(grid,level.column);const scalar=value=>!level.bucket&&column.kind==="datetime"&&value!==null?Date.parse(value):value;const compare=gridKeyCompare(scalar(left[index]),scalar(right[index]),column,level.direction);if(compare)return compare}
|
|
@@ -45,7 +45,7 @@ catch(error){pivotIntent(this).active=false;this.render();this.emit("error",{err
|
|
|
45
45
|
function pivotVisible(nodes,collapsed,leavesOnly){const byKey=new Map(nodes.map(node=>[node.key,node])),closed=new Set(collapsed);return nodes.filter(node=>{if(!node.parent)return false;let parent=byKey.get(node.parent);while(parent){if(closed.has(parent.key))return false;parent=byKey.get(parent.parent)}
|
|
46
46
|
return!leavesOnly||closed.has(node.key)||!nodes.some(child=>child.parent===node.key)})}
|
|
47
47
|
function pivotToggle(grid,node,axis){const state=pivotIntent(grid),collapsed=state[axis==="rows"?"collapsedRows":"collapsedColumns"].includes(node.key);const button=gridButton(collapsed?"▸":"▾",()=>grid.setPivotCollapsed(axis,node.key,!collapsed));button.classList.add("cx-pivot-collapse");button.setAttribute("aria-label",(collapsed?grid.labels.gridGroupExpand:grid.labels.gridGroupCollapse)+ ": "+pivotLabel(grid,state,axis,node));button.setAttribute("aria-expanded",String(!collapsed));button.dataset.pivotFocus=axis+":"+node.key;return button}
|
|
48
|
-
DataGrid.prototype.renderPivot=function(){if(!this.pivotPanel||this.pivotPanel.hidden||!pivotIntent(this)?.active||!this.pivotResult||this.destroyed)return;this.updateGridPhone();const state=pivotIntent(this),result=this.pivotResult,phone=this.host.clientWidth<=640,active=document.activeElement;const hadFocus=this.pivotPanel.contains(active),focus=hadFocus?active.dataset.pivotFocus:null;const columns=pivotVisible(result.columns,state.collapsedColumns,true),rows=pivotVisible(result.rows,state.collapsedRows,false),totalColumn=result.columns[0];const aggregates=state.values.map(id=>this.view.reporting.aggregates.find(value=>value.id===id));const zones=this.pivotZones(),displayedColumns=[...columns,totalColumn];this.pivotPanel.dataset.phone=String(phone);if(this.pivotButton)setText(this.pivotButton,phone?this.labels.gridPivotConfigure:this.labels.gridPivot);const scroll=h("div","cx-pivot-scroll"),table=h("table","cx-pivot-table"),caption=h("caption","cx-pivot-description");const describe=axis=>state[axis].map(level=>pivotColumn(this,level.column).title).join(" / ");setText(caption,this.view.label+" · "+describe("rows")+(state.columns.length?" × "+describe("columns"):"")+ " · "+aggregates.map(value=>reportingAggregateName(this,value)).join(", "));table.append(caption);scroll.tabIndex=0;scroll.setAttribute("aria-label",this.labels.gridPivot);const head=h("thead"),axisDepth=Math.max(1,state.columns.length),leading=h("th");leading.scope="col";leading.rowSpan=axisDepth+1;setText(leading,describe("rows")||this.view.label);const jump=gridButton("",()=>this.openPivotColumnMenu(jump).catch(error=>this.emit("error",{error})));jump.classList.add("cx-pivot-column-jump");jump.dataset.size="sm";jump.dataset.pivotFocus="column-picker";jump.setAttribute("aria-label",this.labels.gridPivotColumn);jump.setAttribute("aria-haspopup","menu");jump.title=this.labels.gridPivotColumn;leading.append(jump);const ancestor=(node,depth)=>{while(node.path.length>depth)node=result.columns.find(parent=>parent.key===node.parent);return node};for(let depth=0;depth<axisDepth;depth++){const row=h("tr");if(!depth)row.append(leading);for(let index=0;index<displayedColumns.length;){const column=displayedColumns[index];if(depth&&column.path.length<=depth){index++;continue}
|
|
48
|
+
DataGrid.prototype.renderPivot=function(){if(!this.pivotPanel||this.pivotPanel.hidden||!pivotIntent(this)?.active||!this.pivotResult||this.destroyed)return;this.updateGridPhone();const state=pivotIntent(this),result=this.pivotResult,phone=this.host.clientWidth<=640,active=document.activeElement;const editorExit=this.reportingText?.querySelector(".cx-pivot-editor-flat");if(editorExit)editorExit.hidden=!state.active||!phone;const hadFocus=this.pivotPanel.contains(active),focus=hadFocus?active.dataset.pivotFocus:null;const columns=pivotVisible(result.columns,state.collapsedColumns,true),rows=pivotVisible(result.rows,state.collapsedRows,false),totalColumn=result.columns[0];const aggregates=state.values.map(id=>this.view.reporting.aggregates.find(value=>value.id===id));const zones=this.pivotZones(),displayedColumns=[...columns,totalColumn];this.pivotPanel.dataset.phone=String(phone);if(this.pivotButton)setText(this.pivotButton,phone?this.labels.gridPivotConfigure:this.labels.gridPivot);const scroll=h("div","cx-pivot-scroll"),table=h("table","cx-pivot-table"),caption=h("caption","cx-pivot-description");const describe=axis=>state[axis].map(level=>pivotColumn(this,level.column).title).join(" / ");setText(caption,this.view.label+" · "+describe("rows")+(state.columns.length?" × "+describe("columns"):"")+ " · "+aggregates.map(value=>reportingAggregateName(this,value)).join(", "));table.append(caption);scroll.tabIndex=0;scroll.setAttribute("aria-label",this.labels.gridPivot);const head=h("thead"),axisDepth=Math.max(1,state.columns.length),leading=h("th");leading.scope="col";leading.rowSpan=axisDepth+1;setText(leading,describe("rows")||this.view.label);const jump=gridButton("",()=>this.openPivotColumnMenu(jump).catch(error=>this.emit("error",{error})));jump.classList.add("cx-pivot-column-jump");jump.dataset.size="sm";jump.dataset.pivotFocus="column-picker";jump.setAttribute("aria-label",this.labels.gridPivotColumn);jump.setAttribute("aria-haspopup","menu");jump.title=this.labels.gridPivotColumn;leading.append(jump);const ancestor=(node,depth)=>{while(node.path.length>depth)node=result.columns.find(parent=>parent.key===node.parent);return node};for(let depth=0;depth<axisDepth;depth++){const row=h("tr");if(!depth)row.append(leading);for(let index=0;index<displayedColumns.length;){const column=displayedColumns[index];if(depth&&column.path.length<=depth){index++;continue}
|
|
49
49
|
const group=ancestor(column,depth+1);let end=index+1;while(end<displayedColumns.length&&ancestor(displayedColumns[end],depth+1).key===group.key)end++;const th=h("th"),label=h("span");th.scope="colgroup";th.colSpan=(end-index)*aggregates.length;th.rowSpan=group.path.length<axisDepth?axisDepth-depth:1;setText(label,pivotLabel(this,state,"columns",group,false));label.title=pivotLabel(this,state,"columns",group);if(group.parent&&result.columns.some(child=>child.parent===group.key))th.append(pivotToggle(this,group,"columns"));th.append(label);row.append(th);index=end}
|
|
50
50
|
head.append(row)}
|
|
51
51
|
const measures=h("tr");for(const column of displayedColumns)for(const aggregate of aggregates){const th=h("th"),value=h("button","cx-pivot-value-menu");th.scope="col";th.dataset.pivotColumn=column.key;setText(value,reportingAggregateName(this,aggregate));value.type="button";value.title=this.labels.gridShowAs;value.dataset.pivotFocus="value:"+column.key+":"+aggregate.id;value.addEventListener("click",()=>this.pivotValueMenu(aggregate,value));th.append(value);const mode=showAsMode(this,aggregate);if(mode!=="value"){const label=h("span","cx-pivot-caption");setText(label,showAsCaption(this,mode));th.append(label)}
|
|
@@ -60,7 +60,7 @@ select.value=showAsMode(this,aggregate);const apply=gridButton(this.labels.gridA
|
|
|
60
60
|
{kind,edges:width.value.split(",").map(value=>value.trim()?Number(value):NaN)}:{kind,timeZone:current?.bucket?.timeZone||"UTC",firstWeekday:current?.bucket?.firstWeekday??1};return{column:column.value,direction:direction.value,...(spec?{bucket:spec}:{})}})}
|
|
61
61
|
form.append(group)}
|
|
62
62
|
const group=h("fieldset"),legend=h("legend");setText(legend,this.labels.gridPivotValues);group.append(legend);for(const aggregate of this.view.reporting.aggregates){const label=h("label"),check=h("input"),text=h("span");check.type="checkbox";check.className="cx-check";check.checked=initial.values.includes(aggregate.id);setText(text,reportingAggregateName(this,aggregate));label.append(check,text);group.append(label);values.push(()=>check.checked?aggregate.id:null)}
|
|
63
|
-
const topLabel=h("label","cx-pivot-setting"),topText=h("span"),top=h("input","cx-input");top.type="number";top.placeholder="1–200";top.min="1";top.max="200";top.value=initial.topNColumns===undefined?"":String(initial.topNColumns);setText(topText,this.labels.gridPivotTopN);topLabel.append(topText,top);top.setAttribute("aria-label",this.labels.gridPivotTopN);const sortLabel=h("label","cx-pivot-setting"),sortText=h("span"),sort=h("select","cx-input"),descending=h("select","cx-input");setText(sortText,this.labels.gridPivotSort);option(sort,"",this.labels.gridGroupSortValue);for(const aggregate of this.view.reporting.aggregates)option(sort,aggregate.id,reportingAggregateName(this,aggregate));sort.value=initial.sortByTotal?.aggregate||"";sort.setAttribute("aria-label",this.labels.gridPivotSort);option(descending,"desc",this.labels.gridSortDescending);option(descending,"asc",this.labels.gridSortAscending);descending.value=initial.sortByTotal?.direction||"desc";sortLabel.append(sortText,sort,descending);const error=h("p","cx-pivot-note");error.setAttribute("role","alert");error.hidden=true;const apply=gridButton(this.labels.gridApply,()=>{});apply.type="submit";apply.dataset.variant="primary";const flat=gridButton(this.labels.gridPivotFlat,()=>{this.reportingText?._cxOverlay.close();this.setPivot(false).catch(error=>this.emit("error",{error}))});flat.hidden=!state?.active;form.append(group,topLabel,sortLabel,flat,error,apply);for(const select of form.querySelectorAll("select")){const title=()=>{select.title=select.selectedOptions[0]?.textContent||""};title();select.addEventListener("change",title)}
|
|
63
|
+
const topLabel=h("label","cx-pivot-setting"),topText=h("span"),top=h("input","cx-input");top.type="number";top.placeholder="1–200";top.min="1";top.max="200";top.value=initial.topNColumns===undefined?"":String(initial.topNColumns);setText(topText,this.labels.gridPivotTopN);topLabel.append(topText,top);top.setAttribute("aria-label",this.labels.gridPivotTopN);const sortLabel=h("label","cx-pivot-setting"),sortText=h("span"),sort=h("select","cx-input"),descending=h("select","cx-input");setText(sortText,this.labels.gridPivotSort);option(sort,"",this.labels.gridGroupSortValue);for(const aggregate of this.view.reporting.aggregates)option(sort,aggregate.id,reportingAggregateName(this,aggregate));sort.value=initial.sortByTotal?.aggregate||"";sort.setAttribute("aria-label",this.labels.gridPivotSort);option(descending,"desc",this.labels.gridSortDescending);option(descending,"asc",this.labels.gridSortAscending);descending.value=initial.sortByTotal?.direction||"desc";sortLabel.append(sortText,sort,descending);const error=h("p","cx-pivot-note");error.setAttribute("role","alert");error.hidden=true;const apply=gridButton(this.labels.gridApply,()=>{});apply.type="submit";apply.dataset.variant="primary";const flat=gridButton(this.labels.gridPivotFlat,()=>{this.reportingText?._cxOverlay.close();this.setPivot(false).catch(error=>this.emit("error",{error}))});flat.classList.add("cx-pivot-editor-flat");flat.hidden=!state?.active||this.host.clientWidth>640;form.append(group,topLabel,sortLabel,flat,error,apply);for(const select of form.querySelectorAll("select")){const title=()=>{select.title=select.selectedOptions[0]?.textContent||""};title();select.addEventListener("change",title)}
|
|
64
64
|
form.addEventListener("submit",event=>{event.preventDefault();try{const definition=pivotDefinition(this.view,{rows:axes.rows.map(read=>read()).filter(Boolean),columns:axes.columns.map(read=>read()).filter(Boolean),values:values.map(read=>read()).filter(Boolean),maxColumns:initial.maxColumns,...(top.value.trim()?{topNColumns:Number(top.value)}:{}),...(sort.value?{sortByTotal:{aggregate:sort.value,direction:descending.value}}:{})});this.reportingText?._cxOverlay.close();this.setPivot(definition).catch(error=>this.emit("error",{error}))}catch(_){error.hidden=false;setText(error,this.labels.gridPivotInvalid)}});this.showReportingText({...this.view.columns[0],title:this.labels.gridPivotConfigure},"",button,undefined,false,form)};function pivotExportAxis(nodes,collapsed){const children=new Map(),ordered=[],closed=new Set(collapsed);for(const node of nodes)if(node.parent){if(!children.has(node.parent))children.set(node.parent,[]);children.get(node.parent).push(node)}
|
|
65
65
|
const visit=(node,hidden)=>{const descendants=children.get(node.key)||[];ordered.push({node,axisKey:node.key,outlineLevel:Math.max(0,node.path.length-1),summary:!node.parent||!!descendants.length,grandTotal:!node.parent,collapsed:closed.has(node.key),hidden});for(const child of descendants)visit(child,hidden||closed.has(node.key))};visit(nodes[0],false);return ordered.slice(1).concat(ordered.slice(0,1))}
|
|
66
66
|
DataGrid.prototype.pivotExport=function(){const state=pivotIntent(this),result=this.pivotResult;if(!state?.active||!result||this.pendingQuery)throw new Error("CanopyX: export needs an accepted pivot.");const aggregates=state.values.map(id=>this.view.reporting.aggregates.find(value=>value.id===id)),columns=[{id:"axis",title:this.labels.gridPivotRows,kind:"text"}];const selected=pivotExportAxis(result.columns,state.collapsedColumns),rowAxis=pivotExportAxis(result.rows,state.collapsedRows),rows=[],columnGroups=[];selected.forEach(({node,...presentation},ci)=>aggregates.forEach((aggregate,ai)=>columns.push({id:"v"+ci+"_"+ai,title:pivotLabel(this,state,"columns",node)+ ": "+reportingAggregateName(this,aggregate),kind:"number",aggregate:aggregate.id,...presentation})));selected.forEach(({node,collapsed,hidden},index)=>{if(!node.parent||!selected.some(item=>item.node.parent===node.key))return;let end=index+1;while(end<selected.length&&selected[end].node.path.length>node.path.length)end++;columnGroups.push({key:node.key,...(node.parent==="c"?{}:{parent:node.parent}),firstColumn:1 +(index+1)*aggregates.length,columnCount:(end-index-1)*aggregates.length,depth:node.path.length,collapsed,hidden})});for(const{node,...presentation}of rowAxis){const cells={axis:{value:pivotLabel(this,state,"rows",node,false),text:pivotLabel(this,state,"rows",node,false)}};selected.forEach(({node:column},ci)=>aggregates.forEach((aggregate,ai)=>{const display=pivotDisplay(this,result,node.key,column.key,aggregate);cells["v"+ci+"_"+ai]={...display,text:display.value===null?"":reportingValueText(this,aggregate,display.value,display.mode)}}));rows.push({id:"p"+rows.length,...presentation,cells})}
|
|
@@ -1,47 +1,52 @@
|
|
|
1
|
-
.cx-plan-legend{display:flex;flex-wrap:wrap;gap:var(--hfx-space-2,0.5rem) var(--hfx-space-4,1rem);padding:calc(var(--hfx-space-1,0.25rem)*1.75) var(--hfx-space-3,0.75rem);border-bottom:var(--hfx-border-width,1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));font-size:var(--hfx-type-caption-size,0.75rem);color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));}
|
|
1
|
+
.cx-plan-legend{display:flex;flex-wrap:wrap;gap:var(--hfx-space-2,0.5rem) var(--hfx-space-4,1rem);padding:calc(var(--hfx-space-1,0.25rem)*1.75) 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)));font-size:var(--hfx-type-caption-size,0.75rem);color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));}
|
|
2
2
|
[data-cx-calendar-view]:not([data-cx-calendar-view="timeline"]) .cx-plan-legend{display:none;}
|
|
3
3
|
.cx-plan-legend > span{display:inline-flex;align-items:center;gap:var(--hfx-space-1-5,6px);white-space:nowrap;}
|
|
4
4
|
.cx-plan-legend i{display:inline-block;box-sizing:border-box;width:calc(var(--hfx-space-1,0.25rem)*4.5);height:var(--hfx-space-2,0.5rem);}
|
|
5
5
|
.cx-plan-key-critical{border:var(--hfx-border-width,1px) solid var(--hfx-color-status-bad-fg,light-dark(#b8292a,#f47171));border-radius:var(--hfx-radius-control,var(--hfx-radius-md,6px));}
|
|
6
|
-
.cx-plan-key-baseline{border-bottom:calc(var(--hfx-space-1,0.25rem)*0.75) solid var(--hfx-color-text-muted,light-dark(#626770,#8f949d));}
|
|
7
|
-
.cx-plan-key-dependency{border-bottom:var(--hfx-border-width,1px) solid var(--hfx-color-text,light-dark(#16181c,#f2f3f5));position:relative;}
|
|
8
|
-
.cx-plan-key-dependency::after{content:"";position:absolute;right:0;bottom:calc(var(--hfx-space-1,0.25rem)*-0.75);border:solid var(--hfx-color-text,light-dark(#16181c,#f2f3f5));border-width:0 calc(var(--hfx-space-1,0.25rem)*0.25) calc(var(--hfx-space-1,0.25rem)*0.25) 0;padding:var(--hfx-space-0-5,2px);transform:rotate(-45deg);}
|
|
6
|
+
.cx-plan-key-baseline{border-bottom:calc(var(--hfx-space-1,0.25rem)*0.75) solid var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));}
|
|
7
|
+
.cx-plan-key-dependency{border-bottom:var(--hfx-border-width,1px) solid var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)));position:relative;}
|
|
8
|
+
.cx-plan-key-dependency::after{content:"";position:absolute;right:0;bottom:calc(var(--hfx-space-1,0.25rem)*-0.75);border:solid var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)));border-width:0 calc(var(--hfx-space-1,0.25rem)*0.25) calc(var(--hfx-space-1,0.25rem)*0.25) 0;padding:var(--hfx-space-0-5,2px);transform:rotate(-45deg);}
|
|
9
9
|
.cx-plan-critical{border-color:var(--hfx-color-status-bad-fg,light-dark(#b8292a,#f47171));outline:var(--hfx-border-width,1px) solid var(--hfx-color-status-bad-fg,light-dark(#b8292a,#f47171));}
|
|
10
10
|
.cx-plan-conflict,.cx-plan-proposal-conflict{outline:var(--hfx-border-width,1px) dashed var(--hfx-color-status-bad-fg,light-dark(#b8292a,#f47171));outline-offset:calc(var(--hfx-space-1,0.25rem)*0.25);}
|
|
11
11
|
.cx-plan .cx-tl-lane .cx-plan-milestone{overflow:visible!important;min-width:calc(var(--hfx-space-1,0.25rem)*3.5)!important;width:calc(var(--hfx-space-1,0.25rem)*3.5)!important;margin-inline-start:calc(var(--hfx-space-1,0.25rem)*-1.75);padding:0;border:0!important;background:transparent!important;box-shadow:none;}
|
|
12
12
|
.cx-plan .cx-tl-lane .cx-plan-milestone::before{content:"";position:absolute;width:var(--hfx-space-3,0.75rem);height:var(--hfx-space-3,0.75rem);margin-top:0;background:var(--hfx-color-accent,light-dark(#11776f,#37c9b8));transform:rotate(45deg);inset-inline-start:calc(var(--hfx-space-1,0.25rem)*0.25);top:calc(50% - var(--hfx-space-1-5,6px));}
|
|
13
13
|
.cx-plan-milestone > *{visibility:hidden;}
|
|
14
|
-
.cx-plan-milestone:focus-visible::before{outline:var(--hfx-border-width,1px) solid var(--hfx-color-text,light-dark(#16181c,#f2f3f5));outline-offset:calc(var(--hfx-space-1,0.25rem)*0.75);}
|
|
15
|
-
.cx-plan-baseline{position:absolute;height:calc(var(--hfx-space-1,0.25rem)*0.75);background:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));border-radius:var(--hfx-radius-control,var(--hfx-radius-md,6px));pointer-events:none;}
|
|
14
|
+
.cx-plan-milestone:focus-visible::before{outline:var(--hfx-border-width,1px) solid var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)));outline-offset:calc(var(--hfx-space-1,0.25rem)*0.75);}
|
|
15
|
+
.cx-plan-baseline{position:absolute;height:calc(var(--hfx-space-1,0.25rem)*0.75);background:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));border-radius:var(--hfx-radius-control,var(--hfx-radius-md,6px));pointer-events:none;}
|
|
16
16
|
.cx-plan-links{position:absolute;inset:0;pointer-events:none;overflow:hidden;}
|
|
17
17
|
.cx-plan-task > .cx-cal-ev-title{line-height:var(--hfx-type-small-line,1.4);}
|
|
18
|
-
.cx-plan-links path{stroke:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));stroke-width:1.5;fill:none;}
|
|
18
|
+
.cx-plan-links path{stroke:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));stroke-width:1.5;fill:none;}
|
|
19
19
|
.cx-plan-links .cx-plan-link-critical{stroke:var(--hfx-color-status-bad-fg,light-dark(#b8292a,#f47171));stroke-width:2;}
|
|
20
20
|
.cx-plan-links .cx-plan-link-conflict{stroke:var(--hfx-color-status-bad-fg,light-dark(#b8292a,#f47171));stroke-dasharray:4 3;}
|
|
21
|
-
.cx-plan-proposal{position:absolute;top:var(--hfx-space-0-5,2px);height:calc(100% - var(--hfx-space-1,0.25rem));box-sizing:border-box;border:var(--hfx-border-width,1px) dashed var(--hfx-color-accent,light-dark(#11776f,#37c9b8));color:var(--hfx-color-text,light-dark(#16181c,#f2f3f5));background:color-mix(in srgb,var(--hfx-color-accent,light-dark(#11776f,#37c9b8)) 18%,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));padding:0 var(--hfx-space-1,0.25rem);overflow:hidden;white-space:nowrap;pointer-events:none;}
|
|
22
|
-
.cx-plan-proposal-invalid{border-color:var(--hfx-color-status-bad-fg,light-dark(#b8292a,#f47171));background:color-mix(in srgb,var(--hfx-color-status-bad-fg,light-dark(#b8292a,#f47171)) 18%,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));}
|
|
21
|
+
.cx-plan-proposal{position:absolute;top:var(--hfx-space-0-5,2px);height:calc(100% - var(--hfx-space-1,0.25rem));box-sizing:border-box;border:var(--hfx-border-width,1px) dashed var(--hfx-color-accent,light-dark(#11776f,#37c9b8));color:var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)));background:color-mix(in srgb,var(--hfx-color-accent,light-dark(#11776f,#37c9b8)) 18%,var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c))));padding:0 var(--hfx-space-1,0.25rem);overflow:hidden;white-space:nowrap;pointer-events:none;}
|
|
22
|
+
.cx-plan-proposal-invalid{border-color:var(--hfx-color-status-bad-fg,light-dark(#b8292a,#f47171));background:color-mix(in srgb,var(--hfx-color-status-bad-fg,light-dark(#b8292a,#f47171)) 18%,var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c))));}
|
|
23
23
|
.cx-plan-print table{width:100%;border-collapse:collapse;font-size:var(--hfx-type-caption-size,0.75rem);}
|
|
24
|
-
.cx-plan-print th,.cx-plan-print td{padding:calc(var(--hfx-space-1,0.25rem)*1.25);border:var(--hfx-border-width,1px) solid var(--hfx-color-border,light-dark(#e2e4e7,#272a30));text-align:start;overflow-wrap:anywhere;}
|
|
24
|
+
.cx-plan-print th,.cx-plan-print td{padding:calc(var(--hfx-space-1,0.25rem)*1.25);border:var(--hfx-border-width,1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));text-align:start;overflow-wrap:anywhere;}
|
|
25
25
|
.cx-plan-print caption{text-align:start;font-weight:var(--hfx-weight-semibold,600);padding-bottom:var(--hfx-space-1-5,6px);}
|
|
26
26
|
@media print{.cx-plan-links,.cx-plan-proposal{display:none!important;}.cx-plan-print{display:block!important;}}
|
|
27
27
|
.cx-plan-critical.cx-plan-milestone::before{background:var(--hfx-color-status-bad-fg,light-dark(#b8292a,#f47171));}
|
|
28
28
|
.cx-plan .cx-tl-main{overflow:auto;}
|
|
29
|
+
.cx-plan .cx-tl-tree.cx-host > .cx-grid{overflow-x:auto;}
|
|
30
|
+
.cx-plan .cx-tl-canvas{padding-block-end:var(--hfx-space-3,0.75rem);}
|
|
31
|
+
.cx-plan .cx-plan-milestone.cx-plan-conflict{outline:0;}
|
|
32
|
+
.cx-plan .cx-plan-milestone.cx-plan-conflict::before{outline:var(--hfx-border-width,1px) dashed var(--hfx-color-status-bad-fg,light-dark(#b8292a,#f47171));outline-offset:var(--hfx-border-width,1px);}
|
|
33
|
+
.cx-plan .cx-plan-milestone.cx-plan-conflict: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);}
|
|
29
34
|
.cx-plan .cx-tl-now{background:var(--hfx-color-accent,light-dark(#11776f,#37c9b8));}
|
|
30
35
|
.cx-plan-today{position:absolute;inset-block-start:0;transform:translateX(-50%);padding:var(--hfx-space-1,0.25rem) var(--hfx-space-2,0.5rem);border-radius:var(--hfx-radius-control,var(--hfx-radius-md,6px));background:var(--hfx-color-accent,light-dark(#11776f,#37c9b8));color:var(--hfx-color-accent-contrast,light-dark(#ffffff,#0c0d10));font-size:var(--hfx-type-caption-size,0.75rem);font-weight:var(--hfx-weight-semibold,600);}
|
|
31
36
|
.cx-plan-key-conflict{border:var(--hfx-border-width,1px) dashed var(--hfx-color-status-bad-fg,light-dark(#b8292a,#f47171));border-radius:var(--hfx-radius-control,var(--hfx-radius-md,6px));}
|
|
32
37
|
.cx-plan .cx-tl-lane .cx-plan-label-outside{overflow:visible;}
|
|
33
|
-
.cx-plan .cx-tl-lane .cx-plan-label-outside > .cx-cal-ev-title{--cx-plan-label-layer:
|
|
34
|
-
.cx-plan-links path{pointer-events:stroke;stroke:var(--hfx-color-text,light-dark(#16181c,#f2f3f5));stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
|
|
38
|
+
.cx-plan .cx-tl-lane .cx-plan-label-outside > .cx-cal-ev-title{--cx-plan-label-layer:2;display:block;position:absolute;z-index:var(--cx-plan-label-layer);inset-inline-start:calc(100% + var(--hfx-space-2,0.5rem));max-inline-size:calc(var(--hfx-space-1,0.25rem) * 40);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));background:var(--hfx-color-surface-card,var(--hfx-color-surface,light-dark(#ffffff,#16181c)));font-weight:var(--hfx-weight-semibold,600);visibility:visible;}
|
|
39
|
+
.cx-plan-links path{pointer-events:stroke;stroke:var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)));stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
|
|
35
40
|
.cx-plan-links path:hover{stroke:var(--hfx-color-accent,light-dark(#11776f,#37c9b8));stroke-width:3;}
|
|
36
41
|
.cx-plan-agenda{display:none;box-sizing:border-box;height:100%;min-height:0;padding:var(--hfx-space-3,0.75rem);flex-direction:column;}
|
|
37
42
|
.cx-plan-agenda-scroll{flex:1 1 auto;min-height:0;overflow:auto;}
|
|
38
43
|
.cx-plan-agenda-list{display:flow-root;}
|
|
39
44
|
.cx-plan-agenda h3{font-size:var(--hfx-type-body-size,0.875rem);margin:var(--hfx-space-3,0.75rem) 0;font-weight:var(--hfx-weight-semibold,600);}
|
|
40
45
|
.cx-plan-agenda ul{list-style:none;margin:0;padding:0;}
|
|
41
|
-
.cx-plan-agenda li{padding:var(--hfx-space-3,0.75rem);margin-block-end:var(--hfx-space-2,0.5rem);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));}
|
|
42
|
-
.cx-plan-agenda .cx-plan-agenda-title{height:auto;min-height:0;padding:0;border:0;box-shadow:none;background:transparent;color:var(--hfx-color-text,light-dark(#16181c,#f2f3f5));font-weight:var(--hfx-weight-semibold,600);white-space:normal;text-align:start;}
|
|
46
|
+
.cx-plan-agenda li{padding:var(--hfx-space-3,0.75rem);margin-block-end:var(--hfx-space-2,0.5rem);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));}
|
|
47
|
+
.cx-plan-agenda .cx-plan-agenda-title{height:auto;min-height:0;padding:0;border:0;box-shadow:none;background:transparent;color:var(--hfx-color-text-primary,var(--hfx-color-text,light-dark(#16181c,#f2f3f5)));font-weight:var(--hfx-weight-semibold,600);white-space:normal;text-align:start;}
|
|
43
48
|
.cx-plan-agenda p{margin:var(--hfx-space-2,0.5rem) 0 0;font-size:var(--hfx-type-caption-size,0.75rem);line-height:var(--hfx-type-body-line,1.5);}
|
|
44
|
-
.cx-plan-agenda-meta{color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));}
|
|
49
|
+
.cx-plan-agenda-meta{color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));}
|
|
45
50
|
.cx-plan-agenda-critical{border-inline-start-color:var(--hfx-color-status-bad-fg,light-dark(#b8292a,#f47171))!important;}
|
|
46
51
|
.cx-cal-phone .cx-plan-calendar .cx-plan{display:none;}
|
|
47
52
|
.cx-cal-phone .cx-plan-agenda{display:flex;}
|
|
@@ -49,8 +54,10 @@
|
|
|
49
54
|
@media print{.cx-plan-agenda{display:none;}}
|
|
50
55
|
.cx-plan .cx-tl-lane .cx-plan-label-outside > .cx-cal-ev-title{display:block!important;visibility:visible!important;}
|
|
51
56
|
.cx-plan .cx-tl-lane .cx-plan-label-before > .cx-cal-ev-title{inset-inline-start:auto;inset-inline-end:calc(100% + var(--hfx-space-2,0.5rem));}
|
|
52
|
-
.cx-plan-
|
|
57
|
+
.cx-plan .cx-tl-lane .cx-plan-milestone.cx-plan-label-outside > .cx-cal-ev-title{inset-block-start:var(--hfx-border-width,1px);inset-inline-start:calc(100% + var(--hfx-space-3,0.75rem));}
|
|
58
|
+
.cx-plan .cx-tl-lane .cx-plan-milestone.cx-plan-label-before > .cx-cal-ev-title{inset-inline-start:auto;inset-inline-end:calc(100% + var(--hfx-space-3,0.75rem));}
|
|
59
|
+
.cx-plan-agenda-pager{display:flex;flex:none;align-items:center;justify-content:space-between;gap:var(--hfx-space-2,0.5rem);border-block-start:var(--hfx-border-width,1px) solid var(--hfx-color-surface-line,var(--hfx-color-border,light-dark(#e2e4e7,#272a30)));padding-block-start:var(--hfx-space-2,0.5rem);}
|
|
53
60
|
.cx-plan-agenda [hidden]{display:none;}
|
|
54
61
|
.cx-plan-agenda .cx-plan-resource-toggle{padding:0;border:0;min-height:0;height:auto;background:transparent;font:inherit;color:inherit;}
|
|
55
|
-
.cx-plan-agenda-count{margin-inline-start:var(--hfx-space-2,0.5rem);color:var(--hfx-color-text-muted,light-dark(#626770,#8f949d));font-size:var(--hfx-type-caption-size,0.75rem);}
|
|
62
|
+
.cx-plan-agenda-count{margin-inline-start:var(--hfx-space-2,0.5rem);color:var(--hfx-color-text-secondary,var(--hfx-color-text-muted,light-dark(#626770,#8f949d)));font-size:var(--hfx-type-caption-size,0.75rem);}
|
|
56
63
|
.cx-plan .cx-tl-lane .cx-plan-task{z-index:auto;}
|