@remotion/studio 4.0.179 → 4.0.180
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/.turbo/turbo-build.log +1 -1
- package/dist/components/InitialCompositionLoader.js +3 -3
- package/dist/components/NewComposition/RemInput.d.ts +1 -1
- package/dist/components/PreviewToolbar.js +2 -1
- package/dist/components/ZoomPersistor.d.ts +0 -2
- package/dist/components/ZoomPersistor.js +3 -27
- package/dist/components/load-canvas-content-from-url.d.ts +2 -0
- package/dist/components/load-canvas-content-from-url.js +30 -0
- package/dist/esm/internals.mjs +25 -17
- package/dist/helpers/check-fullscreen-support.d.ts +1 -0
- package/dist/helpers/check-fullscreen-support.js +9 -0
- package/dist/helpers/checkerboard-background.d.ts +1 -1
- package/dist/helpers/colors.d.ts +1 -1
- package/dist/helpers/use-menu-structure.js +2 -1
- package/package.json +7 -7
- package/tsconfig.tsbuildinfo +1 -1
package/.turbo/turbo-build.log
CHANGED
|
@@ -10,7 +10,7 @@ const folders_1 = require("../state/folders");
|
|
|
10
10
|
const sidebar_1 = require("../state/sidebar");
|
|
11
11
|
const CompositionSelector_1 = require("./CompositionSelector");
|
|
12
12
|
const ExplorerPanel_1 = require("./ExplorerPanel");
|
|
13
|
-
const
|
|
13
|
+
const load_canvas_content_from_url_1 = require("./load-canvas-content-from-url");
|
|
14
14
|
const useSelectAsset = () => {
|
|
15
15
|
const { setCanvasContent } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
|
|
16
16
|
const { setAssetFoldersExpanded } = (0, react_1.useContext)(folders_1.FolderContext);
|
|
@@ -73,7 +73,7 @@ const InitialCompositionLoader = () => {
|
|
|
73
73
|
if (canvasContent) {
|
|
74
74
|
return;
|
|
75
75
|
}
|
|
76
|
-
const canvasContentFromUrl = (0,
|
|
76
|
+
const canvasContentFromUrl = (0, load_canvas_content_from_url_1.deriveCanvasContentFromUrl)();
|
|
77
77
|
if (canvasContentFromUrl && canvasContentFromUrl.type === 'composition') {
|
|
78
78
|
const exists = compositions.find((c) => c.id === canvasContentFromUrl.compositionId);
|
|
79
79
|
if (exists) {
|
|
@@ -101,7 +101,7 @@ const InitialCompositionLoader = () => {
|
|
|
101
101
|
]);
|
|
102
102
|
(0, react_1.useEffect)(() => {
|
|
103
103
|
const onchange = () => {
|
|
104
|
-
const newCanvas = (0,
|
|
104
|
+
const newCanvas = (0, load_canvas_content_from_url_1.deriveCanvasContentFromUrl)();
|
|
105
105
|
if (newCanvas && newCanvas.type === 'composition') {
|
|
106
106
|
const newComp = (0, url_state_1.getRoute)().substring(1);
|
|
107
107
|
const exists = compositions.find((c) => c.id === newComp);
|
|
@@ -12,6 +12,6 @@ export declare const getInputBorderColor: ({ status, isFocused, isHovered, }: {
|
|
|
12
12
|
status: 'error' | 'warning' | 'ok';
|
|
13
13
|
isFocused: boolean;
|
|
14
14
|
isHovered: boolean;
|
|
15
|
-
}) => "
|
|
15
|
+
}) => "rgba(255, 255, 255, 0.05)" | "rgba(0, 0, 0, 0.6)" | "hsla(0, 0%, 100%, 0.15)" | "#ff3232" | "#f1c40f";
|
|
16
16
|
export declare const RemotionInput: React.ForwardRefExoticComponent<Omit<Props, "ref"> & React.RefAttributes<HTMLInputElement>>;
|
|
17
17
|
export {};
|
|
@@ -4,6 +4,7 @@ exports.PreviewToolbar = void 0;
|
|
|
4
4
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
5
|
const react_1 = require("react");
|
|
6
6
|
const remotion_1 = require("remotion");
|
|
7
|
+
const check_fullscreen_support_1 = require("../helpers/check-fullscreen-support");
|
|
7
8
|
const colors_1 = require("../helpers/colors");
|
|
8
9
|
const is_current_selected_still_1 = require("../helpers/is-current-selected-still");
|
|
9
10
|
const timeline_layout_1 = require("../helpers/timeline-layout");
|
|
@@ -49,7 +50,7 @@ const PreviewToolbar = ({ readOnlyStudio, bufferStateDelayInMilliseconds }) => {
|
|
|
49
50
|
const isVideoComposition = (0, is_current_selected_still_1.useIsVideoComposition)();
|
|
50
51
|
const isStill = (0, is_current_selected_still_1.useIsStill)();
|
|
51
52
|
const [loop, setLoop] = (0, react_1.useState)((0, loop_1.loadLoopOption)());
|
|
52
|
-
const isFullscreenSupported =
|
|
53
|
+
const isFullscreenSupported = (0, check_fullscreen_support_1.checkFullscreenSupport)();
|
|
53
54
|
return ((0, jsx_runtime_1.jsxs)("div", { style: container, className: "css-reset", children: [(0, jsx_runtime_1.jsxs)("div", { style: sideContainer, children: [(0, jsx_runtime_1.jsx)("div", { style: padding }), (0, jsx_runtime_1.jsx)(TimelineZoomControls_1.TimelineZoomControls, {})] }), (0, jsx_runtime_1.jsx)(layout_1.Flex, {}), (0, jsx_runtime_1.jsx)(SizeSelector_1.SizeSelector, {}), isStill || isVideoComposition ? ((0, jsx_runtime_1.jsx)(PlaybackRateSelector_1.PlaybackRateSelector, { setPlaybackRate: setPlaybackRate, playbackRate: playbackRate })) : null, isVideoComposition ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 2 }), (0, jsx_runtime_1.jsx)(PlayPause_1.PlayPause, { bufferStateDelayInMilliseconds: bufferStateDelayInMilliseconds, loop: loop, playbackRate: playbackRate }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 2 }), (0, jsx_runtime_1.jsx)(LoopToggle_1.LoopToggle, { loop: loop, setLoop: setLoop }), (0, jsx_runtime_1.jsx)(MuteToggle_1.MuteToggle, { muted: mediaMuted, setMuted: setMediaMuted }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 2 }), (0, jsx_runtime_1.jsx)(TimelineInOutToggle_1.TimelineInOutPointToggle, {}), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 2 })] })) : null, (0, jsx_runtime_1.jsx)(CheckboardToggle_1.CheckboardToggle, {}), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 1 }), isFullscreenSupported && (0, jsx_runtime_1.jsx)(FullscreenToggle_1.FullScreenToggle, {}), (0, jsx_runtime_1.jsx)(layout_1.Flex, {}), (0, jsx_runtime_1.jsxs)("div", { style: sideContainer, children: [(0, jsx_runtime_1.jsx)(layout_1.Flex, {}), (0, jsx_runtime_1.jsx)(FpsCounter_1.FpsCounter, { playbackSpeed: playbackRate }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 2 }), readOnlyStudio ? null : (0, jsx_runtime_1.jsx)(RenderButton_1.RenderButton, {}), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 1.5 })] }), (0, jsx_runtime_1.jsx)(PlaybackKeyboardShortcutsManager_1.PlaybackKeyboardShortcutsManager, { setPlaybackRate: setPlaybackRate }), (0, jsx_runtime_1.jsx)(PlaybackRatePersistor_1.PlaybackRatePersistor, {})] }));
|
|
54
55
|
};
|
|
55
56
|
exports.PreviewToolbar = PreviewToolbar;
|
|
@@ -1,5 +1,3 @@
|
|
|
1
1
|
import type React from 'react';
|
|
2
|
-
import type { CanvasContent } from 'remotion';
|
|
3
2
|
export declare const getZoomFromLocalStorage: () => Record<string, number>;
|
|
4
|
-
export declare const deriveCanvasContentFromUrl: () => CanvasContent | null;
|
|
5
3
|
export declare const ZoomPersistor: React.FC;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ZoomPersistor = exports.
|
|
3
|
+
exports.ZoomPersistor = exports.getZoomFromLocalStorage = void 0;
|
|
4
4
|
const react_1 = require("react");
|
|
5
5
|
const remotion_1 = require("remotion");
|
|
6
|
-
const url_state_1 = require("../helpers/url-state");
|
|
7
6
|
const timeline_zoom_1 = require("../state/timeline-zoom");
|
|
7
|
+
const load_canvas_content_from_url_1 = require("./load-canvas-content-from-url");
|
|
8
8
|
const makeKey = () => {
|
|
9
9
|
return `remotion.zoom-map`;
|
|
10
10
|
};
|
|
@@ -16,35 +16,11 @@ const getZoomFromLocalStorage = () => {
|
|
|
16
16
|
return zoom ? JSON.parse(zoom) : {};
|
|
17
17
|
};
|
|
18
18
|
exports.getZoomFromLocalStorage = getZoomFromLocalStorage;
|
|
19
|
-
const deriveCanvasContentFromUrl = () => {
|
|
20
|
-
const substrings = (0, url_state_1.getRoute)().split('/').filter(Boolean);
|
|
21
|
-
const lastPart = substrings[substrings.length - 1];
|
|
22
|
-
if (substrings[0] === 'assets') {
|
|
23
|
-
return {
|
|
24
|
-
type: 'asset',
|
|
25
|
-
asset: decodeURIComponent((0, url_state_1.getRoute)().substring('/assets/'.length)),
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
if (substrings[0] === 'outputs') {
|
|
29
|
-
return {
|
|
30
|
-
type: 'output',
|
|
31
|
-
path: decodeURIComponent((0, url_state_1.getRoute)().substring('/outputs/'.length)),
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
if (lastPart) {
|
|
35
|
-
return {
|
|
36
|
-
type: 'composition',
|
|
37
|
-
compositionId: lastPart,
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
return null;
|
|
41
|
-
};
|
|
42
|
-
exports.deriveCanvasContentFromUrl = deriveCanvasContentFromUrl;
|
|
43
19
|
const ZoomPersistor = () => {
|
|
44
20
|
const [playing] = remotion_1.Internals.Timeline.usePlayingState();
|
|
45
21
|
const { zoom } = (0, react_1.useContext)(timeline_zoom_1.TimelineZoomCtx);
|
|
46
22
|
const { canvasContent } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
|
|
47
|
-
const urlState = (0,
|
|
23
|
+
const urlState = (0, load_canvas_content_from_url_1.deriveCanvasContentFromUrl)();
|
|
48
24
|
const isActive = urlState &&
|
|
49
25
|
urlState.type === 'composition' &&
|
|
50
26
|
canvasContent &&
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.deriveCanvasContentFromUrl = void 0;
|
|
4
|
+
const url_state_1 = require("../helpers/url-state");
|
|
5
|
+
const deriveCanvasContentFromUrl = () => {
|
|
6
|
+
const route = (0, url_state_1.getRoute)();
|
|
7
|
+
const substrings = route.split('/').filter(Boolean);
|
|
8
|
+
// CJK-named composition IDs are not automatically reselected after page refresh
|
|
9
|
+
const lastPart = substrings[substrings.length - 1];
|
|
10
|
+
if (substrings[0] === 'assets') {
|
|
11
|
+
return {
|
|
12
|
+
type: 'asset',
|
|
13
|
+
asset: decodeURIComponent(route.substring('/assets/'.length)),
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
if (substrings[0] === 'outputs') {
|
|
17
|
+
return {
|
|
18
|
+
type: 'output',
|
|
19
|
+
path: decodeURIComponent(route.substring('/outputs/'.length)),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
if (lastPart) {
|
|
23
|
+
return {
|
|
24
|
+
type: 'composition',
|
|
25
|
+
compositionId: decodeURIComponent(lastPart),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
return null;
|
|
29
|
+
};
|
|
30
|
+
exports.deriveCanvasContentFromUrl = deriveCanvasContentFromUrl;
|
package/dist/esm/internals.mjs
CHANGED
|
@@ -498,40 +498,43 @@ var getRoute = () => {
|
|
|
498
498
|
return window.location.pathname;
|
|
499
499
|
};
|
|
500
500
|
|
|
501
|
-
// src/components/
|
|
502
|
-
var makeKey = () => {
|
|
503
|
-
return `remotion.zoom-map`;
|
|
504
|
-
};
|
|
505
|
-
var persistCurrentZoom = (zoom) => {
|
|
506
|
-
localStorage.setItem(makeKey(), JSON.stringify(zoom));
|
|
507
|
-
};
|
|
508
|
-
var getZoomFromLocalStorage = () => {
|
|
509
|
-
const zoom = localStorage.getItem(makeKey());
|
|
510
|
-
return zoom ? JSON.parse(zoom) : {};
|
|
511
|
-
};
|
|
501
|
+
// src/components/load-canvas-content-from-url.ts
|
|
512
502
|
var deriveCanvasContentFromUrl = () => {
|
|
513
|
-
const
|
|
503
|
+
const route = getRoute();
|
|
504
|
+
const substrings = route.split("/").filter(Boolean);
|
|
514
505
|
const lastPart = substrings[substrings.length - 1];
|
|
515
506
|
if (substrings[0] === "assets") {
|
|
516
507
|
return {
|
|
517
508
|
type: "asset",
|
|
518
|
-
asset: decodeURIComponent(
|
|
509
|
+
asset: decodeURIComponent(route.substring("/assets/".length))
|
|
519
510
|
};
|
|
520
511
|
}
|
|
521
512
|
if (substrings[0] === "outputs") {
|
|
522
513
|
return {
|
|
523
514
|
type: "output",
|
|
524
|
-
path: decodeURIComponent(
|
|
515
|
+
path: decodeURIComponent(route.substring("/outputs/".length))
|
|
525
516
|
};
|
|
526
517
|
}
|
|
527
518
|
if (lastPart) {
|
|
528
519
|
return {
|
|
529
520
|
type: "composition",
|
|
530
|
-
compositionId: lastPart
|
|
521
|
+
compositionId: decodeURIComponent(lastPart)
|
|
531
522
|
};
|
|
532
523
|
}
|
|
533
524
|
return null;
|
|
534
525
|
};
|
|
526
|
+
|
|
527
|
+
// src/components/ZoomPersistor.tsx
|
|
528
|
+
var makeKey = () => {
|
|
529
|
+
return `remotion.zoom-map`;
|
|
530
|
+
};
|
|
531
|
+
var persistCurrentZoom = (zoom) => {
|
|
532
|
+
localStorage.setItem(makeKey(), JSON.stringify(zoom));
|
|
533
|
+
};
|
|
534
|
+
var getZoomFromLocalStorage = () => {
|
|
535
|
+
const zoom = localStorage.getItem(makeKey());
|
|
536
|
+
return zoom ? JSON.parse(zoom) : {};
|
|
537
|
+
};
|
|
535
538
|
var ZoomPersistor = () => {
|
|
536
539
|
const [playing] = Internals2.Timeline.usePlayingState();
|
|
537
540
|
const { zoom } = useContext2(TimelineZoomCtx);
|
|
@@ -6042,6 +6045,11 @@ var EditorZoomGesturesContext = createContext13({
|
|
|
6042
6045
|
}
|
|
6043
6046
|
});
|
|
6044
6047
|
|
|
6048
|
+
// src/helpers/check-fullscreen-support.ts
|
|
6049
|
+
var checkFullscreenSupport = () => {
|
|
6050
|
+
return document.fullscreenEnabled || document.webkitFullscreenEnabled;
|
|
6051
|
+
};
|
|
6052
|
+
|
|
6045
6053
|
// src/helpers/get-git-menu-item.ts
|
|
6046
6054
|
var getGitSourceName = (gitSource) => {
|
|
6047
6055
|
if (gitSource.type === "github") {
|
|
@@ -6258,7 +6266,7 @@ var useMenuStructure = (closeMenu, readOnlyStudio) => {
|
|
|
6258
6266
|
sidebarCollapsedStateRight
|
|
6259
6267
|
} = useContext18(SidebarContext);
|
|
6260
6268
|
const sizes = getUniqueSizes(size);
|
|
6261
|
-
const isFullscreenSupported =
|
|
6269
|
+
const isFullscreenSupported = checkFullscreenSupport();
|
|
6262
6270
|
const mobileLayout = useMobileLayout();
|
|
6263
6271
|
const structure = useMemo36(() => {
|
|
6264
6272
|
let struct = [
|
|
@@ -16856,7 +16864,7 @@ var PreviewToolbar = ({ readOnlyStudio, bufferStateDelayInMilliseconds }) => {
|
|
|
16856
16864
|
const isVideoComposition = useIsVideoComposition();
|
|
16857
16865
|
const isStill = useIsStill();
|
|
16858
16866
|
const [loop3, setLoop] = useState50(loadLoopOption());
|
|
16859
|
-
const isFullscreenSupported =
|
|
16867
|
+
const isFullscreenSupported = checkFullscreenSupport();
|
|
16860
16868
|
return jsxs76("div", {
|
|
16861
16869
|
style: container31,
|
|
16862
16870
|
className: "css-reset",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const checkFullscreenSupport: () => any;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.checkFullscreenSupport = void 0;
|
|
4
|
+
const checkFullscreenSupport = () => {
|
|
5
|
+
return (document.fullscreenEnabled ||
|
|
6
|
+
// @ts-expect-error Types not defined
|
|
7
|
+
document.webkitFullscreenEnabled);
|
|
8
|
+
};
|
|
9
|
+
exports.checkFullscreenSupport = checkFullscreenSupport;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export declare const getCheckerboardBackgroundSize: (size: number) => string;
|
|
2
2
|
export declare const getCheckerboardBackgroundPos: (size: number) => string;
|
|
3
|
-
export declare const checkerboardBackgroundColor: (checkerboard: boolean) => "
|
|
3
|
+
export declare const checkerboardBackgroundColor: (checkerboard: boolean) => "black" | "white";
|
|
4
4
|
export declare const checkerboardBackgroundImage: (checkerboard: boolean) => "\n linear-gradient(\n 45deg,\n rgba(0, 0, 0, 0.1) 25%,\n transparent 25%\n ),\n linear-gradient(135deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%),\n linear-gradient(45deg, transparent 75%, rgba(0, 0, 0, 0.1) 75%),\n linear-gradient(135deg, transparent 75%, rgba(0, 0, 0, 0.1) 75%)\n " | undefined;
|
package/dist/helpers/colors.d.ts
CHANGED
|
@@ -23,4 +23,4 @@ export declare const TIMELINE_TRACK_SEPARATOR = "rgba(0, 0, 0, 0.3)";
|
|
|
23
23
|
export declare const getBackgroundFromHoverState: ({ selected, hovered, }: {
|
|
24
24
|
selected: boolean;
|
|
25
25
|
hovered: boolean;
|
|
26
|
-
}) => "transparent" | "hsla(0, 0%, 100%, 0.
|
|
26
|
+
}) => "transparent" | "hsla(0, 0%, 100%, 0.15)" | "rgba(255, 255, 255, 0.06)" | "hsla(0, 0%, 100%, 0.25)";
|
|
@@ -19,6 +19,7 @@ const editor_rulers_1 = require("../state/editor-rulers");
|
|
|
19
19
|
const editor_zoom_gestures_1 = require("../state/editor-zoom-gestures");
|
|
20
20
|
const modals_1 = require("../state/modals");
|
|
21
21
|
const sidebar_1 = require("../state/sidebar");
|
|
22
|
+
const check_fullscreen_support_1 = require("./check-fullscreen-support");
|
|
22
23
|
const client_id_1 = require("./client-id");
|
|
23
24
|
const get_git_menu_item_1 = require("./get-git-menu-item");
|
|
24
25
|
const mobile_layout_1 = require("./mobile-layout");
|
|
@@ -116,7 +117,7 @@ const useMenuStructure = (closeMenu, readOnlyStudio) => {
|
|
|
116
117
|
const { type } = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx).previewServerState;
|
|
117
118
|
const { setSidebarCollapsedState, sidebarCollapsedStateLeft, sidebarCollapsedStateRight, } = (0, react_1.useContext)(sidebar_1.SidebarContext);
|
|
118
119
|
const sizes = (0, SizeSelector_1.getUniqueSizes)(size);
|
|
119
|
-
const isFullscreenSupported =
|
|
120
|
+
const isFullscreenSupported = (0, check_fullscreen_support_1.checkFullscreenSupport)();
|
|
120
121
|
const mobileLayout = (0, mobile_layout_1.useMobileLayout)();
|
|
121
122
|
const structure = (0, react_1.useMemo)(() => {
|
|
122
123
|
let struct = [
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"url": "https://github.com/remotion-dev/remotion/tree/main/packages/studio"
|
|
4
4
|
},
|
|
5
5
|
"name": "@remotion/studio",
|
|
6
|
-
"version": "4.0.
|
|
6
|
+
"version": "4.0.180",
|
|
7
7
|
"description": "APIs for interacting with the Remotion Studio",
|
|
8
8
|
"main": "dist",
|
|
9
9
|
"sideEffects": false,
|
|
@@ -18,18 +18,18 @@
|
|
|
18
18
|
"memfs": "3.4.3",
|
|
19
19
|
"source-map": "0.7.3",
|
|
20
20
|
"open": "^8.4.2",
|
|
21
|
-
"remotion": "4.0.
|
|
22
|
-
"@remotion/
|
|
23
|
-
"@remotion/player": "4.0.
|
|
24
|
-
"@remotion/
|
|
25
|
-
"@remotion/
|
|
21
|
+
"remotion": "4.0.180",
|
|
22
|
+
"@remotion/media-utils": "4.0.180",
|
|
23
|
+
"@remotion/player": "4.0.180",
|
|
24
|
+
"@remotion/studio-shared": "4.0.180",
|
|
25
|
+
"@remotion/renderer": "4.0.180"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"react": "18.3.1",
|
|
29
29
|
"react-dom": "18.3.1",
|
|
30
30
|
"@types/semver": "^7.3.4",
|
|
31
31
|
"zod": "3.22.3",
|
|
32
|
-
"@remotion/zod-types": "4.0.
|
|
32
|
+
"@remotion/zod-types": "4.0.180"
|
|
33
33
|
},
|
|
34
34
|
"publishConfig": {
|
|
35
35
|
"access": "public"
|