react-cosmos-ui 6.0.0-alpha.9 → 6.0.0-beta.2
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/dist/components/Icon.d.ts +7 -3
- package/dist/components/Icon.js +2 -2
- package/dist/components/Illustration.d.ts +1 -0
- package/dist/components/KeyBox.d.ts +1 -0
- package/dist/components/SidePanel.d.ts +1 -0
- package/dist/components/SidePanel.js +1 -1
- package/dist/components/Space.d.ts +1 -0
- package/dist/components/ValueInputTree/ExpandCollapseValues.d.ts +1 -0
- package/dist/components/ValueInputTree/ValueInput/BooleanValueInput.d.ts +1 -0
- package/dist/components/ValueInputTree/ValueInput/NullValueInput.d.ts +1 -0
- package/dist/components/ValueInputTree/ValueInput/NumberValueInput.d.ts +1 -0
- package/dist/components/ValueInputTree/ValueInput/StringValueInput.d.ts +1 -0
- package/dist/components/ValueInputTree/ValueInput/UndefinedValueInput.d.ts +1 -0
- package/dist/components/ValueInputTree/ValueInput/UnserializableValueInput.d.ts +1 -0
- package/dist/components/ValueInputTree/ValueInput/ValueInput.d.ts +1 -0
- package/dist/components/ValueInputTree/ValueInput/ValueInput.js +1 -1
- package/dist/components/ValueInputTree/ValueInputDir.d.ts +1 -0
- package/dist/components/ValueInputTree/index.d.ts +3 -3
- package/dist/components/ValueInputTree/index.js +2 -2
- package/dist/components/ValueInputTree/shared.d.ts +1 -2
- package/dist/components/ValueInputTree/shared.js +0 -4
- package/dist/components/ValueInputTree/valueTreeExpansion.js +2 -1
- package/dist/components/icons/index.d.ts +4 -6
- package/dist/components/icons/index.js +1 -1
- package/dist/components/illustrations/ArtificialIntelligence.d.ts +1 -0
- package/dist/components/illustrations/Astronaut.d.ts +1 -0
- package/dist/components/illustrations/BlankCanvas.d.ts +1 -0
- package/dist/components/inputs/NumberInput.d.ts +1 -0
- package/dist/components/inputs/Select.d.ts +1 -0
- package/dist/cosmos.loadPlugins.js +14 -10
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -1
- package/dist/playground.bundle.js +602 -599
- package/dist/playground.bundle.js.map +1 -1
- package/dist/playground.js +13 -2
- package/dist/playgroundConfig.d.ts +2 -0
- package/dist/plugins/ClassStatePanel/ClassStatePanel/ComponentClassState.d.ts +1 -0
- package/dist/plugins/ClassStatePanel/ClassStatePanel/ComponentClassState.js +3 -3
- package/dist/plugins/ControlPanel/ControlPanel.d.ts +1 -0
- package/dist/plugins/ControlPanel/ControlPanel.js +1 -1
- package/dist/plugins/ControlSelect/SelectValueInput.d.ts +1 -0
- package/dist/plugins/ControlSelect/SelectValueInput.js +1 -1
- package/dist/plugins/Core/index.js +0 -5
- package/dist/plugins/Core/spec.d.ts +0 -2
- package/dist/plugins/FixtureBookmark/BookmarkFixtureButton.d.ts +1 -0
- package/dist/plugins/FixtureBookmark/FixtureBookmarks.d.ts +5 -5
- package/dist/plugins/FixtureBookmark/FixtureBookmarks.js +10 -7
- package/dist/plugins/FixtureBookmark/index.js +7 -17
- package/dist/plugins/FixtureSearch/FixtureSearchHeader.d.ts +3 -2
- package/dist/plugins/FixtureSearch/FixtureSearchHeader.js +3 -3
- package/dist/plugins/FixtureSearch/FixtureSearchOverlay.d.ts +1 -0
- package/dist/plugins/FixtureSearch/FixtureSearchOverlay.js +2 -2
- package/dist/plugins/FixtureSearch/FixtureSearchResult.d.ts +1 -0
- package/dist/plugins/FixtureSearch/FixtureSearchShortcuts.d.ts +1 -0
- package/dist/plugins/FixtureSearch/index.js +2 -1
- package/dist/plugins/FixtureTree/BlankState.d.ts +1 -0
- package/dist/plugins/FixtureTree/BlankState.js +23 -24
- package/dist/plugins/FixtureTree/FixtureTree/FixtureButton.d.ts +2 -2
- package/dist/plugins/FixtureTree/FixtureTree/FixtureButton.js +2 -2
- package/dist/plugins/FixtureTree/FixtureTree/FixtureDir.d.ts +1 -0
- package/dist/plugins/FixtureTree/FixtureTree/FixtureTree.js +6 -8
- package/dist/plugins/FixtureTree/FixtureTree/MultiFixtureButton.d.ts +3 -2
- package/dist/plugins/FixtureTree/FixtureTree/MultiFixtureButton.js +16 -11
- package/dist/plugins/FixtureTree/FixtureTreeContainer.d.ts +2 -2
- package/dist/plugins/FixtureTree/FixtureTreeContainer.js +1 -3
- package/dist/plugins/FixtureTree/FixtureTreeHeader.d.ts +1 -0
- package/dist/plugins/FixtureTree/index.js +1 -1
- package/dist/plugins/FixtureTree/revealFixture.js +2 -2
- package/dist/plugins/FixtureTree/shared.d.ts +1 -1
- package/dist/plugins/FullScreenButton/FullScreenButton.d.ts +1 -0
- package/dist/plugins/FullScreenButton/index.js +11 -5
- package/dist/plugins/Notifications/Notifications.d.ts +1 -0
- package/dist/plugins/PluginList/PluginList.d.ts +1 -0
- package/dist/plugins/PropsPanel/BlankState.d.ts +1 -0
- package/dist/plugins/PropsPanel/BlankState.js +14 -12
- package/dist/plugins/PropsPanel/PropsPanel/ComponentProps.d.ts +1 -0
- package/dist/plugins/PropsPanel/index.js +1 -4
- package/dist/plugins/RemoteRenderer/RemoteButton/index.d.ts +3 -2
- package/dist/plugins/RemoteRenderer/RemoteButton/index.js +5 -4
- package/dist/plugins/RemoteRenderer/index.js +2 -1
- package/dist/plugins/RendererCore/index.js +23 -5
- package/dist/plugins/RendererCore/onRouterFixtureReselect.d.ts +3 -0
- package/dist/plugins/RendererCore/onRouterFixtureReselect.js +7 -0
- package/dist/plugins/RendererCore/onRouterFixtureSelect.d.ts +3 -0
- package/dist/plugins/RendererCore/onRouterFixtureSelect.js +9 -0
- package/dist/plugins/RendererCore/onRouterFixtureUnselect.d.ts +2 -0
- package/dist/plugins/RendererCore/onRouterFixtureUnselect.js +9 -0
- package/dist/plugins/RendererCore/receiveResponse/fixtureStateChange.js +4 -4
- package/dist/plugins/RendererCore/receiveResponse/rendererReady.js +15 -21
- package/dist/plugins/RendererCore/reloadRenderer.d.ts +2 -0
- package/dist/plugins/RendererCore/reloadRenderer.js +5 -0
- package/dist/plugins/RendererCore/shared/postRequest.d.ts +1 -0
- package/dist/plugins/RendererCore/shared/postRequest.js +8 -0
- package/dist/plugins/RendererCore/spec.d.ts +6 -1
- package/dist/plugins/RendererPreview/RendererOverlay/RemoteRendererConnected.d.ts +2 -0
- package/dist/plugins/RendererPreview/RendererOverlay/RemoteRendererConnected.js +19 -0
- package/dist/plugins/RendererPreview/RendererOverlay/RemoteRendererOverlay.d.ts +6 -0
- package/dist/plugins/RendererPreview/RendererOverlay/RemoteRendererOverlay.js +6 -0
- package/dist/plugins/RendererPreview/RendererOverlay/RendererOverlay.d.ts +7 -0
- package/dist/plugins/RendererPreview/RendererOverlay/RendererOverlay.js +11 -0
- package/dist/plugins/RendererPreview/RendererOverlay/WaitingForRenderer.d.ts +2 -0
- package/dist/plugins/RendererPreview/RendererOverlay/WaitingForRenderer.js +65 -0
- package/dist/plugins/RendererPreview/RendererOverlay/rendererOverlayShared.d.ts +3 -0
- package/dist/plugins/RendererPreview/RendererOverlay/rendererOverlayShared.js +27 -0
- package/dist/plugins/RendererPreview/RendererPreview.d.ts +3 -0
- package/dist/plugins/RendererPreview/RendererPreview.js +10 -3
- package/dist/plugins/RendererPreview/handleRendererRequests.js +7 -6
- package/dist/plugins/RendererPreview/handleWindowMessages.js +10 -1
- package/dist/plugins/RendererPreview/index.js +7 -13
- package/dist/plugins/RendererPreview/shared.d.ts +0 -6
- package/dist/plugins/RendererPreview/spec.d.ts +0 -3
- package/dist/plugins/ResponsivePreview/ResponsivePreview/{Header.d.ts → ResponsiveHeader.d.ts} +1 -1
- package/dist/plugins/ResponsivePreview/ResponsivePreview/{Header.js → ResponsiveHeader.js} +2 -2
- package/dist/plugins/ResponsivePreview/ResponsivePreview/ResponsivePreview.d.ts +1 -2
- package/dist/plugins/ResponsivePreview/ResponsivePreview/ResponsivePreview.js +4 -4
- package/dist/plugins/ResponsivePreview/ToggleButton/index.d.ts +1 -0
- package/dist/plugins/ResponsivePreview/index.js +5 -6
- package/dist/plugins/ResponsivePreview/shared.js +13 -10
- package/dist/plugins/Root/GlobalHeader.d.ts +2 -4
- package/dist/plugins/Root/GlobalHeader.js +2 -23
- package/dist/plugins/{ContentOverlay/shared.d.ts → Root/HomeOverlay/ContentOverlay.d.ts} +1 -4
- package/dist/plugins/{ContentOverlay/shared.js → Root/HomeOverlay/ContentOverlay.js} +3 -3
- package/dist/plugins/Root/HomeOverlay/HomeOverlay.d.ts +8 -0
- package/dist/plugins/Root/HomeOverlay/HomeOverlay.js +6 -0
- package/dist/plugins/{ContentOverlay → Root/HomeOverlay}/KeyShortcut.d.ts +1 -0
- package/dist/plugins/{ContentOverlay → Root/HomeOverlay}/KeyShortcut.js +2 -2
- package/dist/plugins/{ContentOverlay → Root/HomeOverlay}/NoFixtureSelected.d.ts +1 -0
- package/dist/plugins/{ContentOverlay → Root/HomeOverlay}/NoFixtureSelected.js +5 -5
- package/dist/plugins/{ContentOverlay → Root/HomeOverlay}/WelcomeCosmos.d.ts +1 -0
- package/dist/plugins/Root/HomeOverlay/WelcomeCosmos.js +159 -0
- package/dist/plugins/Root/HomeOverlay/welcomeDismiss.d.ts +7 -0
- package/dist/plugins/{ContentOverlay → Root/HomeOverlay}/welcomeDismiss.js +6 -4
- package/dist/plugins/Root/RendererHeader.d.ts +1 -1
- package/dist/plugins/Root/RendererHeader.js +13 -5
- package/dist/plugins/Root/Root.d.ts +7 -5
- package/dist/plugins/Root/Root.js +9 -10
- package/dist/plugins/Root/ToggleNavButton.d.ts +1 -0
- package/dist/plugins/Root/index.js +6 -5
- package/dist/plugins/Root/panelOpen.js +0 -5
- package/dist/plugins/Router/index.js +23 -11
- package/dist/plugins/Router/spec.d.ts +5 -3
- package/dist/plugins/StandardControl/storage.d.ts +1 -1
- package/dist/plugins/pluginEntry.d.ts +0 -1
- package/dist/plugins/pluginEntry.js +0 -1
- package/dist/shared/fixtureTree.d.ts +1 -2
- package/dist/shared/fixtureTree.js +5 -10
- package/dist/shared/url.d.ts +6 -5
- package/dist/shared/url.js +6 -6
- package/dist/slots/ControlActionSlot.d.ts +1 -0
- package/dist/slots/ControlSlot.d.ts +1 -0
- package/dist/slots/FixtureActionSlot.d.ts +3 -2
- package/dist/slots/NavRowSlot.d.ts +1 -0
- package/dist/slots/RendererActionSlot.d.ts +1 -0
- package/dist/slots/SidePanelRowSlot.d.ts +1 -0
- package/dist/testHelpers/pluginMocks.d.ts +8 -7
- package/dist/testHelpers/pluginMocks.js +5 -3
- package/package.json +4 -4
- package/dist/plugins/ContentOverlay/ContentOverlay.d.ts +0 -13
- package/dist/plugins/ContentOverlay/ContentOverlay.js +0 -34
- package/dist/plugins/ContentOverlay/RendererNotResponding.d.ts +0 -1
- package/dist/plugins/ContentOverlay/RendererNotResponding.js +0 -109
- package/dist/plugins/ContentOverlay/WelcomeCosmos.js +0 -158
- package/dist/plugins/ContentOverlay/cosmos.decorator.d.ts +0 -5
- package/dist/plugins/ContentOverlay/cosmos.decorator.js +0 -13
- package/dist/plugins/ContentOverlay/index.d.ts +0 -2
- package/dist/plugins/ContentOverlay/index.js +0 -19
- package/dist/plugins/ContentOverlay/spec.d.ts +0 -3
- package/dist/plugins/ContentOverlay/spec.js +0 -1
- package/dist/plugins/ContentOverlay/welcomeDismiss.d.ts +0 -7
- package/dist/plugins/RendererCore/isValidFixtureSelected.d.ts +0 -2
- package/dist/plugins/RendererCore/isValidFixtureSelected.js +0 -16
- package/dist/plugins/RendererCore/onRouterFixtureChange.d.ts +0 -3
- package/dist/plugins/RendererCore/onRouterFixtureChange.js +0 -18
- package/dist/plugins/RendererPreview/checkRendererStatus.d.ts +0 -2
- package/dist/plugins/RendererPreview/checkRendererStatus.js +0 -31
|
@@ -29,8 +29,17 @@ function isValidResponse(msg) {
|
|
|
29
29
|
msg.data.type &&
|
|
30
30
|
msg.data.payload);
|
|
31
31
|
}
|
|
32
|
-
function updateRuntimeStatus({ getState, setState }, response) {
|
|
32
|
+
function updateRuntimeStatus({ getState, setState, getMethodsOf }, response) {
|
|
33
33
|
const { runtimeStatus } = getState();
|
|
34
|
+
if (response.type === 'rendererError') {
|
|
35
|
+
const notifications = getMethodsOf('notifications');
|
|
36
|
+
notifications.pushTimedNotification({
|
|
37
|
+
id: 'renderer-error',
|
|
38
|
+
type: 'error',
|
|
39
|
+
title: 'Renderer error',
|
|
40
|
+
info: 'Check the browser console for details.',
|
|
41
|
+
});
|
|
42
|
+
}
|
|
34
43
|
// Errors are not of interest anymore after renderer connectivity has been
|
|
35
44
|
// established. Errors that occur after renderer is connected are likely
|
|
36
45
|
// errors related to specific fixtures that the user can navigate away from.
|
|
@@ -1,18 +1,15 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { createPlugin } from 'react-plugin';
|
|
3
|
-
import {
|
|
3
|
+
import { RendererPreview } from './RendererPreview.js';
|
|
4
4
|
import { createRendererRequestHandler } from './handleRendererRequests.js';
|
|
5
5
|
import { handleWindowMessages } from './handleWindowMessages.js';
|
|
6
|
-
import { RendererPreview } from './RendererPreview.js';
|
|
7
6
|
const { postRendererRequest, setIframeRef } = createRendererRequestHandler();
|
|
8
7
|
const { onLoad, on, plug, register } = createPlugin({
|
|
9
8
|
name: 'rendererPreview',
|
|
10
9
|
initialState: {
|
|
11
|
-
urlStatus: 'unknown',
|
|
12
10
|
runtimeStatus: 'pending',
|
|
13
11
|
},
|
|
14
12
|
methods: {
|
|
15
|
-
getUrlStatus,
|
|
16
13
|
getRuntimeStatus,
|
|
17
14
|
},
|
|
18
15
|
});
|
|
@@ -24,26 +21,23 @@ onLoad((context) => {
|
|
|
24
21
|
if (!rendererUrl) {
|
|
25
22
|
return null;
|
|
26
23
|
}
|
|
27
|
-
return [
|
|
28
|
-
checkRendererStatus(context, rendererUrl),
|
|
29
|
-
handleWindowMessages(context),
|
|
30
|
-
];
|
|
24
|
+
return [handleWindowMessages(context)];
|
|
31
25
|
});
|
|
32
26
|
plug('rendererPreview', ({ pluginContext }) => {
|
|
33
27
|
function handleIframeRef(ref) {
|
|
34
28
|
setIframeRef(pluginContext, ref);
|
|
35
29
|
}
|
|
36
|
-
return (React.createElement(RendererPreview, { rendererUrl: getRendererUrl(pluginContext), onIframeRef: handleIframeRef }));
|
|
30
|
+
return (React.createElement(RendererPreview, { rendererUrl: getRendererUrl(pluginContext), rendererConnected: getRendererConnected(pluginContext), runtimeStatus: pluginContext.getState().runtimeStatus, onIframeRef: handleIframeRef }));
|
|
37
31
|
});
|
|
38
32
|
export { register };
|
|
39
33
|
if (process.env.NODE_ENV !== 'test')
|
|
40
34
|
register();
|
|
41
|
-
function getUrlStatus({ getState }) {
|
|
42
|
-
return getState().urlStatus;
|
|
43
|
-
}
|
|
44
35
|
function getRuntimeStatus({ getState }) {
|
|
45
36
|
return getState().runtimeStatus;
|
|
46
37
|
}
|
|
47
38
|
function getRendererUrl({ getMethodsOf }) {
|
|
48
|
-
return getMethodsOf('
|
|
39
|
+
return getMethodsOf('rendererCore').getRendererUrl();
|
|
40
|
+
}
|
|
41
|
+
function getRendererConnected({ getMethodsOf }) {
|
|
42
|
+
return getMethodsOf('rendererCore').isRendererConnected();
|
|
49
43
|
}
|
|
@@ -1,9 +1,3 @@
|
|
|
1
1
|
import { PluginContext } from 'react-plugin';
|
|
2
2
|
import { RendererPreviewSpec } from './spec.js';
|
|
3
|
-
export type UrlStatus = 'unknown' | 'ok' | 'error';
|
|
4
|
-
export type RuntimeStatus = 'pending' | 'connected' | 'error';
|
|
5
|
-
export type State = {
|
|
6
|
-
urlStatus: UrlStatus;
|
|
7
|
-
runtimeStatus: RuntimeStatus;
|
|
8
|
-
};
|
|
9
3
|
export type RendererPreviewContext = PluginContext<RendererPreviewSpec>;
|
|
@@ -1,13 +1,10 @@
|
|
|
1
|
-
export type UrlStatus = 'unknown' | 'ok' | 'error';
|
|
2
1
|
export type RuntimeStatus = 'pending' | 'connected' | 'error';
|
|
3
2
|
export type RendererPreviewSpec = {
|
|
4
3
|
name: 'rendererPreview';
|
|
5
4
|
state: {
|
|
6
|
-
urlStatus: UrlStatus;
|
|
7
5
|
runtimeStatus: RuntimeStatus;
|
|
8
6
|
};
|
|
9
7
|
methods: {
|
|
10
|
-
getUrlStatus(): UrlStatus;
|
|
11
8
|
getRuntimeStatus(): RuntimeStatus;
|
|
12
9
|
};
|
|
13
10
|
};
|
package/dist/plugins/ResponsivePreview/ResponsivePreview/{Header.d.ts → ResponsiveHeader.d.ts}
RENAMED
|
@@ -8,6 +8,6 @@ type Props = {
|
|
|
8
8
|
selectViewport: (viewport: ResponsiveViewport) => unknown;
|
|
9
9
|
toggleScale: () => unknown;
|
|
10
10
|
};
|
|
11
|
-
export declare const
|
|
11
|
+
export declare const ResponsiveHeader: React.NamedExoticComponent<Props>;
|
|
12
12
|
export declare const RotateButton: import("styled-components").StyledComponent<"button", any, {}, never>;
|
|
13
13
|
export {};
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import styled from 'styled-components';
|
|
3
|
+
import { Space } from '../../../components/Space.js';
|
|
3
4
|
import { Button8 } from '../../../components/buttons/index.js';
|
|
4
5
|
import { Minimize2Icon, RefreshCcwIcon, } from '../../../components/icons/index.js';
|
|
5
6
|
import { NumberInput } from '../../../components/inputs/NumberInput.js';
|
|
6
7
|
import { Select } from '../../../components/inputs/Select.js';
|
|
7
|
-
import { Space } from '../../../components/Space.js';
|
|
8
8
|
import { blue, grey128, grey144, grey216, grey248, grey8, } from '../../../style/colors.js';
|
|
9
9
|
import { quick } from '../../../style/vars.js';
|
|
10
10
|
const numberInputStypes = {
|
|
@@ -12,7 +12,7 @@ const numberInputStypes = {
|
|
|
12
12
|
focusedBg: grey8,
|
|
13
13
|
focusedBoxShadow: `0 0 0.5px 1px ${blue}`,
|
|
14
14
|
};
|
|
15
|
-
export const
|
|
15
|
+
export const ResponsiveHeader = React.memo(function ResponsiveHeader({ devices, selectedViewport, scaleFactor, scaled, selectViewport, toggleScale, }) {
|
|
16
16
|
const options = React.useMemo(() => devices.map(({ width, height, label }) => {
|
|
17
17
|
const value = stringifyViewport({ width, height });
|
|
18
18
|
return { value, label, width, height };
|
|
@@ -6,9 +6,8 @@ type Props = {
|
|
|
6
6
|
enabled: boolean;
|
|
7
7
|
viewport: ResponsiveViewport;
|
|
8
8
|
scaled: boolean;
|
|
9
|
-
validFixtureSelected: boolean;
|
|
10
9
|
setViewport: Dispatch<SetStateAction<ResponsiveViewport>>;
|
|
11
10
|
setScaled: (scaled: boolean) => unknown;
|
|
12
11
|
};
|
|
13
|
-
export declare function ResponsivePreview({ children, devices, enabled, viewport, scaled,
|
|
12
|
+
export declare function ResponsivePreview({ children, devices, enabled, viewport, scaled, setViewport, setScaled, }: Props): JSX.Element;
|
|
14
13
|
export {};
|
|
@@ -3,9 +3,9 @@ import React, { useCallback, useEffect, useRef, useState, } from 'react';
|
|
|
3
3
|
import styled, { css } from 'styled-components';
|
|
4
4
|
import { useDrag } from '../../../hooks/useDrag.js';
|
|
5
5
|
import { grey64, grey8 } from '../../../style/colors.js';
|
|
6
|
-
import {
|
|
6
|
+
import { ResponsiveHeader } from './ResponsiveHeader.js';
|
|
7
7
|
import { getStyles, getViewportScaleFactor, responsivePreviewBorderWidth, responsivePreviewPadding, stretchStyle, } from './style.js';
|
|
8
|
-
export function ResponsivePreview({ children, devices, enabled, viewport, scaled,
|
|
8
|
+
export function ResponsivePreview({ children, devices, enabled, viewport, scaled, setViewport, setScaled, }) {
|
|
9
9
|
const [container, setContainer] = useState(null);
|
|
10
10
|
const onWidthChange = useCallback((width) => setViewport(prevViewport => ({ ...prevViewport, width })), [setViewport]);
|
|
11
11
|
const onHeightChange = useCallback((height) => setViewport(prevViewport => ({ ...prevViewport, height })), [setViewport]);
|
|
@@ -53,7 +53,7 @@ export function ResponsivePreview({ children, devices, enabled, viewport, scaled
|
|
|
53
53
|
// whenever switching between responsive and non responsive mode. By
|
|
54
54
|
// returning the same element nesting between states for Preview the
|
|
55
55
|
// component instances are preserved and the transition is seamless.
|
|
56
|
-
if (!
|
|
56
|
+
if (!enabled || !container) {
|
|
57
57
|
return (React.createElement(Container, null,
|
|
58
58
|
React.createElement("div", { key: "preview", ref: handleContainerRef, style: stretchStyle },
|
|
59
59
|
React.createElement("div", { style: stretchStyle },
|
|
@@ -63,7 +63,7 @@ export function ResponsivePreview({ children, devices, enabled, viewport, scaled
|
|
|
63
63
|
const scaleFactor = getViewportScaleFactor(viewport, container);
|
|
64
64
|
const { maskContainerStyle, padContainerStyle, alignContainerStyle, scaleContainerStyle, } = getStyles({ container, viewport, scaled });
|
|
65
65
|
return (React.createElement(Container, null,
|
|
66
|
-
React.createElement(
|
|
66
|
+
React.createElement(ResponsiveHeader, { devices: devices, selectedViewport: viewport, scaleFactor: scaleFactor, scaled: scaled, selectViewport: setViewport, toggleScale: () => setScaled(!scaled) }),
|
|
67
67
|
React.createElement("div", { key: "preview", ref: handleContainerRef, style: maskContainerStyle },
|
|
68
68
|
React.createElement("div", { style: padContainerStyle },
|
|
69
69
|
React.createElement("div", { key: "container", style: alignContainerStyle },
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { createPlugin } from 'react-plugin';
|
|
3
3
|
import { ResponsivePreview } from './ResponsivePreview/ResponsivePreview.js';
|
|
4
|
-
import { DEFAULT_DEVICES, DEFAULT_VIEWPORT_STATE, VIEWPORT_STORAGE_KEY, } from './shared.js';
|
|
5
4
|
import { ToggleButton } from './ToggleButton/index.js';
|
|
5
|
+
import { DEFAULT_DEVICES, DEFAULT_VIEWPORT_STATE, VIEWPORT_STORAGE_KEY, } from './shared.js';
|
|
6
6
|
const { plug, namedPlug, register } = createPlugin({
|
|
7
7
|
name: 'responsivePreview',
|
|
8
8
|
defaultConfig: {
|
|
@@ -10,20 +10,19 @@ const { plug, namedPlug, register } = createPlugin({
|
|
|
10
10
|
},
|
|
11
11
|
});
|
|
12
12
|
plug('rendererPreviewOuter', ({ children, pluginContext }) => {
|
|
13
|
-
const { getConfig
|
|
13
|
+
const { getConfig } = pluginContext;
|
|
14
14
|
const { devices } = getConfig();
|
|
15
|
-
const rendererCore = getMethodsOf('rendererCore');
|
|
16
15
|
const { enabled, viewport, scaled } = getViewportState(pluginContext);
|
|
17
16
|
const onViewportChange = useViewportChange(pluginContext);
|
|
18
17
|
const onScaledChange = useScaledChange(pluginContext);
|
|
19
|
-
return (React.createElement(ResponsivePreview, { devices: devices, enabled: enabled, viewport: viewport, scaled: scaled,
|
|
18
|
+
return (React.createElement(ResponsivePreview, { devices: devices, enabled: enabled, viewport: viewport, scaled: scaled, setViewport: onViewportChange, setScaled: onScaledChange }, children));
|
|
20
19
|
});
|
|
21
20
|
namedPlug('rendererAction', 'responsivePreview', ({ pluginContext }) => {
|
|
22
21
|
const { getMethodsOf } = pluginContext;
|
|
23
|
-
const
|
|
22
|
+
const rendererCore = getMethodsOf('rendererCore');
|
|
24
23
|
const viewportState = getViewportState(pluginContext);
|
|
25
24
|
const { enabled, viewport } = viewportState;
|
|
26
|
-
if (!
|
|
25
|
+
if (!rendererCore.getRendererUrl())
|
|
27
26
|
return null;
|
|
28
27
|
return (React.createElement(ToggleButton, { selected: enabled, onToggle: () => {
|
|
29
28
|
if (enabled) {
|
|
@@ -1,19 +1,22 @@
|
|
|
1
1
|
export const DEFAULT_DEVICES = [
|
|
2
|
-
{ label: 'iPhone
|
|
3
|
-
{ label: 'iPhone
|
|
4
|
-
{ label: 'iPhone
|
|
5
|
-
{ label: 'iPhone
|
|
6
|
-
{ label: '
|
|
7
|
-
{ label: 'iPad
|
|
2
|
+
{ label: 'iPhone SE', width: 375, height: 667 },
|
|
3
|
+
{ label: 'iPhone 12/13/14', width: 390, height: 844 },
|
|
4
|
+
{ label: 'iPhone 14 Pro', width: 393, height: 852 },
|
|
5
|
+
{ label: 'iPhone 14 Plus', width: 428, height: 926 },
|
|
6
|
+
{ label: 'iPhone 14 Pro Max', width: 430, height: 932 },
|
|
7
|
+
{ label: 'iPad mini', width: 744, height: 1133 },
|
|
8
|
+
{ label: 'iPad', width: 820, height: 1180 },
|
|
9
|
+
{ label: 'iPad Pro 11"', width: 834, height: 1194 },
|
|
10
|
+
{ label: 'iPad Pro 12.9"', width: 1024, height: 1366 },
|
|
8
11
|
{ label: 'Small laptop', width: 1280, height: 720 },
|
|
9
12
|
{ label: 'Laptop', width: 1366, height: 768 },
|
|
10
|
-
{ label: 'Large laptop', width:
|
|
11
|
-
{ label: '
|
|
12
|
-
{ label: '
|
|
13
|
+
{ label: 'Large laptop', width: 1536, height: 864 },
|
|
14
|
+
{ label: '1080p', width: 1920, height: 1080 },
|
|
15
|
+
{ label: '1440p', width: 2560, height: 1440 },
|
|
13
16
|
];
|
|
14
17
|
export const VIEWPORT_STORAGE_KEY = 'responsiveViewportState';
|
|
15
18
|
export const DEFAULT_VIEWPORT_STATE = {
|
|
16
19
|
enabled: false,
|
|
17
20
|
scaled: true,
|
|
18
|
-
viewport: { width:
|
|
21
|
+
viewport: { width: 375, height: 667 },
|
|
19
22
|
};
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
/// <reference types="react" />
|
|
2
2
|
type Props = {
|
|
3
|
-
selectedFixtureId: FixtureId | null;
|
|
4
3
|
rendererConnected: boolean;
|
|
5
|
-
validFixtureSelected: boolean;
|
|
6
4
|
globalActionOrder: string[];
|
|
7
5
|
};
|
|
8
|
-
export declare function GlobalHeader({
|
|
6
|
+
export declare function GlobalHeader({ rendererConnected, globalActionOrder }: Props): JSX.Element;
|
|
9
7
|
export {};
|
|
@@ -1,23 +1,10 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { ArraySlot } from 'react-plugin';
|
|
3
3
|
import styled from 'styled-components';
|
|
4
|
-
import {
|
|
5
|
-
export function GlobalHeader({
|
|
6
|
-
function getMessage() {
|
|
7
|
-
if (!rendererConnected) {
|
|
8
|
-
return React.createElement(Message, null, "Waiting for renderer...");
|
|
9
|
-
}
|
|
10
|
-
if (!selectedFixtureId) {
|
|
11
|
-
return React.createElement(Message, null, "No fixture selected");
|
|
12
|
-
}
|
|
13
|
-
if (!validFixtureSelected) {
|
|
14
|
-
return React.createElement(Message, null, "Fixture not found");
|
|
15
|
-
}
|
|
16
|
-
return null;
|
|
17
|
-
}
|
|
4
|
+
import { grey32, white10 } from '../../style/colors.js';
|
|
5
|
+
export function GlobalHeader({ rendererConnected, globalActionOrder }) {
|
|
18
6
|
return (React.createElement(Container, null,
|
|
19
7
|
React.createElement(Left, null),
|
|
20
|
-
getMessage(),
|
|
21
8
|
React.createElement(Right, null, rendererConnected && (React.createElement(ArraySlot, { name: "globalAction", plugOrder: globalActionOrder })))));
|
|
22
9
|
}
|
|
23
10
|
const Container = styled.div `
|
|
@@ -49,11 +36,3 @@ const Right = styled(Actions) `
|
|
|
49
36
|
flex-direction: row;
|
|
50
37
|
align-items: center;
|
|
51
38
|
`;
|
|
52
|
-
const Message = styled.div `
|
|
53
|
-
padding: 4px;
|
|
54
|
-
color: ${grey176};
|
|
55
|
-
line-height: 24px;
|
|
56
|
-
white-space: nowrap;
|
|
57
|
-
text-overflow: ellipsis;
|
|
58
|
-
overflow: hidden;
|
|
59
|
-
`;
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
import { PluginContext } from 'react-plugin';
|
|
2
|
-
import { ContentOverlaySpec } from './spec.js';
|
|
3
|
-
export type ContentOverlayContext = PluginContext<ContentOverlaySpec>;
|
|
4
1
|
export declare const OverlayContainer: import("styled-components").StyledComponent<"div", any, {}, never>;
|
|
5
|
-
export declare const
|
|
2
|
+
export declare const OverlayBody: import("styled-components").StyledComponent<"div", any, {}, never>;
|
|
6
3
|
export declare const TextContainer: import("styled-components").StyledComponent<"div", any, {}, never>;
|
|
7
4
|
export declare const IllustrationContainer: import("styled-components").StyledComponent<"div", any, {}, never>;
|
|
8
5
|
export declare const SecondaryButton: import("styled-components").StyledComponent<"button", any, {}, never>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import styled from 'styled-components';
|
|
2
|
-
import { screenGrey1, screenGrey2, screenGrey5, screenGrey6, screenPrimary2, screenPrimary3, } from '
|
|
2
|
+
import { screenGrey1, screenGrey2, screenGrey5, screenGrey6, screenPrimary2, screenPrimary3, } from '../../../style/colors.js';
|
|
3
3
|
export const OverlayContainer = styled.div `
|
|
4
4
|
position: absolute;
|
|
5
5
|
top: 0;
|
|
@@ -8,12 +8,12 @@ export const OverlayContainer = styled.div `
|
|
|
8
8
|
height: 100%;
|
|
9
9
|
display: flex;
|
|
10
10
|
flex-direction: column;
|
|
11
|
-
justify-
|
|
11
|
+
justify-content: flex-start;
|
|
12
12
|
align-items: flex-start;
|
|
13
13
|
background: ${screenGrey6};
|
|
14
14
|
overflow: auto;
|
|
15
15
|
`;
|
|
16
|
-
export const
|
|
16
|
+
export const OverlayBody = styled.div `
|
|
17
17
|
flex-shrink: 0;
|
|
18
18
|
display: flex;
|
|
19
19
|
flex-direction: row;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
type Props = {
|
|
3
|
+
welcomeDismissed: boolean;
|
|
4
|
+
onDismissWelcome: () => unknown;
|
|
5
|
+
onShowWelcome: () => unknown;
|
|
6
|
+
};
|
|
7
|
+
export declare function HomeOverlay({ welcomeDismissed, onDismissWelcome, onShowWelcome, }: Props): JSX.Element;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { NoFixtureSelected } from './NoFixtureSelected.js';
|
|
3
|
+
import { WelcomeCosmos } from './WelcomeCosmos.js';
|
|
4
|
+
export function HomeOverlay({ welcomeDismissed, onDismissWelcome, onShowWelcome, }) {
|
|
5
|
+
return welcomeDismissed ? (React.createElement(NoFixtureSelected, { onShowWelcome: onShowWelcome })) : (React.createElement(WelcomeCosmos, { onDismissWelcome: onDismissWelcome }));
|
|
6
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import styled from 'styled-components';
|
|
3
|
-
import { KeyBox } from '
|
|
4
|
-
import { screenGrey1, screenGrey5 } from '
|
|
3
|
+
import { KeyBox } from '../../../components/KeyBox.js';
|
|
4
|
+
import { screenGrey1, screenGrey5 } from '../../../style/colors.js';
|
|
5
5
|
export function KeyShortcut({ keys, label }) {
|
|
6
6
|
return (React.createElement(Container, null,
|
|
7
7
|
React.createElement(Keys, null, keys.map(key => (React.createElement(KeyBox, { key: key, value: key, bgColor: screenGrey5, textColor: screenGrey1, size: 26, fontSize: 16 })))),
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import styled from 'styled-components';
|
|
3
|
-
import { BlankCanvasIllustration } from '
|
|
4
|
-
import { screenGrey3 } from '
|
|
3
|
+
import { BlankCanvasIllustration } from '../../../components/illustrations/BlankCanvas.js';
|
|
4
|
+
import { screenGrey3 } from '../../../style/colors.js';
|
|
5
|
+
import { IllustrationContainer, OverlayBody, OverlayContainer, SecondaryButton, TextContainer, } from './ContentOverlay.js';
|
|
5
6
|
import { KeyShortcut } from './KeyShortcut.js';
|
|
6
|
-
import { ContentContainer, IllustrationContainer, SecondaryButton, TextContainer, } from './shared.js';
|
|
7
7
|
export function NoFixtureSelected({ onShowWelcome }) {
|
|
8
|
-
return (React.createElement(
|
|
9
|
-
React.createElement(
|
|
8
|
+
return (React.createElement(OverlayContainer, { "data-testid": "blank" },
|
|
9
|
+
React.createElement(OverlayBody, null,
|
|
10
10
|
React.createElement(TextContainer, null,
|
|
11
11
|
React.createElement(KeyShortcut, { keys: ['⌘', 'P'], label: "Search fixtures" }),
|
|
12
12
|
React.createElement(Subtitle, null, "FIXTURE SELECTED"),
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import styled from 'styled-components';
|
|
3
|
+
import { AstronautIllustration } from '../../../components/illustrations/Astronaut.js';
|
|
4
|
+
import { screenGrey1, screenGrey3, screenGrey5, screenPrimary1, screenPrimary2, screenPrimary3, } from '../../../style/colors.js';
|
|
5
|
+
import { IllustrationContainer, NoWrap, OverlayBody, OverlayContainer, SecondaryButton, TextContainer, } from './ContentOverlay.js';
|
|
6
|
+
export function WelcomeCosmos({ onDismissWelcome }) {
|
|
7
|
+
return (React.createElement(OverlayContainer, { "data-testid": "welcome" },
|
|
8
|
+
React.createElement(OverlayBody, null,
|
|
9
|
+
React.createElement(TextContainer, null,
|
|
10
|
+
React.createElement(Header, null,
|
|
11
|
+
"Welcome to ",
|
|
12
|
+
React.createElement(NoWrap, null, "React Cosmos")),
|
|
13
|
+
React.createElement(List, null,
|
|
14
|
+
React.createElement("li", null,
|
|
15
|
+
React.createElement(Bullet, null),
|
|
16
|
+
React.createElement("span", null,
|
|
17
|
+
React.createElement(Link, { href: "https://github.com/react-cosmos/react-cosmos/tree/main/docs", rel: "noopener noreferrer", target: "_blank" },
|
|
18
|
+
React.createElement("strong", null, "Read the docs")),
|
|
19
|
+
' ',
|
|
20
|
+
"to get the most out of React Cosmos.",
|
|
21
|
+
React.createElement("br", null),
|
|
22
|
+
"Chat with us on",
|
|
23
|
+
' ',
|
|
24
|
+
React.createElement(Link, { href: "https://discord.gg/3X95VgfnW5", rel: "noopener noreferrer", target: "_blank" }, "Discord"),
|
|
25
|
+
". Report detailed issues on",
|
|
26
|
+
' ',
|
|
27
|
+
React.createElement(Link, { href: "https://github.com/react-cosmos/react-cosmos/issues", rel: "noopener noreferrer", target: "_blank" }, "GitHub"),
|
|
28
|
+
".")),
|
|
29
|
+
React.createElement("li", null,
|
|
30
|
+
React.createElement(Bullet, null),
|
|
31
|
+
React.createElement("span", null,
|
|
32
|
+
React.createElement(Link, { href: "https://github.com/users/skidding/sponsorship", rel: "noopener noreferrer", target: "_blank" },
|
|
33
|
+
React.createElement("strong", null, "Become a Sponsor")),
|
|
34
|
+
' ',
|
|
35
|
+
"to invest in the future of React Cosmos.",
|
|
36
|
+
React.createElement("br", null),
|
|
37
|
+
`Don't worry if you can't. `,
|
|
38
|
+
React.createElement(Highlight, null, "React Cosmos will always be free.")))),
|
|
39
|
+
React.createElement(Paragraph, null,
|
|
40
|
+
React.createElement(ActionLink, { href: "https://forms.gle/yvoie73Rfo6Zy7no7", rel: "noopener noreferrer", target: "_blank" }, "share your feedback"),
|
|
41
|
+
React.createElement(SecondaryButton, { onClick: onDismissWelcome }, "hide this screen"))),
|
|
42
|
+
React.createElement(IllustrationContainer, null,
|
|
43
|
+
React.createElement(AstronautIllustration, { title: "astronaut" })))));
|
|
44
|
+
}
|
|
45
|
+
const Header = styled.h1 `
|
|
46
|
+
position: relative;
|
|
47
|
+
margin: 0 0 64px 0;
|
|
48
|
+
color: ${screenPrimary2};
|
|
49
|
+
font-size: 30px;
|
|
50
|
+
font-weight: 700;
|
|
51
|
+
line-height: 1.2em;
|
|
52
|
+
text-transform: uppercase;
|
|
53
|
+
letter-spacing: 0.015em;
|
|
54
|
+
|
|
55
|
+
::after {
|
|
56
|
+
content: '';
|
|
57
|
+
position: absolute;
|
|
58
|
+
bottom: -12px;
|
|
59
|
+
left: 0;
|
|
60
|
+
width: 64px;
|
|
61
|
+
height: 3px;
|
|
62
|
+
background: ${screenPrimary2};
|
|
63
|
+
}
|
|
64
|
+
`;
|
|
65
|
+
const Paragraph = styled.p `
|
|
66
|
+
margin: 16px 0;
|
|
67
|
+
|
|
68
|
+
:last-child {
|
|
69
|
+
margin-bottom: 0;
|
|
70
|
+
}
|
|
71
|
+
`;
|
|
72
|
+
const List = styled.ul `
|
|
73
|
+
margin: 0 0 48px 0;
|
|
74
|
+
padding: 0;
|
|
75
|
+
list-style: none;
|
|
76
|
+
|
|
77
|
+
li {
|
|
78
|
+
display: flex;
|
|
79
|
+
flex-direction: row;
|
|
80
|
+
align-items: flex-start;
|
|
81
|
+
margin-bottom: 24px;
|
|
82
|
+
}
|
|
83
|
+
`;
|
|
84
|
+
const Bullet = styled.span `
|
|
85
|
+
flex-shrink: 0;
|
|
86
|
+
display: flex;
|
|
87
|
+
align-items: center;
|
|
88
|
+
justify-content: flex-end;
|
|
89
|
+
box-sizing: border-box;
|
|
90
|
+
position: relative;
|
|
91
|
+
width: 32px;
|
|
92
|
+
height: 32px;
|
|
93
|
+
margin: 6px 16px 0 0;
|
|
94
|
+
padding: 0 0 0 0;
|
|
95
|
+
border-radius: 100%;
|
|
96
|
+
font-size: 18px;
|
|
97
|
+
font-weight: 600;
|
|
98
|
+
background: ${screenGrey5};
|
|
99
|
+
color: ${screenGrey3};
|
|
100
|
+
|
|
101
|
+
::after {
|
|
102
|
+
position: absolute;
|
|
103
|
+
content: '';
|
|
104
|
+
width: 6px;
|
|
105
|
+
height: 6px;
|
|
106
|
+
top: 13px;
|
|
107
|
+
left: 13px;
|
|
108
|
+
border-radius: 100%;
|
|
109
|
+
background: ${screenGrey3};
|
|
110
|
+
transform: rotate(0deg);
|
|
111
|
+
}
|
|
112
|
+
`;
|
|
113
|
+
const Link = styled.a `
|
|
114
|
+
color: ${screenGrey1};
|
|
115
|
+
`;
|
|
116
|
+
const Highlight = styled.span `
|
|
117
|
+
padding: 2px 4px;
|
|
118
|
+
border-radius: 2px;
|
|
119
|
+
background: rgba(255, 255, 200, 0.88);
|
|
120
|
+
color: black;
|
|
121
|
+
`;
|
|
122
|
+
const actionLinkHeight = 36;
|
|
123
|
+
const ActionLink = styled.a `
|
|
124
|
+
display: inline-block;
|
|
125
|
+
height: ${actionLinkHeight}px;
|
|
126
|
+
padding: 0 16px;
|
|
127
|
+
background: ${screenPrimary3};
|
|
128
|
+
color: #fff;
|
|
129
|
+
border-radius: 5px;
|
|
130
|
+
font-size: 12px;
|
|
131
|
+
font-weight: 700;
|
|
132
|
+
line-height: ${actionLinkHeight}px;
|
|
133
|
+
text-transform: uppercase;
|
|
134
|
+
letter-spacing: 0.1em;
|
|
135
|
+
text-decoration: none;
|
|
136
|
+
transform: translate3d(0, 0, 0);
|
|
137
|
+
animation: pulse 10s ease-out infinite;
|
|
138
|
+
outline: none;
|
|
139
|
+
|
|
140
|
+
:focus {
|
|
141
|
+
box-shadow: 0 0 0px 2px ${screenPrimary1};
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
::-moz-focus-inner {
|
|
145
|
+
border: 0;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
@keyframes pulse {
|
|
149
|
+
21.25% {
|
|
150
|
+
background: ${screenPrimary3};
|
|
151
|
+
}
|
|
152
|
+
25% {
|
|
153
|
+
background: ${screenPrimary2};
|
|
154
|
+
}
|
|
155
|
+
30% {
|
|
156
|
+
background: ${screenPrimary3};
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
`;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { RootContext } from '../shared.js';
|
|
2
|
+
export declare const WELCOME_DISMISS_STORAGE_KEY = "welcomeDismissedAt";
|
|
3
|
+
export declare function useWelcomeDismiss(context: RootContext): {
|
|
4
|
+
isWelcomeDismissed: () => boolean;
|
|
5
|
+
onDismissWelcome: () => void;
|
|
6
|
+
onShowWelcome: () => void;
|
|
7
|
+
};
|
|
@@ -4,13 +4,15 @@ const SHOW_AGAIN_IN = 90 * 86400 * 1000; // ~3 months
|
|
|
4
4
|
export function useWelcomeDismiss(context) {
|
|
5
5
|
const { getMethodsOf } = context;
|
|
6
6
|
const storage = getMethodsOf('storage');
|
|
7
|
-
const welcomeDismissedAt = storage.getItem(WELCOME_DISMISS_STORAGE_KEY) || 0;
|
|
8
|
-
// Show welcome screen again after a while
|
|
9
|
-
const welcomeDismissed = welcomeDismissedAt > Date.now() - SHOW_AGAIN_IN;
|
|
10
7
|
const onDismissWelcome = React.useCallback(() => storage.setItem(WELCOME_DISMISS_STORAGE_KEY, Date.now()), [storage]);
|
|
11
8
|
const onShowWelcome = React.useCallback(() => storage.setItem(WELCOME_DISMISS_STORAGE_KEY, 0), [storage]);
|
|
9
|
+
function isWelcomeDismissed() {
|
|
10
|
+
const welcomeDismissedAt = storage.getItem(WELCOME_DISMISS_STORAGE_KEY) || 0;
|
|
11
|
+
// Show welcome screen again after a while
|
|
12
|
+
return welcomeDismissedAt > Date.now() - SHOW_AGAIN_IN;
|
|
13
|
+
}
|
|
12
14
|
return {
|
|
13
|
-
|
|
15
|
+
isWelcomeDismissed,
|
|
14
16
|
onDismissWelcome,
|
|
15
17
|
onShowWelcome,
|
|
16
18
|
};
|
|
@@ -9,7 +9,7 @@ type Props = {
|
|
|
9
9
|
rendererActionOrder: string[];
|
|
10
10
|
onOpenNav: () => unknown;
|
|
11
11
|
onTogglePanel: () => unknown;
|
|
12
|
-
|
|
12
|
+
onReloadRenderer: () => unknown;
|
|
13
13
|
onClose: () => unknown;
|
|
14
14
|
};
|
|
15
15
|
export declare const RendererHeader: React.NamedExoticComponent<Props>;
|
|
@@ -6,25 +6,33 @@ import { MenuIcon, RotateCcwIcon, SlidersIcon, XCircleIcon, } from '../../compon
|
|
|
6
6
|
import { FixtureActionSlot } from '../../slots/FixtureActionSlot.js';
|
|
7
7
|
import { RendererActionSlot } from '../../slots/RendererActionSlot.js';
|
|
8
8
|
import { grey176, grey32, white10 } from '../../style/colors.js';
|
|
9
|
-
export const RendererHeader = React.memo(function RendererHeader({ fixtureItems, fixtureId, navOpen, panelOpen, fixtureActionOrder, rendererActionOrder, onOpenNav, onTogglePanel,
|
|
9
|
+
export const RendererHeader = React.memo(function RendererHeader({ fixtureItems, fixtureId, navOpen, panelOpen, fixtureActionOrder, rendererActionOrder, onOpenNav, onTogglePanel, onReloadRenderer, onClose, }) {
|
|
10
10
|
const fixtureItem = findFixtureItemById(fixtureItems, fixtureId);
|
|
11
11
|
const slotProps = React.useMemo(() => ({ fixtureId }), [fixtureId]);
|
|
12
|
-
const onReload = React.useCallback(() => onFixtureSelect(fixtureId), [fixtureId, onFixtureSelect]);
|
|
13
12
|
return (React.createElement(Container, null,
|
|
14
13
|
React.createElement(Left, null,
|
|
15
14
|
!navOpen && (React.createElement(React.Fragment, null,
|
|
16
15
|
React.createElement(IconButton32, { icon: React.createElement(MenuIcon, null), title: "Show fixture list", selected: false, onClick: onOpenNav }),
|
|
17
16
|
React.createElement(ButtonSeparator, null))),
|
|
18
17
|
React.createElement(IconButton32, { icon: React.createElement(XCircleIcon, null), title: "Close fixture", onClick: onClose }),
|
|
19
|
-
React.createElement(IconButton32, { icon: React.createElement(RotateCcwIcon, null), title: "Reload fixture", onClick:
|
|
20
|
-
React.createElement(
|
|
18
|
+
React.createElement(IconButton32, { icon: React.createElement(RotateCcwIcon, null), title: "Reload fixture", onClick: onReloadRenderer }),
|
|
19
|
+
fixtureItem && (React.createElement(FixtureActionSlotContainer, { fixtureActionOrder: fixtureActionOrder, fixtureItem: fixtureItem }))),
|
|
21
20
|
fixtureItem && React.createElement(FixtureName, null, getFixtureName(fixtureItem)),
|
|
22
21
|
React.createElement(Right, null,
|
|
23
22
|
React.createElement(RendererActionSlot, { slotProps: slotProps, plugOrder: rendererActionOrder }),
|
|
24
23
|
React.createElement(IconButton32, { icon: React.createElement(SlidersIcon, null), title: "Toggle control panel", selected: panelOpen, onClick: onTogglePanel }))));
|
|
25
24
|
});
|
|
25
|
+
function FixtureActionSlotContainer({ fixtureActionOrder, fixtureItem, }) {
|
|
26
|
+
const slotProps = React.useMemo(() => ({ fixtureItem }), [fixtureItem]);
|
|
27
|
+
return (React.createElement(FixtureActionSlot, { slotProps: slotProps, plugOrder: fixtureActionOrder }));
|
|
28
|
+
}
|
|
26
29
|
function findFixtureItemById(fixtureItems, fixtureId) {
|
|
27
|
-
|
|
30
|
+
if (fixtureId.name) {
|
|
31
|
+
return fixtureItems.find(fixtureItem => isEqual(fixtureItem.fixtureId, fixtureId));
|
|
32
|
+
}
|
|
33
|
+
// When a multi fixture is selected by path only, the first of its named
|
|
34
|
+
// fixtures will be selected.
|
|
35
|
+
return fixtureItems.find(fixtureItem => fixtureItem.fixtureId.path === fixtureId.path);
|
|
28
36
|
}
|
|
29
37
|
function getFixtureName({ name, fileName }) {
|
|
30
38
|
return name ? `${fileName} ${name}` : fileName;
|