@gen3/frontend 0.10.84 → 0.10.86

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 (58) hide show
  1. package/dist/cjs/index.js +269 -89
  2. package/dist/cjs/index.js.map +1 -1
  3. package/dist/dts/features/Analysis/AnalysisCard.d.ts +5 -0
  4. package/dist/dts/features/Analysis/AnalysisCard.d.ts.map +1 -0
  5. package/dist/dts/features/Analysis/AnalysisCard.js +14 -0
  6. package/dist/dts/features/Analysis/AnalysisCard.js.map +1 -0
  7. package/dist/dts/features/Analysis/AnalysisCardCompact.d.ts +6 -0
  8. package/dist/dts/features/Analysis/AnalysisCardCompact.d.ts.map +1 -0
  9. package/dist/dts/features/Analysis/AnalysisCardCompact.js +12 -0
  10. package/dist/dts/features/Analysis/AnalysisCardCompact.js.map +1 -0
  11. package/dist/dts/features/Analysis/AnalysisCardCompact.stories.d.ts +32 -0
  12. package/dist/dts/features/Analysis/AnalysisCardCompact.stories.d.ts.map +1 -0
  13. package/dist/dts/features/Analysis/AnalysisCardCompact.stories.js +23 -0
  14. package/dist/dts/features/Analysis/AnalysisCardCompact.stories.js.map +1 -0
  15. package/dist/dts/features/Analysis/AnalysisCardEditor.js.map +1 -1
  16. package/dist/dts/features/Analysis/AnalysisCenter.d.ts.map +1 -1
  17. package/dist/dts/features/Analysis/AnalysisCenter.js +3 -10
  18. package/dist/dts/features/Analysis/AnalysisCenter.js.map +1 -1
  19. package/dist/dts/features/Analysis/AnalysisCenterWithSections.d.ts +22 -0
  20. package/dist/dts/features/Analysis/AnalysisCenterWithSections.d.ts.map +1 -0
  21. package/dist/dts/features/Analysis/AnalysisCenterWithSections.js +53 -0
  22. package/dist/dts/features/Analysis/AnalysisCenterWithSections.js.map +1 -0
  23. package/dist/dts/features/Analysis/AnalysisCenterWithSections.stories.d.ts +13 -0
  24. package/dist/dts/features/Analysis/AnalysisCenterWithSections.stories.d.ts.map +1 -0
  25. package/dist/dts/features/Analysis/AnalysisCenterWithSections.stories.js +113 -0
  26. package/dist/dts/features/Analysis/AnalysisCenterWithSections.stories.js.map +1 -0
  27. package/dist/dts/features/Analysis/TextDescription.d.ts.map +1 -1
  28. package/dist/dts/features/Analysis/TextDescription.js +16 -2
  29. package/dist/dts/features/Analysis/TextDescription.js.map +1 -1
  30. package/dist/dts/features/Analysis/index.d.ts +3 -1
  31. package/dist/dts/features/Analysis/index.d.ts.map +1 -1
  32. package/dist/dts/features/Analysis/index.js +2 -1
  33. package/dist/dts/features/Analysis/index.js.map +1 -1
  34. package/dist/dts/features/Analysis/types.d.ts +15 -2
  35. package/dist/dts/features/Analysis/types.d.ts.map +1 -1
  36. package/dist/dts/features/Analysis/types.js +20 -1
  37. package/dist/dts/features/Analysis/types.js.map +1 -1
  38. package/dist/dts/index.d.ts +2 -2
  39. package/dist/dts/index.d.ts.map +1 -1
  40. package/dist/dts/index.js +1 -1
  41. package/dist/dts/index.js.map +1 -1
  42. package/dist/dts/pages/Analysis/Analysis.d.ts +1 -1
  43. package/dist/dts/pages/Analysis/Analysis.d.ts.map +1 -1
  44. package/dist/dts/pages/Analysis/Analysis.js +7 -4
  45. package/dist/dts/pages/Analysis/Analysis.js.map +1 -1
  46. package/dist/dts/pages/Analysis/data.d.ts.map +1 -1
  47. package/dist/dts/pages/Analysis/data.js +2 -2
  48. package/dist/dts/pages/Analysis/data.js.map +1 -1
  49. package/dist/dts/pages/Analysis/index.d.ts +1 -0
  50. package/dist/dts/pages/Analysis/index.d.ts.map +1 -1
  51. package/dist/dts/pages/Analysis/index.js.map +1 -1
  52. package/dist/dts/pages/Analysis/types.d.ts +4 -2
  53. package/dist/dts/pages/Analysis/types.d.ts.map +1 -1
  54. package/dist/esm/index.js +269 -90
  55. package/dist/esm/index.js.map +1 -1
  56. package/dist/index.d.ts +39 -5
  57. package/dist/tsconfig.tsbuildinfo +1 -1
  58. package/package.json +4 -4
package/dist/cjs/index.js CHANGED
@@ -11954,18 +11954,35 @@ const Workspace = ({ config })=>{
11954
11954
 
11955
11955
  const TextDescription = ({ description })=>{
11956
11956
  const [extend, setExtend] = React.useState(false);
11957
+ const textRef = React.useRef(null);
11958
+ const [isClamped, setClamped] = React.useState(false);
11959
+ React.useEffect(()=>{
11960
+ // Function that should be called on window resize
11961
+ function handleResize() {
11962
+ if (textRef && textRef.current) {
11963
+ setClamped(textRef.current.scrollHeight > textRef.current.clientHeight);
11964
+ }
11965
+ }
11966
+ // Add event listener to window resize
11967
+ window.addEventListener('resize', handleResize);
11968
+ // Remove event listener on cleanup
11969
+ return ()=>window.removeEventListener('resize', handleResize);
11970
+ }, []); // Empty array ensures that it would only run on mount
11957
11971
  return /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
11958
11972
  children: [
11959
11973
  !extend ? /*#__PURE__*/ jsxRuntime.jsx(core$1.Text, {
11974
+ ref: textRef,
11975
+ size: "sm",
11960
11976
  lineClamp: 4,
11961
11977
  children: description
11962
11978
  }) : /*#__PURE__*/ jsxRuntime.jsx(core$1.Text, {
11979
+ size: "sm",
11963
11980
  children: description
11964
11981
  }),
11965
- /*#__PURE__*/ jsxRuntime.jsx("button", {
11982
+ isClamped && /*#__PURE__*/ jsxRuntime.jsx("button", {
11966
11983
  onClick: ()=>setExtend((extend)=>!extend),
11967
11984
  children: /*#__PURE__*/ jsxRuntime.jsxs("div", {
11968
- className: "flex text-xs font-semibold text-gray-400",
11985
+ className: "flex text-xs font-semibold text-base-contrast-light",
11969
11986
  children: [
11970
11987
  !extend ? 'Extend Text' : 'Collapse Text',
11971
11988
  ' ',
@@ -11980,6 +11997,90 @@ const TextDescription = ({ description })=>{
11980
11997
  });
11981
11998
  };
11982
11999
 
12000
+ const AnalysisCard = ({ title, description, type, icon, image, hasDemo, loginRequired, href })=>{
12001
+ return /*#__PURE__*/ jsxRuntime.jsx(core$1.Stack, {
12002
+ children: /*#__PURE__*/ jsxRuntime.jsxs("div", {
12003
+ className: "rounded-sm bg-base-max",
12004
+ children: [
12005
+ /*#__PURE__*/ jsxRuntime.jsx("div", {
12006
+ className: "p-0 rounded-sm",
12007
+ children: /*#__PURE__*/ jsxRuntime.jsx(core$1.Image, {
12008
+ component: Image,
12009
+ src: `${image}`,
12010
+ alt: `${title} image`,
12011
+ height: 1000,
12012
+ width: 1000,
12013
+ radius: "md"
12014
+ })
12015
+ }),
12016
+ /*#__PURE__*/ jsxRuntime.jsxs("div", {
12017
+ className: "flex -mt-5 relative z-10",
12018
+ children: [
12019
+ /*#__PURE__*/ jsxRuntime.jsx("div", {
12020
+ className: "p-0.5 rounded-sm bg-base-lightest ml-5 border-2 border-base",
12021
+ children: /*#__PURE__*/ jsxRuntime.jsx(core$1.Image, {
12022
+ component: Image,
12023
+ src: `${icon}`,
12024
+ alt: `${title} logo`,
12025
+ width: 40,
12026
+ height: 40,
12027
+ radius: "lg"
12028
+ })
12029
+ }),
12030
+ /*#__PURE__*/ jsxRuntime.jsx("div", {
12031
+ className: "relative mb-0 ml-2",
12032
+ children: /*#__PURE__*/ jsxRuntime.jsx("span", {
12033
+ className: "absolute bottom-0 left-0 text-xs text-gray-700 w-max",
12034
+ children: type === 'application' ? 'Application' : 'Jupyter Notebook'
12035
+ })
12036
+ })
12037
+ ]
12038
+ }),
12039
+ /*#__PURE__*/ jsxRuntime.jsxs("div", {
12040
+ className: "flex flex-col mt-2 ml-2",
12041
+ children: [
12042
+ /*#__PURE__*/ jsxRuntime.jsx("div", {
12043
+ className: "text-sm font-black h-6",
12044
+ children: title
12045
+ }),
12046
+ /*#__PURE__*/ jsxRuntime.jsx("div", {
12047
+ className: "text-xs text-gray-400 h-6",
12048
+ children: loginRequired ? 'Login Required' : ' '
12049
+ }),
12050
+ /*#__PURE__*/ jsxRuntime.jsx("div", {
12051
+ className: "text-sm p-2 h-fit",
12052
+ children: /*#__PURE__*/ jsxRuntime.jsx(TextDescription, {
12053
+ description: description
12054
+ })
12055
+ }),
12056
+ /*#__PURE__*/ jsxRuntime.jsx("div", {
12057
+ className: "flex mb-4 rounded-b-md",
12058
+ children: /*#__PURE__*/ jsxRuntime.jsxs("div", {
12059
+ className: "m-auto",
12060
+ children: [
12061
+ /*#__PURE__*/ jsxRuntime.jsx(core$1.NavLink, {
12062
+ component: Link,
12063
+ href: href ?? '_blank',
12064
+ classNames: {
12065
+ root: 'bg-accent text-accent-contrast hover:bg-accent-darker p-2 rounded-sm',
12066
+ label: 'text-sm font-semibold'
12067
+ },
12068
+ label: `Run ${type === 'application' ? 'App' : 'Notebook'}`
12069
+ }),
12070
+ hasDemo && /*#__PURE__*/ jsxRuntime.jsx("button", {
12071
+ className: "ml-2 p-1.5 rounded-sm text-sm font-semibold",
12072
+ children: "Demo"
12073
+ })
12074
+ ]
12075
+ })
12076
+ })
12077
+ ]
12078
+ })
12079
+ ]
12080
+ })
12081
+ }, title);
12082
+ };
12083
+
11983
12084
  const AnalysisCenter = ({ tools, showFilterAndSort = false })=>{
11984
12085
  const [cards, setCards] = React.useState({
11985
12086
  type: '',
@@ -12049,91 +12150,158 @@ const AnalysisCenter = ({ tools, showFilterAndSort = false })=>{
12049
12150
  children: /*#__PURE__*/ jsxRuntime.jsx("div", {
12050
12151
  className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6 p-1 mx-4 overflow-y-scroll",
12051
12152
  children: tools.map(({ title, description, type, icon, image, hasDemo, loginRequired, href }, key)=>{
12052
- return /*#__PURE__*/ jsxRuntime.jsx(core$1.Stack, {
12053
- children: /*#__PURE__*/ jsxRuntime.jsxs("div", {
12054
- className: "rounded-sm bg-base-max",
12153
+ return /*#__PURE__*/ jsxRuntime.jsx(AnalysisCard, {
12154
+ title,
12155
+ description,
12156
+ type,
12157
+ icon,
12158
+ image,
12159
+ hasDemo,
12160
+ loginRequired,
12161
+ href,
12162
+ cardType: 'regular'
12163
+ }, title);
12164
+ })
12165
+ })
12166
+ })
12167
+ ]
12168
+ });
12169
+ };
12170
+
12171
+ const AnalysisCardCompact = ({ title, description, type = 'application', icon, hasDemo = false, loginRequired = false, href, count, countUnits })=>{
12172
+ return /*#__PURE__*/ jsxRuntime.jsxs(core$1.Stack, {
12173
+ gap: "xs",
12174
+ classNames: {
12175
+ root: 'rounded-lg border-3 border-contrast bg-base-max h-full'
12176
+ },
12177
+ children: [
12178
+ /*#__PURE__*/ jsxRuntime.jsx("div", {
12179
+ className: "rounded-t-lg bg-secondary border-b-4 border-accent-warm h-12"
12180
+ }),
12181
+ /*#__PURE__*/ jsxRuntime.jsx("div", {
12182
+ className: "flex relative -mt-10 z-10 p-2 max-w-90",
12183
+ children: /*#__PURE__*/ jsxRuntime.jsx("div", {
12184
+ className: "relative rounded-lg bg-base-lightest ml-5 border-4 border-base-light mx-2 w-1/4 aspect-square",
12185
+ children: /*#__PURE__*/ jsxRuntime.jsx(core$1.Image, {
12186
+ component: Image,
12187
+ src: `${icon}`,
12188
+ alt: `${title} logo`,
12189
+ fill: true,
12190
+ fit: "cover",
12191
+ radius: "lg"
12192
+ })
12193
+ })
12194
+ }),
12195
+ /*#__PURE__*/ jsxRuntime.jsxs("div", {
12196
+ className: "flex flex-col ml-2 px-4 pb-2 h-full justify-between",
12197
+ children: [
12198
+ /*#__PURE__*/ jsxRuntime.jsxs("div", {
12199
+ className: "flex flex-col",
12200
+ children: [
12201
+ /*#__PURE__*/ jsxRuntime.jsx(core$1.Text, {
12202
+ fw: "bold",
12203
+ classNames: {
12204
+ root: 'font-header sm:text-xl lg:text-2xl'
12205
+ },
12206
+ children: title
12207
+ }),
12208
+ /*#__PURE__*/ jsxRuntime.jsxs(core$1.Text, {
12209
+ size: "md",
12210
+ fw: "semibold",
12211
+ c: "base-contrast.5",
12055
12212
  children: [
12056
- /*#__PURE__*/ jsxRuntime.jsx("div", {
12057
- className: "p-0 rounded-sm",
12058
- children: /*#__PURE__*/ jsxRuntime.jsx(core$1.Image, {
12059
- component: Image,
12060
- src: `${image}`,
12061
- alt: `${title} image`,
12062
- height: 1000,
12063
- width: 1000,
12064
- radius: "md"
12065
- })
12066
- }),
12067
- /*#__PURE__*/ jsxRuntime.jsxs("div", {
12068
- className: "flex -mt-5 relative z-10",
12069
- children: [
12070
- /*#__PURE__*/ jsxRuntime.jsx("div", {
12071
- className: "p-0.5 rounded-sm bg-base-lightest ml-5 border-2 border-base",
12072
- children: /*#__PURE__*/ jsxRuntime.jsx(core$1.Image, {
12073
- component: Image,
12074
- src: `${icon}`,
12075
- alt: `${title} logo`,
12076
- width: 40,
12077
- height: 40,
12078
- radius: "lg"
12079
- })
12080
- }),
12081
- /*#__PURE__*/ jsxRuntime.jsx("div", {
12082
- className: "relative mb-0 ml-2",
12083
- children: /*#__PURE__*/ jsxRuntime.jsx("span", {
12084
- className: "absolute bottom-0 left-0 text-xs text-gray-700 w-max",
12085
- children: type === 'application' ? 'Application' : 'Jupyter Notebook'
12086
- })
12087
- })
12088
- ]
12089
- }),
12090
- /*#__PURE__*/ jsxRuntime.jsxs("div", {
12091
- className: "flex flex-col mt-2 ml-2",
12092
- children: [
12093
- /*#__PURE__*/ jsxRuntime.jsx("div", {
12094
- className: "text-sm font-black h-6",
12095
- children: title
12096
- }),
12097
- /*#__PURE__*/ jsxRuntime.jsx("div", {
12098
- className: "text-xs text-gray-400 h-6",
12099
- children: loginRequired ? 'Login Required' : ' '
12100
- }),
12101
- /*#__PURE__*/ jsxRuntime.jsx("div", {
12102
- className: "text-sm p-2 h-fit",
12103
- children: /*#__PURE__*/ jsxRuntime.jsx(TextDescription, {
12104
- description: description
12105
- })
12106
- }),
12107
- /*#__PURE__*/ jsxRuntime.jsx("div", {
12108
- className: "flex mb-4 rounded-b-md",
12109
- children: /*#__PURE__*/ jsxRuntime.jsxs("div", {
12110
- className: "m-auto",
12111
- children: [
12112
- /*#__PURE__*/ jsxRuntime.jsx(core$1.NavLink, {
12113
- component: Link,
12114
- href: href ?? '_blank',
12115
- classNames: {
12116
- root: 'bg-accent text-accent-contrast hover:bg-accent-darker p-2 rounded-sm',
12117
- label: 'text-sm font-semibold'
12118
- },
12119
- label: `Run ${type === 'application' ? 'App' : 'Notebook'}`
12120
- }),
12121
- hasDemo && /*#__PURE__*/ jsxRuntime.jsx("button", {
12122
- className: "ml-2 p-1.5 rounded-sm text-sm font-semibold",
12123
- children: "Demo"
12124
- })
12125
- ]
12126
- })
12127
- })
12128
- ]
12129
- })
12213
+ count?.toLocaleString(),
12214
+ " ",
12215
+ countUnits
12130
12216
  ]
12217
+ }),
12218
+ /*#__PURE__*/ jsxRuntime.jsx("div", {
12219
+ className: "py-2 min-h-24 h-full",
12220
+ children: /*#__PURE__*/ jsxRuntime.jsx(TextDescription, {
12221
+ description: description
12222
+ })
12131
12223
  })
12132
- }, key);
12224
+ ]
12225
+ }),
12226
+ /*#__PURE__*/ jsxRuntime.jsxs(core$1.Group, {
12227
+ className: "mb-4",
12228
+ children: [
12229
+ /*#__PURE__*/ jsxRuntime.jsxs(core$1.Button, {
12230
+ color: "primary.4",
12231
+ children: [
12232
+ "Run ",
12233
+ type === 'application' ? 'App' : 'Notebook'
12234
+ ]
12235
+ }),
12236
+ hasDemo && /*#__PURE__*/ jsxRuntime.jsx(core$1.Button, {
12237
+ variant: "outline",
12238
+ color: "primary.4",
12239
+ children: "Demo"
12240
+ })
12241
+ ]
12133
12242
  })
12134
- })
12243
+ ]
12135
12244
  })
12136
12245
  ]
12246
+ }, title);
12247
+ };
12248
+
12249
+ /**
12250
+ * AnalysisPanelWithSections component.
12251
+ *
12252
+ * This React functional component renders a panel that organizes tools into sections. Each section
12253
+ * includes a title, a divider, and a grid of tool cards. The component supports customizable styling
12254
+ * for global and section-specific classNames.
12255
+ *
12256
+ * @type {React.FC<AnalysisCenterWithSectionsConfiguration>}
12257
+ *
12258
+ * @param {Object} props - The component properties.
12259
+ * @param {Array} props.sections - The array of sections to display in the panel. Each section includes
12260
+ * a label, an optional classNames object for custom styling, and an array of tools.
12261
+ * @param {Object} [props.classNames] - An optional object of global classNames used for styling
12262
+ * components within the panel. These can be overridden on a per-section basis.
12263
+ *
12264
+ * @returns {ReactElement} A React element that renders the analysis panel with sections.
12265
+ */ const AnalysisCenterWithSections = ({ sections, classNames })=>{
12266
+ const rootClassNamesDefaults = {
12267
+ title: 'font-header font-bold text-2xl uppercase',
12268
+ divider: 'text-accent w-[100px] border-accent mb-4'
12269
+ };
12270
+ const mergedGlobalClassnames = mergeDefaultTailwindClassnames(rootClassNamesDefaults, classNames ?? {});
12271
+ const sectionPanels = React.useMemo(()=>sections.map((section)=>{
12272
+ const sectionClassnames = mergeDefaultTailwindClassnames(mergedGlobalClassnames, section.classNames ?? {});
12273
+ return /*#__PURE__*/ jsxRuntime.jsxs(core$1.Stack, {
12274
+ gap: "xs",
12275
+ children: [
12276
+ /*#__PURE__*/ jsxRuntime.jsx(core$1.Text, {
12277
+ classNames: {
12278
+ root: sectionClassnames['title']
12279
+ },
12280
+ children: section.label
12281
+ }),
12282
+ /*#__PURE__*/ jsxRuntime.jsx(core$1.Divider, {
12283
+ size: "lg",
12284
+ classNames: {
12285
+ root: sectionClassnames['divider']
12286
+ }
12287
+ }),
12288
+ /*#__PURE__*/ jsxRuntime.jsx("div", {
12289
+ className: "grid sm:grid-cols-2 md:grid-cols-4 lg:grid-cols-5 gap-4 items-stretch",
12290
+ children: section.tools.map((tool)=>{
12291
+ return /*#__PURE__*/ jsxRuntime.jsx("div", {
12292
+ children: /*#__PURE__*/ jsxRuntime.jsx(AnalysisCardCompact, {
12293
+ ...tool
12294
+ })
12295
+ }, tool.title);
12296
+ })
12297
+ })
12298
+ ]
12299
+ }, section.label);
12300
+ }), [
12301
+ sections
12302
+ ]);
12303
+ return /*#__PURE__*/ jsxRuntime.jsx(core$1.Stack, {
12304
+ children: sectionPanels
12137
12305
  });
12138
12306
  };
12139
12307
 
@@ -17659,8 +17827,8 @@ const AnalysisPanel = ({ tools })=>{
17659
17827
  });
17660
17828
  };
17661
17829
 
17662
- const AnalysisPage = ({ headerProps, footerProps, tools })=>{
17663
- return /*#__PURE__*/ jsxRuntime.jsx(NavPageLayout, {
17830
+ const AnalysisPage = ({ headerProps, footerProps, tools, sections, classNames })=>{
17831
+ return /*#__PURE__*/ jsxRuntime.jsxs(NavPageLayout, {
17664
17832
  headerProps,
17665
17833
  footerProps,
17666
17834
  headerData: {
@@ -17668,9 +17836,21 @@ const AnalysisPage = ({ headerProps, footerProps, tools })=>{
17668
17836
  content: 'Analysis Center',
17669
17837
  key: 'gen3-analysis-center'
17670
17838
  },
17671
- children: /*#__PURE__*/ jsxRuntime.jsx(AnalysisPanel, {
17672
- tools: tools
17673
- })
17839
+ children: [
17840
+ !tools && !sections && /*#__PURE__*/ jsxRuntime.jsx(core$1.Center, {
17841
+ className: "mt-20",
17842
+ children: /*#__PURE__*/ jsxRuntime.jsx(ErrorCard, {
17843
+ message: "No tools or sections found"
17844
+ })
17845
+ }),
17846
+ tools && /*#__PURE__*/ jsxRuntime.jsx(AnalysisPanel, {
17847
+ tools: tools
17848
+ }),
17849
+ sections && /*#__PURE__*/ jsxRuntime.jsx(AnalysisCenterWithSections, {
17850
+ sections: sections,
17851
+ classNames: classNames
17852
+ })
17853
+ ]
17674
17854
  });
17675
17855
  };
17676
17856
 
@@ -17684,11 +17864,10 @@ const AnalysisPageGetServerSideProps = async ()=>{
17684
17864
  }
17685
17865
  };
17686
17866
  } catch (err) {
17687
- console.error(err);
17867
+ console.warn(err);
17688
17868
  return {
17689
17869
  props: {
17690
- ...await getNavPageLayoutPropsFromConfig(),
17691
- tools: []
17870
+ ...await getNavPageLayoutPropsFromConfig()
17692
17871
  }
17693
17872
  };
17694
17873
  }
@@ -20856,6 +21035,7 @@ exports.AdminAuthZPageGetServerSideProps = AdminAuthZPageGetServerSideProps;
20856
21035
  exports.AiSearch = AiSearch;
20857
21036
  exports.AiSearchPage = AISearchPage;
20858
21037
  exports.AnalysisCenter = AnalysisCenter;
21038
+ exports.AnalysisCenterWithSections = AnalysisCenterWithSections;
20859
21039
  exports.AnalysisEditorPage = AnalysisEditorPage;
20860
21040
  exports.AnalysisEditorPageGetServerSideProps = AnalysisEditorPageGetServerSideProps;
20861
21041
  exports.AnalysisPage = AnalysisPage;