@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/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
- return slots && Object.keys(slots).find(key => key !== SLOT_LAYOUT.DEFAULT);
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.setAttribute(attribute.name, attribute.value);
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-color, #C0C0C0) !important;
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: #F5F5F5 !important;
3270
- color: var(--card-disabled-color, #C0C0C0) !important;
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
- this.setShadowHTML(`
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
- <div class="lightbox">
4047
- <button class="lightbox-close" aria-label="Close">&times;</button>
4048
- <img class="lightbox-image" src="${imgSrc}" alt="${imgAlt}" />
4049
- </div>
4050
- `);
4083
+ ${preview ? `
4084
+ <div class="lightbox">
4085
+ <button class="lightbox-close" aria-label="Close">&times;</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 || !lightbox)
4130
+ if (!img)
4080
4131
  return;
4081
4132
  // Handle image load/error states
4082
- img.addEventListener('load', () => {
4083
- img.classList.remove('loading');
4084
- });
4085
- img.addEventListener('error', () => {
4086
- img.classList.remove('loading');
4087
- img.classList.add('error');
4088
- });
4089
- if (!preview)
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
- // Open lightbox on image click
4092
- img.addEventListener('click', (e) => {
4093
- e.stopPropagation();
4094
- this.openLightbox(lightbox);
4095
- });
4156
+ }
4096
4157
  // Close lightbox on overlay/close button click
4097
- lightbox.addEventListener('click', () => {
4098
- this.closeLightbox(lightbox);
4099
- });
4100
- closeBtn.addEventListener('click', (e) => {
4101
- e.stopPropagation();
4102
- this.closeLightbox(lightbox);
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
- // Add escape key listener
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-color, #C0C0C0) !important;
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 listeners = new Set();
8944
+ const focusListeners = new Set();
8945
+ const scrollSubscriptions = new Map();
8879
8946
  let focusedId = null;
8880
8947
  let focusSyncScheduled = false;
8881
- let observing = false;
8948
+ let focusObserving = false;
8949
+ let scrollObserving = false;
8882
8950
  let observationEpoch = 0;
8883
- let observer = null;
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 || !observing)
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 [...listeners]) {
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 || !observing || focusSyncScheduled)
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 startObserving = () => {
8984
- if (disposed || observing)
9051
+ const startFocusObserving = () => {
9052
+ if (disposed || focusObserving)
8985
9053
  return;
8986
- observing = true;
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
- observer ?? (observer = new MutationObserver(scheduleFocusSync));
8993
- observer.observe(container, { childList: true, subtree: true });
9060
+ focusObserver ?? (focusObserver = new MutationObserver(scheduleFocusSync));
9061
+ focusObserver.observe(container, { childList: true, subtree: true });
8994
9062
  }
8995
9063
  };
8996
- const stopObserving = () => {
8997
- if (!observing)
9064
+ const stopFocusObserving = () => {
9065
+ if (!focusObserving)
8998
9066
  return;
8999
- observing = false;
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
- () => observer?.disconnect(),
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
- listeners.add(listener);
9023
- if (listeners.size === 1)
9024
- startObserving();
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
- listeners.delete(listener);
9031
- if (listeners.size === 0)
9032
- stopObserving();
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
- stopObserving();
9185
+ stopFocusObserving();
9186
+ stopScrollObserving();
9039
9187
  disposed = true;
9040
- listeners.clear();
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 selectForcedRepeatOwnerIds(before, draft) {
9430
- if (currentMaterialized.unresolvedRepeatOwners.size > 0) {
9431
- return new Set([currentMaterialized.root.id]);
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 selectedKeys = new Set();
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
- return new Set([...selectedKeys].flatMap((key) => {
9450
- const id = currentMaterialized.repeatOwners.get(key)?.runtimeOwnerId;
9451
- return id ? [id] : [];
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 forcedOwnerIds = currentMountedTree
9487
- ? materialized.unresolvedRepeatOwners.size > 0
9488
- ? new Set([materialized.root.id])
9489
- : selectForcedRepeatOwnerIds(before, draft)
9490
- : new Set();
9491
- const preparedRoot = prepareBoundNode(materialized.root, `${materialized.root.id}#0`, draft, forcedOwnerIds, currentMountedTree);
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
- const next = reconcileIncrementalNode(previous, candidate.preparedRoot, {
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
- if (isDisabled) {
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
- let isDisabled = false;
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
- if (isDisabled) {
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;