@gen3/frontend 0.10.83 → 0.10.85

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 (92) hide show
  1. package/dist/cjs/index.js +395 -177
  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/features/Navigation/ActionMenu.d.ts +2 -2
  39. package/dist/dts/features/Navigation/ActionMenu.d.ts.map +1 -1
  40. package/dist/dts/features/Navigation/ActionMenu.js.map +1 -1
  41. package/dist/dts/features/Navigation/Header.js +1 -1
  42. package/dist/dts/features/Navigation/Header.js.map +1 -1
  43. package/dist/dts/features/Navigation/HorizontalClean/HorizontalNavigationBar.d.ts +1 -1
  44. package/dist/dts/features/Navigation/HorizontalClean/HorizontalNavigationBar.d.ts.map +1 -1
  45. package/dist/dts/features/Navigation/TopBar/AccountButton.d.ts +5 -0
  46. package/dist/dts/features/Navigation/TopBar/AccountButton.d.ts.map +1 -0
  47. package/dist/dts/features/Navigation/TopBar/AccountButton.js +78 -0
  48. package/dist/dts/features/Navigation/TopBar/AccountButton.js.map +1 -0
  49. package/dist/dts/features/Navigation/TopBar/IconButton.d.ts +11 -0
  50. package/dist/dts/features/Navigation/TopBar/IconButton.d.ts.map +1 -0
  51. package/dist/dts/features/Navigation/TopBar/IconButton.js +23 -0
  52. package/dist/dts/features/Navigation/TopBar/IconButton.js.map +1 -0
  53. package/dist/dts/features/Navigation/TopBar/IconButton.stories.d.ts +35 -0
  54. package/dist/dts/features/Navigation/TopBar/IconButton.stories.d.ts.map +1 -0
  55. package/dist/dts/features/Navigation/TopBar/IconButton.stories.js +40 -0
  56. package/dist/dts/features/Navigation/TopBar/IconButton.stories.js.map +1 -0
  57. package/dist/dts/features/Navigation/TopBar/LoginButton.d.ts +10 -0
  58. package/dist/dts/features/Navigation/TopBar/LoginButton.d.ts.map +1 -0
  59. package/dist/dts/features/Navigation/TopBar/LoginButton.js +80 -0
  60. package/dist/dts/features/Navigation/TopBar/LoginButton.js.map +1 -0
  61. package/dist/dts/features/Navigation/TopBar/TopBar.d.ts +13 -0
  62. package/dist/dts/features/Navigation/TopBar/TopBar.d.ts.map +1 -0
  63. package/dist/dts/features/Navigation/TopBar/TopBar.js +39 -0
  64. package/dist/dts/features/Navigation/TopBar/TopBar.js.map +1 -0
  65. package/dist/dts/features/Navigation/TopBar/TopBar.stories.d.ts +14 -0
  66. package/dist/dts/features/Navigation/TopBar/TopBar.stories.d.ts.map +1 -0
  67. package/dist/dts/features/Navigation/TopBar/TopBar.stories.js +44 -0
  68. package/dist/dts/features/Navigation/TopBar/TopBar.stories.js.map +1 -0
  69. package/dist/dts/features/Navigation/Vertical/VerticalTopBar.d.ts +1 -1
  70. package/dist/dts/features/Navigation/Vertical/VerticalTopBar.d.ts.map +1 -1
  71. package/dist/dts/features/Navigation/index.d.ts +1 -1
  72. package/dist/dts/features/Navigation/index.d.ts.map +1 -1
  73. package/dist/dts/features/Navigation/types.d.ts +8 -1
  74. package/dist/dts/features/Navigation/types.d.ts.map +1 -1
  75. package/dist/dts/index.d.ts +1 -1
  76. package/dist/dts/index.d.ts.map +1 -1
  77. package/dist/dts/index.js +1 -1
  78. package/dist/dts/index.js.map +1 -1
  79. package/dist/dts/pages/Analysis/Analysis.d.ts +1 -1
  80. package/dist/dts/pages/Analysis/Analysis.d.ts.map +1 -1
  81. package/dist/dts/pages/Analysis/Analysis.js +7 -4
  82. package/dist/dts/pages/Analysis/Analysis.js.map +1 -1
  83. package/dist/dts/pages/Analysis/data.d.ts.map +1 -1
  84. package/dist/dts/pages/Analysis/data.js +2 -2
  85. package/dist/dts/pages/Analysis/data.js.map +1 -1
  86. package/dist/dts/pages/Analysis/types.d.ts +4 -2
  87. package/dist/dts/pages/Analysis/types.d.ts.map +1 -1
  88. package/dist/esm/index.js +394 -177
  89. package/dist/esm/index.js.map +1 -1
  90. package/dist/index.d.ts +54 -16
  91. package/dist/tsconfig.tsbuildinfo +1 -1
  92. package/package.json +4 -4
package/dist/cjs/index.js CHANGED
@@ -1012,13 +1012,13 @@ var LoginButtonVisibility = /*#__PURE__*/ function(LoginButtonVisibility) {
1012
1012
  };
1013
1013
  const mergeTailwindClassnameWithDefault = (userValues, defaultValues)=>userValues ? tailwindMerge.twMerge(defaultValues, userValues) : defaultValues;
1014
1014
 
1015
- const handleSelected = async (isAuthenticated, router, referrer, endSession, externalLoginUrl)=>{
1015
+ const handleSelected$1 = async (isAuthenticated, router, referrer, endSession, externalLoginUrl)=>{
1016
1016
  if (!isAuthenticated) await router.push(externalLoginUrl || `Login?redirect=${referrer}`);
1017
1017
  else {
1018
1018
  if (endSession) endSession();
1019
1019
  }
1020
1020
  };
1021
- const LoginButton = ({ icon = /*#__PURE__*/ jsxRuntime.jsx(md.MdLogin, {
1021
+ const LoginButton$1 = ({ icon = /*#__PURE__*/ jsxRuntime.jsx(md.MdLogin, {
1022
1022
  className: "pl-1",
1023
1023
  size: '1.55rem'
1024
1024
  }), hideText = false, className = undefined, tooltip, visibility, externalLoginUrl })=>{
@@ -1040,7 +1040,7 @@ const LoginButton = ({ icon = /*#__PURE__*/ jsxRuntime.jsx(md.MdLogin, {
1040
1040
  disabled: tooltip === undefined,
1041
1041
  classNames: TooltipStyle,
1042
1042
  children: /*#__PURE__*/ jsxRuntime.jsx(core$1.UnstyledButton, {
1043
- onClick: ()=>handleSelected(authenticated, router$1, pathname, endSession, externalLoginUrl),
1043
+ onClick: ()=>handleSelected$1(authenticated, router$1, pathname, endSession, externalLoginUrl),
1044
1044
  children: /*#__PURE__*/ jsxRuntime.jsxs("div", {
1045
1045
  className: mergedClassname,
1046
1046
  children: [
@@ -3057,27 +3057,6 @@ const Gen3Link = ({ className, href, linkType, text, showExternalIcon = false })
3057
3057
  });
3058
3058
  };
3059
3059
 
3060
- const LoginAccountButton = ({ className = undefined })=>{
3061
- const router$1 = router.useRouter();
3062
- const handleSelected = async ()=>{
3063
- await router$1.push('Profile');
3064
- };
3065
- const userStatus = core.useCoreSelector((state)=>core.selectUserAuthStatus(state));
3066
- const userInfo = core.useCoreSelector((state)=>core.selectUserDetails(state));
3067
- const mergedClassname = mergeTailwindClassnameWithDefault(className, 'flex flex-nowrap items-center align-middle border-b-2 hover:border-accent border-transparent');
3068
- if (userStatus && core.isAuthenticated(userStatus)) {
3069
- return /*#__PURE__*/ jsxRuntime.jsx(core$1.UnstyledButton, {
3070
- className: "mx-2",
3071
- onClick: ()=>handleSelected(),
3072
- children: /*#__PURE__*/ jsxRuntime.jsx("div", {
3073
- className: mergedClassname,
3074
- children: userInfo?.username
3075
- })
3076
- });
3077
- }
3078
- return null;
3079
- };
3080
-
3081
3060
  const IconSize = {
3082
3061
  xs: 14,
3083
3062
  sm: 16,
@@ -3087,7 +3066,7 @@ const IconSize = {
3087
3066
  'xl-2': 36
3088
3067
  };
3089
3068
 
3090
- const TopIconButton = ({ name, leftIcon = undefined, rightIcon = undefined, iconSize = 'md', classNames = {}, drawBorder = true })=>{
3069
+ const IconButton = ({ name, leftIcon = undefined, rightIcon = undefined, iconSize = 'md', tooltip = undefined, classNames = {}, clickHandler = undefined, ariaLabel = undefined })=>{
3091
3070
  const classNamesDefaults = {
3092
3071
  root: `flex items-center align-middle px-2 my-2`,
3093
3072
  button: 'flex flex-nowrap items-center align-middle border-b-2 hover:border-accent border-transparent',
@@ -3100,53 +3079,111 @@ const TopIconButton = ({ name, leftIcon = undefined, rightIcon = undefined, icon
3100
3079
  const iconSz = IconSize[iconSize] ?? iconSize;
3101
3080
  return /*#__PURE__*/ jsxRuntime.jsx("div", {
3102
3081
  className: extractClassName('root', mergedClassnames),
3103
- "aria-label": name,
3104
- children: /*#__PURE__*/ jsxRuntime.jsxs("div", {
3105
- className: extractClassName('button', mergedClassnames),
3106
- role: "button",
3107
- children: [
3108
- leftIcon ? /*#__PURE__*/ jsxRuntime.jsx(react.Icon, {
3109
- icon: leftIcon,
3110
- width: iconSz,
3111
- height: iconSz,
3112
- className: extractClassName('leftIcon', mergedClassnames)
3113
- }) : null,
3114
- /*#__PURE__*/ jsxRuntime.jsxs("p", {
3115
- className: extractClassName('label', mergedClassnames),
3116
- children: [
3117
- " ",
3118
- name,
3119
- " "
3120
- ]
3121
- }),
3122
- rightIcon && rightIcon.length > 0 ? /*#__PURE__*/ jsxRuntime.jsx(react.Icon, {
3123
- width: iconSz,
3124
- height: iconSz,
3125
- icon: rightIcon,
3126
- className: extractClassName('rightIcon', mergedClassnames)
3127
- }) : null
3128
- ]
3082
+ children: /*#__PURE__*/ jsxRuntime.jsx(core$1.Tooltip, {
3083
+ label: tooltip,
3084
+ position: "bottom",
3085
+ withArrow: true,
3086
+ multiline: true,
3087
+ color: "base",
3088
+ disabled: tooltip === undefined,
3089
+ classNames: TooltipStyle,
3090
+ children: /*#__PURE__*/ jsxRuntime.jsxs("div", {
3091
+ className: extractClassName('button', mergedClassnames),
3092
+ role: "button",
3093
+ "aria-label": ariaLabel ?? name,
3094
+ onClick: (event)=>clickHandler && clickHandler(),
3095
+ children: [
3096
+ leftIcon ? /*#__PURE__*/ jsxRuntime.jsx(react.Icon, {
3097
+ icon: leftIcon,
3098
+ width: iconSz,
3099
+ height: iconSz,
3100
+ className: extractClassName('leftIcon', mergedClassnames)
3101
+ }) : null,
3102
+ /*#__PURE__*/ jsxRuntime.jsx("p", {
3103
+ className: extractClassName('label', mergedClassnames),
3104
+ children: name
3105
+ }),
3106
+ rightIcon && rightIcon.length > 0 ? /*#__PURE__*/ jsxRuntime.jsx(react.Icon, {
3107
+ width: iconSz,
3108
+ height: iconSz,
3109
+ icon: rightIcon,
3110
+ className: extractClassName('rightIcon', mergedClassnames)
3111
+ }) : null
3112
+ ]
3113
+ })
3129
3114
  })
3130
3115
  });
3131
3116
  };
3132
- const processTopBarItems = (items, showLogin, classNames, dividerClassname)=>{
3117
+
3118
+ const AccountButton = ({ leftIcon = undefined, rightIcon = undefined, iconSize = 'md', classNames = {}, tooltip = 'See account profile' })=>{
3119
+ const classNamesDefaults = {
3120
+ root: `flex items-center align-middle px-2 my-2`,
3121
+ button: 'flex flex-nowrap items-center align-middle border-b-2 hover:border-accent border-transparent',
3122
+ leftIcon: 'text-secondary-contrast-lighter pr-1',
3123
+ label: 'font-content text-secondary-contrast-lighter block',
3124
+ rightIcon: 'text-secondary-contrast-lighter pl-1'
3125
+ };
3126
+ const mergedClassnames = mergeDefaultTailwindClassnames(classNamesDefaults, classNames);
3127
+ const router$1 = router.useRouter();
3128
+ const handleSelected = async ()=>{
3129
+ await router$1.push('Profile');
3130
+ };
3131
+ const userInfo = core.useCoreSelector((state)=>core.selectUserDetails(state));
3132
+ const userStatus = core.useCoreSelector((state)=>core.selectUserAuthStatus(state));
3133
+ const authenticated = core.isAuthenticated(userStatus);
3134
+ if (!authenticated) return null;
3135
+ return /*#__PURE__*/ jsxRuntime.jsx(IconButton, {
3136
+ name: userInfo?.username ?? 'Profile',
3137
+ leftIcon: leftIcon,
3138
+ rightIcon: rightIcon,
3139
+ iconSize: iconSize,
3140
+ classNames: mergedClassnames,
3141
+ clickHandler: handleSelected,
3142
+ tooltip: tooltip
3143
+ });
3144
+ };
3145
+
3146
+ const handleSelected = async (isAuthenticated, router, referrer, endSession, externalLoginUrl)=>{
3147
+ if (!isAuthenticated) await router.push(externalLoginUrl || `Login?redirect=${referrer}`);
3148
+ else {
3149
+ if (endSession) endSession();
3150
+ }
3151
+ };
3152
+ const LoginButton = ({ name = 'login', leftIcon = undefined, rightIcon = undefined, tooltip = 'Login to your account', visibility, externalLoginUrl, iconSize = 'md', classNames = {} })=>{
3153
+ const router$1 = router.useRouter();
3154
+ const pathname = navigation.usePathname();
3155
+ const { endSession } = React.useContext(SessionContext) ?? {
3156
+ endSession: undefined
3157
+ };
3158
+ const userStatus = core.useCoreSelector((state)=>core.selectUserAuthStatus(state));
3159
+ const authenticated = core.isAuthenticated(userStatus);
3160
+ if (visibility === LoginButtonVisibility.LogoutOnly && !authenticated) return null;
3161
+ return /*#__PURE__*/ jsxRuntime.jsx(IconButton, {
3162
+ name: authenticated ? 'Logout' : 'Login',
3163
+ leftIcon: leftIcon,
3164
+ rightIcon: authenticated ? 'gen3:logout' : 'gen3:login',
3165
+ iconSize: iconSize,
3166
+ classNames: classNames,
3167
+ clickHandler: ()=>handleSelected(authenticated, router$1, pathname, endSession, externalLoginUrl)
3168
+ });
3169
+ };
3170
+
3171
+ const processTopBarItems = (items, classNames, dividerClassname)=>{
3133
3172
  return items.reduce((acc, item, index)=>{
3134
- const needsBorder = !(index === items.length - 1 && !showLogin);
3135
3173
  const mergedClassnames = item?.classNames ? mergeDefaultTailwindClassnames(classNames, item.classNames) : classNames;
3136
- acc.push(/*#__PURE__*/ jsxRuntime.jsxs("a", {
3137
- className: "flex",
3138
- href: item.href,
3174
+ acc.push(/*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
3139
3175
  children: [
3140
- ' ',
3141
- /*#__PURE__*/ jsxRuntime.jsx(TopIconButton, {
3142
- name: item.name,
3143
- iconSize: item.iconSize,
3144
- leftIcon: item.leftIcon,
3145
- rightIcon: item.rightIcon,
3146
- classNames: mergedClassnames,
3147
- drawBorder: needsBorder
3148
- }),
3149
- ' ',
3176
+ /*#__PURE__*/ jsxRuntime.jsx("a", {
3177
+ className: "flex",
3178
+ href: item.href,
3179
+ children: /*#__PURE__*/ jsxRuntime.jsx(IconButton, {
3180
+ name: item.name,
3181
+ iconSize: item.iconSize,
3182
+ leftIcon: item.leftIcon,
3183
+ rightIcon: item.rightIcon,
3184
+ classNames: mergedClassnames
3185
+ })
3186
+ }, `${item.href}_${item.name}`),
3150
3187
  /*#__PURE__*/ jsxRuntime.jsx(core$1.Divider, {
3151
3188
  size: "md",
3152
3189
  orientation: "vertical",
@@ -3155,7 +3192,7 @@ const processTopBarItems = (items, showLogin, classNames, dividerClassname)=>{
3155
3192
  }
3156
3193
  })
3157
3194
  ]
3158
- }, `${item.href}_${item.name}`));
3195
+ }));
3159
3196
  return acc;
3160
3197
  }, []);
3161
3198
  };
@@ -3182,29 +3219,30 @@ const TopBar = ({ items, loginButtonVisibility = LoginButtonVisibility.Hidden, e
3182
3219
  "aria-label": "top most navigation",
3183
3220
  className: "flex items-center align-middle",
3184
3221
  children: [
3185
- processTopBarItems(items, loginButtonVisibility === LoginButtonVisibility.Visible, mergedItemClassnames, extractClassName('divider', mergedClassnames)),
3186
- loginButtonVisibility != LoginButtonVisibility.Hidden ? /*#__PURE__*/ jsxRuntime.jsxs("div", {
3187
- className: "flex items-center",
3222
+ processTopBarItems(items, mergedItemClassnames, extractClassName('divider', mergedClassnames)),
3223
+ loginButtonVisibility != LoginButtonVisibility.Hidden ? /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
3188
3224
  children: [
3189
- /*#__PURE__*/ jsxRuntime.jsx(LoginAccountButton, {
3190
- className: extractClassName('login', mergedClassnames)
3225
+ /*#__PURE__*/ jsxRuntime.jsxs("span", {
3226
+ className: "flex items-center align-middle [&>*:only-child]:hidden",
3227
+ children: [
3228
+ /*#__PURE__*/ jsxRuntime.jsx(AccountButton, {
3229
+ classNames: mergedItemClassnames
3230
+ }),
3231
+ /*#__PURE__*/ jsxRuntime.jsx(core$1.Divider, {
3232
+ size: "md",
3233
+ classNames: {
3234
+ root: extractClassName('divider', mergedClassnames)
3235
+ },
3236
+ orientation: "vertical"
3237
+ })
3238
+ ]
3191
3239
  }),
3192
- /*#__PURE__*/ jsxRuntime.jsx(core$1.Divider, {
3193
- size: "md",
3194
- classNames: {
3195
- root: extractClassName('divider', mergedClassnames)
3196
- },
3197
- orientation: "vertical"
3240
+ /*#__PURE__*/ jsxRuntime.jsx(LoginButton, {
3241
+ visibility: loginButtonVisibility,
3242
+ externalLoginUrl: externalLoginUrl,
3243
+ classNames: mergedItemClassnames
3198
3244
  })
3199
3245
  ]
3200
- }) : null,
3201
- loginButtonVisibility != LoginButtonVisibility.Hidden ? /*#__PURE__*/ jsxRuntime.jsx("div", {
3202
- className: "flex items-center",
3203
- children: /*#__PURE__*/ jsxRuntime.jsx(LoginButton, {
3204
- visibility: loginButtonVisibility,
3205
- externalLoginUrl: externalLoginUrl,
3206
- className: extractClassName('login', mergedClassnames)
3207
- })
3208
3246
  }) : null
3209
3247
  ]
3210
3248
  })
@@ -3538,7 +3576,7 @@ const HorizontalNavigationBar = ({ actions, items, logo = undefined, loginIcon =
3538
3576
  /*#__PURE__*/ jsxRuntime.jsxs("div", {
3539
3577
  className: "flex items-center align-middle mr-3",
3540
3578
  children: [
3541
- actions.loginButtonVisibility === LoginButtonVisibility.Visible ? /*#__PURE__*/ jsxRuntime.jsx(LoginButton, {
3579
+ actions.loginButtonVisibility === LoginButtonVisibility.Visible ? /*#__PURE__*/ jsxRuntime.jsx(LoginButton$1, {
3542
3580
  icon: loginIcon,
3543
3581
  hideText: true,
3544
3582
  className: `${extractClassName('login', mergedClassnames)}`,
@@ -11916,18 +11954,35 @@ const Workspace = ({ config })=>{
11916
11954
 
11917
11955
  const TextDescription = ({ description })=>{
11918
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
11919
11971
  return /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
11920
11972
  children: [
11921
11973
  !extend ? /*#__PURE__*/ jsxRuntime.jsx(core$1.Text, {
11974
+ ref: textRef,
11975
+ size: "sm",
11922
11976
  lineClamp: 4,
11923
11977
  children: description
11924
11978
  }) : /*#__PURE__*/ jsxRuntime.jsx(core$1.Text, {
11979
+ size: "sm",
11925
11980
  children: description
11926
11981
  }),
11927
- /*#__PURE__*/ jsxRuntime.jsx("button", {
11982
+ isClamped && /*#__PURE__*/ jsxRuntime.jsx("button", {
11928
11983
  onClick: ()=>setExtend((extend)=>!extend),
11929
11984
  children: /*#__PURE__*/ jsxRuntime.jsxs("div", {
11930
- className: "flex text-xs font-semibold text-gray-400",
11985
+ className: "flex text-xs font-semibold text-base-contrast-light",
11931
11986
  children: [
11932
11987
  !extend ? 'Extend Text' : 'Collapse Text',
11933
11988
  ' ',
@@ -11942,6 +11997,90 @@ const TextDescription = ({ description })=>{
11942
11997
  });
11943
11998
  };
11944
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
+
11945
12084
  const AnalysisCenter = ({ tools, showFilterAndSort = false })=>{
11946
12085
  const [cards, setCards] = React.useState({
11947
12086
  type: '',
@@ -12011,91 +12150,158 @@ const AnalysisCenter = ({ tools, showFilterAndSort = false })=>{
12011
12150
  children: /*#__PURE__*/ jsxRuntime.jsx("div", {
12012
12151
  className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6 p-1 mx-4 overflow-y-scroll",
12013
12152
  children: tools.map(({ title, description, type, icon, image, hasDemo, loginRequired, href }, key)=>{
12014
- return /*#__PURE__*/ jsxRuntime.jsx(core$1.Stack, {
12015
- children: /*#__PURE__*/ jsxRuntime.jsxs("div", {
12016
- 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",
12017
12212
  children: [
12018
- /*#__PURE__*/ jsxRuntime.jsx("div", {
12019
- className: "p-0 rounded-sm",
12020
- children: /*#__PURE__*/ jsxRuntime.jsx(core$1.Image, {
12021
- component: Image,
12022
- src: `${image}`,
12023
- alt: `${title} image`,
12024
- height: 1000,
12025
- width: 1000,
12026
- radius: "md"
12027
- })
12028
- }),
12029
- /*#__PURE__*/ jsxRuntime.jsxs("div", {
12030
- className: "flex -mt-5 relative z-10",
12031
- children: [
12032
- /*#__PURE__*/ jsxRuntime.jsx("div", {
12033
- className: "p-0.5 rounded-sm bg-base-lightest ml-5 border-2 border-base",
12034
- children: /*#__PURE__*/ jsxRuntime.jsx(core$1.Image, {
12035
- component: Image,
12036
- src: `${icon}`,
12037
- alt: `${title} logo`,
12038
- width: 40,
12039
- height: 40,
12040
- radius: "lg"
12041
- })
12042
- }),
12043
- /*#__PURE__*/ jsxRuntime.jsx("div", {
12044
- className: "relative mb-0 ml-2",
12045
- children: /*#__PURE__*/ jsxRuntime.jsx("span", {
12046
- className: "absolute bottom-0 left-0 text-xs text-gray-700 w-max",
12047
- children: type === 'application' ? 'Application' : 'Jupyter Notebook'
12048
- })
12049
- })
12050
- ]
12051
- }),
12052
- /*#__PURE__*/ jsxRuntime.jsxs("div", {
12053
- className: "flex flex-col mt-2 ml-2",
12054
- children: [
12055
- /*#__PURE__*/ jsxRuntime.jsx("div", {
12056
- className: "text-sm font-black h-6",
12057
- children: title
12058
- }),
12059
- /*#__PURE__*/ jsxRuntime.jsx("div", {
12060
- className: "text-xs text-gray-400 h-6",
12061
- children: loginRequired ? 'Login Required' : ' '
12062
- }),
12063
- /*#__PURE__*/ jsxRuntime.jsx("div", {
12064
- className: "text-sm p-2 h-fit",
12065
- children: /*#__PURE__*/ jsxRuntime.jsx(TextDescription, {
12066
- description: description
12067
- })
12068
- }),
12069
- /*#__PURE__*/ jsxRuntime.jsx("div", {
12070
- className: "flex mb-4 rounded-b-md",
12071
- children: /*#__PURE__*/ jsxRuntime.jsxs("div", {
12072
- className: "m-auto",
12073
- children: [
12074
- /*#__PURE__*/ jsxRuntime.jsx(core$1.NavLink, {
12075
- component: Link,
12076
- href: href ?? '_blank',
12077
- classNames: {
12078
- root: 'bg-accent text-accent-contrast hover:bg-accent-darker p-2 rounded-sm',
12079
- label: 'text-sm font-semibold'
12080
- },
12081
- label: `Run ${type === 'application' ? 'App' : 'Notebook'}`
12082
- }),
12083
- hasDemo && /*#__PURE__*/ jsxRuntime.jsx("button", {
12084
- className: "ml-2 p-1.5 rounded-sm text-sm font-semibold",
12085
- children: "Demo"
12086
- })
12087
- ]
12088
- })
12089
- })
12090
- ]
12091
- })
12213
+ count?.toLocaleString(),
12214
+ " ",
12215
+ countUnits
12092
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
+ })
12093
12223
  })
12094
- }, 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
+ ]
12095
12242
  })
12096
- })
12243
+ ]
12097
12244
  })
12098
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
12099
12305
  });
12100
12306
  };
12101
12307
 
@@ -17621,8 +17827,8 @@ const AnalysisPanel = ({ tools })=>{
17621
17827
  });
17622
17828
  };
17623
17829
 
17624
- const AnalysisPage = ({ headerProps, footerProps, tools })=>{
17625
- return /*#__PURE__*/ jsxRuntime.jsx(NavPageLayout, {
17830
+ const AnalysisPage = ({ headerProps, footerProps, tools, sections, classNames })=>{
17831
+ return /*#__PURE__*/ jsxRuntime.jsxs(NavPageLayout, {
17626
17832
  headerProps,
17627
17833
  footerProps,
17628
17834
  headerData: {
@@ -17630,9 +17836,21 @@ const AnalysisPage = ({ headerProps, footerProps, tools })=>{
17630
17836
  content: 'Analysis Center',
17631
17837
  key: 'gen3-analysis-center'
17632
17838
  },
17633
- children: /*#__PURE__*/ jsxRuntime.jsx(AnalysisPanel, {
17634
- tools: tools
17635
- })
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
+ ]
17636
17854
  });
17637
17855
  };
17638
17856
 
@@ -17646,11 +17864,10 @@ const AnalysisPageGetServerSideProps = async ()=>{
17646
17864
  }
17647
17865
  };
17648
17866
  } catch (err) {
17649
- console.error(err);
17867
+ console.warn(err);
17650
17868
  return {
17651
17869
  props: {
17652
- ...await getNavPageLayoutPropsFromConfig(),
17653
- tools: []
17870
+ ...await getNavPageLayoutPropsFromConfig()
17654
17871
  }
17655
17872
  };
17656
17873
  }
@@ -20818,6 +21035,7 @@ exports.AdminAuthZPageGetServerSideProps = AdminAuthZPageGetServerSideProps;
20818
21035
  exports.AiSearch = AiSearch;
20819
21036
  exports.AiSearchPage = AISearchPage;
20820
21037
  exports.AnalysisCenter = AnalysisCenter;
21038
+ exports.AnalysisCenterWithSections = AnalysisCenterWithSections;
20821
21039
  exports.AnalysisEditorPage = AnalysisEditorPage;
20822
21040
  exports.AnalysisEditorPageGetServerSideProps = AnalysisEditorPageGetServerSideProps;
20823
21041
  exports.AnalysisPage = AnalysisPage;
@@ -20864,7 +21082,7 @@ exports.Header = Header;
20864
21082
  exports.HoverLink = HoverLink;
20865
21083
  exports.LandingPage = LandingPage;
20866
21084
  exports.LandingPageGetStaticProps = LandingPageGetStaticProps;
20867
- exports.LoginButton = LoginButton;
21085
+ exports.LoginButton = LoginButton$1;
20868
21086
  exports.LoginPage = LoginPage;
20869
21087
  exports.LoginPageGetServerSideProps = LoginPageGetServerSideProps;
20870
21088
  exports.LoginPanel = LoginPanel;