@eodash/eodash 5.4.0 → 5.5.0

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.
Files changed (110) hide show
  1. package/core/client/asWebComponent.js +1 -1
  2. package/core/client/composables/DefineWidgets.js +12 -2
  3. package/core/client/eodashSTAC/EodashCollection.js +3 -3
  4. package/core/client/eodashSTAC/createLayers.js +44 -17
  5. package/core/client/eodashSTAC/helpers.js +12 -5
  6. package/core/client/eodashSTAC/parquet.js +2 -1
  7. package/core/client/eodashSTAC/triggers.js +1 -2
  8. package/core/client/store/actions.js +17 -17
  9. package/core/client/store/states.js +26 -4
  10. package/core/client/types.ts +9 -0
  11. package/core/client/utils/index.js +18 -1
  12. package/dist/client/{DashboardLayout-CQOGHPW_.js → DashboardLayout-CkSgvaFF.js} +2 -2
  13. package/dist/client/{DynamicWebComponent-CoLO8FEf.js → DynamicWebComponent-Ncsg6fb9.js} +1 -1
  14. package/dist/client/EodashChart-5v7adDpG.js +144 -0
  15. package/dist/client/{EodashDatePicker-BZeQ6bcu.js → EodashDatePicker-RoQJe6ss.js} +4 -4
  16. package/dist/client/{EodashItemFilter-CmZkk7GK.js → EodashItemFilter-CCoVC5BE.js} +2 -2
  17. package/dist/client/{EodashLayerControl-D54fY-bX.js → EodashLayerControl-weVj7aQA.js} +2 -2
  18. package/dist/client/{EodashLayoutSwitcher-BCP3FvDb.js → EodashLayoutSwitcher-CL-Z9d5_.js} +3 -3
  19. package/dist/client/EodashMapBtns-CXU8IuPO.js +433 -0
  20. package/dist/client/{EodashStacInfo-BZbmT8vT.js → EodashStacInfo-BbMnjf-n.js} +11 -15
  21. package/dist/client/{EodashTimeSlider-DIcAJr6D.js → EodashTimeSlider-BZXnqfax.js} +2 -2
  22. package/dist/client/{EodashTools-Cz6X6hsF.js → EodashTools-DUJlkkgx.js} +4 -4
  23. package/dist/client/{ExportState-DFVFAgKz.js → ExportState-CT3FQOHW.js} +46 -21
  24. package/dist/client/{Footer-DLzQcjkI.js → Footer-D_iqP-1K.js} +1 -1
  25. package/dist/client/{Header-_D9Z-zFJ.js → Header-Dzhnvsy-.js} +127 -17
  26. package/dist/client/MobileLayout-6Rg_PSO8.js +118 -0
  27. package/dist/client/{PopUp-DwI8V2gW.js → PopUp-DPPv_GSA.js} +8 -59
  28. package/dist/client/{ProcessList-C9eAg2Sb.js → ProcessList-BIN_Mb27.js} +9 -13
  29. package/dist/client/{VImg-COXTnCWE.js → VImg-DhbuvNrA.js} +2 -2
  30. package/dist/client/{VMain-C74l1bv-.js → VMain-CVabY_NY.js} +1 -1
  31. package/dist/client/{VTooltip-BLS-cQ9N.js → VTooltip-Cc6au3Sn.js} +3 -4
  32. package/dist/client/{WidgetsContainer-D-VfMRxE.js → WidgetsContainer-ChqTJS4h.js} +1 -1
  33. package/dist/client/asWebComponent-DaIxULaA.js +9207 -0
  34. package/dist/client/{async-D4G-FOIc.js → async-D6Lvv-fT.js} +4 -4
  35. package/dist/client/eo-dash.js +1 -1
  36. package/dist/client/{forwardRefs-CRMFoNYN.js → forwardRefs--IccUBdR.js} +196 -37
  37. package/dist/client/{handling-DTAhQuPh.js → handling-DSA67d6E.js} +74 -35
  38. package/dist/client/{helpers-CsjKHAcK.js → helpers-BBSdbOmv.js} +187 -87
  39. package/dist/client/{index-DEmHaCL3.js → index-6LlXNkke.js} +5 -3
  40. package/dist/client/{index-BHilH1qx.js → index-BS-8Y5FE.js} +22 -69
  41. package/dist/client/{index-BIcmbjr0.js → index-CQihL_c6.js} +27 -14
  42. package/dist/client/{index-BoCcZ0l4.js → index-qsZhYR_6.js} +15 -16
  43. package/dist/client/templates.js +48 -2
  44. package/dist/client/{transition-6MJLK-_H.js → transition-DFr4cXu8.js} +1 -1
  45. package/dist/node/cli.js +1 -1
  46. package/dist/types/core/client/App.vue.d.ts +16 -6
  47. package/dist/types/core/client/asWebComponent.d.ts +2 -2
  48. package/dist/types/core/client/components/DashboardLayout.vue.d.ts +2 -1
  49. package/dist/types/core/client/components/DynamicWebComponent.vue.d.ts +36 -16
  50. package/dist/types/core/client/components/EodashOverlay.vue.d.ts +2 -1
  51. package/dist/types/core/client/components/ErrorAlert.vue.d.ts +9 -1
  52. package/dist/types/core/client/components/Footer.vue.d.ts +2 -1
  53. package/dist/types/core/client/components/Header.vue.d.ts +2 -1
  54. package/dist/types/core/client/components/IframeWrapper.vue.d.ts +12 -6
  55. package/dist/types/core/client/components/Loading.vue.d.ts +2 -1
  56. package/dist/types/core/client/components/MobileLayout.vue.d.ts +2 -1
  57. package/dist/types/core/client/eodashSTAC/helpers.d.ts +1 -0
  58. package/dist/types/core/client/store/actions.d.ts +1 -2
  59. package/dist/types/core/client/store/states.d.ts +22 -4
  60. package/dist/types/core/client/types.d.ts +6 -1
  61. package/dist/types/core/client/utils/index.d.ts +1 -0
  62. package/dist/types/core/client/views/Dashboard.vue.d.ts +20 -8
  63. package/dist/types/templates/compare.d.ts +20 -0
  64. package/dist/types/templates/expert.d.ts +30 -1
  65. package/dist/types/widgets/EodashChart.vue.d.ts +28 -0
  66. package/dist/types/widgets/EodashDatePicker.vue.d.ts +38 -9
  67. package/dist/types/widgets/EodashItemCatalog/index.vue.d.ts +88 -13
  68. package/dist/types/widgets/EodashItemCatalog/methods/map.d.ts +1 -1
  69. package/dist/types/widgets/EodashItemFilter.vue.d.ts +169 -26
  70. package/dist/types/widgets/EodashLayerControl.vue.d.ts +38 -10
  71. package/dist/types/widgets/EodashLayoutSwitcher.vue.d.ts +22 -7
  72. package/dist/types/widgets/EodashMap/EodashMapBtns.vue.d.ts +94 -21
  73. package/dist/types/widgets/EodashMap/index.vue.d.ts +646 -93
  74. package/dist/types/widgets/EodashMap/methods/btns.d.ts +14 -0
  75. package/dist/types/widgets/EodashProcess/ProcessList.vue.d.ts +24 -7
  76. package/dist/types/widgets/EodashProcess/index.vue.d.ts +26 -7
  77. package/dist/types/widgets/EodashProcess/methods/composables.d.ts +1 -2
  78. package/dist/types/widgets/EodashProcess/methods/handling.d.ts +5 -11
  79. package/dist/types/widgets/EodashProcess/methods/outputs.d.ts +2 -2
  80. package/dist/types/widgets/EodashStacInfo.vue.d.ts +67 -18
  81. package/dist/types/widgets/EodashTimeSlider.vue.d.ts +14 -6
  82. package/dist/types/widgets/EodashTools.vue.d.ts +437 -47
  83. package/dist/types/widgets/ExportState.vue.d.ts +26 -8
  84. package/dist/types/widgets/PopUp.vue.d.ts +61 -11
  85. package/dist/types/widgets/WidgetsContainer.vue.d.ts +22 -6
  86. package/package.json +33 -34
  87. package/templates/baseConfig.js +2 -1
  88. package/templates/compare.js +28 -1
  89. package/templates/expert.js +19 -1
  90. package/widgets/EodashChart.vue +139 -0
  91. package/widgets/EodashItemCatalog/index.vue +2 -2
  92. package/widgets/EodashItemCatalog/methods/map.js +9 -10
  93. package/widgets/EodashMap/EodashMapBtns.vue +58 -93
  94. package/widgets/EodashMap/index.vue +10 -2
  95. package/widgets/EodashMap/methods/btns.js +155 -0
  96. package/widgets/EodashMap/methods/create-layers-config.js +3 -3
  97. package/widgets/EodashMap/methods/index.js +2 -1
  98. package/widgets/EodashProcess/ProcessList.vue +2 -3
  99. package/widgets/EodashProcess/index.vue +18 -61
  100. package/widgets/EodashProcess/methods/async.js +1 -1
  101. package/widgets/EodashProcess/methods/composables.js +0 -5
  102. package/widgets/EodashProcess/methods/custom-endpoints/chart/veda-endpoint.js +10 -6
  103. package/widgets/EodashProcess/methods/handling.js +23 -22
  104. package/widgets/EodashProcess/methods/outputs.js +44 -4
  105. package/widgets/EodashProcess/methods/utils.js +1 -1
  106. package/widgets/EodashStacInfo.vue +10 -23
  107. package/widgets/ExportState.vue +9 -15
  108. package/dist/client/EodashMapBtns-D-HulIl1.js +0 -306
  109. package/dist/client/MobileLayout-3Ko9XSfO.js +0 -118
  110. package/dist/client/asWebComponent-Bw03Jutr.js +0 -9090
@@ -1,9 +1,9 @@
1
1
  import { createElementBlock, openBlock, createElementVNode, unref } from 'vue';
2
2
  import '@eox/stacinfo';
3
- import { B as currentUrl } from './helpers-CsjKHAcK.js';
3
+ import { B as currentUrl } from './helpers-BBSdbOmv.js';
4
4
 
5
5
  const _hoisted_1 = { class: "flex-grow-1" };
6
- const _hoisted_2 = [".for", ".allowHtml", ".body", ".featured", ".footer", ".styleOverride", ".header", ".subheader", ".tags"];
6
+ const _hoisted_2 = [".for", ".allowHtml", ".body", ".featured", ".footer", ".header", ".tags"];
7
7
 
8
8
 
9
9
  const _sfc_main = {
@@ -14,10 +14,6 @@ const _sfc_main = {
14
14
  default: true,
15
15
  },
16
16
 
17
- styleOverride: {
18
- type: String,
19
- default: "",
20
- },
21
17
  header: {
22
18
  /** @type {import("vue").PropType<string[]>} */
23
19
  type: Array,
@@ -28,15 +24,17 @@ const _sfc_main = {
28
24
  type: Array,
29
25
  default: () => ["themes"],
30
26
  },
31
- subheader: {
32
- /** @type {import("vue").PropType<string[]>} */
33
- type: Array,
34
- default: () => [],
35
- },
36
27
  body: {
37
28
  /** @type {import("vue").PropType<string[]>} */
38
29
  type: Array,
39
- default: () => ["satellite", "sensor", "agency", "extent"],
30
+ default: () => [
31
+ "satellite",
32
+ "sensor",
33
+ "insituSources",
34
+ "otherSources",
35
+ "agency",
36
+ "extent",
37
+ ],
40
38
  },
41
39
  featured: {
42
40
  /** @type {import("vue").PropType<string[]>} */
@@ -46,7 +44,7 @@ const _sfc_main = {
46
44
  footer: {
47
45
  /** @type {import("vue").PropType<string[]>} */
48
46
  type: Array,
49
- default: () => ["sci:citation"],
47
+ default: () => ["sci:citation", "sci:doi", "sci:publication"],
50
48
  },
51
49
  },
52
50
  setup(__props) {
@@ -61,9 +59,7 @@ return (_ctx, _cache) => {
61
59
  ".body": __props.body,
62
60
  ".featured": __props.featured,
63
61
  ".footer": __props.footer,
64
- ".styleOverride": __props.styleOverride,
65
62
  ".header": __props.header,
66
- ".subheader": __props.subheader,
67
63
  ".tags": __props.tags,
68
64
  style: {"--color-primary-lighter":"none"}
69
65
  }, null, 40 /* PROPS, NEED_HYDRATION */, _hoisted_2)
@@ -1,6 +1,6 @@
1
1
  import { computed, createElementBlock, createCommentVNode, openBlock, unref } from 'vue';
2
- import { j as mapEl, C as datetime } from './helpers-CsjKHAcK.js';
3
- import { I as eodashCollections } from './asWebComponent-Bw03Jutr.js';
2
+ import { j as mapEl, C as datetime } from './helpers-BBSdbOmv.js';
3
+ import { I as eodashCollections } from './asWebComponent-DaIxULaA.js';
4
4
  import '@eox/timeslider';
5
5
 
6
6
  const _hoisted_1 = [".filters"];
@@ -1,9 +1,9 @@
1
1
  import { ref, computed, createElementBlock, openBlock, createElementVNode, createVNode, createBlock, createCommentVNode, unref, withCtx, mergeProps } from 'vue';
2
- import _sfc_main$2 from './PopUp-DwI8V2gW.js';
3
- import EodashItemFilter from './EodashItemFilter-CmZkk7GK.js';
4
- import _sfc_main$1 from './EodashLayoutSwitcher-BCP3FvDb.js';
2
+ import _sfc_main$2 from './PopUp-DPPv_GSA.js';
3
+ import EodashItemFilter from './EodashItemFilter-CCoVC5BE.js';
4
+ import _sfc_main$1 from './EodashLayoutSwitcher-CL-Z9d5_.js';
5
5
  import { mdiViewDashboard, mdiPlusCircleOutline } from '@mdi/js';
6
- import { _ as _export_sfc, D as useDisplay, F as useTransparentPanel, G as VBtn } from './asWebComponent-Bw03Jutr.js';
6
+ import { _ as _export_sfc, D as useDisplay, F as useTransparentPanel, G as VBtn } from './asWebComponent-DaIxULaA.js';
7
7
 
8
8
  const _style_0 = ".v-btn--size-default[data-v-73449028]{--v-btn-height: 30px}";
9
9
 
@@ -1,14 +1,15 @@
1
- import { createVNode, normalizeStyle, normalizeClass, createElementVNode, Fragment, toDisplayString, withDirectives, mergeProps, computed, mergeModels, useModel, ref, createBlock, openBlock, withCtx, createElementBlock, createCommentVNode, renderList, unref, createTextVNode, vShow } from 'vue';
1
+ import { createVNode, normalizeStyle, normalizeClass, createElementVNode, Fragment, toDisplayString, shallowRef, watch, withDirectives, mergeProps, computed, toRef, mergeModels, useModel, ref, createBlock, openBlock, withCtx, createElementBlock, createCommentVNode, renderList, unref, createTextVNode, vShow } from 'vue';
2
2
  import { mdiContentCopy, mdiClipboardCheckOutline } from '@mdi/js';
3
- import _sfc_main$1 from './PopUp-DwI8V2gW.js';
4
- import { $ as createSimpleFunctional, g as genericComponent, p as propsFactory, n as provideDefaults, c as useRender, m as makeTagProps, e as makeComponentProps, k as provideTheme, h as useBorder, a0 as useVariant, U as useDensity, j as useRounded, a1 as useSize, a2 as genOverlays, H as VIcon, V as VDefaultsProvider, a3 as makeVariantProps, q as makeThemeProps, a4 as makeSizeProps, r as makeRoundedProps, W as makeDensityProps, t as makeBorderProps, a5 as IconValue, a6 as Ripple, b as useDimension, i as useElevation, a7 as useLoader, a8 as useLocation, a9 as usePosition, aa as useLink, ab as makeRouterProps, ac as makePositionProps, ad as makeLocationProps, ae as makeLoaderProps, s as makeElevationProps, d as makeDimensionProps, af as LoaderSlot, ag as useTextColor, o as convertToUnit, _ as _export_sfc, ah as copyToClipBoard, G as VBtn } from './asWebComponent-Bw03Jutr.js';
5
- import { Y as removeUnneededProperties, Z as getChartSpec, q as getLayers, F as mapPosition, R as availableMapProjection } from './helpers-CsjKHAcK.js';
6
- import { V as VImg, a as VExpandTransition } from './VImg-COXTnCWE.js';
3
+ import _sfc_main$1 from './PopUp-DPPv_GSA.js';
4
+ import { a0 as createSimpleFunctional, g as genericComponent, p as propsFactory, n as provideDefaults, c as useRender, m as makeTagProps, e as makeComponentProps, k as provideTheme, h as useBorder, a1 as useVariant, W as useDensity, j as useRounded, a2 as useSize, a3 as genOverlays, H as VIcon, V as VDefaultsProvider, a4 as makeVariantProps, q as makeThemeProps, a5 as makeSizeProps, r as makeRoundedProps, X as makeDensityProps, t as makeBorderProps, a6 as IconValue, a7 as Ripple, b as useDimension, i as useElevation, a8 as useLoader, a9 as useLocation, aa as usePosition, ab as useLink, ac as makeRouterProps, ad as makePositionProps, ae as makeLocationProps, af as makeLoaderProps, s as makeElevationProps, d as makeDimensionProps, ag as LoaderSlot, ah as useTextColor, o as convertToUnit, _ as _export_sfc, ai as copyToClipBoard, G as VBtn } from './asWebComponent-DaIxULaA.js';
5
+ import { N as chartSpec, a1 as removeUnneededProperties, w as getLayers, F as mapPosition, X as availableMapProjection } from './helpers-BBSdbOmv.js';
6
+ import { base64EncodeSpec } from '@eox/chart';
7
+ import { V as VImg, a as VExpandTransition } from './VImg-DhbuvNrA.js';
7
8
 
8
9
  // Styles
9
10
  const VSpacer = createSimpleFunctional('v-spacer', 'div', 'VSpacer');
10
11
 
11
- const _style_0 = ".code-block[data-v-86a0e649]{background-color:#ddd;font-family:monospace;font-size:small;max-height:200px;overflow-y:auto}";
12
+ const _style_0 = ".code-block[data-v-b7d44f9a]{background-color:#ddd;font-family:monospace;font-size:small;max-height:200px;overflow-y:auto}";
12
13
 
13
14
  const makeVCardActionsProps = propsFactory({
14
15
  ...makeComponentProps(),
@@ -350,6 +351,12 @@ const VCard = genericComponent()({
350
351
  roundedClasses
351
352
  } = useRounded(props);
352
353
  const link = useLink(props, attrs);
354
+ const loadingColor = shallowRef(undefined);
355
+ watch(() => props.loading, (val, old) => {
356
+ loadingColor.value = !val && typeof old === 'string' ? old : typeof val === 'boolean' ? undefined : val;
357
+ }, {
358
+ immediate: true
359
+ });
353
360
  useRender(() => {
354
361
  const isLink = props.link !== false && link.isLink.value;
355
362
  const isClickable = !props.disabled && props.link !== false && (props.link || link.isClickable.value);
@@ -392,7 +399,7 @@ const VCard = genericComponent()({
392
399
  }, slots.image)]), createVNode(LoaderSlot, {
393
400
  "name": "v-card",
394
401
  "active": !!props.loading,
395
- "color": typeof props.loading === 'boolean' ? undefined : props.loading
402
+ "color": loadingColor.value
396
403
  }, {
397
404
  default: slots.loader
398
405
  }), hasCardItem && createVNode(VCardItem, {
@@ -422,13 +429,21 @@ const VCard = genericComponent()({
422
429
  }
423
430
  });
424
431
 
432
+ const allowedVariants = ['dotted', 'dashed', 'solid', 'double'];
425
433
  const makeVDividerProps = propsFactory({
426
434
  color: String,
435
+ contentOffset: [Number, String, Array],
436
+ gradient: Boolean,
427
437
  inset: Boolean,
428
438
  length: [Number, String],
429
439
  opacity: [Number, String],
430
440
  thickness: [Number, String],
431
441
  vertical: Boolean,
442
+ variant: {
443
+ type: String,
444
+ default: 'solid',
445
+ validator: v => allowedVariants.includes(v)
446
+ },
432
447
  ...makeComponentProps(),
433
448
  ...makeThemeProps()
434
449
  }, 'VDivider');
@@ -457,15 +472,27 @@ const VDivider = genericComponent()({
457
472
  }
458
473
  return styles;
459
474
  });
475
+ const contentStyles = toRef(() => {
476
+ const margin = Array.isArray(props.contentOffset) ? props.contentOffset[0] : props.contentOffset;
477
+ const shift = Array.isArray(props.contentOffset) ? props.contentOffset[1] : 0;
478
+ return {
479
+ marginBlock: props.vertical && margin ? convertToUnit(margin) : undefined,
480
+ marginInline: !props.vertical && margin ? convertToUnit(margin) : undefined,
481
+ transform: shift ? `translate${props.vertical ? 'X' : 'Y'}(${convertToUnit(shift)})` : undefined
482
+ };
483
+ });
460
484
  useRender(() => {
461
485
  const divider = createElementVNode("hr", {
462
486
  "class": normalizeClass([{
463
487
  'v-divider': true,
488
+ 'v-divider--gradient': props.gradient && !slots.default,
464
489
  'v-divider--inset': props.inset,
465
490
  'v-divider--vertical': props.vertical
466
491
  }, themeClasses.value, textColorClasses.value, props.class]),
467
492
  "style": normalizeStyle([dividerStyles.value, textColorStyles.value, {
468
493
  '--v-border-opacity': props.opacity
494
+ }, {
495
+ 'border-style': props.variant
469
496
  }, props.style]),
470
497
  "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
471
498
  "role": `${attrs.role || 'separator'}`
@@ -473,11 +500,13 @@ const VDivider = genericComponent()({
473
500
  if (!slots.default) return divider;
474
501
  return createElementVNode("div", {
475
502
  "class": normalizeClass(['v-divider__wrapper', {
476
- 'v-divider__wrapper--vertical': props.vertical,
477
- 'v-divider__wrapper--inset': props.inset
503
+ 'v-divider__wrapper--gradient': props.gradient,
504
+ 'v-divider__wrapper--inset': props.inset,
505
+ 'v-divider__wrapper--vertical': props.vertical
478
506
  }])
479
507
  }, [divider, createElementVNode("div", {
480
- "class": "v-divider__content"
508
+ "class": "v-divider__content",
509
+ "style": normalizeStyle(contentStyles.value)
481
510
  }, [slots.default()]), divider]);
482
511
  });
483
512
  return {};
@@ -505,10 +534,6 @@ const _sfc_main = {
505
534
  type: Function,
506
535
  default: getLayers,
507
536
  },
508
- getChartSpec: {
509
- type: Function,
510
- default: getChartSpec,
511
- },
512
537
  }, {
513
538
  "modelValue": { type: Boolean, required: true, default: false },
514
539
  "modelModifiers": {},
@@ -544,7 +569,7 @@ const copyBtns = [
544
569
  copyFn: async () =>
545
570
  await copyToClipBoard(getChartExportCode(), copySuccess),
546
571
  copyAs: "chart",
547
- showIf: () => !!props.getChartSpec?.(),
572
+ showIf: () => chartSpec.value,
548
573
  },
549
574
  ];
550
575
 
@@ -567,12 +592,12 @@ const getMapEntryCode = () => {
567
592
  };
568
593
 
569
594
  const getChartExportCode = () => {
570
- const chartSpec = props.getChartSpec?.();
571
- if (!chartSpec) return "";
595
+ if (!chartSpec.value) return "";
572
596
  const preTag =
573
- "## Chart Example <!" + '--{as="eox-chart" style="height: 300px;" spec=';
597
+ "## Chart Example <!" + '--{as="eox-chart" style="height: 400px;" spec=';
574
598
  const endTag = " }-->";
575
- return `${preTag}'${JSON.stringify(chartSpec)}'${endTag}`;
599
+ const escapedSpec = base64EncodeSpec(chartSpec.value);
600
+ return `${preTag}'${escapedSpec}'${endTag}`;
576
601
  };
577
602
 
578
603
  return (_ctx, _cache) => {
@@ -647,7 +672,7 @@ return (_ctx, _cache) => {
647
672
  createElementVNode("strong", null, "Map Layers Configuration")
648
673
  ], -1 /* CACHED */)),
649
674
  createElementVNode("div", _hoisted_4, toDisplayString(unref(removeUnneededProperties)(__props.getLayers())), 1 /* TEXT */),
650
- (props.getChartSpec?.())
675
+ (unref(chartSpec))
651
676
  ? (openBlock(), createElementBlock("div", _hoisted_5, [
652
677
  _cache[4] || (_cache[4] = createElementVNode("p", { class: "text-body-2 mb-2" }, [
653
678
  createElementVNode("strong", null, "Chart Spec (for export)")
@@ -684,6 +709,6 @@ return (_ctx, _cache) => {
684
709
  }
685
710
 
686
711
  };
687
- const ExportState = /*#__PURE__*/_export_sfc(_sfc_main, [['styles',[_style_0]],['__scopeId',"data-v-86a0e649"]]);
712
+ const ExportState = /*#__PURE__*/_export_sfc(_sfc_main, [['styles',[_style_0]],['__scopeId',"data-v-b7d44f9a"]]);
688
713
 
689
714
  export { ExportState as default };
@@ -1,5 +1,5 @@
1
1
  import { ref, shallowRef, computed, toRef, watchEffect, createVNode, normalizeStyle, normalizeClass, inject, createBlock, openBlock, unref, withCtx, createElementVNode, toDisplayString } from 'vue';
2
- import { g as genericComponent, p as propsFactory, k as provideTheme, f as useBackgroundColor, h as useBorder, i as useElevation, j as useRounded, C as useResizeObserver, y as useToggleScope, z as useLayoutItem, c as useRender, o as convertToUnit, q as makeThemeProps, m as makeTagProps, r as makeRoundedProps, A as makeLayoutItemProps, s as makeElevationProps, e as makeComponentProps, t as makeBorderProps, _ as _export_sfc, B as eodashKey, D as useDisplay } from './asWebComponent-Bw03Jutr.js';
2
+ import { g as genericComponent, p as propsFactory, k as provideTheme, f as useBackgroundColor, h as useBorder, i as useElevation, j as useRounded, C as useResizeObserver, y as useToggleScope, z as useLayoutItem, c as useRender, o as convertToUnit, q as makeThemeProps, m as makeTagProps, r as makeRoundedProps, A as makeLayoutItemProps, s as makeElevationProps, e as makeComponentProps, t as makeBorderProps, _ as _export_sfc, B as eodashKey, D as useDisplay } from './asWebComponent-DaIxULaA.js';
3
3
 
4
4
  const _style_0 = ".footer-text[data-v-f0fd061e]{font-size:.8rem}";
5
5
 
@@ -1,6 +1,6 @@
1
1
  import { createVNode, normalizeStyle, normalizeClass, createElementVNode, shallowRef, computed, ref, watch, onMounted, onBeforeUnmount, toRef, watchEffect, mergeProps, inject, createBlock, openBlock, withCtx, createTextVNode, toDisplayString, unref } from 'vue';
2
- import { p as propsFactory, g as genericComponent, m as makeTagProps, e as makeComponentProps, c as useRender, f as useBackgroundColor, h as useBorder, i as useElevation, j as useRounded, k as provideTheme, l as useRtl, n as provideDefaults, V as VDefaultsProvider, o as convertToUnit, q as makeThemeProps, r as makeRoundedProps, s as makeElevationProps, t as makeBorderProps, v as clamp, w as consoleWarn, x as useProxiedModel, y as useToggleScope, z as useLayoutItem, A as makeLayoutItemProps, _ as _export_sfc, B as eodashKey } from './asWebComponent-Bw03Jutr.js';
3
- import { V as VImg, a as VExpandTransition } from './VImg-COXTnCWE.js';
2
+ import { p as propsFactory, g as genericComponent, m as makeTagProps, e as makeComponentProps, c as useRender, f as useBackgroundColor, h as useBorder, i as useElevation, j as useRounded, k as provideTheme, l as useRtl, n as provideDefaults, V as VDefaultsProvider, o as convertToUnit, q as makeThemeProps, r as makeRoundedProps, s as makeElevationProps, t as makeBorderProps, v as clamp, w as consoleWarn, x as useProxiedModel, y as useToggleScope, z as useLayoutItem, A as makeLayoutItemProps, _ as _export_sfc, B as eodashKey } from './asWebComponent-DaIxULaA.js';
3
+ import { V as VImg, a as VExpandTransition } from './VImg-DhbuvNrA.js';
4
4
  import { u as useSsrBoot } from './ssrBoot-Zgc_Ttvi.js';
5
5
 
6
6
  const _style_0 = ".logo[data-v-86c95219]{max-width:140px}";
@@ -36,6 +36,10 @@ const allowedDensities = [null, 'prominent', 'default', 'comfortable', 'compact'
36
36
  const makeVToolbarProps = propsFactory({
37
37
  absolute: Boolean,
38
38
  collapse: Boolean,
39
+ collapsePosition: {
40
+ type: String,
41
+ default: 'start'
42
+ },
39
43
  color: String,
40
44
  density: {
41
45
  type: String,
@@ -107,7 +111,7 @@ const VToolbar = genericComponent()({
107
111
  const extension = slots.extension?.();
108
112
  isExtended.value = props.extended === null ? !!extension : props.extended;
109
113
  return createVNode(props.tag, {
110
- "class": normalizeClass(['v-toolbar', {
114
+ "class": normalizeClass(['v-toolbar', `v-toolbar--collapse-${props.collapsePosition}`, {
111
115
  'v-toolbar--absolute': props.absolute,
112
116
  'v-toolbar--collapse': props.collapse,
113
117
  'v-toolbar--flat': props.flat,
@@ -193,7 +197,8 @@ const makeScrollProps = propsFactory({
193
197
  function useScroll(props) {
194
198
  let args = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
195
199
  const {
196
- canScroll
200
+ canScroll,
201
+ layoutSize
197
202
  } = args;
198
203
  let previousScroll = 0;
199
204
  let previousScrollHeight = 0;
@@ -203,6 +208,9 @@ function useScroll(props) {
203
208
  const currentThreshold = shallowRef(0);
204
209
  const isScrollActive = shallowRef(false);
205
210
  const isScrollingUp = shallowRef(false);
211
+ const isAtBottom = shallowRef(false);
212
+ const reachedBottomWhileScrollingDown = shallowRef(false);
213
+ const hasEnoughScrollableSpace = shallowRef(true);
206
214
  const scrollThreshold = computed(() => {
207
215
  return Number(props.scrollThreshold);
208
216
  });
@@ -214,19 +222,82 @@ function useScroll(props) {
214
222
  const scrollRatio = computed(() => {
215
223
  return clamp((scrollThreshold.value - currentScroll.value) / scrollThreshold.value || 0);
216
224
  });
217
- const onScroll = () => {
225
+ function getScrollMetrics(targetEl) {
226
+ const clientHeight = 'window' in targetEl ? window.innerHeight : targetEl.clientHeight;
227
+ const scrollHeight = 'window' in targetEl ? document.documentElement.scrollHeight : targetEl.scrollHeight;
228
+ return {
229
+ clientHeight,
230
+ scrollHeight
231
+ };
232
+ }
233
+ function checkScrollableSpace() {
234
+ const targetEl = target.value;
235
+ if (!targetEl) return;
236
+ const {
237
+ clientHeight,
238
+ scrollHeight
239
+ } = getScrollMetrics(targetEl);
240
+ const maxScrollableDistance = scrollHeight - clientHeight;
241
+
242
+ // When the scroll-hide element (like AppBar) hides, it causes the page to grow
243
+ // We need extra scrollable space beyond the threshold to prevent bouncing
244
+ // Add the element's height to the required minimum distance
245
+ const elementHeight = layoutSize?.value || 0;
246
+ const minRequiredDistance = scrollThreshold.value + elementHeight;
247
+
248
+ // Only enable scroll-hide if there's enough scrollable space
249
+ hasEnoughScrollableSpace.value = maxScrollableDistance > minRequiredDistance;
250
+ }
251
+ function onResize() {
252
+ checkScrollableSpace();
253
+ }
254
+ function onScroll() {
218
255
  const targetEl = target.value;
219
256
  if (!targetEl || canScroll && !canScroll.value) return;
220
257
  previousScroll = currentScroll.value;
221
258
  currentScroll.value = 'window' in targetEl ? targetEl.pageYOffset : targetEl.scrollTop;
222
259
  const currentScrollHeight = targetEl instanceof Window ? document.documentElement.scrollHeight : targetEl.scrollHeight;
223
260
  if (previousScrollHeight !== currentScrollHeight) {
261
+ // If page is growing (content loading), recalculate scrollable space
262
+ // If page is shrinking (likely due to navbar animation), don't recalculate
263
+ if (currentScrollHeight > previousScrollHeight) {
264
+ checkScrollableSpace();
265
+ }
224
266
  previousScrollHeight = currentScrollHeight;
225
- return;
226
267
  }
227
268
  isScrollingUp.value = currentScroll.value < previousScroll;
228
269
  currentThreshold.value = Math.abs(currentScroll.value - scrollThreshold.value);
229
- };
270
+
271
+ // Detect if at bottom of page
272
+ const {
273
+ clientHeight,
274
+ scrollHeight
275
+ } = getScrollMetrics(targetEl);
276
+ const atBottom = currentScroll.value + clientHeight >= scrollHeight - 5;
277
+
278
+ // Track when bottom is reached during downward scroll
279
+ // Only set flag if ALL conditions are met:
280
+ // 1. Scrolled past threshold (navbar is hiding)
281
+ // 2. Page has enough scrollable space for scroll-hide
282
+ // This prevents activation on short pages or edge cases
283
+ if (!isScrollingUp.value && atBottom && currentScroll.value >= scrollThreshold.value && hasEnoughScrollableSpace.value) {
284
+ reachedBottomWhileScrollingDown.value = true;
285
+ }
286
+
287
+ // Reset the flag when:
288
+ // 1. Scrolling up away from bottom (with small tolerance for touchpad/momentum scrolling)
289
+ // 2. Scroll position jumped significantly (e.g., navigation, scroll restoration)
290
+ // 3. Scroll is at the very top (page navigation resets to top)
291
+ const scrollJumped = Math.abs(currentScroll.value - previousScroll) > 100;
292
+ const atTop = currentScroll.value <= 5;
293
+ const scrolledUpSignificantly = isScrollingUp.value && previousScroll - currentScroll.value > 1;
294
+ if (scrolledUpSignificantly && !atBottom || scrollJumped && currentScroll.value < scrollThreshold.value || atTop) {
295
+ reachedBottomWhileScrollingDown.value = false;
296
+ }
297
+
298
+ // Update state
299
+ isAtBottom.value = atBottom;
300
+ }
230
301
  watch(isScrollingUp, () => {
231
302
  savedScroll.value = savedScroll.value || currentScroll.value;
232
303
  });
@@ -246,12 +317,23 @@ function useScroll(props) {
246
317
  target.value.addEventListener('scroll', onScroll, {
247
318
  passive: true
248
319
  });
320
+
321
+ // Check scrollable space when target is set
322
+ Promise.resolve().then(() => {
323
+ checkScrollableSpace();
324
+ });
249
325
  }, {
250
326
  immediate: true
251
327
  });
328
+
329
+ // Listen to window resize to recalculate scrollable space
330
+ window.addEventListener('resize', onResize, {
331
+ passive: true
332
+ });
252
333
  });
253
334
  onBeforeUnmount(() => {
254
335
  target.value?.removeEventListener('scroll', onScroll);
336
+ window.removeEventListener('resize', onResize);
255
337
  });
256
338
 
257
339
  // Do we need this? If yes - seems that
@@ -269,7 +351,10 @@ function useScroll(props) {
269
351
  // probably can be removed
270
352
  // later (2 chars chlng)
271
353
  isScrollingUp,
272
- savedScroll
354
+ savedScroll,
355
+ isAtBottom,
356
+ reachedBottomWhileScrollingDown,
357
+ hasEnoughScrollableSpace
273
358
  };
274
359
  }
275
360
 
@@ -322,13 +407,22 @@ const VAppBar = genericComponent()({
322
407
  // behavior.shrink ||
323
408
  !isActive.value;
324
409
  });
410
+ const appBarHeight = computed(() => {
411
+ const height = vToolbarRef.value?.contentHeight ?? 0;
412
+ const extensionHeight = vToolbarRef.value?.extensionHeight ?? 0;
413
+ return height + extensionHeight;
414
+ });
325
415
  const {
326
416
  currentScroll,
327
417
  scrollThreshold,
328
418
  isScrollingUp,
329
- scrollRatio
419
+ scrollRatio,
420
+ isAtBottom,
421
+ reachedBottomWhileScrollingDown,
422
+ hasEnoughScrollableSpace
330
423
  } = useScroll(props, {
331
- canScroll
424
+ canScroll,
425
+ layoutSize: appBarHeight
332
426
  });
333
427
  const canHide = toRef(() => scrollBehavior.value.hide || scrollBehavior.value.fullyHide);
334
428
  const isCollapsed = computed(() => props.collapse || scrollBehavior.value.collapse && (scrollBehavior.value.inverted ? scrollRatio.value > 0 : scrollRatio.value === 0));
@@ -343,15 +437,31 @@ const VAppBar = genericComponent()({
343
437
  });
344
438
  useToggleScope(() => !!props.scrollBehavior, () => {
345
439
  watchEffect(() => {
346
- if (canHide.value) {
347
- if (scrollBehavior.value.inverted) {
348
- isActive.value = currentScroll.value > scrollThreshold.value;
349
- } else {
350
- isActive.value = isScrollingUp.value || currentScroll.value < scrollThreshold.value;
351
- }
352
- } else {
440
+ if (!canHide.value) {
353
441
  isActive.value = true;
442
+ return;
443
+ }
444
+ if (scrollBehavior.value.inverted) {
445
+ isActive.value = currentScroll.value > scrollThreshold.value;
446
+ return;
354
447
  }
448
+
449
+ // If there's not enough scrollable space, don't apply scroll-hide behavior at all
450
+ // This prevents flickering/bouncing animations on short pages
451
+ if (!hasEnoughScrollableSpace.value) {
452
+ isActive.value = true;
453
+ return;
454
+ }
455
+
456
+ // Prevent navbar from showing when we reached bottom while scrolling down
457
+ // This handles the case where scroll momentum causes to hit bottom during hide transition
458
+ if (reachedBottomWhileScrollingDown.value) {
459
+ isActive.value = false;
460
+ return;
461
+ }
462
+
463
+ // Normal behavior: show when scrolling up (and not at bottom) or above threshold
464
+ isActive.value = isScrollingUp.value && !isAtBottom.value || currentScroll.value < scrollThreshold.value;
355
465
  });
356
466
  });
357
467
  const {