@selvajs/ui 6.6.0-beta.6 → 6.6.0-beta.8
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/ErrorScreen.svelte +1 -1
- package/dist/components/compute/AppLayout.svelte +63 -26
- package/dist/components/layout/AppShell.svelte +10 -6
- package/dist/components/layout/PageHeader.svelte +11 -7
- package/dist/components/layout/SectionHeader.svelte +4 -2
- package/dist/components/layout/SideNav.svelte +19 -11
- package/dist/components/preview/ChartOutput.svelte +2 -2
- package/dist/components/preview/ImageOutput.svelte +1 -1
- package/dist/components/preview/OutputDisplay.svelte +1 -1
- package/dist/components/primitives/DataTable.svelte +38 -4
- package/dist/components/primitives/DataTable.svelte.d.ts +2 -0
- package/dist/components/primitives/alert-dialog/alert-dialog-content.svelte +1 -1
- package/dist/components/primitives/dialog/dialog-content.svelte +1 -1
- package/dist/components/primitives/drawer/Drawer.svelte +1 -1
- package/dist/components/viewer/MeshMetadataPanel.svelte +119 -0
- package/dist/components/viewer/MeshMetadataPanel.svelte.d.ts +9 -0
- package/dist/components/viewer/Viewer.svelte +59 -24
- package/dist/styles/base.css +21 -1
- package/dist/utils/file-download.js +4 -12
- package/package.json +8 -8
- package/src/lib/components/ErrorScreen.svelte +1 -1
- package/src/lib/components/compute/AppLayout.svelte +63 -26
- package/src/lib/components/layout/AppShell.svelte +10 -6
- package/src/lib/components/layout/PageHeader.svelte +11 -7
- package/src/lib/components/layout/SectionHeader.svelte +4 -2
- package/src/lib/components/layout/SideNav.svelte +19 -11
- package/src/lib/components/preview/ChartOutput.svelte +2 -2
- package/src/lib/components/preview/ImageOutput.svelte +1 -1
- package/src/lib/components/preview/OutputDisplay.svelte +1 -1
- package/src/lib/components/primitives/DataTable.svelte +38 -4
- package/src/lib/components/primitives/alert-dialog/alert-dialog-content.svelte +1 -1
- package/src/lib/components/primitives/dialog/dialog-content.svelte +1 -1
- package/src/lib/components/primitives/drawer/Drawer.svelte +1 -1
- package/src/lib/components/viewer/MeshMetadataPanel.svelte +119 -0
- package/src/lib/components/viewer/Viewer.svelte +59 -24
- package/src/lib/styles/base.css +21 -1
- package/src/lib/utils/file-download.ts +4 -10
- package/dist/components/viewer/MeshMetadataDialog.svelte +0 -126
- package/dist/components/viewer/MeshMetadataDialog.svelte.d.ts +0 -10
- package/src/lib/components/viewer/MeshMetadataDialog.svelte +0 -126
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import * as Dialog from '../primitives/dialog/index.js';
|
|
3
|
-
import { getLocaleContext } from '$lib/i18n/localeContext.svelte';
|
|
4
|
-
|
|
5
|
-
const locale = getLocaleContext();
|
|
6
|
-
const t = $derived(locale.messages);
|
|
7
|
-
|
|
8
|
-
interface Props {
|
|
9
|
-
open: boolean;
|
|
10
|
-
metadata: Record<string, any> | null;
|
|
11
|
-
meshName: string | null;
|
|
12
|
-
onOpenChange: (open: boolean) => void;
|
|
13
|
-
isFullscreen?: boolean;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
const EXCLUDED_KEYS = new Set(['name', 'layer', 'id']);
|
|
17
|
-
|
|
18
|
-
let {
|
|
19
|
-
open = $bindable(),
|
|
20
|
-
metadata,
|
|
21
|
-
meshName,
|
|
22
|
-
onOpenChange,
|
|
23
|
-
isFullscreen = false
|
|
24
|
-
}: Props = $props();
|
|
25
|
-
|
|
26
|
-
$effect(() => {
|
|
27
|
-
document.body.toggleAttribute('data-viewer-fullscreen', isFullscreen);
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
const getFilteredMetadata = () => {
|
|
31
|
-
if (!metadata) return {};
|
|
32
|
-
const entries = Object.entries(metadata).filter(([key]) => !EXCLUDED_KEYS.has(key));
|
|
33
|
-
const result: Record<string, unknown> = {};
|
|
34
|
-
for (const [key, value] of entries) {
|
|
35
|
-
if (
|
|
36
|
-
key === 'metadata' &&
|
|
37
|
-
typeof value === 'object' &&
|
|
38
|
-
value !== null &&
|
|
39
|
-
!Array.isArray(value)
|
|
40
|
-
) {
|
|
41
|
-
Object.assign(result, value);
|
|
42
|
-
} else {
|
|
43
|
-
result[key] = value;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
return result;
|
|
47
|
-
};
|
|
48
|
-
</script>
|
|
49
|
-
|
|
50
|
-
<Dialog.Root bind:open {onOpenChange}>
|
|
51
|
-
<Dialog.Content variant="flush" class="min-w-60 max-w-xs w-auto">
|
|
52
|
-
{#if meshName}
|
|
53
|
-
<div class="px-4 pt-3 pb-2 border-b">
|
|
54
|
-
<Dialog.Title size="sm">{meshName}</Dialog.Title>
|
|
55
|
-
</div>
|
|
56
|
-
{:else}
|
|
57
|
-
<Dialog.Title class="sr-only">{t.objectFallbackName}</Dialog.Title>
|
|
58
|
-
{/if}
|
|
59
|
-
|
|
60
|
-
<div class="max-h-80 overflow-y-auto">
|
|
61
|
-
{#if !metadata || Object.keys(getFilteredMetadata()).length === 0}
|
|
62
|
-
<p class="px-4 py-3 text-xs text-muted-foreground">{t.noMetadata}</p>
|
|
63
|
-
{:else}
|
|
64
|
-
<table class="text-xs w-full border-collapse">
|
|
65
|
-
<tbody>
|
|
66
|
-
{#each Object.entries(getFilteredMetadata()) as [key, value] (key)}
|
|
67
|
-
<tr class="border-b border-border/60 transition-colors hover:bg-muted/40">
|
|
68
|
-
<th
|
|
69
|
-
scope="row"
|
|
70
|
-
class="px-4 py-2 font-normal text-left align-top whitespace-nowrap text-muted-foreground"
|
|
71
|
-
>{key}</th
|
|
72
|
-
>
|
|
73
|
-
<td class="px-4 py-2 text-right align-top text-foreground">
|
|
74
|
-
{#if typeof value === 'object' && value !== null}
|
|
75
|
-
{#if Array.isArray(value)}
|
|
76
|
-
<div class="space-y-1 text-left">
|
|
77
|
-
{#each value as item, index (index)}
|
|
78
|
-
{#if typeof item === 'object'}
|
|
79
|
-
<div class="space-y-0.5">
|
|
80
|
-
{#each Object.entries(item) as [k, v] (k)}
|
|
81
|
-
<div class="gap-2 flex">
|
|
82
|
-
<span class="shrink-0 text-muted-foreground">{k}:</span>
|
|
83
|
-
<span>{v}</span>
|
|
84
|
-
</div>
|
|
85
|
-
{/each}
|
|
86
|
-
</div>
|
|
87
|
-
{:else}
|
|
88
|
-
<div>{item}</div>
|
|
89
|
-
{/if}
|
|
90
|
-
{/each}
|
|
91
|
-
</div>
|
|
92
|
-
{:else}
|
|
93
|
-
<div class="space-y-0.5 text-left">
|
|
94
|
-
{#each Object.entries(value) as [k, v] (k)}
|
|
95
|
-
<div class="gap-2 flex">
|
|
96
|
-
<span class="shrink-0 text-muted-foreground">{k}:</span>
|
|
97
|
-
<span>{v}</span>
|
|
98
|
-
</div>
|
|
99
|
-
{/each}
|
|
100
|
-
</div>
|
|
101
|
-
{/if}
|
|
102
|
-
{:else if typeof value === 'number'}
|
|
103
|
-
<span class="font-mono">{value}</span>
|
|
104
|
-
{:else if typeof value === 'boolean'}
|
|
105
|
-
<span class={value ? 'text-success' : 'text-muted-foreground'}
|
|
106
|
-
>{value ? 'true' : 'false'}</span
|
|
107
|
-
>
|
|
108
|
-
{:else}
|
|
109
|
-
<span class="break-all">{value}</span>
|
|
110
|
-
{/if}
|
|
111
|
-
</td>
|
|
112
|
-
</tr>
|
|
113
|
-
{/each}
|
|
114
|
-
</tbody>
|
|
115
|
-
</table>
|
|
116
|
-
{/if}
|
|
117
|
-
</div>
|
|
118
|
-
</Dialog.Content>
|
|
119
|
-
</Dialog.Root>
|
|
120
|
-
|
|
121
|
-
<style>
|
|
122
|
-
:global([data-viewer-fullscreen] [data-slot='dialog-content']),
|
|
123
|
-
:global([data-viewer-fullscreen] [data-slot='dialog-overlay']) {
|
|
124
|
-
z-index: 10001;
|
|
125
|
-
}
|
|
126
|
-
</style>
|