@antglobal/copilot-cards-web 1.0.7 → 1.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +79 -1
- package/dist/index.d.ts +24 -1
- package/dist/index.js +867 -145
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getBuiltinIcon, cloneJsonData, createLifecycleManager, materializeCard, findAffectedRepeatOwners, createA2UIParameterResolver, createExpressionContext, replaceRootContents, resolveA2UIDeep, resolveDeep, resolveExpressionValue, resolveActionRef, isBoundRenderTreeNode, hasExpression, resolveExpression, runActionSteps, normalizeSchema, validateSchema, requiresBindingMaterialization, parseSchema, StreamingParser, StreamingEngine, bindingTopologyFingerprint, findTemplateRepeatOwners, extractPartialSchema, runActionStep, registry } from '@antglobal/copilot-cards-core';
|
|
1
|
+
import { getBuiltinIcon, cloneJsonData, createLifecycleManager, materializeCard, findAffectedRepeatOwners, createA2UIParameterResolver, createExpressionContext, replaceRootContents, getByJsonPointer, resolveA2UIDeep, resolveDeep, resolveExpressionValue, resolveActionRef, isBoundRenderTreeNode, hasExpression, resolveExpression, runActionSteps, normalizeSchema, validateSchema, requiresBindingMaterialization, parseSchema, StreamingParser, StreamingEngine, bindingTopologyFingerprint, findTemplateRepeatOwners, extractPartialSchema, runActionStep, registry } from '@antglobal/copilot-cards-core';
|
|
2
2
|
export { ActionRegistry, a2uiComponentToElement, a2uiToCommand, convertLegacySchema, createLifecycleManager, hasExpression, isA2UIEnvelope, isLegacySchema, normalizeSchema, parseSchema, registerActionHandler, registry, resolveActionRef, resolveDeep, resolveExpression, resolveExpressionValue, runActionStep, runActionSteps, validateSchema } from '@antglobal/copilot-cards-core';
|
|
3
3
|
import * as echarts from 'echarts/core';
|
|
4
4
|
import { LineChart, BarChart, PieChart, ScatterChart, FunnelChart, HeatmapChart } from 'echarts/charts';
|
|
@@ -763,9 +763,33 @@ const CAROUSEL_HOST_PRESENTATION_OWNERSHIP = {
|
|
|
763
763
|
attributes: [CAROUSEL_SCROLL_ID_ATTRIBUTE],
|
|
764
764
|
styleProperties: Object.keys(carouselHostStyles(0)).map(toCSSPropertyName),
|
|
765
765
|
};
|
|
766
|
+
function getNonDefaultSlotKeys(props) {
|
|
767
|
+
const slots = props.slots;
|
|
768
|
+
return slots
|
|
769
|
+
? Object.keys(slots).filter(key => key !== SLOT_LAYOUT.DEFAULT)
|
|
770
|
+
: [];
|
|
771
|
+
}
|
|
766
772
|
function findSpecialSlotKey(props) {
|
|
773
|
+
return getNonDefaultSlotKeys(props)[0];
|
|
774
|
+
}
|
|
775
|
+
/**
|
|
776
|
+
* Report whether a materialized Repeat slot maps directly onto its owner host.
|
|
777
|
+
* Ambiguous and wrapper/controller layouts deliberately fail closed.
|
|
778
|
+
*/
|
|
779
|
+
function getDirectChildRepeatAppendLayout(props, repeatSlot) {
|
|
767
780
|
const slots = props.slots;
|
|
768
|
-
|
|
781
|
+
if (!slots || slots[repeatSlot] == null)
|
|
782
|
+
return undefined;
|
|
783
|
+
const nonDefaultKeys = getNonDefaultSlotKeys(props);
|
|
784
|
+
if (nonDefaultKeys.length > 1)
|
|
785
|
+
return undefined;
|
|
786
|
+
const effectiveSlot = findSpecialSlotKey(props) ?? SLOT_LAYOUT.DEFAULT;
|
|
787
|
+
if (effectiveSlot !== repeatSlot)
|
|
788
|
+
return undefined;
|
|
789
|
+
return effectiveSlot === SLOT_LAYOUT.DEFAULT
|
|
790
|
+
|| effectiveSlot === SLOT_LAYOUT.FLEX
|
|
791
|
+
? effectiveSlot
|
|
792
|
+
: undefined;
|
|
769
793
|
}
|
|
770
794
|
/** Host attributes/styles owned by the active slot renderer after shell render. */
|
|
771
795
|
function getSlotHostPresentationOwnership(props) {
|
|
@@ -2464,7 +2488,9 @@ class BaseElement extends HTMLElement {
|
|
|
2464
2488
|
}
|
|
2465
2489
|
}
|
|
2466
2490
|
for (const attribute of Array.from(desired.attributes)) {
|
|
2467
|
-
current.
|
|
2491
|
+
if (current.getAttribute(attribute.name) !== attribute.value) {
|
|
2492
|
+
current.setAttribute(attribute.name, attribute.value);
|
|
2493
|
+
}
|
|
2468
2494
|
}
|
|
2469
2495
|
if (current === preserved)
|
|
2470
2496
|
return;
|
|
@@ -2660,7 +2686,7 @@ class CardText extends BaseElement {
|
|
|
2660
2686
|
word-break: break-word;
|
|
2661
2687
|
}
|
|
2662
2688
|
:host([data-disabled]) .card-text {
|
|
2663
|
-
color: var(--card-disabled-
|
|
2689
|
+
color: var(--card-disabled-foreground, #C0C0C0) !important;
|
|
2664
2690
|
}
|
|
2665
2691
|
.card-text {
|
|
2666
2692
|
/* Block-level so line boxes form inside this element and its own
|
|
@@ -3266,8 +3292,11 @@ class CardButton extends BaseElement {
|
|
|
3266
3292
|
background: transparent !important;
|
|
3267
3293
|
}
|
|
3268
3294
|
:host([data-disabled]) .card-btn {
|
|
3269
|
-
background-color:
|
|
3270
|
-
|
|
3295
|
+
background-color: var(
|
|
3296
|
+
--card-disabled-background,
|
|
3297
|
+
#F5F5F5
|
|
3298
|
+
) !important;
|
|
3299
|
+
color: var(--card-disabled-foreground, #C0C0C0) !important;
|
|
3271
3300
|
border: none !important;
|
|
3272
3301
|
cursor: default;
|
|
3273
3302
|
pointer-events: none;
|
|
@@ -3895,6 +3924,14 @@ class CardImage extends BaseElement {
|
|
|
3895
3924
|
constructor() {
|
|
3896
3925
|
super(...arguments);
|
|
3897
3926
|
this._lightbox = null;
|
|
3927
|
+
this._wiredImages = new WeakSet();
|
|
3928
|
+
this._wiredLightboxes = new WeakSet();
|
|
3929
|
+
this._wiredCloseButtons = new WeakSet();
|
|
3930
|
+
this._handleEscape = (event) => {
|
|
3931
|
+
if (event.key === 'Escape' && this._lightbox) {
|
|
3932
|
+
this.closeLightbox(this._lightbox);
|
|
3933
|
+
}
|
|
3934
|
+
};
|
|
3898
3935
|
}
|
|
3899
3936
|
render() {
|
|
3900
3937
|
if (!this.shadowRoot || !this._node)
|
|
@@ -3935,7 +3972,7 @@ class CardImage extends BaseElement {
|
|
|
3935
3972
|
imgStyles.push(`object-fit:${objectFit}`);
|
|
3936
3973
|
if (inlineStyle)
|
|
3937
3974
|
imgStyles.push(inlineStyle);
|
|
3938
|
-
|
|
3975
|
+
const markup = `
|
|
3939
3976
|
<style>
|
|
3940
3977
|
:host {
|
|
3941
3978
|
display: inline-block;
|
|
@@ -4043,11 +4080,25 @@ class CardImage extends BaseElement {
|
|
|
4043
4080
|
loading="lazy"
|
|
4044
4081
|
/>
|
|
4045
4082
|
</div>
|
|
4046
|
-
|
|
4047
|
-
<
|
|
4048
|
-
|
|
4049
|
-
|
|
4050
|
-
|
|
4083
|
+
${preview ? `
|
|
4084
|
+
<div class="lightbox">
|
|
4085
|
+
<button class="lightbox-close" aria-label="Close">×</button>
|
|
4086
|
+
<img class="lightbox-image" src="${imgSrc}" alt="${imgAlt}" />
|
|
4087
|
+
</div>
|
|
4088
|
+
` : ''}
|
|
4089
|
+
`;
|
|
4090
|
+
const currentImage = this.shadowRoot.querySelector('.card-image');
|
|
4091
|
+
const keepError = currentImage?.classList.contains('error') === true
|
|
4092
|
+
&& currentImage.getAttribute('src') === imgSrc;
|
|
4093
|
+
if (this._lightbox?.classList.contains('open')) {
|
|
4094
|
+
this.closeLightbox(this._lightbox);
|
|
4095
|
+
}
|
|
4096
|
+
if (!currentImage
|
|
4097
|
+
|| !this.patchShadowHTMLPreservingElement(markup, currentImage, '.card-image')) {
|
|
4098
|
+
this.setShadowHTML(markup);
|
|
4099
|
+
}
|
|
4100
|
+
if (keepError)
|
|
4101
|
+
currentImage.classList.add('error');
|
|
4051
4102
|
this.bindEvents(preview);
|
|
4052
4103
|
}
|
|
4053
4104
|
applyHostDimension(property, styleValue, propValue) {
|
|
@@ -4076,53 +4127,66 @@ class CardImage extends BaseElement {
|
|
|
4076
4127
|
const img = this.shadowRoot.querySelector('.card-image');
|
|
4077
4128
|
const lightbox = this.shadowRoot.querySelector('.lightbox');
|
|
4078
4129
|
const closeBtn = this.shadowRoot.querySelector('.lightbox-close');
|
|
4079
|
-
if (!img
|
|
4130
|
+
if (!img)
|
|
4080
4131
|
return;
|
|
4081
4132
|
// Handle image load/error states
|
|
4082
|
-
|
|
4083
|
-
|
|
4084
|
-
|
|
4085
|
-
|
|
4086
|
-
|
|
4087
|
-
|
|
4088
|
-
|
|
4089
|
-
|
|
4133
|
+
if (!this._wiredImages.has(img)) {
|
|
4134
|
+
this._wiredImages.add(img);
|
|
4135
|
+
img.addEventListener('load', () => {
|
|
4136
|
+
img.classList.remove('loading');
|
|
4137
|
+
img.classList.remove('error');
|
|
4138
|
+
});
|
|
4139
|
+
img.addEventListener('error', () => {
|
|
4140
|
+
img.classList.remove('loading');
|
|
4141
|
+
img.classList.add('error');
|
|
4142
|
+
});
|
|
4143
|
+
img.addEventListener('click', (event) => {
|
|
4144
|
+
if (this._props.preview === false)
|
|
4145
|
+
return;
|
|
4146
|
+
const activeLightbox = this.shadowRoot?.querySelector('.lightbox');
|
|
4147
|
+
if (!activeLightbox)
|
|
4148
|
+
return;
|
|
4149
|
+
event.stopPropagation();
|
|
4150
|
+
this.openLightbox(activeLightbox);
|
|
4151
|
+
});
|
|
4152
|
+
}
|
|
4153
|
+
if (!preview || !lightbox || !closeBtn) {
|
|
4154
|
+
this._lightbox = null;
|
|
4090
4155
|
return;
|
|
4091
|
-
|
|
4092
|
-
img.addEventListener('click', (e) => {
|
|
4093
|
-
e.stopPropagation();
|
|
4094
|
-
this.openLightbox(lightbox);
|
|
4095
|
-
});
|
|
4156
|
+
}
|
|
4096
4157
|
// Close lightbox on overlay/close button click
|
|
4097
|
-
|
|
4098
|
-
this.
|
|
4099
|
-
|
|
4100
|
-
|
|
4101
|
-
|
|
4102
|
-
|
|
4103
|
-
|
|
4158
|
+
if (!this._wiredLightboxes.has(lightbox)) {
|
|
4159
|
+
this._wiredLightboxes.add(lightbox);
|
|
4160
|
+
lightbox.addEventListener('click', () => {
|
|
4161
|
+
this.closeLightbox(lightbox);
|
|
4162
|
+
});
|
|
4163
|
+
}
|
|
4164
|
+
if (!this._wiredCloseButtons.has(closeBtn)) {
|
|
4165
|
+
this._wiredCloseButtons.add(closeBtn);
|
|
4166
|
+
closeBtn.addEventListener('click', (event) => {
|
|
4167
|
+
event.stopPropagation();
|
|
4168
|
+
this.closeLightbox(lightbox);
|
|
4169
|
+
});
|
|
4170
|
+
}
|
|
4104
4171
|
// Close on Escape key
|
|
4105
4172
|
this._lightbox = lightbox;
|
|
4106
4173
|
}
|
|
4107
4174
|
openLightbox(lightbox) {
|
|
4175
|
+
this._lightbox = lightbox;
|
|
4108
4176
|
lightbox.classList.add('open');
|
|
4109
4177
|
document.body.style.overflow = 'hidden';
|
|
4110
|
-
|
|
4111
|
-
const handleEscape = (e) => {
|
|
4112
|
-
if (e.key === 'Escape') {
|
|
4113
|
-
this.closeLightbox(lightbox);
|
|
4114
|
-
document.removeEventListener('keydown', handleEscape);
|
|
4115
|
-
}
|
|
4116
|
-
};
|
|
4117
|
-
document.addEventListener('keydown', handleEscape);
|
|
4178
|
+
document.addEventListener('keydown', this._handleEscape);
|
|
4118
4179
|
}
|
|
4119
4180
|
closeLightbox(lightbox) {
|
|
4120
4181
|
lightbox.classList.remove('open');
|
|
4121
4182
|
document.body.style.overflow = '';
|
|
4183
|
+
document.removeEventListener('keydown', this._handleEscape);
|
|
4122
4184
|
}
|
|
4123
4185
|
disconnectedCallback() {
|
|
4124
4186
|
// Ensure body overflow is restored when element is removed
|
|
4125
4187
|
document.body.style.overflow = '';
|
|
4188
|
+
document.removeEventListener('keydown', this._handleEscape);
|
|
4189
|
+
this._lightbox = null;
|
|
4126
4190
|
}
|
|
4127
4191
|
}
|
|
4128
4192
|
CardImage.is = 'ai-card-image';
|
|
@@ -7015,7 +7079,7 @@ class CardHtml extends BaseElement {
|
|
|
7015
7079
|
word-break: break-word;
|
|
7016
7080
|
}
|
|
7017
7081
|
:host([data-disabled]) .card-html {
|
|
7018
|
-
color: var(--card-disabled-
|
|
7082
|
+
color: var(--card-disabled-foreground, #C0C0C0) !important;
|
|
7019
7083
|
}
|
|
7020
7084
|
.card-html img { max-width: 100%; } /* keep images from bursting the card */
|
|
7021
7085
|
</style>
|
|
@@ -7047,12 +7111,14 @@ if (typeof customElements !== 'undefined' && !customElements.get(CardHtml.is)) {
|
|
|
7047
7111
|
* as a string so it can be injected into each component's Shadow DOM.
|
|
7048
7112
|
* Global stylesheets cannot pierce shadow roots, and shipping a raw
|
|
7049
7113
|
* `.css` import would push CSS-loader requirements onto every consumer
|
|
7050
|
-
* bundler, so the CSS is vendored at dev time instead.
|
|
7114
|
+
* bundler, so the CSS is vendored at dev time instead. Upstream rem lengths
|
|
7115
|
+
* are normalized to their 16px-based pixel values so mobile host root sizing
|
|
7116
|
+
* cannot scale the calendar internals.
|
|
7051
7117
|
*
|
|
7052
7118
|
* Regenerate after upgrading vanilla-calendar-pro:
|
|
7053
7119
|
* npm run sync:vcp-css --workspace=packages/copilot-cards-web
|
|
7054
7120
|
*/
|
|
7055
|
-
const VCP_CSS = "/*! name: vanilla-calendar-pro v3.1.0 | url: https://github.com/uvarov-frontend/vanilla-calendar-pro */[data-vc=calendar]{border-radius:.75rem;box-sizing:border-box;display:flex;flex-direction:column;min-width:272px;opacity:1;padding:1rem;position:relative;transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}[data-vc=calendar] [tabindex=\"0\"]:focus-visible,[data-vc=calendar] button:focus-visible,[data-vc=calendar]:focus-visible{border-radius:.5rem;outline-offset:-1px;outline-style:solid;outline-width:1px}[data-vc=calendar][data-vc-type=multiple] [data-vc=dates]{flex-grow:0}[data-vc=calendar][data-vc-calendar-hidden]{opacity:0;pointer-events:none}[data-vc=calendar][data-vc-calendar-hidden] *{pointer-events:none!important}[data-vc=calendar][data-vc-input]{position:absolute}[data-vc=calendar][data-vc-input][data-vc-position=bottom]{margin-top:.25rem}[data-vc=calendar][data-vc-input][data-vc-position=top]{margin-top:-.25rem}[data-vc=controls]{align-items:center;box-sizing:content-box;display:flex;justify-content:space-between;left:0;padding-left:1rem;padding-right:1rem;padding-top:1.25rem;pointer-events:none;position:absolute;right:0;top:0;z-index:20}[data-vc-arrow]{background-color:transparent;border-width:0;cursor:pointer;display:block;height:1.5rem;pointer-events:auto;position:relative;width:1.5rem}[data-vc-arrow]:before{background-position:50%;background-repeat:no-repeat;height:100%;left:0;position:absolute;top:0;width:100%;--tw-content:\"\";content:var(--tw-content)}[data-vc-arrow=prev]:before{transform:rotate(90deg)}[data-vc-arrow=next]:before{transform:rotate(-90deg)}[data-vc=grid]{display:flex;flex-grow:1;flex-wrap:wrap;gap:1.75rem}[data-vc=grid][data-vc-grid=hidden] [data-vc=column]{opacity:.3;pointer-events:none}[data-vc=grid][data-vc-grid=hidden] [data-vc=column][data-vc-column=month],[data-vc=grid][data-vc-grid=hidden] [data-vc=column][data-vc-column=year]{opacity:1;pointer-events:auto}[data-vc=column]{display:flex;flex-direction:column;flex-grow:1;min-width:240px}[data-vc=header]{align-items:center;display:flex;margin-bottom:.75rem;position:relative}[data-vc-header=content]{align-items:center;display:grid;flex-grow:1;grid-auto-columns:max-content;grid-auto-flow:column;justify-content:center;padding-left:1rem;padding-right:1rem;white-space:pre-wrap}[data-vc=month],[data-vc=year]{background-color:transparent;border-radius:.25rem;border-width:0;cursor:pointer;font-size:1rem;font-weight:700;line-height:1.5rem;padding:.25rem}[data-vc=month]:disabled,[data-vc=year]:disabled{pointer-events:none}[data-vc=content],[data-vc=wrapper]{display:flex;flex-grow:1}[data-vc=content]{flex-direction:column}[data-vc=months]{grid-template-columns:repeat(4,minmax(0,1fr))}[data-vc=months],[data-vc=years]{align-items:center;-moz-column-gap:.25rem;column-gap:.25rem;display:grid;flex-grow:1;row-gap:1rem}[data-vc=years]{grid-template-columns:repeat(5,minmax(0,1fr))}[data-vc-months-month],[data-vc-years-year]{align-items:center;border-radius:.5rem;border-width:0;cursor:pointer;display:flex;font-size:.75rem;font-weight:600;height:2.5rem;justify-content:center;line-height:1rem;padding:.25rem;text-align:center;word-break:break-all}[data-vc-months-month]:disabled,[data-vc-years-year]:disabled{pointer-events:none}[data-vc-week=numbers]{display:flex;flex-direction:column}[data-vc-week-numbers=title]{align-items:center;display:flex;font-size:.75rem;font-weight:700;justify-content:center;line-height:1rem;margin-bottom:.5rem}[data-vc-week-numbers=content]{align-items:center;display:grid;grid-auto-flow:row;justify-items:center;row-gap:.25rem}[data-vc-week-number]{align-items:center;background-color:transparent;border-style:none;cursor:pointer;display:flex;font-size:.75rem;font-weight:600;justify-content:center;line-height:1rem;margin:0;min-height:1.875rem;min-width:1.875rem;padding:0;width:100%}[data-vc=week]{display:grid;grid-template-columns:repeat(7,1fr);justify-items:center;margin-bottom:.5rem}[data-vc-week-day]{align-items:center;background-color:transparent;border-style:none;display:flex;font-size:.75rem;font-weight:700;justify-content:center;line-height:1rem;margin:0;min-width:1.875rem;padding:0;width:100%}button[data-vc-week-day]{cursor:pointer}[data-vc=dates]{align-items:center;display:grid;flex-grow:1;grid-template-columns:repeat(1,minmax(0,1fr));grid-template-rows:auto;justify-items:center;pointer-events:none}[data-vc=dates][data-vc-dates-disabled] [data-vc-date-btn]{cursor:default}[data-vc-dates=row]{align-items:center;display:grid;grid-template-columns:repeat(7,1fr);justify-items:center;width:100%}[data-vc-date]{align-items:center;display:flex;justify-content:center;padding-bottom:.125rem;padding-top:.125rem;pointer-events:auto;position:relative;width:100%}[data-vc-date]:not(:has([data-vc-date-btn])),[data-vc-date][data-vc-date-disabled],[data-vc-date][data-vc-date-disabled] [data-vc-date-btn]{pointer-events:none}[data-vc-date][data-vc-date-hover] [data-vc-date-btn]{border-radius:0}[data-vc-date][data-vc-date-hover=first] [data-vc-date-btn]{border-bottom-left-radius:.5rem;border-bottom-right-radius:0;border-top-left-radius:.5rem;border-top-right-radius:0}[data-vc-date][data-vc-date-hover=last] [data-vc-date-btn]{border-bottom-left-radius:0;border-bottom-right-radius:.5rem;border-top-left-radius:0;border-top-right-radius:.5rem}[data-vc-date][data-vc-date-hover=first-and-last] [data-vc-date-btn]{border-radius:.5rem}[data-vc-date][data-vc-date-hover=first][data-vc-date-selected] [data-vc-date-btn]{border-bottom-left-radius:.5rem;border-top-left-radius:.5rem}[data-vc-date][data-vc-date-hover=last][data-vc-date-selected] [data-vc-date-btn]{border-bottom-right-radius:.5rem;border-top-right-radius:.5rem}[data-vc-date][data-vc-date-selected=first] [data-vc-date-btn]{border-bottom-left-radius:.5rem;border-bottom-right-radius:0;border-top-left-radius:.5rem;border-top-right-radius:0}[data-vc-date][data-vc-date-selected=last] [data-vc-date-btn]{border-bottom-left-radius:0;border-bottom-right-radius:.5rem;border-top-left-radius:0;border-top-right-radius:.5rem}[data-vc-date][data-vc-date-selected=first-and-last] [data-vc-date-btn]{border-bottom-left-radius:.5rem;border-bottom-right-radius:.5rem;border-top-left-radius:.5rem;border-top-right-radius:.5rem}[data-vc-date][data-vc-date-selected=middle] [data-vc-date-btn]{border-radius:0}[data-vc-date][data-vc-date-disabled]+[data-vc-date-hover] [data-vc-date-btn],[data-vc-date][data-vc-date-disabled]+[data-vc-date-selected] [data-vc-date-btn]{border-bottom-left-radius:.5rem;border-top-left-radius:.5rem}[data-vc-date][data-vc-date-hover]:has(+[data-vc-date-disabled]) [data-vc-date-btn],[data-vc-date][data-vc-date-selected]:has(+[data-vc-date-disabled]) [data-vc-date-btn]{border-bottom-right-radius:.5rem;border-top-right-radius:.5rem}[data-vc-date-btn]:focus-visible+[data-vc-date-popup],[data-vc-date-btn]:hover+[data-vc-date-popup],[data-vc-date-popup]:focus-visible,[data-vc-date-popup]:hover{opacity:1;pointer-events:auto}[data-vc-date-btn]{align-items:center;border-radius:.5rem;border-width:0;cursor:pointer;display:flex;font-size:.75rem;font-weight:400;height:100%;justify-content:center;line-height:1rem;min-height:1.875rem;min-width:1.875rem;padding:0;transition-duration:75ms;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);width:100%}[data-vc-date][data-vc-date-today] [data-vc-date-btn]{font-weight:700}[data-vc-date-popup]{max-width:9rem;min-width:5rem;pointer-events:none;position:absolute;z-index:20;--tw-translate-x:-50%;border-radius:.5rem;font-size:.75rem;font-weight:400;line-height:1rem;opacity:0;padding:.25rem .5rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-duration:75ms;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}[data-vc-date-popup]:hover{opacity:1;pointer-events:auto}[data-vc-date-range-tooltip]{max-width:9rem;pointer-events:none;position:absolute;z-index:30;--tw-translate-x:-50%;--tw-translate-y:-100%;border-radius:.375rem;font-size:.75rem;font-weight:400;line-height:1rem;padding:.25rem .5rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}[data-vc-date-range-tooltip=hidden]{opacity:0}[data-vc-date-range-tooltip=visible]{opacity:1}[data-vc=time]{border-style:solid;border-width:1px 0 0;display:grid;gap:.75rem;grid-template-columns:auto 1fr;margin-top:.75rem;padding-top:.75rem}[data-vc-time=content]{align-items:center;display:grid;grid-auto-flow:column}[data-vc-time-input=hour]{margin-right:.35rem;position:relative;width:1.75rem}[data-vc-time-input=hour]:after{display:block;margin-top:calc(-50% + 1px);position:absolute;right:-5px;top:50%;--tw-content:\":\";content:var(--tw-content)}[data-vc-time-input=minute]{width:1.75rem}[data-vc-time-input=hour] input,[data-vc-time-input=minute] input{border-radius:.25rem;border-width:0;box-sizing:border-box;display:block;font-size:1.125rem;font-weight:600;line-height:1.125rem;margin:0;padding:.125rem;position:relative;text-align:center;width:100%}[data-vc-time-input=hour] input:focus-visible,[data-vc-time-input=minute] input:focus-visible{outline-style:solid;outline-width:1px}[data-vc-time-input=hour] input:disabled,[data-vc-time-input=minute] input:disabled{cursor:default}[data-vc-time-input=hour] input:hover:disabled,[data-vc-time-input=minute] input:hover:disabled,[data-vc-time=keeping]{background-color:transparent}[data-vc-time=keeping]{border-radius:.25rem;border-width:0;cursor:pointer;font-size:.69rem;margin-left:1px;margin-top:.25rem;padding:0;width:22px}[data-vc-time=keeping]:focus-visible{outline-style:solid;outline-width:1px}[data-vc-time=keeping]:disabled{cursor:default}[data-vc-time=keeping]:hover:disabled{background-color:transparent}[data-vc-time=ranges]{display:grid;grid-auto-flow:row}[data-vc-time-range]{font-size:0;position:relative;z-index:10}[data-vc-time-range]:before{content:var(--tw-content);left:0}[data-vc-time-range]:after{content:var(--tw-content);right:0}[data-vc-time-range]:after,[data-vc-time-range]:before{content:\"\";height:.5rem;pointer-events:none;position:absolute;top:50%;transform:translateY(-50%);width:1px;z-index:10}[data-vc-time-range] input{-webkit-appearance:none;-moz-appearance:none;appearance:none;cursor:pointer;height:1.25rem;margin:0;outline-width:0;position:relative;width:100%}[data-vc-time-range] input::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;border-radius:.25rem;border-style:solid;border-width:1px;box-sizing:border-box;cursor:pointer;height:1rem;margin-top:-.5rem;position:relative;width:.75rem;z-index:20;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}[data-vc-time-range] input::-moz-range-thumb{border-radius:.25rem;border-style:solid;border-width:1px;box-sizing:border-box;cursor:pointer;height:1rem;position:relative;width:.75rem;z-index:20;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}[data-vc-time-range] input::-webkit-slider-runnable-track{box-sizing:border-box;cursor:pointer;height:1px;margin-top:1px;width:100%;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}[data-vc-time-range] input::-moz-range-track{box-sizing:border-box;cursor:pointer;height:1px;margin-top:1px;width:100%;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}\n/*! name: vanilla-calendar-pro v3.1.0 | url: https://github.com/uvarov-frontend/vanilla-calendar-pro */[data-vc-theme=light].vc{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));color:#0f172a}[data-vc-theme=light].vc[data-vc-input]{--tw-shadow:0 9px 20px rgba(0,0,0,.1);--tw-shadow-colored:0 9px 20px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}[data-vc-theme=light].vc [tabindex=\"0\"]:focus-visible,[data-vc-theme=light].vc button:focus-visible,[data-vc-theme=light].vc:focus-visible{outline-color:#fdba74}[data-vc-theme=light] .vc-arrow{background-color:transparent}[data-vc-theme=light] .vc-arrow:before{background-image:url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0iIzBmMTcyYSIgZD0iTTEyIDE2Yy0uMyAwLS41LS4xLS43LS4zbC02LTZjLS40LS40LS40LTEgMC0xLjRzMS0uNCAxLjQgMGw1LjMgNS4zIDUuMy01LjNjLjQtLjQgMS0uNCAxLjQgMHMuNCAxIDAgMS40bC02IDZjLS4yLjItLjQuMy0uNy4zIi8+PC9zdmc+\");content:var(--tw-content)}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-arrow:hover:before{content:var(--tw-content);opacity:.6}}[data-vc-theme=light] .vc-header__content,[data-vc-theme=light] .vc-month,[data-vc-theme=light] .vc-year{color:#0f172a}[data-vc-theme=light] .vc-month:disabled,[data-vc-theme=light] .vc-year:disabled{color:#cbd5e1}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-month:hover,[data-vc-theme=light] .vc-year:hover{color:#64748b}}[data-vc-theme=light] .vc-months__month,[data-vc-theme=light] .vc-years__year{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));color:#64748b}[data-vc-theme=light] .vc-months__month:disabled,[data-vc-theme=light] .vc-years__year:disabled{color:#cbd5e1}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-months__month:hover,[data-vc-theme=light] .vc-years__year:hover{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}[data-vc-theme=light] .vc-months__month:hover:disabled,[data-vc-theme=light] .vc-years__year:hover:disabled{color:#cbd5e1}}[data-vc-theme=light] .vc-months__month[data-vc-months-month-selected],[data-vc-theme=light] .vc-years__year[data-vc-years-year-selected]{--tw-bg-opacity:1;background-color:rgb(6 182 212/var(--tw-bg-opacity));color:#fff}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-months__month[data-vc-months-month-selected]:hover,[data-vc-theme=light] .vc-years__year[data-vc-years-year-selected]:hover{--tw-bg-opacity:1;background-color:rgb(6 182 212/var(--tw-bg-opacity));color:#fff}}[data-vc-theme=light] .vc-week-number,[data-vc-theme=light] .vc-week-numbers__title{color:#64748b}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-week-number:hover{color:#475569}}[data-vc-theme=light] .vc-week__day{color:#64748b}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] button.vc-week__day:hover{color:#475569}}[data-vc-theme=light] .vc-week__day[data-vc-week-day-off]{color:#f43f5e}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] button.vc-week__day[data-vc-week-day-off]:hover{color:#e11d48}}[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-holiday][data-vc-date-selected] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-weekend][data-vc-date-selected] .vc-date__btn{background-color:rgb(244 63 94/var(--tw-bg-opacity));--tw-bg-opacity:0.7;color:#fff}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-holiday][data-vc-date-selected] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-weekend][data-vc-date-selected] .vc-date__btn:hover{background-color:rgb(244 63 94/var(--tw-bg-opacity));--tw-bg-opacity:0.7;color:#fff}}[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-holiday][data-vc-date-month=next][data-vc-date-selected] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-holiday][data-vc-date-month=prev][data-vc-date-selected] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-weekend][data-vc-date-month=next][data-vc-date-selected] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-weekend][data-vc-date-month=prev][data-vc-date-selected] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:#64748b}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-holiday][data-vc-date-month=next][data-vc-date-selected] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-holiday][data-vc-date-month=prev][data-vc-date-selected] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-weekend][data-vc-date-month=next][data-vc-date-selected] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-weekend][data-vc-date-month=prev][data-vc-date-selected] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:#64748b}}[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-selected] .vc-date__btn{background-color:rgb(6 182 212/var(--tw-bg-opacity));--tw-bg-opacity:0.7;color:#fff}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-selected] .vc-date__btn:hover{background-color:rgb(6 182 212/var(--tw-bg-opacity));--tw-bg-opacity:0.7;color:#fff}}[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-month=next][data-vc-date-selected] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-month=prev][data-vc-date-selected] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:#64748b}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-month=next][data-vc-date-selected] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-month=prev][data-vc-date-selected] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:#64748b}}[data-vc-theme=light] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));color:#0f172a}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}}[data-vc-theme=light] .vc-date[data-vc-date-today] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity));color:#06b6d4}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-today] .vc-date__btn:hover{color:#06b6d4}}[data-vc-theme=light] .vc-date[data-vc-date-today][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-today][data-vc-date-month=prev] .vc-date__btn{color:#64748b}[data-vc-theme=light] .vc-date[data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-month=prev] .vc-date__btn{color:#94a3b8}[data-vc-theme=light] .vc-date[data-vc-date-disabled] .vc-date__btn{color:#cbd5e1}[data-vc-theme=light] .vc-date[data-vc-date-hover] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}[data-vc-theme=light] .vc-date[data-vc-date-hover=first] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-hover=last] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-hover=first] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-hover=last] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}}[data-vc-theme=light] .vc-date[data-vc-date-holiday] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend] .vc-date__btn{color:#f43f5e}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-holiday] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-weekend] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(255 241 242/var(--tw-bg-opacity))}}[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-hover] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-hover] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(255 241 242/var(--tw-bg-opacity))}[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-hover=first] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-hover=last] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-hover=first] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-hover=last] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(255 228 230/var(--tw-bg-opacity))}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-hover=first] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-hover=last] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-hover=first] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-hover=last] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(255 228 230/var(--tw-bg-opacity))}}[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-disabled] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-disabled] .vc-date__btn{color:#cbd5e1}[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-today] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-today] .vc-date__btn{color:#f43f5e}[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-today][data-vc-date-disabled] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-today][data-vc-date-disabled] .vc-date__btn{color:#cbd5e1}[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-month=prev] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-month=prev] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));color:#94a3b8}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-month=next] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-month=prev] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-month=next] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-month=prev] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}}[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-hover][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-hover][data-vc-date-month=prev] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-hover][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-hover][data-vc-date-month=prev] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-today][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-today][data-vc-date-month=prev] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-today][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-today][data-vc-date-month=prev] .vc-date__btn{color:#94a3b8}[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-disabled][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-disabled][data-vc-date-month=prev] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-disabled][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-disabled][data-vc-date-month=prev] .vc-date__btn{color:#cbd5e1}[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-selected] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-selected] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(244 63 94/var(--tw-bg-opacity));color:#fff}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-selected] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-selected] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(244 63 94/var(--tw-bg-opacity));color:#fff}}[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-selected][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-selected][data-vc-date-month=prev] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-selected][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-selected][data-vc-date-month=prev] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity));color:#64748b}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-selected][data-vc-date-month=next] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-selected][data-vc-date-month=prev] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-selected][data-vc-date-month=next] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-selected][data-vc-date-month=prev] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity));color:#64748b}}[data-vc-theme=light] .vc-date[data-vc-date-selected] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(6 182 212/var(--tw-bg-opacity));color:#fff}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-selected] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(6 182 212/var(--tw-bg-opacity));color:#fff}}[data-vc-theme=light] .vc-date[data-vc-date-selected][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-selected][data-vc-date-month=prev] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity));color:#64748b}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-selected][data-vc-date-month=next] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-selected][data-vc-date-month=prev] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity));color:#64748b}}[data-vc-theme=light] .vc-date__popup{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));color:#0f172a;--tw-shadow:0 3px 15px rgba(85,85,85,.2);--tw-shadow-colored:0 3px 15px var(--tw-shadow-color)}[data-vc-theme=light] .vc-date-range-tooltip,[data-vc-theme=light] .vc-date__popup{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}[data-vc-theme=light] .vc-date-range-tooltip{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity));color:#64748b;--tw-shadow:0px 1px 4px rgba(85,85,85,.2);--tw-shadow-colored:0px 1px 4px var(--tw-shadow-color)}[data-vc-theme=light] .vc-time{border-color:#cbd5e1}[data-vc-theme=light] .vc-time__hour:after,[data-vc-theme=light] .vc-time__minute:after{color:#0f172a;content:var(--tw-content)}[data-vc-theme=light] .vc-time__hour input,[data-vc-theme=light] .vc-time__minute input{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));color:#0f172a}[data-vc-theme=light] .vc-time__hour input:focus-visible,[data-vc-theme=light] .vc-time__minute input:focus-visible{outline-color:#fdba74}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-time__hour input:hover,[data-vc-theme=light] .vc-time__minute input:hover{--tw-bg-opacity:1;background-color:rgb(255 237 213/var(--tw-bg-opacity))}}[data-vc-theme=light] .vc-time__hour input[data-vc-input-focus],[data-vc-theme=light] .vc-time__minute input[data-vc-input-focus]{--tw-bg-opacity:1;background-color:rgb(255 237 213/var(--tw-bg-opacity))}[data-vc-theme=light] .vc-time__keeping{color:#64748b}[data-vc-theme=light] .vc-time__keeping:focus-visible{outline-color:#fdba74}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-time__keeping:hover{--tw-bg-opacity:1;background-color:rgb(255 237 213/var(--tw-bg-opacity))}}[data-vc-theme=light] .vc-time__range input{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}[data-vc-theme=light] .vc-time__range:after,[data-vc-theme=light] .vc-time__range:before{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity))}[data-vc-theme=light] .vc-time__range:hover input::-webkit-slider-thumb{border-color:#94a3b8}[data-vc-theme=light] .vc-time__range:hover input::-moz-range-thumb{border-color:#94a3b8}[data-vc-theme=light] .vc-time__range input:focus-visible::-webkit-slider-thumb{border-color:#fdba74}[data-vc-theme=light] .vc-time__range input:focus-visible::-moz-range-thumb{border-color:#fdba74}[data-vc-theme=light] .vc-time__range input::-webkit-slider-thumb{border-color:#cbd5e1;--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}[data-vc-theme=light] .vc-time__range input::-moz-range-thumb{border-color:#cbd5e1;--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}[data-vc-theme=light] .vc-time__range input::-webkit-slider-runnable-track{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity))}[data-vc-theme=light] .vc-time__range input::-moz-range-track{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity))}";
|
|
7121
|
+
const VCP_CSS = "/*! name: vanilla-calendar-pro v3.1.0 | url: https://github.com/uvarov-frontend/vanilla-calendar-pro */[data-vc=calendar]{border-radius:12px;box-sizing:border-box;display:flex;flex-direction:column;min-width:272px;opacity:1;padding:16px;position:relative;transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}[data-vc=calendar] [tabindex=\"0\"]:focus-visible,[data-vc=calendar] button:focus-visible,[data-vc=calendar]:focus-visible{border-radius:8px;outline-offset:-1px;outline-style:solid;outline-width:1px}[data-vc=calendar][data-vc-type=multiple] [data-vc=dates]{flex-grow:0}[data-vc=calendar][data-vc-calendar-hidden]{opacity:0;pointer-events:none}[data-vc=calendar][data-vc-calendar-hidden] *{pointer-events:none!important}[data-vc=calendar][data-vc-input]{position:absolute}[data-vc=calendar][data-vc-input][data-vc-position=bottom]{margin-top:4px}[data-vc=calendar][data-vc-input][data-vc-position=top]{margin-top:-4px}[data-vc=controls]{align-items:center;box-sizing:content-box;display:flex;justify-content:space-between;left:0;padding-left:16px;padding-right:16px;padding-top:20px;pointer-events:none;position:absolute;right:0;top:0;z-index:20}[data-vc-arrow]{background-color:transparent;border-width:0;cursor:pointer;display:block;height:24px;pointer-events:auto;position:relative;width:24px}[data-vc-arrow]:before{background-position:50%;background-repeat:no-repeat;height:100%;left:0;position:absolute;top:0;width:100%;--tw-content:\"\";content:var(--tw-content)}[data-vc-arrow=prev]:before{transform:rotate(90deg)}[data-vc-arrow=next]:before{transform:rotate(-90deg)}[data-vc=grid]{display:flex;flex-grow:1;flex-wrap:wrap;gap:28px}[data-vc=grid][data-vc-grid=hidden] [data-vc=column]{opacity:.3;pointer-events:none}[data-vc=grid][data-vc-grid=hidden] [data-vc=column][data-vc-column=month],[data-vc=grid][data-vc-grid=hidden] [data-vc=column][data-vc-column=year]{opacity:1;pointer-events:auto}[data-vc=column]{display:flex;flex-direction:column;flex-grow:1;min-width:240px}[data-vc=header]{align-items:center;display:flex;margin-bottom:12px;position:relative}[data-vc-header=content]{align-items:center;display:grid;flex-grow:1;grid-auto-columns:max-content;grid-auto-flow:column;justify-content:center;padding-left:16px;padding-right:16px;white-space:pre-wrap}[data-vc=month],[data-vc=year]{background-color:transparent;border-radius:4px;border-width:0;cursor:pointer;font-size:16px;font-weight:700;line-height:24px;padding:4px}[data-vc=month]:disabled,[data-vc=year]:disabled{pointer-events:none}[data-vc=content],[data-vc=wrapper]{display:flex;flex-grow:1}[data-vc=content]{flex-direction:column}[data-vc=months]{grid-template-columns:repeat(4,minmax(0,1fr))}[data-vc=months],[data-vc=years]{align-items:center;-moz-column-gap:4px;column-gap:4px;display:grid;flex-grow:1;row-gap:16px}[data-vc=years]{grid-template-columns:repeat(5,minmax(0,1fr))}[data-vc-months-month],[data-vc-years-year]{align-items:center;border-radius:8px;border-width:0;cursor:pointer;display:flex;font-size:12px;font-weight:600;height:40px;justify-content:center;line-height:16px;padding:4px;text-align:center;word-break:break-all}[data-vc-months-month]:disabled,[data-vc-years-year]:disabled{pointer-events:none}[data-vc-week=numbers]{display:flex;flex-direction:column}[data-vc-week-numbers=title]{align-items:center;display:flex;font-size:12px;font-weight:700;justify-content:center;line-height:16px;margin-bottom:8px}[data-vc-week-numbers=content]{align-items:center;display:grid;grid-auto-flow:row;justify-items:center;row-gap:4px}[data-vc-week-number]{align-items:center;background-color:transparent;border-style:none;cursor:pointer;display:flex;font-size:12px;font-weight:600;justify-content:center;line-height:16px;margin:0;min-height:30px;min-width:30px;padding:0;width:100%}[data-vc=week]{display:grid;grid-template-columns:repeat(7,1fr);justify-items:center;margin-bottom:8px}[data-vc-week-day]{align-items:center;background-color:transparent;border-style:none;display:flex;font-size:12px;font-weight:700;justify-content:center;line-height:16px;margin:0;min-width:30px;padding:0;width:100%}button[data-vc-week-day]{cursor:pointer}[data-vc=dates]{align-items:center;display:grid;flex-grow:1;grid-template-columns:repeat(1,minmax(0,1fr));grid-template-rows:auto;justify-items:center;pointer-events:none}[data-vc=dates][data-vc-dates-disabled] [data-vc-date-btn]{cursor:default}[data-vc-dates=row]{align-items:center;display:grid;grid-template-columns:repeat(7,1fr);justify-items:center;width:100%}[data-vc-date]{align-items:center;display:flex;justify-content:center;padding-bottom:2px;padding-top:2px;pointer-events:auto;position:relative;width:100%}[data-vc-date]:not(:has([data-vc-date-btn])),[data-vc-date][data-vc-date-disabled],[data-vc-date][data-vc-date-disabled] [data-vc-date-btn]{pointer-events:none}[data-vc-date][data-vc-date-hover] [data-vc-date-btn]{border-radius:0}[data-vc-date][data-vc-date-hover=first] [data-vc-date-btn]{border-bottom-left-radius:8px;border-bottom-right-radius:0;border-top-left-radius:8px;border-top-right-radius:0}[data-vc-date][data-vc-date-hover=last] [data-vc-date-btn]{border-bottom-left-radius:0;border-bottom-right-radius:8px;border-top-left-radius:0;border-top-right-radius:8px}[data-vc-date][data-vc-date-hover=first-and-last] [data-vc-date-btn]{border-radius:8px}[data-vc-date][data-vc-date-hover=first][data-vc-date-selected] [data-vc-date-btn]{border-bottom-left-radius:8px;border-top-left-radius:8px}[data-vc-date][data-vc-date-hover=last][data-vc-date-selected] [data-vc-date-btn]{border-bottom-right-radius:8px;border-top-right-radius:8px}[data-vc-date][data-vc-date-selected=first] [data-vc-date-btn]{border-bottom-left-radius:8px;border-bottom-right-radius:0;border-top-left-radius:8px;border-top-right-radius:0}[data-vc-date][data-vc-date-selected=last] [data-vc-date-btn]{border-bottom-left-radius:0;border-bottom-right-radius:8px;border-top-left-radius:0;border-top-right-radius:8px}[data-vc-date][data-vc-date-selected=first-and-last] [data-vc-date-btn]{border-bottom-left-radius:8px;border-bottom-right-radius:8px;border-top-left-radius:8px;border-top-right-radius:8px}[data-vc-date][data-vc-date-selected=middle] [data-vc-date-btn]{border-radius:0}[data-vc-date][data-vc-date-disabled]+[data-vc-date-hover] [data-vc-date-btn],[data-vc-date][data-vc-date-disabled]+[data-vc-date-selected] [data-vc-date-btn]{border-bottom-left-radius:8px;border-top-left-radius:8px}[data-vc-date][data-vc-date-hover]:has(+[data-vc-date-disabled]) [data-vc-date-btn],[data-vc-date][data-vc-date-selected]:has(+[data-vc-date-disabled]) [data-vc-date-btn]{border-bottom-right-radius:8px;border-top-right-radius:8px}[data-vc-date-btn]:focus-visible+[data-vc-date-popup],[data-vc-date-btn]:hover+[data-vc-date-popup],[data-vc-date-popup]:focus-visible,[data-vc-date-popup]:hover{opacity:1;pointer-events:auto}[data-vc-date-btn]{align-items:center;border-radius:8px;border-width:0;cursor:pointer;display:flex;font-size:12px;font-weight:400;height:100%;justify-content:center;line-height:16px;min-height:30px;min-width:30px;padding:0;transition-duration:75ms;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);width:100%}[data-vc-date][data-vc-date-today] [data-vc-date-btn]{font-weight:700}[data-vc-date-popup]{max-width:144px;min-width:80px;pointer-events:none;position:absolute;z-index:20;--tw-translate-x:-50%;border-radius:8px;font-size:12px;font-weight:400;line-height:16px;opacity:0;padding:4px 8px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-duration:75ms;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}[data-vc-date-popup]:hover{opacity:1;pointer-events:auto}[data-vc-date-range-tooltip]{max-width:144px;pointer-events:none;position:absolute;z-index:30;--tw-translate-x:-50%;--tw-translate-y:-100%;border-radius:6px;font-size:12px;font-weight:400;line-height:16px;padding:4px 8px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}[data-vc-date-range-tooltip=hidden]{opacity:0}[data-vc-date-range-tooltip=visible]{opacity:1}[data-vc=time]{border-style:solid;border-width:1px 0 0;display:grid;gap:12px;grid-template-columns:auto 1fr;margin-top:12px;padding-top:12px}[data-vc-time=content]{align-items:center;display:grid;grid-auto-flow:column}[data-vc-time-input=hour]{margin-right:5.6px;position:relative;width:28px}[data-vc-time-input=hour]:after{display:block;margin-top:calc(-50% + 1px);position:absolute;right:-5px;top:50%;--tw-content:\":\";content:var(--tw-content)}[data-vc-time-input=minute]{width:28px}[data-vc-time-input=hour] input,[data-vc-time-input=minute] input{border-radius:4px;border-width:0;box-sizing:border-box;display:block;font-size:18px;font-weight:600;line-height:18px;margin:0;padding:2px;position:relative;text-align:center;width:100%}[data-vc-time-input=hour] input:focus-visible,[data-vc-time-input=minute] input:focus-visible{outline-style:solid;outline-width:1px}[data-vc-time-input=hour] input:disabled,[data-vc-time-input=minute] input:disabled{cursor:default}[data-vc-time-input=hour] input:hover:disabled,[data-vc-time-input=minute] input:hover:disabled,[data-vc-time=keeping]{background-color:transparent}[data-vc-time=keeping]{border-radius:4px;border-width:0;cursor:pointer;font-size:11.04px;margin-left:1px;margin-top:4px;padding:0;width:22px}[data-vc-time=keeping]:focus-visible{outline-style:solid;outline-width:1px}[data-vc-time=keeping]:disabled{cursor:default}[data-vc-time=keeping]:hover:disabled{background-color:transparent}[data-vc-time=ranges]{display:grid;grid-auto-flow:row}[data-vc-time-range]{font-size:0;position:relative;z-index:10}[data-vc-time-range]:before{content:var(--tw-content);left:0}[data-vc-time-range]:after{content:var(--tw-content);right:0}[data-vc-time-range]:after,[data-vc-time-range]:before{content:\"\";height:8px;pointer-events:none;position:absolute;top:50%;transform:translateY(-50%);width:1px;z-index:10}[data-vc-time-range] input{-webkit-appearance:none;-moz-appearance:none;appearance:none;cursor:pointer;height:20px;margin:0;outline-width:0;position:relative;width:100%}[data-vc-time-range] input::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;border-radius:4px;border-style:solid;border-width:1px;box-sizing:border-box;cursor:pointer;height:16px;margin-top:-8px;position:relative;width:12px;z-index:20;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}[data-vc-time-range] input::-moz-range-thumb{border-radius:4px;border-style:solid;border-width:1px;box-sizing:border-box;cursor:pointer;height:16px;position:relative;width:12px;z-index:20;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}[data-vc-time-range] input::-webkit-slider-runnable-track{box-sizing:border-box;cursor:pointer;height:1px;margin-top:1px;width:100%;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}[data-vc-time-range] input::-moz-range-track{box-sizing:border-box;cursor:pointer;height:1px;margin-top:1px;width:100%;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}\n/*! name: vanilla-calendar-pro v3.1.0 | url: https://github.com/uvarov-frontend/vanilla-calendar-pro */[data-vc-theme=light].vc{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));color:#0f172a}[data-vc-theme=light].vc[data-vc-input]{--tw-shadow:0 9px 20px rgba(0,0,0,.1);--tw-shadow-colored:0 9px 20px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}[data-vc-theme=light].vc [tabindex=\"0\"]:focus-visible,[data-vc-theme=light].vc button:focus-visible,[data-vc-theme=light].vc:focus-visible{outline-color:#fdba74}[data-vc-theme=light] .vc-arrow{background-color:transparent}[data-vc-theme=light] .vc-arrow:before{background-image:url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0iIzBmMTcyYSIgZD0iTTEyIDE2Yy0uMyAwLS41LS4xLS43LS4zbC02LTZjLS40LS40LS40LTEgMC0xLjRzMS0uNCAxLjQgMGw1LjMgNS4zIDUuMy01LjNjLjQtLjQgMS0uNCAxLjQgMHMuNCAxIDAgMS40bC02IDZjLS4yLjItLjQuMy0uNy4zIi8+PC9zdmc+\");content:var(--tw-content)}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-arrow:hover:before{content:var(--tw-content);opacity:.6}}[data-vc-theme=light] .vc-header__content,[data-vc-theme=light] .vc-month,[data-vc-theme=light] .vc-year{color:#0f172a}[data-vc-theme=light] .vc-month:disabled,[data-vc-theme=light] .vc-year:disabled{color:#cbd5e1}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-month:hover,[data-vc-theme=light] .vc-year:hover{color:#64748b}}[data-vc-theme=light] .vc-months__month,[data-vc-theme=light] .vc-years__year{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));color:#64748b}[data-vc-theme=light] .vc-months__month:disabled,[data-vc-theme=light] .vc-years__year:disabled{color:#cbd5e1}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-months__month:hover,[data-vc-theme=light] .vc-years__year:hover{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}[data-vc-theme=light] .vc-months__month:hover:disabled,[data-vc-theme=light] .vc-years__year:hover:disabled{color:#cbd5e1}}[data-vc-theme=light] .vc-months__month[data-vc-months-month-selected],[data-vc-theme=light] .vc-years__year[data-vc-years-year-selected]{--tw-bg-opacity:1;background-color:rgb(6 182 212/var(--tw-bg-opacity));color:#fff}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-months__month[data-vc-months-month-selected]:hover,[data-vc-theme=light] .vc-years__year[data-vc-years-year-selected]:hover{--tw-bg-opacity:1;background-color:rgb(6 182 212/var(--tw-bg-opacity));color:#fff}}[data-vc-theme=light] .vc-week-number,[data-vc-theme=light] .vc-week-numbers__title{color:#64748b}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-week-number:hover{color:#475569}}[data-vc-theme=light] .vc-week__day{color:#64748b}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] button.vc-week__day:hover{color:#475569}}[data-vc-theme=light] .vc-week__day[data-vc-week-day-off]{color:#f43f5e}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] button.vc-week__day[data-vc-week-day-off]:hover{color:#e11d48}}[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-holiday][data-vc-date-selected] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-weekend][data-vc-date-selected] .vc-date__btn{background-color:rgb(244 63 94/var(--tw-bg-opacity));--tw-bg-opacity:0.7;color:#fff}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-holiday][data-vc-date-selected] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-weekend][data-vc-date-selected] .vc-date__btn:hover{background-color:rgb(244 63 94/var(--tw-bg-opacity));--tw-bg-opacity:0.7;color:#fff}}[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-holiday][data-vc-date-month=next][data-vc-date-selected] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-holiday][data-vc-date-month=prev][data-vc-date-selected] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-weekend][data-vc-date-month=next][data-vc-date-selected] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-weekend][data-vc-date-month=prev][data-vc-date-selected] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:#64748b}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-holiday][data-vc-date-month=next][data-vc-date-selected] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-holiday][data-vc-date-month=prev][data-vc-date-selected] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-weekend][data-vc-date-month=next][data-vc-date-selected] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-weekend][data-vc-date-month=prev][data-vc-date-selected] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:#64748b}}[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-selected] .vc-date__btn{background-color:rgb(6 182 212/var(--tw-bg-opacity));--tw-bg-opacity:0.7;color:#fff}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-selected] .vc-date__btn:hover{background-color:rgb(6 182 212/var(--tw-bg-opacity));--tw-bg-opacity:0.7;color:#fff}}[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-month=next][data-vc-date-selected] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-month=prev][data-vc-date-selected] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:#64748b}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-month=next][data-vc-date-selected] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-selected=middle][data-vc-date-month=prev][data-vc-date-selected] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:#64748b}}[data-vc-theme=light] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));color:#0f172a}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}}[data-vc-theme=light] .vc-date[data-vc-date-today] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity));color:#06b6d4}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-today] .vc-date__btn:hover{color:#06b6d4}}[data-vc-theme=light] .vc-date[data-vc-date-today][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-today][data-vc-date-month=prev] .vc-date__btn{color:#64748b}[data-vc-theme=light] .vc-date[data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-month=prev] .vc-date__btn{color:#94a3b8}[data-vc-theme=light] .vc-date[data-vc-date-disabled] .vc-date__btn{color:#cbd5e1}[data-vc-theme=light] .vc-date[data-vc-date-hover] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}[data-vc-theme=light] .vc-date[data-vc-date-hover=first] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-hover=last] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-hover=first] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-hover=last] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}}[data-vc-theme=light] .vc-date[data-vc-date-holiday] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend] .vc-date__btn{color:#f43f5e}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-holiday] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-weekend] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(255 241 242/var(--tw-bg-opacity))}}[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-hover] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-hover] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(255 241 242/var(--tw-bg-opacity))}[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-hover=first] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-hover=last] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-hover=first] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-hover=last] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(255 228 230/var(--tw-bg-opacity))}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-hover=first] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-hover=last] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-hover=first] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-hover=last] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(255 228 230/var(--tw-bg-opacity))}}[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-disabled] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-disabled] .vc-date__btn{color:#cbd5e1}[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-today] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-today] .vc-date__btn{color:#f43f5e}[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-today][data-vc-date-disabled] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-today][data-vc-date-disabled] .vc-date__btn{color:#cbd5e1}[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-month=prev] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-month=prev] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));color:#94a3b8}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-month=next] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-month=prev] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-month=next] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-month=prev] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}}[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-hover][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-hover][data-vc-date-month=prev] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-hover][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-hover][data-vc-date-month=prev] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-today][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-today][data-vc-date-month=prev] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-today][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-today][data-vc-date-month=prev] .vc-date__btn{color:#94a3b8}[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-disabled][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-disabled][data-vc-date-month=prev] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-disabled][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-disabled][data-vc-date-month=prev] .vc-date__btn{color:#cbd5e1}[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-selected] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-selected] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(244 63 94/var(--tw-bg-opacity));color:#fff}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-selected] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-selected] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(244 63 94/var(--tw-bg-opacity));color:#fff}}[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-selected][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-selected][data-vc-date-month=prev] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-selected][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-selected][data-vc-date-month=prev] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity));color:#64748b}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-selected][data-vc-date-month=next] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-holiday][data-vc-date-selected][data-vc-date-month=prev] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-selected][data-vc-date-month=next] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-weekend][data-vc-date-selected][data-vc-date-month=prev] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity));color:#64748b}}[data-vc-theme=light] .vc-date[data-vc-date-selected] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(6 182 212/var(--tw-bg-opacity));color:#fff}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-selected] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(6 182 212/var(--tw-bg-opacity));color:#fff}}[data-vc-theme=light] .vc-date[data-vc-date-selected][data-vc-date-month=next] .vc-date__btn,[data-vc-theme=light] .vc-date[data-vc-date-selected][data-vc-date-month=prev] .vc-date__btn{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity));color:#64748b}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-date[data-vc-date-selected][data-vc-date-month=next] .vc-date__btn:hover,[data-vc-theme=light] .vc-date[data-vc-date-selected][data-vc-date-month=prev] .vc-date__btn:hover{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity));color:#64748b}}[data-vc-theme=light] .vc-date__popup{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));color:#0f172a;--tw-shadow:0 3px 15px rgba(85,85,85,.2);--tw-shadow-colored:0 3px 15px var(--tw-shadow-color)}[data-vc-theme=light] .vc-date-range-tooltip,[data-vc-theme=light] .vc-date__popup{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}[data-vc-theme=light] .vc-date-range-tooltip{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity));color:#64748b;--tw-shadow:0px 1px 4px rgba(85,85,85,.2);--tw-shadow-colored:0px 1px 4px var(--tw-shadow-color)}[data-vc-theme=light] .vc-time{border-color:#cbd5e1}[data-vc-theme=light] .vc-time__hour:after,[data-vc-theme=light] .vc-time__minute:after{color:#0f172a;content:var(--tw-content)}[data-vc-theme=light] .vc-time__hour input,[data-vc-theme=light] .vc-time__minute input{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));color:#0f172a}[data-vc-theme=light] .vc-time__hour input:focus-visible,[data-vc-theme=light] .vc-time__minute input:focus-visible{outline-color:#fdba74}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-time__hour input:hover,[data-vc-theme=light] .vc-time__minute input:hover{--tw-bg-opacity:1;background-color:rgb(255 237 213/var(--tw-bg-opacity))}}[data-vc-theme=light] .vc-time__hour input[data-vc-input-focus],[data-vc-theme=light] .vc-time__minute input[data-vc-input-focus]{--tw-bg-opacity:1;background-color:rgb(255 237 213/var(--tw-bg-opacity))}[data-vc-theme=light] .vc-time__keeping{color:#64748b}[data-vc-theme=light] .vc-time__keeping:focus-visible{outline-color:#fdba74}@media (hover:hover) and (pointer:fine){[data-vc-theme=light] .vc-time__keeping:hover{--tw-bg-opacity:1;background-color:rgb(255 237 213/var(--tw-bg-opacity))}}[data-vc-theme=light] .vc-time__range input{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}[data-vc-theme=light] .vc-time__range:after,[data-vc-theme=light] .vc-time__range:before{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity))}[data-vc-theme=light] .vc-time__range:hover input::-webkit-slider-thumb{border-color:#94a3b8}[data-vc-theme=light] .vc-time__range:hover input::-moz-range-thumb{border-color:#94a3b8}[data-vc-theme=light] .vc-time__range input:focus-visible::-webkit-slider-thumb{border-color:#fdba74}[data-vc-theme=light] .vc-time__range input:focus-visible::-moz-range-thumb{border-color:#fdba74}[data-vc-theme=light] .vc-time__range input::-webkit-slider-thumb{border-color:#cbd5e1;--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}[data-vc-theme=light] .vc-time__range input::-moz-range-thumb{border-color:#cbd5e1;--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}[data-vc-theme=light] .vc-time__range input::-webkit-slider-runnable-track{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity))}[data-vc-theme=light] .vc-time__range input::-moz-range-track{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity))}";
|
|
7056
7122
|
|
|
7057
7123
|
/**
|
|
7058
7124
|
* CardDatePicker — Custom Element for a single-date picker.
|
|
@@ -8875,12 +8941,14 @@ const FOCUS_TARGET_SELECTOR = [
|
|
|
8875
8941
|
*/
|
|
8876
8942
|
function createCardNodeAccess(container) {
|
|
8877
8943
|
const handles = new Map();
|
|
8878
|
-
const
|
|
8944
|
+
const focusListeners = new Set();
|
|
8945
|
+
const scrollSubscriptions = new Map();
|
|
8879
8946
|
let focusedId = null;
|
|
8880
8947
|
let focusSyncScheduled = false;
|
|
8881
|
-
let
|
|
8948
|
+
let focusObserving = false;
|
|
8949
|
+
let scrollObserving = false;
|
|
8882
8950
|
let observationEpoch = 0;
|
|
8883
|
-
let
|
|
8951
|
+
let focusObserver = null;
|
|
8884
8952
|
let disposed = false;
|
|
8885
8953
|
const resolveElement = (id) => {
|
|
8886
8954
|
if (disposed)
|
|
@@ -8951,7 +9019,7 @@ function createCardNodeAccess(container) {
|
|
|
8951
9019
|
return null;
|
|
8952
9020
|
};
|
|
8953
9021
|
const syncFocus = () => {
|
|
8954
|
-
if (disposed || !
|
|
9022
|
+
if (disposed || !focusObserving)
|
|
8955
9023
|
return;
|
|
8956
9024
|
const nextId = resolveFocusedId();
|
|
8957
9025
|
if (nextId === focusedId)
|
|
@@ -8959,7 +9027,7 @@ function createCardNodeAccess(container) {
|
|
|
8959
9027
|
const previousNode = focusedId ? getNode(focusedId) : null;
|
|
8960
9028
|
const node = nextId ? getNode(nextId) : null;
|
|
8961
9029
|
focusedId = nextId;
|
|
8962
|
-
for (const listener of [...
|
|
9030
|
+
for (const listener of [...focusListeners]) {
|
|
8963
9031
|
try {
|
|
8964
9032
|
listener({ node, previousNode });
|
|
8965
9033
|
}
|
|
@@ -8969,7 +9037,7 @@ function createCardNodeAccess(container) {
|
|
|
8969
9037
|
}
|
|
8970
9038
|
};
|
|
8971
9039
|
const scheduleFocusSync = () => {
|
|
8972
|
-
if (disposed || !
|
|
9040
|
+
if (disposed || !focusObserving || focusSyncScheduled)
|
|
8973
9041
|
return;
|
|
8974
9042
|
focusSyncScheduled = true;
|
|
8975
9043
|
const scheduledEpoch = observationEpoch;
|
|
@@ -8980,29 +9048,29 @@ function createCardNodeAccess(container) {
|
|
|
8980
9048
|
syncFocus();
|
|
8981
9049
|
});
|
|
8982
9050
|
};
|
|
8983
|
-
const
|
|
8984
|
-
if (disposed ||
|
|
9051
|
+
const startFocusObserving = () => {
|
|
9052
|
+
if (disposed || focusObserving)
|
|
8985
9053
|
return;
|
|
8986
|
-
|
|
9054
|
+
focusObserving = true;
|
|
8987
9055
|
observationEpoch += 1;
|
|
8988
9056
|
focusedId = resolveFocusedId();
|
|
8989
9057
|
container.addEventListener('focusin', scheduleFocusSync, true);
|
|
8990
9058
|
container.addEventListener('focusout', scheduleFocusSync, true);
|
|
8991
9059
|
if (typeof MutationObserver !== 'undefined') {
|
|
8992
|
-
|
|
8993
|
-
|
|
9060
|
+
focusObserver ?? (focusObserver = new MutationObserver(scheduleFocusSync));
|
|
9061
|
+
focusObserver.observe(container, { childList: true, subtree: true });
|
|
8994
9062
|
}
|
|
8995
9063
|
};
|
|
8996
|
-
const
|
|
8997
|
-
if (!
|
|
9064
|
+
const stopFocusObserving = () => {
|
|
9065
|
+
if (!focusObserving)
|
|
8998
9066
|
return;
|
|
8999
|
-
|
|
9067
|
+
focusObserving = false;
|
|
9000
9068
|
observationEpoch += 1;
|
|
9001
9069
|
focusSyncScheduled = false;
|
|
9002
9070
|
const cleanupSteps = [
|
|
9003
9071
|
() => container.removeEventListener('focusin', scheduleFocusSync, true),
|
|
9004
9072
|
() => container.removeEventListener('focusout', scheduleFocusSync, true),
|
|
9005
|
-
() =>
|
|
9073
|
+
() => focusObserver?.disconnect(),
|
|
9006
9074
|
];
|
|
9007
9075
|
for (const cleanup of cleanupSteps) {
|
|
9008
9076
|
try {
|
|
@@ -9014,36 +9082,139 @@ function createCardNodeAccess(container) {
|
|
|
9014
9082
|
}
|
|
9015
9083
|
focusedId = null;
|
|
9016
9084
|
};
|
|
9085
|
+
const handleScroll = (event) => {
|
|
9086
|
+
if (disposed || !scrollObserving)
|
|
9087
|
+
return;
|
|
9088
|
+
const path = typeof event.composedPath === 'function'
|
|
9089
|
+
? event.composedPath()
|
|
9090
|
+
: [];
|
|
9091
|
+
const target = path[0] ?? event.target;
|
|
9092
|
+
if (!(target instanceof HTMLElement)
|
|
9093
|
+
|| !target.matches(CARD_NODE_SELECTOR)) {
|
|
9094
|
+
return;
|
|
9095
|
+
}
|
|
9096
|
+
const nodeId = target.getAttribute('data-card-id');
|
|
9097
|
+
if (!nodeId || resolveElement(nodeId) !== target)
|
|
9098
|
+
return;
|
|
9099
|
+
const subscriptions = scrollSubscriptions.get(nodeId);
|
|
9100
|
+
if (!subscriptions?.size)
|
|
9101
|
+
return;
|
|
9102
|
+
const snapshot = Object.freeze({
|
|
9103
|
+
node: getNode(nodeId),
|
|
9104
|
+
scrollTop: target.scrollTop,
|
|
9105
|
+
scrollLeft: target.scrollLeft,
|
|
9106
|
+
scrollHeight: target.scrollHeight,
|
|
9107
|
+
scrollWidth: target.scrollWidth,
|
|
9108
|
+
clientHeight: target.clientHeight,
|
|
9109
|
+
clientWidth: target.clientWidth,
|
|
9110
|
+
});
|
|
9111
|
+
for (const subscription of [...subscriptions]) {
|
|
9112
|
+
try {
|
|
9113
|
+
subscription.listener(snapshot);
|
|
9114
|
+
}
|
|
9115
|
+
catch (error) {
|
|
9116
|
+
console.error('[CardInstance] scroll listener failed', error);
|
|
9117
|
+
}
|
|
9118
|
+
}
|
|
9119
|
+
};
|
|
9120
|
+
const startScrollObserving = () => {
|
|
9121
|
+
if (disposed || scrollObserving)
|
|
9122
|
+
return;
|
|
9123
|
+
scrollObserving = true;
|
|
9124
|
+
container.addEventListener('scroll', handleScroll, {
|
|
9125
|
+
capture: true,
|
|
9126
|
+
passive: true,
|
|
9127
|
+
});
|
|
9128
|
+
};
|
|
9129
|
+
const stopScrollObserving = () => {
|
|
9130
|
+
if (!scrollObserving)
|
|
9131
|
+
return;
|
|
9132
|
+
scrollObserving = false;
|
|
9133
|
+
try {
|
|
9134
|
+
container.removeEventListener('scroll', handleScroll, true);
|
|
9135
|
+
}
|
|
9136
|
+
catch (error) {
|
|
9137
|
+
console.error('[CardInstance] Scroll observation cleanup failed', error);
|
|
9138
|
+
}
|
|
9139
|
+
};
|
|
9017
9140
|
return {
|
|
9018
9141
|
getNode,
|
|
9019
9142
|
onFocusChange(listener) {
|
|
9020
9143
|
if (disposed)
|
|
9021
9144
|
return () => { };
|
|
9022
|
-
|
|
9023
|
-
if (
|
|
9024
|
-
|
|
9145
|
+
focusListeners.add(listener);
|
|
9146
|
+
if (focusListeners.size === 1)
|
|
9147
|
+
startFocusObserving();
|
|
9148
|
+
let subscribed = true;
|
|
9149
|
+
return () => {
|
|
9150
|
+
if (!subscribed)
|
|
9151
|
+
return;
|
|
9152
|
+
subscribed = false;
|
|
9153
|
+
focusListeners.delete(listener);
|
|
9154
|
+
if (focusListeners.size === 0)
|
|
9155
|
+
stopFocusObserving();
|
|
9156
|
+
};
|
|
9157
|
+
},
|
|
9158
|
+
onScroll(nodeId, listener) {
|
|
9159
|
+
if (disposed)
|
|
9160
|
+
return () => { };
|
|
9161
|
+
const subscription = { listener };
|
|
9162
|
+
let subscriptions = scrollSubscriptions.get(nodeId);
|
|
9163
|
+
if (!subscriptions) {
|
|
9164
|
+
subscriptions = new Set();
|
|
9165
|
+
scrollSubscriptions.set(nodeId, subscriptions);
|
|
9166
|
+
}
|
|
9167
|
+
subscriptions.add(subscription);
|
|
9168
|
+
startScrollObserving();
|
|
9025
9169
|
let subscribed = true;
|
|
9026
9170
|
return () => {
|
|
9027
9171
|
if (!subscribed)
|
|
9028
9172
|
return;
|
|
9029
9173
|
subscribed = false;
|
|
9030
|
-
|
|
9031
|
-
|
|
9032
|
-
|
|
9174
|
+
const active = scrollSubscriptions.get(nodeId);
|
|
9175
|
+
active?.delete(subscription);
|
|
9176
|
+
if (active?.size === 0)
|
|
9177
|
+
scrollSubscriptions.delete(nodeId);
|
|
9178
|
+
if (scrollSubscriptions.size === 0)
|
|
9179
|
+
stopScrollObserving();
|
|
9033
9180
|
};
|
|
9034
9181
|
},
|
|
9035
9182
|
dispose() {
|
|
9036
9183
|
if (disposed)
|
|
9037
9184
|
return;
|
|
9038
|
-
|
|
9185
|
+
stopFocusObserving();
|
|
9186
|
+
stopScrollObserving();
|
|
9039
9187
|
disposed = true;
|
|
9040
|
-
|
|
9188
|
+
focusListeners.clear();
|
|
9189
|
+
scrollSubscriptions.clear();
|
|
9041
9190
|
handles.clear();
|
|
9042
9191
|
},
|
|
9043
9192
|
};
|
|
9044
9193
|
}
|
|
9045
9194
|
|
|
9195
|
+
const DISABLED_MARKER = 'data-copilot-card-disabled';
|
|
9196
|
+
function applyDisabledState(element, disabled) {
|
|
9197
|
+
if (!disabled)
|
|
9198
|
+
return;
|
|
9199
|
+
element.setAttribute('data-disabled', 'true');
|
|
9200
|
+
element.setAttribute(DISABLED_MARKER, 'true');
|
|
9201
|
+
// Inline declarations work inside host ShadowRoots too. Use the shorthand
|
|
9202
|
+
// to mask background images/gradients, matching the historical disabled state.
|
|
9203
|
+
element.style.background = 'var(--card-disabled-background, #F5F5F5)';
|
|
9204
|
+
element.style.color = 'var(--card-disabled-foreground, #C0C0C0)';
|
|
9205
|
+
element.style.pointerEvents = 'none';
|
|
9206
|
+
element.style.cursor = 'default';
|
|
9207
|
+
}
|
|
9208
|
+
function applyDisabledDescendants(element, disabled) {
|
|
9209
|
+
if (!disabled)
|
|
9210
|
+
return;
|
|
9211
|
+
element.querySelectorAll('*').forEach((child) => {
|
|
9212
|
+
child.setAttribute('data-disabled', 'true');
|
|
9213
|
+
});
|
|
9214
|
+
}
|
|
9215
|
+
|
|
9046
9216
|
const FORCE_REPLACE = Symbol('bound-force-replace');
|
|
9217
|
+
const REPEAT_APPEND = Symbol('bound-repeat-append');
|
|
9047
9218
|
/**
|
|
9048
9219
|
* Render the scoped/materialized branch of a card.
|
|
9049
9220
|
*
|
|
@@ -9163,25 +9334,6 @@ function renderBoundCard(container, schema, options) {
|
|
|
9163
9334
|
bindingFingerprint: nodeBindingFingerprint(node, resolvedProps, disabled),
|
|
9164
9335
|
};
|
|
9165
9336
|
}
|
|
9166
|
-
function applyDisabledState(element, disabled) {
|
|
9167
|
-
if (!disabled)
|
|
9168
|
-
return;
|
|
9169
|
-
element.setAttribute('data-disabled', 'true');
|
|
9170
|
-
element.style.background = '#F5F5F5';
|
|
9171
|
-
element.style.color = '#C0C0C0';
|
|
9172
|
-
element.style.setProperty('--card-disabled-color', '#C0C0C0');
|
|
9173
|
-
element.style.pointerEvents = 'none';
|
|
9174
|
-
element.style.cursor = 'default';
|
|
9175
|
-
}
|
|
9176
|
-
function applyDisabledDescendants(element, disabled) {
|
|
9177
|
-
if (!disabled)
|
|
9178
|
-
return;
|
|
9179
|
-
element.querySelectorAll('*').forEach((child) => {
|
|
9180
|
-
const htmlChild = child;
|
|
9181
|
-
htmlChild.setAttribute('data-disabled', 'true');
|
|
9182
|
-
htmlChild.style.setProperty('--card-disabled-color', '#C0C0C0');
|
|
9183
|
-
});
|
|
9184
|
-
}
|
|
9185
9337
|
function disposeBoundElement(element) {
|
|
9186
9338
|
const cleanupSteps = [
|
|
9187
9339
|
() => clearSlotOwnerBehaviorsIn(element),
|
|
@@ -9329,9 +9481,12 @@ function renderBoundCard(container, schema, options) {
|
|
|
9329
9481
|
collectMountedOccurrences(child, occurrences);
|
|
9330
9482
|
}
|
|
9331
9483
|
}
|
|
9332
|
-
function prepareBoundNode(node, occurrenceKey, renderVariables, forcedOwnerIds, current) {
|
|
9484
|
+
function prepareBoundNode(node, occurrenceKey, renderVariables, forcedOwnerIds, appendPlans, current) {
|
|
9333
9485
|
const metadata = resolveBoundMetadata(node, occurrenceKey, renderVariables);
|
|
9334
9486
|
const forceReplace = forcedOwnerIds.has(node.id);
|
|
9487
|
+
const appendPlan = current
|
|
9488
|
+
? appendPlans.get(current.occurrenceKey)
|
|
9489
|
+
: undefined;
|
|
9335
9490
|
if (!metadata.visible || forceReplace) {
|
|
9336
9491
|
return {
|
|
9337
9492
|
...metadata,
|
|
@@ -9357,14 +9512,17 @@ function renderBoundCard(container, schema, options) {
|
|
|
9357
9512
|
const ordinal = nextChildOrdinals.get(currentChild.nodeId) ?? 0;
|
|
9358
9513
|
nextChildOrdinals.set(currentChild.nodeId, ordinal + 1);
|
|
9359
9514
|
const child = matching[Math.min(ordinal, matching.length - 1)];
|
|
9360
|
-
children.push(prepareBoundNode(child, currentChild.occurrenceKey, renderVariables, forcedOwnerIds, currentChild));
|
|
9515
|
+
children.push(prepareBoundNode(child, currentChild.occurrenceKey, renderVariables, forcedOwnerIds, appendPlans, currentChild));
|
|
9361
9516
|
}
|
|
9362
9517
|
return {
|
|
9363
9518
|
...metadata,
|
|
9519
|
+
...(appendPlan ? { [REPEAT_APPEND]: true } : {}),
|
|
9364
9520
|
children,
|
|
9365
9521
|
};
|
|
9366
9522
|
}
|
|
9367
9523
|
function decideBoundUpdate(current, next) {
|
|
9524
|
+
if (next[REPEAT_APPEND])
|
|
9525
|
+
return 'retain';
|
|
9368
9526
|
if (next[FORCE_REPLACE]
|
|
9369
9527
|
|| current.occurrenceKey !== next.occurrenceKey
|
|
9370
9528
|
|| current.nodeId !== next.nodeId
|
|
@@ -9426,11 +9584,308 @@ function renderBoundCard(container, schema, options) {
|
|
|
9426
9584
|
}
|
|
9427
9585
|
return changed;
|
|
9428
9586
|
}
|
|
9429
|
-
function
|
|
9430
|
-
|
|
9431
|
-
|
|
9587
|
+
function pointerOverlaps(left, right) {
|
|
9588
|
+
return left === right
|
|
9589
|
+
|| left === ''
|
|
9590
|
+
|| right === ''
|
|
9591
|
+
|| left.startsWith(`${right}/`)
|
|
9592
|
+
|| right.startsWith(`${left}/`);
|
|
9593
|
+
}
|
|
9594
|
+
function changedPointersOutsideSuffix(before, draft, sourcePath) {
|
|
9595
|
+
const changed = collectChangedPointers(before, draft)
|
|
9596
|
+
.filter(pointer => pointer !== sourcePath);
|
|
9597
|
+
changed.push(`${sourcePath}/length`);
|
|
9598
|
+
return [...new Set(changed)];
|
|
9599
|
+
}
|
|
9600
|
+
function repeatOwnerIdentityEqual(current, next) {
|
|
9601
|
+
return current.key === next.key
|
|
9602
|
+
&& current.parentKey === next.parentKey
|
|
9603
|
+
&& current.runtimeOwnerId === next.runtimeOwnerId
|
|
9604
|
+
&& current.sourceOwnerId === next.sourceOwnerId
|
|
9605
|
+
&& current.slot === next.slot
|
|
9606
|
+
&& current.templateId === next.templateId
|
|
9607
|
+
&& current.emptyTemplateId === next.emptyTemplateId
|
|
9608
|
+
&& current.sourcePath === next.sourcePath
|
|
9609
|
+
&& current.dataPath === next.dataPath
|
|
9610
|
+
&& current.instancePath === next.instancePath
|
|
9611
|
+
&& current.depth === next.depth;
|
|
9612
|
+
}
|
|
9613
|
+
function hasStrictJsonPrefix(previous, next) {
|
|
9614
|
+
return next.length > previous.length
|
|
9615
|
+
&& previous.every((value, index) => jsonDataEqual(value, next[index]));
|
|
9616
|
+
}
|
|
9617
|
+
function childNodeSequenceEqual(parent, expected) {
|
|
9618
|
+
const actual = Array.from(parent.childNodes);
|
|
9619
|
+
return actual.length === expected.length
|
|
9620
|
+
&& actual.every((node, index) => node === expected[index]);
|
|
9621
|
+
}
|
|
9622
|
+
function occurrenceKeysForChildren(parentOccurrenceKey, children) {
|
|
9623
|
+
const ordinals = new Map();
|
|
9624
|
+
return children.map((child) => {
|
|
9625
|
+
const ordinal = ordinals.get(child.id) ?? 0;
|
|
9626
|
+
ordinals.set(child.id, ordinal + 1);
|
|
9627
|
+
return childOccurrenceKey(parentOccurrenceKey, child.id, ordinal);
|
|
9628
|
+
});
|
|
9629
|
+
}
|
|
9630
|
+
function findMountedByOccurrenceKey(root, occurrenceKey) {
|
|
9631
|
+
if (root.occurrenceKey === occurrenceKey)
|
|
9632
|
+
return root;
|
|
9633
|
+
for (const child of root.children) {
|
|
9634
|
+
const match = findMountedByOccurrenceKey(child, occurrenceKey);
|
|
9635
|
+
if (match)
|
|
9636
|
+
return match;
|
|
9637
|
+
}
|
|
9638
|
+
return null;
|
|
9639
|
+
}
|
|
9640
|
+
function replaceMountedByOccurrenceKey(root, occurrenceKey, replacement) {
|
|
9641
|
+
if (root.occurrenceKey === occurrenceKey)
|
|
9642
|
+
return replacement;
|
|
9643
|
+
for (let index = 0; index < root.children.length; index += 1) {
|
|
9644
|
+
const replacedChild = replaceMountedByOccurrenceKey(root.children[index], occurrenceKey, replacement);
|
|
9645
|
+
if (!replacedChild)
|
|
9646
|
+
continue;
|
|
9647
|
+
const children = root.children.slice();
|
|
9648
|
+
children[index] = replacedChild;
|
|
9649
|
+
return { ...root, children };
|
|
9650
|
+
}
|
|
9651
|
+
return null;
|
|
9652
|
+
}
|
|
9653
|
+
function mountedNodesById(root, nodeId) {
|
|
9654
|
+
const matches = [];
|
|
9655
|
+
const visit = (node) => {
|
|
9656
|
+
if (node.nodeId === nodeId)
|
|
9657
|
+
matches.push(node);
|
|
9658
|
+
for (const child of node.children)
|
|
9659
|
+
visit(child);
|
|
9660
|
+
};
|
|
9661
|
+
visit(root);
|
|
9662
|
+
return matches;
|
|
9663
|
+
}
|
|
9664
|
+
function mountedTreeOrderMatchesDom(root) {
|
|
9665
|
+
if (root.element.parentNode !== container
|
|
9666
|
+
|| container.childNodes.length !== 1
|
|
9667
|
+
|| container.firstChild !== root.element) {
|
|
9668
|
+
return false;
|
|
9669
|
+
}
|
|
9670
|
+
const visit = (node) => {
|
|
9671
|
+
let previous = null;
|
|
9672
|
+
for (const child of node.children) {
|
|
9673
|
+
if (!node.element.contains(child.element))
|
|
9674
|
+
return false;
|
|
9675
|
+
if (previous
|
|
9676
|
+
&& previous.compareDocumentPosition(child.element)
|
|
9677
|
+
!== Node.DOCUMENT_POSITION_FOLLOWING) {
|
|
9678
|
+
return false;
|
|
9679
|
+
}
|
|
9680
|
+
previous = child.element;
|
|
9681
|
+
if (!visit(child))
|
|
9682
|
+
return false;
|
|
9683
|
+
}
|
|
9684
|
+
return true;
|
|
9685
|
+
};
|
|
9686
|
+
return visit(root);
|
|
9687
|
+
}
|
|
9688
|
+
function retainedSubtreeEquivalent(current, next) {
|
|
9689
|
+
return current.occurrenceKey === next.occurrenceKey
|
|
9690
|
+
&& current.nodeId === next.nodeId
|
|
9691
|
+
&& current.nodeType === next.nodeType
|
|
9692
|
+
&& current.node.sourceId === next.node.sourceId
|
|
9693
|
+
&& current.node.instancePath === next.node.instancePath
|
|
9694
|
+
&& current.node.dataPath === next.node.dataPath
|
|
9695
|
+
&& current.node.bindingDialect === next.node.bindingDialect
|
|
9696
|
+
&& current.rendererToken === next.rendererToken
|
|
9697
|
+
&& current.visible === next.visible
|
|
9698
|
+
&& current.disabled === next.disabled
|
|
9699
|
+
&& current.propsFingerprint === next.propsFingerprint
|
|
9700
|
+
&& current.layoutFingerprint === next.layoutFingerprint
|
|
9701
|
+
&& current.bindingFingerprint === next.bindingFingerprint
|
|
9702
|
+
&& current.children.length === next.children.length
|
|
9703
|
+
&& current.children.every((child, index) => (retainedSubtreeEquivalent(child, next.children[index])));
|
|
9704
|
+
}
|
|
9705
|
+
function prepareComparableRetainedNode(node, occurrenceKey, renderVariables, current) {
|
|
9706
|
+
const expectedKeys = occurrenceKeysForChildren(occurrenceKey, node.children);
|
|
9707
|
+
if (current.children.length !== node.children.length
|
|
9708
|
+
|| current.children.some((child, index) => (child.occurrenceKey !== expectedKeys[index]))) {
|
|
9709
|
+
return null;
|
|
9710
|
+
}
|
|
9711
|
+
const children = [];
|
|
9712
|
+
for (let index = 0; index < node.children.length; index += 1) {
|
|
9713
|
+
const child = prepareComparableRetainedNode(node.children[index], expectedKeys[index], renderVariables, current.children[index]);
|
|
9714
|
+
if (!child)
|
|
9715
|
+
return null;
|
|
9716
|
+
children.push(child);
|
|
9717
|
+
}
|
|
9718
|
+
return {
|
|
9719
|
+
...resolveBoundMetadata(node, occurrenceKey, renderVariables),
|
|
9720
|
+
children,
|
|
9721
|
+
};
|
|
9722
|
+
}
|
|
9723
|
+
function projectRepeatOwnerPrefix(node, owner, current) {
|
|
9724
|
+
const slots = node.props.slots;
|
|
9725
|
+
const slot = slots?.[owner.slot];
|
|
9726
|
+
const currentSlots = current.node.props.slots;
|
|
9727
|
+
const currentSlot = currentSlots?.[owner.slot];
|
|
9728
|
+
if (!slots
|
|
9729
|
+
|| !slot
|
|
9730
|
+
|| !Array.isArray(slot.children)
|
|
9731
|
+
|| !currentSlot
|
|
9732
|
+
|| !Array.isArray(currentSlot.children)
|
|
9733
|
+
|| currentSlot.children.length >= slot.children.length
|
|
9734
|
+
|| currentSlot.children.some((childId, index) => (childId !== slot.children[index]))) {
|
|
9735
|
+
return null;
|
|
9736
|
+
}
|
|
9737
|
+
const appendedChildIds = new Set(slot.children.slice(currentSlot.children.length));
|
|
9738
|
+
const children = node.children.filter(child => (!appendedChildIds.has(child.id)));
|
|
9739
|
+
if (children.length !== current.children.length
|
|
9740
|
+
|| node.children.length - children.length !== appendedChildIds.size) {
|
|
9741
|
+
return null;
|
|
9742
|
+
}
|
|
9743
|
+
return {
|
|
9744
|
+
...node,
|
|
9745
|
+
props: {
|
|
9746
|
+
...node.props,
|
|
9747
|
+
slots: {
|
|
9748
|
+
...slots,
|
|
9749
|
+
[owner.slot]: {
|
|
9750
|
+
...slot,
|
|
9751
|
+
children: slot.children.slice(0, currentSlot.children.length),
|
|
9752
|
+
},
|
|
9753
|
+
},
|
|
9754
|
+
},
|
|
9755
|
+
children,
|
|
9756
|
+
};
|
|
9757
|
+
}
|
|
9758
|
+
function collectRetainedRepeatOwnerKeys(materialized, outerOwner) {
|
|
9759
|
+
const retained = new Set([outerOwner.key]);
|
|
9760
|
+
for (const candidate of materialized.repeatOwners.values()) {
|
|
9761
|
+
let parentKey = candidate.parentKey;
|
|
9762
|
+
while (parentKey) {
|
|
9763
|
+
if (parentKey === outerOwner.key) {
|
|
9764
|
+
retained.add(candidate.key);
|
|
9765
|
+
break;
|
|
9766
|
+
}
|
|
9767
|
+
parentKey = materialized.repeatOwners.get(parentKey)?.parentKey;
|
|
9768
|
+
}
|
|
9769
|
+
}
|
|
9770
|
+
return retained;
|
|
9771
|
+
}
|
|
9772
|
+
function retainedOwnersConsumeChangedPointer(materialized, retainedOwnerKeys, pointers) {
|
|
9773
|
+
for (const [key, dependencyOwners] of materialized.valueDependencies) {
|
|
9774
|
+
if (!key.startsWith('data:')
|
|
9775
|
+
|| ![...dependencyOwners].some(ownerKey => (retainedOwnerKeys.has(ownerKey)))) {
|
|
9776
|
+
continue;
|
|
9777
|
+
}
|
|
9778
|
+
const dependency = key.slice('data:'.length);
|
|
9779
|
+
if (pointers.some(pointer => pointerOverlaps(pointer, dependency))) {
|
|
9780
|
+
return true;
|
|
9781
|
+
}
|
|
9782
|
+
}
|
|
9783
|
+
return false;
|
|
9784
|
+
}
|
|
9785
|
+
function createRepeatAppendPlan(currentOwner, nextMaterialized, before, draft) {
|
|
9786
|
+
if (!currentMountedTree || !mountedTreeOrderMatchesDom(currentMountedTree)) {
|
|
9787
|
+
return null;
|
|
9788
|
+
}
|
|
9789
|
+
const nextOwner = nextMaterialized.repeatOwners.get(currentOwner.key);
|
|
9790
|
+
if (!nextOwner || !repeatOwnerIdentityEqual(currentOwner, nextOwner)) {
|
|
9791
|
+
return null;
|
|
9792
|
+
}
|
|
9793
|
+
const currentOwnerCount = [...currentMaterialized.repeatOwners.values()]
|
|
9794
|
+
.filter(owner => owner.runtimeOwnerId === currentOwner.runtimeOwnerId)
|
|
9795
|
+
.length;
|
|
9796
|
+
const nextOwnerCount = [...nextMaterialized.repeatOwners.values()]
|
|
9797
|
+
.filter(owner => owner.runtimeOwnerId === nextOwner.runtimeOwnerId)
|
|
9798
|
+
.length;
|
|
9799
|
+
if (currentOwnerCount !== 1 || nextOwnerCount !== 1)
|
|
9800
|
+
return null;
|
|
9801
|
+
const mountedMatches = mountedNodesById(currentMountedTree, currentOwner.runtimeOwnerId);
|
|
9802
|
+
if (mountedMatches.length !== 1)
|
|
9803
|
+
return null;
|
|
9804
|
+
const current = mountedMatches[0];
|
|
9805
|
+
const nextNode = nextMaterialized.instances
|
|
9806
|
+
.get(nextOwner.runtimeOwnerId)?.node;
|
|
9807
|
+
if (!nextNode
|
|
9808
|
+
|| current.nodeType !== 'Container'
|
|
9809
|
+
|| nextNode.type !== 'Container'
|
|
9810
|
+
|| current.rendererToken !== componentRenderers._default
|
|
9811
|
+
|| !current.visible
|
|
9812
|
+
|| !current.resolvedProps
|
|
9813
|
+
|| !currentOwner.sourcePath
|
|
9814
|
+
|| !nextOwner.sourcePath) {
|
|
9815
|
+
return null;
|
|
9432
9816
|
}
|
|
9433
|
-
const
|
|
9817
|
+
const nextMetadata = resolveBoundMetadata(nextNode, current.occurrenceKey, draft);
|
|
9818
|
+
const currentLayout = getDirectChildRepeatAppendLayout(current.resolvedProps, currentOwner.slot);
|
|
9819
|
+
const nextLayout = nextMetadata.resolvedProps
|
|
9820
|
+
? getDirectChildRepeatAppendLayout(nextMetadata.resolvedProps, nextOwner.slot)
|
|
9821
|
+
: undefined;
|
|
9822
|
+
if (!currentLayout || currentLayout !== nextLayout)
|
|
9823
|
+
return null;
|
|
9824
|
+
let previousSource;
|
|
9825
|
+
let nextSource;
|
|
9826
|
+
try {
|
|
9827
|
+
previousSource = getByJsonPointer(lastPublishedVariables, currentOwner.sourcePath);
|
|
9828
|
+
nextSource = getByJsonPointer(draft, nextOwner.sourcePath);
|
|
9829
|
+
}
|
|
9830
|
+
catch {
|
|
9831
|
+
return null;
|
|
9832
|
+
}
|
|
9833
|
+
if (!Array.isArray(previousSource)
|
|
9834
|
+
|| !Array.isArray(nextSource)
|
|
9835
|
+
|| !hasStrictJsonPrefix(previousSource, nextSource)) {
|
|
9836
|
+
return null;
|
|
9837
|
+
}
|
|
9838
|
+
const nextOccurrenceKeys = occurrenceKeysForChildren(current.occurrenceKey, nextNode.children);
|
|
9839
|
+
if (current.children.length >= nextNode.children.length
|
|
9840
|
+
|| current.children.some((child, index) => (child.occurrenceKey !== nextOccurrenceKeys[index]))
|
|
9841
|
+
|| !childNodeSequenceEqual(current.element, current.children.map(child => child.element))) {
|
|
9842
|
+
return null;
|
|
9843
|
+
}
|
|
9844
|
+
const projectedOwner = projectRepeatOwnerPrefix(nextNode, nextOwner, current);
|
|
9845
|
+
if (!projectedOwner)
|
|
9846
|
+
return null;
|
|
9847
|
+
const comparableOwner = prepareComparableRetainedNode(projectedOwner, current.occurrenceKey, draft, current);
|
|
9848
|
+
if (!comparableOwner || !retainedSubtreeEquivalent(current, comparableOwner)) {
|
|
9849
|
+
return null;
|
|
9850
|
+
}
|
|
9851
|
+
const retainedOwnerKeys = collectRetainedRepeatOwnerKeys(currentMaterialized, currentOwner);
|
|
9852
|
+
if (retainedOwnersConsumeChangedPointer(currentMaterialized, retainedOwnerKeys, changedPointersOutsideSuffix(before, draft, currentOwner.sourcePath))) {
|
|
9853
|
+
return null;
|
|
9854
|
+
}
|
|
9855
|
+
return { currentOwner, nextOwner, current, nextNode };
|
|
9856
|
+
}
|
|
9857
|
+
function classifyRepeatOwners(before, draft, nextMaterialized) {
|
|
9858
|
+
let isolatedUnresolvedAppendKey;
|
|
9859
|
+
if (currentMaterialized.repeatOwners.size === 1
|
|
9860
|
+
&& nextMaterialized.repeatOwners.size === 1
|
|
9861
|
+
&& currentMaterialized.unresolvedRepeatOwners.size === 1
|
|
9862
|
+
&& nextMaterialized.unresolvedRepeatOwners.size === 1) {
|
|
9863
|
+
const [currentKey] = currentMaterialized.unresolvedRepeatOwners;
|
|
9864
|
+
const [nextKey] = nextMaterialized.unresolvedRepeatOwners;
|
|
9865
|
+
const currentOwner = currentMaterialized.repeatOwners.get(currentKey);
|
|
9866
|
+
const nextOwner = nextMaterialized.repeatOwners.get(nextKey);
|
|
9867
|
+
const changedPointers = collectChangedPointers(before, draft);
|
|
9868
|
+
if (currentKey === nextKey
|
|
9869
|
+
&& currentOwner?.sourcePath
|
|
9870
|
+
&& currentOwner.sourcePath === nextOwner?.sourcePath
|
|
9871
|
+
&& changedPointers.length === 1
|
|
9872
|
+
&& changedPointers[0] === currentOwner.sourcePath) {
|
|
9873
|
+
// Complex expressions inside one Repeat are conservatively unresolved.
|
|
9874
|
+
// A source-only update may still enter the existing append proof: the
|
|
9875
|
+
// strict JSON prefix and retained-subtree comparison below must both
|
|
9876
|
+
// succeed before any live DOM is adopted.
|
|
9877
|
+
isolatedUnresolvedAppendKey = currentKey;
|
|
9878
|
+
}
|
|
9879
|
+
}
|
|
9880
|
+
if ((currentMaterialized.unresolvedRepeatOwners.size > 0
|
|
9881
|
+
|| nextMaterialized.unresolvedRepeatOwners.size > 0)
|
|
9882
|
+
&& isolatedUnresolvedAppendKey === undefined) {
|
|
9883
|
+
return {
|
|
9884
|
+
forcedOwnerIds: new Set([currentMaterialized.root.id]),
|
|
9885
|
+
appendPlans: new Map(),
|
|
9886
|
+
};
|
|
9887
|
+
}
|
|
9888
|
+
const selectedKeys = new Set(isolatedUnresolvedAppendKey ? [isolatedUnresolvedAppendKey] : []);
|
|
9434
9889
|
for (const pointer of collectChangedPointers(before, draft)) {
|
|
9435
9890
|
for (const owner of findAffectedRepeatOwners(currentMaterialized, pointer)) {
|
|
9436
9891
|
selectedKeys.add(owner.key);
|
|
@@ -9446,10 +9901,19 @@ function renderBoundCard(container, schema, options) {
|
|
|
9446
9901
|
parentKey = currentMaterialized.repeatOwners.get(parentKey)?.parentKey;
|
|
9447
9902
|
}
|
|
9448
9903
|
}
|
|
9449
|
-
|
|
9450
|
-
|
|
9451
|
-
|
|
9452
|
-
|
|
9904
|
+
const forcedOwnerIds = new Set();
|
|
9905
|
+
const appendPlans = new Map();
|
|
9906
|
+
for (const key of selectedKeys) {
|
|
9907
|
+
const owner = currentMaterialized.repeatOwners.get(key);
|
|
9908
|
+
if (!owner)
|
|
9909
|
+
continue;
|
|
9910
|
+
const plan = createRepeatAppendPlan(owner, nextMaterialized, before, draft);
|
|
9911
|
+
if (plan)
|
|
9912
|
+
appendPlans.set(plan.current.occurrenceKey, plan);
|
|
9913
|
+
else
|
|
9914
|
+
forcedOwnerIds.add(owner.runtimeOwnerId);
|
|
9915
|
+
}
|
|
9916
|
+
return { forcedOwnerIds, appendPlans };
|
|
9453
9917
|
}
|
|
9454
9918
|
function collectMountedLifecycleIds(root) {
|
|
9455
9919
|
const ids = new Set();
|
|
@@ -9481,15 +9945,82 @@ function renderBoundCard(container, schema, options) {
|
|
|
9481
9945
|
prepareReplacementRoots(current.children[index], next.children[index], draft, replacements);
|
|
9482
9946
|
}
|
|
9483
9947
|
}
|
|
9948
|
+
function findPreparedByOccurrenceKey(root, occurrenceKey) {
|
|
9949
|
+
if (root.occurrenceKey === occurrenceKey)
|
|
9950
|
+
return root;
|
|
9951
|
+
for (const child of root.children) {
|
|
9952
|
+
const match = findPreparedByOccurrenceKey(child, occurrenceKey);
|
|
9953
|
+
if (match)
|
|
9954
|
+
return match;
|
|
9955
|
+
}
|
|
9956
|
+
return null;
|
|
9957
|
+
}
|
|
9958
|
+
function disposePreparedRepeatAppend(candidate) {
|
|
9959
|
+
if (candidate.state === 'disposed' || candidate.state === 'adopted')
|
|
9960
|
+
return;
|
|
9961
|
+
for (const suffix of candidate.suffix) {
|
|
9962
|
+
disposeBoundSubtreeWithoutThrow(suffix);
|
|
9963
|
+
}
|
|
9964
|
+
candidate.fragment.replaceChildren();
|
|
9965
|
+
candidate.state = 'disposed';
|
|
9966
|
+
}
|
|
9967
|
+
function prepareRepeatAppendCandidates(preparedRoot, appendPlans, draft) {
|
|
9968
|
+
const candidates = new Map();
|
|
9969
|
+
try {
|
|
9970
|
+
for (const [occurrenceKey, plan] of appendPlans) {
|
|
9971
|
+
const prepared = findPreparedByOccurrenceKey(preparedRoot, occurrenceKey);
|
|
9972
|
+
// Hidden or force-replaced ancestors prune their descendants from the
|
|
9973
|
+
// prepared tree. Their normal replacement commits the new variables;
|
|
9974
|
+
// there is no live descendant append to prepare in this transaction.
|
|
9975
|
+
if (!prepared)
|
|
9976
|
+
continue;
|
|
9977
|
+
if (!prepared[REPEAT_APPEND]) {
|
|
9978
|
+
throw new Error(`[renderCard] Missing prepared repeat append owner "${occurrenceKey}"`);
|
|
9979
|
+
}
|
|
9980
|
+
const nextOccurrenceKeys = occurrenceKeysForChildren(plan.current.occurrenceKey, plan.nextNode.children);
|
|
9981
|
+
const suffix = [];
|
|
9982
|
+
const fragment = document.createDocumentFragment();
|
|
9983
|
+
const candidate = {
|
|
9984
|
+
occurrenceKey,
|
|
9985
|
+
current: plan.current,
|
|
9986
|
+
next: prepared,
|
|
9987
|
+
suffix,
|
|
9988
|
+
fragment,
|
|
9989
|
+
previousChildNodes: Array.from(plan.current.element.childNodes),
|
|
9990
|
+
expectedChildNodes: [],
|
|
9991
|
+
state: 'prepared',
|
|
9992
|
+
};
|
|
9993
|
+
candidates.set(occurrenceKey, candidate);
|
|
9994
|
+
for (let index = plan.current.children.length; index < plan.nextNode.children.length; index += 1) {
|
|
9995
|
+
const mounted = mountBoundSubtree(plan.nextNode.children[index], nextOccurrenceKeys[index], draft);
|
|
9996
|
+
suffix.push(mounted);
|
|
9997
|
+
fragment.appendChild(mounted.element);
|
|
9998
|
+
}
|
|
9999
|
+
candidate.expectedChildNodes = [
|
|
10000
|
+
...candidate.previousChildNodes,
|
|
10001
|
+
...suffix.map(node => node.element),
|
|
10002
|
+
];
|
|
10003
|
+
}
|
|
10004
|
+
return candidates;
|
|
10005
|
+
}
|
|
10006
|
+
catch (error) {
|
|
10007
|
+
for (const candidate of candidates.values()) {
|
|
10008
|
+
disposePreparedRepeatAppend(candidate);
|
|
10009
|
+
}
|
|
10010
|
+
throw error;
|
|
10011
|
+
}
|
|
10012
|
+
}
|
|
9484
10013
|
function prepareIncrementalCandidate(before, draft) {
|
|
9485
10014
|
const materialized = materializeCard(schema, draft);
|
|
9486
|
-
const
|
|
9487
|
-
?
|
|
9488
|
-
|
|
9489
|
-
:
|
|
9490
|
-
|
|
9491
|
-
|
|
10015
|
+
const classification = currentMountedTree
|
|
10016
|
+
? classifyRepeatOwners(before, draft, materialized)
|
|
10017
|
+
: {
|
|
10018
|
+
forcedOwnerIds: new Set(),
|
|
10019
|
+
appendPlans: new Map(),
|
|
10020
|
+
};
|
|
10021
|
+
const preparedRoot = prepareBoundNode(materialized.root, `${materialized.root.id}#0`, draft, classification.forcedOwnerIds, classification.appendPlans, currentMountedTree);
|
|
9492
10022
|
const replacementRoots = new Map();
|
|
10023
|
+
const repeatAppends = prepareRepeatAppendCandidates(preparedRoot, classification.appendPlans, draft);
|
|
9493
10024
|
try {
|
|
9494
10025
|
if (currentMountedTree) {
|
|
9495
10026
|
prepareReplacementRoots(currentMountedTree, preparedRoot, draft, replacementRoots);
|
|
@@ -9501,6 +10032,7 @@ function renderBoundCard(container, schema, options) {
|
|
|
9501
10032
|
materialized,
|
|
9502
10033
|
preparedRoot,
|
|
9503
10034
|
replacementRoots,
|
|
10035
|
+
repeatAppends,
|
|
9504
10036
|
autoFocusIds: currentMountedTree
|
|
9505
10037
|
? collectAutoFocusRevealIds(currentMaterialized, materialized, draft)
|
|
9506
10038
|
: new Set(),
|
|
@@ -9510,6 +10042,9 @@ function renderBoundCard(container, schema, options) {
|
|
|
9510
10042
|
for (const replacement of replacementRoots.values()) {
|
|
9511
10043
|
disposeBoundSubtreeWithoutThrow(replacement);
|
|
9512
10044
|
}
|
|
10045
|
+
for (const append of repeatAppends.values()) {
|
|
10046
|
+
disposePreparedRepeatAppend(append);
|
|
10047
|
+
}
|
|
9513
10048
|
throw error;
|
|
9514
10049
|
}
|
|
9515
10050
|
}
|
|
@@ -9763,6 +10298,10 @@ function renderBoundCard(container, schema, options) {
|
|
|
9763
10298
|
disposeBoundSubtreeWithoutThrow(replacement);
|
|
9764
10299
|
}
|
|
9765
10300
|
candidate.replacementRoots.clear();
|
|
10301
|
+
for (const append of candidate.repeatAppends.values()) {
|
|
10302
|
+
disposePreparedRepeatAppend(append);
|
|
10303
|
+
}
|
|
10304
|
+
candidate.repeatAppends.clear();
|
|
9766
10305
|
}
|
|
9767
10306
|
function restoreChangedSubtreeState(previous, next, scrollPositions, mediaStates) {
|
|
9768
10307
|
if (previous.element !== next.element) {
|
|
@@ -9811,6 +10350,111 @@ function renderBoundCard(container, schema, options) {
|
|
|
9811
10350
|
throw adoptionError;
|
|
9812
10351
|
throw new Error(failureMessage);
|
|
9813
10352
|
}
|
|
10353
|
+
function rollbackRepeatAppend(candidate) {
|
|
10354
|
+
for (let index = candidate.suffix.length - 1; index >= 0; index -= 1) {
|
|
10355
|
+
const element = candidate.suffix[index].element;
|
|
10356
|
+
if (element.parentNode !== candidate.current.element)
|
|
10357
|
+
continue;
|
|
10358
|
+
try {
|
|
10359
|
+
candidate.current.element.removeChild(element);
|
|
10360
|
+
}
|
|
10361
|
+
catch {
|
|
10362
|
+
// The exact previous-sequence postcondition below decides success.
|
|
10363
|
+
}
|
|
10364
|
+
}
|
|
10365
|
+
const restored = childNodeSequenceEqual(candidate.current.element, candidate.previousChildNodes);
|
|
10366
|
+
candidate.state = restored ? 'rolled-back' : 'rollback-failed';
|
|
10367
|
+
return restored;
|
|
10368
|
+
}
|
|
10369
|
+
function tryAdoptRepeatAppend(candidate) {
|
|
10370
|
+
let adoptionError;
|
|
10371
|
+
try {
|
|
10372
|
+
candidate.current.element.appendChild(candidate.fragment);
|
|
10373
|
+
}
|
|
10374
|
+
catch (error) {
|
|
10375
|
+
adoptionError = error;
|
|
10376
|
+
}
|
|
10377
|
+
if (childNodeSequenceEqual(candidate.current.element, candidate.expectedChildNodes)) {
|
|
10378
|
+
candidate.state = 'adopted';
|
|
10379
|
+
return { status: 'adopted' };
|
|
10380
|
+
}
|
|
10381
|
+
const error = adoptionError ?? new Error('[renderCard] Bound repeat append postcondition failed');
|
|
10382
|
+
if (rollbackRepeatAppend(candidate)) {
|
|
10383
|
+
return { status: 'rolled-back', error };
|
|
10384
|
+
}
|
|
10385
|
+
return { status: 'rollback-failed', error };
|
|
10386
|
+
}
|
|
10387
|
+
function mountedSnapshotStillMatches(previous, working) {
|
|
10388
|
+
const appendOwner = Boolean(working[REPEAT_APPEND]);
|
|
10389
|
+
if (previous.element !== working.element
|
|
10390
|
+
|| previous.occurrenceKey !== working.occurrenceKey
|
|
10391
|
+
|| previous.nodeId !== working.nodeId
|
|
10392
|
+
|| previous.nodeType !== working.nodeType
|
|
10393
|
+
|| previous.rendererToken !== working.rendererToken
|
|
10394
|
+
|| previous.visible !== working.visible
|
|
10395
|
+
|| previous.disabled !== working.disabled
|
|
10396
|
+
|| previous.bindingFingerprint !== working.bindingFingerprint
|
|
10397
|
+
|| previous.children.length !== working.children.length
|
|
10398
|
+
|| (!appendOwner && (previous.propsFingerprint !== working.propsFingerprint
|
|
10399
|
+
|| previous.layoutFingerprint !== working.layoutFingerprint))) {
|
|
10400
|
+
return false;
|
|
10401
|
+
}
|
|
10402
|
+
if (appendOwner
|
|
10403
|
+
&& !childNodeSequenceEqual(previous.element, previous.children.map(child => child.element))) {
|
|
10404
|
+
return false;
|
|
10405
|
+
}
|
|
10406
|
+
return previous.children.every((child, index) => (mountedSnapshotStillMatches(child, working.children[index])));
|
|
10407
|
+
}
|
|
10408
|
+
function adoptCompleteNextEmergencyRoot(candidate, renderVariables, previous, working, scrollPositions, mediaStates) {
|
|
10409
|
+
const emergency = mountBoundSubtree(candidate.materialized.root, candidate.preparedRoot.occurrenceKey, renderVariables);
|
|
10410
|
+
let adopted = false;
|
|
10411
|
+
try {
|
|
10412
|
+
syncMountedBindings(emergency);
|
|
10413
|
+
replaceContainerRoot(emergency.element, '[renderCard] Bound emergency root was not adopted');
|
|
10414
|
+
adopted = true;
|
|
10415
|
+
}
|
|
10416
|
+
finally {
|
|
10417
|
+
if (!adopted)
|
|
10418
|
+
disposeBoundSubtreeWithoutThrow(emergency);
|
|
10419
|
+
}
|
|
10420
|
+
disposeBoundSubtreeWithoutThrow(working);
|
|
10421
|
+
try {
|
|
10422
|
+
restoreChangedSubtreeState(previous, emergency, scrollPositions, mediaStates);
|
|
10423
|
+
}
|
|
10424
|
+
catch {
|
|
10425
|
+
// Presentation restoration cannot undo an adopted complete next root.
|
|
10426
|
+
}
|
|
10427
|
+
restoreDisabledDescendantPresentation(emergency);
|
|
10428
|
+
return emergency;
|
|
10429
|
+
}
|
|
10430
|
+
function recoverPreviousCommittedRoot(previous, working, scrollPositions, mediaStates) {
|
|
10431
|
+
const recovery = mountBoundSubtree(currentMaterialized.root, previous.occurrenceKey, lastPublishedVariables);
|
|
10432
|
+
let adopted = false;
|
|
10433
|
+
try {
|
|
10434
|
+
syncMountedBindings(recovery);
|
|
10435
|
+
replaceContainerRoot(recovery.element, '[renderCard] Previous bound root recovery was not adopted');
|
|
10436
|
+
adopted = true;
|
|
10437
|
+
}
|
|
10438
|
+
finally {
|
|
10439
|
+
if (!adopted)
|
|
10440
|
+
disposeBoundSubtreeWithoutThrow(recovery);
|
|
10441
|
+
}
|
|
10442
|
+
disposeBoundSubtreeWithoutThrow(working);
|
|
10443
|
+
try {
|
|
10444
|
+
restoreChangedSubtreeState(previous, recovery, scrollPositions, mediaStates);
|
|
10445
|
+
}
|
|
10446
|
+
catch {
|
|
10447
|
+
// Recovery validity is the adopted previous tree, not presentation state.
|
|
10448
|
+
}
|
|
10449
|
+
restoreDisabledDescendantPresentation(recovery);
|
|
10450
|
+
currentMountedTree = recovery;
|
|
10451
|
+
return recovery;
|
|
10452
|
+
}
|
|
10453
|
+
function repeatAppendUnreconciledError(failures) {
|
|
10454
|
+
const error = new Error('[renderCard] Bound repeat append unreconciled');
|
|
10455
|
+
error.failures = failures;
|
|
10456
|
+
return error;
|
|
10457
|
+
}
|
|
9814
10458
|
function commitIncrementalCandidate(candidate, renderVariables) {
|
|
9815
10459
|
const replacements = candidate.replacementRoots;
|
|
9816
10460
|
try {
|
|
@@ -9832,7 +10476,10 @@ function renderBoundCard(container, schema, options) {
|
|
|
9832
10476
|
const scrollPositions = captureScrollPositions$1(container);
|
|
9833
10477
|
const mediaStates = captureMediaStates$1(container);
|
|
9834
10478
|
let unreconciled = false;
|
|
9835
|
-
|
|
10479
|
+
let previousRecoveryRequired = false;
|
|
10480
|
+
let appendFailure;
|
|
10481
|
+
let repeatAppendTransaction = false;
|
|
10482
|
+
let next = reconcileIncrementalNode(previous, candidate.preparedRoot, {
|
|
9836
10483
|
decide: (current, prepared) => decideBoundUpdate(current, prepared),
|
|
9837
10484
|
update: (current, prepared) => updateBoundNode(current, prepared),
|
|
9838
10485
|
mountReplacement: (prepared) => {
|
|
@@ -9866,6 +10513,60 @@ function renderBoundCard(container, schema, options) {
|
|
|
9866
10513
|
unreconciled = true;
|
|
9867
10514
|
},
|
|
9868
10515
|
});
|
|
10516
|
+
if (!unreconciled) {
|
|
10517
|
+
for (const appendCandidate of candidate.repeatAppends.values()) {
|
|
10518
|
+
const reconciledOwner = findMountedByOccurrenceKey(next, appendCandidate.occurrenceKey);
|
|
10519
|
+
if (!reconciledOwner
|
|
10520
|
+
|| reconciledOwner.element !== appendCandidate.current.element) {
|
|
10521
|
+
disposePreparedRepeatAppend(appendCandidate);
|
|
10522
|
+
candidate.repeatAppends.delete(appendCandidate.occurrenceKey);
|
|
10523
|
+
continue;
|
|
10524
|
+
}
|
|
10525
|
+
repeatAppendTransaction = true;
|
|
10526
|
+
const grafted = {
|
|
10527
|
+
...appendCandidate.next,
|
|
10528
|
+
element: reconciledOwner.element,
|
|
10529
|
+
children: [
|
|
10530
|
+
...reconciledOwner.children,
|
|
10531
|
+
...appendCandidate.suffix,
|
|
10532
|
+
],
|
|
10533
|
+
};
|
|
10534
|
+
const graftedRoot = replaceMountedByOccurrenceKey(next, appendCandidate.occurrenceKey, grafted);
|
|
10535
|
+
if (!graftedRoot) {
|
|
10536
|
+
disposePreparedRepeatAppend(appendCandidate);
|
|
10537
|
+
candidate.repeatAppends.delete(appendCandidate.occurrenceKey);
|
|
10538
|
+
unreconciled = true;
|
|
10539
|
+
appendFailure = new Error('[renderCard] Bound repeat append owner disappeared before adoption');
|
|
10540
|
+
break;
|
|
10541
|
+
}
|
|
10542
|
+
const result = tryAdoptRepeatAppend(appendCandidate);
|
|
10543
|
+
if (result.status === 'adopted') {
|
|
10544
|
+
next = graftedRoot;
|
|
10545
|
+
candidate.repeatAppends.delete(appendCandidate.occurrenceKey);
|
|
10546
|
+
continue;
|
|
10547
|
+
}
|
|
10548
|
+
appendFailure = result.error;
|
|
10549
|
+
if (result.status === 'rolled-back') {
|
|
10550
|
+
unreconciled = true;
|
|
10551
|
+
}
|
|
10552
|
+
else {
|
|
10553
|
+
previousRecoveryRequired = true;
|
|
10554
|
+
}
|
|
10555
|
+
break;
|
|
10556
|
+
}
|
|
10557
|
+
}
|
|
10558
|
+
if (previousRecoveryRequired) {
|
|
10559
|
+
try {
|
|
10560
|
+
recoverPreviousCommittedRoot(previous, next, scrollPositions, mediaStates);
|
|
10561
|
+
}
|
|
10562
|
+
catch (recoveryError) {
|
|
10563
|
+
throw repeatAppendUnreconciledError([
|
|
10564
|
+
appendFailure,
|
|
10565
|
+
recoveryError,
|
|
10566
|
+
]);
|
|
10567
|
+
}
|
|
10568
|
+
throw appendFailure;
|
|
10569
|
+
}
|
|
9869
10570
|
if (!unreconciled
|
|
9870
10571
|
&& (next.element.parentNode !== container
|
|
9871
10572
|
|| container.firstElementChild !== next.element)) {
|
|
@@ -9879,7 +10580,7 @@ function renderBoundCard(container, schema, options) {
|
|
|
9879
10580
|
unreconciled = true;
|
|
9880
10581
|
}
|
|
9881
10582
|
}
|
|
9882
|
-
if (unreconciled) {
|
|
10583
|
+
if (unreconciled && !repeatAppendTransaction) {
|
|
9883
10584
|
let emergency;
|
|
9884
10585
|
try {
|
|
9885
10586
|
emergency = mountBoundSubtree(candidate.materialized.root, candidate.preparedRoot.occurrenceKey, renderVariables);
|
|
@@ -9910,6 +10611,29 @@ function renderBoundCard(container, schema, options) {
|
|
|
9910
10611
|
restoreDisabledDescendantPresentation(emergency);
|
|
9911
10612
|
return emergency;
|
|
9912
10613
|
}
|
|
10614
|
+
if (unreconciled) {
|
|
10615
|
+
try {
|
|
10616
|
+
return adoptCompleteNextEmergencyRoot(candidate, renderVariables, previous, next, scrollPositions, mediaStates);
|
|
10617
|
+
}
|
|
10618
|
+
catch (emergencyError) {
|
|
10619
|
+
if (mountedTreeOrderMatchesDom(previous)
|
|
10620
|
+
&& mountedSnapshotStillMatches(previous, next)) {
|
|
10621
|
+
syncMountedBindings(previous);
|
|
10622
|
+
throw appendFailure ?? emergencyError;
|
|
10623
|
+
}
|
|
10624
|
+
try {
|
|
10625
|
+
recoverPreviousCommittedRoot(previous, next, scrollPositions, mediaStates);
|
|
10626
|
+
}
|
|
10627
|
+
catch (recoveryError) {
|
|
10628
|
+
throw repeatAppendUnreconciledError([
|
|
10629
|
+
appendFailure,
|
|
10630
|
+
emergencyError,
|
|
10631
|
+
recoveryError,
|
|
10632
|
+
]);
|
|
10633
|
+
}
|
|
10634
|
+
throw appendFailure ?? emergencyError;
|
|
10635
|
+
}
|
|
10636
|
+
}
|
|
9913
10637
|
try {
|
|
9914
10638
|
restoreChangedSubtreeState(previous, next, scrollPositions, mediaStates);
|
|
9915
10639
|
}
|
|
@@ -10164,6 +10888,7 @@ function renderBoundCard(container, schema, options) {
|
|
|
10164
10888
|
return {
|
|
10165
10889
|
getNode: nodeAccess.getNode,
|
|
10166
10890
|
onFocusChange: nodeAccess.onFocusChange,
|
|
10891
|
+
onScroll: nodeAccess.onScroll,
|
|
10167
10892
|
dispose() {
|
|
10168
10893
|
if (disposed || disposeRequested)
|
|
10169
10894
|
return;
|
|
@@ -10527,25 +11252,6 @@ function renderStaticCard(container, schema, options) {
|
|
|
10527
11252
|
bindingFingerprint: nodeBindingFingerprint(node, resolvedProps, disabled),
|
|
10528
11253
|
};
|
|
10529
11254
|
}
|
|
10530
|
-
function applyDisabledState(element, disabled) {
|
|
10531
|
-
if (!disabled)
|
|
10532
|
-
return;
|
|
10533
|
-
element.setAttribute('data-disabled', 'true');
|
|
10534
|
-
element.style.background = '#F5F5F5';
|
|
10535
|
-
element.style.color = '#C0C0C0';
|
|
10536
|
-
element.style.setProperty('--card-disabled-color', '#C0C0C0');
|
|
10537
|
-
element.style.pointerEvents = 'none';
|
|
10538
|
-
element.style.cursor = 'default';
|
|
10539
|
-
}
|
|
10540
|
-
function applyDisabledDescendants(element, disabled) {
|
|
10541
|
-
if (!disabled)
|
|
10542
|
-
return;
|
|
10543
|
-
element.querySelectorAll('*').forEach((child) => {
|
|
10544
|
-
const htmlChild = child;
|
|
10545
|
-
htmlChild.setAttribute('data-disabled', 'true');
|
|
10546
|
-
htmlChild.style.setProperty('--card-disabled-color', '#C0C0C0');
|
|
10547
|
-
});
|
|
10548
|
-
}
|
|
10549
11255
|
function runStaticEventActions(steps, detail) {
|
|
10550
11256
|
if (disposed)
|
|
10551
11257
|
return;
|
|
@@ -11009,6 +11715,7 @@ function renderStaticCard(container, schema, options) {
|
|
|
11009
11715
|
return {
|
|
11010
11716
|
getNode: nodeAccess.getNode,
|
|
11011
11717
|
onFocusChange: nodeAccess.onFocusChange,
|
|
11718
|
+
onScroll: nodeAccess.onScroll,
|
|
11012
11719
|
dispose() {
|
|
11013
11720
|
if (disposed || disposeRequested)
|
|
11014
11721
|
return;
|
|
@@ -11382,13 +12089,7 @@ function renderStreamingCard(container, options = {}) {
|
|
|
11382
12089
|
const isDisabled = computeBoundDisabled(node, renderVariables);
|
|
11383
12090
|
const renderer = (componentRenderers[node.type] ?? componentRenderers._default);
|
|
11384
12091
|
const element = renderer(node, resolvedProps, isMobile, options.responsive);
|
|
11385
|
-
|
|
11386
|
-
element.setAttribute('data-disabled', 'true');
|
|
11387
|
-
element.style.background = '#F5F5F5';
|
|
11388
|
-
element.style.color = '#C0C0C0';
|
|
11389
|
-
element.style.setProperty('--card-disabled-color', '#C0C0C0');
|
|
11390
|
-
element.style.pointerEvents = 'none';
|
|
11391
|
-
}
|
|
12092
|
+
applyDisabledState(element, isDisabled);
|
|
11392
12093
|
const variableKey = resolvedProps.variableKey;
|
|
11393
12094
|
if (variableKey) {
|
|
11394
12095
|
element.addEventListener('input', ((event) => {
|
|
@@ -11432,6 +12133,7 @@ function renderStreamingCard(container, options = {}) {
|
|
|
11432
12133
|
element.appendChild(renderChild(child));
|
|
11433
12134
|
}
|
|
11434
12135
|
}
|
|
12136
|
+
applyDisabledDescendants(element, isDisabled);
|
|
11435
12137
|
applyResponsiveStyles(element, createResponsiveContext(isMobile, options.responsive));
|
|
11436
12138
|
return element;
|
|
11437
12139
|
}
|
|
@@ -11464,25 +12166,12 @@ function renderStreamingCard(container, options = {}) {
|
|
|
11464
12166
|
hiddenSet.delete(node.id);
|
|
11465
12167
|
propsCache.set(node.id, fingerprint(resolvedProps, node.directives));
|
|
11466
12168
|
// Check disabled
|
|
11467
|
-
|
|
11468
|
-
if (node.directives?.disabled) {
|
|
11469
|
-
const disabledExpr = node.directives.disabled;
|
|
11470
|
-
const resolved = hasExpression(disabledExpr)
|
|
11471
|
-
? resolveExpression(disabledExpr, variables)
|
|
11472
|
-
: disabledExpr;
|
|
11473
|
-
isDisabled = resolved === true || resolved === 'true' || resolved === 1;
|
|
11474
|
-
}
|
|
12169
|
+
const isDisabled = computeDisabled(node);
|
|
11475
12170
|
// Create element
|
|
11476
12171
|
const renderer = componentRenderers[node.type] ?? componentRenderers['_default'];
|
|
11477
12172
|
const el = renderer(node, resolvedProps, isMobile, options.responsive);
|
|
11478
12173
|
// Apply disabled
|
|
11479
|
-
|
|
11480
|
-
el.setAttribute('data-disabled', 'true');
|
|
11481
|
-
el.style.background = '#F5F5F5';
|
|
11482
|
-
el.style.color = '#C0C0C0';
|
|
11483
|
-
el.style.setProperty('--card-disabled-color', '#C0C0C0');
|
|
11484
|
-
el.style.pointerEvents = 'none';
|
|
11485
|
-
}
|
|
12174
|
+
applyDisabledState(el, isDisabled);
|
|
11486
12175
|
// variableKey auto-sync
|
|
11487
12176
|
const variableKey = resolvedProps.variableKey;
|
|
11488
12177
|
if (variableKey) {
|
|
@@ -11534,6 +12223,7 @@ function renderStreamingCard(container, options = {}) {
|
|
|
11534
12223
|
el.appendChild(renderChild(child));
|
|
11535
12224
|
}
|
|
11536
12225
|
}
|
|
12226
|
+
applyDisabledDescendants(el, isDisabled);
|
|
11537
12227
|
applyResponsiveStyles(el, createResponsiveContext(isMobile, options.responsive));
|
|
11538
12228
|
return el;
|
|
11539
12229
|
}
|
|
@@ -11566,6 +12256,16 @@ function renderStreamingCard(container, options = {}) {
|
|
|
11566
12256
|
: visibleExpr;
|
|
11567
12257
|
return !(resolved === false || resolved === 'false' || resolved === '' || resolved === 0);
|
|
11568
12258
|
}
|
|
12259
|
+
/** Evaluate `directives.disabled` for an element against current variables. */
|
|
12260
|
+
function computeDisabled(element) {
|
|
12261
|
+
const disabledExpr = element.directives?.disabled;
|
|
12262
|
+
if (!disabledExpr)
|
|
12263
|
+
return false;
|
|
12264
|
+
const resolved = hasExpression(disabledExpr)
|
|
12265
|
+
? resolveExpression(disabledExpr, variables)
|
|
12266
|
+
: disabledExpr;
|
|
12267
|
+
return resolved === true || resolved === 'true' || resolved === 1;
|
|
12268
|
+
}
|
|
11569
12269
|
function collectLegacyAutoFocusRevealIds(schema, previousVariables) {
|
|
11570
12270
|
let tree;
|
|
11571
12271
|
try {
|
|
@@ -11643,6 +12343,7 @@ function renderStreamingCard(container, options = {}) {
|
|
|
11643
12343
|
if (!subtree)
|
|
11644
12344
|
return false;
|
|
11645
12345
|
const newEl = renderNode(subtree, schema.actions ?? {});
|
|
12346
|
+
disposeChartsIn(oldEl);
|
|
11646
12347
|
oldEl.replaceWith(newEl);
|
|
11647
12348
|
return true;
|
|
11648
12349
|
}
|
|
@@ -11701,12 +12402,23 @@ function renderStreamingCard(container, options = {}) {
|
|
|
11701
12402
|
}
|
|
11702
12403
|
if (!nowVisible)
|
|
11703
12404
|
continue; // still hidden — resolved props don't matter
|
|
12405
|
+
const wasDisabled = el.getAttribute('data-copilot-card-disabled') === 'true';
|
|
12406
|
+
if (computeDisabled(element) !== wasDisabled) {
|
|
12407
|
+
if (!replaceSubtree(schema, id, el)) {
|
|
12408
|
+
safeRenderFull();
|
|
12409
|
+
applyAutoFocusIds(autoFocusIds);
|
|
12410
|
+
return;
|
|
12411
|
+
}
|
|
12412
|
+
continue;
|
|
12413
|
+
}
|
|
11704
12414
|
const resolved = resolveNodeProps(element);
|
|
11705
12415
|
const key = fingerprint(resolved, element.directives);
|
|
11706
12416
|
if (propsCache.get(id) === key)
|
|
11707
12417
|
continue;
|
|
11708
12418
|
if ('updateProps' in el) {
|
|
11709
12419
|
el.updateProps(resolved, isMobile, options.responsive);
|
|
12420
|
+
// Some components replace host cssText while updating their props.
|
|
12421
|
+
applyDisabledState(el, wasDisabled);
|
|
11710
12422
|
propsCache.set(id, key);
|
|
11711
12423
|
}
|
|
11712
12424
|
else if (!replaceSubtree(schema, id, el)) {
|
|
@@ -12863,6 +13575,14 @@ function renderStreamingCard(container, options = {}) {
|
|
|
12863
13575
|
}
|
|
12864
13576
|
if (!nowVisible)
|
|
12865
13577
|
continue;
|
|
13578
|
+
const wasDisabled = el.getAttribute('data-copilot-card-disabled') === 'true';
|
|
13579
|
+
if (computeDisabled(element) !== wasDisabled) {
|
|
13580
|
+
if (!replaceSubtree(schema, id, el)) {
|
|
13581
|
+
needFull = true;
|
|
13582
|
+
break;
|
|
13583
|
+
}
|
|
13584
|
+
continue;
|
|
13585
|
+
}
|
|
12866
13586
|
const resolved = resolveNodeProps(element);
|
|
12867
13587
|
const key = fingerprint(resolved, element.directives);
|
|
12868
13588
|
if (propsCache.get(id) === key)
|
|
@@ -12870,6 +13590,7 @@ function renderStreamingCard(container, options = {}) {
|
|
|
12870
13590
|
const typeChanged = el.getAttribute('data-card-type') !== element.type;
|
|
12871
13591
|
if (!typeChanged && 'updateProps' in el) {
|
|
12872
13592
|
el.updateProps(resolved, isMobile, options.responsive);
|
|
13593
|
+
applyDisabledState(el, wasDisabled);
|
|
12873
13594
|
propsCache.set(id, key);
|
|
12874
13595
|
}
|
|
12875
13596
|
else if (!typeChanged && isChildrenOnlyChange(propsCache.get(id), key, element)) {
|
|
@@ -13025,6 +13746,7 @@ function renderStreamingCard(container, options = {}) {
|
|
|
13025
13746
|
return {
|
|
13026
13747
|
getNode: nodeAccess.getNode,
|
|
13027
13748
|
onFocusChange: nodeAccess.onFocusChange,
|
|
13749
|
+
onScroll: nodeAccess.onScroll,
|
|
13028
13750
|
applyCommand(command) {
|
|
13029
13751
|
if (!lockMode('commands'))
|
|
13030
13752
|
return;
|