Skip to content

Commit 5bf00b7

Browse files
pngwngradio-pr-bot
andauthored
make all component SSR compatible (gradio-app#9187)
* asd * fixes * make all components ssr compatible * remove files * add changeset * add changeset * review * format * clean * address comments * tweaks utils * add changeset * fix plot and audio * format * fix nativeplot --------- Co-authored-by: gradio-pr-bot <[email protected]>
1 parent 5f2e047 commit 5bf00b7

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+9497
-488
lines changed

.changeset/itchy-goats-kiss.md

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
---
2+
"@gradio/annotatedimage": patch
3+
"@gradio/audio": patch
4+
"@gradio/chatbot": patch
5+
"@gradio/code": patch
6+
"@gradio/dataframe": patch
7+
"@gradio/dataset": patch
8+
"@gradio/dropdown": patch
9+
"@gradio/file": patch
10+
"@gradio/imageeditor": patch
11+
"@gradio/markdown": patch
12+
"@gradio/model3d": patch
13+
"@gradio/nativeplot": patch
14+
"@gradio/paramviewer": patch
15+
"@gradio/utils": patch
16+
"@gradio/wasm": patch
17+
"@self/component-test": patch
18+
"gradio": patch
19+
---
20+
21+
feat:make all component SSR compatible

js/annotatedimage/Index.svelte

-1
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,6 @@
229229
display: block;
230230
width: 100%;
231231
height: auto;
232-
position: absolute;
233232
}
234233
.container {
235234
display: flex;

js/audio/Index.svelte

+16-11
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
66
import type { FileData } from "@gradio/client";
77
import type { LoadingStatus } from "@gradio/statustracker";
8-
import { afterUpdate } from "svelte";
8+
import { afterUpdate, onMount } from "svelte";
99
1010
import StaticAudio from "./static/StaticAudio.svelte";
1111
import InteractiveAudio from "./interactive/InteractiveAudio.svelte";
@@ -95,14 +95,23 @@
9595
9696
let waveform_settings: Record<string, any>;
9797
98-
let color_accent = getComputedStyle(
99-
document.documentElement
100-
).getPropertyValue("--color-accent");
98+
let color_accent = "darkorange";
99+
100+
onMount(() => {
101+
color_accent = getComputedStyle(document?.documentElement).getPropertyValue(
102+
"--color-accent"
103+
);
104+
set_trim_region_colour();
105+
waveform_settings.waveColor = waveform_options.waveform_color || "#9ca3af";
106+
waveform_settings.progressColor =
107+
waveform_options.waveform_progress_color || color_accent;
108+
waveform_settings.mediaControls = waveform_options.show_controls;
109+
waveform_settings.sampleRate = waveform_options.sample_rate || 44100;
110+
});
101111
102112
$: waveform_settings = {
103113
height: 50,
104-
waveColor: waveform_options.waveform_color || "#9ca3af",
105-
progressColor: waveform_options.waveform_progress_color || color_accent,
114+
106115
barWidth: 2,
107116
barGap: 3,
108117
cursorWidth: 2,
@@ -111,9 +120,7 @@
111120
barRadius: 10,
112121
dragToSeek: true,
113122
normalize: true,
114-
minPxPerSec: 20,
115-
mediaControls: waveform_options.show_controls,
116-
sampleRate: waveform_options.sample_rate || 44100
123+
minPxPerSec: 20
117124
};
118125
119126
const trim_region_settings = {
@@ -129,8 +136,6 @@
129136
);
130137
}
131138
132-
set_trim_region_colour();
133-
134139
function handle_error({ detail }: CustomEvent<string>): void {
135140
const [level, status] = detail.includes("Invalid file type")
136141
? ["warning", "complete"]

js/audio/player/AudioPlayer.svelte

+24-20
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,11 @@
168168
data-testid={label ? "waveform-" + label : "unlabelled-audio"}
169169
>
170170
<div class="waveform-container">
171-
<div id="waveform" bind:this={container} />
171+
<div
172+
id="waveform"
173+
bind:this={container}
174+
style:height={container ? null : "58px"}
175+
/>
172176
</div>
173177

174178
<div class="timestamps">
@@ -181,25 +185,25 @@
181185
</div>
182186
</div>
183187

184-
{#if waveform}
185-
<WaveformControls
186-
{container}
187-
{waveform}
188-
{playing}
189-
{audio_duration}
190-
{i18n}
191-
{interactive}
192-
{handle_trim_audio}
193-
bind:mode
194-
bind:trimDuration
195-
bind:show_volume_slider
196-
show_redo={interactive}
197-
{handle_reset_value}
198-
{waveform_options}
199-
{trim_region_settings}
200-
{editable}
201-
/>
202-
{/if}
188+
<!-- {#if waveform} -->
189+
<WaveformControls
190+
{container}
191+
{waveform}
192+
{playing}
193+
{audio_duration}
194+
{i18n}
195+
{interactive}
196+
{handle_trim_audio}
197+
bind:mode
198+
bind:trimDuration
199+
bind:show_volume_slider
200+
show_redo={interactive}
201+
{handle_reset_value}
202+
{waveform_options}
203+
{trim_region_settings}
204+
{editable}
205+
/>
206+
<!-- {/if} -->
203207
</div>
204208
{/if}
205209

js/audio/shared/VolumeControl.svelte

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
55
export let currentVolume = 1;
66
export let show_volume_slider = false;
7-
export let waveform: WaveSurfer;
7+
export let waveform: WaveSurfer | undefined;
88
99
let volumeElement: HTMLInputElement;
1010
@@ -37,7 +37,7 @@
3737
on:input={(e) => {
3838
if (e.target instanceof HTMLInputElement) {
3939
currentVolume = parseFloat(e.target.value);
40-
waveform.setVolume(currentVolume);
40+
waveform?.setVolume(currentVolume);
4141
}
4242
}}
4343
/>

js/audio/shared/WaveformControls.svelte

+12-8
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import VolumeLevels from "./VolumeLevels.svelte";
1111
import VolumeControl from "./VolumeControl.svelte";
1212
13-
export let waveform: WaveSurfer;
13+
export let waveform: WaveSurfer | undefined;
1414
export let audio_duration: number;
1515
export let i18n: I18nFormatter;
1616
export let playing: boolean;
@@ -30,7 +30,7 @@
3030
let playbackSpeeds = [0.5, 1, 1.5, 2];
3131
let playbackSpeed = playbackSpeeds[1];
3232
33-
let trimRegion: RegionsPlugin;
33+
let trimRegion: RegionsPlugin | null = null;
3434
let activeRegion: Region | null = null;
3535
3636
let leftRegionHandle: HTMLDivElement | null;
@@ -39,7 +39,10 @@
3939
4040
let currentVolume = 1;
4141
42-
$: trimRegion = waveform.registerPlugin(RegionsPlugin.create());
42+
$: trimRegion =
43+
container && waveform
44+
? waveform.registerPlugin(RegionsPlugin.create())
45+
: null;
4346
4447
$: trimRegion?.on("region-out", (region) => {
4548
region.play();
@@ -56,7 +59,8 @@
5659
});
5760
5861
const addTrimRegion = (): void => {
59-
activeRegion = trimRegion.addRegion({
62+
if (!trimRegion) return;
63+
activeRegion = trimRegion?.addRegion({
6064
start: audio_duration / 4,
6165
end: audio_duration / 2,
6266
...trim_region_settings
@@ -190,7 +194,7 @@
190194
(playbackSpeeds.indexOf(playbackSpeed) + 1) % playbackSpeeds.length
191195
];
192196

193-
waveform.setPlaybackRate(playbackSpeed);
197+
waveform?.setPlaybackRate(playbackSpeed);
194198
}}
195199
>
196200
<span>{playbackSpeed}x</span>
@@ -205,7 +209,7 @@
205209
waveform_options.skip_length
206210
)} seconds`}
207211
on:click={() =>
208-
waveform.skip(
212+
waveform?.skip(
209213
get_skip_rewind_amount(audio_duration, waveform_options.skip_length) *
210214
-1
211215
)}
@@ -214,7 +218,7 @@
214218
</button>
215219
<button
216220
class="play-pause-button icon"
217-
on:click={() => waveform.playPause()}
221+
on:click={() => waveform?.playPause()}
218222
aria-label={playing ? i18n("audio.pause") : i18n("audio.play")}
219223
>
220224
{#if playing}
@@ -230,7 +234,7 @@
230234
waveform_options.skip_length
231235
)} seconds"
232236
on:click={() =>
233-
waveform.skip(
237+
waveform?.skip(
234238
get_skip_rewind_amount(audio_duration, waveform_options.skip_length)
235239
)}
236240
>

js/chatbot/Index.svelte

+1
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@
122122
_fetch={gradio.client.fetch}
123123
load_component={gradio.load_component}
124124
msg_format={type}
125+
root={gradio.root}
125126
/>
126127
</div>
127128
</Block>

js/chatbot/shared/ChatBot.svelte

+16-7
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
createEventDispatcher,
1111
type SvelteComponent,
1212
type ComponentType,
13-
tick
13+
tick,
14+
onMount
1415
} from "svelte";
1516
import { ShareButton } from "@gradio/atoms";
1617
import { Image } from "@gradio/image/shared";
@@ -96,13 +97,19 @@
9697
export let placeholder: string | null = null;
9798
export let upload: Client["upload"];
9899
export let msg_format: "tuples" | "messages" = "tuples";
100+
export let root: string;
99101
100-
let target = document.querySelector("div.gradio-container");
102+
let target: HTMLElement | null = null;
103+
104+
onMount(() => {
105+
target = document.querySelector("div.gradio-container");
106+
adjust_text_size();
107+
});
101108
102109
let div: HTMLDivElement;
103110
let autoscroll: boolean;
104111
105-
$: adjust_text_size = () => {
112+
function adjust_text_size(): void {
106113
let style = getComputedStyle(document.body);
107114
let body_text_size = style.getPropertyValue("--body-text-size");
108115
let updated_text_size;
@@ -126,9 +133,7 @@
126133
"--chatbot-body-text-size",
127134
updated_text_size + "px"
128135
);
129-
};
130-
131-
$: adjust_text_size();
136+
}
132137
133138
const dispatch = createEventDispatcher<{
134139
change: undefined;
@@ -142,6 +147,7 @@
142147
});
143148
144149
async function scroll(): Promise<void> {
150+
if (!div) return;
145151
await tick();
146152
requestAnimationFrame(() => {
147153
if (autoscroll) {
@@ -158,6 +164,7 @@
158164
scroll();
159165
}
160166
afterUpdate(() => {
167+
if (!div) return;
161168
div.querySelectorAll("img").forEach((n) => {
162169
n.addEventListener("click", (e) => {
163170
const target = e.target as HTMLImageElement;
@@ -369,6 +376,7 @@
369376
{render_markdown}
370377
{line_breaks}
371378
on:load={scroll}
379+
{root}
372380
/>
373381
</MessageBox>
374382
{:else}
@@ -379,6 +387,7 @@
379387
{render_markdown}
380388
{line_breaks}
381389
on:load={scroll}
390+
{root}
382391
/>
383392
{/if}
384393
{:else if message.type === "component" && message.content.component in _components}
@@ -432,7 +441,7 @@
432441
{/if}
433442
{:else if placeholder !== null}
434443
<center>
435-
<Markdown message={placeholder} {latex_delimiters} />
444+
<Markdown message={placeholder} {latex_delimiters} {root} />
436445
</center>
437446
{/if}
438447
</div>

js/code/Index.svelte

+5-2
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
export let value_is_output = false;
3030
export let language = "";
3131
export let lines = 5;
32-
export let target: HTMLElement;
3332
export let elem_id = "";
3433
export let elem_classes: string[] = [];
3534
export let visible = true;
@@ -40,7 +39,7 @@
4039
4140
export let interactive: boolean;
4241
43-
let dark_mode = target.classList.contains("dark");
42+
let dark_mode = gradio.theme === "dark";
4443
4544
function handle_change(): void {
4645
gradio.dispatch("change", value);
@@ -52,9 +51,13 @@
5251
value_is_output = false;
5352
});
5453
$: value, handle_change();
54+
55+
const is_browser = typeof window !== "undefined";
56+
const default_lines = interactive ? lines : 10.35;
5557
</script>
5658

5759
<Block
60+
height={is_browser ? undefined : default_lines * 25 + 4}
5861
variant={"solid"}
5962
padding={false}
6063
{elem_id}

js/component-test/package.json

+3
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
"@sveltejs/adapter-auto": "^3.0.0",
1414
"@sveltejs/kit": "^2.0.0"
1515
},
16+
"dependencies": {
17+
"@gradio/video": "workspace:^"
18+
},
1619
"type": "module",
1720
"private": "true"
1821
}

js/component-test/src/defs.d.ts

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
declare module "*.glb" {
2+
const src: string;
3+
export default src;
4+
}

0 commit comments

Comments
 (0)