@svadmin/ui 0.29.0 → 0.29.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/package.json +20 -9
- package/src/README.md +0 -18
- package/src/actions.ts +0 -110
- package/src/app.css +0 -519
- package/src/component-registry.svelte.ts +0 -60
- package/src/components/AICommandBar.svelte +0 -180
- package/src/components/AboutSettings.svelte +0 -106
- package/src/components/AdminApp.svelte +0 -199
- package/src/components/AnimatedCounter.svelte +0 -46
- package/src/components/AnomalyBadge.svelte +0 -65
- package/src/components/AppearanceSettings.svelte +0 -183
- package/src/components/AuditLogDrawer.svelte +0 -93
- package/src/components/AuditLogViewer.svelte +0 -226
- package/src/components/Authenticated.svelte +0 -51
- package/src/components/AutoForm.svelte +0 -242
- package/src/components/AutoSaveIndicator.svelte +0 -35
- package/src/components/AutoTable.svelte +0 -839
- package/src/components/Breadcrumbs.svelte +0 -58
- package/src/components/CanAccess.svelte +0 -23
- package/src/components/CatchAllNavigate.svelte +0 -21
- package/src/components/ChatDialog.svelte +0 -535
- package/src/components/ComboboxField.svelte +0 -129
- package/src/components/CommandPalette.svelte +0 -135
- package/src/components/ConfigErrorScreen.svelte +0 -126
- package/src/components/ConfirmDialog.svelte +0 -53
- package/src/components/CopilotPanel.svelte +0 -163
- package/src/components/CreatePage.svelte +0 -39
- package/src/components/DevTools.svelte +0 -149
- package/src/components/DraggableGrid.svelte +0 -86
- package/src/components/DraggableHeader.svelte +0 -112
- package/src/components/DrawerForm.svelte +0 -35
- package/src/components/EditPage.svelte +0 -52
- package/src/components/EmptyState.svelte +0 -31
- package/src/components/ErrorBoundary.svelte +0 -49
- package/src/components/ErrorComponent.svelte +0 -36
- package/src/components/FieldRenderer.svelte +0 -357
- package/src/components/ForgotPasswordPage.svelte +0 -112
- package/src/components/Header.svelte +0 -94
- package/src/components/InferencerPanel.svelte +0 -192
- package/src/components/InfiniteList.svelte +0 -93
- package/src/components/InlineEdit.svelte +0 -88
- package/src/components/InsightCard.svelte +0 -98
- package/src/components/KeyboardShortcuts.svelte +0 -61
- package/src/components/Layout.svelte +0 -167
- package/src/components/ListPage.svelte +0 -71
- package/src/components/LiveIndicator.svelte +0 -58
- package/src/components/LoginPage.svelte +0 -163
- package/src/components/MarkdownRenderer.svelte +0 -127
- package/src/components/ModalForm.svelte +0 -38
- package/src/components/NavigateToResource.svelte +0 -20
- package/src/components/PageHeader.svelte +0 -39
- package/src/components/PageSkeleton.svelte +0 -71
- package/src/components/PasswordInput.svelte +0 -96
- package/src/components/PermissionMatrix.svelte +0 -185
- package/src/components/ProfilePage.svelte +0 -284
- package/src/components/RegisterPage.svelte +0 -112
- package/src/components/RolesSettings.svelte +0 -146
- package/src/components/SettingsPage.svelte +0 -113
- package/src/components/ShowPage.svelte +0 -73
- package/src/components/Sidebar.svelte +0 -417
- package/src/components/SidebarItem.svelte +0 -129
- package/src/components/SmartSuggest.svelte +0 -158
- package/src/components/StatsCard.svelte +0 -79
- package/src/components/StepsForm.svelte +0 -192
- package/src/components/TaskQueueDrawer.svelte +0 -158
- package/src/components/TenantSwitcher.svelte +0 -84
- package/src/components/ThemedTitle.svelte +0 -32
- package/src/components/Toast.svelte +0 -46
- package/src/components/TooltipButton.svelte +0 -42
- package/src/components/UndoableNotification.svelte +0 -69
- package/src/components/UpdatePasswordPage.svelte +0 -89
- package/src/components/VirtualTable.svelte +0 -76
- package/src/components/VoiceInput.svelte +0 -120
- package/src/components/buttons/CloneButton.svelte +0 -30
- package/src/components/buttons/CreateButton.svelte +0 -29
- package/src/components/buttons/DeleteButton.svelte +0 -59
- package/src/components/buttons/EditButton.svelte +0 -30
- package/src/components/buttons/ExportButton.svelte +0 -30
- package/src/components/buttons/ImportButton.svelte +0 -56
- package/src/components/buttons/ListButton.svelte +0 -23
- package/src/components/buttons/RefreshButton.svelte +0 -36
- package/src/components/buttons/SaveButton.svelte +0 -27
- package/src/components/buttons/ShowButton.svelte +0 -31
- package/src/components/buttons/index.ts +0 -10
- package/src/components/charts/BarChart.svelte +0 -69
- package/src/components/charts/LineChart.svelte +0 -115
- package/src/components/charts/PieChart.svelte +0 -95
- package/src/components/charts/index.ts +0 -3
- package/src/components/fieldComponentMap.ts +0 -79
- package/src/components/fields/ArrayField.svelte +0 -86
- package/src/components/fields/BooleanField.svelte +0 -13
- package/src/components/fields/DateField.svelte +0 -6
- package/src/components/fields/EmailField.svelte +0 -9
- package/src/components/fields/FileField.svelte +0 -14
- package/src/components/fields/ImageField.svelte +0 -9
- package/src/components/fields/JsonField.svelte +0 -72
- package/src/components/fields/MarkdownField.svelte +0 -9
- package/src/components/fields/MultiSelectField.svelte +0 -21
- package/src/components/fields/NumberField.svelte +0 -6
- package/src/components/fields/RelationField.svelte +0 -24
- package/src/components/fields/RichTextField.svelte +0 -35
- package/src/components/fields/SelectField.svelte +0 -14
- package/src/components/fields/TagField.svelte +0 -12
- package/src/components/fields/TextField.svelte +0 -11
- package/src/components/fields/UrlField.svelte +0 -14
- package/src/components/ui/alert/alert-description.svelte +0 -17
- package/src/components/ui/alert/alert-title.svelte +0 -17
- package/src/components/ui/alert/alert.svelte +0 -44
- package/src/components/ui/alert/index.ts +0 -15
- package/src/components/ui/alert-dialog/alert-dialog-content.svelte +0 -29
- package/src/components/ui/alert-dialog/alert-dialog-description.svelte +0 -16
- package/src/components/ui/alert-dialog/alert-dialog-footer.svelte +0 -11
- package/src/components/ui/alert-dialog/alert-dialog-header.svelte +0 -11
- package/src/components/ui/alert-dialog/alert-dialog-overlay.svelte +0 -16
- package/src/components/ui/alert-dialog/alert-dialog-portal.svelte +0 -6
- package/src/components/ui/alert-dialog/alert-dialog-title.svelte +0 -16
- package/src/components/ui/alert-dialog/index.ts +0 -20
- package/src/components/ui/avatar/avatar.svelte +0 -63
- package/src/components/ui/avatar/index.ts +0 -2
- package/src/components/ui/badge/badge.svelte +0 -49
- package/src/components/ui/badge/index.ts +0 -3
- package/src/components/ui/breadcrumb/breadcrumb-ellipsis.svelte +0 -18
- package/src/components/ui/breadcrumb/breadcrumb-item.svelte +0 -15
- package/src/components/ui/breadcrumb/breadcrumb-link.svelte +0 -15
- package/src/components/ui/breadcrumb/breadcrumb-list.svelte +0 -15
- package/src/components/ui/breadcrumb/breadcrumb-page.svelte +0 -18
- package/src/components/ui/breadcrumb/breadcrumb-separator.svelte +0 -22
- package/src/components/ui/breadcrumb/breadcrumb.svelte +0 -11
- package/src/components/ui/breadcrumb/index.ts +0 -7
- package/src/components/ui/button/button.svelte +0 -90
- package/src/components/ui/button/index.ts +0 -18
- package/src/components/ui/card/card-action.svelte +0 -23
- package/src/components/ui/card/card-content.svelte +0 -20
- package/src/components/ui/card/card-description.svelte +0 -20
- package/src/components/ui/card/card-footer.svelte +0 -20
- package/src/components/ui/card/card-header.svelte +0 -23
- package/src/components/ui/card/card-title.svelte +0 -15
- package/src/components/ui/card/card.svelte +0 -22
- package/src/components/ui/card/index.ts +0 -25
- package/src/components/ui/checkbox/checkbox.svelte +0 -39
- package/src/components/ui/checkbox/index.ts +0 -6
- package/src/components/ui/collapsible/index.ts +0 -7
- package/src/components/ui/command/command-dialog.svelte +0 -31
- package/src/components/ui/command/index.ts +0 -2
- package/src/components/ui/context-menu/index.ts +0 -11
- package/src/components/ui/dialog/dialog-close.svelte +0 -11
- package/src/components/ui/dialog/dialog-content.svelte +0 -48
- package/src/components/ui/dialog/dialog-description.svelte +0 -17
- package/src/components/ui/dialog/dialog-footer.svelte +0 -32
- package/src/components/ui/dialog/dialog-header.svelte +0 -20
- package/src/components/ui/dialog/dialog-overlay.svelte +0 -17
- package/src/components/ui/dialog/dialog-portal.svelte +0 -7
- package/src/components/ui/dialog/dialog-title.svelte +0 -17
- package/src/components/ui/dialog/dialog-trigger.svelte +0 -11
- package/src/components/ui/dialog/dialog.svelte +0 -7
- package/src/components/ui/dialog/index.ts +0 -34
- package/src/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte +0 -43
- package/src/components/ui/dropdown-menu/dropdown-menu-content.svelte +0 -35
- package/src/components/ui/dropdown-menu/dropdown-menu-item.svelte +0 -36
- package/src/components/ui/dropdown-menu/dropdown-menu-separator.svelte +0 -10
- package/src/components/ui/dropdown-menu/dropdown-menu-trigger.svelte +0 -27
- package/src/components/ui/dropdown-menu/dropdown-menu.svelte +0 -45
- package/src/components/ui/dropdown-menu/index.ts +0 -21
- package/src/components/ui/input/index.ts +0 -7
- package/src/components/ui/input/input.svelte +0 -48
- package/src/components/ui/label/index.ts +0 -1
- package/src/components/ui/label/label.svelte +0 -18
- package/src/components/ui/pagination/index.ts +0 -7
- package/src/components/ui/pagination/pagination-content.svelte +0 -11
- package/src/components/ui/pagination/pagination-ellipsis.svelte +0 -12
- package/src/components/ui/pagination/pagination-item.svelte +0 -11
- package/src/components/ui/pagination/pagination-link.svelte +0 -26
- package/src/components/ui/pagination/pagination-next.svelte +0 -22
- package/src/components/ui/pagination/pagination-previous.svelte +0 -22
- package/src/components/ui/pagination/pagination.svelte +0 -11
- package/src/components/ui/popover/index.ts +0 -12
- package/src/components/ui/popover/popover-content.svelte +0 -25
- package/src/components/ui/progress/index.ts +0 -1
- package/src/components/ui/progress/progress.svelte +0 -22
- package/src/components/ui/scroll-area/index.ts +0 -1
- package/src/components/ui/scroll-area/scroll-area.svelte +0 -20
- package/src/components/ui/select/index.ts +0 -2
- package/src/components/ui/select/select.svelte +0 -36
- package/src/components/ui/separator/index.ts +0 -7
- package/src/components/ui/separator/separator.svelte +0 -23
- package/src/components/ui/sheet/index.ts +0 -16
- package/src/components/ui/sheet/sheet-content.svelte +0 -28
- package/src/components/ui/sheet/sheet-description.svelte +0 -22
- package/src/components/ui/sheet/sheet-footer.svelte +0 -22
- package/src/components/ui/sheet/sheet-header.svelte +0 -22
- package/src/components/ui/sheet/sheet-title.svelte +0 -22
- package/src/components/ui/sheet/sheet.svelte +0 -78
- package/src/components/ui/skeleton/index.ts +0 -2
- package/src/components/ui/skeleton/skeleton.svelte +0 -21
- package/src/components/ui/switch/index.ts +0 -2
- package/src/components/ui/switch/switch.svelte +0 -49
- package/src/components/ui/table/index.ts +0 -28
- package/src/components/ui/table/table-body.svelte +0 -15
- package/src/components/ui/table/table-caption.svelte +0 -20
- package/src/components/ui/table/table-cell.svelte +0 -15
- package/src/components/ui/table/table-footer.svelte +0 -20
- package/src/components/ui/table/table-head.svelte +0 -15
- package/src/components/ui/table/table-header.svelte +0 -20
- package/src/components/ui/table/table-row.svelte +0 -15
- package/src/components/ui/table/table.svelte +0 -17
- package/src/components/ui/tabs/index.ts +0 -15
- package/src/components/ui/tabs/tabs-content.svelte +0 -30
- package/src/components/ui/tabs/tabs-list.svelte +0 -26
- package/src/components/ui/tabs/tabs-trigger.svelte +0 -37
- package/src/components/ui/tabs/tabs.svelte +0 -27
- package/src/components/ui/textarea/index.ts +0 -2
- package/src/components/ui/textarea/textarea.svelte +0 -24
- package/src/components/ui/tooltip/index.ts +0 -19
- package/src/components/ui/tooltip/tooltip-content.svelte +0 -52
- package/src/components/ui/tooltip/tooltip-portal.svelte +0 -7
- package/src/components/ui/tooltip/tooltip-provider.svelte +0 -7
- package/src/components/ui/tooltip/tooltip-trigger.svelte +0 -7
- package/src/components/ui/tooltip/tooltip.svelte +0 -10
- package/src/editor-config.svelte.ts +0 -23
- package/src/index.ts +0 -155
- package/src/markdown-deps.d.ts +0 -21
- package/src/router-state.svelte.ts +0 -65
- package/src/types.ts +0 -33
- package/src/utils.ts +0 -28
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { Download } from '@lucide/svelte';
|
|
3
|
-
interface Props { value: string | null | undefined; title?: string }
|
|
4
|
-
let { value, title }: Props = $props();
|
|
5
|
-
const fileName = $derived(value ? value.split('/').pop() ?? value : null);
|
|
6
|
-
</script>
|
|
7
|
-
{#if value}
|
|
8
|
-
<a href={value} download class="text-primary hover:underline no-underline inline-flex items-center gap-1" title={title ?? fileName ?? ''}>
|
|
9
|
-
<Download class="h-3.5 w-3.5 opacity-60" />
|
|
10
|
-
{fileName}
|
|
11
|
-
</a>
|
|
12
|
-
{:else}
|
|
13
|
-
<span class="text-muted-foreground">—</span>
|
|
14
|
-
{/if}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
interface Props { value: string | null | undefined; alt?: string; width?: number; height?: number }
|
|
3
|
-
let { value, alt = '', width = 80, height = 80 }: Props = $props();
|
|
4
|
-
</script>
|
|
5
|
-
{#if value}
|
|
6
|
-
<img src={value} {alt} {width} {height} class="rounded-lg object-cover border border-border" />
|
|
7
|
-
{:else}
|
|
8
|
-
<span class="inline-flex items-center justify-center w-20 h-20 bg-muted rounded-lg text-muted-foreground">—</span>
|
|
9
|
-
{/if}
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { t } from '@svadmin/core/i18n';
|
|
3
|
-
import { Button } from '../ui/button/index.js';
|
|
4
|
-
import { Copy, Check, ChevronDown, ChevronRight } from '@lucide/svelte';
|
|
5
|
-
|
|
6
|
-
let { value } = $props<{
|
|
7
|
-
value: unknown;
|
|
8
|
-
}>();
|
|
9
|
-
|
|
10
|
-
let expanded = $state(false);
|
|
11
|
-
let copied = $state(false);
|
|
12
|
-
let copyTimer: ReturnType<typeof setTimeout> | undefined;
|
|
13
|
-
|
|
14
|
-
$effect(() => {
|
|
15
|
-
return () => { if (copyTimer) clearTimeout(copyTimer); };
|
|
16
|
-
});
|
|
17
|
-
|
|
18
|
-
const formatted = $derived(
|
|
19
|
-
value != null ? JSON.stringify(value, null, 2) : '—'
|
|
20
|
-
);
|
|
21
|
-
|
|
22
|
-
const preview = $derived(
|
|
23
|
-
value != null ? JSON.stringify(value).slice(0, 80) + (JSON.stringify(value).length > 80 ? '...' : '') : '—'
|
|
24
|
-
);
|
|
25
|
-
|
|
26
|
-
function copyJson() {
|
|
27
|
-
navigator.clipboard.writeText(formatted);
|
|
28
|
-
copied = true;
|
|
29
|
-
if (copyTimer) clearTimeout(copyTimer);
|
|
30
|
-
copyTimer = setTimeout(() => { copied = false; }, 2000);
|
|
31
|
-
}
|
|
32
|
-
</script>
|
|
33
|
-
|
|
34
|
-
{#if value == null}
|
|
35
|
-
<span class="text-muted-foreground">—</span>
|
|
36
|
-
{:else}
|
|
37
|
-
<div class="space-y-1">
|
|
38
|
-
<div class="flex items-center gap-2">
|
|
39
|
-
<Button
|
|
40
|
-
variant="ghost"
|
|
41
|
-
size="sm"
|
|
42
|
-
class="flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground h-auto py-0.5 px-1"
|
|
43
|
-
onclick={() => { expanded = !expanded; }}
|
|
44
|
-
>
|
|
45
|
-
{#if expanded}
|
|
46
|
-
<ChevronDown class="h-3 w-3" />
|
|
47
|
-
{:else}
|
|
48
|
-
<ChevronRight class="h-3 w-3" />
|
|
49
|
-
{/if}
|
|
50
|
-
{expanded ? t('common.collapse') : t('common.expand')}
|
|
51
|
-
</Button>
|
|
52
|
-
<Button
|
|
53
|
-
variant="ghost"
|
|
54
|
-
size="sm"
|
|
55
|
-
class="flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground h-auto py-0.5 px-1"
|
|
56
|
-
onclick={copyJson}
|
|
57
|
-
aria-label={t('common.copy')}
|
|
58
|
-
>
|
|
59
|
-
{#if copied}
|
|
60
|
-
<Check class="h-3 w-3 text-emerald-500" />
|
|
61
|
-
{:else}
|
|
62
|
-
<Copy class="h-3 w-3" />
|
|
63
|
-
{/if}
|
|
64
|
-
</Button>
|
|
65
|
-
</div>
|
|
66
|
-
{#if expanded}
|
|
67
|
-
<pre class="rounded-lg bg-muted p-3 text-xs overflow-auto max-h-64 font-mono">{formatted}</pre>
|
|
68
|
-
{:else}
|
|
69
|
-
<code class="text-xs font-mono bg-muted px-1.5 py-0.5 rounded">{preview}</code>
|
|
70
|
-
{/if}
|
|
71
|
-
</div>
|
|
72
|
-
{/if}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
interface Props { value: string | null | undefined }
|
|
3
|
-
let { value }: Props = $props();
|
|
4
|
-
</script>
|
|
5
|
-
{#if value}
|
|
6
|
-
<div class="prose prose-sm dark:prose-invert max-w-none leading-relaxed [&_code]:bg-muted [&_code]:px-1.5 [&_code]:py-0.5 [&_code]:rounded [&_code]:text-[0.875em] [&_pre]:bg-muted [&_pre]:p-3 [&_pre]:rounded-lg [&_pre]:overflow-x-auto [&_a]:text-primary">{@html value}</div>
|
|
7
|
-
{:else}
|
|
8
|
-
<span class="text-muted-foreground">—</span>
|
|
9
|
-
{/if}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { Badge } from '../ui/badge/index.js';
|
|
3
|
-
|
|
4
|
-
let { value, options } = $props<{
|
|
5
|
-
value: (string | number)[] | null | undefined;
|
|
6
|
-
options?: { label: string; value: string | number }[];
|
|
7
|
-
}>();
|
|
8
|
-
|
|
9
|
-
const items = $derived(Array.isArray(value) ? value : []);
|
|
10
|
-
</script>
|
|
11
|
-
|
|
12
|
-
{#if items.length > 0}
|
|
13
|
-
<div class="flex flex-wrap gap-1">
|
|
14
|
-
{#each items as v}
|
|
15
|
-
{@const label = options?.find((o: { label: string; value: string | number }) => o.value === v)?.label ?? String(v)}
|
|
16
|
-
<Badge variant="secondary" class="font-normal">{label}</Badge>
|
|
17
|
-
{/each}
|
|
18
|
-
</div>
|
|
19
|
-
{:else}
|
|
20
|
-
<span class="text-muted-foreground">—</span>
|
|
21
|
-
{/if}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
interface Props { value: number | string | null | undefined; locale?: string; options?: Intl.NumberFormatOptions }
|
|
3
|
-
let { value, locale = 'en-US', options = {} }: Props = $props();
|
|
4
|
-
const formatted = $derived(value != null ? new Intl.NumberFormat(locale, options).format(Number(value)) : '—');
|
|
5
|
-
</script>
|
|
6
|
-
<span class="field-number">{formatted}</span>
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { ExternalLink } from '@lucide/svelte';
|
|
3
|
-
|
|
4
|
-
let { value, resourceName, displayValue } = $props<{
|
|
5
|
-
value: string | number | null | undefined;
|
|
6
|
-
resourceName?: string;
|
|
7
|
-
displayValue?: string;
|
|
8
|
-
}>();
|
|
9
|
-
|
|
10
|
-
const display = $derived(displayValue ?? (value != null ? `#${value}` : '—'));
|
|
11
|
-
const href = $derived(resourceName && value != null ? `#/${resourceName}/show/${value}` : undefined);
|
|
12
|
-
</script>
|
|
13
|
-
|
|
14
|
-
{#if href}
|
|
15
|
-
<a
|
|
16
|
-
{href}
|
|
17
|
-
class="inline-flex items-center gap-1 text-primary hover:underline text-sm"
|
|
18
|
-
>
|
|
19
|
-
{display}
|
|
20
|
-
<ExternalLink class="h-3 w-3" />
|
|
21
|
-
</a>
|
|
22
|
-
{:else}
|
|
23
|
-
<span class="text-muted-foreground">{display}</span>
|
|
24
|
-
{/if}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { t } from '@svadmin/core/i18n';
|
|
3
|
-
import { Button } from '../ui/button/index.js';
|
|
4
|
-
|
|
5
|
-
let { value, maxLength = 200 } = $props<{
|
|
6
|
-
value: string | null | undefined;
|
|
7
|
-
maxLength?: number;
|
|
8
|
-
}>();
|
|
9
|
-
|
|
10
|
-
const text = $derived(value ?? '');
|
|
11
|
-
const truncated = $derived(text.length > maxLength);
|
|
12
|
-
const display = $derived(truncated ? text.slice(0, maxLength) + '...' : text);
|
|
13
|
-
|
|
14
|
-
let showFull = $state(false);
|
|
15
|
-
</script>
|
|
16
|
-
|
|
17
|
-
{#if !text}
|
|
18
|
-
<span class="text-muted-foreground">—</span>
|
|
19
|
-
{:else}
|
|
20
|
-
<div class="prose prose-sm dark:prose-invert max-w-none">
|
|
21
|
-
<p class="whitespace-pre-wrap text-sm leading-relaxed">
|
|
22
|
-
{showFull ? text : display}
|
|
23
|
-
</p>
|
|
24
|
-
{#if truncated}
|
|
25
|
-
<Button
|
|
26
|
-
variant="link"
|
|
27
|
-
size="sm"
|
|
28
|
-
class="text-xs text-primary h-auto p-0"
|
|
29
|
-
onclick={() => { showFull = !showFull; }}
|
|
30
|
-
>
|
|
31
|
-
{showFull ? t('common.showLess') : t('common.showMore')}
|
|
32
|
-
</Button>
|
|
33
|
-
{/if}
|
|
34
|
-
</div>
|
|
35
|
-
{/if}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { Badge } from '../ui/badge/index.js';
|
|
3
|
-
|
|
4
|
-
let { value, options } = $props<{
|
|
5
|
-
value: string | number | null | undefined;
|
|
6
|
-
options?: { label: string; value: string | number }[];
|
|
7
|
-
}>();
|
|
8
|
-
|
|
9
|
-
const label = $derived(
|
|
10
|
-
options?.find((o: { label: string; value: string | number }) => o.value === value)?.label ?? (value != null ? String(value) : '—')
|
|
11
|
-
);
|
|
12
|
-
</script>
|
|
13
|
-
|
|
14
|
-
<Badge variant="outline">{label}</Badge>
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { Badge } from '../ui/badge/index.js';
|
|
3
|
-
interface Props { value: string | string[] | null | undefined }
|
|
4
|
-
let { value }: Props = $props();
|
|
5
|
-
const tags = $derived(Array.isArray(value) ? value : value ? [value] : []);
|
|
6
|
-
</script>
|
|
7
|
-
<span class="inline-flex flex-wrap gap-1">
|
|
8
|
-
{#each tags as tag}
|
|
9
|
-
<Badge variant="secondary">{tag}</Badge>
|
|
10
|
-
{/each}
|
|
11
|
-
{#if tags.length === 0}<span class="text-muted-foreground">—</span>{/if}
|
|
12
|
-
</span>
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
interface Props { value: string | null | undefined; maxLength?: number }
|
|
3
|
-
let { value, maxLength }: Props = $props();
|
|
4
|
-
const display = $derived(value && maxLength && value.length > maxLength ? value.slice(0, maxLength) + '…' : value);
|
|
5
|
-
const needsTooltip = $derived(value && maxLength && value.length > maxLength);
|
|
6
|
-
</script>
|
|
7
|
-
{#if value}
|
|
8
|
-
<span class="inline-block" title={needsTooltip ? value : undefined}>{display}</span>
|
|
9
|
-
{:else}
|
|
10
|
-
<span class="text-muted-foreground">—</span>
|
|
11
|
-
{/if}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { ExternalLink } from '@lucide/svelte';
|
|
3
|
-
interface Props { value: string | null | undefined; label?: string }
|
|
4
|
-
let { value, label }: Props = $props();
|
|
5
|
-
const display = $derived(label ?? value ?? '');
|
|
6
|
-
</script>
|
|
7
|
-
{#if value}
|
|
8
|
-
<a href={value} target="_blank" rel="noopener noreferrer" class="text-primary hover:underline no-underline inline-flex items-center gap-1">
|
|
9
|
-
{display}
|
|
10
|
-
<ExternalLink class="h-3 w-3 opacity-60" />
|
|
11
|
-
</a>
|
|
12
|
-
{:else}
|
|
13
|
-
<span class="text-muted-foreground">—</span>
|
|
14
|
-
{/if}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { cn, type WithElementRef } from "../../../utils.js";
|
|
3
|
-
import type { HTMLAttributes } from "svelte/elements";
|
|
4
|
-
|
|
5
|
-
type Props = WithElementRef<HTMLAttributes<HTMLDivElement>>;
|
|
6
|
-
|
|
7
|
-
let { ref = $bindable(null), class: className, children, ...restProps }: Props = $props();
|
|
8
|
-
</script>
|
|
9
|
-
|
|
10
|
-
<div
|
|
11
|
-
bind:this={ref}
|
|
12
|
-
data-slot="alert-description"
|
|
13
|
-
class={cn("col-start-2 text-sm [&_p]:leading-relaxed text-muted-foreground", className)}
|
|
14
|
-
{...restProps}
|
|
15
|
-
>
|
|
16
|
-
{@render children?.()}
|
|
17
|
-
</div>
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { cn, type WithElementRef } from "../../../utils.js";
|
|
3
|
-
import type { HTMLAttributes } from "svelte/elements";
|
|
4
|
-
|
|
5
|
-
type Props = WithElementRef<HTMLAttributes<HTMLHeadingElement>>;
|
|
6
|
-
|
|
7
|
-
let { ref = $bindable(null), class: className, children, ...restProps }: Props = $props();
|
|
8
|
-
</script>
|
|
9
|
-
|
|
10
|
-
<h5
|
|
11
|
-
bind:this={ref}
|
|
12
|
-
data-slot="alert-title"
|
|
13
|
-
class={cn("col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight", className)}
|
|
14
|
-
{...restProps}
|
|
15
|
-
>
|
|
16
|
-
{@render children?.()}
|
|
17
|
-
</h5>
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
<script lang="ts" module>
|
|
2
|
-
import { cn, type WithElementRef } from "../../../utils.js";
|
|
3
|
-
import type { HTMLAttributes } from "svelte/elements";
|
|
4
|
-
import { type VariantProps, tv } from "tailwind-variants";
|
|
5
|
-
|
|
6
|
-
export const alertVariants = tv({
|
|
7
|
-
base: "relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current",
|
|
8
|
-
variants: {
|
|
9
|
-
variant: {
|
|
10
|
-
default: "bg-card text-foreground",
|
|
11
|
-
destructive: "text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90",
|
|
12
|
-
warning: "border-warning/50 text-warning-foreground bg-warning/10 [&>svg]:text-current",
|
|
13
|
-
success: "border-success/50 text-success bg-success/10 [&>svg]:text-current",
|
|
14
|
-
},
|
|
15
|
-
},
|
|
16
|
-
defaultVariants: { variant: "default" },
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
export type AlertVariant = VariantProps<typeof alertVariants>["variant"];
|
|
20
|
-
</script>
|
|
21
|
-
|
|
22
|
-
<script lang="ts">
|
|
23
|
-
type Props = WithElementRef<HTMLAttributes<HTMLDivElement>> & {
|
|
24
|
-
variant?: AlertVariant;
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
let {
|
|
28
|
-
ref = $bindable(null),
|
|
29
|
-
variant = "default",
|
|
30
|
-
class: className,
|
|
31
|
-
children,
|
|
32
|
-
...restProps
|
|
33
|
-
}: Props = $props();
|
|
34
|
-
</script>
|
|
35
|
-
|
|
36
|
-
<div
|
|
37
|
-
bind:this={ref}
|
|
38
|
-
data-slot="alert"
|
|
39
|
-
role="alert"
|
|
40
|
-
class={cn(alertVariants({ variant }), className)}
|
|
41
|
-
{...restProps}
|
|
42
|
-
>
|
|
43
|
-
{@render children?.()}
|
|
44
|
-
</div>
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
// @ts-nocheck
|
|
2
|
-
import Alert, { type AlertVariant, alertVariants } from "./alert.svelte";
|
|
3
|
-
import AlertTitle from "./alert-title.svelte";
|
|
4
|
-
import AlertDescription from "./alert-description.svelte";
|
|
5
|
-
|
|
6
|
-
export {
|
|
7
|
-
Alert,
|
|
8
|
-
AlertTitle,
|
|
9
|
-
AlertDescription,
|
|
10
|
-
Alert as Root,
|
|
11
|
-
AlertTitle as Title,
|
|
12
|
-
AlertDescription as Description,
|
|
13
|
-
alertVariants,
|
|
14
|
-
type AlertVariant,
|
|
15
|
-
};
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { AlertDialog as AlertDialogPrimitive } from "bits-ui";
|
|
3
|
-
import type { WithoutChildrenOrChild } from "bits-ui";
|
|
4
|
-
import { cn } from "../../../utils.js";
|
|
5
|
-
import type { Snippet } from "svelte";
|
|
6
|
-
|
|
7
|
-
let {
|
|
8
|
-
ref = $bindable(null),
|
|
9
|
-
class: className,
|
|
10
|
-
children,
|
|
11
|
-
...restProps
|
|
12
|
-
}: WithoutChildrenOrChild<AlertDialogPrimitive.ContentProps> & { children?: Snippet; class?: string } = $props();
|
|
13
|
-
</script>
|
|
14
|
-
|
|
15
|
-
<AlertDialogPrimitive.Portal>
|
|
16
|
-
<AlertDialogPrimitive.Overlay
|
|
17
|
-
class="fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0"
|
|
18
|
-
/>
|
|
19
|
-
<AlertDialogPrimitive.Content
|
|
20
|
-
bind:ref
|
|
21
|
-
class={cn(
|
|
22
|
-
"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",
|
|
23
|
-
className,
|
|
24
|
-
)}
|
|
25
|
-
{...restProps}
|
|
26
|
-
>
|
|
27
|
-
{@render children?.()}
|
|
28
|
-
</AlertDialogPrimitive.Content>
|
|
29
|
-
</AlertDialogPrimitive.Portal>
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { AlertDialog as AlertDialogPrimitive } from "bits-ui";
|
|
3
|
-
import { cn } from "../../../utils.js";
|
|
4
|
-
|
|
5
|
-
let {
|
|
6
|
-
ref = $bindable(null),
|
|
7
|
-
class: className,
|
|
8
|
-
...restProps
|
|
9
|
-
}: AlertDialogPrimitive.DescriptionProps & { class?: string } = $props();
|
|
10
|
-
</script>
|
|
11
|
-
|
|
12
|
-
<AlertDialogPrimitive.Description
|
|
13
|
-
bind:ref
|
|
14
|
-
class={cn("text-sm text-muted-foreground", className)}
|
|
15
|
-
{...restProps}
|
|
16
|
-
/>
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import type { Snippet } from "svelte";
|
|
3
|
-
import type { HTMLAttributes } from "svelte/elements";
|
|
4
|
-
import { cn } from "../../../utils.js";
|
|
5
|
-
|
|
6
|
-
let { class: className, children, ...restProps }: HTMLAttributes<HTMLDivElement> & { children?: Snippet } = $props();
|
|
7
|
-
</script>
|
|
8
|
-
|
|
9
|
-
<div class={cn("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2", className)} {...restProps}>
|
|
10
|
-
{@render children?.()}
|
|
11
|
-
</div>
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import type { Snippet } from "svelte";
|
|
3
|
-
import type { HTMLAttributes } from "svelte/elements";
|
|
4
|
-
import { cn } from "../../../utils.js";
|
|
5
|
-
|
|
6
|
-
let { class: className, children, ...restProps }: HTMLAttributes<HTMLDivElement> & { children?: Snippet } = $props();
|
|
7
|
-
</script>
|
|
8
|
-
|
|
9
|
-
<div class={cn("flex flex-col space-y-2 text-center sm:text-left", className)} {...restProps}>
|
|
10
|
-
{@render children?.()}
|
|
11
|
-
</div>
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { AlertDialog as AlertDialogPrimitive } from "bits-ui";
|
|
3
|
-
import { cn } from "../../../utils.js";
|
|
4
|
-
|
|
5
|
-
let {
|
|
6
|
-
ref = $bindable(null),
|
|
7
|
-
class: className,
|
|
8
|
-
...restProps
|
|
9
|
-
}: AlertDialogPrimitive.OverlayProps & { class?: string } = $props();
|
|
10
|
-
</script>
|
|
11
|
-
|
|
12
|
-
<AlertDialogPrimitive.Overlay
|
|
13
|
-
bind:ref
|
|
14
|
-
class={cn("fixed inset-0 z-50 bg-black/80", className)}
|
|
15
|
-
{...restProps}
|
|
16
|
-
/>
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { AlertDialog as AlertDialogPrimitive } from "bits-ui";
|
|
3
|
-
import { cn } from "../../../utils.js";
|
|
4
|
-
|
|
5
|
-
let {
|
|
6
|
-
ref = $bindable(null),
|
|
7
|
-
class: className,
|
|
8
|
-
...restProps
|
|
9
|
-
}: AlertDialogPrimitive.TitleProps & { class?: string } = $props();
|
|
10
|
-
</script>
|
|
11
|
-
|
|
12
|
-
<AlertDialogPrimitive.Title
|
|
13
|
-
bind:ref
|
|
14
|
-
class={cn("text-lg font-semibold", className)}
|
|
15
|
-
{...restProps}
|
|
16
|
-
/>
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { AlertDialog as AlertDialogPrimitive } from "bits-ui";
|
|
2
|
-
|
|
3
|
-
const Root = AlertDialogPrimitive.Root;
|
|
4
|
-
const Trigger = AlertDialogPrimitive.Trigger;
|
|
5
|
-
const Action = AlertDialogPrimitive.Action;
|
|
6
|
-
const Cancel = AlertDialogPrimitive.Cancel;
|
|
7
|
-
|
|
8
|
-
export {
|
|
9
|
-
Root,
|
|
10
|
-
Trigger,
|
|
11
|
-
Action,
|
|
12
|
-
Cancel,
|
|
13
|
-
};
|
|
14
|
-
export { default as Content } from "./alert-dialog-content.svelte";
|
|
15
|
-
export { default as Description } from "./alert-dialog-description.svelte";
|
|
16
|
-
export { default as Footer } from "./alert-dialog-footer.svelte";
|
|
17
|
-
export { default as Header } from "./alert-dialog-header.svelte";
|
|
18
|
-
export { default as Overlay } from "./alert-dialog-overlay.svelte";
|
|
19
|
-
export { default as Portal } from "./alert-dialog-portal.svelte";
|
|
20
|
-
export { default as Title } from "./alert-dialog-title.svelte";
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { cn, type WithElementRef } from "../../../utils.js";
|
|
3
|
-
import type { HTMLImgAttributes } from "svelte/elements";
|
|
4
|
-
import { type VariantProps, tv } from "tailwind-variants";
|
|
5
|
-
|
|
6
|
-
export const avatarVariants = tv({
|
|
7
|
-
base: "relative flex shrink-0 overflow-hidden rounded-full",
|
|
8
|
-
variants: {
|
|
9
|
-
size: {
|
|
10
|
-
default: "size-10",
|
|
11
|
-
sm: "size-8",
|
|
12
|
-
lg: "size-12",
|
|
13
|
-
xl: "size-16",
|
|
14
|
-
},
|
|
15
|
-
},
|
|
16
|
-
defaultVariants: { size: "default" },
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
// AvatarSize type is exported from the package index.ts
|
|
20
|
-
type AvatarSize = VariantProps<typeof avatarVariants>["size"];
|
|
21
|
-
|
|
22
|
-
type Props = WithElementRef<HTMLImgAttributes, HTMLImageElement> & {
|
|
23
|
-
size?: AvatarSize;
|
|
24
|
-
fallback?: string;
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
let {
|
|
28
|
-
ref = $bindable(null),
|
|
29
|
-
src,
|
|
30
|
-
alt = "",
|
|
31
|
-
size = "default",
|
|
32
|
-
fallback,
|
|
33
|
-
class: className,
|
|
34
|
-
...restProps
|
|
35
|
-
}: Props = $props();
|
|
36
|
-
|
|
37
|
-
let imgError = $state(false);
|
|
38
|
-
</script>
|
|
39
|
-
|
|
40
|
-
{#if src && !imgError}
|
|
41
|
-
<span class={cn(avatarVariants({ size }), className)}>
|
|
42
|
-
<img
|
|
43
|
-
bind:this={ref}
|
|
44
|
-
data-slot="avatar"
|
|
45
|
-
{src}
|
|
46
|
-
{alt}
|
|
47
|
-
class="aspect-square h-full w-full object-cover"
|
|
48
|
-
onerror={() => { imgError = true; }}
|
|
49
|
-
{...restProps}
|
|
50
|
-
/>
|
|
51
|
-
</span>
|
|
52
|
-
{:else}
|
|
53
|
-
<span
|
|
54
|
-
data-slot="avatar-fallback"
|
|
55
|
-
class={cn(
|
|
56
|
-
avatarVariants({ size }),
|
|
57
|
-
"flex items-center justify-center bg-muted text-muted-foreground font-medium text-sm",
|
|
58
|
-
className
|
|
59
|
-
)}
|
|
60
|
-
>
|
|
61
|
-
{fallback ?? alt?.charAt(0).toUpperCase() ?? "?"}
|
|
62
|
-
</span>
|
|
63
|
-
{/if}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
<script lang="ts" module>
|
|
2
|
-
import { type VariantProps, tv } from "tailwind-variants";
|
|
3
|
-
|
|
4
|
-
export const badgeVariants = tv({
|
|
5
|
-
base: "h-5 gap-1 rounded-[min(var(--radius-sm),10px)] border border-transparent px-2.5 py-0.5 text-xs font-semibold transition-all has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&>svg]:size-3! focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive group/badge inline-flex w-fit shrink-0 items-center justify-center overflow-hidden whitespace-nowrap transition-colors focus-visible:ring-[3px] [&>svg]:pointer-events-none",
|
|
6
|
-
variants: {
|
|
7
|
-
variant: {
|
|
8
|
-
default: "bg-primary text-primary-foreground [a]:hover:bg-primary/80",
|
|
9
|
-
secondary: "bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80",
|
|
10
|
-
destructive: "bg-destructive/10 [a]:hover:bg-destructive/20 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 text-destructive dark:bg-destructive/20",
|
|
11
|
-
outline: "border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground",
|
|
12
|
-
ghost: "hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50",
|
|
13
|
-
link: "text-primary underline-offset-4 hover:underline",
|
|
14
|
-
},
|
|
15
|
-
},
|
|
16
|
-
defaultVariants: {
|
|
17
|
-
variant: "default",
|
|
18
|
-
},
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
export type BadgeVariant = VariantProps<typeof badgeVariants>["variant"];
|
|
22
|
-
</script>
|
|
23
|
-
|
|
24
|
-
<script lang="ts">
|
|
25
|
-
import type { HTMLAnchorAttributes } from "svelte/elements";
|
|
26
|
-
import { cn, type WithElementRef } from "../../../utils.js";
|
|
27
|
-
|
|
28
|
-
let {
|
|
29
|
-
ref = $bindable(null),
|
|
30
|
-
href,
|
|
31
|
-
class: className,
|
|
32
|
-
variant = "default",
|
|
33
|
-
children,
|
|
34
|
-
...restProps
|
|
35
|
-
}: WithElementRef<HTMLAnchorAttributes> & {
|
|
36
|
-
variant?: BadgeVariant;
|
|
37
|
-
} = $props();
|
|
38
|
-
</script>
|
|
39
|
-
|
|
40
|
-
<svelte:element
|
|
41
|
-
this={href ? "a" : "span"}
|
|
42
|
-
bind:this={ref}
|
|
43
|
-
data-slot="badge"
|
|
44
|
-
{href}
|
|
45
|
-
class={cn(badgeVariants({ variant }), className)}
|
|
46
|
-
{...restProps}
|
|
47
|
-
>
|
|
48
|
-
{@render children?.()}
|
|
49
|
-
</svelte:element>
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { cn } from '../../../utils.js';
|
|
3
|
-
import type { HTMLAttributes } from 'svelte/elements';
|
|
4
|
-
import { Ellipsis } from '@lucide/svelte';
|
|
5
|
-
|
|
6
|
-
let { class: className, ...restProps }: HTMLAttributes<HTMLSpanElement> = $props();
|
|
7
|
-
</script>
|
|
8
|
-
|
|
9
|
-
<span
|
|
10
|
-
role="presentation"
|
|
11
|
-
aria-hidden="true"
|
|
12
|
-
data-slot="breadcrumb-ellipsis"
|
|
13
|
-
class={cn("flex size-9 items-center justify-center", className)}
|
|
14
|
-
{...restProps}
|
|
15
|
-
>
|
|
16
|
-
<Ellipsis class="size-4" />
|
|
17
|
-
<span class="sr-only">More</span>
|
|
18
|
-
</span>
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { cn } from '../../../utils.js';
|
|
3
|
-
import type { Snippet } from 'svelte';
|
|
4
|
-
import type { HTMLLiAttributes } from 'svelte/elements';
|
|
5
|
-
|
|
6
|
-
let { class: className, children, ...restProps }: HTMLLiAttributes & { children?: Snippet } = $props();
|
|
7
|
-
</script>
|
|
8
|
-
|
|
9
|
-
<li
|
|
10
|
-
data-slot="breadcrumb-item"
|
|
11
|
-
class={cn("inline-flex items-center gap-1.5", className)}
|
|
12
|
-
{...restProps}
|
|
13
|
-
>
|
|
14
|
-
{@render children?.()}
|
|
15
|
-
</li>
|