@openbraininstitute/morphoviewer 0.24.21 → 0.24.22

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.
package/README.md CHANGED
@@ -32,6 +32,18 @@ Copyright (c) 2025 Open Brain Institute
32
32
 
33
33
  ## Release notes
34
34
 
35
+ ### v0.24.22
36
+
37
+ - Add new `ControlsLayout` component (`lib/src/components/controls-layer/`) for configurable viewer header controls
38
+ - Supports built-in actions: `fullscreen`, `reset-camera`, `minimize`, `close`
39
+ - Accepts arbitrary `React.ReactNode` elements alongside named actions
40
+ - Groups can be nested in arrays for flex-based layout with `space-between` justification
41
+ - Add `controls` prop to `MorphoViewerSmallCircuit` to allow custom header control layouts
42
+ - Falls back to a default layout (`reset-camera`, `fullscreen`, `close`, `minimize`) when not provided
43
+ - Add `onMinimize` callback prop to `MorphoViewerSmallCircuit`
44
+ - Replace hardcoded `<header>` markup in `MorphoViewerSmallCircuit` with the new `ControlsLayout` component
45
+ - Update `MorphoViewerSmallCircuit` doc page to demonstrate the configurable controls
46
+
35
47
  ### v0.24.21
36
48
 
37
49
  - Add optional `gizmo` prop to `MorphoViewerSmallCircuit` for displaying an axes orientation controller
@@ -0,0 +1,9 @@
1
+ import React from "react";
2
+ export type ControlAction = "fullscreen" | "reset-camera" | "minimize" | "close";
3
+ export interface ControlsLayoutProps {
4
+ className?: string;
5
+ content: (ControlAction | React.ReactNode | (ControlAction | React.ReactNode)[])[];
6
+ onClick?(action: ControlAction): void;
7
+ }
8
+ export default function ControlsLayout({ className, content, onClick, }: ControlsLayoutProps): import("react/jsx-runtime").JSX.Element;
9
+ //# sourceMappingURL=controls-layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controls-layout.d.ts","sourceRoot":"","sources":["../../../src/components/controls-layer/controls-layout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAS1B,MAAM,MAAM,aAAa,GACtB,YAAY,GACZ,cAAc,GACd,UAAU,GACV,OAAO,CAAC;AAEX,MAAM,WAAW,mBAAmB;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,CACN,aAAa,GACb,KAAK,CAAC,SAAS,GACf,CAAC,aAAa,GAAG,KAAK,CAAC,SAAS,CAAC,EAAE,CACrC,EAAE,CAAC;IACJ,OAAO,CAAC,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;CACtC;AAED,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EACtC,SAAS,EACT,OAAO,EACP,OAAO,GACP,EAAE,mBAAmB,2CAMrB"}
@@ -0,0 +1,39 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { classNames } from "./../../utils.js";
3
+ import { IconCenter } from "../icons/center.js";
4
+ import { IconClose } from "../icons/close.js";
5
+ import { IconFullscreen } from "../icons/fullscreen.js";
6
+ import { IconMinimize } from "../icons/minimize.js";
7
+ import styles from "./controls-layout.module.css";
8
+ export default function ControlsLayout({ className, content, onClick, }) {
9
+ return (_jsx("div", { className: classNames(className, styles.controlsLayout), children: renderContent(content, onClick) }));
10
+ }
11
+ function renderContent(content, onClick) {
12
+ return content.map((action, index) => {
13
+ if (Array.isArray(action)) {
14
+ return (_jsx("div", { className: styles.group, children: renderContent(action, onClick) }, index));
15
+ }
16
+ switch (action) {
17
+ case "close":
18
+ case "fullscreen":
19
+ case "minimize":
20
+ case "reset-camera":
21
+ return renderButton(action, onClick, index);
22
+ default:
23
+ return action;
24
+ }
25
+ });
26
+ }
27
+ function renderButton(action, onClick, index) {
28
+ const Icon = ICONS[action];
29
+ if (!Icon)
30
+ return null;
31
+ return (_jsx("button", { className: styles.button, type: "button", "aria-label": action, onClick: () => onClick === null || onClick === void 0 ? void 0 : onClick(action), children: _jsx(Icon, {}) }, index));
32
+ }
33
+ const ICONS = {
34
+ "reset-camera": IconCenter,
35
+ close: IconClose,
36
+ fullscreen: IconFullscreen,
37
+ minimize: IconMinimize,
38
+ };
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbHMtbGF5b3V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvY29udHJvbHMtbGF5ZXIvY29udHJvbHMtbGF5b3V0LnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBRUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNyQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxNQUFNLE1BQU0sOEJBQThCLENBQUM7QUFrQmxELE1BQU0sQ0FBQyxPQUFPLFVBQVUsY0FBYyxDQUFDLEVBQ3RDLFNBQVMsRUFDVCxPQUFPLEVBQ1AsT0FBTyxHQUNjO0lBQ3JCLE9BQU8sQ0FDTixjQUFLLFNBQVMsRUFBRSxVQUFVLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxjQUFjLENBQUMsWUFDMUQsYUFBYSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsR0FDM0IsQ0FDTixDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsYUFBYSxDQUNyQixPQUF1QyxFQUN2QyxPQUF5QztJQUV6QyxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDcEMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDM0IsT0FBTyxDQUNOLGNBQWlCLFNBQVMsRUFBRSxNQUFNLENBQUMsS0FBSyxZQUN0QyxhQUFhLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxJQUR0QixLQUFLLENBRVQsQ0FDTixDQUFDO1FBQ0gsQ0FBQztRQUNELFFBQVEsTUFBTSxFQUFFLENBQUM7WUFDaEIsS0FBSyxPQUFPLENBQUM7WUFDYixLQUFLLFlBQVksQ0FBQztZQUNsQixLQUFLLFVBQVUsQ0FBQztZQUNoQixLQUFLLGNBQWM7Z0JBQ2xCLE9BQU8sWUFBWSxDQUFDLE1BQXVCLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzlEO2dCQUNDLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7SUFDRixDQUFDLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FDcEIsTUFBcUIsRUFDckIsT0FBc0QsRUFDdEQsS0FBYTtJQUViLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzQixJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRXZCLE9BQU8sQ0FDTixpQkFFQyxTQUFTLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFDeEIsSUFBSSxFQUFDLFFBQVEsZ0JBQ0QsTUFBTSxFQUNsQixPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFHLE1BQU0sQ0FBQyxZQUVoQyxLQUFDLElBQUksS0FBRyxJQU5ILEtBQUssQ0FPRixDQUNULENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxLQUFLLEdBQW9DO0lBQzlDLGNBQWMsRUFBRSxVQUFVO0lBQzFCLEtBQUssRUFBRSxTQUFTO0lBQ2hCLFVBQVUsRUFBRSxjQUFjO0lBQzFCLFFBQVEsRUFBRSxZQUFZO0NBQ3RCLENBQUMifQ==
@@ -0,0 +1,53 @@
1
+ .controlsLayout {
2
+ position: absolute;
3
+ left: 0;
4
+ top: 0;
5
+ width: 100%;
6
+ padding: 0.5em;
7
+ display: flex;
8
+ flex-wrap: wrap;
9
+ flex-direction: row;
10
+ justify-content: space-between;
11
+ align-items: center;
12
+ gap: 1em;
13
+
14
+ div.group {
15
+ padding: 0;
16
+ margin: 0;
17
+ display: flex;
18
+ flex-wrap: nowrap;
19
+ flex-direction: row;
20
+ justify-content: flex-start;
21
+ align-items: center;
22
+ gap: .25em;
23
+ }
24
+
25
+ button,
26
+ button {
27
+ font: inherit;
28
+ width: 2.5em;
29
+ height: 2.5em;
30
+ display: grid;
31
+ place-items: center;
32
+ flex: 0 0 auto;
33
+ cursor: pointer;
34
+ color: #fff;
35
+ border: 2px solid #000;
36
+ border-radius: 2px;
37
+ background: #3a3a3a;
38
+ margin: 0;
39
+ box-sizing: border-box;
40
+ transition: all 0.3s;
41
+
42
+ &:hover {
43
+ background-color: #adf;
44
+ color: #000;
45
+ }
46
+
47
+ &:active {
48
+ background-color: rgb(0, 153, 255);
49
+ color: #000;
50
+ }
51
+ }
52
+
53
+ }
@@ -0,0 +1,2 @@
1
+ export { default } from "./controls-layout";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/controls-layer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { default } from "./controls-layout.js";
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9jb250cm9scy1sYXllci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sbUJBQW1CLENBQUEifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"morpho-viewer-small-circuit.d.ts","sourceRoot":"","sources":["../../../src/components/morpho-viewer-small-circuit/morpho-viewer-small-circuit.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,GAAG,CAAC;AA0CvD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,6BAA6B,2CAmC5E"}
1
+ {"version":3,"file":"morpho-viewer-small-circuit.d.ts","sourceRoot":"","sources":["../../../src/components/morpho-viewer-small-circuit/morpho-viewer-small-circuit.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,GAAG,CAAC;AAyCvD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,6BAA6B,2CA0C5E"}
@@ -2,13 +2,11 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { tgdFullscreenToggle } from "@tolokoban/tgd";
3
3
  import React from "react";
4
4
  import { classNames } from "./../../utils.js";
5
- import { ButtonCameraReset } from "../button-reset-camera/index.js";
6
- import { IconClose } from "../icons/close.js";
7
- import { IconFullscreen } from "../icons/fullscreen.js";
8
- import { usePainterManager } from "./painter/index.js";
5
+ import ControlsLayout from "../controls-layer/index.js";
9
6
  import styles from "./morpho-viewer-small-circuit.module.css";
7
+ import { usePainterManager } from "./painter/index.js";
10
8
  export function MorphoViewerSmallCircuit(props) {
11
- var _a;
9
+ var _a, _b;
12
10
  const ref = React.useRef(null);
13
11
  const manager = usePainterManager(props);
14
12
  const handleToggleFullscreen = () => {
@@ -17,9 +15,26 @@ export function MorphoViewerSmallCircuit(props) {
17
15
  return;
18
16
  tgdFullscreenToggle(div);
19
17
  };
18
+ const handleControls = (action) => {
19
+ var _a, _b;
20
+ switch (action) {
21
+ case "fullscreen":
22
+ handleToggleFullscreen();
23
+ break;
24
+ case "reset-camera":
25
+ manager.cameraReset();
26
+ break;
27
+ case "close":
28
+ (_a = props.onClose) === null || _a === void 0 ? void 0 : _a.call(props);
29
+ break;
30
+ case "minimize":
31
+ (_b = props.onMinimize) === null || _b === void 0 ? void 0 : _b.call(props);
32
+ break;
33
+ }
34
+ };
20
35
  return (_jsxs("div", { ref: ref, className: classNames(props.className, styles.morphoViewerSmallCircuit), style: {
21
36
  background: (_a = props.backgroundColor) !== null && _a !== void 0 ? _a : "#000",
22
- }, children: [_jsx(Canvas, { painterManager: manager }), _jsxs("header", { children: [_jsx("div", {}), _jsx(ButtonCameraReset, { painterManager: manager }), _jsxs("div", { className: styles.flex, children: [_jsx("button", { type: "button", onClick: handleToggleFullscreen, children: _jsx(IconFullscreen, {}) }), props.onClose && (_jsx("button", { type: "button", onClick: props.onClose, children: _jsx(IconClose, {}) }))] })] })] }));
37
+ }, children: [_jsx(Canvas, { painterManager: manager }), _jsx(ControlsLayout, { content: (_b = props.controls) !== null && _b !== void 0 ? _b : getDefaultControls(props), onClick: handleControls })] }));
23
38
  }
24
39
  const Canvas = React.memo(({ painterManager }) => {
25
40
  return (_jsx("canvas", { ref: (canvas) => {
@@ -29,4 +44,10 @@ const Canvas = React.memo(({ painterManager }) => {
29
44
  };
30
45
  } }, "canvas"));
31
46
  });
32
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ycGhvLXZpZXdlci1zbWFsbC1jaXJjdWl0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvbW9ycGhvLXZpZXdlci1zbWFsbC1jaXJjdWl0L21vcnBoby12aWV3ZXItc21hbGwtY2lyY3VpdC50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JELE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUUxQixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRXJDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzNELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFckQsT0FBTyxFQUF1QixpQkFBaUIsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVuRSxPQUFPLE1BQU0sTUFBTSwwQ0FBMEMsQ0FBQztBQXVDOUQsTUFBTSxVQUFVLHdCQUF3QixDQUFDLEtBQW9DOztJQUMzRSxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUF3QixJQUFJLENBQUMsQ0FBQztJQUN0RCxNQUFNLE9BQU8sR0FBRyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6QyxNQUFNLHNCQUFzQixHQUFHLEdBQUcsRUFBRTtRQUNsQyxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxHQUFHO1lBQUUsT0FBTztRQUVqQixtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQixDQUFDLENBQUM7SUFFRixPQUFPLENBQ0wsZUFDRSxHQUFHLEVBQUUsR0FBRyxFQUNSLFNBQVMsRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsd0JBQXdCLENBQUMsRUFDdkUsS0FBSyxFQUFFO1lBQ0wsVUFBVSxFQUFFLE1BQUEsS0FBSyxDQUFDLGVBQWUsbUNBQUksTUFBTTtTQUM1QyxhQUVELEtBQUMsTUFBTSxJQUFDLGNBQWMsRUFBRSxPQUFPLEdBQUksRUFDbkMsNkJBQ0UsZUFBTyxFQUNQLEtBQUMsaUJBQWlCLElBQUMsY0FBYyxFQUFFLE9BQU8sR0FBSSxFQUM5QyxlQUFLLFNBQVMsRUFBRSxNQUFNLENBQUMsSUFBSSxhQUN6QixpQkFBUSxJQUFJLEVBQUMsUUFBUSxFQUFDLE9BQU8sRUFBRSxzQkFBc0IsWUFDbkQsS0FBQyxjQUFjLEtBQUcsR0FDWCxFQUNSLEtBQUssQ0FBQyxPQUFPLElBQUksQ0FDaEIsaUJBQVEsSUFBSSxFQUFDLFFBQVEsRUFBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sWUFDMUMsS0FBQyxTQUFTLEtBQUcsR0FDTixDQUNWLElBQ0csSUFDQyxJQUNMLENBQ1AsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQXNDLEVBQUUsRUFBRTtJQUNuRixPQUFPLENBQ0wsaUJBRUUsR0FBRyxFQUFFLENBQUMsTUFBZ0MsRUFBRSxFQUFFO1lBQ3hDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1lBQy9CLE9BQU8sR0FBRyxFQUFFO2dCQUNWLGNBQWMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1lBQy9CLENBQUMsQ0FBQztRQUNKLENBQUMsSUFORyxRQUFRLENBT1osQ0FDSCxDQUFDO0FBQ0osQ0FBQyxDQUFDLENBQUMifQ==
47
+ function getDefaultControls(props) {
48
+ return [
49
+ "reset-camera",
50
+ ["fullscreen", props.onClose && "close", props.onMinimize && "minimize"],
51
+ ];
52
+ }
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ycGhvLXZpZXdlci1zbWFsbC1jaXJjdWl0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvbW9ycGhvLXZpZXdlci1zbWFsbC1jaXJjdWl0L21vcnBoby12aWV3ZXItc21hbGwtY2lyY3VpdC50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JELE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUUxQixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBR3JDLE9BQU8sY0FBYyxNQUFNLG1CQUFtQixDQUFDO0FBSy9DLE9BQU8sTUFBTSxNQUFNLDBDQUEwQyxDQUFDO0FBQzlELE9BQU8sRUFBdUIsaUJBQWlCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUF1Q25FLE1BQU0sVUFBVSx3QkFBd0IsQ0FBQyxLQUFvQzs7SUFDNUUsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBd0IsSUFBSSxDQUFDLENBQUM7SUFDdEQsTUFBTSxPQUFPLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDekMsTUFBTSxzQkFBc0IsR0FBRyxHQUFHLEVBQUU7UUFDbkMsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQztRQUN4QixJQUFJLENBQUMsR0FBRztZQUFFLE9BQU87UUFFakIsbUJBQW1CLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUIsQ0FBQyxDQUFDO0lBRUYsTUFBTSxjQUFjLEdBQUcsQ0FBQyxNQUFxQixFQUFRLEVBQUU7O1FBQ3RELFFBQVEsTUFBTSxFQUFFLENBQUM7WUFDaEIsS0FBSyxZQUFZO2dCQUNoQixzQkFBc0IsRUFBRSxDQUFDO2dCQUN6QixNQUFNO1lBQ1AsS0FBSyxjQUFjO2dCQUNsQixPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3RCLE1BQU07WUFDUCxLQUFLLE9BQU87Z0JBQ1gsTUFBQSxLQUFLLENBQUMsT0FBTyxxREFBSSxDQUFDO2dCQUNsQixNQUFNO1lBQ1AsS0FBSyxVQUFVO2dCQUNkLE1BQUEsS0FBSyxDQUFDLFVBQVUscURBQUksQ0FBQztnQkFDckIsTUFBTTtRQUNSLENBQUM7SUFDRixDQUFDLENBQUM7SUFFRixPQUFPLENBQ04sZUFDQyxHQUFHLEVBQUUsR0FBRyxFQUNSLFNBQVMsRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsd0JBQXdCLENBQUMsRUFDdkUsS0FBSyxFQUFFO1lBQ04sVUFBVSxFQUFFLE1BQUEsS0FBSyxDQUFDLGVBQWUsbUNBQUksTUFBTTtTQUMzQyxhQUVELEtBQUMsTUFBTSxJQUFDLGNBQWMsRUFBRSxPQUFPLEdBQUksRUFDbkMsS0FBQyxjQUFjLElBQ2QsT0FBTyxFQUFFLE1BQUEsS0FBSyxDQUFDLFFBQVEsbUNBQUksa0JBQWtCLENBQUMsS0FBSyxDQUFDLEVBQ3BELE9BQU8sRUFBRSxjQUFjLEdBQ3RCLElBQ0csQ0FDTixDQUFDO0FBQ0gsQ0FBQztBQUVELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQ3hCLENBQUMsRUFBRSxjQUFjLEVBQXNDLEVBQUUsRUFBRTtJQUMxRCxPQUFPLENBQ04saUJBRUMsR0FBRyxFQUFFLENBQUMsTUFBZ0MsRUFBRSxFQUFFO1lBQ3pDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1lBQy9CLE9BQU8sR0FBRyxFQUFFO2dCQUNYLGNBQWMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1lBQzlCLENBQUMsQ0FBQztRQUNILENBQUMsSUFORyxRQUFRLENBT1gsQ0FDRixDQUFDO0FBQ0gsQ0FBQyxDQUNELENBQUM7QUFFRixTQUFTLGtCQUFrQixDQUFDLEtBQW9DO0lBQy9ELE9BQU87UUFDTixjQUFjO1FBQ2QsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLE9BQU8sSUFBSSxPQUFPLEVBQUUsS0FBSyxDQUFDLFVBQVUsSUFBSSxVQUFVLENBQUM7S0FDeEUsQ0FBQztBQUNILENBQUMifQ==
@@ -1,4 +1,5 @@
1
1
  import { TgdPainterGizmoOptions } from "@tolokoban/tgd";
2
+ import { ControlsLayoutProps } from "../controls-layer/controls-layout";
2
3
  import type { MorphoViewerTree } from "../morpho-viewer-simul";
3
4
  export interface MorphoViewerSmallCircuitCell {
4
5
  id: string;
@@ -19,8 +20,10 @@ export interface MorphoViewerSmallCircuitProps {
19
20
  onCellHover?(cell: MorphoViewerSmallCircuitCell | undefined): void;
20
21
  onCellClick?(cell: MorphoViewerSmallCircuitCell | undefined): void;
21
22
  onClose?(): void;
23
+ onMinimize?(): void;
22
24
  loadCell(id: string): Promise<MorphoViewerSmallCircuitCellData | null>;
23
25
  onLoadProgress?(progress: number): void;
24
26
  gizmo?: boolean | TgdPainterGizmoOptions;
27
+ controls?: ControlsLayoutProps["content"];
25
28
  }
26
29
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/morpho-viewer-small-circuit/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAExD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,MAAM,WAAW,4BAA4B;IAC3C,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IAC1C,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IAC1D,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,gCAAgC,GAAG;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,gBAAgB,CAAC;CACxB,CAAC;AAEF,MAAM,WAAW,6BAA6B;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,4BAA4B,EAAE,CAAC;IACxC,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,WAAW,CAAC,CAAC,IAAI,EAAE,4BAA4B,GAAG,SAAS,GAAG,IAAI,CAAC;IACnE,WAAW,CAAC,CAAC,IAAI,EAAE,4BAA4B,GAAG,SAAS,GAAG,IAAI,CAAC;IACnE,OAAO,CAAC,IAAI,IAAI,CAAC;IAKjB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gCAAgC,GAAG,IAAI,CAAC,CAAC;IAOvE,cAAc,CAAC,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAWxC,KAAK,CAAC,EAAE,OAAO,GAAG,sBAAsB,CAAC;CAC1C"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/morpho-viewer-small-circuit/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAA;AACvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAE9D,MAAM,WAAW,4BAA4B;IACzC,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,CAAA;IACzC,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,CAAA;IACzD,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,MAAM,gCAAgC,GAAG;IAC3C,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,gBAAgB,CAAA;CACzB,CAAA;AAED,MAAM,WAAW,6BAA6B;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,OAAO,EAAE,4BAA4B,EAAE,CAAA;IAIvC,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC7B,WAAW,CAAC,CAAC,IAAI,EAAE,4BAA4B,GAAG,SAAS,GAAG,IAAI,CAAA;IAClE,WAAW,CAAC,CAAC,IAAI,EAAE,4BAA4B,GAAG,SAAS,GAAG,IAAI,CAAA;IAClE,OAAO,CAAC,IAAI,IAAI,CAAA;IAChB,UAAU,CAAC,IAAI,IAAI,CAAA;IAKnB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gCAAgC,GAAG,IAAI,CAAC,CAAA;IAOtE,cAAc,CAAC,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IAWvC,KAAK,CAAC,EAAE,OAAO,GAAG,sBAAsB,CAAA;IAUxC,QAAQ,CAAC,EAAE,mBAAmB,CAAC,SAAS,CAAC,CAAA;CAC5C"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openbraininstitute/morphoviewer",
3
- "version": "0.24.21",
3
+ "version": "0.24.22",
4
4
  "description": "Class to display SWC files in 3D on a canvas",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openbraininstitute/morphoviewer",
3
- "version": "0.24.21",
3
+ "version": "0.24.22",
4
4
  "description": "Class to display SWC morphology files in 3D",
5
5
  "main": "./lib/dist/index.js",
6
6
  "module": "./lib/dist/index.js",
@@ -10,7 +10,7 @@
10
10
  ],
11
11
  "repository": {
12
12
  "type": "git",
13
- "url": "git+https://github.com/BlueBrain/morphoviewer.git"
13
+ "url": "git+https://github.com/openbraininstitute/morphoviewer.git"
14
14
  },
15
15
  "keywords": [
16
16
  "SWC",
@@ -41,4 +41,4 @@
41
41
  "devDependencies": {
42
42
  "@biomejs/biome": "^2.4.13"
43
43
  }
44
- }
44
+ }