Skip to content

Commit 0235309

Browse files
committed
Change preview button to a switch
1 parent bff26b7 commit 0235309

File tree

10 files changed

+165
-57
lines changed

10 files changed

+165
-57
lines changed

packages/base/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
"@radix-ui/react-dropdown-menu": "^2.1.15",
6969
"@radix-ui/react-popover": "^1.1.14",
7070
"@radix-ui/react-slot": "^1.2.3",
71+
"@radix-ui/react-switch": "^1.2.6",
7172
"@radix-ui/react-tabs": "^1.1.12",
7273
"@radix-ui/react-toggle-group": "^1.1.10",
7374
"@rjsf/core": "^4.2.0",

packages/base/src/formbuilder/objectform/StoryForm.tsx

Lines changed: 0 additions & 35 deletions
This file was deleted.
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import * as React from 'react';
2+
3+
import { Switch } from '@/src/shared/components/Switch';
4+
5+
interface IPreviewModeSwitchProps {
6+
checked: boolean;
7+
onCheckedChange: () => void;
8+
}
9+
10+
export function PreviewModeSwitch({
11+
checked,
12+
onCheckedChange,
13+
}: IPreviewModeSwitchProps) {
14+
return (
15+
<div
16+
style={{
17+
display: 'flex',
18+
alignItems: 'center',
19+
gap: '0.5rem',
20+
padding: '1rem',
21+
}}
22+
>
23+
<label htmlFor="preview-mode-switch" style={{ fontSize: '0.875rem' }}>
24+
Preview Mode
25+
</label>
26+
<Switch
27+
id="preview-mode-switch"
28+
checked={checked}
29+
onCheckedChange={onCheckedChange}
30+
/>
31+
</div>
32+
);
33+
}

packages/base/src/panelview/components/story-maps/StoryEditorPanel.tsx

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,17 @@ import { IJGISStoryMap, IJupyterGISModel } from '@jupytergis/schema';
22
import jgisSchema from '@jupytergis/schema/lib/schema/project/jgis.json';
33
import React, { useMemo } from 'react';
44

5-
import { StoryEditorForm } from '@/src/formbuilder/objectform/StoryForm';
5+
import { BaseForm } from '@/src/formbuilder';
66
import { deepCopy } from '@/src/tools';
77
import { IDict } from '@/src/types';
88

99
interface IStoryPanelProps {
1010
model: IJupyterGISModel;
11-
togglePreview: () => void;
1211
}
1312

1413
const storyMapSchema: IDict = deepCopy(jgisSchema.definitions.jGISStoryMap);
1514

16-
export function StoryEditorPanel({ model, togglePreview }: IStoryPanelProps) {
15+
export function StoryEditorPanel({ model }: IStoryPanelProps) {
1716
const { landmarkId, story } = useMemo(() => {
1817
return model.getSelectedStory();
1918
}, [model, model.sharedModel.storiesMap]);
@@ -24,23 +23,21 @@ export function StoryEditorPanel({ model, togglePreview }: IStoryPanelProps) {
2423

2524
if (!story) {
2625
return (
27-
<div style={{ padding: '10px' }}>
26+
<div style={{ padding: '0 0.5rem 0.5rem 0.5rem' }}>
2827
<p>No story map available. Create one by adding a landmark.</p>
2928
</div>
3029
);
3130
}
3231

3332
return (
34-
<div style={{ padding: '10px' }}>
35-
<h3>Story Map Properties</h3>
36-
<StoryEditorForm
33+
<div style={{ padding: '0 0.5rem 0.5rem 0.5rem' }}>
34+
<BaseForm
3735
formContext="update"
3836
sourceData={story}
3937
model={model}
4038
schema={storyMapSchema}
4139
syncData={syncStoryData}
4240
filePath={model.filePath}
43-
togglePreview={togglePreview}
4441
/>
4542
</div>
4643
);

packages/base/src/panelview/components/story-maps/StoryViewerPanel.tsx

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { Button } from '@jupyter/react-components';
21
import {
32
IJGISLayer,
43
IJGISStoryMap,
@@ -11,10 +10,9 @@ import StoryNavBar from './StoryNavBar';
1110

1211
interface IStoryViewerPanelProps {
1312
model: IJupyterGISModel;
14-
togglePreview: () => void;
1513
}
1614

17-
function StoryViewerPanel({ model, togglePreview }: IStoryViewerPanelProps) {
15+
function StoryViewerPanel({ model }: IStoryViewerPanelProps) {
1816
const [currentIndexDisplayed, setCurrentIndexDisplayed] = useState(0);
1917
const [storyData, setStoryData] = useState<IJGISStoryMap | null>(null);
2018

@@ -200,7 +198,6 @@ function StoryViewerPanel({ model, togglePreview }: IStoryViewerPanelProps) {
200198
hasNext={currentIndexDisplayed < landmarks.length - 1}
201199
/>
202200
)}
203-
<Button onClick={togglePreview}>Edit Story</Button>
204201
</div>
205202
);
206203
}

packages/base/src/panelview/rightpanel.tsx

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,16 @@ import * as React from 'react';
88

99
import { AnnotationsPanel } from './annotationPanel';
1010
import { IdentifyPanelComponent } from './components/identify-panel/IdentifyPanel';
11+
import { PreviewModeSwitch } from './components/story-maps/PreviewModeSwitch';
12+
import StoryEditorPanel from './components/story-maps/StoryEditorPanel';
13+
import StoryViewerPanel from './components/story-maps/StoryViewerPanel';
1114
import { ObjectPropertiesReact } from './objectproperties';
1215
import {
1316
PanelTabs,
1417
TabsContent,
1518
TabsList,
1619
TabsTrigger,
1720
} from '../shared/components/Tabs';
18-
import StoryEditorPanel from './components/story-maps/StoryEditorPanel';
19-
import StoryViewerPanel from './components/story-maps/StoryViewerPanel';
2021

2122
interface IRightPanelProps {
2223
formSchemaRegistry: IJGISFormSchemaRegistry;
@@ -141,16 +142,16 @@ export const RightPanel: React.FC<IRightPanelProps> = props => {
141142
className="jgis-panel-tab-content"
142143
style={{ paddingTop: 0 }}
143144
>
144-
{settings.storyMapPresentation || !displayEditor ? (
145-
<StoryViewerPanel
146-
model={props.model}
147-
togglePreview={toggleEditor}
145+
{!settings.storyMapPresentation && (
146+
<PreviewModeSwitch
147+
checked={!displayEditor}
148+
onCheckedChange={toggleEditor}
148149
/>
150+
)}
151+
{settings.storyMapPresentation || !displayEditor ? (
152+
<StoryViewerPanel model={props.model} />
149153
) : (
150-
<StoryEditorPanel
151-
model={props.model}
152-
togglePreview={toggleEditor}
153-
/>
154+
<StoryEditorPanel model={props.model} />
154155
)}
155156
</TabsContent>
156157

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import * as SwitchPrimitive from '@radix-ui/react-switch';
2+
import * as React from 'react';
3+
4+
import { cn } from './utils';
5+
6+
function Switch({
7+
className,
8+
...props
9+
}: React.ComponentProps<typeof SwitchPrimitive.Root>) {
10+
return (
11+
<SwitchPrimitive.Root
12+
data-slot="switch"
13+
className={cn('jgis-switch', className)}
14+
{...props}
15+
>
16+
<SwitchPrimitive.Thumb
17+
data-slot="switch-thumb"
18+
className="jgis-switch-thumb"
19+
/>
20+
</SwitchPrimitive.Root>
21+
);
22+
}
23+
24+
export { Switch };

packages/base/style/base.css

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
@import url('./shared/dropdownMenu.css');
2222
@import url('./shared/badge.css');
2323
@import url('./shared/checkbox.css');
24+
@import url('./shared/switch.css');
2425

2526
.errors {
2627
color: var(--jp-warn-color0);
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
.jgis-switch {
2+
display: inline-flex;
3+
height: 1.15rem;
4+
width: 2rem;
5+
flex-shrink: 0;
6+
align-items: center;
7+
border-radius: 9999px !important;
8+
border: 1px solid transparent;
9+
/* border: 1px solid var(--jp-brand-color3); */
10+
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
11+
transition: all 150ms cubic-bezier(0.4, 0, 0.2, 1);
12+
outline: none;
13+
cursor: pointer;
14+
}
15+
16+
.jgis-switch:focus-visible {
17+
border-color: var(--jp-border-color0);
18+
box-shadow: 0 0 0 3px
19+
color-mix(in srgb, var(--jp-ui-font-color0), transparent 50%);
20+
}
21+
22+
.jgis-switch:disabled {
23+
cursor: not-allowed;
24+
opacity: 0.5;
25+
}
26+
27+
.jgis-switch[data-state='checked'] {
28+
background-color: var(--jp-accent-color0);
29+
}
30+
31+
.jgis-switch[data-state='unchecked'] {
32+
background-color: var(--jp-layout-color2);
33+
}
34+
35+
.jgis-switch-thumb {
36+
background-color: var(--jp-layout-color1);
37+
pointer-events: none;
38+
display: block;
39+
width: 1rem;
40+
height: 1rem;
41+
border-radius: 9999px;
42+
box-shadow: none;
43+
transition: transform 150ms cubic-bezier(0.4, 0, 0.2, 1);
44+
transform: translateX(0);
45+
}
46+
47+
.jgis-switch-thumb[data-state='checked'] {
48+
transform: translateX(calc(100% - 6px));
49+
}
50+
51+
.jgis-switch-thumb[data-state='unchecked'] {
52+
transform: translateX(-2px);
53+
}
54+
55+
@media (prefers-color-scheme: dark) {
56+
.jgis-switch-thumb[data-state='unchecked'] {
57+
background-color: var(--jp-ui-font-color0);
58+
}
59+
60+
.jgis-switch-thumb[data-state='checked'] {
61+
background-color: var(--jp-layout-color1);
62+
}
63+
}

yarn.lock

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -899,6 +899,7 @@ __metadata:
899899
"@radix-ui/react-dropdown-menu": ^2.1.15
900900
"@radix-ui/react-popover": ^1.1.14
901901
"@radix-ui/react-slot": ^1.2.3
902+
"@radix-ui/react-switch": ^1.2.6
902903
"@radix-ui/react-tabs": ^1.1.12
903904
"@radix-ui/react-toggle-group": ^1.1.10
904905
"@rjsf/core": ^4.2.0
@@ -3138,6 +3139,31 @@ __metadata:
31383139
languageName: node
31393140
linkType: hard
31403141

3142+
"@radix-ui/react-switch@npm:^1.2.6":
3143+
version: 1.2.6
3144+
resolution: "@radix-ui/react-switch@npm:1.2.6"
3145+
dependencies:
3146+
"@radix-ui/primitive": 1.1.3
3147+
"@radix-ui/react-compose-refs": 1.1.2
3148+
"@radix-ui/react-context": 1.1.2
3149+
"@radix-ui/react-primitive": 2.1.3
3150+
"@radix-ui/react-use-controllable-state": 1.2.2
3151+
"@radix-ui/react-use-previous": 1.1.1
3152+
"@radix-ui/react-use-size": 1.1.1
3153+
peerDependencies:
3154+
"@types/react": "*"
3155+
"@types/react-dom": "*"
3156+
react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
3157+
react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
3158+
peerDependenciesMeta:
3159+
"@types/react":
3160+
optional: true
3161+
"@types/react-dom":
3162+
optional: true
3163+
checksum: 737ebe7cd5544455411e8a606980e4491281fb38a829eb08a4505251f51c32dcae0b9f13b9ab0b574980d4e228e352b1613971f0b2a516d0fe2eefe2bb318231
3164+
languageName: node
3165+
linkType: hard
3166+
31413167
"@radix-ui/react-tabs@npm:^1.1.12":
31423168
version: 1.1.13
31433169
resolution: "@radix-ui/react-tabs@npm:1.1.13"

0 commit comments

Comments
 (0)