@uxland/primary-shell 7.44.2 → 7.44.3

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.
@@ -1,4 +1,4 @@
1
- import { s, t as d, k as l, h as p, r as m, i as g, a as h } from "./index-BUnSpNVB.js";
1
+ import { s, t as d, k as l, h as p, r as m, i as g, a as h } from "./index-D-GssSmM.js";
2
2
  const v = ".container{background-color:#fff;display:flex;flex-direction:column;min-width:500px;width:95vw;height:95vh;border-radius:var(--dss-radius-sm);overflow:hidden}.content{display:grid;flex:1;min-height:0;grid-template-columns:1fr 1fr;gap:16px;padding:16px}.content>primaria-region{width:100%;height:100%;min-height:0}.content primaria-region>div{width:100%;height:100%;border:1px solid var(--color-neutral-200);border-radius:8px;padding:16px;box-sizing:border-box}.content>primaria-region[name=import-data-region]>div{overflow-y:auto}.content>primaria-region[name=import-data-activity-history-region]>div{display:flex;flex-direction:column;gap:16px;overflow:hidden}.content>primaria-region[name=import-data-activity-history-region]>div>*{flex-shrink:0}.content>primaria-region[name=import-data-activity-history-region]>div>*:last-child{flex:1;min-height:0}.footer{display:flex;flex-direction:row;align-items:center;background:#fff;justify-content:end;gap:12px;height:56px;border-top:1px solid var(--color-neutral-100);padding:var(--dss-spacing-sm)}", f = (i) => l`
3
3
  <div class="container">
4
4
  <div class="content">
@@ -49,4 +49,4 @@ t = x([
49
49
  export {
50
50
  t as ImportDataManagerModal
51
51
  };
52
- //# sourceMappingURL=component-BrxpPQzM.js.map
52
+ //# sourceMappingURL=component-VhfkTmHG.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"component-BrxpPQzM.js","sources":["../src/api/import-data-manager/component/template.ts","../src/api/import-data-manager/component/component.ts"],"sourcesContent":["import { html } from \"lit\";\nimport { translate } from \"../../../locales\";\nimport { shellApi } from \"../../api\";\nimport { ImportDataManagerModal } from \"./component\";\n\nexport const template = (props: ImportDataManagerModal) => {\n return html`\n <div class=\"container\">\n <div class=\"content\">\n <primaria-region name=\"${shellApi.regionManager.regions.shell.importDataActivityHistory}\"></primaria-region>\n <primaria-region name=\"${shellApi.regionManager.regions.shell.importData}\"></primaria-region>\n </div>\n <div class=\"footer\">\n <dss-button\n label=\"${translate(\"importDataManager.actions.cancel\")}\"\n @click=\"${() => {\n props.cancel();\n }}\"\n size=\"md\"\n variant=\"secondary\"\n ></dss-button>\n <dss-button\n label=\"${translate(\"importDataManager.actions.import\")}\"\n @click=\"${() => {\n props._accept();\n }}\"\n size=\"md\"\n variant=\"primary\"\n ></dss-button>\n </div>\n </div>\n `;\n};\n","import { LitElement, css, html, unsafeCSS } from \"lit\";\nimport { customElement } from \"lit/decorators.js\";\nimport { ConfirmationContentProps } from \"../../interaction-service\";\nimport styles from \"./styles.css?inline\";\nimport { template } from \"./template\";\n\n@customElement(\"import-data-manager-modal\")\nexport class ImportDataManagerModal extends LitElement implements ConfirmationContentProps<undefined, undefined> {\n data: undefined;\n setResult: (result: undefined) => void;\n setIsValid: (isValid: boolean) => void;\n confirm: () => void;\n cancel: () => void;\n\n render() {\n return html`${template(this)}`;\n }\n\n static styles = css`\n ${unsafeCSS(styles)}\n `;\n\n _accept = () => {\n this.confirm();\n };\n}\n"],"names":["template","props","html","shellApi","translate","ImportDataManagerModal","LitElement","css","unsafeCSS","styles","__decorateClass","customElement"],"mappings":";kiCAKaA,IAAW,CAACC,MAChBC;AAAAA;AAAAA;AAAAA,iCAGwBC,EAAS,cAAc,QAAQ,MAAM,yBAAyB;AAAA,iCAC9DA,EAAS,cAAc,QAAQ,MAAM,UAAU;AAAA;AAAA;AAAA;AAAA,mBAI7DC,EAAU,kCAAkC,CAAC;AAAA,oBAC5C,MAAM;AACd,EAAAH,EAAM,OAAA;AACR,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,mBAKQG,EAAU,kCAAkC,CAAC;AAAA,oBAC5C,MAAM;AACd,EAAAH,EAAM,QAAA;AACR,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;AClBJ,IAAMI,IAAN,cAAqCC,EAAqE;AAAA,EAA1G,cAAA;AAAA,UAAA,GAAA,SAAA,GAeL,KAAA,UAAU,MAAM;AACd,WAAK,QAAA;AAAA,IACP;AAAA,EAAA;AAAA,EAVA,SAAS;AACP,WAAOJ,IAAOF,EAAS,IAAI,CAAC;AAAA,EAC9B;AASF;AAlBaK,EAWJ,SAASE;AAAAA,MACZC,EAAUC,CAAM,CAAC;AAAA;AAZVJ,IAANK,EAAA;AAAA,EADNC,EAAc,2BAA2B;AAAA,GAC7BN,CAAA;"}
1
+ {"version":3,"file":"component-VhfkTmHG.js","sources":["../src/api/import-data-manager/component/template.ts","../src/api/import-data-manager/component/component.ts"],"sourcesContent":["import { html } from \"lit\";\nimport { translate } from \"../../../locales\";\nimport { shellApi } from \"../../api\";\nimport { ImportDataManagerModal } from \"./component\";\n\nexport const template = (props: ImportDataManagerModal) => {\n return html`\n <div class=\"container\">\n <div class=\"content\">\n <primaria-region name=\"${shellApi.regionManager.regions.shell.importDataActivityHistory}\"></primaria-region>\n <primaria-region name=\"${shellApi.regionManager.regions.shell.importData}\"></primaria-region>\n </div>\n <div class=\"footer\">\n <dss-button\n label=\"${translate(\"importDataManager.actions.cancel\")}\"\n @click=\"${() => {\n props.cancel();\n }}\"\n size=\"md\"\n variant=\"secondary\"\n ></dss-button>\n <dss-button\n label=\"${translate(\"importDataManager.actions.import\")}\"\n @click=\"${() => {\n props._accept();\n }}\"\n size=\"md\"\n variant=\"primary\"\n ></dss-button>\n </div>\n </div>\n `;\n};\n","import { LitElement, css, html, unsafeCSS } from \"lit\";\nimport { customElement } from \"lit/decorators.js\";\nimport { ConfirmationContentProps } from \"../../interaction-service\";\nimport styles from \"./styles.css?inline\";\nimport { template } from \"./template\";\n\n@customElement(\"import-data-manager-modal\")\nexport class ImportDataManagerModal extends LitElement implements ConfirmationContentProps<undefined, undefined> {\n data: undefined;\n setResult: (result: undefined) => void;\n setIsValid: (isValid: boolean) => void;\n confirm: () => void;\n cancel: () => void;\n\n render() {\n return html`${template(this)}`;\n }\n\n static styles = css`\n ${unsafeCSS(styles)}\n `;\n\n _accept = () => {\n this.confirm();\n };\n}\n"],"names":["template","props","html","shellApi","translate","ImportDataManagerModal","LitElement","css","unsafeCSS","styles","__decorateClass","customElement"],"mappings":";kiCAKaA,IAAW,CAACC,MAChBC;AAAAA;AAAAA;AAAAA,iCAGwBC,EAAS,cAAc,QAAQ,MAAM,yBAAyB;AAAA,iCAC9DA,EAAS,cAAc,QAAQ,MAAM,UAAU;AAAA;AAAA;AAAA;AAAA,mBAI7DC,EAAU,kCAAkC,CAAC;AAAA,oBAC5C,MAAM;AACd,EAAAH,EAAM,OAAA;AACR,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,mBAKQG,EAAU,kCAAkC,CAAC;AAAA,oBAC5C,MAAM;AACd,EAAAH,EAAM,QAAA;AACR,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;AClBJ,IAAMI,IAAN,cAAqCC,EAAqE;AAAA,EAA1G,cAAA;AAAA,UAAA,GAAA,SAAA,GAeL,KAAA,UAAU,MAAM;AACd,WAAK,QAAA;AAAA,IACP;AAAA,EAAA;AAAA,EAVA,SAAS;AACP,WAAOJ,IAAOF,EAAS,IAAI,CAAC;AAAA,EAC9B;AASF;AAlBaK,EAWJ,SAASE;AAAAA,MACZC,EAAUC,CAAM,CAAC;AAAA;AAZVJ,IAANK,EAAA;AAAA,EADNC,EAAc,2BAA2B;AAAA,GAC7BN,CAAA;"}
@@ -9841,7 +9841,7 @@ class ImportDataManagerImpl {
9841
9841
  async import(W, X) {
9842
9842
  this.currentImporterId = W, this.currentImportParams = X, this.selectedItems = {}, this.pluginTexts = {};
9843
9843
  try {
9844
- const { ImportDataManagerModal: te } = await import("./component-BrxpPQzM.js"), { confirmed: re } = await this.interactionService.confirm(
9844
+ const { ImportDataManagerModal: te } = await import("./component-VhfkTmHG.js"), { confirmed: re } = await this.interactionService.confirm(
9845
9845
  void 0,
9846
9846
  { component: te },
9847
9847
  {
@@ -12199,23 +12199,19 @@ const groupActivityHistoryItems = (J) => {
12199
12199
  const ne = re.items[0], de = oe.items[0];
12200
12200
  return !ne || !de ? 0 : getDateObject(de.date).getTime() - getDateObject(ne.date).getTime();
12201
12201
  }), groupByValidDiagnostics(te), te;
12202
+ }, getMostRecentDate = (J) => J.reduce((W, X) => {
12203
+ const te = new Date(X.date);
12204
+ return te > W ? te : W;
12205
+ }, /* @__PURE__ */ new Date(0)), getSubGroupMostRecentDate = (J) => getMostRecentDate(J.items), getGroupMostRecentDate = (J) => {
12206
+ const W = J.items.length > 0 ? [getMostRecentDate(J.items)] : [], X = J.subGroups.map(getSubGroupMostRecentDate), te = [...W, ...X];
12207
+ return te.length > 0 ? new Date(Math.max(...te.map((re) => re.getTime()))) : /* @__PURE__ */ new Date(0);
12202
12208
  }, sortGroupsByMostRecentDate = (J) => {
12203
- const W = (oe) => oe.reduce((ne, de) => {
12204
- const ce = new Date(de.date);
12205
- return ce > ne ? ce : ne;
12206
- }, /* @__PURE__ */ new Date(0)), X = (oe) => oe.sort((ne, de) => new Date(de.date).getTime() - new Date(ne.date).getTime()), te = (oe) => W(oe.items), re = (oe) => {
12207
- const ne = oe.items.length > 0 ? [W(oe.items)] : [], de = oe.subGroups.map(te), ce = [...ne, ...de];
12208
- return ce.length > 0 ? new Date(Math.max(...ce.map((ue) => ue.getTime()))) : /* @__PURE__ */ new Date(0);
12209
- };
12210
- return J.forEach((oe) => {
12211
- oe.items = X(oe.items), oe.subGroups.forEach((ne) => {
12212
- ne.items = X(ne.items);
12213
- }), oe.subGroups.sort(
12214
- (ne, de) => te(de).getTime() - te(ne).getTime()
12215
- );
12216
- }), J.sort(
12217
- (oe, ne) => re(ne).getTime() - re(oe).getTime()
12218
- );
12209
+ const W = (X) => X.sort((te, re) => new Date(re.date).getTime() - new Date(te.date).getTime());
12210
+ return J.forEach((X) => {
12211
+ X.items = W(X.items), X.subGroups.forEach((te) => {
12212
+ te.items = W(te.items);
12213
+ }), X.subGroups.sort((te, re) => getSubGroupMostRecentDate(re).getTime() - getSubGroupMostRecentDate(te).getTime());
12214
+ }), J.sort((X, te) => getGroupMostRecentDate(te).getTime() - getGroupMostRecentDate(X).getTime());
12219
12215
  }, activityHistorySearchStringSelector = (J) => J.activityHistoryFilters.searchString, activityHistoryCollectionsSelector = (J) => J.activityHistoryCollections.collections, historyDataImporterRulesByCollectionIdSelector = createSelector(
12220
12216
  activityHistoryCollectionsSelector,
12221
12217
  (J) => {
@@ -12654,27 +12650,6 @@ const bootstrapSetUpFilter = (J) => {
12654
12650
  }, teardownFilters = () => {
12655
12651
  teardownSetCommonFilter(), teardownAddCustomFilter(), teardownSetCustomFilterGroup(), teardownSetCustomFilterValue(), teardownSetCustomFilterAllValues(), teardownSetDiagnosticFilter(), teardownDeleteDiagnosticFilterValue(), teardownAddUpFilter(), teardownSetUpFilter(), teardownResetFilters();
12656
12652
  };
12657
- /**
12658
- * @license
12659
- * Copyright 2017 Google LLC
12660
- * SPDX-License-Identifier: BSD-3-Clause
12661
- */
12662
- class le extends i$P {
12663
- constructor(W) {
12664
- if (super(W), this.it = D$4, W.type !== t$u.CHILD) throw Error(this.constructor.directiveName + "() can only be used in child bindings");
12665
- }
12666
- render(W) {
12667
- if (W === D$4 || W == null) return this._t = void 0, this.it = W;
12668
- if (W === R$5) return W;
12669
- if (typeof W != "string") throw Error(this.constructor.directiveName + "() called with a non-string value");
12670
- if (W === this.it) return this._t;
12671
- this.it = W;
12672
- const X = [W];
12673
- return X.raw = X, this._t = { _$litType$: this.constructor.resultType, strings: X, values: [] };
12674
- }
12675
- }
12676
- le.directiveName = "unsafeHTML", le.resultType = 1;
12677
- const ae = e$O(le), styles$l = ":host{min-height:1px;display:flex;flex-direction:column;flex:1 1 0%}.virtual-container{height:100%;position:relative}.virtual-viewport{height:100%;overflow:auto;padding-inline:16px}.virtual-content{position:relative;width:100%}.virtual-items{position:relative}.container{min-height:1px;height:100%}.visit:first-child{margin-top:var(--dss-spacing-md)}.visit{width:calc(100% - var(--dss-spacing-md) - var(--dss-spacing-md));display:flex;flex-direction:column;gap:var(--dss-spacing-sm);background-color:#fff;border-radius:var(--dss-radius-sm);padding:var(--dss-spacing-sm);margin-bottom:var(--dss-spacing-md)}.visit .visit__header{display:flex;flex-direction:row;align-items:center;gap:16px}.visit .visit__header .title{flex:1;font-size:14px;line-height:24px;display:flex;flex-direction:row;gap:12px;color:var(--color-neutral-800)}.visit .visit__header .title-date{font-weight:700}.visit .visit__header .title-description{font-weight:600;display:flex;flex-direction:row;gap:4px}.visit .visit__header .highlight{background-color:#ff0;font-weight:700}.visit .visit__items{display:flex;flex-direction:column;gap:var(--dss-spacing-sm)}.visit .visit__items .item[has-divider]{border-bottom:var(--dss-border-width-sm) solid var(--color-neutral-200)}.visit .visit__items .item[has-divider]:last-of-type{border:none}.visit .diagnostics{display:flex;flex-direction:column;gap:var(--dss-spacing-sm);border-bottom:var(--dss-border-width-sm) solid var(--color-neutral-200)}.visit .diagnostics:last-of-type{border:none}.visit .diagnostics .diagnostics__header{display:flex;flex-direction:row;align-items:center;gap:16px;flex-wrap:wrap}.visit .diagnostics .diagnostics__items{display:flex;flex-direction:column}.visit .diagnostics .diagnostics__items .item[has-divider]{border-bottom:var(--dss-border-width-sm) solid var(--color-neutral-200)}.visit .diagnostics .diagnostics__items .item[has-divider]:last-of-type{border:none}.feedback{width:100%;height:100%;display:flex;align-items:center;justify-content:center}";
12678
12653
  function toDate(J) {
12679
12654
  const W = Object.prototype.toString.call(J);
12680
12655
  return J instanceof Date || typeof J == "object" && W === "[object Date]" ? new J.constructor(+J) : typeof J == "number" || W === "[object Number]" || typeof J == "string" || W === "[object String]" ? new Date(J) : /* @__PURE__ */ new Date(NaN);
@@ -15450,6 +15425,27 @@ function parse(J, W, X, te) {
15450
15425
  function cleanEscapedString(J) {
15451
15426
  return J.match(escapedStringRegExp)[1].replace(doubleQuoteRegExp, "'");
15452
15427
  }
15428
+ /**
15429
+ * @license
15430
+ * Copyright 2017 Google LLC
15431
+ * SPDX-License-Identifier: BSD-3-Clause
15432
+ */
15433
+ class le extends i$P {
15434
+ constructor(W) {
15435
+ if (super(W), this.it = D$4, W.type !== t$u.CHILD) throw Error(this.constructor.directiveName + "() can only be used in child bindings");
15436
+ }
15437
+ render(W) {
15438
+ if (W === D$4 || W == null) return this._t = void 0, this.it = W;
15439
+ if (W === R$5) return W;
15440
+ if (typeof W != "string") throw Error(this.constructor.directiveName + "() called with a non-string value");
15441
+ if (W === this.it) return this._t;
15442
+ this.it = W;
15443
+ const X = [W];
15444
+ return X.raw = X, this._t = { _$litType$: this.constructor.resultType, strings: X, values: [] };
15445
+ }
15446
+ }
15447
+ le.directiveName = "unsafeHTML", le.resultType = 1;
15448
+ const ae = e$O(le), styles$l = ":host{min-height:1px;display:flex;flex-direction:column;flex:1 1 0%}.virtual-container{height:100%;position:relative}.virtual-viewport{height:100%;overflow:auto;padding-inline:16px}.virtual-content{position:relative;width:100%}.virtual-items{position:relative}.container{min-height:1px;height:100%}.visit:first-child{margin-top:var(--dss-spacing-md)}.visit{width:calc(100% - var(--dss-spacing-md) - var(--dss-spacing-md));display:flex;flex-direction:column;gap:var(--dss-spacing-sm);background-color:#fff;border-radius:var(--dss-radius-sm);padding:var(--dss-spacing-sm);margin-bottom:var(--dss-spacing-md)}.visit .visit__header{display:flex;flex-direction:row;align-items:center;gap:16px}.visit .visit__header .title{flex:1;font-size:14px;line-height:24px;display:flex;flex-direction:row;gap:12px;color:var(--color-neutral-800)}.visit .visit__header .title-date{font-weight:700}.visit .visit__header .title-description{font-weight:600;display:flex;flex-direction:row;gap:4px}.visit .visit__header .highlight{background-color:#ff0;font-weight:700}.visit .visit__items{display:flex;flex-direction:column;gap:var(--dss-spacing-sm)}.visit .visit__items .item[has-divider]{border-bottom:var(--dss-border-width-sm) solid var(--color-neutral-200)}.visit .visit__items .item[has-divider]:last-of-type{border:none}.visit .diagnostics{display:flex;flex-direction:column;gap:var(--dss-spacing-sm);border-bottom:var(--dss-border-width-sm) solid var(--color-neutral-200)}.visit .diagnostics:last-of-type{border:none}.visit .diagnostics .diagnostics__header{display:flex;flex-direction:row;align-items:center;gap:16px;flex-wrap:wrap}.visit .diagnostics .diagnostics__items{display:flex;flex-direction:column}.visit .diagnostics .diagnostics__items .item[has-divider]{border-bottom:var(--dss-border-width-sm) solid var(--color-neutral-200)}.visit .diagnostics .diagnostics__items .item[has-divider]:last-of-type{border:none}.feedback{width:100%;height:100%;display:flex;align-items:center;justify-content:center}";
15453
15449
  /**
15454
15450
  * @license
15455
15451
  * Copyright 2018 Google LLC
@@ -16341,8 +16337,17 @@ class VirtualScroller {
16341
16337
  measureElement(W) {
16342
16338
  this._virtualizer?.measureElement(W);
16343
16339
  }
16344
- scrollToIndex(W, X = "smooth") {
16345
- this._virtualizer?.scrollToIndex(W, { behavior: X });
16340
+ scrollToIndex(W, X = "smooth", te = "auto") {
16341
+ this._virtualizer?.scrollToIndex(W, { behavior: X, align: te });
16342
+ }
16343
+ /**
16344
+ * Estimated `start` offset (px) of an item, using real measurements where
16345
+ * available and the size estimate for not-yet-rendered items. Used to jump
16346
+ * the viewport near a target before a precise DOM-based alignment, instead of
16347
+ * `scrollToIndex` (whose reconcile re-scrolls every frame and froze the UI).
16348
+ */
16349
+ getOffsetForIndex(W) {
16350
+ return this._virtualizer?.getOffsetForIndex(W, "start")?.[0] ?? 0;
16346
16351
  }
16347
16352
  getState() {
16348
16353
  return {
@@ -16350,13 +16355,6 @@ class VirtualScroller {
16350
16355
  totalHeight: this._virtualizer?.getTotalSize() ?? 0
16351
16356
  };
16352
16357
  }
16353
- findClosestIndex(W, X, te) {
16354
- let re = -1, oe = Number.POSITIVE_INFINITY;
16355
- return this._options.items.forEach((ne, de) => {
16356
- const ce = Math.abs(te(W(ne), X));
16357
- ce < oe && (oe = ce, re = de);
16358
- }), re;
16359
- }
16360
16358
  }
16361
16359
  var __defProp$o = Object.defineProperty, __getOwnPropDesc$d = Object.getOwnPropertyDescriptor, __decorateClass$r = (J, W, X, te) => {
16362
16360
  for (var re = te > 1 ? void 0 : te ? __getOwnPropDesc$d(W, X) : W, oe = J.length - 1, ne; oe >= 0; oe--)
@@ -16414,18 +16412,40 @@ let ActivityHistoryTimeline = class extends h$p {
16414
16412
  highlighted(J) {
16415
16413
  return J ? ae(this.highlightMatch(J, this.searchString)) : null;
16416
16414
  }
16417
- // Public API for scrolling to date (maintains original functionality)
16415
+ // Public API: scroll the timeline to a given date ("Anar a data").
16416
+ //
16417
+ // The list is sorted newest -> oldest by `getGroupMostRecentDate` (the same key
16418
+ // is used here so the mapping date->index is monotonic). We compare at *day*
16419
+ // granularity because `selectedDate` is midnight while group dates carry a time
16420
+ // of day. We land on the first (topmost) group whose day is on or before the
16421
+ // requested day — i.e. the requested day if it has entries, otherwise the
16422
+ // closest earlier day (newer entries above, older below). Using an absolute
16423
+ // nearest-timestamp search here is what produced the "jumps to another year"
16424
+ // and "lands on the day before" bugs.
16418
16425
  _scrollIntoDate(J) {
16419
- if (!this._virtualScroller) return;
16420
- const W = this._virtualScroller.findClosestIndex(
16421
- (X) => {
16422
- const te = X.items?.[0]?.date || X.subGroups?.[0]?.items?.[0]?.date;
16423
- return te ? new Date(te).getTime() : 0;
16424
- },
16425
- J,
16426
- (X, te) => X - te
16427
- );
16428
- W !== -1 && this._virtualScroller.scrollToIndex(W);
16426
+ if (!this._virtualScroller || !this._viewport) return;
16427
+ const W = this.historyGroups ?? [];
16428
+ if (!W.length) return;
16429
+ const X = startOfDay(J).getTime(), te = (oe) => startOfDay(getGroupMostRecentDate(oe)).getTime();
16430
+ let re = W.findIndex((oe) => te(oe) <= X);
16431
+ re === -1 && (re = W.length - 1), this._viewport.scrollTop = this._virtualScroller.getOffsetForIndex(re), this._alignGroupTop(re, 0);
16432
+ }
16433
+ // Align the top of group `index`'s rendered element with the top of the
16434
+ // viewport, using its real on-screen position (not the size estimate, which
16435
+ // is off for very tall visits). Bounded to a few frames so it converges
16436
+ // without ever turning into a scroll loop.
16437
+ _alignGroupTop(J, W) {
16438
+ W >= 4 || !this._viewport || requestAnimationFrame(() => {
16439
+ const X = this._viewport;
16440
+ if (!X) return;
16441
+ const te = this.renderRoot?.querySelector(`.visit[data-index="${J}"]`);
16442
+ if (!te) {
16443
+ this._alignGroupTop(J, W + 1);
16444
+ return;
16445
+ }
16446
+ const re = Math.round(te.getBoundingClientRect().top - X.getBoundingClientRect().top);
16447
+ Math.abs(re) <= 1 || (X.scrollTop += re, this._alignGroupTop(J, W + 1));
16448
+ });
16429
16449
  }
16430
16450
  // === VIRTUAL SCROLLER LOGIC ===
16431
16451
  _setupVirtualScroller() {
@@ -16433,14 +16453,11 @@ let ActivityHistoryTimeline = class extends h$p {
16433
16453
  items: this.historyGroups || [],
16434
16454
  estimatedItemHeight: 200,
16435
16455
  overscan: 8
16436
- }), this._cleanupVirtualScroller = this._virtualScroller.setup(
16437
- this._viewport,
16438
- (J) => {
16439
- this._virtualScrollerState = J, this.requestUpdate(), this.api?.broker && this.searchString && this.api.broker.publish(this.api.broker.events.activityHistory.searched, {
16440
- searchQuery: this.searchString
16441
- });
16442
- }
16443
- ), this._virtualScrollerState = this._virtualScroller.getState());
16456
+ }), this._cleanupVirtualScroller = this._virtualScroller.setup(this._viewport, (J) => {
16457
+ this._virtualScrollerState = J, this.requestUpdate(), this.api?.broker && this.searchString && this.api.broker.publish(this.api.broker.events.activityHistory.searched, {
16458
+ searchQuery: this.searchString
16459
+ });
16460
+ }), this._virtualScrollerState = this._virtualScroller.getState());
16444
16461
  }
16445
16462
  _updateVirtualScroller() {
16446
16463
  !this._virtualScroller || !this.historyGroups?.length || (this._virtualScroller.updateItems(this.historyGroups, (J) => {
@@ -16952,12 +16969,7 @@ const bootstrapActivityHistoryItem = (J) => {
16952
16969
  class ScrollerController {
16953
16970
  /** Setup or update the scroller with the current items. No-op until the
16954
16971
  * viewport and content elements exist. Detects viewport swaps and re-setups. */
16955
- sync({
16956
- viewport: W,
16957
- items: X,
16958
- onStateChange: te,
16959
- estimatedItemHeight: re = 200
16960
- }) {
16972
+ sync({ viewport: W, items: X, onStateChange: te, estimatedItemHeight: re = 200 }) {
16961
16973
  return W ? (this._scroller && W !== this._lastViewport && this.teardown(), this._scroller ? this._scroller.updateItems(X, te) : (this._scroller = new VirtualScroller({
16962
16974
  items: X,
16963
16975
  estimatedItemHeight: re
@@ -16974,9 +16986,6 @@ class ScrollerController {
16974
16986
  measureElement(W) {
16975
16987
  this._scroller?.measureElement(W);
16976
16988
  }
16977
- findClosestIndex(W, X, te) {
16978
- return this._scroller?.findClosestIndex(W, X, te) ?? -1;
16979
- }
16980
16989
  }
16981
16990
  const isToday = (J) => {
16982
16991
  const W = new Date(J), X = /* @__PURE__ */ new Date();
@@ -53537,4 +53546,4 @@ export {
53537
53546
  primariaApiFactory as y,
53538
53547
  PrimariaContentSwitcher as z
53539
53548
  };
53540
- //# sourceMappingURL=index-BUnSpNVB.js.map
53549
+ //# sourceMappingURL=index-D-GssSmM.js.map