@antglobal/copilot-cards-web 1.0.8 → 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) {
@@ -2662,7 +2686,7 @@ class CardText extends BaseElement {
2662
2686
  word-break: break-word;
2663
2687
  }
2664
2688
  :host([data-disabled]) .card-text {
2665
- color: var(--card-disabled-color, #C0C0C0) !important;
2689
+ color: var(--card-disabled-foreground, #C0C0C0) !important;
2666
2690
  }
2667
2691
  .card-text {
2668
2692
  /* Block-level so line boxes form inside this element and its own
@@ -3268,8 +3292,11 @@ class CardButton extends BaseElement {
3268
3292
  background: transparent !important;
3269
3293
  }
3270
3294
  :host([data-disabled]) .card-btn {
3271
- background-color: #F5F5F5 !important;
3272
- 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;
3273
3300
  border: none !important;
3274
3301
  cursor: default;
3275
3302
  pointer-events: none;
@@ -7052,7 +7079,7 @@ class CardHtml extends BaseElement {
7052
7079
  word-break: break-word;
7053
7080
  }
7054
7081
  :host([data-disabled]) .card-html {
7055
- color: var(--card-disabled-color, #C0C0C0) !important;
7082
+ color: var(--card-disabled-foreground, #C0C0C0) !important;
7056
7083
  }
7057
7084
  .card-html img { max-width: 100%; } /* keep images from bursting the card */
7058
7085
  </style>
@@ -7084,12 +7111,14 @@ if (typeof customElements !== 'undefined' && !customElements.get(CardHtml.is)) {
7084
7111
  * as a string so it can be injected into each component's Shadow DOM.
7085
7112
  * Global stylesheets cannot pierce shadow roots, and shipping a raw
7086
7113
  * `.css` import would push CSS-loader requirements onto every consumer
7087
- * 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.
7088
7117
  *
7089
7118
  * Regenerate after upgrading vanilla-calendar-pro:
7090
7119
  * npm run sync:vcp-css --workspace=packages/copilot-cards-web
7091
7120
  */
7092
- 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))}";
7093
7122
 
7094
7123
  /**
7095
7124
  * CardDatePicker — Custom Element for a single-date picker.
@@ -8912,12 +8941,14 @@ const FOCUS_TARGET_SELECTOR = [
8912
8941
  */
8913
8942
  function createCardNodeAccess(container) {
8914
8943
  const handles = new Map();
8915
- const listeners = new Set();
8944
+ const focusListeners = new Set();
8945
+ const scrollSubscriptions = new Map();
8916
8946
  let focusedId = null;
8917
8947
  let focusSyncScheduled = false;
8918
- let observing = false;
8948
+ let focusObserving = false;
8949
+ let scrollObserving = false;
8919
8950
  let observationEpoch = 0;
8920
- let observer = null;
8951
+ let focusObserver = null;
8921
8952
  let disposed = false;
8922
8953
  const resolveElement = (id) => {
8923
8954
  if (disposed)
@@ -8988,7 +9019,7 @@ function createCardNodeAccess(container) {
8988
9019
  return null;
8989
9020
  };
8990
9021
  const syncFocus = () => {
8991
- if (disposed || !observing)
9022
+ if (disposed || !focusObserving)
8992
9023
  return;
8993
9024
  const nextId = resolveFocusedId();
8994
9025
  if (nextId === focusedId)
@@ -8996,7 +9027,7 @@ function createCardNodeAccess(container) {
8996
9027
  const previousNode = focusedId ? getNode(focusedId) : null;
8997
9028
  const node = nextId ? getNode(nextId) : null;
8998
9029
  focusedId = nextId;
8999
- for (const listener of [...listeners]) {
9030
+ for (const listener of [...focusListeners]) {
9000
9031
  try {
9001
9032
  listener({ node, previousNode });
9002
9033
  }
@@ -9006,7 +9037,7 @@ function createCardNodeAccess(container) {
9006
9037
  }
9007
9038
  };
9008
9039
  const scheduleFocusSync = () => {
9009
- if (disposed || !observing || focusSyncScheduled)
9040
+ if (disposed || !focusObserving || focusSyncScheduled)
9010
9041
  return;
9011
9042
  focusSyncScheduled = true;
9012
9043
  const scheduledEpoch = observationEpoch;
@@ -9017,29 +9048,29 @@ function createCardNodeAccess(container) {
9017
9048
  syncFocus();
9018
9049
  });
9019
9050
  };
9020
- const startObserving = () => {
9021
- if (disposed || observing)
9051
+ const startFocusObserving = () => {
9052
+ if (disposed || focusObserving)
9022
9053
  return;
9023
- observing = true;
9054
+ focusObserving = true;
9024
9055
  observationEpoch += 1;
9025
9056
  focusedId = resolveFocusedId();
9026
9057
  container.addEventListener('focusin', scheduleFocusSync, true);
9027
9058
  container.addEventListener('focusout', scheduleFocusSync, true);
9028
9059
  if (typeof MutationObserver !== 'undefined') {
9029
- observer ?? (observer = new MutationObserver(scheduleFocusSync));
9030
- observer.observe(container, { childList: true, subtree: true });
9060
+ focusObserver ?? (focusObserver = new MutationObserver(scheduleFocusSync));
9061
+ focusObserver.observe(container, { childList: true, subtree: true });
9031
9062
  }
9032
9063
  };
9033
- const stopObserving = () => {
9034
- if (!observing)
9064
+ const stopFocusObserving = () => {
9065
+ if (!focusObserving)
9035
9066
  return;
9036
- observing = false;
9067
+ focusObserving = false;
9037
9068
  observationEpoch += 1;
9038
9069
  focusSyncScheduled = false;
9039
9070
  const cleanupSteps = [
9040
9071
  () => container.removeEventListener('focusin', scheduleFocusSync, true),
9041
9072
  () => container.removeEventListener('focusout', scheduleFocusSync, true),
9042
- () => observer?.disconnect(),
9073
+ () => focusObserver?.disconnect(),
9043
9074
  ];
9044
9075
  for (const cleanup of cleanupSteps) {
9045
9076
  try {
@@ -9051,36 +9082,139 @@ function createCardNodeAccess(container) {
9051
9082
  }
9052
9083
  focusedId = null;
9053
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
+ };
9054
9140
  return {
9055
9141
  getNode,
9056
9142
  onFocusChange(listener) {
9057
9143
  if (disposed)
9058
9144
  return () => { };
9059
- listeners.add(listener);
9060
- if (listeners.size === 1)
9061
- 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();
9062
9169
  let subscribed = true;
9063
9170
  return () => {
9064
9171
  if (!subscribed)
9065
9172
  return;
9066
9173
  subscribed = false;
9067
- listeners.delete(listener);
9068
- if (listeners.size === 0)
9069
- 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();
9070
9180
  };
9071
9181
  },
9072
9182
  dispose() {
9073
9183
  if (disposed)
9074
9184
  return;
9075
- stopObserving();
9185
+ stopFocusObserving();
9186
+ stopScrollObserving();
9076
9187
  disposed = true;
9077
- listeners.clear();
9188
+ focusListeners.clear();
9189
+ scrollSubscriptions.clear();
9078
9190
  handles.clear();
9079
9191
  },
9080
9192
  };
9081
9193
  }
9082
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
+
9083
9216
  const FORCE_REPLACE = Symbol('bound-force-replace');
9217
+ const REPEAT_APPEND = Symbol('bound-repeat-append');
9084
9218
  /**
9085
9219
  * Render the scoped/materialized branch of a card.
9086
9220
  *
@@ -9200,25 +9334,6 @@ function renderBoundCard(container, schema, options) {
9200
9334
  bindingFingerprint: nodeBindingFingerprint(node, resolvedProps, disabled),
9201
9335
  };
9202
9336
  }
9203
- function applyDisabledState(element, disabled) {
9204
- if (!disabled)
9205
- return;
9206
- element.setAttribute('data-disabled', 'true');
9207
- element.style.background = '#F5F5F5';
9208
- element.style.color = '#C0C0C0';
9209
- element.style.setProperty('--card-disabled-color', '#C0C0C0');
9210
- element.style.pointerEvents = 'none';
9211
- element.style.cursor = 'default';
9212
- }
9213
- function applyDisabledDescendants(element, disabled) {
9214
- if (!disabled)
9215
- return;
9216
- element.querySelectorAll('*').forEach((child) => {
9217
- const htmlChild = child;
9218
- htmlChild.setAttribute('data-disabled', 'true');
9219
- htmlChild.style.setProperty('--card-disabled-color', '#C0C0C0');
9220
- });
9221
- }
9222
9337
  function disposeBoundElement(element) {
9223
9338
  const cleanupSteps = [
9224
9339
  () => clearSlotOwnerBehaviorsIn(element),
@@ -9366,9 +9481,12 @@ function renderBoundCard(container, schema, options) {
9366
9481
  collectMountedOccurrences(child, occurrences);
9367
9482
  }
9368
9483
  }
9369
- function prepareBoundNode(node, occurrenceKey, renderVariables, forcedOwnerIds, current) {
9484
+ function prepareBoundNode(node, occurrenceKey, renderVariables, forcedOwnerIds, appendPlans, current) {
9370
9485
  const metadata = resolveBoundMetadata(node, occurrenceKey, renderVariables);
9371
9486
  const forceReplace = forcedOwnerIds.has(node.id);
9487
+ const appendPlan = current
9488
+ ? appendPlans.get(current.occurrenceKey)
9489
+ : undefined;
9372
9490
  if (!metadata.visible || forceReplace) {
9373
9491
  return {
9374
9492
  ...metadata,
@@ -9394,14 +9512,17 @@ function renderBoundCard(container, schema, options) {
9394
9512
  const ordinal = nextChildOrdinals.get(currentChild.nodeId) ?? 0;
9395
9513
  nextChildOrdinals.set(currentChild.nodeId, ordinal + 1);
9396
9514
  const child = matching[Math.min(ordinal, matching.length - 1)];
9397
- children.push(prepareBoundNode(child, currentChild.occurrenceKey, renderVariables, forcedOwnerIds, currentChild));
9515
+ children.push(prepareBoundNode(child, currentChild.occurrenceKey, renderVariables, forcedOwnerIds, appendPlans, currentChild));
9398
9516
  }
9399
9517
  return {
9400
9518
  ...metadata,
9519
+ ...(appendPlan ? { [REPEAT_APPEND]: true } : {}),
9401
9520
  children,
9402
9521
  };
9403
9522
  }
9404
9523
  function decideBoundUpdate(current, next) {
9524
+ if (next[REPEAT_APPEND])
9525
+ return 'retain';
9405
9526
  if (next[FORCE_REPLACE]
9406
9527
  || current.occurrenceKey !== next.occurrenceKey
9407
9528
  || current.nodeId !== next.nodeId
@@ -9463,11 +9584,308 @@ function renderBoundCard(container, schema, options) {
9463
9584
  }
9464
9585
  return changed;
9465
9586
  }
9466
- function selectForcedRepeatOwnerIds(before, draft) {
9467
- if (currentMaterialized.unresolvedRepeatOwners.size > 0) {
9468
- 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;
9816
+ }
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;
9469
9843
  }
9470
- const selectedKeys = new Set();
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] : []);
9471
9889
  for (const pointer of collectChangedPointers(before, draft)) {
9472
9890
  for (const owner of findAffectedRepeatOwners(currentMaterialized, pointer)) {
9473
9891
  selectedKeys.add(owner.key);
@@ -9483,10 +9901,19 @@ function renderBoundCard(container, schema, options) {
9483
9901
  parentKey = currentMaterialized.repeatOwners.get(parentKey)?.parentKey;
9484
9902
  }
9485
9903
  }
9486
- return new Set([...selectedKeys].flatMap((key) => {
9487
- const id = currentMaterialized.repeatOwners.get(key)?.runtimeOwnerId;
9488
- return id ? [id] : [];
9489
- }));
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 };
9490
9917
  }
9491
9918
  function collectMountedLifecycleIds(root) {
9492
9919
  const ids = new Set();
@@ -9518,15 +9945,82 @@ function renderBoundCard(container, schema, options) {
9518
9945
  prepareReplacementRoots(current.children[index], next.children[index], draft, replacements);
9519
9946
  }
9520
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
+ }
9521
10013
  function prepareIncrementalCandidate(before, draft) {
9522
10014
  const materialized = materializeCard(schema, draft);
9523
- const forcedOwnerIds = currentMountedTree
9524
- ? materialized.unresolvedRepeatOwners.size > 0
9525
- ? new Set([materialized.root.id])
9526
- : selectForcedRepeatOwnerIds(before, draft)
9527
- : new Set();
9528
- 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);
9529
10022
  const replacementRoots = new Map();
10023
+ const repeatAppends = prepareRepeatAppendCandidates(preparedRoot, classification.appendPlans, draft);
9530
10024
  try {
9531
10025
  if (currentMountedTree) {
9532
10026
  prepareReplacementRoots(currentMountedTree, preparedRoot, draft, replacementRoots);
@@ -9538,6 +10032,7 @@ function renderBoundCard(container, schema, options) {
9538
10032
  materialized,
9539
10033
  preparedRoot,
9540
10034
  replacementRoots,
10035
+ repeatAppends,
9541
10036
  autoFocusIds: currentMountedTree
9542
10037
  ? collectAutoFocusRevealIds(currentMaterialized, materialized, draft)
9543
10038
  : new Set(),
@@ -9547,6 +10042,9 @@ function renderBoundCard(container, schema, options) {
9547
10042
  for (const replacement of replacementRoots.values()) {
9548
10043
  disposeBoundSubtreeWithoutThrow(replacement);
9549
10044
  }
10045
+ for (const append of repeatAppends.values()) {
10046
+ disposePreparedRepeatAppend(append);
10047
+ }
9550
10048
  throw error;
9551
10049
  }
9552
10050
  }
@@ -9800,6 +10298,10 @@ function renderBoundCard(container, schema, options) {
9800
10298
  disposeBoundSubtreeWithoutThrow(replacement);
9801
10299
  }
9802
10300
  candidate.replacementRoots.clear();
10301
+ for (const append of candidate.repeatAppends.values()) {
10302
+ disposePreparedRepeatAppend(append);
10303
+ }
10304
+ candidate.repeatAppends.clear();
9803
10305
  }
9804
10306
  function restoreChangedSubtreeState(previous, next, scrollPositions, mediaStates) {
9805
10307
  if (previous.element !== next.element) {
@@ -9848,6 +10350,111 @@ function renderBoundCard(container, schema, options) {
9848
10350
  throw adoptionError;
9849
10351
  throw new Error(failureMessage);
9850
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
+ }
9851
10458
  function commitIncrementalCandidate(candidate, renderVariables) {
9852
10459
  const replacements = candidate.replacementRoots;
9853
10460
  try {
@@ -9869,7 +10476,10 @@ function renderBoundCard(container, schema, options) {
9869
10476
  const scrollPositions = captureScrollPositions$1(container);
9870
10477
  const mediaStates = captureMediaStates$1(container);
9871
10478
  let unreconciled = false;
9872
- const next = reconcileIncrementalNode(previous, candidate.preparedRoot, {
10479
+ let previousRecoveryRequired = false;
10480
+ let appendFailure;
10481
+ let repeatAppendTransaction = false;
10482
+ let next = reconcileIncrementalNode(previous, candidate.preparedRoot, {
9873
10483
  decide: (current, prepared) => decideBoundUpdate(current, prepared),
9874
10484
  update: (current, prepared) => updateBoundNode(current, prepared),
9875
10485
  mountReplacement: (prepared) => {
@@ -9903,6 +10513,60 @@ function renderBoundCard(container, schema, options) {
9903
10513
  unreconciled = true;
9904
10514
  },
9905
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
+ }
9906
10570
  if (!unreconciled
9907
10571
  && (next.element.parentNode !== container
9908
10572
  || container.firstElementChild !== next.element)) {
@@ -9916,7 +10580,7 @@ function renderBoundCard(container, schema, options) {
9916
10580
  unreconciled = true;
9917
10581
  }
9918
10582
  }
9919
- if (unreconciled) {
10583
+ if (unreconciled && !repeatAppendTransaction) {
9920
10584
  let emergency;
9921
10585
  try {
9922
10586
  emergency = mountBoundSubtree(candidate.materialized.root, candidate.preparedRoot.occurrenceKey, renderVariables);
@@ -9947,6 +10611,29 @@ function renderBoundCard(container, schema, options) {
9947
10611
  restoreDisabledDescendantPresentation(emergency);
9948
10612
  return emergency;
9949
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
+ }
9950
10637
  try {
9951
10638
  restoreChangedSubtreeState(previous, next, scrollPositions, mediaStates);
9952
10639
  }
@@ -10201,6 +10888,7 @@ function renderBoundCard(container, schema, options) {
10201
10888
  return {
10202
10889
  getNode: nodeAccess.getNode,
10203
10890
  onFocusChange: nodeAccess.onFocusChange,
10891
+ onScroll: nodeAccess.onScroll,
10204
10892
  dispose() {
10205
10893
  if (disposed || disposeRequested)
10206
10894
  return;
@@ -10564,25 +11252,6 @@ function renderStaticCard(container, schema, options) {
10564
11252
  bindingFingerprint: nodeBindingFingerprint(node, resolvedProps, disabled),
10565
11253
  };
10566
11254
  }
10567
- function applyDisabledState(element, disabled) {
10568
- if (!disabled)
10569
- return;
10570
- element.setAttribute('data-disabled', 'true');
10571
- element.style.background = '#F5F5F5';
10572
- element.style.color = '#C0C0C0';
10573
- element.style.setProperty('--card-disabled-color', '#C0C0C0');
10574
- element.style.pointerEvents = 'none';
10575
- element.style.cursor = 'default';
10576
- }
10577
- function applyDisabledDescendants(element, disabled) {
10578
- if (!disabled)
10579
- return;
10580
- element.querySelectorAll('*').forEach((child) => {
10581
- const htmlChild = child;
10582
- htmlChild.setAttribute('data-disabled', 'true');
10583
- htmlChild.style.setProperty('--card-disabled-color', '#C0C0C0');
10584
- });
10585
- }
10586
11255
  function runStaticEventActions(steps, detail) {
10587
11256
  if (disposed)
10588
11257
  return;
@@ -11046,6 +11715,7 @@ function renderStaticCard(container, schema, options) {
11046
11715
  return {
11047
11716
  getNode: nodeAccess.getNode,
11048
11717
  onFocusChange: nodeAccess.onFocusChange,
11718
+ onScroll: nodeAccess.onScroll,
11049
11719
  dispose() {
11050
11720
  if (disposed || disposeRequested)
11051
11721
  return;
@@ -11419,13 +12089,7 @@ function renderStreamingCard(container, options = {}) {
11419
12089
  const isDisabled = computeBoundDisabled(node, renderVariables);
11420
12090
  const renderer = (componentRenderers[node.type] ?? componentRenderers._default);
11421
12091
  const element = renderer(node, resolvedProps, isMobile, options.responsive);
11422
- if (isDisabled) {
11423
- element.setAttribute('data-disabled', 'true');
11424
- element.style.background = '#F5F5F5';
11425
- element.style.color = '#C0C0C0';
11426
- element.style.setProperty('--card-disabled-color', '#C0C0C0');
11427
- element.style.pointerEvents = 'none';
11428
- }
12092
+ applyDisabledState(element, isDisabled);
11429
12093
  const variableKey = resolvedProps.variableKey;
11430
12094
  if (variableKey) {
11431
12095
  element.addEventListener('input', ((event) => {
@@ -11469,6 +12133,7 @@ function renderStreamingCard(container, options = {}) {
11469
12133
  element.appendChild(renderChild(child));
11470
12134
  }
11471
12135
  }
12136
+ applyDisabledDescendants(element, isDisabled);
11472
12137
  applyResponsiveStyles(element, createResponsiveContext(isMobile, options.responsive));
11473
12138
  return element;
11474
12139
  }
@@ -11501,25 +12166,12 @@ function renderStreamingCard(container, options = {}) {
11501
12166
  hiddenSet.delete(node.id);
11502
12167
  propsCache.set(node.id, fingerprint(resolvedProps, node.directives));
11503
12168
  // Check disabled
11504
- let isDisabled = false;
11505
- if (node.directives?.disabled) {
11506
- const disabledExpr = node.directives.disabled;
11507
- const resolved = hasExpression(disabledExpr)
11508
- ? resolveExpression(disabledExpr, variables)
11509
- : disabledExpr;
11510
- isDisabled = resolved === true || resolved === 'true' || resolved === 1;
11511
- }
12169
+ const isDisabled = computeDisabled(node);
11512
12170
  // Create element
11513
12171
  const renderer = componentRenderers[node.type] ?? componentRenderers['_default'];
11514
12172
  const el = renderer(node, resolvedProps, isMobile, options.responsive);
11515
12173
  // Apply disabled
11516
- if (isDisabled) {
11517
- el.setAttribute('data-disabled', 'true');
11518
- el.style.background = '#F5F5F5';
11519
- el.style.color = '#C0C0C0';
11520
- el.style.setProperty('--card-disabled-color', '#C0C0C0');
11521
- el.style.pointerEvents = 'none';
11522
- }
12174
+ applyDisabledState(el, isDisabled);
11523
12175
  // variableKey auto-sync
11524
12176
  const variableKey = resolvedProps.variableKey;
11525
12177
  if (variableKey) {
@@ -11571,6 +12223,7 @@ function renderStreamingCard(container, options = {}) {
11571
12223
  el.appendChild(renderChild(child));
11572
12224
  }
11573
12225
  }
12226
+ applyDisabledDescendants(el, isDisabled);
11574
12227
  applyResponsiveStyles(el, createResponsiveContext(isMobile, options.responsive));
11575
12228
  return el;
11576
12229
  }
@@ -11603,6 +12256,16 @@ function renderStreamingCard(container, options = {}) {
11603
12256
  : visibleExpr;
11604
12257
  return !(resolved === false || resolved === 'false' || resolved === '' || resolved === 0);
11605
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
+ }
11606
12269
  function collectLegacyAutoFocusRevealIds(schema, previousVariables) {
11607
12270
  let tree;
11608
12271
  try {
@@ -11680,6 +12343,7 @@ function renderStreamingCard(container, options = {}) {
11680
12343
  if (!subtree)
11681
12344
  return false;
11682
12345
  const newEl = renderNode(subtree, schema.actions ?? {});
12346
+ disposeChartsIn(oldEl);
11683
12347
  oldEl.replaceWith(newEl);
11684
12348
  return true;
11685
12349
  }
@@ -11738,12 +12402,23 @@ function renderStreamingCard(container, options = {}) {
11738
12402
  }
11739
12403
  if (!nowVisible)
11740
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
+ }
11741
12414
  const resolved = resolveNodeProps(element);
11742
12415
  const key = fingerprint(resolved, element.directives);
11743
12416
  if (propsCache.get(id) === key)
11744
12417
  continue;
11745
12418
  if ('updateProps' in el) {
11746
12419
  el.updateProps(resolved, isMobile, options.responsive);
12420
+ // Some components replace host cssText while updating their props.
12421
+ applyDisabledState(el, wasDisabled);
11747
12422
  propsCache.set(id, key);
11748
12423
  }
11749
12424
  else if (!replaceSubtree(schema, id, el)) {
@@ -12900,6 +13575,14 @@ function renderStreamingCard(container, options = {}) {
12900
13575
  }
12901
13576
  if (!nowVisible)
12902
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
+ }
12903
13586
  const resolved = resolveNodeProps(element);
12904
13587
  const key = fingerprint(resolved, element.directives);
12905
13588
  if (propsCache.get(id) === key)
@@ -12907,6 +13590,7 @@ function renderStreamingCard(container, options = {}) {
12907
13590
  const typeChanged = el.getAttribute('data-card-type') !== element.type;
12908
13591
  if (!typeChanged && 'updateProps' in el) {
12909
13592
  el.updateProps(resolved, isMobile, options.responsive);
13593
+ applyDisabledState(el, wasDisabled);
12910
13594
  propsCache.set(id, key);
12911
13595
  }
12912
13596
  else if (!typeChanged && isChildrenOnlyChange(propsCache.get(id), key, element)) {
@@ -13062,6 +13746,7 @@ function renderStreamingCard(container, options = {}) {
13062
13746
  return {
13063
13747
  getNode: nodeAccess.getNode,
13064
13748
  onFocusChange: nodeAccess.onFocusChange,
13749
+ onScroll: nodeAccess.onScroll,
13065
13750
  applyCommand(command) {
13066
13751
  if (!lockMode('commands'))
13067
13752
  return;