@svadmin/lite 0.16.11 → 0.22.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/README.md +71 -2
- package/dist/components/LiteActivityFeed.svelte +31 -9
- package/dist/components/LiteActivityFeed.svelte.d.ts +6 -0
- package/dist/components/LiteAffix.svelte +29 -0
- package/dist/components/LiteAffix.svelte.d.ts +13 -0
- package/dist/components/LiteAnchor.svelte +38 -0
- package/dist/components/LiteAnchor.svelte.d.ts +14 -0
- package/dist/components/LiteApprovalActionCard.svelte +8 -5
- package/dist/components/LiteApprovalActionCard.svelte.d.ts +2 -0
- package/dist/components/LiteAuditLog.svelte +9 -9
- package/dist/components/LiteAutoComplete.svelte +41 -0
- package/dist/components/LiteAutoComplete.svelte.d.ts +13 -0
- package/dist/components/LiteBackTop.svelte +16 -0
- package/dist/components/LiteBackTop.svelte.d.ts +8 -0
- package/dist/components/LiteBreadcrumbs.svelte +4 -1
- package/dist/components/LiteBreadcrumbs.svelte.d.ts +2 -0
- package/dist/components/LiteCalendar.svelte +124 -0
- package/dist/components/LiteCalendar.svelte.d.ts +20 -0
- package/dist/components/LiteCanvasAnnotation.svelte +13 -13
- package/dist/components/LiteCarousel.svelte +72 -0
- package/dist/components/LiteCarousel.svelte.d.ts +14 -0
- package/dist/components/LiteChatDialog.svelte +8 -8
- package/dist/components/LiteCollapse.svelte +49 -0
- package/dist/components/LiteCollapse.svelte.d.ts +15 -0
- package/dist/components/LiteColumnHeaderFilter.svelte +4 -1
- package/dist/components/LiteColumnHeaderFilter.svelte.d.ts +2 -0
- package/dist/components/LiteColumnSettings.svelte +7 -4
- package/dist/components/LiteColumnSettings.svelte.d.ts +2 -0
- package/dist/components/LiteCommentThread.svelte +113 -0
- package/dist/components/LiteCommentThread.svelte.d.ts +26 -0
- package/dist/components/LiteConfirmDialog.svelte +2 -2
- package/dist/components/LiteCountdown.svelte +49 -0
- package/dist/components/LiteCountdown.svelte.d.ts +10 -0
- package/dist/components/LiteDecisionTable.svelte +14 -14
- package/dist/components/LiteDetailDrawer.svelte +45 -0
- package/dist/components/LiteDetailDrawer.svelte.d.ts +14 -0
- package/dist/components/LiteDraggableRowTable.svelte +5 -2
- package/dist/components/LiteDraggableRowTable.svelte.d.ts +2 -0
- package/dist/components/LiteDrawerForm.svelte +11 -8
- package/dist/components/LiteDrawerForm.svelte.d.ts +2 -0
- package/dist/components/LiteDynamicFormList.svelte +5 -5
- package/dist/components/LiteEditableTable.svelte +5 -2
- package/dist/components/LiteEditableTable.svelte.d.ts +2 -0
- package/dist/components/LiteEmptyState.svelte +11 -4
- package/dist/components/LiteEmptyState.svelte.d.ts +3 -0
- package/dist/components/LiteFilterBuilder.svelte +8 -5
- package/dist/components/LiteFilterBuilder.svelte.d.ts +2 -0
- package/dist/components/LiteFloatButton.svelte +54 -0
- package/dist/components/LiteFloatButton.svelte.d.ts +15 -0
- package/dist/components/LiteGanttChart.svelte +20 -20
- package/dist/components/LiteGrid.svelte +34 -0
- package/dist/components/LiteGrid.svelte.d.ts +11 -0
- package/dist/components/LiteImage.svelte +54 -0
- package/dist/components/LiteImage.svelte.d.ts +14 -0
- package/dist/components/LiteImageCropper.svelte +7 -4
- package/dist/components/LiteImageCropper.svelte.d.ts +2 -0
- package/dist/components/LiteImagePreview.svelte +36 -0
- package/dist/components/LiteImagePreview.svelte.d.ts +13 -0
- package/dist/components/LiteImportWizard.svelte +7 -7
- package/dist/components/LiteItemList.svelte +50 -0
- package/dist/components/LiteItemList.svelte.d.ts +15 -0
- package/dist/components/LiteJsonSchemaForm.svelte +10 -7
- package/dist/components/LiteJsonSchemaForm.svelte.d.ts +2 -0
- package/dist/components/LiteKanbanBoard.svelte +19 -19
- package/dist/components/LiteLayout.svelte +18 -6
- package/dist/components/LiteLayout.svelte.d.ts +8 -0
- package/dist/components/LiteLink.svelte +32 -0
- package/dist/components/LiteLink.svelte.d.ts +11 -0
- package/dist/components/LiteLogin.svelte +9 -2
- package/dist/components/LiteLogin.svelte.d.ts +2 -0
- package/dist/components/LiteMasterDetailView.svelte +13 -10
- package/dist/components/LiteMasterDetailView.svelte.d.ts +2 -0
- package/dist/components/LiteMediaLibraryModal.svelte +8 -5
- package/dist/components/LiteMediaLibraryModal.svelte.d.ts +2 -0
- package/dist/components/LiteMediaThumbnail.svelte +3 -3
- package/dist/components/LiteMentionsInput.svelte +9 -9
- package/dist/components/LiteMenu.svelte +22 -0
- package/dist/components/LiteMenu.svelte.d.ts +12 -0
- package/dist/components/LiteMenuList.svelte +55 -0
- package/dist/components/LiteMenuList.svelte.d.ts +17 -0
- package/dist/components/LiteModalForm.svelte +9 -6
- package/dist/components/LiteModalForm.svelte.d.ts +2 -0
- package/dist/components/LiteMultiTabKeepAlive.svelte +6 -6
- package/dist/components/LiteNotificationCenter.svelte +85 -0
- package/dist/components/LiteNotificationCenter.svelte.d.ts +22 -0
- package/dist/components/LiteOfflineSyncBanner.svelte +6 -6
- package/dist/components/LiteOtpInput.svelte +50 -0
- package/dist/components/LiteOtpInput.svelte.d.ts +15 -0
- package/dist/components/LitePageHeader.svelte +34 -0
- package/dist/components/LitePageHeader.svelte.d.ts +13 -0
- package/dist/components/LitePagination.svelte +10 -2
- package/dist/components/LitePagination.svelte.d.ts +2 -0
- package/dist/components/LitePdfDocumentViewer.svelte +14 -14
- package/dist/components/LitePermissionMatrix.svelte +8 -8
- package/dist/components/LitePivotTable.svelte +11 -11
- package/dist/components/LitePopconfirm.svelte +49 -0
- package/dist/components/LitePopconfirm.svelte.d.ts +14 -0
- package/dist/components/LitePresenceAvatarGroup.svelte +8 -5
- package/dist/components/LitePresenceAvatarGroup.svelte.d.ts +2 -0
- package/dist/components/LitePrintableBill.svelte +12 -9
- package/dist/components/LitePrintableBill.svelte.d.ts +2 -0
- package/dist/components/LiteProgress.svelte +46 -0
- package/dist/components/LiteProgress.svelte.d.ts +12 -0
- package/dist/components/LiteQRCode.svelte +62 -0
- package/dist/components/LiteQRCode.svelte.d.ts +14 -0
- package/dist/components/LiteResizeBox.svelte +34 -0
- package/dist/components/LiteResizeBox.svelte.d.ts +12 -0
- package/dist/components/LiteResult.svelte +52 -0
- package/dist/components/LiteResult.svelte.d.ts +14 -0
- package/dist/components/LiteRowActions.svelte +36 -0
- package/dist/components/LiteRowActions.svelte.d.ts +17 -0
- package/dist/components/LiteSensitiveDataMask.svelte +4 -1
- package/dist/components/LiteSensitiveDataMask.svelte.d.ts +2 -0
- package/dist/components/LiteShow.svelte +1 -1
- package/dist/components/LiteShowField.svelte +2 -2
- package/dist/components/LiteSignaturePad.svelte +9 -9
- package/dist/components/LiteSkeleton.svelte +100 -0
- package/dist/components/LiteSkeleton.svelte.d.ts +19 -0
- package/dist/components/LiteSpace.svelte +31 -0
- package/dist/components/LiteSpace.svelte.d.ts +12 -0
- package/dist/components/LiteSpin.svelte +27 -0
- package/dist/components/LiteSpin.svelte.d.ts +10 -0
- package/dist/components/LiteSplitPaneLayout.svelte +18 -6
- package/dist/components/LiteSplitPaneLayout.svelte.d.ts +8 -0
- package/dist/components/LiteSpreadsheetView.svelte +8 -8
- package/dist/components/LiteStatistic.svelte +63 -0
- package/dist/components/LiteStatistic.svelte.d.ts +15 -0
- package/dist/components/LiteStatsCard.svelte +5 -2
- package/dist/components/LiteStatsCard.svelte.d.ts +2 -0
- package/dist/components/LiteStatusBadge.svelte +33 -0
- package/dist/components/LiteStatusBadge.svelte.d.ts +12 -0
- package/dist/components/LiteStatusTabs.svelte +35 -0
- package/dist/components/LiteStatusTabs.svelte.d.ts +14 -0
- package/dist/components/LiteStepForm.svelte +14 -11
- package/dist/components/LiteStepForm.svelte.d.ts +2 -0
- package/dist/components/LiteSteps.svelte +64 -0
- package/dist/components/LiteSteps.svelte.d.ts +18 -0
- package/dist/components/LiteTable.svelte +5 -2
- package/dist/components/LiteTable.svelte.d.ts +2 -0
- package/dist/components/LiteTableSummary.svelte +8 -5
- package/dist/components/LiteTableSummary.svelte.d.ts +2 -0
- package/dist/components/LiteTabs.svelte +30 -20
- package/dist/components/LiteTabs.svelte.d.ts +11 -2
- package/dist/components/LiteTag.svelte +31 -0
- package/dist/components/LiteTag.svelte.d.ts +13 -0
- package/dist/components/LiteTimeline.svelte +48 -0
- package/dist/components/LiteTimeline.svelte.d.ts +17 -0
- package/dist/components/LiteTour.svelte +54 -0
- package/dist/components/LiteTour.svelte.d.ts +15 -0
- package/dist/components/LiteTransfer.svelte +9 -6
- package/dist/components/LiteTransfer.svelte.d.ts +2 -0
- package/dist/components/LiteTree.svelte +48 -0
- package/dist/components/LiteTree.svelte.d.ts +17 -0
- package/dist/components/LiteTreeTable.svelte +1 -1
- package/dist/components/LiteTwoFactorStepper.svelte +53 -0
- package/dist/components/LiteTwoFactorStepper.svelte.d.ts +16 -0
- package/dist/components/LiteVersionDiffViewer.svelte +16 -13
- package/dist/components/LiteVersionDiffViewer.svelte.d.ts +2 -0
- package/dist/components/LiteVideoPlayer.svelte +67 -0
- package/dist/components/LiteVideoPlayer.svelte.d.ts +22 -0
- package/dist/components/LiteVirtualTable.svelte +1 -1
- package/dist/components/advanced/LiteAutoSaveIndicator.svelte +42 -13
- package/dist/components/advanced/LiteAutoSaveIndicator.svelte.d.ts +10 -4
- package/dist/components/advanced/LiteDraggableHeader.svelte +2 -2
- package/dist/components/advanced/LiteDrawerForm.svelte +4 -1
- package/dist/components/advanced/LiteDrawerForm.svelte.d.ts +2 -0
- package/dist/components/advanced/LiteInlineEdit.svelte +1 -1
- package/dist/components/advanced/LiteModalForm.svelte +4 -1
- package/dist/components/advanced/LiteModalForm.svelte.d.ts +2 -0
- package/dist/components/advanced/LiteToast.svelte +3 -3
- package/dist/components/advanced/LiteUndoableNotification.svelte +1 -1
- package/dist/components/compatibility/LiteRealtimeStatus.svelte +41 -2
- package/dist/components/compatibility/LiteRealtimeStatus.svelte.d.ts +15 -0
- package/dist/components/fields/LiteBooleanField.svelte +4 -2
- package/dist/components/fields/LiteBooleanField.svelte.d.ts +2 -0
- package/dist/components/fields/LiteCascader.svelte +5 -2
- package/dist/components/fields/LiteCascader.svelte.d.ts +2 -0
- package/dist/components/fields/LiteDateField.svelte +39 -9
- package/dist/components/fields/LiteDateField.svelte.d.ts +2 -0
- package/dist/components/fields/LiteDateRangeField.svelte +1 -1
- package/dist/components/fields/LiteImageField.svelte +6 -2
- package/dist/components/fields/LiteImageField.svelte.d.ts +2 -0
- package/dist/components/fields/LiteJsonField.svelte +1 -1
- package/dist/components/fields/LiteMarkdownField.svelte +49 -3
- package/dist/components/fields/LiteMarkdownField.svelte.d.ts +5 -0
- package/dist/components/fields/LiteNumberField.svelte +5 -3
- package/dist/components/fields/LiteNumberField.svelte.d.ts +2 -0
- package/dist/components/fields/LiteRichTextField.svelte +49 -12
- package/dist/components/fields/LiteRichTextField.svelte.d.ts +3 -0
- package/dist/components/fields/LiteSelectField.svelte +5 -3
- package/dist/components/fields/LiteSelectField.svelte.d.ts +2 -0
- package/dist/components/fields/LiteTagField.svelte +38 -15
- package/dist/components/fields/LiteTagField.svelte.d.ts +2 -0
- package/dist/components/fields/LiteTextField.svelte +26 -5
- package/dist/components/fields/LiteTextField.svelte.d.ts +2 -0
- package/dist/components/fields/LiteTreeSelect.svelte +5 -2
- package/dist/components/fields/LiteTreeSelect.svelte.d.ts +2 -0
- package/dist/components/fields/LiteUrlField.svelte +5 -3
- package/dist/components/fields/LiteUrlField.svelte.d.ts +2 -0
- package/dist/components/layout/LiteAuthenticated.svelte +2 -2
- package/dist/components/layout/LiteCanAccess.svelte +1 -1
- package/dist/components/layout/LiteErrorComponent.svelte +4 -4
- package/dist/components/layout/LiteHeader.svelte +2 -2
- package/dist/components/layout/LiteSidebar.svelte +6 -3
- package/dist/components/layout/LiteSidebar.svelte.d.ts +2 -0
- package/dist/components/pages/LiteCreatePage.svelte +4 -1
- package/dist/components/pages/LiteCreatePage.svelte.d.ts +2 -0
- package/dist/components/pages/LiteEditPage.svelte +4 -1
- package/dist/components/pages/LiteEditPage.svelte.d.ts +2 -0
- package/dist/components/pages/LiteForgotPasswordPage.svelte +7 -7
- package/dist/components/pages/LiteListPage.svelte +6 -3
- package/dist/components/pages/LiteListPage.svelte.d.ts +2 -0
- package/dist/components/pages/LiteProfilePage.svelte +2 -2
- package/dist/components/pages/LiteRegisterPage.svelte +6 -6
- package/dist/components/pages/LiteShowPage.svelte +6 -3
- package/dist/components/pages/LiteShowPage.svelte.d.ts +2 -0
- package/dist/components/pages/LiteUpdatePasswordPage.svelte +4 -4
- package/dist/components/widgets/LiteAnomalyBadge.svelte +6 -3
- package/dist/components/widgets/LiteAnomalyBadge.svelte.d.ts +2 -0
- package/dist/components/widgets/LiteAreaChart.svelte +20 -0
- package/dist/components/widgets/LiteAreaChart.svelte.d.ts +10 -0
- package/dist/components/widgets/LiteBarChart.svelte +6 -6
- package/dist/components/widgets/LiteChartSvg.svelte +102 -0
- package/dist/components/widgets/LiteChartSvg.svelte.d.ts +10 -0
- package/dist/components/widgets/LiteChartTable.svelte +44 -0
- package/dist/components/widgets/LiteChartTable.svelte.d.ts +10 -0
- package/dist/components/widgets/LiteDonutChart.svelte +20 -0
- package/dist/components/widgets/LiteDonutChart.svelte.d.ts +10 -0
- package/dist/components/widgets/LiteFunnelChart.svelte +20 -0
- package/dist/components/widgets/LiteFunnelChart.svelte.d.ts +10 -0
- package/dist/components/widgets/LiteGaugeChart.svelte +20 -0
- package/dist/components/widgets/LiteGaugeChart.svelte.d.ts +10 -0
- package/dist/components/widgets/LiteHeatmapChart.svelte +20 -0
- package/dist/components/widgets/LiteHeatmapChart.svelte.d.ts +10 -0
- package/dist/components/widgets/LiteInsightCard.svelte +35 -13
- package/dist/components/widgets/LiteInsightCard.svelte.d.ts +7 -4
- package/dist/components/widgets/LiteLineChart.svelte +13 -10
- package/dist/components/widgets/LiteLineChart.svelte.d.ts +0 -5
- package/dist/components/widgets/LitePieChart.svelte +11 -9
- package/dist/components/widgets/LitePieChart.svelte.d.ts +0 -5
- package/dist/components/widgets/LiteRadarChart.svelte +20 -0
- package/dist/components/widgets/LiteRadarChart.svelte.d.ts +10 -0
- package/dist/components/widgets/LiteRoseChart.svelte +20 -0
- package/dist/components/widgets/LiteRoseChart.svelte.d.ts +10 -0
- package/dist/components/widgets/LiteScatterChart.svelte +20 -0
- package/dist/components/widgets/LiteScatterChart.svelte.d.ts +10 -0
- package/dist/components/widgets/LiteWaterfallChart.svelte +20 -0
- package/dist/components/widgets/LiteWaterfallChart.svelte.d.ts +10 -0
- package/dist/components/widgets/chart-geometry.d.ts +65 -0
- package/dist/components/widgets/chart-geometry.js +229 -0
- package/dist/components/widgets/index.d.ts +10 -0
- package/dist/components/widgets/index.js +10 -0
- package/dist/index.d.ts +40 -0
- package/dist/index.js +47 -0
- package/dist/lite-code-theme.css +139 -0
- package/dist/lite.css +234 -127
- package/dist/rich-content.d.ts +47 -0
- package/dist/rich-content.js +498 -0
- package/dist/schema-generator.js +3 -1
- package/dist/server-adapter.js +6 -11
- package/dist/value-normalization.d.ts +4 -0
- package/dist/value-normalization.js +13 -0
- package/package.json +18 -4
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
idKey?: string;
|
|
8
8
|
titleKey?: string;
|
|
9
9
|
detailSnippet?: Snippet<[Record<string, unknown>]>;
|
|
10
|
+
/** Caller class merged with the built-in class list. */
|
|
11
|
+
class?: string;
|
|
10
12
|
}
|
|
11
13
|
|
|
12
14
|
let {
|
|
@@ -15,6 +17,7 @@
|
|
|
15
17
|
idKey = 'id',
|
|
16
18
|
titleKey = 'title',
|
|
17
19
|
detailSnippet,
|
|
20
|
+
class: className = '',
|
|
18
21
|
}: Props = $props();
|
|
19
22
|
|
|
20
23
|
const activeItem = $derived(
|
|
@@ -22,7 +25,7 @@
|
|
|
22
25
|
);
|
|
23
26
|
</script>
|
|
24
27
|
|
|
25
|
-
<div class="lite-master-detail-card">
|
|
28
|
+
<div class="lite-master-detail-card {className}">
|
|
26
29
|
<!-- Left Master List -->
|
|
27
30
|
<div class="lite-master-list">
|
|
28
31
|
<div class="lite-master-header">
|
|
@@ -52,7 +55,7 @@
|
|
|
52
55
|
<tbody>
|
|
53
56
|
{#each Object.entries(activeItem) as [k, v] (k)}
|
|
54
57
|
<tr>
|
|
55
|
-
<th style="width: 30%; text-align: left; background: #
|
|
58
|
+
<th style="width: 30%; text-align: left; background: #F7F8FA;">{k}</th>
|
|
56
59
|
<td>{typeof v === 'object' ? JSON.stringify(v) : String(v ?? '—')}</td>
|
|
57
60
|
</tr>
|
|
58
61
|
{/each}
|
|
@@ -61,7 +64,7 @@
|
|
|
61
64
|
</div>
|
|
62
65
|
{/if}
|
|
63
66
|
{:else}
|
|
64
|
-
<div style="color: #
|
|
67
|
+
<div style="color: #86909C; padding: 24px; text-align: center;">
|
|
65
68
|
Select an item to view details
|
|
66
69
|
</div>
|
|
67
70
|
{/if}
|
|
@@ -72,19 +75,19 @@
|
|
|
72
75
|
.lite-master-detail-card {
|
|
73
76
|
display: flex;
|
|
74
77
|
background: #ffffff;
|
|
75
|
-
border: 1px solid #
|
|
78
|
+
border: 1px solid #E5E6EB;
|
|
76
79
|
border-radius: 6px;
|
|
77
80
|
margin-bottom: 16px;
|
|
78
81
|
min-height: 320px;
|
|
79
82
|
}
|
|
80
83
|
.lite-master-list {
|
|
81
84
|
flex: 0 0 240px;
|
|
82
|
-
border-right: 1px solid #
|
|
83
|
-
background: #
|
|
85
|
+
border-right: 1px solid #E5E6EB;
|
|
86
|
+
background: #F7F8FA;
|
|
84
87
|
}
|
|
85
88
|
.lite-master-header {
|
|
86
89
|
padding: 10px 12px;
|
|
87
|
-
border-bottom: 1px solid #
|
|
90
|
+
border-bottom: 1px solid #E5E6EB;
|
|
88
91
|
font-size: 12px;
|
|
89
92
|
}
|
|
90
93
|
.lite-master-items {
|
|
@@ -93,16 +96,16 @@
|
|
|
93
96
|
margin: 0;
|
|
94
97
|
}
|
|
95
98
|
.lite-master-item {
|
|
96
|
-
border-bottom: 1px solid #
|
|
99
|
+
border-bottom: 1px solid #F2F3F5;
|
|
97
100
|
}
|
|
98
101
|
.lite-master-item-active {
|
|
99
|
-
background: #
|
|
102
|
+
background: #E8F3FF;
|
|
100
103
|
font-weight: bold;
|
|
101
104
|
}
|
|
102
105
|
.lite-master-link {
|
|
103
106
|
display: block;
|
|
104
107
|
padding: 8px 12px;
|
|
105
|
-
color: #
|
|
108
|
+
color: #1D2129;
|
|
106
109
|
text-decoration: none;
|
|
107
110
|
font-size: 12px;
|
|
108
111
|
}
|
|
@@ -5,6 +5,8 @@ interface Props {
|
|
|
5
5
|
idKey?: string;
|
|
6
6
|
titleKey?: string;
|
|
7
7
|
detailSnippet?: Snippet<[Record<string, unknown>]>;
|
|
8
|
+
/** Caller class merged with the built-in class list. */
|
|
9
|
+
class?: string;
|
|
8
10
|
}
|
|
9
11
|
declare const LiteMasterDetailView: import("svelte").Component<Props, {}, "">;
|
|
10
12
|
type LiteMasterDetailView = ReturnType<typeof LiteMasterDetailView>;
|
|
@@ -16,6 +16,8 @@
|
|
|
16
16
|
mediaItems?: LiteMediaItem[];
|
|
17
17
|
action?: string;
|
|
18
18
|
method?: 'get' | 'post' | 'dialog' | 'GET' | 'POST' | 'DIALOG' | null;
|
|
19
|
+
/** Caller class merged with the built-in class list. */
|
|
20
|
+
class?: string;
|
|
19
21
|
}
|
|
20
22
|
|
|
21
23
|
let {
|
|
@@ -24,10 +26,11 @@
|
|
|
24
26
|
mediaItems = [],
|
|
25
27
|
action = '',
|
|
26
28
|
method = 'POST',
|
|
29
|
+
class: className = '',
|
|
27
30
|
}: Props = $props();
|
|
28
31
|
</script>
|
|
29
32
|
|
|
30
|
-
<div class="lite-media-library-card">
|
|
33
|
+
<div class="lite-media-library-card {className}">
|
|
31
34
|
<div class="lite-media-header">
|
|
32
35
|
<strong>{title}</strong>
|
|
33
36
|
</div>
|
|
@@ -71,7 +74,7 @@
|
|
|
71
74
|
{/each}
|
|
72
75
|
{#if mediaItems.length === 0}
|
|
73
76
|
<tr>
|
|
74
|
-
<td colspan="5" style="text-align: center; color: #
|
|
77
|
+
<td colspan="5" style="text-align: center; color: #86909C; padding: 24px;">No media files available</td>
|
|
75
78
|
</tr>
|
|
76
79
|
{/if}
|
|
77
80
|
</tbody>
|
|
@@ -88,21 +91,21 @@
|
|
|
88
91
|
<style>
|
|
89
92
|
.lite-media-library-card {
|
|
90
93
|
background: #ffffff;
|
|
91
|
-
border: 1px solid #
|
|
94
|
+
border: 1px solid #E5E6EB;
|
|
92
95
|
border-radius: 6px;
|
|
93
96
|
padding: 16px;
|
|
94
97
|
margin-bottom: 16px;
|
|
95
98
|
}
|
|
96
99
|
.lite-media-header {
|
|
97
100
|
padding-bottom: 10px;
|
|
98
|
-
border-bottom: 1px solid #
|
|
101
|
+
border-bottom: 1px solid #E5E6EB;
|
|
99
102
|
margin-bottom: 12px;
|
|
100
103
|
font-size: 14px;
|
|
101
104
|
}
|
|
102
105
|
.lite-media-upload-row {
|
|
103
106
|
margin-bottom: 12px;
|
|
104
107
|
padding: 8px;
|
|
105
|
-
background: #
|
|
108
|
+
background: #F7F8FA;
|
|
106
109
|
border-radius: 4px;
|
|
107
110
|
}
|
|
108
111
|
.lite-media-footer {
|
|
@@ -11,6 +11,8 @@ interface Props {
|
|
|
11
11
|
mediaItems?: LiteMediaItem[];
|
|
12
12
|
action?: string;
|
|
13
13
|
method?: 'get' | 'post' | 'dialog' | 'GET' | 'POST' | 'DIALOG' | null;
|
|
14
|
+
/** Caller class merged with the built-in class list. */
|
|
15
|
+
class?: string;
|
|
14
16
|
}
|
|
15
17
|
declare const LiteMediaLibraryModal: import("svelte").Component<Props, {}, "">;
|
|
16
18
|
type LiteMediaLibraryModal = ReturnType<typeof LiteMediaLibraryModal>;
|
|
@@ -27,9 +27,9 @@
|
|
|
27
27
|
{/if}
|
|
28
28
|
|
|
29
29
|
<style>
|
|
30
|
-
.lite-media-thumbnail { position: relative; display: inline-flex; max-width: 300px; align-items: center; justify-content: center; overflow: hidden; border: 1px solid #
|
|
30
|
+
.lite-media-thumbnail { position: relative; display: inline-flex; max-width: 300px; align-items: center; justify-content: center; overflow: hidden; border: 1px solid #E5E6EB; border-radius: 6px; background: #F7F8FA; }
|
|
31
31
|
.lite-media-thumbnail img { display: block; width: auto; max-width: 100%; height: 100%; object-fit: contain; }
|
|
32
32
|
.lite-media-hidden { visibility: hidden; }
|
|
33
|
-
.lite-media-status { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; padding: 8px; color: #
|
|
34
|
-
.lite-media-empty { color: #
|
|
33
|
+
.lite-media-status { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; padding: 8px; color: #4E5969; font-size: 12px; text-align: center; }
|
|
34
|
+
.lite-media-empty { color: #4E5969; font-size: 12px; }
|
|
35
35
|
</style>
|
|
@@ -61,24 +61,24 @@
|
|
|
61
61
|
.sv-lite-textarea {
|
|
62
62
|
width: 100%;
|
|
63
63
|
padding: 8px;
|
|
64
|
-
border: 1px solid #
|
|
64
|
+
border: 1px solid #E5E6EB;
|
|
65
65
|
border-radius: 4px;
|
|
66
66
|
font-size: 12px;
|
|
67
67
|
font-family: inherit;
|
|
68
68
|
box-sizing: border-box;
|
|
69
69
|
background-color: #ffffff;
|
|
70
|
-
color: #
|
|
70
|
+
color: #1D2129;
|
|
71
71
|
}
|
|
72
72
|
.sv-lite-mentions-hints {
|
|
73
73
|
margin-top: 6px;
|
|
74
74
|
padding: 4px 6px;
|
|
75
|
-
background-color: #
|
|
76
|
-
border: 1px solid #
|
|
75
|
+
background-color: #F7F8FA;
|
|
76
|
+
border: 1px solid #E5E6EB;
|
|
77
77
|
border-radius: 4px;
|
|
78
78
|
}
|
|
79
79
|
.sv-lite-hints-title {
|
|
80
80
|
font-weight: 600;
|
|
81
|
-
color: #
|
|
81
|
+
color: #4E5969;
|
|
82
82
|
margin-right: 6px;
|
|
83
83
|
}
|
|
84
84
|
.sv-lite-mention-badge {
|
|
@@ -86,13 +86,13 @@
|
|
|
86
86
|
padding: 2px 6px;
|
|
87
87
|
margin-right: 4px;
|
|
88
88
|
margin-bottom: 2px;
|
|
89
|
-
background-color: #
|
|
90
|
-
color: #
|
|
89
|
+
background-color: #E8F3FF;
|
|
90
|
+
color: #0E42D2;
|
|
91
91
|
border-radius: 3px;
|
|
92
92
|
font-size: 11px;
|
|
93
93
|
}
|
|
94
94
|
.sv-lite-tag {
|
|
95
|
-
background-color: #
|
|
96
|
-
color: #
|
|
95
|
+
background-color: #F2F3F5;
|
|
96
|
+
color: #4E5969;
|
|
97
97
|
}
|
|
98
98
|
</style>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import LiteMenuList, { type MenuEntry } from './LiteMenuList.svelte';
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
items: MenuEntry[];
|
|
6
|
+
mode?: 'vertical' | 'horizontal';
|
|
7
|
+
selected?: string;
|
|
8
|
+
label?: string;
|
|
9
|
+
/** Caller class merged with the built-in class list. */
|
|
10
|
+
class?: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
let { items, mode = 'vertical', selected, label = 'Menu', class: className = '' }: Props = $props();
|
|
14
|
+
</script>
|
|
15
|
+
|
|
16
|
+
<nav class="lite-menu {className}" data-mode={mode} aria-label={label}>
|
|
17
|
+
<LiteMenuList {items} {selected} {mode} />
|
|
18
|
+
</nav>
|
|
19
|
+
|
|
20
|
+
<style>
|
|
21
|
+
.lite-menu { border: 1px solid #E5E6EB; border-radius: 8px; background: #fff; }
|
|
22
|
+
</style>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type MenuEntry } from './LiteMenuList.svelte';
|
|
2
|
+
interface Props {
|
|
3
|
+
items: MenuEntry[];
|
|
4
|
+
mode?: 'vertical' | 'horizontal';
|
|
5
|
+
selected?: string;
|
|
6
|
+
label?: string;
|
|
7
|
+
/** Caller class merged with the built-in class list. */
|
|
8
|
+
class?: string;
|
|
9
|
+
}
|
|
10
|
+
declare const LiteMenu: import("svelte").Component<Props, {}, "">;
|
|
11
|
+
type LiteMenu = ReturnType<typeof LiteMenu>;
|
|
12
|
+
export default LiteMenu;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
export interface MenuEntry {
|
|
3
|
+
id: string;
|
|
4
|
+
label: string;
|
|
5
|
+
href?: string;
|
|
6
|
+
disabled?: boolean;
|
|
7
|
+
badge?: string | number;
|
|
8
|
+
children?: MenuEntry[];
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
interface Props {
|
|
12
|
+
items: MenuEntry[];
|
|
13
|
+
selected?: string;
|
|
14
|
+
depth?: number;
|
|
15
|
+
mode?: 'vertical' | 'horizontal';
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
let { items, selected, depth = 0, mode = 'vertical' }: Props = $props();
|
|
19
|
+
|
|
20
|
+
</script>
|
|
21
|
+
|
|
22
|
+
{#snippet branch(list: MenuEntry[], level: number, listMode: 'vertical' | 'horizontal')}
|
|
23
|
+
<ul class="lite-menu__list" data-mode={level === 0 ? listMode : 'vertical'} role={level === 0 ? 'menu' : 'group'}>
|
|
24
|
+
{#each list as item (item.id)}
|
|
25
|
+
<li role="none" class:active={selected === item.id} data-disabled={item.disabled || undefined}>
|
|
26
|
+
{#if item.href && !item.disabled}
|
|
27
|
+
<a role="menuitem" href={item.href} aria-current={selected === item.id ? 'page' : undefined}>
|
|
28
|
+
<span>{item.label}</span>
|
|
29
|
+
{#if item.badge !== undefined}<span class="lite-badge lite-badge-secondary">{item.badge}</span>{/if}
|
|
30
|
+
</a>
|
|
31
|
+
{:else}
|
|
32
|
+
<span role="menuitem" aria-disabled={item.disabled || undefined}>
|
|
33
|
+
<span>{item.label}</span>
|
|
34
|
+
{#if item.badge !== undefined}<span class="lite-badge lite-badge-secondary">{item.badge}</span>{/if}
|
|
35
|
+
</span>
|
|
36
|
+
{/if}
|
|
37
|
+
{#if item.children?.length}
|
|
38
|
+
{@render branch(item.children, level + 1, 'vertical')}
|
|
39
|
+
{/if}
|
|
40
|
+
</li>
|
|
41
|
+
{/each}
|
|
42
|
+
</ul>
|
|
43
|
+
{/snippet}
|
|
44
|
+
|
|
45
|
+
{@render branch(items, depth, mode)}
|
|
46
|
+
|
|
47
|
+
<style>
|
|
48
|
+
.lite-menu__list { margin: 0; padding: 4px; list-style: none; }
|
|
49
|
+
.lite-menu__list[data-mode='horizontal'] { display: flex; flex-wrap: wrap; }
|
|
50
|
+
.lite-menu__list li > a, .lite-menu__list li > span { display: flex; align-items: center; justify-content: space-between; padding: 8px 12px; border-radius: 4px; color: #1D2129; font-size: 13px; text-decoration: none; }
|
|
51
|
+
.lite-menu__list li > a:hover, .lite-menu__list li.active > a { background: #E8F3FF; color: #165DFF; text-decoration: none; }
|
|
52
|
+
.lite-menu__list li[data-disabled] > span { color: #C9CDD4; }
|
|
53
|
+
.lite-menu__list li > a > span + span, .lite-menu__list li > span > span + span { margin-left: 8px; }
|
|
54
|
+
.lite-menu__list .lite-menu__list { padding-left: 16px; }
|
|
55
|
+
</style>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface MenuEntry {
|
|
2
|
+
id: string;
|
|
3
|
+
label: string;
|
|
4
|
+
href?: string;
|
|
5
|
+
disabled?: boolean;
|
|
6
|
+
badge?: string | number;
|
|
7
|
+
children?: MenuEntry[];
|
|
8
|
+
}
|
|
9
|
+
interface Props {
|
|
10
|
+
items: MenuEntry[];
|
|
11
|
+
selected?: string;
|
|
12
|
+
depth?: number;
|
|
13
|
+
mode?: 'vertical' | 'horizontal';
|
|
14
|
+
}
|
|
15
|
+
declare const LiteMenuList: import("svelte").Component<Props, {}, "">;
|
|
16
|
+
type LiteMenuList = ReturnType<typeof LiteMenuList>;
|
|
17
|
+
export default LiteMenuList;
|
|
@@ -9,6 +9,8 @@
|
|
|
9
9
|
submitText?: string;
|
|
10
10
|
cancelText?: string;
|
|
11
11
|
children?: Snippet;
|
|
12
|
+
/** Caller class merged with the built-in class list. */
|
|
13
|
+
class?: string;
|
|
12
14
|
}
|
|
13
15
|
|
|
14
16
|
let {
|
|
@@ -19,10 +21,11 @@
|
|
|
19
21
|
submitText = 'Confirm',
|
|
20
22
|
cancelText = 'Cancel',
|
|
21
23
|
children,
|
|
24
|
+
class: className = '',
|
|
22
25
|
}: Props = $props();
|
|
23
26
|
</script>
|
|
24
27
|
|
|
25
|
-
<div class="lite-modal-card">
|
|
28
|
+
<div class="lite-modal-card {className}">
|
|
26
29
|
<div class="lite-modal-header">
|
|
27
30
|
<h3 class="lite-modal-title">{title}</h3>
|
|
28
31
|
{#if description}
|
|
@@ -52,24 +55,24 @@
|
|
|
52
55
|
.lite-modal-card {
|
|
53
56
|
padding: 16px;
|
|
54
57
|
background: #ffffff;
|
|
55
|
-
border: 1px solid #
|
|
58
|
+
border: 1px solid #E5E6EB;
|
|
56
59
|
border-radius: 6px;
|
|
57
60
|
margin-bottom: 16px;
|
|
58
61
|
}
|
|
59
62
|
.lite-modal-header {
|
|
60
63
|
padding-bottom: 10px;
|
|
61
|
-
border-bottom: 1px solid #
|
|
64
|
+
border-bottom: 1px solid #E5E6EB;
|
|
62
65
|
margin-bottom: 12px;
|
|
63
66
|
}
|
|
64
67
|
.lite-modal-title {
|
|
65
68
|
margin: 0;
|
|
66
69
|
font-size: 14px;
|
|
67
|
-
color: #
|
|
70
|
+
color: #1D2129;
|
|
68
71
|
}
|
|
69
72
|
.lite-modal-desc {
|
|
70
73
|
margin: 4px 0 0 0;
|
|
71
74
|
font-size: 12px;
|
|
72
|
-
color: #
|
|
75
|
+
color: #4E5969;
|
|
73
76
|
}
|
|
74
77
|
.lite-modal-body {
|
|
75
78
|
margin-bottom: 16px;
|
|
@@ -79,6 +82,6 @@
|
|
|
79
82
|
display: flex;
|
|
80
83
|
justify-content: flex-end;
|
|
81
84
|
padding-top: 12px;
|
|
82
|
-
border-top: 1px solid #
|
|
85
|
+
border-top: 1px solid #E5E6EB;
|
|
83
86
|
}
|
|
84
87
|
</style>
|
|
@@ -7,6 +7,8 @@ interface Props {
|
|
|
7
7
|
submitText?: string;
|
|
8
8
|
cancelText?: string;
|
|
9
9
|
children?: Snippet;
|
|
10
|
+
/** Caller class merged with the built-in class list. */
|
|
11
|
+
class?: string;
|
|
10
12
|
}
|
|
11
13
|
declare const LiteModalForm: import("svelte").Component<Props, {}, "">;
|
|
12
14
|
type LiteModalForm = ReturnType<typeof LiteModalForm>;
|
|
@@ -40,8 +40,8 @@
|
|
|
40
40
|
<style>
|
|
41
41
|
.sv-lite-tab-bar {
|
|
42
42
|
display: block;
|
|
43
|
-
background-color: #
|
|
44
|
-
border-bottom: 1px solid #
|
|
43
|
+
background-color: #F2F3F5;
|
|
44
|
+
border-bottom: 1px solid #E5E6EB;
|
|
45
45
|
padding: 4px 8px 0 8px;
|
|
46
46
|
font-size: 12px;
|
|
47
47
|
}
|
|
@@ -53,18 +53,18 @@
|
|
|
53
53
|
display: inline-block;
|
|
54
54
|
padding: 6px 12px;
|
|
55
55
|
margin-right: 4px;
|
|
56
|
-
background-color: #
|
|
57
|
-
color: #
|
|
56
|
+
background-color: #E5E6EB;
|
|
57
|
+
color: #4E5969;
|
|
58
58
|
text-decoration: none;
|
|
59
59
|
border-top-left-radius: 4px;
|
|
60
60
|
border-top-right-radius: 4px;
|
|
61
|
-
border: 1px solid #
|
|
61
|
+
border: 1px solid #E5E6EB;
|
|
62
62
|
border-bottom: none;
|
|
63
63
|
font-weight: 500;
|
|
64
64
|
}
|
|
65
65
|
.sv-lite-tab-active {
|
|
66
66
|
background-color: #ffffff;
|
|
67
|
-
color: #
|
|
67
|
+
color: #1D2129;
|
|
68
68
|
font-weight: 600;
|
|
69
69
|
border-bottom: 1px solid #ffffff;
|
|
70
70
|
margin-bottom: -1px;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { renderRichContent, type MarkdownRenderOptions } from '../rich-content.js';
|
|
3
|
+
|
|
4
|
+
interface NotificationItem {
|
|
5
|
+
id: string;
|
|
6
|
+
title: string;
|
|
7
|
+
description?: string;
|
|
8
|
+
time?: string;
|
|
9
|
+
href?: string;
|
|
10
|
+
read?: boolean;
|
|
11
|
+
tone?: 'info' | 'success' | 'warning' | 'danger';
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
interface Props {
|
|
15
|
+
items: NotificationItem[];
|
|
16
|
+
title?: string;
|
|
17
|
+
emptyText?: string;
|
|
18
|
+
markAllHref?: string;
|
|
19
|
+
/** Render item descriptions as Markdown/allowlisted HTML. Defaults to plain text. */
|
|
20
|
+
richContent?: boolean;
|
|
21
|
+
richContentOptions?: MarkdownRenderOptions;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
let {
|
|
25
|
+
items,
|
|
26
|
+
title = 'Notifications',
|
|
27
|
+
emptyText = 'No notifications',
|
|
28
|
+
markAllHref,
|
|
29
|
+
richContent = false,
|
|
30
|
+
richContentOptions,
|
|
31
|
+
}: Props = $props();
|
|
32
|
+
|
|
33
|
+
function body(value: string): string {
|
|
34
|
+
return renderRichContent(value, richContentOptions);
|
|
35
|
+
}
|
|
36
|
+
</script>
|
|
37
|
+
|
|
38
|
+
<section class="lite-notification-center lite-card" aria-label={title}>
|
|
39
|
+
<header>
|
|
40
|
+
<h2>{title}</h2>
|
|
41
|
+
{#if markAllHref}<a href={markAllHref}>Mark all read</a>{/if}
|
|
42
|
+
</header>
|
|
43
|
+
{#if items.length === 0}
|
|
44
|
+
<p class="lite-muted">{emptyText}</p>
|
|
45
|
+
{:else}
|
|
46
|
+
<ul>
|
|
47
|
+
{#each items as item (item.id)}
|
|
48
|
+
<li data-read={item.read || undefined} data-tone={item.tone ?? 'info'}>
|
|
49
|
+
<span class="lite-notification-center__dot" aria-hidden="true"></span>
|
|
50
|
+
{#if item.href}<a href={item.href}>{item.title}</a>{:else}<strong>{item.title}</strong>{/if}
|
|
51
|
+
{#if item.description}
|
|
52
|
+
{#if richContent}
|
|
53
|
+
<!-- eslint-disable-next-line svelte/no-at-html-tags -- 内容由 renderRichContent 转义或白名单过滤,高亮回调仅允许可信服务端实现。 -->
|
|
54
|
+
<div class="lite-notification-center__rich">{@html body(item.description)}</div>
|
|
55
|
+
{:else}
|
|
56
|
+
<p>{item.description}</p>
|
|
57
|
+
{/if}
|
|
58
|
+
{/if}
|
|
59
|
+
{#if item.time}<time>{item.time}</time>{/if}
|
|
60
|
+
</li>
|
|
61
|
+
{/each}
|
|
62
|
+
</ul>
|
|
63
|
+
{/if}
|
|
64
|
+
</section>
|
|
65
|
+
|
|
66
|
+
<style>
|
|
67
|
+
.lite-notification-center { padding: 0; overflow: hidden; }
|
|
68
|
+
.lite-notification-center header { display: flex; align-items: baseline; justify-content: space-between; padding: 12px 16px; border-bottom: 1px solid #E5E6EB; }
|
|
69
|
+
.lite-notification-center h2 { margin: 0; color: #1D2129; font-size: 14px; }
|
|
70
|
+
.lite-notification-center header a { color: #165DFF; font-size: 12px; }
|
|
71
|
+
.lite-notification-center ul { margin: 0; padding: 0; list-style: none; }
|
|
72
|
+
.lite-notification-center li { position: relative; display: block; padding: 12px 16px 12px 30px; border-bottom: 1px solid #F2F3F5; }
|
|
73
|
+
.lite-notification-center li:last-child { border-bottom: 0; }
|
|
74
|
+
.lite-notification-center li[data-read] { opacity: 0.65; }
|
|
75
|
+
.lite-notification-center__dot { position: absolute; top: 16px; left: 16px; width: 7px; height: 7px; border-radius: 999px; background: #165DFF; }
|
|
76
|
+
.lite-notification-center li[data-tone='success'] .lite-notification-center__dot { background: #00B42A; }
|
|
77
|
+
.lite-notification-center li[data-tone='warning'] .lite-notification-center__dot { background: #FF7D00; }
|
|
78
|
+
.lite-notification-center li[data-tone='danger'] .lite-notification-center__dot { background: #F53F3F; }
|
|
79
|
+
.lite-notification-center li a, .lite-notification-center li strong { color: #1D2129; font-size: 13px; }
|
|
80
|
+
.lite-notification-center li p { margin: 0; color: #4E5969; font-size: 12px; line-height: 1.5; }
|
|
81
|
+
.lite-notification-center li time { color: #86909C; font-size: 11px; }
|
|
82
|
+
.lite-notification-center__rich :global(p) { margin: 0; }
|
|
83
|
+
.lite-notification-center__rich :global(a) { color: #165DFF; }
|
|
84
|
+
.lite-notification-center__rich :global(code) { padding: 1px 4px; border-radius: 3px; background: #F2F3F5; font-family: monospace; font-size: 12px; }
|
|
85
|
+
</style>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type MarkdownRenderOptions } from '../rich-content.js';
|
|
2
|
+
interface NotificationItem {
|
|
3
|
+
id: string;
|
|
4
|
+
title: string;
|
|
5
|
+
description?: string;
|
|
6
|
+
time?: string;
|
|
7
|
+
href?: string;
|
|
8
|
+
read?: boolean;
|
|
9
|
+
tone?: 'info' | 'success' | 'warning' | 'danger';
|
|
10
|
+
}
|
|
11
|
+
interface Props {
|
|
12
|
+
items: NotificationItem[];
|
|
13
|
+
title?: string;
|
|
14
|
+
emptyText?: string;
|
|
15
|
+
markAllHref?: string;
|
|
16
|
+
/** Render item descriptions as Markdown/allowlisted HTML. Defaults to plain text. */
|
|
17
|
+
richContent?: boolean;
|
|
18
|
+
richContentOptions?: MarkdownRenderOptions;
|
|
19
|
+
}
|
|
20
|
+
declare const LiteNotificationCenter: import("svelte").Component<Props, {}, "">;
|
|
21
|
+
type LiteNotificationCenter = ReturnType<typeof LiteNotificationCenter>;
|
|
22
|
+
export default LiteNotificationCenter;
|
|
@@ -49,13 +49,13 @@
|
|
|
49
49
|
}
|
|
50
50
|
.sv-lite-sync-offline {
|
|
51
51
|
background-color: #fef3c7;
|
|
52
|
-
border: 1px solid #
|
|
53
|
-
color: #
|
|
52
|
+
border: 1px solid #FFE4BA;
|
|
53
|
+
color: #D25F00;
|
|
54
54
|
}
|
|
55
55
|
.sv-lite-sync-online {
|
|
56
|
-
background-color: #
|
|
57
|
-
border: 1px solid #
|
|
58
|
-
color: #
|
|
56
|
+
background-color: #F2F3F5;
|
|
57
|
+
border: 1px solid #E5E6EB;
|
|
58
|
+
color: #1D2129;
|
|
59
59
|
}
|
|
60
60
|
.sv-lite-sync-title {
|
|
61
61
|
display: inline-block;
|
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
.sv-lite-sync-btn {
|
|
67
67
|
padding: 3px 8px;
|
|
68
68
|
font-size: 11px;
|
|
69
|
-
background-color: #
|
|
69
|
+
background-color: #165DFF;
|
|
70
70
|
color: #ffffff;
|
|
71
71
|
border: none;
|
|
72
72
|
border-radius: 3px;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { HTMLInputAttributes } from 'svelte/elements';
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
/** Caller class merged with the built-in class list. */
|
|
6
|
+
class?: string;
|
|
7
|
+
name?: string;
|
|
8
|
+
label?: string;
|
|
9
|
+
length?: number;
|
|
10
|
+
value?: string;
|
|
11
|
+
disabled?: boolean;
|
|
12
|
+
required?: boolean;
|
|
13
|
+
autocomplete?: HTMLInputAttributes['autocomplete'];
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
let {
|
|
17
|
+
name = 'code',
|
|
18
|
+
label = 'Verification code',
|
|
19
|
+
length = 6,
|
|
20
|
+
value = '',
|
|
21
|
+
disabled = false,
|
|
22
|
+
required = true,
|
|
23
|
+
autocomplete = 'one-time-code',
|
|
24
|
+
class: className = '',
|
|
25
|
+
}: Props = $props();
|
|
26
|
+
</script>
|
|
27
|
+
|
|
28
|
+
<label class="lite-form-group lite-otp-input {className}">
|
|
29
|
+
<span>{label}</span>
|
|
30
|
+
<input
|
|
31
|
+
class="lite-input"
|
|
32
|
+
type="text"
|
|
33
|
+
{name}
|
|
34
|
+
{value}
|
|
35
|
+
{disabled}
|
|
36
|
+
{required}
|
|
37
|
+
{autocomplete}
|
|
38
|
+
inputmode="numeric"
|
|
39
|
+
pattern={`[0-9]{${length}}`}
|
|
40
|
+
maxlength={length}
|
|
41
|
+
placeholder={Array.from({ length }, () => '0').join('')}
|
|
42
|
+
aria-describedby={`${name}-hint`}
|
|
43
|
+
/>
|
|
44
|
+
<small id={`${name}-hint`}>{length}-digit code</small>
|
|
45
|
+
</label>
|
|
46
|
+
|
|
47
|
+
<style>
|
|
48
|
+
.lite-otp-input input { max-width: 14rem; font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 18px; letter-spacing: 0.35em; }
|
|
49
|
+
.lite-otp-input small { color: #86909C; font-size: 12px; }
|
|
50
|
+
</style>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { HTMLInputAttributes } from 'svelte/elements';
|
|
2
|
+
interface Props {
|
|
3
|
+
/** Caller class merged with the built-in class list. */
|
|
4
|
+
class?: string;
|
|
5
|
+
name?: string;
|
|
6
|
+
label?: string;
|
|
7
|
+
length?: number;
|
|
8
|
+
value?: string;
|
|
9
|
+
disabled?: boolean;
|
|
10
|
+
required?: boolean;
|
|
11
|
+
autocomplete?: HTMLInputAttributes['autocomplete'];
|
|
12
|
+
}
|
|
13
|
+
declare const LiteOtpInput: import("svelte").Component<Props, {}, "">;
|
|
14
|
+
type LiteOtpInput = ReturnType<typeof LiteOtpInput>;
|
|
15
|
+
export default LiteOtpInput;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
title: string;
|
|
6
|
+
description?: string;
|
|
7
|
+
eyebrow?: string;
|
|
8
|
+
actions?: Snippet;
|
|
9
|
+
children?: Snippet;
|
|
10
|
+
/** Caller class merged with the built-in class list. */
|
|
11
|
+
class?: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
let { title, description, eyebrow, actions, children, class: className = '' }: Props = $props();
|
|
15
|
+
</script>
|
|
16
|
+
|
|
17
|
+
<header class="lite-page-header lite-page-header-rich {className}">
|
|
18
|
+
<div>
|
|
19
|
+
{#if eyebrow}<p class="lite-page-header__eyebrow">{eyebrow}</p>{/if}
|
|
20
|
+
<h1 class="lite-page-title">{title}</h1>
|
|
21
|
+
{#if description}<p class="lite-page-header__description">{description}</p>{/if}
|
|
22
|
+
{@render children?.()}
|
|
23
|
+
</div>
|
|
24
|
+
{#if actions}<div class="lite-page-header__actions">{@render actions()}</div>{/if}
|
|
25
|
+
</header>
|
|
26
|
+
|
|
27
|
+
<style>
|
|
28
|
+
.lite-page-header-rich { display: flex; flex-wrap: wrap; align-items: flex-start; justify-content: space-between; }
|
|
29
|
+
.lite-page-header__eyebrow { margin: 0 0 4px; color: #86909C; font-size: 12px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.04em; }
|
|
30
|
+
.lite-page-header__description { margin: 6px 0 0; color: #4E5969; font-size: 13px; line-height: 1.6; }
|
|
31
|
+
.lite-page-header__actions { display: flex; flex-wrap: wrap; align-items: center; }
|
|
32
|
+
|
|
33
|
+
.lite-page-header__actions > * + * { margin-left: 8px; }
|
|
34
|
+
</style>
|