compote-ui 0.84.0 → 0.85.0
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/dist/components/data-table-v9/toolbar/data-table-export.svelte +146 -146
- package/dist/components/data-table-v9/xlsx/index.d.ts +5 -0
- package/dist/components/data-table-v9/xlsx/index.js +29 -5
- package/dist/icons/PhDownloadSimple.svelte +18 -18
- package/package.json +129 -129
- package/skills/data-table/SKILL.md +400 -400
- package/skills/data-table/references/column-options.md +181 -181
- package/skills/data-table/references/export.md +160 -158
|
@@ -1,146 +1,146 @@
|
|
|
1
|
-
<script lang="ts" generics="T extends RowData">
|
|
2
|
-
import type { RowData } from '@tanstack/svelte-table';
|
|
3
|
-
import { Menu as ArkMenu } from '@ark-ui/svelte/menu';
|
|
4
|
-
import * as Menu from '../../menu';
|
|
5
|
-
import * as Tooltip from '../../tooltip';
|
|
6
|
-
import { button } from '../../button/button.variants';
|
|
7
|
-
import { PhDownloadSimple } from '../../../icons';
|
|
8
|
-
import type { DataTableInstance } from '../data-table-utils';
|
|
9
|
-
import { csvExporter } from '../export/csv-exporter';
|
|
10
|
-
import { getExportData, getExportRows, type DataTableExportScope } from '../export/export-data';
|
|
11
|
-
import type { DataTableExporter } from '../export/types';
|
|
12
|
-
|
|
13
|
-
type Props = {
|
|
14
|
-
table: DataTableInstance<T>;
|
|
15
|
-
/** File formats to offer. One format and no selected rows: a plain button; otherwise a menu. */
|
|
16
|
-
exporters?: DataTableExporter[];
|
|
17
|
-
/** File name without extension. */
|
|
18
|
-
filename?: string;
|
|
19
|
-
/** Text label for the trigger. When omitted, a download icon is shown instead. */
|
|
20
|
-
triggerLabel?: string;
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
let { table, exporters = [csvExporter], filename = 'export', triggerLabel }: Props = $props();
|
|
24
|
-
|
|
25
|
-
// Menu and tooltip share one trigger element, so both must agree on its id.
|
|
26
|
-
const triggerId = $props.id();
|
|
27
|
-
|
|
28
|
-
let pending = $state(false);
|
|
29
|
-
|
|
30
|
-
// Row model reads aren't reactive on their own: read the slices they depend on first.
|
|
31
|
-
const rowSlices = $derived.by(() => [
|
|
32
|
-
table.options.data,
|
|
33
|
-
table.atoms.columnFilters.get(),
|
|
34
|
-
table.atoms.globalFilter.get(),
|
|
35
|
-
table.atoms.sorting.get(),
|
|
36
|
-
table.atoms.rowSelection.get()
|
|
37
|
-
]);
|
|
38
|
-
const rowCount = $derived.by(() => {
|
|
39
|
-
void rowSlices;
|
|
40
|
-
return getExportRows(table, 'filtered').length;
|
|
41
|
-
});
|
|
42
|
-
// Counted exactly as the export picks them: selected rows the filter keeps.
|
|
43
|
-
const selectedCount = $derived.by(() => {
|
|
44
|
-
void rowSlices;
|
|
45
|
-
return getExportRows(table, 'selected').length;
|
|
46
|
-
});
|
|
47
|
-
const hasSelection = $derived(selectedCount > 0);
|
|
48
|
-
// The menu's choice, reset to all rows whenever the selection empties or starts again, so a
|
|
49
|
-
// "Selected rows" pick from an earlier selection never carries over to a new one.
|
|
50
|
-
let chosenScope = $derived.by<DataTableExportScope>(() => {
|
|
51
|
-
void hasSelection;
|
|
52
|
-
return 'filtered';
|
|
53
|
-
});
|
|
54
|
-
// `selected` with nothing selected would write an empty file: fall back to all rows.
|
|
55
|
-
const scope = $derived<DataTableExportScope>(hasSelection ? chosenScope : 'filtered');
|
|
56
|
-
const showMenu = $derived(exporters.length > 1 || hasSelection);
|
|
57
|
-
|
|
58
|
-
async function runExport(exporter: DataTableExporter) {
|
|
59
|
-
if (pending) return;
|
|
60
|
-
pending = true;
|
|
61
|
-
const exportScope = scope;
|
|
62
|
-
try {
|
|
63
|
-
await exporter.export({
|
|
64
|
-
table,
|
|
65
|
-
scope: exportScope,
|
|
66
|
-
filename,
|
|
67
|
-
getData: () => getExportData(table, exportScope)
|
|
68
|
-
});
|
|
69
|
-
} finally {
|
|
70
|
-
pending = false;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
</script>
|
|
74
|
-
|
|
75
|
-
{#snippet triggerContent()}
|
|
76
|
-
<PhDownloadSimple />
|
|
77
|
-
{triggerLabel}
|
|
78
|
-
{/snippet}
|
|
79
|
-
|
|
80
|
-
{#if showMenu}
|
|
81
|
-
<Menu.Root ids={{ trigger: triggerId }} positioning={{ placement: 'bottom-end' }}>
|
|
82
|
-
<Tooltip.Root ids={{ trigger: triggerId }} disabled={!!triggerLabel}>
|
|
83
|
-
<Tooltip.Trigger>
|
|
84
|
-
{#snippet asChild(tooltipProps)}
|
|
85
|
-
<ArkMenu.Trigger
|
|
86
|
-
{...tooltipProps()}
|
|
87
|
-
aria-label={triggerLabel ? undefined : 'Export'}
|
|
88
|
-
aria-busy={pending}
|
|
89
|
-
class={button({ variant: 'outline', size: triggerLabel ? 'default' : 'icon' })}
|
|
90
|
-
>
|
|
91
|
-
{@render triggerContent()}
|
|
92
|
-
</ArkMenu.Trigger>
|
|
93
|
-
{/snippet}
|
|
94
|
-
</Tooltip.Trigger>
|
|
95
|
-
<Tooltip.Content>Export</Tooltip.Content>
|
|
96
|
-
</Tooltip.Root>
|
|
97
|
-
|
|
98
|
-
<Menu.Content class="min-w-44">
|
|
99
|
-
{#if hasSelection}
|
|
100
|
-
<Menu.RadioItemGroup
|
|
101
|
-
value={scope}
|
|
102
|
-
onValueChange={(details) => (chosenScope = details.value as DataTableExportScope)}
|
|
103
|
-
>
|
|
104
|
-
<Menu.RadioItem value="filtered" closeOnSelect={false}>
|
|
105
|
-
All rows ({rowCount})
|
|
106
|
-
</Menu.RadioItem>
|
|
107
|
-
<Menu.RadioItem value="selected" closeOnSelect={false}>
|
|
108
|
-
Selected rows ({selectedCount})
|
|
109
|
-
</Menu.RadioItem>
|
|
110
|
-
</Menu.RadioItemGroup>
|
|
111
|
-
<Menu.Separator />
|
|
112
|
-
{/if}
|
|
113
|
-
{#each exporters as exporter (exporter.id)}
|
|
114
|
-
{@const Icon = exporter.icon}
|
|
115
|
-
<Menu.Item
|
|
116
|
-
value={`export:${exporter.id}`}
|
|
117
|
-
disabled={pending}
|
|
118
|
-
onSelect={() => runExport(exporter)}
|
|
119
|
-
>
|
|
120
|
-
{#if Icon}<Icon class="text-ink-dim" />{/if}
|
|
121
|
-
{exporter.label}
|
|
122
|
-
</Menu.Item>
|
|
123
|
-
{/each}
|
|
124
|
-
</Menu.Content>
|
|
125
|
-
</Menu.Root>
|
|
126
|
-
{:else}
|
|
127
|
-
{@const exporter = exporters[0]}
|
|
128
|
-
{#if exporter}
|
|
129
|
-
<Tooltip.Root disabled={!!triggerLabel}>
|
|
130
|
-
<!-- aria-disabled instead of disabled so keyboard focus isn't lost mid-export -->
|
|
131
|
-
<Tooltip.Trigger
|
|
132
|
-
type="button"
|
|
133
|
-
variant="outline"
|
|
134
|
-
size={triggerLabel ? 'default' : 'icon'}
|
|
135
|
-
class="aria-disabled:cursor-default"
|
|
136
|
-
aria-label={triggerLabel ? undefined : `Export ${exporter.label}`}
|
|
137
|
-
aria-busy={pending}
|
|
138
|
-
aria-disabled={pending}
|
|
139
|
-
onclick={() => runExport(exporter)}
|
|
140
|
-
>
|
|
141
|
-
{@render triggerContent()}
|
|
142
|
-
</Tooltip.Trigger>
|
|
143
|
-
<Tooltip.Content>Export {exporter.label}</Tooltip.Content>
|
|
144
|
-
</Tooltip.Root>
|
|
145
|
-
{/if}
|
|
146
|
-
{/if}
|
|
1
|
+
<script lang="ts" generics="T extends RowData">
|
|
2
|
+
import type { RowData } from '@tanstack/svelte-table';
|
|
3
|
+
import { Menu as ArkMenu } from '@ark-ui/svelte/menu';
|
|
4
|
+
import * as Menu from '../../menu';
|
|
5
|
+
import * as Tooltip from '../../tooltip';
|
|
6
|
+
import { button } from '../../button/button.variants';
|
|
7
|
+
import { PhDownloadSimple } from '../../../icons';
|
|
8
|
+
import type { DataTableInstance } from '../data-table-utils';
|
|
9
|
+
import { csvExporter } from '../export/csv-exporter';
|
|
10
|
+
import { getExportData, getExportRows, type DataTableExportScope } from '../export/export-data';
|
|
11
|
+
import type { DataTableExporter } from '../export/types';
|
|
12
|
+
|
|
13
|
+
type Props = {
|
|
14
|
+
table: DataTableInstance<T>;
|
|
15
|
+
/** File formats to offer. One format and no selected rows: a plain button; otherwise a menu. */
|
|
16
|
+
exporters?: DataTableExporter[];
|
|
17
|
+
/** File name without extension. */
|
|
18
|
+
filename?: string;
|
|
19
|
+
/** Text label for the trigger. When omitted, a download icon is shown instead. */
|
|
20
|
+
triggerLabel?: string;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
let { table, exporters = [csvExporter], filename = 'export', triggerLabel }: Props = $props();
|
|
24
|
+
|
|
25
|
+
// Menu and tooltip share one trigger element, so both must agree on its id.
|
|
26
|
+
const triggerId = $props.id();
|
|
27
|
+
|
|
28
|
+
let pending = $state(false);
|
|
29
|
+
|
|
30
|
+
// Row model reads aren't reactive on their own: read the slices they depend on first.
|
|
31
|
+
const rowSlices = $derived.by(() => [
|
|
32
|
+
table.options.data,
|
|
33
|
+
table.atoms.columnFilters.get(),
|
|
34
|
+
table.atoms.globalFilter.get(),
|
|
35
|
+
table.atoms.sorting.get(),
|
|
36
|
+
table.atoms.rowSelection.get()
|
|
37
|
+
]);
|
|
38
|
+
const rowCount = $derived.by(() => {
|
|
39
|
+
void rowSlices;
|
|
40
|
+
return getExportRows(table, 'filtered').length;
|
|
41
|
+
});
|
|
42
|
+
// Counted exactly as the export picks them: selected rows the filter keeps.
|
|
43
|
+
const selectedCount = $derived.by(() => {
|
|
44
|
+
void rowSlices;
|
|
45
|
+
return getExportRows(table, 'selected').length;
|
|
46
|
+
});
|
|
47
|
+
const hasSelection = $derived(selectedCount > 0);
|
|
48
|
+
// The menu's choice, reset to all rows whenever the selection empties or starts again, so a
|
|
49
|
+
// "Selected rows" pick from an earlier selection never carries over to a new one.
|
|
50
|
+
let chosenScope = $derived.by<DataTableExportScope>(() => {
|
|
51
|
+
void hasSelection;
|
|
52
|
+
return 'filtered';
|
|
53
|
+
});
|
|
54
|
+
// `selected` with nothing selected would write an empty file: fall back to all rows.
|
|
55
|
+
const scope = $derived<DataTableExportScope>(hasSelection ? chosenScope : 'filtered');
|
|
56
|
+
const showMenu = $derived(exporters.length > 1 || hasSelection);
|
|
57
|
+
|
|
58
|
+
async function runExport(exporter: DataTableExporter) {
|
|
59
|
+
if (pending) return;
|
|
60
|
+
pending = true;
|
|
61
|
+
const exportScope = scope;
|
|
62
|
+
try {
|
|
63
|
+
await exporter.export({
|
|
64
|
+
table,
|
|
65
|
+
scope: exportScope,
|
|
66
|
+
filename,
|
|
67
|
+
getData: () => getExportData(table, exportScope)
|
|
68
|
+
});
|
|
69
|
+
} finally {
|
|
70
|
+
pending = false;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
</script>
|
|
74
|
+
|
|
75
|
+
{#snippet triggerContent()}
|
|
76
|
+
<PhDownloadSimple />
|
|
77
|
+
{triggerLabel}
|
|
78
|
+
{/snippet}
|
|
79
|
+
|
|
80
|
+
{#if showMenu}
|
|
81
|
+
<Menu.Root ids={{ trigger: triggerId }} positioning={{ placement: 'bottom-end' }}>
|
|
82
|
+
<Tooltip.Root ids={{ trigger: triggerId }} disabled={!!triggerLabel}>
|
|
83
|
+
<Tooltip.Trigger>
|
|
84
|
+
{#snippet asChild(tooltipProps)}
|
|
85
|
+
<ArkMenu.Trigger
|
|
86
|
+
{...tooltipProps()}
|
|
87
|
+
aria-label={triggerLabel ? undefined : 'Export'}
|
|
88
|
+
aria-busy={pending}
|
|
89
|
+
class={button({ variant: 'outline', size: triggerLabel ? 'default' : 'icon' })}
|
|
90
|
+
>
|
|
91
|
+
{@render triggerContent()}
|
|
92
|
+
</ArkMenu.Trigger>
|
|
93
|
+
{/snippet}
|
|
94
|
+
</Tooltip.Trigger>
|
|
95
|
+
<Tooltip.Content>Export</Tooltip.Content>
|
|
96
|
+
</Tooltip.Root>
|
|
97
|
+
|
|
98
|
+
<Menu.Content class="min-w-44">
|
|
99
|
+
{#if hasSelection}
|
|
100
|
+
<Menu.RadioItemGroup
|
|
101
|
+
value={scope}
|
|
102
|
+
onValueChange={(details) => (chosenScope = details.value as DataTableExportScope)}
|
|
103
|
+
>
|
|
104
|
+
<Menu.RadioItem value="filtered" closeOnSelect={false}>
|
|
105
|
+
All rows ({rowCount})
|
|
106
|
+
</Menu.RadioItem>
|
|
107
|
+
<Menu.RadioItem value="selected" closeOnSelect={false}>
|
|
108
|
+
Selected rows ({selectedCount})
|
|
109
|
+
</Menu.RadioItem>
|
|
110
|
+
</Menu.RadioItemGroup>
|
|
111
|
+
<Menu.Separator />
|
|
112
|
+
{/if}
|
|
113
|
+
{#each exporters as exporter (exporter.id)}
|
|
114
|
+
{@const Icon = exporter.icon}
|
|
115
|
+
<Menu.Item
|
|
116
|
+
value={`export:${exporter.id}`}
|
|
117
|
+
disabled={pending}
|
|
118
|
+
onSelect={() => runExport(exporter)}
|
|
119
|
+
>
|
|
120
|
+
{#if Icon}<Icon class="text-ink-dim" />{/if}
|
|
121
|
+
{exporter.label}
|
|
122
|
+
</Menu.Item>
|
|
123
|
+
{/each}
|
|
124
|
+
</Menu.Content>
|
|
125
|
+
</Menu.Root>
|
|
126
|
+
{:else}
|
|
127
|
+
{@const exporter = exporters[0]}
|
|
128
|
+
{#if exporter}
|
|
129
|
+
<Tooltip.Root disabled={!!triggerLabel}>
|
|
130
|
+
<!-- aria-disabled instead of disabled so keyboard focus isn't lost mid-export -->
|
|
131
|
+
<Tooltip.Trigger
|
|
132
|
+
type="button"
|
|
133
|
+
variant="outline"
|
|
134
|
+
size={triggerLabel ? 'default' : 'icon'}
|
|
135
|
+
class="aria-disabled:cursor-default"
|
|
136
|
+
aria-label={triggerLabel ? undefined : `Export ${exporter.label}`}
|
|
137
|
+
aria-busy={pending}
|
|
138
|
+
aria-disabled={pending}
|
|
139
|
+
onclick={() => runExport(exporter)}
|
|
140
|
+
>
|
|
141
|
+
{@render triggerContent()}
|
|
142
|
+
</Tooltip.Trigger>
|
|
143
|
+
<Tooltip.Content>Export {exporter.label}</Tooltip.Content>
|
|
144
|
+
</Tooltip.Root>
|
|
145
|
+
{/if}
|
|
146
|
+
{/if}
|
|
@@ -9,6 +9,11 @@ export type XlsxExporterOptions = Partial<XlsxDateFormats> & {
|
|
|
9
9
|
/** Sheet name (Excel allows 31 characters, without `[ ] : * ? / \`). */
|
|
10
10
|
sheet?: string;
|
|
11
11
|
};
|
|
12
|
+
/**
|
|
13
|
+
* A width per column that fits its header and the longest cell text (the text the table
|
|
14
|
+
* shows, which is close to what Excel shows), plus padding, between 8 and 60 characters.
|
|
15
|
+
*/
|
|
16
|
+
export declare function xlsxColumnWidths(data: DataTableExportData): number[];
|
|
12
17
|
/** The export data as sheet rows: a bold header row, then typed cells. */
|
|
13
18
|
export declare function exportDataToSheet(data: DataTableExportData, formats?: XlsxDateFormats): XlsxCell[][];
|
|
14
19
|
/**
|
|
@@ -2,8 +2,34 @@ import { PhMicrosoftExcelLogo } from '../../../icons';
|
|
|
2
2
|
import { downloadBlob } from '../../../utils/download';
|
|
3
3
|
import { DEFAULT_XLSX_DATE_FORMATS, toXlsxCell } from './xlsx-cell';
|
|
4
4
|
export { DEFAULT_XLSX_DATE_FORMATS, toXlsxCell, xlsxNumberFormat } from './xlsx-cell';
|
|
5
|
-
//
|
|
6
|
-
const
|
|
5
|
+
// Column widths in characters of Excel's default font.
|
|
6
|
+
const MIN_COLUMN_WIDTH = 8;
|
|
7
|
+
const MAX_COLUMN_WIDTH = 60;
|
|
8
|
+
// One character of slack: char counts already overshoot narrow lowercase text, and this keeps
|
|
9
|
+
// wide letters (W, M, capitals) from being cut off.
|
|
10
|
+
const COLUMN_WIDTH_PADDING = 1;
|
|
11
|
+
/** Characters in the longest line of `text` (code points, so č or 🙂 count once). */
|
|
12
|
+
function longestLine(text) {
|
|
13
|
+
let longest = 0;
|
|
14
|
+
for (const line of text.split(/\r\n|\r|\n/))
|
|
15
|
+
longest = Math.max(longest, Array.from(line).length);
|
|
16
|
+
return longest;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* A width per column that fits its header and the longest cell text (the text the table
|
|
20
|
+
* shows, which is close to what Excel shows), plus padding, between 8 and 60 characters.
|
|
21
|
+
*/
|
|
22
|
+
export function xlsxColumnWidths(data) {
|
|
23
|
+
return data.columns.map((column, index) => {
|
|
24
|
+
let longest = longestLine(column.header);
|
|
25
|
+
for (const cells of data.rows) {
|
|
26
|
+
const text = cells[index]?.text;
|
|
27
|
+
if (text)
|
|
28
|
+
longest = Math.max(longest, longestLine(text));
|
|
29
|
+
}
|
|
30
|
+
return Math.min(MAX_COLUMN_WIDTH, Math.max(MIN_COLUMN_WIDTH, longest + COLUMN_WIDTH_PADDING));
|
|
31
|
+
});
|
|
32
|
+
}
|
|
7
33
|
/** The export data as sheet rows: a bold header row, then typed cells. */
|
|
8
34
|
export function exportDataToSheet(data, formats = DEFAULT_XLSX_DATE_FORMATS) {
|
|
9
35
|
const header = data.columns.map((column) => ({
|
|
@@ -29,9 +55,7 @@ export async function exportDataToXlsxBlob(data, options = {}) {
|
|
|
29
55
|
return writeXlsxFile(sheetData, {
|
|
30
56
|
sheet: options.sheet,
|
|
31
57
|
stickyRowsCount: 1,
|
|
32
|
-
columns: data.
|
|
33
|
-
width: Math.max(8, Math.round(column.size / PX_PER_CHAR))
|
|
34
|
-
}))
|
|
58
|
+
columns: xlsxColumnWidths(data).map((width) => ({ width }))
|
|
35
59
|
}).toBlob();
|
|
36
60
|
}
|
|
37
61
|
function pickFormats({ date, time, dateTime }) {
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
let { class: className = '', ...restProps } = $props();
|
|
3
|
-
</script>
|
|
4
|
-
|
|
5
|
-
<svg
|
|
6
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
7
|
-
width="1em"
|
|
8
|
-
height="1em"
|
|
9
|
-
viewBox="0 0 256 256"
|
|
10
|
-
class={className}
|
|
11
|
-
{...restProps}
|
|
12
|
-
>
|
|
13
|
-
<path
|
|
14
|
-
fill="currentColor"
|
|
15
|
-
d="M224 144v64a8 8 0 0 1-8 8H40a8 8 0 0 1-8-8v-64a8 8 0 0 1 16 0v56h160v-56a8 8 0 0 1 16 0m-101.66 5.66a8 8 0 0 0 11.32 0l40-40a8 8 0 0 0-11.32-11.32L136 124.69V32a8 8 0 0 0-16 0v92.69L93.66 98.34a8 8 0 0 0-11.32 11.32Z"
|
|
16
|
-
/>
|
|
17
|
-
</svg>
|
|
18
|
-
<!-- Icon from Phosphor by Phosphor Icons - https://github.com/phosphor-icons/core/blob/main/LICENSE -->
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
let { class: className = '', ...restProps } = $props();
|
|
3
|
+
</script>
|
|
4
|
+
|
|
5
|
+
<svg
|
|
6
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
7
|
+
width="1em"
|
|
8
|
+
height="1em"
|
|
9
|
+
viewBox="0 0 256 256"
|
|
10
|
+
class={className}
|
|
11
|
+
{...restProps}
|
|
12
|
+
>
|
|
13
|
+
<path
|
|
14
|
+
fill="currentColor"
|
|
15
|
+
d="M224 144v64a8 8 0 0 1-8 8H40a8 8 0 0 1-8-8v-64a8 8 0 0 1 16 0v56h160v-56a8 8 0 0 1 16 0m-101.66 5.66a8 8 0 0 0 11.32 0l40-40a8 8 0 0 0-11.32-11.32L136 124.69V32a8 8 0 0 0-16 0v92.69L93.66 98.34a8 8 0 0 0-11.32 11.32Z"
|
|
16
|
+
/>
|
|
17
|
+
</svg>
|
|
18
|
+
<!-- Icon from Phosphor by Phosphor Icons - https://github.com/phosphor-icons/core/blob/main/LICENSE -->
|
package/package.json
CHANGED
|
@@ -1,129 +1,129 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "compote-ui",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"license": "MIT",
|
|
5
|
-
"repository": {
|
|
6
|
-
"type": "git",
|
|
7
|
-
"url": "git+https://github.com/Tihomir971/compote-ui.git"
|
|
8
|
-
},
|
|
9
|
-
"scripts": {
|
|
10
|
-
"dev": "vite dev --open",
|
|
11
|
-
"build": "vite build && npm run prepack",
|
|
12
|
-
"build:docs": "vite build",
|
|
13
|
-
"preview": "vite preview",
|
|
14
|
-
"prepare": "svelte-kit sync || echo ''",
|
|
15
|
-
"prepack": "svelte-kit sync && svelte-package && publint",
|
|
16
|
-
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
|
|
17
|
-
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
|
|
18
|
-
"test": "vitest run",
|
|
19
|
-
"test:watch": "vitest",
|
|
20
|
-
"lint": "prettier --check . && eslint .",
|
|
21
|
-
"format": "prettier --write .",
|
|
22
|
-
"patch": "npm version patch && npm publish",
|
|
23
|
-
"minor": "npm version minor && npm publish"
|
|
24
|
-
},
|
|
25
|
-
"imports": {
|
|
26
|
-
"#lib": "./src/lib/index.ts",
|
|
27
|
-
"#lib/*": "./src/lib/*"
|
|
28
|
-
},
|
|
29
|
-
"files": [
|
|
30
|
-
"dist",
|
|
31
|
-
"!dist/**/*.test.*",
|
|
32
|
-
"!dist/**/*.spec.*",
|
|
33
|
-
"skills",
|
|
34
|
-
"!skills/_artifacts"
|
|
35
|
-
],
|
|
36
|
-
"sideEffects": [
|
|
37
|
-
"**/*.css",
|
|
38
|
-
".svelte-kit/**"
|
|
39
|
-
],
|
|
40
|
-
"svelte": "./dist/index.js",
|
|
41
|
-
"types": "./dist/index.d.ts",
|
|
42
|
-
"type": "module",
|
|
43
|
-
"exports": {
|
|
44
|
-
".": {
|
|
45
|
-
"types": "./dist/index.d.ts",
|
|
46
|
-
"svelte": "./dist/index.js"
|
|
47
|
-
},
|
|
48
|
-
"./data-table": {
|
|
49
|
-
"types": "./dist/components/data-table-v9/index.d.ts",
|
|
50
|
-
"svelte": "./dist/components/data-table-v9/index.js"
|
|
51
|
-
},
|
|
52
|
-
"./data-table/virtual": {
|
|
53
|
-
"types": "./dist/components/data-table-v9/virtual/index.d.ts",
|
|
54
|
-
"svelte": "./dist/components/data-table-v9/virtual/index.js"
|
|
55
|
-
},
|
|
56
|
-
"./data-table/xlsx": {
|
|
57
|
-
"types": "./dist/components/data-table-v9/xlsx/index.d.ts",
|
|
58
|
-
"svelte": "./dist/components/data-table-v9/xlsx/index.js"
|
|
59
|
-
},
|
|
60
|
-
"./theme.css": "./dist/theme.css"
|
|
61
|
-
},
|
|
62
|
-
"peerDependencies": {
|
|
63
|
-
"@tanstack/svelte-table": ">=9.1.0 <10",
|
|
64
|
-
"svelte": "^5.0.0",
|
|
65
|
-
"write-excel-file": "^4.1.0"
|
|
66
|
-
},
|
|
67
|
-
"peerDependenciesMeta": {
|
|
68
|
-
"@tanstack/svelte-table": {
|
|
69
|
-
"optional": true
|
|
70
|
-
},
|
|
71
|
-
"write-excel-file": {
|
|
72
|
-
"optional": true
|
|
73
|
-
}
|
|
74
|
-
},
|
|
75
|
-
"devDependencies": {
|
|
76
|
-
"@eslint/js": "^10.0.1",
|
|
77
|
-
"@faker-js/faker": "^10.6.0",
|
|
78
|
-
"@iconify-json/ph": "^1.2.2",
|
|
79
|
-
"@sveltejs/adapter-auto": "^8.0.0",
|
|
80
|
-
"@sveltejs/adapter-cloudflare": "^8.0.1",
|
|
81
|
-
"@sveltejs/kit": "^3.1.0",
|
|
82
|
-
"@sveltejs/package": "^3.0.1",
|
|
83
|
-
"@sveltejs/vite-plugin-svelte": "^7.3.1",
|
|
84
|
-
"@tailwindcss/vite": "^4.3.3",
|
|
85
|
-
"@tanstack/intent": "^0.5.5",
|
|
86
|
-
"@tanstack/svelte-table": "9.3.1",
|
|
87
|
-
"@types/node": "^24.19.2",
|
|
88
|
-
"eslint": "^10.12.0",
|
|
89
|
-
"eslint-config-prettier": "^10.1.8",
|
|
90
|
-
"eslint-plugin-svelte": "^3.23.1",
|
|
91
|
-
"fflate": "^0.8.2",
|
|
92
|
-
"globals": "^17.13.0",
|
|
93
|
-
"prettier": "^3.9.10",
|
|
94
|
-
"prettier-plugin-svelte": "^4.1.1",
|
|
95
|
-
"prettier-plugin-tailwindcss": "^0.8.1",
|
|
96
|
-
"publint": "^0.3.25",
|
|
97
|
-
"svelte": "^5.57.2",
|
|
98
|
-
"svelte-check": "^4.7.6",
|
|
99
|
-
"tailwindcss": "^4.3.3",
|
|
100
|
-
"tw-animate-css": "^1.4.0",
|
|
101
|
-
"typescript": "^6.0.3",
|
|
102
|
-
"typescript-eslint": "^8.71.2",
|
|
103
|
-
"unplugin-icons": "^24.0.0",
|
|
104
|
-
"vite": "^8.3.4",
|
|
105
|
-
"vitest": "^5.0.4",
|
|
106
|
-
"wrangler": "^4.151.0",
|
|
107
|
-
"write-excel-file": "^4.1.1"
|
|
108
|
-
},
|
|
109
|
-
"keywords": [
|
|
110
|
-
"svelte",
|
|
111
|
-
"tanstack-intent"
|
|
112
|
-
],
|
|
113
|
-
"dependencies": {
|
|
114
|
-
"@ark-ui/svelte": "^5.24.3",
|
|
115
|
-
"@fontsource-variable/nunito-sans": "^5.2.7",
|
|
116
|
-
"@internationalized/date": "^3.12.4",
|
|
117
|
-
"@tanstack/svelte-virtual": "^3.13.45",
|
|
118
|
-
"runed": "^0.37.1",
|
|
119
|
-
"svelte-tel-input": "^4.3.3",
|
|
120
|
-
"tailwind-merge": "^3.7.0",
|
|
121
|
-
"tailwind-variants": "^3.3.1"
|
|
122
|
-
},
|
|
123
|
-
"intent": {
|
|
124
|
-
"skills": [
|
|
125
|
-
"compote-ui",
|
|
126
|
-
"@tanstack/svelte-table"
|
|
127
|
-
]
|
|
128
|
-
}
|
|
129
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "compote-ui",
|
|
3
|
+
"version": "0.85.0",
|
|
4
|
+
"license": "MIT",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git+https://github.com/Tihomir971/compote-ui.git"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"dev": "vite dev --open",
|
|
11
|
+
"build": "vite build && npm run prepack",
|
|
12
|
+
"build:docs": "vite build",
|
|
13
|
+
"preview": "vite preview",
|
|
14
|
+
"prepare": "svelte-kit sync || echo ''",
|
|
15
|
+
"prepack": "svelte-kit sync && svelte-package && publint",
|
|
16
|
+
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
|
|
17
|
+
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
|
|
18
|
+
"test": "vitest run",
|
|
19
|
+
"test:watch": "vitest",
|
|
20
|
+
"lint": "prettier --check . && eslint .",
|
|
21
|
+
"format": "prettier --write .",
|
|
22
|
+
"patch": "npm version patch && npm publish",
|
|
23
|
+
"minor": "npm version minor && npm publish"
|
|
24
|
+
},
|
|
25
|
+
"imports": {
|
|
26
|
+
"#lib": "./src/lib/index.ts",
|
|
27
|
+
"#lib/*": "./src/lib/*"
|
|
28
|
+
},
|
|
29
|
+
"files": [
|
|
30
|
+
"dist",
|
|
31
|
+
"!dist/**/*.test.*",
|
|
32
|
+
"!dist/**/*.spec.*",
|
|
33
|
+
"skills",
|
|
34
|
+
"!skills/_artifacts"
|
|
35
|
+
],
|
|
36
|
+
"sideEffects": [
|
|
37
|
+
"**/*.css",
|
|
38
|
+
".svelte-kit/**"
|
|
39
|
+
],
|
|
40
|
+
"svelte": "./dist/index.js",
|
|
41
|
+
"types": "./dist/index.d.ts",
|
|
42
|
+
"type": "module",
|
|
43
|
+
"exports": {
|
|
44
|
+
".": {
|
|
45
|
+
"types": "./dist/index.d.ts",
|
|
46
|
+
"svelte": "./dist/index.js"
|
|
47
|
+
},
|
|
48
|
+
"./data-table": {
|
|
49
|
+
"types": "./dist/components/data-table-v9/index.d.ts",
|
|
50
|
+
"svelte": "./dist/components/data-table-v9/index.js"
|
|
51
|
+
},
|
|
52
|
+
"./data-table/virtual": {
|
|
53
|
+
"types": "./dist/components/data-table-v9/virtual/index.d.ts",
|
|
54
|
+
"svelte": "./dist/components/data-table-v9/virtual/index.js"
|
|
55
|
+
},
|
|
56
|
+
"./data-table/xlsx": {
|
|
57
|
+
"types": "./dist/components/data-table-v9/xlsx/index.d.ts",
|
|
58
|
+
"svelte": "./dist/components/data-table-v9/xlsx/index.js"
|
|
59
|
+
},
|
|
60
|
+
"./theme.css": "./dist/theme.css"
|
|
61
|
+
},
|
|
62
|
+
"peerDependencies": {
|
|
63
|
+
"@tanstack/svelte-table": ">=9.1.0 <10",
|
|
64
|
+
"svelte": "^5.0.0",
|
|
65
|
+
"write-excel-file": "^4.1.0"
|
|
66
|
+
},
|
|
67
|
+
"peerDependenciesMeta": {
|
|
68
|
+
"@tanstack/svelte-table": {
|
|
69
|
+
"optional": true
|
|
70
|
+
},
|
|
71
|
+
"write-excel-file": {
|
|
72
|
+
"optional": true
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
"devDependencies": {
|
|
76
|
+
"@eslint/js": "^10.0.1",
|
|
77
|
+
"@faker-js/faker": "^10.6.0",
|
|
78
|
+
"@iconify-json/ph": "^1.2.2",
|
|
79
|
+
"@sveltejs/adapter-auto": "^8.0.0",
|
|
80
|
+
"@sveltejs/adapter-cloudflare": "^8.0.1",
|
|
81
|
+
"@sveltejs/kit": "^3.1.0",
|
|
82
|
+
"@sveltejs/package": "^3.0.1",
|
|
83
|
+
"@sveltejs/vite-plugin-svelte": "^7.3.1",
|
|
84
|
+
"@tailwindcss/vite": "^4.3.3",
|
|
85
|
+
"@tanstack/intent": "^0.5.5",
|
|
86
|
+
"@tanstack/svelte-table": "9.3.1",
|
|
87
|
+
"@types/node": "^24.19.2",
|
|
88
|
+
"eslint": "^10.12.0",
|
|
89
|
+
"eslint-config-prettier": "^10.1.8",
|
|
90
|
+
"eslint-plugin-svelte": "^3.23.1",
|
|
91
|
+
"fflate": "^0.8.2",
|
|
92
|
+
"globals": "^17.13.0",
|
|
93
|
+
"prettier": "^3.9.10",
|
|
94
|
+
"prettier-plugin-svelte": "^4.1.1",
|
|
95
|
+
"prettier-plugin-tailwindcss": "^0.8.1",
|
|
96
|
+
"publint": "^0.3.25",
|
|
97
|
+
"svelte": "^5.57.2",
|
|
98
|
+
"svelte-check": "^4.7.6",
|
|
99
|
+
"tailwindcss": "^4.3.3",
|
|
100
|
+
"tw-animate-css": "^1.4.0",
|
|
101
|
+
"typescript": "^6.0.3",
|
|
102
|
+
"typescript-eslint": "^8.71.2",
|
|
103
|
+
"unplugin-icons": "^24.0.0",
|
|
104
|
+
"vite": "^8.3.4",
|
|
105
|
+
"vitest": "^5.0.4",
|
|
106
|
+
"wrangler": "^4.151.0",
|
|
107
|
+
"write-excel-file": "^4.1.1"
|
|
108
|
+
},
|
|
109
|
+
"keywords": [
|
|
110
|
+
"svelte",
|
|
111
|
+
"tanstack-intent"
|
|
112
|
+
],
|
|
113
|
+
"dependencies": {
|
|
114
|
+
"@ark-ui/svelte": "^5.24.3",
|
|
115
|
+
"@fontsource-variable/nunito-sans": "^5.2.7",
|
|
116
|
+
"@internationalized/date": "^3.12.4",
|
|
117
|
+
"@tanstack/svelte-virtual": "^3.13.45",
|
|
118
|
+
"runed": "^0.37.1",
|
|
119
|
+
"svelte-tel-input": "^4.3.3",
|
|
120
|
+
"tailwind-merge": "^3.7.0",
|
|
121
|
+
"tailwind-variants": "^3.3.1"
|
|
122
|
+
},
|
|
123
|
+
"intent": {
|
|
124
|
+
"skills": [
|
|
125
|
+
"compote-ui",
|
|
126
|
+
"@tanstack/svelte-table"
|
|
127
|
+
]
|
|
128
|
+
}
|
|
129
|
+
}
|