@svadmin/ui 0.38.1 → 0.38.5
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/app.css +10 -5
- package/dist/app.theme.css +1374 -0
- package/dist/components/AICommandBar.svelte +16 -15
- package/dist/components/AboutSettings.svelte +12 -11
- package/dist/components/AdminApp.svelte +144 -70
- package/dist/components/AdminApp.svelte.d.ts +6 -3
- package/dist/components/ApiSettings.svelte +19 -16
- package/dist/components/AppearanceSettings.svelte +18 -16
- package/dist/components/AuditLogDrawer.svelte +6 -3
- package/dist/components/AuditLogViewer.svelte +18 -15
- package/dist/components/Authenticated.svelte +4 -4
- package/dist/components/AutoForm.svelte +19 -16
- package/dist/components/AutoSaveIndicator.svelte +7 -5
- package/dist/components/AutoTable.svelte +85 -71
- package/dist/components/AutoTable.svelte.d.ts +1 -1
- package/dist/components/Breadcrumbs.svelte +17 -13
- package/dist/components/CancelTaskButton.svelte +5 -2
- package/dist/components/CatchAllNavigate.svelte +3 -3
- package/dist/components/ChatDialog.svelte +22 -19
- package/dist/components/ComboboxField.svelte +6 -4
- package/dist/components/CommandPalette.svelte +20 -20
- package/dist/components/ConfigErrorScreen.svelte +12 -10
- package/dist/components/ConfirmDialog.svelte +6 -4
- package/dist/components/CreatePage.svelte +4 -2
- package/dist/components/DevTools.svelte +11 -9
- package/dist/components/DrawerForm.svelte +5 -2
- package/dist/components/EditPage.svelte +8 -5
- package/dist/components/EmptyState.svelte +5 -3
- package/dist/components/ErrorBoundary.svelte +5 -3
- package/dist/components/ErrorComponent.svelte +6 -4
- package/dist/components/ErrorPage.svelte +12 -10
- package/dist/components/FieldRenderer.svelte +17 -15
- package/dist/components/ForgotPasswordPage.svelte +22 -19
- package/dist/components/Header.svelte +7 -4
- package/dist/components/InfiniteList.svelte +6 -3
- package/dist/components/IntegrationsSettings.svelte +9 -6
- package/dist/components/KeyboardShortcuts.svelte +4 -2
- package/dist/components/Layout.svelte +12 -13
- package/dist/components/LazyPage.svelte +47 -0
- package/dist/components/LazyPage.svelte.d.ts +14 -0
- package/dist/components/ListPage.svelte +8 -5
- package/dist/components/LoginPage.svelte +24 -22
- package/dist/components/MarkdownRenderer.svelte +89 -35
- package/dist/components/ModalForm.svelte +4 -2
- package/dist/components/NavigateToResource.svelte +3 -3
- package/dist/components/NotificationsSettings.svelte +26 -24
- package/dist/components/PasswordInput.svelte +4 -2
- package/dist/components/PermissionMatrix.svelte +15 -12
- package/dist/components/ProfilePage.svelte +23 -21
- package/dist/components/RegisterPage.svelte +21 -19
- package/dist/components/ResourceOperationsPage.svelte +3 -2
- package/dist/components/RetryTaskButton.svelte +5 -2
- package/dist/components/RolesSettings.svelte +10 -8
- package/dist/components/SecuritySettings.svelte +26 -23
- package/dist/components/SettingsPage.svelte +14 -11
- package/dist/components/ShowPage.svelte +9 -7
- package/dist/components/Sidebar.svelte +36 -28
- package/dist/components/SidebarItem.svelte +4 -4
- package/dist/components/SidebarItem.svelte.d.ts +1 -1
- package/dist/components/StepsForm.svelte +11 -8
- package/dist/components/TaskDetails.svelte +14 -11
- package/dist/components/TaskList.svelte +14 -11
- package/dist/components/TaskQueueDrawer.svelte +34 -32
- package/dist/components/TaskStatusBadge.svelte +5 -2
- package/dist/components/Toast.svelte +18 -4
- package/dist/components/TooltipButton.svelte +25 -3
- package/dist/components/TwoFactorAuthPage.svelte +26 -24
- package/dist/components/UndoableNotification.svelte +5 -2
- package/dist/components/UpdatePasswordPage.svelte +18 -15
- package/dist/components/VirtualTable.svelte +0 -4
- package/dist/components/account/CompanyProfilePage.svelte +13 -11
- package/dist/components/account/GetStartedPage.svelte +15 -13
- package/dist/components/account/ImportMembersPage.svelte +14 -12
- package/dist/components/account/MembersStarterPage.svelte +10 -8
- package/dist/components/account/SecurityLogPage.svelte +24 -22
- package/dist/components/account/SettingsEnterprisePage.svelte +6 -4
- package/dist/components/account/SettingsPlainPage.svelte +14 -12
- package/dist/components/account/SettingsSidebarPage.svelte +11 -9
- package/dist/components/account/TeamMembersPage.svelte +10 -8
- package/dist/components/buttons/CloneButton.svelte +4 -2
- package/dist/components/buttons/CreateButton.svelte +4 -2
- package/dist/components/buttons/DeleteButton.svelte +6 -4
- package/dist/components/buttons/EditButton.svelte +4 -2
- package/dist/components/buttons/ExportButton.svelte +4 -2
- package/dist/components/buttons/ImportButton.svelte +4 -2
- package/dist/components/buttons/RefreshButton.svelte +4 -2
- package/dist/components/buttons/SaveButton.svelte +4 -2
- package/dist/components/buttons/ShowButton.svelte +4 -2
- package/dist/components/fieldComponentMap.js +0 -3
- package/dist/components/fields/ArrayField.svelte +6 -4
- package/dist/components/fields/JsonField.svelte +5 -3
- package/dist/components/fields/RelationField.svelte +3 -3
- package/dist/components/fields/RichTextField.svelte +4 -2
- package/dist/components/network/TeamCrewTablePage.svelte +18 -16
- package/dist/components/network/UserCardsNFTPage.svelte +11 -9
- package/dist/components/profile/ActivityTimeline.svelte +10 -8
- package/dist/components/profile/ProfileCard.svelte +13 -11
- package/dist/components/profile/ProjectsGrid.svelte +7 -5
- package/dist/components/profile/PublicProfilePage.svelte +18 -16
- package/dist/components/profile/TeamsShowcase.svelte +7 -5
- package/dist/components/toast-host.svelte.d.ts +5 -0
- package/dist/components/toast-host.svelte.js +21 -0
- package/dist/components/ui/command/command-dialog.svelte +29 -13
- package/dist/components/ui/command/command-dialog.svelte.d.ts +4 -3
- package/dist/components/ui/command/command-empty.svelte +18 -0
- package/dist/components/ui/command/command-empty.svelte.d.ts +4 -0
- package/dist/components/ui/command/command-group.svelte +41 -0
- package/dist/components/ui/command/command-group.svelte.d.ts +8 -0
- package/dist/components/ui/command/command-input.svelte +23 -0
- package/dist/components/ui/command/command-input.svelte.d.ts +4 -0
- package/dist/components/ui/command/command-item.svelte +43 -0
- package/dist/components/ui/command/command-item.svelte.d.ts +11 -0
- package/dist/components/ui/command/command-list.svelte +18 -0
- package/dist/components/ui/command/command-list.svelte.d.ts +4 -0
- package/dist/components/ui/command/command-loading.svelte +12 -0
- package/dist/components/ui/command/command-loading.svelte.d.ts +4 -0
- package/dist/components/ui/command/command-separator.svelte +23 -0
- package/dist/components/ui/command/command-separator.svelte.d.ts +7 -0
- package/dist/components/ui/command/command.svelte +26 -0
- package/dist/components/ui/command/command.svelte.d.ts +4 -0
- package/dist/components/ui/command/index.d.ts +55 -2
- package/dist/components/ui/command/index.js +21 -2
- package/dist/components/ui/sheet/sheet-content.svelte +1 -4
- package/dist/components/ui/sheet/sheet-content.svelte.d.ts +1 -3
- package/dist/components/ui/tabs/tabs-content.svelte +6 -2
- package/dist/components/ui/tabs/tabs-context.svelte.d.ts +5 -0
- package/dist/components/ui/tabs/tabs-context.svelte.js +2 -0
- package/dist/components/ui/tabs/tabs-trigger.svelte +49 -4
- package/dist/components/ui/tabs/tabs.svelte +12 -1
- package/dist/components/ui/tooltip/index.d.ts +4 -1
- package/dist/components/ui/tooltip/index.js +3 -1
- package/dist/components/ui/tooltip/tooltip-content.svelte +308 -35
- package/dist/components/ui/tooltip/tooltip-content.svelte.d.ts +42 -3
- package/dist/components/ui/tooltip/tooltip-context.svelte.d.ts +37 -0
- package/dist/components/ui/tooltip/tooltip-context.svelte.js +220 -0
- package/dist/components/ui/tooltip/tooltip-layer-registry.svelte.d.ts +11 -0
- package/dist/components/ui/tooltip/tooltip-layer-registry.svelte.js +93 -0
- package/dist/components/ui/tooltip/tooltip-trigger.svelte +56 -3
- package/dist/components/ui/tooltip/tooltip-trigger.svelte.d.ts +23 -2
- package/dist/components/ui/tooltip/tooltip.svelte +63 -3
- package/dist/components/ui/tooltip/tooltip.svelte.d.ts +23 -2
- package/dist/router-state.svelte.d.ts +13 -0
- package/dist/router-state.svelte.js +72 -37
- package/package.json +18 -12
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import { useNavigation, useCan,
|
|
2
|
+
import { useNavigation, useCan, useTranslation } from '@svadmin/core';
|
|
3
3
|
import { Button } from '../ui/button/index.js';
|
|
4
4
|
import { Copy } from '@lucide/svelte';
|
|
5
5
|
import type { ButtonAccessControl } from './access-control';
|
|
6
6
|
import { withRecordId } from './access-control';
|
|
7
7
|
|
|
8
|
+
const i18n = useTranslation();
|
|
9
|
+
|
|
8
10
|
let { resource, recordItemId, hideText = false, accessControl = { enabled: true, hideIfUnauthorized: true }, class: className = '' } = $props<{
|
|
9
11
|
resource: string;
|
|
10
12
|
recordItemId: string | number;
|
|
@@ -33,6 +35,6 @@
|
|
|
33
35
|
onclick={() => nav.clone(resource, recordItemId)}
|
|
34
36
|
>
|
|
35
37
|
<Copy class="h-4 w-4" />
|
|
36
|
-
{#if !hideText}<span class="ml-1">{t('common.clone')}</span>{/if}
|
|
38
|
+
{#if !hideText}<span class="ml-1">{i18n.t('common.clone')}</span>{/if}
|
|
37
39
|
</Button>
|
|
38
40
|
{/if}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import { useNavigation, useCan,
|
|
2
|
+
import { useNavigation, useCan, useTranslation } from '@svadmin/core';
|
|
3
3
|
import { Button } from '../ui/button/index.js';
|
|
4
4
|
import { Plus } from '@lucide/svelte';
|
|
5
5
|
import type { ButtonAccessControl } from './access-control';
|
|
6
6
|
|
|
7
|
+
const i18n = useTranslation();
|
|
8
|
+
|
|
7
9
|
let { resource, hideText = false, accessControl = { enabled: true, hideIfUnauthorized: true }, class: className = '' } = $props<{
|
|
8
10
|
resource: string;
|
|
9
11
|
hideText?: boolean;
|
|
@@ -31,6 +33,6 @@
|
|
|
31
33
|
onclick={() => nav.create(resource)}
|
|
32
34
|
>
|
|
33
35
|
<Plus class="h-4 w-4" />
|
|
34
|
-
{#if !hideText}<span class="ml-1">{t('common.create')}</span>{/if}
|
|
36
|
+
{#if !hideText}<span class="ml-1">{i18n.t('common.create')}</span>{/if}
|
|
35
37
|
</Button>
|
|
36
38
|
{/if}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import { useDelete, useCan,
|
|
2
|
+
import { useDelete, useCan, useTranslation } from '@svadmin/core';
|
|
3
3
|
import { Button } from '../ui/button/index.js';
|
|
4
4
|
import { Trash2 } from '@lucide/svelte';
|
|
5
5
|
import type { ButtonAccessControl } from './access-control';
|
|
6
6
|
import { withRecordId } from './access-control';
|
|
7
7
|
|
|
8
|
+
const i18n = useTranslation();
|
|
9
|
+
|
|
8
10
|
let {
|
|
9
11
|
resource, recordItemId, hideText = false,
|
|
10
12
|
accessControl = { enabled: true, hideIfUnauthorized: true }, onSuccess, undoable = false, class: className = '',
|
|
@@ -46,10 +48,10 @@
|
|
|
46
48
|
{#if confirming}
|
|
47
49
|
<div class="inline-flex items-center gap-1">
|
|
48
50
|
<Button variant="destructive" size="sm" onclick={handleDelete}>
|
|
49
|
-
{t('common.confirm')}
|
|
51
|
+
{i18n.t('common.confirm')}
|
|
50
52
|
</Button>
|
|
51
53
|
<Button variant="ghost" size="sm" onclick={cancel}>
|
|
52
|
-
{t('common.cancel')}
|
|
54
|
+
{i18n.t('common.cancel')}
|
|
53
55
|
</Button>
|
|
54
56
|
</div>
|
|
55
57
|
{:else}
|
|
@@ -61,7 +63,7 @@
|
|
|
61
63
|
onclick={handleDelete}
|
|
62
64
|
>
|
|
63
65
|
<Trash2 class="h-4 w-4" />
|
|
64
|
-
{#if !hideText}<span class="ml-1">{t('common.delete')}</span>{/if}
|
|
66
|
+
{#if !hideText}<span class="ml-1">{i18n.t('common.delete')}</span>{/if}
|
|
65
67
|
</Button>
|
|
66
68
|
{/if}
|
|
67
69
|
{/if}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import { useNavigation, useCan,
|
|
2
|
+
import { useNavigation, useCan, useTranslation } from '@svadmin/core';
|
|
3
3
|
import { Button } from '../ui/button/index.js';
|
|
4
4
|
import { Pencil } from '@lucide/svelte';
|
|
5
5
|
import type { ButtonAccessControl } from './access-control';
|
|
6
6
|
import { withRecordId } from './access-control';
|
|
7
7
|
|
|
8
|
+
const i18n = useTranslation();
|
|
9
|
+
|
|
8
10
|
let { resource, recordItemId, hideText = false, accessControl = { enabled: true, hideIfUnauthorized: true }, class: className = '' } = $props<{
|
|
9
11
|
resource: string;
|
|
10
12
|
recordItemId: string | number;
|
|
@@ -33,6 +35,6 @@
|
|
|
33
35
|
onclick={() => nav.edit(resource, recordItemId)}
|
|
34
36
|
>
|
|
35
37
|
<Pencil class="h-4 w-4" />
|
|
36
|
-
{#if !hideText}<span class="ml-1">{t('common.edit')}</span>{/if}
|
|
38
|
+
{#if !hideText}<span class="ml-1">{i18n.t('common.edit')}</span>{/if}
|
|
37
39
|
</Button>
|
|
38
40
|
{/if}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import { useExport, useCan,
|
|
2
|
+
import { useExport, useCan, useTranslation } from '@svadmin/core';
|
|
3
3
|
import { Button } from '../ui/button/index.js';
|
|
4
4
|
import { Download } from '@lucide/svelte';
|
|
5
5
|
import type { ButtonAccessControl } from './access-control';
|
|
6
6
|
|
|
7
|
+
const i18n = useTranslation();
|
|
8
|
+
|
|
7
9
|
let { resource, hideText = false, accessControl = { enabled: true, hideIfUnauthorized: true }, class: className = '' } = $props<{
|
|
8
10
|
resource: string;
|
|
9
11
|
hideText?: boolean;
|
|
@@ -32,6 +34,6 @@
|
|
|
32
34
|
onclick={triggerExport}
|
|
33
35
|
>
|
|
34
36
|
<Download class="h-4 w-4" />
|
|
35
|
-
{#if !hideText}<span class="ml-1">{t('common.export')}</span>{/if}
|
|
37
|
+
{#if !hideText}<span class="ml-1">{i18n.t('common.export')}</span>{/if}
|
|
36
38
|
</Button>
|
|
37
39
|
{/if}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import { useImport, useCan,
|
|
2
|
+
import { useImport, useCan, useTranslation } from '@svadmin/core';
|
|
3
3
|
import { Button } from '../ui/button/index.js';
|
|
4
4
|
import { Upload } from '@lucide/svelte';
|
|
5
5
|
import type { ButtonAccessControl } from './access-control';
|
|
6
6
|
|
|
7
|
+
const i18n = useTranslation();
|
|
8
|
+
|
|
7
9
|
let { resource, hideText = false, onFinish, accessControl = { enabled: true, hideIfUnauthorized: true }, class: className = '' } = $props<{
|
|
8
10
|
resource: string;
|
|
9
11
|
hideText?: boolean;
|
|
@@ -58,6 +60,6 @@
|
|
|
58
60
|
onclick={triggerImport}
|
|
59
61
|
>
|
|
60
62
|
<Upload class="h-4 w-4" />
|
|
61
|
-
{#if !hideText}<span class="ml-1">{t('common.import')}</span>{/if}
|
|
63
|
+
{#if !hideText}<span class="ml-1">{i18n.t('common.import')}</span>{/if}
|
|
62
64
|
</Button>
|
|
63
65
|
{/if}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import { useInvalidate,
|
|
2
|
+
import { useInvalidate, useTranslation } from '@svadmin/core';
|
|
3
3
|
import { Button } from '../ui/button/index.js';
|
|
4
4
|
import { RefreshCw } from '@lucide/svelte';
|
|
5
5
|
|
|
6
|
+
const i18n = useTranslation();
|
|
7
|
+
|
|
6
8
|
let { resource, hideText = false, class: className = '' } = $props<{
|
|
7
9
|
resource: string;
|
|
8
10
|
hideText?: boolean;
|
|
@@ -32,5 +34,5 @@
|
|
|
32
34
|
onclick={refresh}
|
|
33
35
|
>
|
|
34
36
|
<RefreshCw class="h-4 w-4 {spinning ? 'animate-spin' : ''}" />
|
|
35
|
-
{#if !hideText}<span class="ml-1">{t('common.retry')}</span>{/if}
|
|
37
|
+
{#if !hideText}<span class="ml-1">{i18n.t('common.retry')}</span>{/if}
|
|
36
38
|
</Button>
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import {
|
|
2
|
+
import { useTranslation } from '@svadmin/core';
|
|
3
3
|
import { Button } from '../ui/button/index.js';
|
|
4
4
|
import { Save, Loader2 } from '@lucide/svelte';
|
|
5
5
|
|
|
6
|
+
const i18n = useTranslation();
|
|
7
|
+
|
|
6
8
|
let { loading = false, hideText = false, type = 'submit', class: className = '' } = $props<{
|
|
7
9
|
loading?: boolean;
|
|
8
10
|
hideText?: boolean;
|
|
@@ -23,5 +25,5 @@
|
|
|
23
25
|
{:else}
|
|
24
26
|
<Save class="h-4 w-4" />
|
|
25
27
|
{/if}
|
|
26
|
-
{#if !hideText}<span class="ml-1">{t('common.save')}</span>{/if}
|
|
28
|
+
{#if !hideText}<span class="ml-1">{i18n.t('common.save')}</span>{/if}
|
|
27
29
|
</Button>
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import { useNavigation, useCan,
|
|
2
|
+
import { useNavigation, useCan, useTranslation } from '@svadmin/core';
|
|
3
3
|
import { Button } from '../ui/button/index.js';
|
|
4
4
|
import { Eye } from '@lucide/svelte';
|
|
5
5
|
import type { ButtonAccessControl } from './access-control';
|
|
6
6
|
import { withRecordId } from './access-control';
|
|
7
7
|
|
|
8
|
+
const i18n = useTranslation();
|
|
9
|
+
|
|
8
10
|
let { resource, recordItemId, hideText = false, accessControl = { enabled: true, hideIfUnauthorized: true }, class: className = '' } = $props<{
|
|
9
11
|
resource: string;
|
|
10
12
|
recordItemId: string | number;
|
|
@@ -34,6 +36,6 @@
|
|
|
34
36
|
onclick={() => nav.show(resource, recordItemId)}
|
|
35
37
|
>
|
|
36
38
|
<Eye class="h-4 w-4" />
|
|
37
|
-
{#if !hideText}<span class="ml-1">{t('common.detail')}</span>{/if}
|
|
39
|
+
{#if !hideText}<span class="ml-1">{i18n.t('common.detail')}</span>{/if}
|
|
38
40
|
</Button>
|
|
39
41
|
{/if}
|
|
@@ -2,9 +2,6 @@
|
|
|
2
2
|
// Shared field type → display component mapping
|
|
3
3
|
// Used by both ShowPage and FieldRenderer to avoid duplicate if/else chains.
|
|
4
4
|
// Components are lazily resolved by field type at runtime.
|
|
5
|
-
// Default display component map (read-only field display)
|
|
6
|
-
// Dynamically imports components only when first used
|
|
7
|
-
const _displayCache = new Map();
|
|
8
5
|
// Pre-import all field display components (tree-shaken by bundler)
|
|
9
6
|
import BooleanField from './fields/BooleanField.svelte';
|
|
10
7
|
import ImageField from './fields/ImageField.svelte';
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import type { FieldDefinition } from '@svadmin/core';
|
|
3
|
-
import {
|
|
3
|
+
import { useTranslation } from '@svadmin/core/i18n';
|
|
4
4
|
import { Button } from '../ui/button/index.js';
|
|
5
5
|
import { Plus, Trash2 } from '@lucide/svelte';
|
|
6
6
|
import TooltipButton from '../TooltipButton.svelte';
|
|
7
7
|
import FieldRenderer from '../FieldRenderer.svelte';
|
|
8
8
|
|
|
9
|
+
const i18n = useTranslation();
|
|
10
|
+
|
|
9
11
|
let { field, value, onchange } = $props<{
|
|
10
12
|
field: FieldDefinition;
|
|
11
13
|
value: unknown;
|
|
@@ -54,7 +56,7 @@
|
|
|
54
56
|
{/if}
|
|
55
57
|
</div>
|
|
56
58
|
<Button variant="outline" size="sm" type="button" onclick={handleAdd}>
|
|
57
|
-
<Plus class="h-3.5 w-3.5 mr-1" /> {t('common.add') || 'Add'}
|
|
59
|
+
<Plus class="h-3.5 w-3.5 mr-1" /> {i18n.t('common.add') || 'Add'}
|
|
58
60
|
</Button>
|
|
59
61
|
</div>
|
|
60
62
|
|
|
@@ -62,7 +64,7 @@
|
|
|
62
64
|
{#each arrayVal as item, i (i)}
|
|
63
65
|
<div class="relative rounded-md border bg-card p-4 pt-6 shadow-sm">
|
|
64
66
|
<div class="absolute right-2 top-2">
|
|
65
|
-
<TooltipButton tooltip={t('common.remove') || 'Remove'} variant="ghost" size="icon" class="h-8 w-8 text-muted-foreground hover:text-destructive transition-colors" onclick={() => handleRemove(i)}>
|
|
67
|
+
<TooltipButton tooltip={i18n.t('common.remove') || 'Remove'} variant="ghost" size="icon" class="h-8 w-8 text-muted-foreground hover:text-destructive transition-colors" onclick={() => handleRemove(i)}>
|
|
66
68
|
<Trash2 class="h-4 w-4" />
|
|
67
69
|
</TooltipButton>
|
|
68
70
|
</div>
|
|
@@ -79,7 +81,7 @@
|
|
|
79
81
|
{/each}
|
|
80
82
|
{#if arrayVal.length === 0}
|
|
81
83
|
<div class="flex flex-col items-center justify-center py-6 text-sm text-muted-foreground bg-muted/10 rounded-md">
|
|
82
|
-
<span>{t('common.noData') || 'No items added yet.'}</span>
|
|
84
|
+
<span>{i18n.t('common.noData') || 'No items added yet.'}</span>
|
|
83
85
|
</div>
|
|
84
86
|
{/if}
|
|
85
87
|
</div>
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import {
|
|
2
|
+
import { useTranslation } from '@svadmin/core/i18n';
|
|
3
3
|
import { Button } from '../ui/button/index.js';
|
|
4
4
|
import { Copy, Check, ChevronDown, ChevronRight } from '@lucide/svelte';
|
|
5
5
|
|
|
6
|
+
const i18n = useTranslation();
|
|
7
|
+
|
|
6
8
|
let { value } = $props<{
|
|
7
9
|
value: unknown;
|
|
8
10
|
}>();
|
|
@@ -47,14 +49,14 @@
|
|
|
47
49
|
{:else}
|
|
48
50
|
<ChevronRight class="h-3 w-3" />
|
|
49
51
|
{/if}
|
|
50
|
-
{expanded ? t('common.collapse') : t('common.expand')}
|
|
52
|
+
{expanded ? i18n.t('common.collapse') : i18n.t('common.expand')}
|
|
51
53
|
</Button>
|
|
52
54
|
<Button
|
|
53
55
|
variant="ghost"
|
|
54
56
|
size="sm"
|
|
55
57
|
class="flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground h-auto py-0.5 px-1"
|
|
56
58
|
onclick={copyJson}
|
|
57
|
-
aria-label={t('common.copy')}
|
|
59
|
+
aria-label={i18n.t('common.copy')}
|
|
58
60
|
>
|
|
59
61
|
{#if copied}
|
|
60
62
|
<Check class="h-3 w-3 text-emerald-500" />
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { ExternalLink } from '@lucide/svelte';
|
|
3
|
-
import {
|
|
3
|
+
import { captureAdminContext } from '@svadmin/core';
|
|
4
4
|
|
|
5
5
|
let { value, resourceName, displayValue } = $props<{
|
|
6
6
|
value: string | number | null | undefined;
|
|
7
7
|
resourceName?: string;
|
|
8
8
|
displayValue?: string;
|
|
9
9
|
}>();
|
|
10
|
+
const adminContext = captureAdminContext();
|
|
10
11
|
|
|
11
12
|
const display = $derived(displayValue ?? (value != null ? `#${value}` : '—'));
|
|
12
13
|
const href = $derived.by(() => {
|
|
13
14
|
if (!resourceName || value == null) return undefined;
|
|
14
|
-
const router = getRouterProvider();
|
|
15
15
|
const path = `/${resourceName}/show/${value}`;
|
|
16
|
-
return
|
|
16
|
+
return adminContext.formatLink(path);
|
|
17
17
|
});
|
|
18
18
|
</script>
|
|
19
19
|
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import {
|
|
2
|
+
import { useTranslation } from '@svadmin/core/i18n';
|
|
3
3
|
import { Button } from '../ui/button/index.js';
|
|
4
4
|
|
|
5
|
+
const i18n = useTranslation();
|
|
6
|
+
|
|
5
7
|
let { value, maxLength = 200 } = $props<{
|
|
6
8
|
value: string | null | undefined;
|
|
7
9
|
maxLength?: number;
|
|
@@ -28,7 +30,7 @@
|
|
|
28
30
|
class="text-xs text-primary h-auto p-0"
|
|
29
31
|
onclick={() => { showFull = !showFull; }}
|
|
30
32
|
>
|
|
31
|
-
{showFull ? t('common.showLess') : t('common.showMore')}
|
|
33
|
+
{showFull ? i18n.t('common.showLess') : i18n.t('common.showMore')}
|
|
32
34
|
</Button>
|
|
33
35
|
{/if}
|
|
34
36
|
</div>
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import {
|
|
2
|
+
import { useTranslation } from '@svadmin/core/i18n';
|
|
3
3
|
import * as Card from '../ui/card/index.js';
|
|
4
4
|
import { Button } from '../ui/button/index.js';
|
|
5
5
|
import { Input } from '../ui/input/index.js';
|
|
6
6
|
import { Search, Download, UserPlus, MoreHorizontal, CheckCircle2, Clock, XCircle } from '@lucide/svelte';
|
|
7
7
|
|
|
8
|
+
const i18n = useTranslation();
|
|
9
|
+
|
|
8
10
|
interface CrewMember {
|
|
9
11
|
id: string;
|
|
10
12
|
name: string;
|
|
@@ -37,9 +39,9 @@
|
|
|
37
39
|
);
|
|
38
40
|
|
|
39
41
|
const statusConfig = {
|
|
40
|
-
'active': { icon: CheckCircle2, color: 'text-green-500', dot: 'bg-green-500', label: t('account.active') },
|
|
41
|
-
'away': { icon: Clock, color: 'text-amber-500', dot: 'bg-amber-500', label: t('account.invited') },
|
|
42
|
-
'offline': { icon: XCircle, color: 'text-muted-foreground', dot: 'bg-muted-foreground', label: t('account.inactive') },
|
|
42
|
+
'active': { icon: CheckCircle2, color: 'text-green-500', dot: 'bg-green-500', label: i18n.t('account.active') },
|
|
43
|
+
'away': { icon: Clock, color: 'text-amber-500', dot: 'bg-amber-500', label: i18n.t('account.invited') },
|
|
44
|
+
'offline': { icon: XCircle, color: 'text-muted-foreground', dot: 'bg-muted-foreground', label: i18n.t('account.inactive') },
|
|
43
45
|
};
|
|
44
46
|
|
|
45
47
|
const initials = (name: string) => name.split(' ').map(n => n[0]).join('').toUpperCase().slice(0, 2);
|
|
@@ -48,22 +50,22 @@
|
|
|
48
50
|
<div class="space-y-6" data-svadmin-content-page="network">
|
|
49
51
|
<div class="flex items-start justify-between gap-4">
|
|
50
52
|
<div>
|
|
51
|
-
<h2 class="text-xl font-semibold text-foreground">{t('network.teamCrew')}</h2>
|
|
52
|
-
<p class="mt-1 text-sm text-muted-foreground">{t('network.teamCrewDescription')}</p>
|
|
53
|
+
<h2 class="text-xl font-semibold text-foreground">{i18n.t('network.teamCrew')}</h2>
|
|
54
|
+
<p class="mt-1 text-sm text-muted-foreground">{i18n.t('network.teamCrewDescription')}</p>
|
|
53
55
|
</div>
|
|
54
56
|
<div class="flex gap-2">
|
|
55
57
|
<Button variant="outline" size="sm">
|
|
56
|
-
<Download class="h-3.5 w-3.5 mr-1" />{t('common.export')}
|
|
58
|
+
<Download class="h-3.5 w-3.5 mr-1" />{i18n.t('common.export')}
|
|
57
59
|
</Button>
|
|
58
60
|
<Button size="sm">
|
|
59
|
-
<UserPlus class="h-3.5 w-3.5 mr-1" />{t('account.inviteMember')}
|
|
61
|
+
<UserPlus class="h-3.5 w-3.5 mr-1" />{i18n.t('account.inviteMember')}
|
|
60
62
|
</Button>
|
|
61
63
|
</div>
|
|
62
64
|
</div>
|
|
63
65
|
|
|
64
66
|
<div class="relative">
|
|
65
67
|
<Search class="absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground" />
|
|
66
|
-
<Input placeholder={t('common.search')} bind:value={searchQuery} class="pl-9" />
|
|
68
|
+
<Input placeholder={i18n.t('common.search')} bind:value={searchQuery} class="pl-9" />
|
|
67
69
|
</div>
|
|
68
70
|
|
|
69
71
|
<!-- Table -->
|
|
@@ -73,12 +75,12 @@
|
|
|
73
75
|
<table class="w-full">
|
|
74
76
|
<thead>
|
|
75
77
|
<tr class="border-b bg-muted/30">
|
|
76
|
-
<th class="px-4 py-3 text-left text-xs font-semibold text-muted-foreground">{t('account.member')}</th>
|
|
77
|
-
<th class="px-4 py-3 text-left text-xs font-semibold text-muted-foreground">{t('account.role')}</th>
|
|
78
|
+
<th class="px-4 py-3 text-left text-xs font-semibold text-muted-foreground">{i18n.t('account.member')}</th>
|
|
79
|
+
<th class="px-4 py-3 text-left text-xs font-semibold text-muted-foreground">{i18n.t('account.role')}</th>
|
|
78
80
|
<th class="px-4 py-3 text-left text-xs font-semibold text-muted-foreground">Department</th>
|
|
79
|
-
<th class="px-4 py-3 text-left text-xs font-semibold text-muted-foreground">{t('account.status')}</th>
|
|
80
|
-
<th class="px-4 py-3 text-left text-xs font-semibold text-muted-foreground">{t('publicProfile.projects')}</th>
|
|
81
|
-
<th class="px-4 py-3 text-left text-xs font-semibold text-muted-foreground">{t('account.joined')}</th>
|
|
81
|
+
<th class="px-4 py-3 text-left text-xs font-semibold text-muted-foreground">{i18n.t('account.status')}</th>
|
|
82
|
+
<th class="px-4 py-3 text-left text-xs font-semibold text-muted-foreground">{i18n.t('publicProfile.projects')}</th>
|
|
83
|
+
<th class="px-4 py-3 text-left text-xs font-semibold text-muted-foreground">{i18n.t('account.joined')}</th>
|
|
82
84
|
<th class="px-4 py-3 w-12"></th>
|
|
83
85
|
</tr>
|
|
84
86
|
</thead>
|
|
@@ -144,8 +146,8 @@
|
|
|
144
146
|
<div class="flex items-center gap-1 {sc.color}">
|
|
145
147
|
<sc.icon class="h-3 w-3" />{sc.label}
|
|
146
148
|
</div>
|
|
147
|
-
<div>{t('publicProfile.projects')}: <span class="font-medium text-foreground">{member.projects}</span></div>
|
|
148
|
-
<div>{t('account.joined')}: <span class="font-medium text-foreground">{member.joinedAt}</span></div>
|
|
149
|
+
<div>{i18n.t('publicProfile.projects')}: <span class="font-medium text-foreground">{member.projects}</span></div>
|
|
150
|
+
<div>{i18n.t('account.joined')}: <span class="font-medium text-foreground">{member.joinedAt}</span></div>
|
|
149
151
|
</div>
|
|
150
152
|
</div>
|
|
151
153
|
{/each}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import {
|
|
2
|
+
import { useTranslation } from '@svadmin/core/i18n';
|
|
3
3
|
import * as Card from '../ui/card/index.js';
|
|
4
4
|
import { Button } from '../ui/button/index.js';
|
|
5
5
|
import { Badge } from '../ui/badge/index.js';
|
|
6
6
|
import { Input } from '../ui/input/index.js';
|
|
7
7
|
import { Search, ExternalLink, Check, Plus } from '@lucide/svelte';
|
|
8
8
|
|
|
9
|
+
const i18n = useTranslation();
|
|
10
|
+
|
|
9
11
|
interface NFTUser {
|
|
10
12
|
id: string;
|
|
11
13
|
name: string;
|
|
@@ -53,13 +55,13 @@
|
|
|
53
55
|
|
|
54
56
|
<div class="space-y-6" data-svadmin-content-page="network">
|
|
55
57
|
<div>
|
|
56
|
-
<h2 class="text-xl font-semibold text-foreground">{t('network.userCards')}</h2>
|
|
57
|
-
<p class="mt-1 text-sm text-muted-foreground">{t('network.userCardsDescription')}</p>
|
|
58
|
+
<h2 class="text-xl font-semibold text-foreground">{i18n.t('network.userCards')}</h2>
|
|
59
|
+
<p class="mt-1 text-sm text-muted-foreground">{i18n.t('network.userCardsDescription')}</p>
|
|
58
60
|
</div>
|
|
59
61
|
|
|
60
62
|
<div class="relative">
|
|
61
63
|
<Search class="absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground" />
|
|
62
|
-
<Input placeholder={t('common.search')} bind:value={searchQuery} class="pl-9" />
|
|
64
|
+
<Input placeholder={i18n.t('common.search')} bind:value={searchQuery} class="pl-9" />
|
|
63
65
|
</div>
|
|
64
66
|
|
|
65
67
|
<div class="grid gap-4 sm:grid-cols-1 md:grid-cols-2 lg:grid-cols-3">
|
|
@@ -98,15 +100,15 @@
|
|
|
98
100
|
<div class="grid grid-cols-3 gap-2 border-t pt-3">
|
|
99
101
|
<div class="text-center">
|
|
100
102
|
<div class="text-sm font-semibold text-foreground">{user.collectionCount}</div>
|
|
101
|
-
<div class="text-[10px] text-muted-foreground">{t('network.nftCollection')}</div>
|
|
103
|
+
<div class="text-[10px] text-muted-foreground">{i18n.t('network.nftCollection')}</div>
|
|
102
104
|
</div>
|
|
103
105
|
<div class="text-center">
|
|
104
106
|
<div class="text-sm font-semibold text-foreground">{user.floorPrice}</div>
|
|
105
|
-
<div class="text-[10px] text-muted-foreground">{t('network.floorPrice')}</div>
|
|
107
|
+
<div class="text-[10px] text-muted-foreground">{i18n.t('network.floorPrice')}</div>
|
|
106
108
|
</div>
|
|
107
109
|
<div class="text-center">
|
|
108
110
|
<div class="text-xs font-semibold text-foreground">{user.volume}</div>
|
|
109
|
-
<div class="text-[10px] text-muted-foreground">{t('network.volume')}</div>
|
|
111
|
+
<div class="text-[10px] text-muted-foreground">{i18n.t('network.volume')}</div>
|
|
110
112
|
</div>
|
|
111
113
|
</div>
|
|
112
114
|
|
|
@@ -118,9 +120,9 @@
|
|
|
118
120
|
onclick={() => toggleConnect(user.id)}
|
|
119
121
|
>
|
|
120
122
|
{#if isConnected(user.id)}
|
|
121
|
-
<Check class="h-3.5 w-3.5 mr-1" />{t('network.connected')}
|
|
123
|
+
<Check class="h-3.5 w-3.5 mr-1" />{i18n.t('network.connected')}
|
|
122
124
|
{:else}
|
|
123
|
-
<Plus class="h-3.5 w-3.5 mr-1" />{t('network.connect')}
|
|
125
|
+
<Plus class="h-3.5 w-3.5 mr-1" />{i18n.t('network.connect')}
|
|
124
126
|
{/if}
|
|
125
127
|
</Button>
|
|
126
128
|
<Button size="sm" variant="ghost">
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import {
|
|
2
|
+
import { useTranslation } from '@svadmin/core/i18n';
|
|
3
3
|
import * as Card from '../ui/card/index.js';
|
|
4
4
|
import { Avatar } from '../ui/avatar/index.js';
|
|
5
5
|
import { MessageSquare, Plus, UserPlus, Star } from '@lucide/svelte';
|
|
6
6
|
import type { Component } from 'svelte';
|
|
7
7
|
|
|
8
|
+
const i18n = useTranslation();
|
|
9
|
+
|
|
8
10
|
interface ActivityItem {
|
|
9
11
|
id: string;
|
|
10
12
|
type: 'posted' | 'commented' | 'joined' | 'created' | 'starred';
|
|
@@ -22,20 +24,20 @@
|
|
|
22
24
|
let { activities = [] }: Props = $props();
|
|
23
25
|
|
|
24
26
|
const typeConfig: Record<string, { icon: Component; color: string; action: string }> = {
|
|
25
|
-
'posted': { icon: MessageSquare, color: 'bg-blue-500/10 text-blue-500', action: t('publicProfile.activityPosted') },
|
|
26
|
-
'commented': { icon: MessageSquare, color: 'bg-green-500/10 text-green-500', action: t('publicProfile.activityCommented') },
|
|
27
|
-
'joined': { icon: UserPlus, color: 'bg-purple-500/10 text-purple-500', action: t('publicProfile.activityJoined') },
|
|
28
|
-
'created': { icon: Plus, color: 'bg-amber-500/10 text-amber-500', action: t('publicProfile.activityCreated') },
|
|
29
|
-
'starred': { icon: Star, color: 'bg-yellow-500/10 text-yellow-500', action: t('publicProfile.activityCreated') },
|
|
27
|
+
'posted': { icon: MessageSquare, color: 'bg-blue-500/10 text-blue-500', action: i18n.t('publicProfile.activityPosted') },
|
|
28
|
+
'commented': { icon: MessageSquare, color: 'bg-green-500/10 text-green-500', action: i18n.t('publicProfile.activityCommented') },
|
|
29
|
+
'joined': { icon: UserPlus, color: 'bg-purple-500/10 text-purple-500', action: i18n.t('publicProfile.activityJoined') },
|
|
30
|
+
'created': { icon: Plus, color: 'bg-amber-500/10 text-amber-500', action: i18n.t('publicProfile.activityCreated') },
|
|
31
|
+
'starred': { icon: Star, color: 'bg-yellow-500/10 text-yellow-500', action: i18n.t('publicProfile.activityCreated') },
|
|
30
32
|
};
|
|
31
33
|
</script>
|
|
32
34
|
|
|
33
35
|
<div class="space-y-4">
|
|
34
|
-
<h3 class="text-lg font-semibold text-foreground">{t('publicProfile.activity')}</h3>
|
|
36
|
+
<h3 class="text-lg font-semibold text-foreground">{i18n.t('publicProfile.activity')}</h3>
|
|
35
37
|
|
|
36
38
|
{#if activities.length === 0}
|
|
37
39
|
<div class="rounded-xl border border-dashed border-border/60 p-8 text-center">
|
|
38
|
-
<p class="text-sm text-muted-foreground">{t('publicProfile.noActivity')}</p>
|
|
40
|
+
<p class="text-sm text-muted-foreground">{i18n.t('publicProfile.noActivity')}</p>
|
|
39
41
|
</div>
|
|
40
42
|
{:else}
|
|
41
43
|
<Card.Card class="border-border/60">
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import {
|
|
2
|
+
import { useTranslation } from '@svadmin/core/i18n';
|
|
3
3
|
import { Button } from '../ui/button/index.js';
|
|
4
4
|
import { Badge } from '../ui/badge/index.js';
|
|
5
5
|
import * as Card from '../ui/card/index.js';
|
|
6
6
|
import { Avatar } from '../ui/avatar/index.js';
|
|
7
7
|
import { MapPin, Link, Calendar, Users, Star, Trophy, Building2, Gamepad2 } from '@lucide/svelte';
|
|
8
8
|
|
|
9
|
+
const i18n = useTranslation();
|
|
10
|
+
|
|
9
11
|
interface ProfileStats {
|
|
10
12
|
label: string;
|
|
11
13
|
value: string | number;
|
|
@@ -93,9 +95,9 @@
|
|
|
93
95
|
<div class="flex items-center gap-2">
|
|
94
96
|
<h3 class="text-lg font-semibold text-foreground truncate">{name}</h3>
|
|
95
97
|
{#if variant === 'company'}
|
|
96
|
-
<Badge variant="secondary" class="shrink-0"><Building2 class="h-3 w-3 mr-1" />{t('profile.company')}</Badge>
|
|
98
|
+
<Badge variant="secondary" class="shrink-0"><Building2 class="h-3 w-3 mr-1" />{i18n.t('profile.company')}</Badge>
|
|
97
99
|
{:else if variant === 'gamer'}
|
|
98
|
-
<Badge variant="secondary" class="shrink-0"><Gamepad2 class="h-3 w-3 mr-1" />{t('profile.gamer')}</Badge>
|
|
100
|
+
<Badge variant="secondary" class="shrink-0"><Gamepad2 class="h-3 w-3 mr-1" />{i18n.t('profile.gamer')}</Badge>
|
|
99
101
|
{/if}
|
|
100
102
|
</div>
|
|
101
103
|
{#if tagline}
|
|
@@ -116,13 +118,13 @@
|
|
|
116
118
|
{#if employees}
|
|
117
119
|
<div class="flex items-center gap-2 text-muted-foreground">
|
|
118
120
|
<Users class="h-3.5 w-3.5" />
|
|
119
|
-
<span>{employees} {t('profile.employees')}</span>
|
|
121
|
+
<span>{employees} {i18n.t('profile.employees')}</span>
|
|
120
122
|
</div>
|
|
121
123
|
{/if}
|
|
122
124
|
{#if founded}
|
|
123
125
|
<div class="flex items-center gap-2 text-muted-foreground">
|
|
124
126
|
<Calendar class="h-3.5 w-3.5" />
|
|
125
|
-
<span>{t('profile.founded')} {founded}</span>
|
|
127
|
+
<span>{i18n.t('profile.founded')} {founded}</span>
|
|
126
128
|
</div>
|
|
127
129
|
{/if}
|
|
128
130
|
{#if website}
|
|
@@ -143,7 +145,7 @@
|
|
|
143
145
|
{#if level}
|
|
144
146
|
<div class="flex items-center gap-2 text-muted-foreground">
|
|
145
147
|
<Star class="h-3.5 w-3.5" />
|
|
146
|
-
<span>{t('profile.level')} {level}</span>
|
|
148
|
+
<span>{i18n.t('profile.level')} {level}</span>
|
|
147
149
|
</div>
|
|
148
150
|
{/if}
|
|
149
151
|
{#if rank}
|
|
@@ -163,7 +165,7 @@
|
|
|
163
165
|
<div class="flex items-center gap-1.5"><Link class="h-3.5 w-3.5" /><span class="truncate">{website}</span></div>
|
|
164
166
|
{/if}
|
|
165
167
|
{#if joinedDate}
|
|
166
|
-
<div class="flex items-center gap-1.5"><Calendar class="h-3.5 w-3.5" /><span>{t('publicProfile.joinedDate', { date: joinedDate })}</span></div>
|
|
168
|
+
<div class="flex items-center gap-1.5"><Calendar class="h-3.5 w-3.5" /><span>{i18n.t('publicProfile.joinedDate', { date: joinedDate })}</span></div>
|
|
167
169
|
{/if}
|
|
168
170
|
</div>
|
|
169
171
|
{/if}
|
|
@@ -193,10 +195,10 @@
|
|
|
193
195
|
{#if followers > 0 || following > 0}
|
|
194
196
|
<div class="flex gap-4 text-sm border-t pt-3">
|
|
195
197
|
{#if followers > 0}
|
|
196
|
-
<span><strong class="text-foreground">{followers}</strong> <span class="text-muted-foreground">{t('publicProfile.followers')}</span></span>
|
|
198
|
+
<span><strong class="text-foreground">{followers}</strong> <span class="text-muted-foreground">{i18n.t('publicProfile.followers')}</span></span>
|
|
197
199
|
{/if}
|
|
198
200
|
{#if following > 0}
|
|
199
|
-
<span><strong class="text-foreground">{following}</strong> <span class="text-muted-foreground">{t('publicProfile.following')}</span></span>
|
|
201
|
+
<span><strong class="text-foreground">{following}</strong> <span class="text-muted-foreground">{i18n.t('publicProfile.following')}</span></span>
|
|
200
202
|
{/if}
|
|
201
203
|
</div>
|
|
202
204
|
{/if}
|
|
@@ -208,9 +210,9 @@
|
|
|
208
210
|
variant={isConnected ? 'outline' : 'default'}
|
|
209
211
|
onclick={toggleConnect}
|
|
210
212
|
>
|
|
211
|
-
{isConnected ? t('network.connected') : t('network.connect')}
|
|
213
|
+
{isConnected ? i18n.t('network.connected') : i18n.t('network.connect')}
|
|
212
214
|
</Button>
|
|
213
|
-
<Button size="sm" variant="outline">{t('publicProfile.sendMessage')}</Button>
|
|
215
|
+
<Button size="sm" variant="outline">{i18n.t('publicProfile.sendMessage')}</Button>
|
|
214
216
|
</div>
|
|
215
217
|
</Card.CardContent>
|
|
216
218
|
</Card.Card>
|