@gradio/core 1.1.0 → 1.1.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/CHANGELOG.md CHANGED
@@ -1,5 +1,60 @@
1
1
  # @gradio/core
2
2
 
3
+ ## 1.1.2
4
+
5
+ ### Fixes
6
+
7
+ - [#12800](https://github.com/gradio-app/gradio/pull/12800) [`7a1c321`](https://github.com/gradio-app/gradio/commit/7a1c321b6546ba05a353488f5133e8262c4a8a39) - Bump svelte/kit for security reasons. Thanks @freddyaboulton!
8
+ - [#12757](https://github.com/gradio-app/gradio/pull/12757) [`6d9c2d7`](https://github.com/gradio-app/gradio/commit/6d9c2d7d81e4b0936c15fac2eae9e7640ab22777) - Migrate Textbox to Svelte 5. Thanks @dawoodkhan82!
9
+ - [#12607](https://github.com/gradio-app/gradio/pull/12607) [`299728b`](https://github.com/gradio-app/gradio/commit/299728b707c88e7afbc6a60f1f266a9013fa424d) - fix: add ARIA landmarks for accessibility. Thanks @majiayu000!
10
+
11
+ ### Dependency updates
12
+
13
+ - @gradio/button@0.6.3
14
+ - @gradio/code@0.17.1
15
+ - @gradio/paramviewer@0.9.2
16
+ - @gradio/statustracker@0.12.2
17
+ - @gradio/tabitem@0.6.5
18
+ - @gradio/tabs@0.5.5
19
+ - @gradio/atoms@0.20.1
20
+ - @gradio/column@0.3.2
21
+ - @gradio/utils@0.11.2
22
+ - @gradio/icons@0.15.1
23
+ - @gradio/upload@0.17.4
24
+ - @gradio/client@2.0.3
25
+ - @gradio/image@0.25.1
26
+ - @gradio/gallery@0.16.2
27
+ - @gradio/plot@0.10.2
28
+ - @gradio/theme@0.6.1
29
+ - @gradio/textbox@0.13.2
30
+ - @gradio/dropdown@0.11.2
31
+ - @gradio/checkbox@0.6.1
32
+ - @gradio/file@0.14.1
33
+ - @gradio/video@0.20.1
34
+ - @gradio/audio@0.22.1
35
+
36
+ ## 1.1.1
37
+
38
+ ### Features
39
+
40
+ - [#12677](https://github.com/gradio-app/gradio/pull/12677) [`6f37743`](https://github.com/gradio-app/gradio/commit/6f377433e4c64f1d962eef0f9eff74676c72032b) - Make check for active page in navbar robust. Thanks @abidlabs!
41
+
42
+ ### Fixes
43
+
44
+ - [#12681](https://github.com/gradio-app/gradio/pull/12681) [`ba46c2d`](https://github.com/gradio-app/gradio/commit/ba46c2df1405c11e495304af8f91acfdf69d0b18) - Migrate Button to Svelte 5. Thanks @freddyaboulton!
45
+ - [#12625](https://github.com/gradio-app/gradio/pull/12625) [`7fb79d4`](https://github.com/gradio-app/gradio/commit/7fb79d45bdc3597bf6b095ff64c420939257fba9) - Fix bug where tabs don't work inside gr.render. Thanks @freddyaboulton!
46
+
47
+ ### Dependency updates
48
+
49
+ - @gradio/utils@0.11.1
50
+ - @gradio/button@0.6.2
51
+ - @gradio/client@2.0.2
52
+ - @gradio/column@0.3.1
53
+ - @gradio/theme@0.6.0
54
+ - @gradio/gallery@0.16.1
55
+ - @gradio/plot@0.10.1
56
+ - @gradio/video@0.20.0
57
+
3
58
  ## 1.1.0
4
59
 
5
60
  ### Features
@@ -445,17 +445,20 @@
445
445
  </svelte:head>
446
446
 
447
447
  <div class="wrap" style:min-height={app_mode ? "100%" : "auto"}>
448
- <div
448
+ <main
449
449
  class="contain"
450
450
  style:flex-grow={app_mode ? "1" : "auto"}
451
451
  bind:this={root_container}
452
452
  style:margin-right={vibe_mode ? `${vibe_editor_width}px` : "0"}
453
453
  >
454
454
  <MountComponents node={app_tree.root} />
455
- </div>
455
+ </main>
456
456
 
457
457
  {#if footer_links.length > 0}
458
- <footer bind:clientHeight={footer_height}>
458
+ <footer
459
+ bind:clientHeight={footer_height}
460
+ aria-label="Gradio footer navigation"
461
+ >
459
462
  {#if footer_links.includes("api")}
460
463
  <button
461
464
  on:click={() => {
@@ -537,7 +540,12 @@
537
540
  {/if}
538
541
 
539
542
  {#if api_docs_visible && app_tree.root && ApiDocs}
540
- <div class="api-docs">
543
+ <div
544
+ class="api-docs"
545
+ role="dialog"
546
+ aria-modal="true"
547
+ aria-label={$reactive_formatter("errors.use_via_api")}
548
+ >
541
549
  <!-- TODO: fix -->
542
550
  <!-- svelte-ignore a11y-click-events-have-key-events-->
543
551
  <!-- svelte-ignore a11y-no-static-element-interactions-->
@@ -547,7 +555,7 @@
547
555
  set_api_docs_visible(false);
548
556
  }}
549
557
  />
550
- <div class="api-docs-wrap">
558
+ <div class="api-docs-wrap" role="document">
551
559
  <svelte:component
552
560
  this={ApiDocs}
553
561
  root_node={app_tree.root}
@@ -570,7 +578,12 @@
570
578
  {/if}
571
579
 
572
580
  {#if settings_visible && app.config && app_tree.root && Settings}
573
- <div class="api-docs">
581
+ <div
582
+ class="api-docs"
583
+ role="dialog"
584
+ aria-modal="true"
585
+ aria-label={$reactive_formatter("common.settings")}
586
+ >
574
587
  <!-- TODO: fix -->
575
588
  <!-- svelte-ignore a11y-click-events-have-key-events-->
576
589
  <!-- svelte-ignore a11y-no-static-element-interactions-->
@@ -580,7 +593,7 @@
580
593
  set_settings_visible(false);
581
594
  }}
582
595
  />
583
- <div class="api-docs-wrap">
596
+ <div class="api-docs-wrap" role="document">
584
597
  <svelte:component
585
598
  this={Settings}
586
599
  bind:allow_zoom
@@ -619,7 +632,7 @@
619
632
  font-size: var(--body-text-size);
620
633
  }
621
634
 
622
- .contain {
635
+ main.contain {
623
636
  display: flex;
624
637
  flex-direction: column;
625
638
  }
@@ -47,6 +47,20 @@
47
47
  $: show_navbar =
48
48
  pages.length > 1 && (navbar === null || navbar.visible !== false);
49
49
 
50
+ function normalize_path(path: string): string {
51
+ // Remove query parameters, hash fragments, and leading/trailing slashes from the path
52
+ let normalized = path.split("?")[0].split("#")[0];
53
+ normalized = normalized.replace(/^\/+|\/+$/g, "");
54
+ return normalized;
55
+ }
56
+
57
+ function is_active_route(route: string, current: string): boolean {
58
+ if (route.startsWith("http://") || route.startsWith("https://")) {
59
+ return false;
60
+ }
61
+ return normalize_path(route) === normalize_path(current);
62
+ }
63
+
50
64
  $: effective_pages = (() => {
51
65
  let visible_pages = pages.filter(([route, label, show], index) => {
52
66
  if (index === 0 && route === "") {
@@ -100,7 +114,7 @@
100
114
  href={route.startsWith("http://") || route.startsWith("https://")
101
115
  ? route
102
116
  : `${root}/${route}`}
103
- class:active={route === current_page}
117
+ class:active={is_active_route(route, current_page)}
104
118
  data-sveltekit-reload
105
119
  target={route.startsWith("http://") || route.startsWith("https://")
106
120
  ? "_blank"
@@ -114,7 +128,7 @@
114
128
  </nav>
115
129
  </div>
116
130
  {/if}
117
- <main class="fillable" class:fill_width class:app={!display && !is_embed}>
131
+ <div class="main fillable" class:fill_width class:app={!display && !is_embed}>
118
132
  <slot />
119
133
  <div>
120
134
  {#if display && space && info}
@@ -139,7 +153,7 @@
139
153
  </div>
140
154
  {/if}
141
155
  </div>
142
- </main>
156
+ </div>
143
157
  </div>
144
158
 
145
159
  <style>
@@ -187,11 +201,11 @@
187
201
  padding-bottom: var(--size-7);
188
202
  }
189
203
 
190
- .embed-container > main {
204
+ .embed-container > .main {
191
205
  padding: var(--size-4);
192
206
  }
193
207
 
194
- main {
208
+ .main {
195
209
  display: flex;
196
210
  flex-grow: 1;
197
211
  flex-direction: column;
@@ -313,7 +327,7 @@
313
327
  height: 12px;
314
328
  }
315
329
 
316
- main a:hover {
330
+ .main a:hover {
317
331
  text-decoration: underline;
318
332
  }
319
333
  </style>
@@ -54,7 +54,7 @@
54
54
  lines={1}
55
55
  show_label={true}
56
56
  max_lines={1}
57
- on:submit={submit}
57
+ onsubmit={submit}
58
58
  bind:value={username}
59
59
  />
60
60
  </Block>
@@ -66,13 +66,13 @@
66
66
  show_label={true}
67
67
  max_lines={1}
68
68
  type="password"
69
- on:submit={submit}
69
+ onsubmit={submit}
70
70
  bind:value={password}
71
71
  />
72
72
  </Block>
73
73
  </BaseForm>
74
74
 
75
- <BaseButton size="lg" variant="primary" on:click={submit}
75
+ <BaseButton size="lg" variant="primary" onclick={submit}
76
76
  >{i18n("login.login")}</BaseButton
77
77
  >
78
78
  </BaseColumn>
@@ -26,7 +26,7 @@
26
26
  size="sm"
27
27
  variant="secondary"
28
28
  elem_id="start-api-recorder"
29
- on:click={() => dispatch("close", { api_recorder_visible: true })}
29
+ onclick={() => dispatch("close", { api_recorder_visible: true })}
30
30
  >
31
31
  <div class="loading-dot self-baseline"></div>
32
32
  <p class="self-baseline btn-text">API Recorder</p>
@@ -60,7 +60,7 @@
60
60
  </Block>
61
61
 
62
62
  <span class="space" />
63
- <BaseButton variant="primary" on:click={run.bind(null, dependency_index)}>
63
+ <BaseButton variant="primary" onclick={run.bind(null, dependency_index)}>
64
64
  Try It Out
65
65
  </BaseButton>
66
66
 
@@ -6,7 +6,7 @@
6
6
  </script>
7
7
 
8
8
  <span class="space" />
9
- <BaseButton variant="primary" on:click={run.bind(null, dependency_index)}>
9
+ <BaseButton variant="primary" onclick={run.bind(null, dependency_index)}>
10
10
  Try It Out
11
11
  </BaseButton>
12
12
 
@@ -229,10 +229,12 @@ export class AppTree {
229
229
  map.set(comp.id, comp);
230
230
  return map;
231
231
  }, new Map());
232
- const subtree = this.traverse(layout, (node) => {
232
+ const _subtree = this.traverse(layout, (node) => {
233
233
  const new_node = this.create_node(node, component_map, false, this.reactive_formatter);
234
234
  return new_node;
235
235
  });
236
+ gather_initial_tabs(_subtree, this.initial_tabs);
237
+ const subtree = this.traverse(_subtree, (node) => apply_initial_tabs(node, this.initial_tabs));
236
238
  const n = find_node_by_id(this.root, subtree.id);
237
239
  if (!n) {
238
240
  throw new Error("Rerender failed: root node not found in current tree");
package/package.json CHANGED
@@ -1,67 +1,67 @@
1
1
  {
2
2
  "name": "@gradio/core",
3
- "version": "1.1.0",
3
+ "version": "1.1.2",
4
4
  "type": "module",
5
5
  "devDependencies": {
6
- "@gradio/annotatedimage": "^0.11.0",
7
- "@gradio/atoms": "^0.20.0",
8
- "@gradio/browserstate": "^0.3.4",
9
- "@gradio/accordion": "^0.5.27",
10
- "@gradio/box": "^0.2.27",
11
- "@gradio/audio": "^0.22.0",
12
- "@gradio/button": "^0.6.1",
13
- "@gradio/chatbot": "^0.29.0",
14
- "@gradio/checkbox": "^0.6.0",
15
- "@gradio/checkboxgroup": "^0.9.0",
16
- "@gradio/client": "^2.0.1",
17
- "@gradio/code": "^0.17.0",
18
- "@gradio/colorpicker": "^0.5.2",
19
- "@gradio/column": "^0.3.0",
20
- "@gradio/dataframe": "^0.21.2",
21
- "@gradio/dataset": "^0.5.1",
22
- "@gradio/datetime": "^0.4.0",
23
- "@gradio/downloadbutton": "^0.4.15",
24
- "@gradio/fallback": "^0.4.31",
25
- "@gradio/dropdown": "^0.11.0",
26
- "@gradio/file": "^0.14.0",
27
- "@gradio/gallery": "^0.16.0",
28
- "@gradio/fileexplorer": "^0.6.0",
29
- "@gradio/form": "^0.2.28",
30
- "@gradio/highlightedtext": "^0.10.0",
31
- "@gradio/group": "^0.3.1",
32
- "@gradio/icons": "^0.15.0",
33
- "@gradio/image": "^0.25.0",
34
- "@gradio/imageeditor": "^0.18.3",
35
- "@gradio/html": "^0.9.0",
36
- "@gradio/imageslider": "^0.4.0",
37
- "@gradio/json": "^0.6.0",
38
- "@gradio/label": "^0.6.0",
39
- "@gradio/markdown": "^0.13.24",
40
- "@gradio/model3d": "^0.16.0",
41
- "@gradio/multimodaltextbox": "^0.11.2",
42
- "@gradio/nativeplot": "^0.9.2",
43
- "@gradio/paramviewer": "^0.9.1",
44
- "@gradio/plot": "^0.10.0",
45
- "@gradio/number": "^0.8.0",
46
- "@gradio/radio": "^0.9.0",
47
- "@gradio/sidebar": "^0.1.25",
48
- "@gradio/row": "^0.3.0",
49
- "@gradio/simpledropdown": "^0.3.31",
50
- "@gradio/simpleimage": "^0.9.2",
51
- "@gradio/slider": "^0.7.2",
52
- "@gradio/simpletextbox": "^0.3.32",
53
- "@gradio/state": "^0.2.1",
54
- "@gradio/statustracker": "^0.12.1",
55
- "@gradio/tabs": "^0.5.4",
56
- "@gradio/tabitem": "^0.6.4",
57
- "@gradio/theme": "^0.5.0",
58
- "@gradio/timer": "^0.4.7",
59
- "@gradio/textbox": "^0.13.0",
60
- "@gradio/upload": "^0.17.3",
61
- "@gradio/utils": "^0.11.0",
62
- "@gradio/uploadbutton": "^0.9.15",
63
- "@gradio/vibeeditor": "^0.3.2",
64
- "@gradio/video": "^0.19.0"
6
+ "@gradio/accordion": "^0.5.29",
7
+ "@gradio/annotatedimage": "^0.11.1",
8
+ "@gradio/atoms": "^0.20.1",
9
+ "@gradio/audio": "^0.22.1",
10
+ "@gradio/box": "^0.2.28",
11
+ "@gradio/browserstate": "^0.3.6",
12
+ "@gradio/button": "^0.6.3",
13
+ "@gradio/chatbot": "^0.29.2",
14
+ "@gradio/checkbox": "^0.6.1",
15
+ "@gradio/checkboxgroup": "^0.9.1",
16
+ "@gradio/code": "^0.17.1",
17
+ "@gradio/client": "^2.0.3",
18
+ "@gradio/colorpicker": "^0.5.4",
19
+ "@gradio/column": "^0.3.2",
20
+ "@gradio/dataframe": "^0.21.3",
21
+ "@gradio/dataset": "^0.5.2",
22
+ "@gradio/datetime": "^0.4.1",
23
+ "@gradio/downloadbutton": "^0.4.17",
24
+ "@gradio/dropdown": "^0.11.2",
25
+ "@gradio/fallback": "^0.4.32",
26
+ "@gradio/fileexplorer": "^0.6.1",
27
+ "@gradio/file": "^0.14.1",
28
+ "@gradio/gallery": "^0.16.2",
29
+ "@gradio/form": "^0.2.29",
30
+ "@gradio/group": "^0.3.2",
31
+ "@gradio/highlightedtext": "^0.11.0",
32
+ "@gradio/html": "^0.9.1",
33
+ "@gradio/icons": "^0.15.1",
34
+ "@gradio/image": "^0.25.1",
35
+ "@gradio/imageeditor": "^0.18.4",
36
+ "@gradio/imageslider": "^0.4.1",
37
+ "@gradio/json": "^0.7.0",
38
+ "@gradio/label": "^0.6.1",
39
+ "@gradio/multimodaltextbox": "^0.11.4",
40
+ "@gradio/model3d": "^0.16.2",
41
+ "@gradio/nativeplot": "^0.10.0",
42
+ "@gradio/markdown": "^0.13.26",
43
+ "@gradio/paramviewer": "^0.9.2",
44
+ "@gradio/plot": "^0.10.2",
45
+ "@gradio/radio": "^0.9.1",
46
+ "@gradio/number": "^0.8.1",
47
+ "@gradio/row": "^0.3.1",
48
+ "@gradio/sidebar": "^0.2.1",
49
+ "@gradio/simpledropdown": "^0.3.32",
50
+ "@gradio/simpleimage": "^0.9.3",
51
+ "@gradio/simpletextbox": "^0.3.34",
52
+ "@gradio/slider": "^0.7.3",
53
+ "@gradio/state": "^0.2.2",
54
+ "@gradio/statustracker": "^0.12.2",
55
+ "@gradio/tabitem": "^0.6.5",
56
+ "@gradio/tabs": "^0.5.5",
57
+ "@gradio/textbox": "^0.13.2",
58
+ "@gradio/theme": "^0.6.1",
59
+ "@gradio/timer": "^0.4.8",
60
+ "@gradio/uploadbutton": "^0.9.17",
61
+ "@gradio/upload": "^0.17.4",
62
+ "@gradio/utils": "^0.11.2",
63
+ "@gradio/video": "^0.20.1",
64
+ "@gradio/vibeeditor": "^0.3.3"
65
65
  },
66
66
  "msw": {
67
67
  "workerDirectory": "public"
@@ -91,7 +91,7 @@
91
91
  }
92
92
  },
93
93
  "peerDependencies": {
94
- "svelte": "^5.43.4"
94
+ "svelte": "^5.48.0"
95
95
  },
96
96
  "main": "./index.ts",
97
97
  "repository": {
package/src/Blocks.svelte CHANGED
@@ -445,17 +445,20 @@
445
445
  </svelte:head>
446
446
 
447
447
  <div class="wrap" style:min-height={app_mode ? "100%" : "auto"}>
448
- <div
448
+ <main
449
449
  class="contain"
450
450
  style:flex-grow={app_mode ? "1" : "auto"}
451
451
  bind:this={root_container}
452
452
  style:margin-right={vibe_mode ? `${vibe_editor_width}px` : "0"}
453
453
  >
454
454
  <MountComponents node={app_tree.root} />
455
- </div>
455
+ </main>
456
456
 
457
457
  {#if footer_links.length > 0}
458
- <footer bind:clientHeight={footer_height}>
458
+ <footer
459
+ bind:clientHeight={footer_height}
460
+ aria-label="Gradio footer navigation"
461
+ >
459
462
  {#if footer_links.includes("api")}
460
463
  <button
461
464
  on:click={() => {
@@ -537,7 +540,12 @@
537
540
  {/if}
538
541
 
539
542
  {#if api_docs_visible && app_tree.root && ApiDocs}
540
- <div class="api-docs">
543
+ <div
544
+ class="api-docs"
545
+ role="dialog"
546
+ aria-modal="true"
547
+ aria-label={$reactive_formatter("errors.use_via_api")}
548
+ >
541
549
  <!-- TODO: fix -->
542
550
  <!-- svelte-ignore a11y-click-events-have-key-events-->
543
551
  <!-- svelte-ignore a11y-no-static-element-interactions-->
@@ -547,7 +555,7 @@
547
555
  set_api_docs_visible(false);
548
556
  }}
549
557
  />
550
- <div class="api-docs-wrap">
558
+ <div class="api-docs-wrap" role="document">
551
559
  <svelte:component
552
560
  this={ApiDocs}
553
561
  root_node={app_tree.root}
@@ -570,7 +578,12 @@
570
578
  {/if}
571
579
 
572
580
  {#if settings_visible && app.config && app_tree.root && Settings}
573
- <div class="api-docs">
581
+ <div
582
+ class="api-docs"
583
+ role="dialog"
584
+ aria-modal="true"
585
+ aria-label={$reactive_formatter("common.settings")}
586
+ >
574
587
  <!-- TODO: fix -->
575
588
  <!-- svelte-ignore a11y-click-events-have-key-events-->
576
589
  <!-- svelte-ignore a11y-no-static-element-interactions-->
@@ -580,7 +593,7 @@
580
593
  set_settings_visible(false);
581
594
  }}
582
595
  />
583
- <div class="api-docs-wrap">
596
+ <div class="api-docs-wrap" role="document">
584
597
  <svelte:component
585
598
  this={Settings}
586
599
  bind:allow_zoom
@@ -619,7 +632,7 @@
619
632
  font-size: var(--body-text-size);
620
633
  }
621
634
 
622
- .contain {
635
+ main.contain {
623
636
  display: flex;
624
637
  flex-direction: column;
625
638
  }
package/src/Embed.svelte CHANGED
@@ -47,6 +47,20 @@
47
47
  $: show_navbar =
48
48
  pages.length > 1 && (navbar === null || navbar.visible !== false);
49
49
 
50
+ function normalize_path(path: string): string {
51
+ // Remove query parameters, hash fragments, and leading/trailing slashes from the path
52
+ let normalized = path.split("?")[0].split("#")[0];
53
+ normalized = normalized.replace(/^\/+|\/+$/g, "");
54
+ return normalized;
55
+ }
56
+
57
+ function is_active_route(route: string, current: string): boolean {
58
+ if (route.startsWith("http://") || route.startsWith("https://")) {
59
+ return false;
60
+ }
61
+ return normalize_path(route) === normalize_path(current);
62
+ }
63
+
50
64
  $: effective_pages = (() => {
51
65
  let visible_pages = pages.filter(([route, label, show], index) => {
52
66
  if (index === 0 && route === "") {
@@ -100,7 +114,7 @@
100
114
  href={route.startsWith("http://") || route.startsWith("https://")
101
115
  ? route
102
116
  : `${root}/${route}`}
103
- class:active={route === current_page}
117
+ class:active={is_active_route(route, current_page)}
104
118
  data-sveltekit-reload
105
119
  target={route.startsWith("http://") || route.startsWith("https://")
106
120
  ? "_blank"
@@ -114,7 +128,7 @@
114
128
  </nav>
115
129
  </div>
116
130
  {/if}
117
- <main class="fillable" class:fill_width class:app={!display && !is_embed}>
131
+ <div class="main fillable" class:fill_width class:app={!display && !is_embed}>
118
132
  <slot />
119
133
  <div>
120
134
  {#if display && space && info}
@@ -139,7 +153,7 @@
139
153
  </div>
140
154
  {/if}
141
155
  </div>
142
- </main>
156
+ </div>
143
157
  </div>
144
158
 
145
159
  <style>
@@ -187,11 +201,11 @@
187
201
  padding-bottom: var(--size-7);
188
202
  }
189
203
 
190
- .embed-container > main {
204
+ .embed-container > .main {
191
205
  padding: var(--size-4);
192
206
  }
193
207
 
194
- main {
208
+ .main {
195
209
  display: flex;
196
210
  flex-grow: 1;
197
211
  flex-direction: column;
@@ -313,7 +327,7 @@
313
327
  height: 12px;
314
328
  }
315
329
 
316
- main a:hover {
330
+ .main a:hover {
317
331
  text-decoration: underline;
318
332
  }
319
333
  </style>
package/src/Login.svelte CHANGED
@@ -54,7 +54,7 @@
54
54
  lines={1}
55
55
  show_label={true}
56
56
  max_lines={1}
57
- on:submit={submit}
57
+ onsubmit={submit}
58
58
  bind:value={username}
59
59
  />
60
60
  </Block>
@@ -66,13 +66,13 @@
66
66
  show_label={true}
67
67
  max_lines={1}
68
68
  type="password"
69
- on:submit={submit}
69
+ onsubmit={submit}
70
70
  bind:value={password}
71
71
  />
72
72
  </Block>
73
73
  </BaseForm>
74
74
 
75
- <BaseButton size="lg" variant="primary" on:click={submit}
75
+ <BaseButton size="lg" variant="primary" onclick={submit}
76
76
  >{i18n("login.login")}</BaseButton
77
77
  >
78
78
  </BaseColumn>
@@ -26,7 +26,7 @@
26
26
  size="sm"
27
27
  variant="secondary"
28
28
  elem_id="start-api-recorder"
29
- on:click={() => dispatch("close", { api_recorder_visible: true })}
29
+ onclick={() => dispatch("close", { api_recorder_visible: true })}
30
30
  >
31
31
  <div class="loading-dot self-baseline"></div>
32
32
  <p class="self-baseline btn-text">API Recorder</p>
@@ -60,7 +60,7 @@
60
60
  </Block>
61
61
 
62
62
  <span class="space" />
63
- <BaseButton variant="primary" on:click={run.bind(null, dependency_index)}>
63
+ <BaseButton variant="primary" onclick={run.bind(null, dependency_index)}>
64
64
  Try It Out
65
65
  </BaseButton>
66
66
 
@@ -6,7 +6,7 @@
6
6
  </script>
7
7
 
8
8
  <span class="space" />
9
- <BaseButton variant="primary" on:click={run.bind(null, dependency_index)}>
9
+ <BaseButton variant="primary" onclick={run.bind(null, dependency_index)}>
10
10
  Try It Out
11
11
  </BaseButton>
12
12
 
@@ -365,7 +365,7 @@ export class AppTree {
365
365
  map.set(comp.id, comp);
366
366
  return map;
367
367
  }, new Map<number, ComponentMeta>());
368
- const subtree = this.traverse(layout, (node) => {
368
+ const _subtree = this.traverse(layout, (node) => {
369
369
  const new_node = this.create_node(
370
370
  node,
371
371
  component_map,
@@ -374,7 +374,10 @@ export class AppTree {
374
374
  );
375
375
  return new_node;
376
376
  });
377
-
377
+ gather_initial_tabs(_subtree, this.initial_tabs);
378
+ const subtree = this.traverse(_subtree, (node) =>
379
+ apply_initial_tabs(node, this.initial_tabs)
380
+ );
378
381
  const n = find_node_by_id(this.root!, subtree.id);
379
382
 
380
383
  if (!n) {