@jbrowse/app-core 2.6.2 → 2.6.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.
@@ -23,18 +23,21 @@ function HistoryManagementMixin() {
23
23
  .actions(self => ({
24
24
  afterCreate() {
25
25
  document.addEventListener('keydown', e => {
26
+ var _a, _b;
26
27
  if (self.history.canRedo &&
27
28
  // ctrl+shift+z or cmd+shift+z
28
29
  (((e.ctrlKey || e.metaKey) && e.shiftKey && e.code === 'KeyZ') ||
29
30
  // ctrl+y
30
- (e.ctrlKey && !e.shiftKey && e.code === 'KeyY'))) {
31
+ (e.ctrlKey && !e.shiftKey && e.code === 'KeyY')) &&
32
+ ((_a = document.activeElement) === null || _a === void 0 ? void 0 : _a.tagName.toUpperCase()) !== 'INPUT') {
31
33
  self.history.redo();
32
34
  }
33
35
  if (self.history.canUndo &&
34
36
  // ctrl+z or cmd+z
35
37
  (e.ctrlKey || e.metaKey) &&
36
38
  !e.shiftKey &&
37
- e.code === 'KeyZ') {
39
+ e.code === 'KeyZ' &&
40
+ ((_b = document.activeElement) === null || _b === void 0 ? void 0 : _b.tagName.toUpperCase()) !== 'INPUT') {
38
41
  self.history.undo();
39
42
  }
40
43
  });
@@ -17,9 +17,7 @@ export declare function JBrowseConfigF({ pluginManager, assemblyConfigSchema, }:
17
17
  rpc: import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaType<{
18
18
  defaultDriver: {
19
19
  type: string;
20
- description: string; /**
21
- * #slot configuration.formatDetails.feature
22
- */
20
+ description: string;
23
21
  defaultValue: string;
24
22
  };
25
23
  drivers: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").IMapType<import("mobx-state-tree").ITypeUnion<import("mobx-state-tree").ModelCreationType<import("mobx-state-tree/dist/internal").ExtractCFromProps<Record<string, any>>> | undefined, import("mobx-state-tree").ModelSnapshotType<Record<string, any>>, (Partial<import("mobx-state-tree/dist/internal").ExtractCFromProps<Record<string, any>>> & import("mobx-state-tree/dist/internal").NonEmptyObject) | undefined>>, [undefined]>;
@@ -32,27 +30,18 @@ export declare function JBrowseConfigF({ pluginManager, assemblyConfigSchema, }:
32
30
  defaultValue: number;
33
31
  };
34
32
  formatDetails: import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaType<{
35
- /**
36
- * #slot configuration.formatDetails.feature
37
- */
38
33
  feature: {
39
34
  type: string;
40
35
  description: string;
41
36
  defaultValue: {};
42
37
  contextVariable: string[];
43
38
  };
44
- /**
45
- * #slot configuration.formatDetails.subfeatures
46
- */
47
39
  subfeatures: {
48
40
  type: string;
49
41
  description: string;
50
42
  defaultValue: {};
51
43
  contextVariable: string[];
52
44
  };
53
- /**
54
- * #slot configuration.formatDetails.depth
55
- */
56
45
  depth: {
57
46
  type: string;
58
47
  defaultValue: number;
@@ -60,18 +49,12 @@ export declare function JBrowseConfigF({ pluginManager, assemblyConfigSchema, }:
60
49
  };
61
50
  }, import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaOptions<undefined, undefined>>;
62
51
  formatAbout: import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaType<{
63
- /**
64
- * #slot configuration.formatAbout.config
65
- */
66
52
  config: {
67
53
  type: string;
68
54
  description: string;
69
55
  defaultValue: {};
70
56
  contextVariable: string[];
71
57
  };
72
- /**
73
- * #slot configuration.formatAbout.hideUris
74
- */
75
58
  hideUris: {
76
59
  type: string;
77
60
  defaultValue: boolean;
@@ -88,6 +71,34 @@ export declare function JBrowseConfigF({ pluginManager, assemblyConfigSchema, }:
88
71
  type: string;
89
72
  defaultValue: boolean;
90
73
  };
74
+ hierarchical: import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaType<{
75
+ sort: import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaType<{
76
+ trackNames: {
77
+ type: string;
78
+ defaultValue: boolean;
79
+ };
80
+ categories: {
81
+ type: string;
82
+ defaultValue: boolean;
83
+ };
84
+ }, import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaOptions<undefined, undefined>>;
85
+ defaultCollapsed: import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaType<{
86
+ categoryNames: {
87
+ type: string;
88
+ defaultValue: never[]; /**
89
+ * #slot configuration.highResolutionScaling
90
+ */
91
+ };
92
+ topLevelCategories: {
93
+ type: string;
94
+ defaultValue: boolean;
95
+ };
96
+ subCategories: {
97
+ type: string;
98
+ defaultValue: boolean;
99
+ };
100
+ }, import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaOptions<undefined, undefined>>;
101
+ }, import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaOptions<undefined, undefined>>;
91
102
  /**
92
103
  * #slot configuration.theme
93
104
  */
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.JBrowseConfigF = void 0;
7
7
  const configuration_1 = require("@jbrowse/core/configuration");
8
8
  const RpcManager_1 = __importDefault(require("@jbrowse/core/rpc/RpcManager"));
9
+ const product_core_1 = require("@jbrowse/product-core");
9
10
  const mobx_state_tree_1 = require("mobx-state-tree");
10
11
  /**
11
12
  * #config JBrowseRootConfig
@@ -26,52 +27,8 @@ function JBrowseConfigF({ pluginManager, assemblyConfigSchema, }) {
26
27
  type: 'number',
27
28
  defaultValue: 2,
28
29
  },
29
- formatDetails: (0, configuration_1.ConfigurationSchema)('FormatDetails', {
30
- /**
31
- * #slot configuration.formatDetails.feature
32
- */
33
- feature: {
34
- type: 'frozen',
35
- description: 'adds extra fields to the feature details',
36
- defaultValue: {},
37
- contextVariable: ['feature'],
38
- },
39
- /**
40
- * #slot configuration.formatDetails.subfeatures
41
- */
42
- subfeatures: {
43
- type: 'frozen',
44
- description: 'adds extra fields to the subfeatures of a feature',
45
- defaultValue: {},
46
- contextVariable: ['feature'],
47
- },
48
- /**
49
- * #slot configuration.formatDetails.depth
50
- */
51
- depth: {
52
- type: 'number',
53
- defaultValue: 2,
54
- description: 'depth to iterate on subfeatures',
55
- },
56
- }),
57
- formatAbout: (0, configuration_1.ConfigurationSchema)('FormatAbout', {
58
- /**
59
- * #slot configuration.formatAbout.config
60
- */
61
- config: {
62
- type: 'frozen',
63
- description: 'formats configuration object in about dialog',
64
- defaultValue: {},
65
- contextVariable: ['config'],
66
- },
67
- /**
68
- * #slot configuration.formatAbout.hideUris
69
- */
70
- hideUris: {
71
- type: 'boolean',
72
- defaultValue: false,
73
- },
74
- }),
30
+ formatDetails: (0, product_core_1.FormatDetailsConfigSchemaFactory)(),
31
+ formatAbout: (0, product_core_1.FormatAboutConfigSchemaFactory)(),
75
32
  /*
76
33
  * #slot configuration.shareURL
77
34
  */
@@ -86,6 +43,7 @@ function JBrowseConfigF({ pluginManager, assemblyConfigSchema, }) {
86
43
  type: 'boolean',
87
44
  defaultValue: false,
88
45
  },
46
+ hierarchical: (0, product_core_1.HierarchicalConfigSchemaFactory)(),
89
47
  /**
90
48
  * #slot configuration.theme
91
49
  */
@@ -96,7 +54,10 @@ function JBrowseConfigF({ pluginManager, assemblyConfigSchema, }) {
96
54
  /**
97
55
  * #slot configuration.extraThemes
98
56
  */
99
- extraThemes: { type: 'frozen', defaultValue: {} },
57
+ extraThemes: {
58
+ type: 'frozen',
59
+ defaultValue: {},
60
+ },
100
61
  /**
101
62
  * #slot configuration.logoPath
102
63
  */
@@ -29,12 +29,16 @@ export declare function JBrowseModelF({ pluginManager, assemblyConfigSchema, }:
29
29
  };
30
30
  subfeatures: {
31
31
  type: string;
32
- description: string;
32
+ description: string; /**
33
+ * #getter
34
+ */
33
35
  defaultValue: {};
34
36
  contextVariable: string[];
35
37
  };
36
38
  depth: {
37
- type: string;
39
+ type: string; /**
40
+ * #getter
41
+ */
38
42
  defaultValue: number;
39
43
  description: string;
40
44
  };
@@ -59,21 +63,46 @@ export declare function JBrowseModelF({ pluginManager, assemblyConfigSchema, }:
59
63
  type: string;
60
64
  defaultValue: boolean;
61
65
  };
66
+ hierarchical: import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaType<{
67
+ sort: import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaType<{
68
+ trackNames: {
69
+ type: string;
70
+ defaultValue: boolean;
71
+ };
72
+ categories: {
73
+ type: string;
74
+ defaultValue: boolean;
75
+ };
76
+ }, import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaOptions<undefined, undefined>>;
77
+ defaultCollapsed: import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaType<{
78
+ categoryNames: {
79
+ type: string;
80
+ defaultValue: never[];
81
+ };
82
+ topLevelCategories: {
83
+ type: string;
84
+ defaultValue: boolean; /**
85
+ * #action
86
+ */
87
+ };
88
+ subCategories: {
89
+ type: string;
90
+ defaultValue: boolean;
91
+ };
92
+ }, import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaOptions<undefined, undefined>>;
93
+ }, import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaOptions<undefined, undefined>>;
62
94
  theme: {
63
95
  type: string;
64
- defaultValue: {}; /**
65
- * #action
66
- */
96
+ defaultValue: {};
67
97
  };
68
98
  extraThemes: {
69
- type: string;
99
+ type: string; /**
100
+ * #action
101
+ */
70
102
  defaultValue: {};
71
103
  };
72
104
  logoPath: {
73
105
  type: string;
74
- /**
75
- * #action
76
- */
77
106
  defaultValue: {
78
107
  uri: string;
79
108
  locationType: string;
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ import { SessionWithDrawerWidgets } from '@jbrowse/core/util/types';
3
+ declare const _default: ({ session, setToolbarHeight, }: {
4
+ session: SessionWithDrawerWidgets;
5
+ setToolbarHeight: (arg: number) => void;
6
+ }) => React.JSX.Element;
7
+ export default _default;
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ const react_1 = __importStar(require("react"));
30
+ const material_1 = require("@mui/material");
31
+ const mui_1 = require("tss-react/mui");
32
+ const mobx_react_1 = require("mobx-react");
33
+ const util_1 = require("@jbrowse/core/util");
34
+ // icons
35
+ const Delete_1 = __importDefault(require("@mui/icons-material/Delete"));
36
+ const Close_1 = __importDefault(require("@mui/icons-material/Close"));
37
+ const Minimize_1 = __importDefault(require("@mui/icons-material/Minimize"));
38
+ const MoreVert_1 = __importDefault(require("@mui/icons-material/MoreVert"));
39
+ const useStyles = (0, mui_1.makeStyles)()(theme => ({
40
+ formControl: {
41
+ margin: 0,
42
+ },
43
+ spacer: {
44
+ flexGrow: 1,
45
+ },
46
+ drawerSelect: {
47
+ margin: 0,
48
+ color: theme.palette.secondary.contrastText,
49
+ },
50
+ dropDownIcon: {
51
+ color: theme.palette.secondary.contrastText,
52
+ },
53
+ header: {
54
+ background: theme.palette.secondary.main,
55
+ },
56
+ }));
57
+ exports.default = (0, mobx_react_1.observer)(function ({ session, setToolbarHeight, }) {
58
+ const { classes } = useStyles();
59
+ return (react_1.default.createElement(material_1.AppBar, { position: "sticky", className: classes.header, ref: ref => setToolbarHeight((ref === null || ref === void 0 ? void 0 : ref.getBoundingClientRect().height) || 0) },
60
+ react_1.default.createElement(material_1.Toolbar, { disableGutters: true },
61
+ react_1.default.createElement(DrawerWidgetSelector, { session: session }),
62
+ react_1.default.createElement("div", { className: classes.spacer }),
63
+ react_1.default.createElement(DrawerControls, { session: session }))));
64
+ });
65
+ const DrawerWidgetSelector = (0, mobx_react_1.observer)(function ({ session, }) {
66
+ const { visibleWidget, activeWidgets } = session;
67
+ const { classes } = useStyles();
68
+ const { pluginManager } = (0, util_1.getEnv)(session);
69
+ return (react_1.default.createElement(material_1.FormControl, { className: classes.formControl },
70
+ react_1.default.createElement(material_1.Select, { value: visibleWidget === null || visibleWidget === void 0 ? void 0 : visibleWidget.id, "data-testid": "widget-drawer-selects", className: classes.drawerSelect, classes: { icon: classes.dropDownIcon }, renderValue: widgetId => {
71
+ const widget = session.activeWidgets.get(widgetId);
72
+ if (!widget) {
73
+ return (react_1.default.createElement(material_1.Typography, { variant: "h6", color: "inherit" }, "Unknown widget"));
74
+ }
75
+ const widgetType = pluginManager.getWidgetType(widget.type);
76
+ const { HeadingComponent, heading } = widgetType;
77
+ return HeadingComponent ? (react_1.default.createElement(HeadingComponent, { model: widget })) : (react_1.default.createElement(material_1.Typography, { variant: "h6", color: "inherit" }, heading));
78
+ }, onChange: e => {
79
+ const w = session.activeWidgets.get(e.target.value);
80
+ if (w) {
81
+ session.showWidget(w);
82
+ }
83
+ else {
84
+ session.notify(`Widget not found ${e.target.value}`, 'warning');
85
+ }
86
+ } }, [...activeWidgets.values()].map(widget => {
87
+ const widgetType = pluginManager.getWidgetType(widget.type);
88
+ const { HeadingComponent, heading } = widgetType;
89
+ return (react_1.default.createElement(material_1.MenuItem, { "data-testid": `widget-drawer-selects-item-${widget.type}`, key: widget.id, value: widget.id },
90
+ HeadingComponent ? (react_1.default.createElement(HeadingComponent, { model: widget })) : (react_1.default.createElement(material_1.Typography, { variant: "h6", color: "inherit" }, heading)),
91
+ react_1.default.createElement(material_1.IconButton, { "data-testid": `${widget.type}-drawer-delete`, color: "inherit", "aria-label": "Delete", onClick: () => session.hideWidget(widget) },
92
+ react_1.default.createElement(Delete_1.default, null))));
93
+ }))));
94
+ });
95
+ const DrawerControls = (0, mobx_react_1.observer)(function ({ session, }) {
96
+ const [anchorEl, setAnchorEl] = (0, react_1.useState)(null);
97
+ const { drawerPosition, visibleWidget } = session;
98
+ return (react_1.default.createElement(react_1.default.Fragment, null,
99
+ react_1.default.createElement(material_1.IconButton, { color: "inherit", onClick: event => setAnchorEl(event.currentTarget) },
100
+ react_1.default.createElement(MoreVert_1.default, null)),
101
+ react_1.default.createElement(material_1.Tooltip, { title: "Minimize drawer" },
102
+ react_1.default.createElement(material_1.IconButton, { "data-testid": "drawer-minimize", color: "inherit", onClick: () => {
103
+ session.notify(`Drawer minimized, click button on ${drawerPosition} side of screen to re-open`, 'info');
104
+ session.minimizeWidgetDrawer();
105
+ } },
106
+ react_1.default.createElement(Minimize_1.default, null))),
107
+ react_1.default.createElement(material_1.Tooltip, { title: "Close drawer" },
108
+ react_1.default.createElement(material_1.IconButton, { color: "inherit", onClick: () => session.hideWidget(visibleWidget) },
109
+ react_1.default.createElement(Close_1.default, null))),
110
+ react_1.default.createElement(material_1.Menu, { anchorEl: anchorEl, open: Boolean(anchorEl), onClose: () => setAnchorEl(null) }, ['left', 'right'].map(option => (react_1.default.createElement(material_1.MenuItem, { key: option, selected: drawerPosition === 'option', onClick: () => {
111
+ session.setDrawerPosition(option);
112
+ setAnchorEl(null);
113
+ } }, option))))));
114
+ });
@@ -28,87 +28,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
29
  const react_1 = __importStar(require("react"));
30
30
  const react_error_boundary_1 = require("react-error-boundary");
31
- const material_1 = require("@mui/material");
32
- const mui_1 = require("tss-react/mui");
33
31
  const mobx_react_1 = require("mobx-react");
34
32
  const util_1 = require("@jbrowse/core/util");
35
33
  const LoadingEllipses_1 = __importDefault(require("@jbrowse/core/ui/LoadingEllipses"));
36
34
  const ErrorMessage_1 = __importDefault(require("@jbrowse/core/ui/ErrorMessage"));
37
- // icons
38
- const Delete_1 = __importDefault(require("@mui/icons-material/Delete"));
39
- const Close_1 = __importDefault(require("@mui/icons-material/Close"));
40
- const Minimize_1 = __importDefault(require("@mui/icons-material/Minimize"));
41
- const MoreVert_1 = __importDefault(require("@mui/icons-material/MoreVert"));
42
35
  // locals
43
36
  const Drawer_1 = __importDefault(require("./Drawer"));
44
- const useStyles = (0, mui_1.makeStyles)()(theme => ({
45
- formControl: {
46
- margin: 0,
47
- },
48
- spacer: {
49
- flexGrow: 1,
50
- },
51
- drawerSelect: {
52
- margin: 0,
53
- color: theme.palette.secondary.contrastText,
54
- },
55
- dropDownIcon: {
56
- color: theme.palette.secondary.contrastText,
57
- },
58
- header: {
59
- background: theme.palette.secondary.main,
60
- },
61
- }));
62
- const DrawerHeader = (0, mobx_react_1.observer)(function ({ session, setToolbarHeight, }) {
63
- const { pluginManager } = (0, util_1.getEnv)(session);
64
- const { visibleWidget, activeWidgets, drawerPosition } = session;
65
- const { classes } = useStyles();
66
- const [anchorEl, setAnchorEl] = (0, react_1.useState)(null);
67
- return (react_1.default.createElement(material_1.AppBar, { position: "sticky", className: classes.header, ref: ref => setToolbarHeight((ref === null || ref === void 0 ? void 0 : ref.getBoundingClientRect().height) || 0) },
68
- react_1.default.createElement(material_1.Toolbar, { disableGutters: true },
69
- react_1.default.createElement(material_1.FormControl, { className: classes.formControl },
70
- react_1.default.createElement(material_1.Select, { value: visibleWidget === null || visibleWidget === void 0 ? void 0 : visibleWidget.id, "data-testid": "widget-drawer-selects", className: classes.drawerSelect, classes: { icon: classes.dropDownIcon }, renderValue: widgetId => {
71
- const widget = session.activeWidgets.get(widgetId);
72
- if (!widget) {
73
- return (react_1.default.createElement(material_1.Typography, { variant: "h6", color: "inherit" }, "Unknown widget"));
74
- }
75
- const widgetType = pluginManager.getWidgetType(widget.type);
76
- const { HeadingComponent, heading } = widgetType;
77
- return HeadingComponent ? (react_1.default.createElement(HeadingComponent, { model: widget })) : (react_1.default.createElement(material_1.Typography, { variant: "h6", color: "inherit" }, heading));
78
- }, onChange: e => {
79
- const w = session.activeWidgets.get(e.target.value);
80
- if (w) {
81
- session.showWidget(w);
82
- }
83
- else {
84
- session.notify(`Widget not found ${e.target.value}`, 'warning');
85
- }
86
- } }, [...activeWidgets.values()].map(widget => {
87
- const widgetType = pluginManager.getWidgetType(widget.type);
88
- const { HeadingComponent, heading } = widgetType;
89
- return (react_1.default.createElement(material_1.MenuItem, { "data-testid": `widget-drawer-selects-item-${widget.type}`, key: widget.id, value: widget.id },
90
- HeadingComponent ? (react_1.default.createElement(HeadingComponent, { model: widget })) : (react_1.default.createElement(material_1.Typography, { variant: "h6", color: "inherit" }, heading)),
91
- react_1.default.createElement(material_1.IconButton, { "data-testid": `${widget.type}-drawer-delete`, color: "inherit", "aria-label": "Delete", onClick: () => session.hideWidget(widget) },
92
- react_1.default.createElement(Delete_1.default, null))));
93
- }))),
94
- react_1.default.createElement("div", { className: classes.spacer }),
95
- react_1.default.createElement("div", null,
96
- react_1.default.createElement(material_1.IconButton, { "data-testid": "drawer-close", color: "inherit", onClick: event => setAnchorEl(event.currentTarget) },
97
- react_1.default.createElement(MoreVert_1.default, null)),
98
- react_1.default.createElement(material_1.Tooltip, { title: "Minimize drawer" },
99
- react_1.default.createElement(material_1.IconButton, { "data-testid": "drawer-minimize", color: "inherit", onClick: () => {
100
- session.notify(`Drawer minimized, click button on ${drawerPosition} side of screen to re-open`, 'info');
101
- session.minimizeWidgetDrawer();
102
- } },
103
- react_1.default.createElement(Minimize_1.default, null))),
104
- react_1.default.createElement(material_1.Tooltip, { title: "Close drawer" },
105
- react_1.default.createElement(material_1.IconButton, { "data-testid": "drawer-close", color: "inherit", onClick: () => session.hideWidget(visibleWidget) },
106
- react_1.default.createElement(Close_1.default, null))))),
107
- react_1.default.createElement(material_1.Menu, { anchorEl: anchorEl, open: Boolean(anchorEl), onClose: () => setAnchorEl(null) }, ['left', 'right'].map(option => (react_1.default.createElement(material_1.MenuItem, { key: option, selected: drawerPosition === 'option', onClick: () => {
108
- session.setDrawerPosition(option);
109
- setAnchorEl(null);
110
- } }, option))))));
111
- });
37
+ const DrawerHeader_1 = __importDefault(require("./DrawerHeader"));
112
38
  const DrawerWidget = (0, mobx_react_1.observer)(function ({ session, }) {
113
39
  const { visibleWidget } = session;
114
40
  const { pluginManager } = (0, util_1.getEnv)(session);
@@ -123,7 +49,7 @@ const DrawerWidget = (0, mobx_react_1.observer)(function ({ session, }) {
123
49
  // (the position static/sticky is included in AutoSizer estimates)
124
50
  const [toolbarHeight, setToolbarHeight] = (0, react_1.useState)(0);
125
51
  return (react_1.default.createElement(Drawer_1.default, { session: session },
126
- react_1.default.createElement(DrawerHeader, { session: session, setToolbarHeight: setToolbarHeight }),
52
+ react_1.default.createElement(DrawerHeader_1.default, { session: session, setToolbarHeight: setToolbarHeight }),
127
53
  react_1.default.createElement(react_1.Suspense, { fallback: react_1.default.createElement(LoadingEllipses_1.default, null) },
128
54
  react_1.default.createElement(react_error_boundary_1.ErrorBoundary, { FallbackComponent: ({ error }) => react_1.default.createElement(ErrorMessage_1.default, { error: error }) }, DrawerComponent ? (react_1.default.createElement(react_1.default.Fragment, null,
129
55
  react_1.default.createElement(DrawerComponent, { model: visibleWidget, session: session, toolbarHeight: toolbarHeight }),
@@ -17,18 +17,21 @@ export function HistoryManagementMixin() {
17
17
  .actions(self => ({
18
18
  afterCreate() {
19
19
  document.addEventListener('keydown', e => {
20
+ var _a, _b;
20
21
  if (self.history.canRedo &&
21
22
  // ctrl+shift+z or cmd+shift+z
22
23
  (((e.ctrlKey || e.metaKey) && e.shiftKey && e.code === 'KeyZ') ||
23
24
  // ctrl+y
24
- (e.ctrlKey && !e.shiftKey && e.code === 'KeyY'))) {
25
+ (e.ctrlKey && !e.shiftKey && e.code === 'KeyY')) &&
26
+ ((_a = document.activeElement) === null || _a === void 0 ? void 0 : _a.tagName.toUpperCase()) !== 'INPUT') {
25
27
  self.history.redo();
26
28
  }
27
29
  if (self.history.canUndo &&
28
30
  // ctrl+z or cmd+z
29
31
  (e.ctrlKey || e.metaKey) &&
30
32
  !e.shiftKey &&
31
- e.code === 'KeyZ') {
33
+ e.code === 'KeyZ' &&
34
+ ((_b = document.activeElement) === null || _b === void 0 ? void 0 : _b.tagName.toUpperCase()) !== 'INPUT') {
32
35
  self.history.undo();
33
36
  }
34
37
  });
@@ -17,9 +17,7 @@ export declare function JBrowseConfigF({ pluginManager, assemblyConfigSchema, }:
17
17
  rpc: import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaType<{
18
18
  defaultDriver: {
19
19
  type: string;
20
- description: string; /**
21
- * #slot configuration.formatDetails.feature
22
- */
20
+ description: string;
23
21
  defaultValue: string;
24
22
  };
25
23
  drivers: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").IMapType<import("mobx-state-tree").ITypeUnion<import("mobx-state-tree").ModelCreationType<import("mobx-state-tree/dist/internal").ExtractCFromProps<Record<string, any>>> | undefined, import("mobx-state-tree").ModelSnapshotType<Record<string, any>>, (Partial<import("mobx-state-tree/dist/internal").ExtractCFromProps<Record<string, any>>> & import("mobx-state-tree/dist/internal").NonEmptyObject) | undefined>>, [undefined]>;
@@ -32,27 +30,18 @@ export declare function JBrowseConfigF({ pluginManager, assemblyConfigSchema, }:
32
30
  defaultValue: number;
33
31
  };
34
32
  formatDetails: import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaType<{
35
- /**
36
- * #slot configuration.formatDetails.feature
37
- */
38
33
  feature: {
39
34
  type: string;
40
35
  description: string;
41
36
  defaultValue: {};
42
37
  contextVariable: string[];
43
38
  };
44
- /**
45
- * #slot configuration.formatDetails.subfeatures
46
- */
47
39
  subfeatures: {
48
40
  type: string;
49
41
  description: string;
50
42
  defaultValue: {};
51
43
  contextVariable: string[];
52
44
  };
53
- /**
54
- * #slot configuration.formatDetails.depth
55
- */
56
45
  depth: {
57
46
  type: string;
58
47
  defaultValue: number;
@@ -60,18 +49,12 @@ export declare function JBrowseConfigF({ pluginManager, assemblyConfigSchema, }:
60
49
  };
61
50
  }, import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaOptions<undefined, undefined>>;
62
51
  formatAbout: import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaType<{
63
- /**
64
- * #slot configuration.formatAbout.config
65
- */
66
52
  config: {
67
53
  type: string;
68
54
  description: string;
69
55
  defaultValue: {};
70
56
  contextVariable: string[];
71
57
  };
72
- /**
73
- * #slot configuration.formatAbout.hideUris
74
- */
75
58
  hideUris: {
76
59
  type: string;
77
60
  defaultValue: boolean;
@@ -88,6 +71,34 @@ export declare function JBrowseConfigF({ pluginManager, assemblyConfigSchema, }:
88
71
  type: string;
89
72
  defaultValue: boolean;
90
73
  };
74
+ hierarchical: import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaType<{
75
+ sort: import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaType<{
76
+ trackNames: {
77
+ type: string;
78
+ defaultValue: boolean;
79
+ };
80
+ categories: {
81
+ type: string;
82
+ defaultValue: boolean;
83
+ };
84
+ }, import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaOptions<undefined, undefined>>;
85
+ defaultCollapsed: import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaType<{
86
+ categoryNames: {
87
+ type: string;
88
+ defaultValue: never[]; /**
89
+ * #slot configuration.highResolutionScaling
90
+ */
91
+ };
92
+ topLevelCategories: {
93
+ type: string;
94
+ defaultValue: boolean;
95
+ };
96
+ subCategories: {
97
+ type: string;
98
+ defaultValue: boolean;
99
+ };
100
+ }, import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaOptions<undefined, undefined>>;
101
+ }, import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaOptions<undefined, undefined>>;
91
102
  /**
92
103
  * #slot configuration.theme
93
104
  */
@@ -1,5 +1,6 @@
1
1
  import { ConfigurationSchema, } from '@jbrowse/core/configuration';
2
2
  import RpcManager from '@jbrowse/core/rpc/RpcManager';
3
+ import { FormatAboutConfigSchemaFactory, FormatDetailsConfigSchemaFactory, HierarchicalConfigSchemaFactory, } from '@jbrowse/product-core';
3
4
  import { types } from 'mobx-state-tree';
4
5
  /**
5
6
  * #config JBrowseRootConfig
@@ -20,52 +21,8 @@ export function JBrowseConfigF({ pluginManager, assemblyConfigSchema, }) {
20
21
  type: 'number',
21
22
  defaultValue: 2,
22
23
  },
23
- formatDetails: ConfigurationSchema('FormatDetails', {
24
- /**
25
- * #slot configuration.formatDetails.feature
26
- */
27
- feature: {
28
- type: 'frozen',
29
- description: 'adds extra fields to the feature details',
30
- defaultValue: {},
31
- contextVariable: ['feature'],
32
- },
33
- /**
34
- * #slot configuration.formatDetails.subfeatures
35
- */
36
- subfeatures: {
37
- type: 'frozen',
38
- description: 'adds extra fields to the subfeatures of a feature',
39
- defaultValue: {},
40
- contextVariable: ['feature'],
41
- },
42
- /**
43
- * #slot configuration.formatDetails.depth
44
- */
45
- depth: {
46
- type: 'number',
47
- defaultValue: 2,
48
- description: 'depth to iterate on subfeatures',
49
- },
50
- }),
51
- formatAbout: ConfigurationSchema('FormatAbout', {
52
- /**
53
- * #slot configuration.formatAbout.config
54
- */
55
- config: {
56
- type: 'frozen',
57
- description: 'formats configuration object in about dialog',
58
- defaultValue: {},
59
- contextVariable: ['config'],
60
- },
61
- /**
62
- * #slot configuration.formatAbout.hideUris
63
- */
64
- hideUris: {
65
- type: 'boolean',
66
- defaultValue: false,
67
- },
68
- }),
24
+ formatDetails: FormatDetailsConfigSchemaFactory(),
25
+ formatAbout: FormatAboutConfigSchemaFactory(),
69
26
  /*
70
27
  * #slot configuration.shareURL
71
28
  */
@@ -80,6 +37,7 @@ export function JBrowseConfigF({ pluginManager, assemblyConfigSchema, }) {
80
37
  type: 'boolean',
81
38
  defaultValue: false,
82
39
  },
40
+ hierarchical: HierarchicalConfigSchemaFactory(),
83
41
  /**
84
42
  * #slot configuration.theme
85
43
  */
@@ -90,7 +48,10 @@ export function JBrowseConfigF({ pluginManager, assemblyConfigSchema, }) {
90
48
  /**
91
49
  * #slot configuration.extraThemes
92
50
  */
93
- extraThemes: { type: 'frozen', defaultValue: {} },
51
+ extraThemes: {
52
+ type: 'frozen',
53
+ defaultValue: {},
54
+ },
94
55
  /**
95
56
  * #slot configuration.logoPath
96
57
  */
@@ -29,12 +29,16 @@ export declare function JBrowseModelF({ pluginManager, assemblyConfigSchema, }:
29
29
  };
30
30
  subfeatures: {
31
31
  type: string;
32
- description: string;
32
+ description: string; /**
33
+ * #getter
34
+ */
33
35
  defaultValue: {};
34
36
  contextVariable: string[];
35
37
  };
36
38
  depth: {
37
- type: string;
39
+ type: string; /**
40
+ * #getter
41
+ */
38
42
  defaultValue: number;
39
43
  description: string;
40
44
  };
@@ -59,21 +63,46 @@ export declare function JBrowseModelF({ pluginManager, assemblyConfigSchema, }:
59
63
  type: string;
60
64
  defaultValue: boolean;
61
65
  };
66
+ hierarchical: import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaType<{
67
+ sort: import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaType<{
68
+ trackNames: {
69
+ type: string;
70
+ defaultValue: boolean;
71
+ };
72
+ categories: {
73
+ type: string;
74
+ defaultValue: boolean;
75
+ };
76
+ }, import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaOptions<undefined, undefined>>;
77
+ defaultCollapsed: import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaType<{
78
+ categoryNames: {
79
+ type: string;
80
+ defaultValue: never[];
81
+ };
82
+ topLevelCategories: {
83
+ type: string;
84
+ defaultValue: boolean; /**
85
+ * #action
86
+ */
87
+ };
88
+ subCategories: {
89
+ type: string;
90
+ defaultValue: boolean;
91
+ };
92
+ }, import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaOptions<undefined, undefined>>;
93
+ }, import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaOptions<undefined, undefined>>;
62
94
  theme: {
63
95
  type: string;
64
- defaultValue: {}; /**
65
- * #action
66
- */
96
+ defaultValue: {};
67
97
  };
68
98
  extraThemes: {
69
- type: string;
99
+ type: string; /**
100
+ * #action
101
+ */
70
102
  defaultValue: {};
71
103
  };
72
104
  logoPath: {
73
105
  type: string;
74
- /**
75
- * #action
76
- */
77
106
  defaultValue: {
78
107
  uri: string;
79
108
  locationType: string;
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ import { SessionWithDrawerWidgets } from '@jbrowse/core/util/types';
3
+ declare const _default: ({ session, setToolbarHeight, }: {
4
+ session: SessionWithDrawerWidgets;
5
+ setToolbarHeight: (arg: number) => void;
6
+ }) => React.JSX.Element;
7
+ export default _default;
@@ -0,0 +1,86 @@
1
+ import React, { useState } from 'react';
2
+ import { AppBar, FormControl, IconButton, Menu, MenuItem, Select, Toolbar, Tooltip, Typography, } from '@mui/material';
3
+ import { makeStyles } from 'tss-react/mui';
4
+ import { observer } from 'mobx-react';
5
+ import { getEnv } from '@jbrowse/core/util';
6
+ // icons
7
+ import DeleteIcon from '@mui/icons-material/Delete';
8
+ import CloseIcon from '@mui/icons-material/Close';
9
+ import MinimizeIcon from '@mui/icons-material/Minimize';
10
+ import MoreVertIcon from '@mui/icons-material/MoreVert';
11
+ const useStyles = makeStyles()(theme => ({
12
+ formControl: {
13
+ margin: 0,
14
+ },
15
+ spacer: {
16
+ flexGrow: 1,
17
+ },
18
+ drawerSelect: {
19
+ margin: 0,
20
+ color: theme.palette.secondary.contrastText,
21
+ },
22
+ dropDownIcon: {
23
+ color: theme.palette.secondary.contrastText,
24
+ },
25
+ header: {
26
+ background: theme.palette.secondary.main,
27
+ },
28
+ }));
29
+ export default observer(function ({ session, setToolbarHeight, }) {
30
+ const { classes } = useStyles();
31
+ return (React.createElement(AppBar, { position: "sticky", className: classes.header, ref: ref => setToolbarHeight((ref === null || ref === void 0 ? void 0 : ref.getBoundingClientRect().height) || 0) },
32
+ React.createElement(Toolbar, { disableGutters: true },
33
+ React.createElement(DrawerWidgetSelector, { session: session }),
34
+ React.createElement("div", { className: classes.spacer }),
35
+ React.createElement(DrawerControls, { session: session }))));
36
+ });
37
+ const DrawerWidgetSelector = observer(function ({ session, }) {
38
+ const { visibleWidget, activeWidgets } = session;
39
+ const { classes } = useStyles();
40
+ const { pluginManager } = getEnv(session);
41
+ return (React.createElement(FormControl, { className: classes.formControl },
42
+ React.createElement(Select, { value: visibleWidget === null || visibleWidget === void 0 ? void 0 : visibleWidget.id, "data-testid": "widget-drawer-selects", className: classes.drawerSelect, classes: { icon: classes.dropDownIcon }, renderValue: widgetId => {
43
+ const widget = session.activeWidgets.get(widgetId);
44
+ if (!widget) {
45
+ return (React.createElement(Typography, { variant: "h6", color: "inherit" }, "Unknown widget"));
46
+ }
47
+ const widgetType = pluginManager.getWidgetType(widget.type);
48
+ const { HeadingComponent, heading } = widgetType;
49
+ return HeadingComponent ? (React.createElement(HeadingComponent, { model: widget })) : (React.createElement(Typography, { variant: "h6", color: "inherit" }, heading));
50
+ }, onChange: e => {
51
+ const w = session.activeWidgets.get(e.target.value);
52
+ if (w) {
53
+ session.showWidget(w);
54
+ }
55
+ else {
56
+ session.notify(`Widget not found ${e.target.value}`, 'warning');
57
+ }
58
+ } }, [...activeWidgets.values()].map(widget => {
59
+ const widgetType = pluginManager.getWidgetType(widget.type);
60
+ const { HeadingComponent, heading } = widgetType;
61
+ return (React.createElement(MenuItem, { "data-testid": `widget-drawer-selects-item-${widget.type}`, key: widget.id, value: widget.id },
62
+ HeadingComponent ? (React.createElement(HeadingComponent, { model: widget })) : (React.createElement(Typography, { variant: "h6", color: "inherit" }, heading)),
63
+ React.createElement(IconButton, { "data-testid": `${widget.type}-drawer-delete`, color: "inherit", "aria-label": "Delete", onClick: () => session.hideWidget(widget) },
64
+ React.createElement(DeleteIcon, null))));
65
+ }))));
66
+ });
67
+ const DrawerControls = observer(function ({ session, }) {
68
+ const [anchorEl, setAnchorEl] = useState(null);
69
+ const { drawerPosition, visibleWidget } = session;
70
+ return (React.createElement(React.Fragment, null,
71
+ React.createElement(IconButton, { color: "inherit", onClick: event => setAnchorEl(event.currentTarget) },
72
+ React.createElement(MoreVertIcon, null)),
73
+ React.createElement(Tooltip, { title: "Minimize drawer" },
74
+ React.createElement(IconButton, { "data-testid": "drawer-minimize", color: "inherit", onClick: () => {
75
+ session.notify(`Drawer minimized, click button on ${drawerPosition} side of screen to re-open`, 'info');
76
+ session.minimizeWidgetDrawer();
77
+ } },
78
+ React.createElement(MinimizeIcon, null))),
79
+ React.createElement(Tooltip, { title: "Close drawer" },
80
+ React.createElement(IconButton, { color: "inherit", onClick: () => session.hideWidget(visibleWidget) },
81
+ React.createElement(CloseIcon, null))),
82
+ React.createElement(Menu, { anchorEl: anchorEl, open: Boolean(anchorEl), onClose: () => setAnchorEl(null) }, ['left', 'right'].map(option => (React.createElement(MenuItem, { key: option, selected: drawerPosition === 'option', onClick: () => {
83
+ session.setDrawerPosition(option);
84
+ setAnchorEl(null);
85
+ } }, option))))));
86
+ });
@@ -1,86 +1,12 @@
1
1
  import React, { Suspense, useState } from 'react';
2
2
  import { ErrorBoundary } from 'react-error-boundary';
3
- import { AppBar, FormControl, IconButton, Menu, MenuItem, Select, Toolbar, Tooltip, Typography, } from '@mui/material';
4
- import { makeStyles } from 'tss-react/mui';
5
3
  import { observer } from 'mobx-react';
6
4
  import { getEnv } from '@jbrowse/core/util';
7
5
  import LoadingEllipses from '@jbrowse/core/ui/LoadingEllipses';
8
6
  import ErrorMessage from '@jbrowse/core/ui/ErrorMessage';
9
- // icons
10
- import DeleteIcon from '@mui/icons-material/Delete';
11
- import CloseIcon from '@mui/icons-material/Close';
12
- import MinimizeIcon from '@mui/icons-material/Minimize';
13
- import MoreVertIcon from '@mui/icons-material/MoreVert';
14
7
  // locals
15
8
  import Drawer from './Drawer';
16
- const useStyles = makeStyles()(theme => ({
17
- formControl: {
18
- margin: 0,
19
- },
20
- spacer: {
21
- flexGrow: 1,
22
- },
23
- drawerSelect: {
24
- margin: 0,
25
- color: theme.palette.secondary.contrastText,
26
- },
27
- dropDownIcon: {
28
- color: theme.palette.secondary.contrastText,
29
- },
30
- header: {
31
- background: theme.palette.secondary.main,
32
- },
33
- }));
34
- const DrawerHeader = observer(function ({ session, setToolbarHeight, }) {
35
- const { pluginManager } = getEnv(session);
36
- const { visibleWidget, activeWidgets, drawerPosition } = session;
37
- const { classes } = useStyles();
38
- const [anchorEl, setAnchorEl] = useState(null);
39
- return (React.createElement(AppBar, { position: "sticky", className: classes.header, ref: ref => setToolbarHeight((ref === null || ref === void 0 ? void 0 : ref.getBoundingClientRect().height) || 0) },
40
- React.createElement(Toolbar, { disableGutters: true },
41
- React.createElement(FormControl, { className: classes.formControl },
42
- React.createElement(Select, { value: visibleWidget === null || visibleWidget === void 0 ? void 0 : visibleWidget.id, "data-testid": "widget-drawer-selects", className: classes.drawerSelect, classes: { icon: classes.dropDownIcon }, renderValue: widgetId => {
43
- const widget = session.activeWidgets.get(widgetId);
44
- if (!widget) {
45
- return (React.createElement(Typography, { variant: "h6", color: "inherit" }, "Unknown widget"));
46
- }
47
- const widgetType = pluginManager.getWidgetType(widget.type);
48
- const { HeadingComponent, heading } = widgetType;
49
- return HeadingComponent ? (React.createElement(HeadingComponent, { model: widget })) : (React.createElement(Typography, { variant: "h6", color: "inherit" }, heading));
50
- }, onChange: e => {
51
- const w = session.activeWidgets.get(e.target.value);
52
- if (w) {
53
- session.showWidget(w);
54
- }
55
- else {
56
- session.notify(`Widget not found ${e.target.value}`, 'warning');
57
- }
58
- } }, [...activeWidgets.values()].map(widget => {
59
- const widgetType = pluginManager.getWidgetType(widget.type);
60
- const { HeadingComponent, heading } = widgetType;
61
- return (React.createElement(MenuItem, { "data-testid": `widget-drawer-selects-item-${widget.type}`, key: widget.id, value: widget.id },
62
- HeadingComponent ? (React.createElement(HeadingComponent, { model: widget })) : (React.createElement(Typography, { variant: "h6", color: "inherit" }, heading)),
63
- React.createElement(IconButton, { "data-testid": `${widget.type}-drawer-delete`, color: "inherit", "aria-label": "Delete", onClick: () => session.hideWidget(widget) },
64
- React.createElement(DeleteIcon, null))));
65
- }))),
66
- React.createElement("div", { className: classes.spacer }),
67
- React.createElement("div", null,
68
- React.createElement(IconButton, { "data-testid": "drawer-close", color: "inherit", onClick: event => setAnchorEl(event.currentTarget) },
69
- React.createElement(MoreVertIcon, null)),
70
- React.createElement(Tooltip, { title: "Minimize drawer" },
71
- React.createElement(IconButton, { "data-testid": "drawer-minimize", color: "inherit", onClick: () => {
72
- session.notify(`Drawer minimized, click button on ${drawerPosition} side of screen to re-open`, 'info');
73
- session.minimizeWidgetDrawer();
74
- } },
75
- React.createElement(MinimizeIcon, null))),
76
- React.createElement(Tooltip, { title: "Close drawer" },
77
- React.createElement(IconButton, { "data-testid": "drawer-close", color: "inherit", onClick: () => session.hideWidget(visibleWidget) },
78
- React.createElement(CloseIcon, null))))),
79
- React.createElement(Menu, { anchorEl: anchorEl, open: Boolean(anchorEl), onClose: () => setAnchorEl(null) }, ['left', 'right'].map(option => (React.createElement(MenuItem, { key: option, selected: drawerPosition === 'option', onClick: () => {
80
- session.setDrawerPosition(option);
81
- setAnchorEl(null);
82
- } }, option))))));
83
- });
9
+ import DrawerHeader from './DrawerHeader';
84
10
  const DrawerWidget = observer(function ({ session, }) {
85
11
  const { visibleWidget } = session;
86
12
  const { pluginManager } = getEnv(session);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jbrowse/app-core",
3
- "version": "2.6.2",
3
+ "version": "2.6.3",
4
4
  "description": "JBrowse 2 code shared between the 'full featured' apps e.g. jbrowse-web and jbrowse-desktop",
5
5
  "keywords": [
6
6
  "jbrowse",
@@ -42,7 +42,7 @@
42
42
  },
43
43
  "dependencies": {
44
44
  "@babel/runtime": "^7.16.3",
45
- "@jbrowse/product-core": "^2.6.2",
45
+ "@jbrowse/product-core": "^2.6.3",
46
46
  "@mui/icons-material": "^5.0.0",
47
47
  "@mui/material": "^5.10.17",
48
48
  "copy-to-clipboard": "^3.3.1",
@@ -61,5 +61,5 @@
61
61
  "publishConfig": {
62
62
  "access": "public"
63
63
  },
64
- "gitHead": "bbea587a402d9974acdd804a33f4b77f31a2fd5f"
64
+ "gitHead": "ed402c87efb0904858d602c363bd1757d5742129"
65
65
  }