@gradio/dataframe 0.10.0 → 0.10.1
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 +20 -0
- package/Index.svelte +4 -1
- package/dist/Example.svelte +104 -0
- package/dist/Example.svelte.d.ts +19 -0
- package/dist/Index.svelte +117 -0
- package/dist/Index.svelte.d.ts +54 -0
- package/dist/shared/EditableCell.svelte +106 -0
- package/dist/shared/EditableCell.svelte.d.ts +37 -0
- package/dist/shared/Example.svelte +28 -0
- package/dist/shared/Example.svelte.d.ts +16 -0
- package/dist/shared/Table.svelte +915 -0
- package/dist/shared/Table.svelte.d.ts +49 -0
- package/dist/shared/VirtualTable.svelte +294 -0
- package/dist/shared/VirtualTable.svelte.d.ts +31 -0
- package/dist/shared/utils.d.ts +10 -0
- package/dist/shared/utils.js +1 -0
- package/package.json +22 -11
- package/shared/EditableCell.svelte +2 -0
- package/shared/Table.svelte +6 -1
- package/shared/VirtualTable.svelte +23 -10
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# @gradio/dataframe
|
|
2
2
|
|
|
3
|
+
## 0.10.1
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
|
|
7
|
+
- [#9187](https://github.com/gradio-app/gradio/pull/9187) [`5bf00b7`](https://github.com/gradio-app/gradio/commit/5bf00b7524ebf399b48719120a49d15bb21bd65c) - make all component SSR compatible. Thanks @pngwn!
|
|
8
|
+
|
|
9
|
+
### Fixes
|
|
10
|
+
|
|
11
|
+
- [#9163](https://github.com/gradio-app/gradio/pull/9163) [`2b6cbf2`](https://github.com/gradio-app/gradio/commit/2b6cbf25908e42cf027324e54ef2cc0baad11a91) - fix exports and generate types. Thanks @pngwn!
|
|
12
|
+
|
|
13
|
+
### Dependency updates
|
|
14
|
+
|
|
15
|
+
- @gradio/utils@0.6.1
|
|
16
|
+
- @gradio/statustracker@0.7.6
|
|
17
|
+
- @gradio/atoms@0.8.1
|
|
18
|
+
- @gradio/client@1.5.2
|
|
19
|
+
- @gradio/upload@0.12.4
|
|
20
|
+
- @gradio/button@0.2.51
|
|
21
|
+
- @gradio/markdown@0.9.4
|
|
22
|
+
|
|
3
23
|
## 0.10.0
|
|
4
24
|
|
|
5
25
|
### Features
|
package/Index.svelte
CHANGED
|
@@ -66,7 +66,10 @@
|
|
|
66
66
|
display_value = _data?.metadata?.display_value
|
|
67
67
|
? [..._data?.metadata?.display_value]
|
|
68
68
|
: null;
|
|
69
|
-
styling =
|
|
69
|
+
styling =
|
|
70
|
+
!interactive && _data?.metadata?.styling
|
|
71
|
+
? [..._data?.metadata?.styling]
|
|
72
|
+
: null;
|
|
70
73
|
await tick();
|
|
71
74
|
|
|
72
75
|
gradio.dispatch("change");
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
<script>export let value;
|
|
2
|
+
export let type;
|
|
3
|
+
export let selected = false;
|
|
4
|
+
export let index;
|
|
5
|
+
let hovered = false;
|
|
6
|
+
let loaded = Array.isArray(value);
|
|
7
|
+
</script>
|
|
8
|
+
|
|
9
|
+
{#if loaded}
|
|
10
|
+
<!-- TODO: fix-->
|
|
11
|
+
<!-- svelte-ignore a11y-no-static-element-interactions-->
|
|
12
|
+
<div
|
|
13
|
+
class:table={type === "table"}
|
|
14
|
+
class:gallery={type === "gallery"}
|
|
15
|
+
class:selected
|
|
16
|
+
on:mouseenter={() => (hovered = true)}
|
|
17
|
+
on:mouseleave={() => (hovered = false)}
|
|
18
|
+
>
|
|
19
|
+
{#if typeof value === "string"}
|
|
20
|
+
{value}
|
|
21
|
+
{:else}
|
|
22
|
+
<table class="">
|
|
23
|
+
{#each value.slice(0, 3) as row, i}
|
|
24
|
+
<tr>
|
|
25
|
+
{#each row.slice(0, 3) as cell, j}
|
|
26
|
+
<td>{cell}</td>
|
|
27
|
+
{/each}
|
|
28
|
+
{#if row.length > 3}
|
|
29
|
+
<td>…</td>
|
|
30
|
+
{/if}
|
|
31
|
+
</tr>
|
|
32
|
+
{/each}
|
|
33
|
+
{#if value.length > 3}
|
|
34
|
+
<div
|
|
35
|
+
class="overlay"
|
|
36
|
+
class:odd={index % 2 != 0}
|
|
37
|
+
class:even={index % 2 == 0}
|
|
38
|
+
class:button={type === "gallery"}
|
|
39
|
+
/>
|
|
40
|
+
{/if}
|
|
41
|
+
</table>
|
|
42
|
+
{/if}
|
|
43
|
+
</div>
|
|
44
|
+
{/if}
|
|
45
|
+
|
|
46
|
+
<style>
|
|
47
|
+
table {
|
|
48
|
+
position: relative;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
td {
|
|
52
|
+
border: 1px solid var(--table-border-color);
|
|
53
|
+
padding: var(--size-2);
|
|
54
|
+
font-size: var(--text-sm);
|
|
55
|
+
font-family: var(--font-mono);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.selected td {
|
|
59
|
+
border-color: var(--border-color-accent);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.table {
|
|
63
|
+
display: inline-block;
|
|
64
|
+
margin: 0 auto;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.gallery td:first-child {
|
|
68
|
+
border-left: none;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.gallery tr:first-child td {
|
|
72
|
+
border-top: none;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.gallery td:last-child {
|
|
76
|
+
border-right: none;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.gallery tr:last-child td {
|
|
80
|
+
border-bottom: none;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.overlay {
|
|
84
|
+
--gradient-to: transparent;
|
|
85
|
+
position: absolute;
|
|
86
|
+
bottom: 0;
|
|
87
|
+
background: linear-gradient(to bottom, transparent, var(--gradient-to));
|
|
88
|
+
width: var(--size-full);
|
|
89
|
+
height: 50%;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/* i dont know what i've done here but it is what it is */
|
|
93
|
+
.odd {
|
|
94
|
+
--gradient-to: var(--table-even-background-fill);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.even {
|
|
98
|
+
--gradient-to: var(--table-odd-background-fill);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.button {
|
|
102
|
+
--gradient-to: var(--background-fill-primary);
|
|
103
|
+
}
|
|
104
|
+
</style>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { SvelteComponent } from "svelte";
|
|
2
|
+
declare const __propDef: {
|
|
3
|
+
props: {
|
|
4
|
+
value: (string | number)[][] | string;
|
|
5
|
+
type: "gallery" | "table";
|
|
6
|
+
selected?: boolean | undefined;
|
|
7
|
+
index: number;
|
|
8
|
+
};
|
|
9
|
+
events: {
|
|
10
|
+
[evt: string]: CustomEvent<any>;
|
|
11
|
+
};
|
|
12
|
+
slots: {};
|
|
13
|
+
};
|
|
14
|
+
export type ExampleProps = typeof __propDef.props;
|
|
15
|
+
export type ExampleEvents = typeof __propDef.events;
|
|
16
|
+
export type ExampleSlots = typeof __propDef.slots;
|
|
17
|
+
export default class Example extends SvelteComponent<ExampleProps, ExampleEvents, ExampleSlots> {
|
|
18
|
+
}
|
|
19
|
+
export {};
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
<script context="module">export { default as BaseDataFrame } from "./shared/Table.svelte";
|
|
2
|
+
export { default as BaseExample } from "./Example.svelte";
|
|
3
|
+
</script>
|
|
4
|
+
|
|
5
|
+
<script>import { afterUpdate, tick } from "svelte";
|
|
6
|
+
import { Block } from "@gradio/atoms";
|
|
7
|
+
import Table from "./shared/Table.svelte";
|
|
8
|
+
import { StatusTracker } from "@gradio/statustracker";
|
|
9
|
+
export let headers = [];
|
|
10
|
+
export let elem_id = "";
|
|
11
|
+
export let elem_classes = [];
|
|
12
|
+
export let visible = true;
|
|
13
|
+
export let value = {
|
|
14
|
+
data: [["", "", ""]],
|
|
15
|
+
headers: ["1", "2", "3"],
|
|
16
|
+
metadata: null
|
|
17
|
+
};
|
|
18
|
+
let old_value = "";
|
|
19
|
+
export let value_is_output = false;
|
|
20
|
+
export let col_count;
|
|
21
|
+
export let row_count;
|
|
22
|
+
export let label = null;
|
|
23
|
+
export let show_label = true;
|
|
24
|
+
export let wrap;
|
|
25
|
+
export let datatype;
|
|
26
|
+
export let scale = null;
|
|
27
|
+
export let min_width = void 0;
|
|
28
|
+
export let root;
|
|
29
|
+
export let line_breaks = true;
|
|
30
|
+
export let column_widths = [];
|
|
31
|
+
export let gradio;
|
|
32
|
+
export let latex_delimiters;
|
|
33
|
+
export let height = void 0;
|
|
34
|
+
export let loading_status;
|
|
35
|
+
export let interactive;
|
|
36
|
+
let _headers;
|
|
37
|
+
let display_value;
|
|
38
|
+
let styling;
|
|
39
|
+
let values;
|
|
40
|
+
async function handle_change(data) {
|
|
41
|
+
let _data = data || value;
|
|
42
|
+
_headers = [..._data.headers || headers];
|
|
43
|
+
values = _data.data ? [..._data.data] : [];
|
|
44
|
+
display_value = _data?.metadata?.display_value ? [..._data?.metadata?.display_value] : null;
|
|
45
|
+
styling = !interactive && _data?.metadata?.styling ? [..._data?.metadata?.styling] : null;
|
|
46
|
+
await tick();
|
|
47
|
+
gradio.dispatch("change");
|
|
48
|
+
if (!value_is_output) {
|
|
49
|
+
gradio.dispatch("input");
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
handle_change();
|
|
53
|
+
afterUpdate(() => {
|
|
54
|
+
value_is_output = false;
|
|
55
|
+
});
|
|
56
|
+
$: {
|
|
57
|
+
if (old_value && JSON.stringify(value) !== old_value) {
|
|
58
|
+
old_value = JSON.stringify(value);
|
|
59
|
+
handle_change();
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (Array.isArray(value) && value?.[0]?.length === 0 || value.data?.[0]?.length === 0) {
|
|
63
|
+
value = {
|
|
64
|
+
data: [Array(col_count?.[0] || 3).fill("")],
|
|
65
|
+
headers: Array(col_count?.[0] || 3).fill("").map((_, i) => `${i + 1}`),
|
|
66
|
+
metadata: null
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
async function handle_value_change(data) {
|
|
70
|
+
if (JSON.stringify(data) !== old_value) {
|
|
71
|
+
value = { ...data };
|
|
72
|
+
old_value = JSON.stringify(value);
|
|
73
|
+
handle_change(data);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
</script>
|
|
77
|
+
|
|
78
|
+
<Block
|
|
79
|
+
{visible}
|
|
80
|
+
padding={false}
|
|
81
|
+
{elem_id}
|
|
82
|
+
{elem_classes}
|
|
83
|
+
container={false}
|
|
84
|
+
{scale}
|
|
85
|
+
{min_width}
|
|
86
|
+
allow_overflow={false}
|
|
87
|
+
>
|
|
88
|
+
<StatusTracker
|
|
89
|
+
autoscroll={gradio.autoscroll}
|
|
90
|
+
i18n={gradio.i18n}
|
|
91
|
+
{...loading_status}
|
|
92
|
+
on:clear_status={() => gradio.dispatch("clear_status", loading_status)}
|
|
93
|
+
/>
|
|
94
|
+
<Table
|
|
95
|
+
{root}
|
|
96
|
+
{label}
|
|
97
|
+
{show_label}
|
|
98
|
+
{row_count}
|
|
99
|
+
{col_count}
|
|
100
|
+
{values}
|
|
101
|
+
{display_value}
|
|
102
|
+
{styling}
|
|
103
|
+
headers={_headers}
|
|
104
|
+
on:change={(e) => handle_value_change(e.detail)}
|
|
105
|
+
on:select={(e) => gradio.dispatch("select", e.detail)}
|
|
106
|
+
{wrap}
|
|
107
|
+
{datatype}
|
|
108
|
+
{latex_delimiters}
|
|
109
|
+
editable={interactive}
|
|
110
|
+
{height}
|
|
111
|
+
i18n={gradio.i18n}
|
|
112
|
+
{line_breaks}
|
|
113
|
+
{column_widths}
|
|
114
|
+
upload={gradio.client.upload}
|
|
115
|
+
stream_handler={gradio.client.stream}
|
|
116
|
+
/>
|
|
117
|
+
</Block>
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { SvelteComponent } from "svelte";
|
|
2
|
+
export { default as BaseDataFrame } from "./shared/Table.svelte";
|
|
3
|
+
export { default as BaseExample } from "./Example.svelte";
|
|
4
|
+
import type { Gradio, SelectData } from "@gradio/utils";
|
|
5
|
+
import type { LoadingStatus } from "@gradio/statustracker";
|
|
6
|
+
import type { Headers, Data, Metadata, Datatype } from "./shared/utils";
|
|
7
|
+
declare const __propDef: {
|
|
8
|
+
props: {
|
|
9
|
+
headers?: Headers | undefined;
|
|
10
|
+
elem_id?: string | undefined;
|
|
11
|
+
elem_classes?: string[] | undefined;
|
|
12
|
+
visible?: boolean | undefined;
|
|
13
|
+
value?: {
|
|
14
|
+
data: Data;
|
|
15
|
+
headers: Headers;
|
|
16
|
+
metadata: Metadata;
|
|
17
|
+
} | undefined;
|
|
18
|
+
value_is_output?: boolean | undefined;
|
|
19
|
+
col_count: [number, "fixed" | "dynamic"];
|
|
20
|
+
row_count: [number, "fixed" | "dynamic"];
|
|
21
|
+
label?: (string | null) | undefined;
|
|
22
|
+
show_label?: boolean | undefined;
|
|
23
|
+
wrap: boolean;
|
|
24
|
+
datatype: Datatype | Datatype[];
|
|
25
|
+
scale?: (number | null) | undefined;
|
|
26
|
+
min_width?: number | undefined;
|
|
27
|
+
root: string;
|
|
28
|
+
line_breaks?: boolean | undefined;
|
|
29
|
+
column_widths?: string[] | undefined;
|
|
30
|
+
gradio: Gradio<{
|
|
31
|
+
change: never;
|
|
32
|
+
select: SelectData;
|
|
33
|
+
input: never;
|
|
34
|
+
clear_status: LoadingStatus;
|
|
35
|
+
}>;
|
|
36
|
+
latex_delimiters: {
|
|
37
|
+
left: string;
|
|
38
|
+
right: string;
|
|
39
|
+
display: boolean;
|
|
40
|
+
}[];
|
|
41
|
+
height?: number | undefined;
|
|
42
|
+
loading_status: LoadingStatus;
|
|
43
|
+
interactive: boolean;
|
|
44
|
+
};
|
|
45
|
+
events: {
|
|
46
|
+
[evt: string]: CustomEvent<any>;
|
|
47
|
+
};
|
|
48
|
+
slots: {};
|
|
49
|
+
};
|
|
50
|
+
export type IndexProps = typeof __propDef.props;
|
|
51
|
+
export type IndexEvents = typeof __propDef.events;
|
|
52
|
+
export type IndexSlots = typeof __propDef.slots;
|
|
53
|
+
export default class Index extends SvelteComponent<IndexProps, IndexEvents, IndexSlots> {
|
|
54
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
<script>import { createEventDispatcher } from "svelte";
|
|
2
|
+
import { MarkdownCode } from "@gradio/markdown";
|
|
3
|
+
export let edit;
|
|
4
|
+
export let value = "";
|
|
5
|
+
export let display_value = null;
|
|
6
|
+
export let styling = "";
|
|
7
|
+
export let header = false;
|
|
8
|
+
export let datatype = "str";
|
|
9
|
+
export let latex_delimiters;
|
|
10
|
+
export let clear_on_focus = false;
|
|
11
|
+
export let select_on_focus = false;
|
|
12
|
+
export let line_breaks = true;
|
|
13
|
+
export let editable = true;
|
|
14
|
+
export let root;
|
|
15
|
+
const dispatch = createEventDispatcher();
|
|
16
|
+
export let el;
|
|
17
|
+
$:
|
|
18
|
+
_value = value;
|
|
19
|
+
function use_focus(node) {
|
|
20
|
+
if (clear_on_focus) {
|
|
21
|
+
_value = "";
|
|
22
|
+
}
|
|
23
|
+
if (select_on_focus) {
|
|
24
|
+
node.select();
|
|
25
|
+
}
|
|
26
|
+
node.focus();
|
|
27
|
+
return {};
|
|
28
|
+
}
|
|
29
|
+
function handle_blur({
|
|
30
|
+
currentTarget
|
|
31
|
+
}) {
|
|
32
|
+
value = currentTarget.value;
|
|
33
|
+
dispatch("blur");
|
|
34
|
+
}
|
|
35
|
+
</script>
|
|
36
|
+
|
|
37
|
+
{#if edit}
|
|
38
|
+
<input
|
|
39
|
+
role="textbox"
|
|
40
|
+
bind:this={el}
|
|
41
|
+
bind:value={_value}
|
|
42
|
+
class:header
|
|
43
|
+
tabindex="-1"
|
|
44
|
+
on:blur={handle_blur}
|
|
45
|
+
use:use_focus
|
|
46
|
+
on:keydown
|
|
47
|
+
/>
|
|
48
|
+
{/if}
|
|
49
|
+
|
|
50
|
+
<span
|
|
51
|
+
on:dblclick
|
|
52
|
+
tabindex="-1"
|
|
53
|
+
role="button"
|
|
54
|
+
class:edit
|
|
55
|
+
on:focus|preventDefault
|
|
56
|
+
style={styling}
|
|
57
|
+
>
|
|
58
|
+
{#if datatype === "html"}
|
|
59
|
+
{@html value}
|
|
60
|
+
{:else if datatype === "markdown"}
|
|
61
|
+
<MarkdownCode
|
|
62
|
+
message={value.toLocaleString()}
|
|
63
|
+
{latex_delimiters}
|
|
64
|
+
{line_breaks}
|
|
65
|
+
chatbot={false}
|
|
66
|
+
{root}
|
|
67
|
+
/>
|
|
68
|
+
{:else}
|
|
69
|
+
{editable ? value : display_value || value}
|
|
70
|
+
{/if}
|
|
71
|
+
</span>
|
|
72
|
+
|
|
73
|
+
<style>
|
|
74
|
+
input {
|
|
75
|
+
position: absolute;
|
|
76
|
+
top: var(--size-2);
|
|
77
|
+
right: var(--size-2);
|
|
78
|
+
bottom: var(--size-2);
|
|
79
|
+
left: var(--size-2);
|
|
80
|
+
flex: 1 1 0%;
|
|
81
|
+
transform: translateX(-0.1px);
|
|
82
|
+
outline: none;
|
|
83
|
+
border: none;
|
|
84
|
+
background: transparent;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
span {
|
|
88
|
+
flex: 1 1 0%;
|
|
89
|
+
outline: none;
|
|
90
|
+
padding: var(--size-2);
|
|
91
|
+
-webkit-user-select: text;
|
|
92
|
+
-moz-user-select: text;
|
|
93
|
+
-ms-user-select: text;
|
|
94
|
+
user-select: text;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.header {
|
|
98
|
+
transform: translateX(0);
|
|
99
|
+
font: var(--weight-bold);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.edit {
|
|
103
|
+
opacity: 0;
|
|
104
|
+
pointer-events: none;
|
|
105
|
+
}
|
|
106
|
+
</style>
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { SvelteComponent } from "svelte";
|
|
2
|
+
declare const __propDef: {
|
|
3
|
+
props: {
|
|
4
|
+
edit: boolean;
|
|
5
|
+
value?: (string | number) | undefined;
|
|
6
|
+
display_value?: (string | null) | undefined;
|
|
7
|
+
styling?: string | undefined;
|
|
8
|
+
header?: boolean | undefined;
|
|
9
|
+
datatype?: ("str" | "markdown" | "html" | "number" | "bool" | "date") | undefined;
|
|
10
|
+
latex_delimiters: {
|
|
11
|
+
left: string;
|
|
12
|
+
right: string;
|
|
13
|
+
display: boolean;
|
|
14
|
+
}[];
|
|
15
|
+
clear_on_focus?: boolean | undefined;
|
|
16
|
+
select_on_focus?: boolean | undefined;
|
|
17
|
+
line_breaks?: boolean | undefined;
|
|
18
|
+
editable?: boolean | undefined;
|
|
19
|
+
root: string;
|
|
20
|
+
el: HTMLInputElement | null;
|
|
21
|
+
};
|
|
22
|
+
events: {
|
|
23
|
+
keydown: KeyboardEvent;
|
|
24
|
+
dblclick: MouseEvent;
|
|
25
|
+
focus: FocusEvent;
|
|
26
|
+
blur: CustomEvent<any>;
|
|
27
|
+
} & {
|
|
28
|
+
[evt: string]: CustomEvent<any>;
|
|
29
|
+
};
|
|
30
|
+
slots: {};
|
|
31
|
+
};
|
|
32
|
+
export type EditableCellProps = typeof __propDef.props;
|
|
33
|
+
export type EditableCellEvents = typeof __propDef.events;
|
|
34
|
+
export type EditableCellSlots = typeof __propDef.slots;
|
|
35
|
+
export default class EditableCell extends SvelteComponent<EditableCellProps, EditableCellEvents, EditableCellSlots> {
|
|
36
|
+
}
|
|
37
|
+
export {};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
<script>export let value;
|
|
2
|
+
</script>
|
|
3
|
+
|
|
4
|
+
<table class="input-dataframe-example">
|
|
5
|
+
{#each value.slice(0, 3) as row}
|
|
6
|
+
<tr>
|
|
7
|
+
{#each row.slice(0, 3) as cell}
|
|
8
|
+
<td class="p-2">{cell}</td>
|
|
9
|
+
{/each}
|
|
10
|
+
{#if row.length > 3}
|
|
11
|
+
<td class="p-2">...</td>
|
|
12
|
+
{/if}
|
|
13
|
+
</tr>
|
|
14
|
+
{/each}
|
|
15
|
+
{#if value.length > 3}
|
|
16
|
+
<tr>
|
|
17
|
+
{#each Array(Math.min(4, value[0].length)) as _}
|
|
18
|
+
<td class="p-2">...</td>
|
|
19
|
+
{/each}
|
|
20
|
+
</tr>
|
|
21
|
+
{/if}
|
|
22
|
+
</table>
|
|
23
|
+
|
|
24
|
+
<style>
|
|
25
|
+
table {
|
|
26
|
+
border-collapse: separate;
|
|
27
|
+
}
|
|
28
|
+
</style>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { SvelteComponent } from "svelte";
|
|
2
|
+
declare const __propDef: {
|
|
3
|
+
props: {
|
|
4
|
+
value: (string | number)[][];
|
|
5
|
+
};
|
|
6
|
+
events: {
|
|
7
|
+
[evt: string]: CustomEvent<any>;
|
|
8
|
+
};
|
|
9
|
+
slots: {};
|
|
10
|
+
};
|
|
11
|
+
export type ExampleProps = typeof __propDef.props;
|
|
12
|
+
export type ExampleEvents = typeof __propDef.events;
|
|
13
|
+
export type ExampleSlots = typeof __propDef.slots;
|
|
14
|
+
export default class Example extends SvelteComponent<ExampleProps, ExampleEvents, ExampleSlots> {
|
|
15
|
+
}
|
|
16
|
+
export {};
|