@brumaombra/ui-vintage 0.7.8 → 0.7.9
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 +308 -48
- package/module.mjs +1 -1
- package/package.json +2 -1
- package/src/components/background-grid/BackgroundGrid.vue +11 -2
- package/src/components/background-grid/index.ts +2 -2
- package/src/components/blog/AllPostsSection.vue +25 -9
- package/src/components/blog/BlogFAQSection.vue +8 -3
- package/src/components/blog/BlogHeaderSection.vue +14 -11
- package/src/components/blog/BlogInfoSection.vue +13 -11
- package/src/components/blog/BlogSectionTitle.vue +5 -5
- package/src/components/blog/CategoriesList.vue +11 -3
- package/src/components/blog/CategoriesSection.vue +11 -3
- package/src/components/blog/CategoryCard.vue +10 -8
- package/src/components/blog/HeaderCarousel.vue +24 -15
- package/src/components/blog/PostCard.vue +16 -11
- package/src/components/blog/PostsList.vue +12 -3
- package/src/components/blog/SocialShareSidebar.vue +11 -11
- package/src/components/blog/TableOfContents.vue +29 -13
- package/src/components/busy-indicator/BusyIndicator.vue +2 -2
- package/src/components/busy-indicator/busy-indicator-state.ts +11 -12
- package/src/components/busy-indicator/index.ts +3 -3
- package/src/components/card-grid/CardGrid.vue +25 -11
- package/src/components/chip/Chip.vue +15 -15
- package/src/components/chip/index.ts +2 -2
- package/src/components/confirm-dialog/ConfirmDialog.vue +9 -9
- package/src/components/confirm-dialog/confirm-dialog-state.ts +15 -14
- package/src/components/confirm-dialog/index.ts +3 -12
- package/src/components/content/BlogList.vue +11 -8
- package/src/components/content/BlogTable.vue +18 -14
- package/src/components/content/ProseHr.vue +10 -7
- package/src/components/content/Terminal.vue +70 -0
- package/src/components/content/index.ts +2 -1
- package/src/components/dashboard-shell/DashboardShell.vue +43 -64
- package/src/components/dashboard-shell/index.ts +2 -2
- package/src/components/data-list/DataList.vue +11 -13
- package/src/components/data-list/DataListItem.vue +9 -11
- package/src/components/data-list/DataListLabel.vue +9 -11
- package/src/components/data-list/DataListText.vue +9 -11
- package/src/components/data-list/DataListValue.vue +9 -11
- package/src/components/data-list/index.ts +5 -5
- package/src/components/empty-state-card/EmptyStateCard.vue +21 -11
- package/src/components/error-page/ErrorPage.vue +24 -27
- package/src/components/error-page/index.ts +2 -2
- package/src/components/info-card/InfoCard.vue +17 -11
- package/src/components/landing/index.ts +6 -6
- package/src/components/landing/landing-content/LandingContent.vue +5 -7
- package/src/components/landing/landing-content/index.ts +2 -2
- package/src/components/landing/landing-footer/LandingFooter.vue +26 -29
- package/src/components/landing/landing-footer/index.ts +3 -3
- package/src/components/landing/landing-navbar/LandingNavbar.vue +15 -17
- package/src/components/landing/landing-navbar/index.ts +2 -2
- package/src/components/landing/landing-shell/LandingShell.vue +10 -13
- package/src/components/landing/landing-shell/index.ts +2 -2
- package/src/components/language-flag/LanguageFlag.vue +6 -5
- package/src/components/language-flag/index.ts +1 -0
- package/src/components/language-selector/LanguageSelector.vue +20 -21
- package/src/components/load-more-button/LoadMoreButton.vue +18 -14
- package/src/components/loading-state-card/LoadingStateCard.vue +13 -9
- package/src/components/message-dialog/MessageDialog.vue +19 -19
- package/src/components/message-dialog/index.ts +3 -11
- package/src/components/message-dialog/message-dialog-state.ts +12 -11
- package/src/components/message-toast/MessageToast.vue +16 -16
- package/src/components/message-toast/index.ts +2 -9
- package/src/components/message-toast/message-toast-state.ts +9 -9
- package/src/components/page-header/PageHeader.vue +8 -5
- package/src/components/progress-component/ProgressComponent.vue +13 -10
- package/src/components/single-value-card/SingleValueCard.vue +22 -19
- package/src/components/slider-form-component/SliderFormComponent.vue +11 -20
- package/src/components/slider-form-component/index.ts +2 -2
- package/src/components/switch-form-component/SwitchFormComponent.vue +7 -9
- package/src/components/switch-form-component/index.ts +2 -2
- package/src/components/text-link/TextLink.vue +11 -7
- package/src/components/ui/accordion/Accordion.vue +10 -13
- package/src/components/ui/accordion/index.ts +1 -1
- package/src/components/ui/alert/Alert.vue +11 -10
- package/src/components/ui/alert/AlertDescription.vue +9 -8
- package/src/components/ui/alert/AlertTitle.vue +9 -8
- package/src/components/ui/alert/index.ts +10 -10
- package/src/components/ui/alert-dialog/AlertDialog.vue +13 -9
- package/src/components/ui/alert-dialog/AlertDialogAction.vue +14 -12
- package/src/components/ui/alert-dialog/AlertDialogCancel.vue +14 -16
- package/src/components/ui/alert-dialog/AlertDialogContent.vue +24 -27
- package/src/components/ui/alert-dialog/AlertDialogDescription.vue +13 -13
- package/src/components/ui/alert-dialog/AlertDialogFooter.vue +9 -12
- package/src/components/ui/alert-dialog/AlertDialogHeader.vue +9 -8
- package/src/components/ui/alert-dialog/AlertDialogTitle.vue +13 -11
- package/src/components/ui/alert-dialog/AlertDialogTrigger.vue +8 -7
- package/src/components/ui/alert-dialog/index.ts +9 -9
- package/src/components/ui/badge/Badge.vue +11 -12
- package/src/components/ui/badge/index.ts +1 -1
- package/src/components/ui/breadcrumb/Breadcrumb.vue +9 -12
- package/src/components/ui/breadcrumb/BreadcrumbEllipsis.vue +15 -19
- package/src/components/ui/breadcrumb/BreadcrumbItem.vue +10 -12
- package/src/components/ui/breadcrumb/BreadcrumbLink.vue +13 -17
- package/src/components/ui/breadcrumb/BreadcrumbList.vue +10 -12
- package/src/components/ui/breadcrumb/BreadcrumbPage.vue +10 -15
- package/src/components/ui/breadcrumb/BreadcrumbSeparator.vue +14 -18
- package/src/components/ui/breadcrumb/index.ts +7 -7
- package/src/components/ui/busy/Busy.vue +36 -29
- package/src/components/ui/busy/index.ts +1 -1
- package/src/components/ui/button/Button.vue +18 -19
- package/src/components/ui/button/index.ts +54 -35
- package/src/components/ui/calendar/Calendar.vue +167 -121
- package/src/components/ui/calendar/CalendarCell.vue +18 -17
- package/src/components/ui/calendar/CalendarCellTrigger.vue +31 -33
- package/src/components/ui/calendar/CalendarGrid.vue +14 -17
- package/src/components/ui/calendar/CalendarGridBody.vue +9 -11
- package/src/components/ui/calendar/CalendarGridHead.vue +10 -12
- package/src/components/ui/calendar/CalendarGridRow.vue +14 -16
- package/src/components/ui/calendar/CalendarHeadCell.vue +18 -17
- package/src/components/ui/calendar/CalendarHeader.vue +18 -17
- package/src/components/ui/calendar/CalendarHeading.vue +18 -22
- package/src/components/ui/calendar/CalendarNextButton.vue +29 -26
- package/src/components/ui/calendar/CalendarPrevButton.vue +29 -26
- package/src/components/ui/calendar/index.ts +17 -13
- package/src/components/ui/card/Card.vue +21 -13
- package/src/components/ui/card/CardAction.vue +12 -7
- package/src/components/ui/card/CardContent.vue +8 -7
- package/src/components/ui/card/CardDescription.vue +16 -7
- package/src/components/ui/card/CardFooter.vue +8 -7
- package/src/components/ui/card/CardHeader.vue +12 -7
- package/src/components/ui/card/CardText.vue +12 -7
- package/src/components/ui/card/CardTitle.vue +9 -7
- package/src/components/ui/card/index.ts +8 -8
- package/src/components/ui/command/Command.vue +71 -61
- package/src/components/ui/command/CommandDialog.vue +33 -23
- package/src/components/ui/command/CommandEmpty.vue +19 -20
- package/src/components/ui/command/CommandGroup.vue +32 -35
- package/src/components/ui/command/CommandInput.vue +25 -21
- package/src/components/ui/command/CommandItem.vue +62 -59
- package/src/components/ui/command/CommandList.vue +21 -18
- package/src/components/ui/command/CommandSeparator.vue +13 -11
- package/src/components/ui/command/CommandShortcut.vue +13 -8
- package/src/components/ui/command/index.ts +24 -20
- package/src/components/ui/date-picker/DatePicker.vue +46 -37
- package/src/components/ui/date-picker/index.ts +2 -2
- package/src/components/ui/date-time-picker/DateTimePicker.vue +99 -95
- package/src/components/ui/date-time-picker/index.ts +2 -2
- package/src/components/ui/dialog/Dialog.vue +12 -9
- package/src/components/ui/dialog/DialogClose.vue +8 -10
- package/src/components/ui/dialog/DialogContent.vue +36 -42
- package/src/components/ui/dialog/DialogDescription.vue +16 -11
- package/src/components/ui/dialog/DialogFooter.vue +13 -12
- package/src/components/ui/dialog/DialogHeader.vue +9 -8
- package/src/components/ui/dialog/DialogOverlay.vue +16 -11
- package/src/components/ui/dialog/DialogScrollContent.vue +47 -45
- package/src/components/ui/dialog/DialogTitle.vue +13 -12
- package/src/components/ui/dialog/DialogTrigger.vue +8 -7
- package/src/components/ui/dialog/index.ts +10 -10
- package/src/components/ui/field/Field.vue +12 -14
- package/src/components/ui/field/FieldContent.vue +13 -11
- package/src/components/ui/field/FieldDescription.vue +15 -13
- package/src/components/ui/field/FieldError.vue +43 -40
- package/src/components/ui/field/FieldGroup.vue +13 -11
- package/src/components/ui/field/FieldLabel.vue +16 -14
- package/src/components/ui/field/FieldLegend.vue +16 -14
- package/src/components/ui/field/FieldSeparator.vue +17 -15
- package/src/components/ui/field/FieldSet.vue +14 -12
- package/src/components/ui/field/FieldTitle.vue +13 -11
- package/src/components/ui/field/index.ts +36 -36
- package/src/components/ui/input/Input.vue +23 -20
- package/src/components/ui/input/index.ts +1 -1
- package/src/components/ui/label/Label.vue +16 -15
- package/src/components/ui/label/index.ts +1 -1
- package/src/components/ui/native-select/NativeSelect.vue +31 -41
- package/src/components/ui/native-select/NativeSelectOptGroup.vue +8 -7
- package/src/components/ui/native-select/NativeSelectOption.vue +8 -7
- package/src/components/ui/native-select/index.ts +3 -3
- package/src/components/ui/popover/Popover.vue +12 -9
- package/src/components/ui/popover/PopoverAnchor.vue +8 -7
- package/src/components/ui/popover/PopoverContent.vue +27 -31
- package/src/components/ui/popover/PopoverTrigger.vue +8 -7
- package/src/components/ui/popover/index.ts +4 -4
- package/src/components/ui/progress/Progress.vue +18 -32
- package/src/components/ui/progress/index.ts +1 -1
- package/src/components/ui/scroll-area/ScrollArea.vue +23 -26
- package/src/components/ui/scroll-area/ScrollBar.vue +22 -26
- package/src/components/ui/scroll-area/index.ts +2 -2
- package/src/components/ui/select/Select.vue +12 -9
- package/src/components/ui/select/SelectContent.vue +39 -40
- package/src/components/ui/select/SelectGroup.vue +8 -7
- package/src/components/ui/select/SelectItem.vue +36 -41
- package/src/components/ui/select/SelectItemContent.vue +22 -15
- package/src/components/ui/select/SelectItemText.vue +8 -7
- package/src/components/ui/select/SelectLabel.vue +10 -9
- package/src/components/ui/select/SelectScrollDownButton.vue +21 -17
- package/src/components/ui/select/SelectScrollUpButton.vue +21 -17
- package/src/components/ui/select/SelectSeparator.vue +11 -9
- package/src/components/ui/select/SelectTrigger.vue +27 -25
- package/src/components/ui/select/SelectValue.vue +8 -7
- package/src/components/ui/select/SelectValueContent.vue +30 -18
- package/src/components/ui/select/index.ts +13 -13
- package/src/components/ui/separator/Separator.vue +17 -18
- package/src/components/ui/separator/index.ts +1 -1
- package/src/components/ui/sheet/Sheet.vue +12 -9
- package/src/components/ui/sheet/SheetClose.vue +8 -7
- package/src/components/ui/sheet/SheetContent.vue +36 -37
- package/src/components/ui/sheet/SheetDescription.vue +12 -11
- package/src/components/ui/sheet/SheetFooter.vue +8 -7
- package/src/components/ui/sheet/SheetHeader.vue +8 -7
- package/src/components/ui/sheet/SheetOverlay.vue +16 -11
- package/src/components/ui/sheet/SheetTitle.vue +12 -11
- package/src/components/ui/sheet/SheetTrigger.vue +8 -7
- package/src/components/ui/sheet/index.ts +8 -8
- package/src/components/ui/sidebar/Sidebar.vue +68 -61
- package/src/components/ui/sidebar/SidebarContent.vue +13 -8
- package/src/components/ui/sidebar/SidebarFooter.vue +13 -8
- package/src/components/ui/sidebar/SidebarGroup.vue +13 -8
- package/src/components/ui/sidebar/SidebarGroupAction.vue +16 -16
- package/src/components/ui/sidebar/SidebarGroupContent.vue +9 -8
- package/src/components/ui/sidebar/SidebarGroupLabel.vue +15 -14
- package/src/components/ui/sidebar/SidebarHeader.vue +13 -8
- package/src/components/ui/sidebar/SidebarInput.vue +14 -12
- package/src/components/ui/sidebar/SidebarInset.vue +14 -12
- package/src/components/ui/sidebar/SidebarMenu.vue +9 -8
- package/src/components/ui/sidebar/SidebarMenuAction.vue +25 -23
- package/src/components/ui/sidebar/SidebarMenuBadge.vue +19 -17
- package/src/components/ui/sidebar/SidebarMenuButton.vue +33 -32
- package/src/components/ui/sidebar/SidebarMenuButtonChild.vue +19 -18
- package/src/components/ui/sidebar/SidebarMenuItem.vue +9 -8
- package/src/components/ui/sidebar/SidebarMenuSkeleton.vue +17 -12
- package/src/components/ui/sidebar/SidebarMenuSub.vue +14 -12
- package/src/components/ui/sidebar/SidebarMenuSubButton.vue +24 -21
- package/src/components/ui/sidebar/SidebarMenuSubItem.vue +9 -8
- package/src/components/ui/sidebar/SidebarProvider.vue +63 -53
- package/src/components/ui/sidebar/SidebarRail.vue +20 -18
- package/src/components/ui/sidebar/SidebarSeparator.vue +10 -9
- package/src/components/ui/sidebar/SidebarTrigger.vue +15 -14
- package/src/components/ui/sidebar/index.ts +62 -58
- package/src/components/ui/sidebar/utils.ts +16 -16
- package/src/components/ui/skeleton/Skeleton.vue +12 -9
- package/src/components/ui/skeleton/index.ts +1 -1
- package/src/components/ui/slider/Slider.vue +24 -19
- package/src/components/ui/slider/index.ts +1 -1
- package/src/components/ui/switch/Switch.vue +26 -23
- package/src/components/ui/switch/index.ts +1 -1
- package/src/components/ui/table/Table.vue +11 -10
- package/src/components/ui/table/TableBody.vue +9 -11
- package/src/components/ui/table/TableCaption.vue +9 -11
- package/src/components/ui/table/TableCell.vue +13 -16
- package/src/components/ui/table/TableEmpty.vue +22 -25
- package/src/components/ui/table/TableFooter.vue +13 -11
- package/src/components/ui/table/TableHead.vue +13 -11
- package/src/components/ui/table/TableHeader.vue +9 -11
- package/src/components/ui/table/TableRow.vue +13 -11
- package/src/components/ui/table/index.ts +9 -9
- package/src/components/ui/tabs/Tabs.vue +18 -18
- package/src/components/ui/tabs/TabsContent.vue +14 -15
- package/src/components/ui/tabs/TabsList.vue +18 -18
- package/src/components/ui/tabs/TabsTrigger.vue +19 -20
- package/src/components/ui/tabs/index.ts +4 -4
- package/src/components/ui/textarea/Textarea.vue +23 -20
- package/src/components/ui/textarea/index.ts +1 -1
- package/src/components/ui/time-picker/TimePicker.vue +33 -38
- package/src/components/ui/time-picker/index.ts +2 -2
- package/src/components/ui/tooltip/Tooltip.vue +12 -9
- package/src/components/ui/tooltip/TooltipContent.vue +28 -20
- package/src/components/ui/tooltip/TooltipProvider.vue +9 -8
- package/src/components/ui/tooltip/TooltipTrigger.vue +8 -7
- package/src/components/ui/tooltip/index.ts +4 -4
- package/src/i18n/de.json +5 -0
- package/src/i18n/en.json +5 -0
- package/src/i18n/es.json +5 -0
- package/src/i18n/fr.json +5 -0
- package/src/i18n/it.json +5 -0
- package/src/i18n/ja.json +5 -0
- package/src/i18n/pt.json +5 -0
- package/src/i18n/ru.json +5 -0
- package/src/i18n/zh.json +5 -0
- package/src/lib/common-types.ts +2 -0
- package/src/lib/i18n.ts +0 -5
- package/src/runtime/{ui-vintage-i18n-plugin.js → ui-vintage-i18n-plugin.ts} +30 -8
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { h, markRaw, reactive, render } from
|
|
2
|
-
import type { ButtonVariants } from
|
|
1
|
+
import { h, markRaw, reactive, render } from 'vue';
|
|
2
|
+
import type { ButtonVariants } from '../ui/button';
|
|
3
|
+
import type { HugeiconsIconDefinition } from '../../lib/common-types';
|
|
3
4
|
|
|
4
|
-
export type DialogButtonVariant = NonNullable<ButtonVariants[
|
|
5
|
-
export type
|
|
5
|
+
export type DialogButtonVariant = NonNullable<ButtonVariants['variant']>;
|
|
6
|
+
export type { HugeiconsIconDefinition };
|
|
6
7
|
|
|
7
8
|
export interface ShowConfirmDialogOptions {
|
|
8
9
|
title?: string;
|
|
@@ -20,7 +21,7 @@ export interface ShowConfirmDialogOptions {
|
|
|
20
21
|
|
|
21
22
|
interface ConfirmDialogRequest {
|
|
22
23
|
id: number;
|
|
23
|
-
options: Required<Omit<ShowConfirmDialogOptions,
|
|
24
|
+
options: Required<Omit<ShowConfirmDialogOptions, 'icon' | 'confirmButtonIcon' | 'cancelButtonIcon' | 'onConfirm' | 'onCancel'>> & {
|
|
24
25
|
icon: HugeiconsIconDefinition | null;
|
|
25
26
|
confirmButtonIcon: HugeiconsIconDefinition | null;
|
|
26
27
|
cancelButtonIcon: HugeiconsIconDefinition | null;
|
|
@@ -42,7 +43,7 @@ const DIALOG_CLOSE_DURATION_MS = 300;
|
|
|
42
43
|
let closeTimer: ReturnType<typeof setTimeout> | null = null;
|
|
43
44
|
let confirmDialogMountPromise: Promise<void> | null = null;
|
|
44
45
|
|
|
45
|
-
const CONFIRM_DIALOG_ROOT_ID =
|
|
46
|
+
const CONFIRM_DIALOG_ROOT_ID = 'ui-vintage-confirm-dialog-root';
|
|
46
47
|
|
|
47
48
|
// Shared confirm dialog state
|
|
48
49
|
export const confirmDialogState: ConfirmDialogState = reactive({
|
|
@@ -57,7 +58,7 @@ const markIcon = (icon: HugeiconsIconDefinition | null | undefined) => icon ? ma
|
|
|
57
58
|
// Mount the dialog once on demand
|
|
58
59
|
const ensureConfirmDialogMounted = () => {
|
|
59
60
|
// Skip mounting during SSR
|
|
60
|
-
if (typeof document ===
|
|
61
|
+
if (typeof document === 'undefined') {
|
|
61
62
|
return Promise.resolve();
|
|
62
63
|
}
|
|
63
64
|
|
|
@@ -75,7 +76,7 @@ const ensureConfirmDialogMounted = () => {
|
|
|
75
76
|
// Start the lazy mount
|
|
76
77
|
confirmDialogMountPromise = (async () => {
|
|
77
78
|
// Load the component only when needed
|
|
78
|
-
const { default: ConfirmDialog } = await import(
|
|
79
|
+
const { default: ConfirmDialog } = await import('./ConfirmDialog.vue');
|
|
79
80
|
|
|
80
81
|
// Guard against a concurrent mount
|
|
81
82
|
if (document.getElementById(CONFIRM_DIALOG_ROOT_ID)) {
|
|
@@ -83,7 +84,7 @@ const ensureConfirmDialogMounted = () => {
|
|
|
83
84
|
}
|
|
84
85
|
|
|
85
86
|
// Create the host element and render the component
|
|
86
|
-
const container = document.createElement(
|
|
87
|
+
const container = document.createElement('div');
|
|
87
88
|
container.id = CONFIRM_DIALOG_ROOT_ID;
|
|
88
89
|
document.body.appendChild(container);
|
|
89
90
|
render(h(ConfirmDialog), container);
|
|
@@ -182,12 +183,12 @@ export const showConfirmDialog = (options: ShowConfirmDialogOptions) => {
|
|
|
182
183
|
enqueueConfirmDialog({
|
|
183
184
|
id: nextConfirmDialogId += 1,
|
|
184
185
|
options: {
|
|
185
|
-
title: options.title ??
|
|
186
|
+
title: options.title ?? 'Confirm',
|
|
186
187
|
message: options.message,
|
|
187
|
-
confirmText: options.confirmText ??
|
|
188
|
-
cancelText: options.cancelText ??
|
|
189
|
-
confirmButtonType: options.confirmButtonType ??
|
|
190
|
-
cancelButtonType: options.cancelButtonType ??
|
|
188
|
+
confirmText: options.confirmText ?? 'Confirm',
|
|
189
|
+
cancelText: options.cancelText ?? 'Cancel',
|
|
190
|
+
confirmButtonType: options.confirmButtonType ?? 'primary',
|
|
191
|
+
cancelButtonType: options.cancelButtonType ?? 'secondary',
|
|
191
192
|
icon: markIcon(options.icon),
|
|
192
193
|
confirmButtonIcon: markIcon(options.confirmButtonIcon),
|
|
193
194
|
cancelButtonIcon: markIcon(options.cancelButtonIcon),
|
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
export { default as ConfirmDialog } from
|
|
2
|
-
export {
|
|
3
|
-
|
|
4
|
-
closeConfirmDialog,
|
|
5
|
-
confirmActiveDialog,
|
|
6
|
-
confirmDialogState,
|
|
7
|
-
showConfirmDialog
|
|
8
|
-
} from "./confirm-dialog-state";
|
|
9
|
-
export type {
|
|
10
|
-
DialogButtonVariant,
|
|
11
|
-
ShowConfirmDialogOptions
|
|
12
|
-
} from "./confirm-dialog-state";
|
|
1
|
+
export { default as ConfirmDialog } from './ConfirmDialog.vue';
|
|
2
|
+
export { cancelActiveConfirmDialog, closeConfirmDialog, confirmActiveDialog, confirmDialogState, showConfirmDialog } from './confirm-dialog-state';
|
|
3
|
+
export type { DialogButtonVariant, ShowConfirmDialogOptions } from './confirm-dialog-state';
|
|
@@ -1,22 +1,25 @@
|
|
|
1
|
-
<script setup>
|
|
1
|
+
<script setup lang="ts">
|
|
2
2
|
import { Cancel01Icon, CheckmarkCircle02Icon, CircleSmallIcon } from '@hugeicons/core-free-icons';
|
|
3
3
|
import { HugeiconsIcon } from '@hugeicons/vue';
|
|
4
4
|
import { Card, CardContent } from '../ui/card';
|
|
5
5
|
|
|
6
6
|
// Props
|
|
7
|
-
const props = defineProps
|
|
8
|
-
items
|
|
9
|
-
variant
|
|
7
|
+
const props = withDefaults(defineProps<{
|
|
8
|
+
items?: string[];
|
|
9
|
+
variant?: 'circle' | 'checkmark' | 'numbered' | 'cross';
|
|
10
|
+
}>(), {
|
|
11
|
+
items: () => [],
|
|
12
|
+
variant: 'checkmark'
|
|
10
13
|
});
|
|
11
14
|
|
|
12
15
|
// Icon container classes
|
|
13
16
|
const getIconContainerClasses = () => {
|
|
14
|
-
return 'flex items-center justify-center w-8 h-8 bg-
|
|
17
|
+
return 'flex items-center justify-center w-8 h-8 bg-(--bg-card-light) dark:bg-(--bg-card-dark) border border-(--border-light) dark:border-(--border-dark) rounded mr-4 shrink-0';
|
|
15
18
|
};
|
|
16
19
|
|
|
17
20
|
// Icon color classes
|
|
18
21
|
const getIconClasses = () => {
|
|
19
|
-
return 'text-
|
|
22
|
+
return 'text-(--text-secondary-light) dark:text-(--text-secondary-dark) text-xs';
|
|
20
23
|
};
|
|
21
24
|
</script>
|
|
22
25
|
|
|
@@ -24,7 +27,7 @@ const getIconClasses = () => {
|
|
|
24
27
|
<div class="not-prose my-6 sm:my-12">
|
|
25
28
|
<Card>
|
|
26
29
|
<CardContent class="gap-0">
|
|
27
|
-
<ul class="text-xs md:text-sm
|
|
30
|
+
<ul class="text-xs md:text-sm p-0! space-y-6!">
|
|
28
31
|
<li v-for="(item, index) in props.items" :key="index" class="flex items-center">
|
|
29
32
|
<!-- Circle -->
|
|
30
33
|
<div v-if="props.variant === 'circle'" :class="getIconContainerClasses()">
|
|
@@ -48,7 +51,7 @@ const getIconClasses = () => {
|
|
|
48
51
|
|
|
49
52
|
<!-- Content -->
|
|
50
53
|
<div class="flex-1">
|
|
51
|
-
<div class="text-
|
|
54
|
+
<div class="text-(--text-primary-light) dark:text-(--text-primary-dark) leading-relaxed">
|
|
52
55
|
{{ item }}
|
|
53
56
|
</div>
|
|
54
57
|
</div>
|
|
@@ -1,26 +1,30 @@
|
|
|
1
|
-
<script setup>
|
|
1
|
+
<script setup lang="ts">
|
|
2
2
|
import { Card, CardContent } from '../ui/card';
|
|
3
3
|
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '../ui/table';
|
|
4
4
|
|
|
5
5
|
// Props
|
|
6
|
-
const props = defineProps
|
|
7
|
-
headers
|
|
8
|
-
rows
|
|
9
|
-
highlightCol
|
|
6
|
+
const props = withDefaults(defineProps<{
|
|
7
|
+
headers?: string[];
|
|
8
|
+
rows?: string[][];
|
|
9
|
+
highlightCol?: number;
|
|
10
|
+
}>(), {
|
|
11
|
+
headers: () => [],
|
|
12
|
+
rows: () => [],
|
|
13
|
+
highlightCol: -1
|
|
10
14
|
});
|
|
11
15
|
|
|
12
16
|
// Header cell classes
|
|
13
|
-
const getHeaderClasses = colIndex => {
|
|
14
|
-
const baseClasses = 'text-left font-semibold text-
|
|
15
|
-
const highlightClass = props.highlightCol === colIndex ? 'bg-
|
|
17
|
+
const getHeaderClasses = (colIndex: number) => {
|
|
18
|
+
const baseClasses = 'text-left font-semibold text-(--text-primary-light) dark:text-(--text-primary-dark)';
|
|
19
|
+
const highlightClass = props.highlightCol === colIndex ? 'bg-(--bg-selected-light) dark:bg-(--bg-selected-dark)' : '';
|
|
16
20
|
return [baseClasses, highlightClass];
|
|
17
21
|
};
|
|
18
22
|
|
|
19
23
|
// Body cell classes
|
|
20
|
-
const getCellClasses = colIndex => {
|
|
21
|
-
const baseClasses = 'align-top text-
|
|
22
|
-
const firstColClass = colIndex === 0 ? 'font-semibold text-
|
|
23
|
-
const highlightClass = props.highlightCol === colIndex ? 'bg-
|
|
24
|
+
const getCellClasses = (colIndex: number) => {
|
|
25
|
+
const baseClasses = 'align-top text-(--text-primary-light) dark:text-(--text-primary-dark) leading-relaxed whitespace-normal';
|
|
26
|
+
const firstColClass = colIndex === 0 ? 'font-semibold text-(--text-secondary-light) dark:text-(--text-secondary-dark)' : '';
|
|
27
|
+
const highlightClass = props.highlightCol === colIndex ? 'bg-(--bg-selected-light) dark:bg-(--bg-selected-dark)' : '';
|
|
24
28
|
return [baseClasses, firstColClass, highlightClass];
|
|
25
29
|
};
|
|
26
30
|
</script>
|
|
@@ -33,7 +37,7 @@ const getCellClasses = colIndex => {
|
|
|
33
37
|
<Table class="w-full text-sm text-left">
|
|
34
38
|
<!-- Table header -->
|
|
35
39
|
<TableHeader>
|
|
36
|
-
<TableRow class="bg-transparent text-sm text-
|
|
40
|
+
<TableRow class="bg-transparent text-sm text-(--text-secondary-light) dark:text-(--text-secondary-dark) hover:bg-transparent">
|
|
37
41
|
<TableHead v-for="(header, colIndex) in props.headers" :key="colIndex" :class="getHeaderClasses(colIndex)">
|
|
38
42
|
{{ header }}
|
|
39
43
|
</TableHead>
|
|
@@ -42,7 +46,7 @@ const getCellClasses = colIndex => {
|
|
|
42
46
|
|
|
43
47
|
<!-- Table body -->
|
|
44
48
|
<TableBody>
|
|
45
|
-
<TableRow v-for="(row, rowIndex) in props.rows" :key="rowIndex" class="text-
|
|
49
|
+
<TableRow v-for="(row, rowIndex) in props.rows" :key="rowIndex" class="text-(--text-secondary-light) dark:text-(--text-secondary-dark) hover:bg-transparent">
|
|
46
50
|
<TableCell v-for="(cell, colIndex) in row" :key="colIndex" :class="getCellClasses(colIndex)">
|
|
47
51
|
{{ cell }}
|
|
48
52
|
</TableCell>
|
|
@@ -1,10 +1,13 @@
|
|
|
1
|
-
<script setup>
|
|
1
|
+
<script setup lang="ts">
|
|
2
2
|
import { ChartLineData02Icon } from '@hugeicons/core-free-icons';
|
|
3
3
|
import { HugeiconsIcon } from '@hugeicons/vue';
|
|
4
|
+
import type { HugeiconsIconDefinition } from '../../lib/common-types';
|
|
4
5
|
|
|
5
6
|
// Props
|
|
6
|
-
const props = defineProps
|
|
7
|
-
icon
|
|
7
|
+
const props = withDefaults(defineProps<{
|
|
8
|
+
icon?: HugeiconsIconDefinition;
|
|
9
|
+
}>(), {
|
|
10
|
+
icon: () => ChartLineData02Icon
|
|
8
11
|
});
|
|
9
12
|
</script>
|
|
10
13
|
|
|
@@ -12,15 +15,15 @@ const props = defineProps({
|
|
|
12
15
|
<div aria-hidden="true" class="not-prose my-6 sm:my-12">
|
|
13
16
|
<div class="flex items-center gap-3 sm:gap-4">
|
|
14
17
|
<!-- Left line -->
|
|
15
|
-
<div class="h-px flex-1 bg-
|
|
18
|
+
<div class="h-px flex-1 bg-linear-to-r from-transparent via-(--border-light) to-(--border-light) dark:via-(--border-dark) dark:to-(--border-dark)" />
|
|
16
19
|
|
|
17
20
|
<!-- Icon in the middle -->
|
|
18
|
-
<div class="flex h-9 w-9 items-center justify-center rounded bg-
|
|
19
|
-
<HugeiconsIcon :icon="props.icon" class="size-4 text-
|
|
21
|
+
<div class="flex h-9 w-9 items-center justify-center rounded bg-(--bg-card-light) dark:bg-(--bg-card-dark) border border-(--border-light) dark:border-(--border-dark)">
|
|
22
|
+
<HugeiconsIcon :icon="props.icon" class="size-4 text-(--text-secondary-light) dark:text-(--text-secondary-dark)" />
|
|
20
23
|
</div>
|
|
21
24
|
|
|
22
25
|
<!-- Right line -->
|
|
23
|
-
<div class="h-px flex-1 bg-
|
|
26
|
+
<div class="h-px flex-1 bg-linear-to-l from-transparent via-(--border-light) to-(--border-light) dark:via-(--border-dark) dark:to-(--border-dark)" />
|
|
24
27
|
</div>
|
|
25
28
|
</div>
|
|
26
29
|
</template>
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { CheckmarkCircle02Icon, Copy01Icon, TerminalIcon } from '@hugeicons/core-free-icons';
|
|
3
|
+
import { HugeiconsIcon } from '@hugeicons/vue';
|
|
4
|
+
import { computed, ref } from 'vue';
|
|
5
|
+
import { useI18n } from 'vue-i18n';
|
|
6
|
+
import { Button } from '../ui/button';
|
|
7
|
+
import { Card } from '../ui/card';
|
|
8
|
+
|
|
9
|
+
// Props
|
|
10
|
+
const props = withDefaults(defineProps<{
|
|
11
|
+
commands?: string[];
|
|
12
|
+
title?: string;
|
|
13
|
+
prompt?: string;
|
|
14
|
+
copyable?: boolean;
|
|
15
|
+
}>(), {
|
|
16
|
+
commands: () => [],
|
|
17
|
+
title: '',
|
|
18
|
+
prompt: '$',
|
|
19
|
+
copyable: true
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
const { t } = useI18n();
|
|
23
|
+
const copied = ref(false);
|
|
24
|
+
const commandText = computed(() => props.commands.join('\n'));
|
|
25
|
+
const resolvedTitle = computed(() => props.title || t('uiVintage.terminal.title'));
|
|
26
|
+
|
|
27
|
+
// Copy all command lines to the clipboard
|
|
28
|
+
const copyCommands = async () => {
|
|
29
|
+
// Check if copy is enabled
|
|
30
|
+
if (!props.copyable || !commandText.value || !navigator.clipboard) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Copy the command text to the clipboard
|
|
35
|
+
await navigator.clipboard.writeText(commandText.value);
|
|
36
|
+
copied.value = true;
|
|
37
|
+
window.setTimeout(() => {
|
|
38
|
+
copied.value = false;
|
|
39
|
+
}, 1800);
|
|
40
|
+
};
|
|
41
|
+
</script>
|
|
42
|
+
|
|
43
|
+
<template>
|
|
44
|
+
<div class="not-prose my-6 sm:my-12">
|
|
45
|
+
<Card class="gap-0! sm:gap-0! overflow-hidden p-0! text-(--text-primary-light) dark:text-(--text-primary-dark)">
|
|
46
|
+
<!-- Terminal header -->
|
|
47
|
+
<div class="flex items-center justify-between gap-3 border-b border-(--border-light) bg-(--bg-card-light) px-3 py-2 sm:px-4 dark:border-(--border-dark) dark:bg-(--bg-card-dark)">
|
|
48
|
+
<div class="flex min-w-0 items-center gap-2">
|
|
49
|
+
<HugeiconsIcon :icon="TerminalIcon" class="size-4 shrink-0 text-(--text-secondary-light) dark:text-(--text-secondary-dark)" />
|
|
50
|
+
<span class="truncate text-xs font-semibold text-(--text-secondary-light) dark:text-(--text-secondary-dark)">{{ resolvedTitle }}</span>
|
|
51
|
+
</div>
|
|
52
|
+
|
|
53
|
+
<!-- Copy command button -->
|
|
54
|
+
<Button v-if="props.copyable"
|
|
55
|
+
variant="ghost"
|
|
56
|
+
size="icon"
|
|
57
|
+
class="size-7 text-(--text-secondary-light) hover:bg-(--bg-selected-light) hover:text-(--text-primary-light) dark:text-(--text-secondary-dark) dark:hover:bg-(--bg-selected-dark) dark:hover:text-(--text-primary-dark)"
|
|
58
|
+
:aria-label="t('uiVintage.terminal.copy')"
|
|
59
|
+
:title="t('uiVintage.terminal.copy')"
|
|
60
|
+
:disabled="!commandText"
|
|
61
|
+
@click="copyCommands">
|
|
62
|
+
<HugeiconsIcon :icon="copied ? CheckmarkCircle02Icon : Copy01Icon" class="size-4" />
|
|
63
|
+
</Button>
|
|
64
|
+
</div>
|
|
65
|
+
|
|
66
|
+
<!-- Terminal commands -->
|
|
67
|
+
<pre class="overflow-x-auto bg-(--bg-surface-light) px-4 py-3 text-xs leading-6 dark:bg-(--bg-surface-dark) sm:px-5 sm:py-4 sm:text-sm"><code><span v-for="(command, index) in props.commands" :key="`${command}-${index}`" class="flex min-w-max"><span class="mr-3 select-none text-(--text-secondary-light) dark:text-(--text-secondary-dark)" aria-hidden="true">{{ props.prompt }}</span><span>{{ command }}</span></span></code></pre>
|
|
68
|
+
</Card>
|
|
69
|
+
</div>
|
|
70
|
+
</template>
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export { default as BlogList } from './BlogList.vue';
|
|
2
2
|
export { default as BlogTable } from './BlogTable.vue';
|
|
3
|
-
export { default as ProseHr } from './ProseHr.vue';
|
|
3
|
+
export { default as ProseHr } from './ProseHr.vue';
|
|
4
|
+
export { default as Terminal } from './Terminal.vue';
|
|
@@ -1,91 +1,70 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
-
import { NuxtImg } from
|
|
3
|
-
import type { Component, HTMLAttributes } from
|
|
4
|
-
import { HugeiconsIcon } from
|
|
5
|
-
import BackgroundGrid from
|
|
6
|
-
import { ThemeSelector } from
|
|
7
|
-
import { Separator } from
|
|
8
|
-
import {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
SidebarGroupLabel,
|
|
15
|
-
SidebarHeader,
|
|
16
|
-
SidebarInset,
|
|
17
|
-
SidebarMenu,
|
|
18
|
-
SidebarMenuButton,
|
|
19
|
-
SidebarMenuItem,
|
|
20
|
-
SidebarProvider,
|
|
21
|
-
SidebarTrigger
|
|
22
|
-
} from "../ui/sidebar";
|
|
23
|
-
import { cn } from "../../lib/utils";
|
|
24
|
-
|
|
25
|
-
type HugeiconsIconDefinition = readonly (readonly [string, { readonly [key: string]: string | number }])[];
|
|
26
|
-
|
|
27
|
-
interface DashboardSidebarItem {
|
|
28
|
-
id: string;
|
|
29
|
-
label: string;
|
|
30
|
-
description?: string;
|
|
31
|
-
icon?: HugeiconsIconDefinition | null;
|
|
32
|
-
href?: string;
|
|
33
|
-
to?: unknown;
|
|
34
|
-
active?: boolean;
|
|
35
|
-
newTab?: boolean;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
interface DashboardSidebarSection {
|
|
39
|
-
id: string;
|
|
40
|
-
label?: string;
|
|
41
|
-
items: DashboardSidebarItem[];
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
interface DashboardShellProps {
|
|
2
|
+
import { NuxtImg } from '#components';
|
|
3
|
+
import type { Component, HTMLAttributes } from 'vue';
|
|
4
|
+
import { HugeiconsIcon } from '@hugeicons/vue';
|
|
5
|
+
import BackgroundGrid from '../background-grid/BackgroundGrid.vue';
|
|
6
|
+
import { ThemeSelector } from '../theme-selector';
|
|
7
|
+
import { Separator } from '../ui/separator';
|
|
8
|
+
import { Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInset, SidebarMenu, SidebarMenuButton, SidebarMenuItem, SidebarProvider, SidebarTrigger } from '../ui/sidebar';
|
|
9
|
+
import { cn } from '../../lib/utils';
|
|
10
|
+
import type { HugeiconsIconDefinition } from '../../lib/common-types';
|
|
11
|
+
|
|
12
|
+
// Props
|
|
13
|
+
const props = withDefaults(defineProps<{
|
|
45
14
|
appName?: string;
|
|
46
15
|
appLogo?: string;
|
|
47
16
|
appLinkTo?: string;
|
|
48
17
|
title?: string;
|
|
49
18
|
description?: string;
|
|
50
|
-
collapsible?:
|
|
19
|
+
collapsible?: 'offcanvas' | 'icon' | 'none';
|
|
51
20
|
compact?: boolean;
|
|
52
|
-
sidebarSections?:
|
|
21
|
+
sidebarSections?: Array<{
|
|
22
|
+
id: string;
|
|
23
|
+
label?: string;
|
|
24
|
+
items: Array<{
|
|
25
|
+
id: string;
|
|
26
|
+
label: string;
|
|
27
|
+
description?: string;
|
|
28
|
+
icon?: HugeiconsIconDefinition | null;
|
|
29
|
+
href?: string;
|
|
30
|
+
to?: unknown;
|
|
31
|
+
active?: boolean;
|
|
32
|
+
newTab?: boolean;
|
|
33
|
+
}>;
|
|
34
|
+
}>;
|
|
53
35
|
sidebarLinkComponent?: Component | string;
|
|
54
36
|
showBackground?: boolean;
|
|
55
|
-
insetClass?: HTMLAttributes[
|
|
56
|
-
topbarClass?: HTMLAttributes[
|
|
57
|
-
contentContainerClass?: HTMLAttributes[
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
title: "",
|
|
66
|
-
description: "",
|
|
67
|
-
collapsible: "offcanvas",
|
|
37
|
+
insetClass?: HTMLAttributes['class'];
|
|
38
|
+
topbarClass?: HTMLAttributes['class'];
|
|
39
|
+
contentContainerClass?: HTMLAttributes['class'];
|
|
40
|
+
}>(), {
|
|
41
|
+
appName: '',
|
|
42
|
+
appLogo: '',
|
|
43
|
+
appLinkTo: '/',
|
|
44
|
+
title: '',
|
|
45
|
+
description: '',
|
|
46
|
+
collapsible: 'offcanvas',
|
|
68
47
|
compact: false,
|
|
69
48
|
sidebarSections: () => [],
|
|
70
|
-
sidebarLinkComponent:
|
|
49
|
+
sidebarLinkComponent: 'a',
|
|
71
50
|
showBackground: true
|
|
72
51
|
});
|
|
73
52
|
|
|
74
53
|
// Resolve link props for sidebar items
|
|
75
|
-
const getSidebarItemLinkProps = (item:
|
|
76
|
-
const sharedProps = item.newTab ? { target:
|
|
54
|
+
const getSidebarItemLinkProps = (item: NonNullable<typeof props.sidebarSections>[number]['items'][number]) => {
|
|
55
|
+
const sharedProps = item.newTab ? { target: '_blank', rel: 'noopener noreferrer' } : {};
|
|
77
56
|
|
|
78
57
|
// If the link component is an anchor, use href. Otherwise, use to for router links.
|
|
79
|
-
if (props.sidebarLinkComponent ===
|
|
58
|
+
if (props.sidebarLinkComponent === 'a') {
|
|
80
59
|
return {
|
|
81
|
-
href: item.href ??
|
|
60
|
+
href: item.href ?? '#',
|
|
82
61
|
...sharedProps
|
|
83
62
|
};
|
|
84
63
|
}
|
|
85
64
|
|
|
86
65
|
// For non-anchor link components, assume they use a "to" prop (like Vue Router's <RouterLink>).
|
|
87
66
|
return {
|
|
88
|
-
to: item.to ?? item.href ??
|
|
67
|
+
to: item.to ?? item.href ?? '/',
|
|
89
68
|
...sharedProps
|
|
90
69
|
};
|
|
91
70
|
};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { default } from
|
|
2
|
-
export { default as DashboardShell } from
|
|
1
|
+
export { default } from './DashboardShell.vue';
|
|
2
|
+
export { default as DashboardShell } from './DashboardShell.vue';
|
|
@@ -1,19 +1,17 @@
|
|
|
1
|
-
<script lang="ts"
|
|
2
|
-
import type { HTMLAttributes } from
|
|
3
|
-
import { cn } from
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import type { HTMLAttributes } from 'vue';
|
|
3
|
+
import { cn } from '../../lib/utils';
|
|
4
4
|
|
|
5
|
+
// Props
|
|
5
6
|
const props = defineProps<{
|
|
6
|
-
|
|
7
|
-
}>()
|
|
7
|
+
class?: HTMLAttributes['class'];
|
|
8
|
+
}>();
|
|
8
9
|
</script>
|
|
9
10
|
|
|
10
11
|
<template>
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
<slot />
|
|
17
|
-
</tbody>
|
|
18
|
-
</table>
|
|
12
|
+
<table data-slot="data-list" :class="cn('w-full text-left text-xs md:text-sm', props.class)">
|
|
13
|
+
<tbody class="border-y border-border">
|
|
14
|
+
<slot />
|
|
15
|
+
</tbody>
|
|
16
|
+
</table>
|
|
19
17
|
</template>
|
|
@@ -1,17 +1,15 @@
|
|
|
1
|
-
<script lang="ts"
|
|
2
|
-
import type { HTMLAttributes } from
|
|
3
|
-
import { cn } from
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import type { HTMLAttributes } from 'vue';
|
|
3
|
+
import { cn } from '../../lib/utils';
|
|
4
4
|
|
|
5
|
+
// Props
|
|
5
6
|
const props = defineProps<{
|
|
6
|
-
|
|
7
|
-
}>()
|
|
7
|
+
class?: HTMLAttributes['class'];
|
|
8
|
+
}>();
|
|
8
9
|
</script>
|
|
9
10
|
|
|
10
11
|
<template>
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
>
|
|
15
|
-
<slot />
|
|
16
|
-
</tr>
|
|
12
|
+
<tr data-slot="data-list-item" :class="cn('border-b border-border last:border-b-0', props.class)">
|
|
13
|
+
<slot />
|
|
14
|
+
</tr>
|
|
17
15
|
</template>
|
|
@@ -1,17 +1,15 @@
|
|
|
1
|
-
<script lang="ts"
|
|
2
|
-
import type { HTMLAttributes } from
|
|
3
|
-
import { cn } from
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import type { HTMLAttributes } from 'vue';
|
|
3
|
+
import { cn } from '../../lib/utils';
|
|
4
4
|
|
|
5
|
+
// Props
|
|
5
6
|
const props = defineProps<{
|
|
6
|
-
|
|
7
|
-
}>()
|
|
7
|
+
class?: HTMLAttributes['class'];
|
|
8
|
+
}>();
|
|
8
9
|
</script>
|
|
9
10
|
|
|
10
11
|
<template>
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
>
|
|
15
|
-
<slot />
|
|
16
|
-
</td>
|
|
12
|
+
<td data-slot="data-list-label" :class="cn('py-3 align-top text-muted-foreground', props.class)">
|
|
13
|
+
<slot />
|
|
14
|
+
</td>
|
|
17
15
|
</template>
|
|
@@ -1,17 +1,15 @@
|
|
|
1
|
-
<script lang="ts"
|
|
2
|
-
import type { HTMLAttributes } from
|
|
3
|
-
import { cn } from
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import type { HTMLAttributes } from 'vue';
|
|
3
|
+
import { cn } from '../../lib/utils';
|
|
4
4
|
|
|
5
|
+
// Props
|
|
5
6
|
const props = defineProps<{
|
|
6
|
-
|
|
7
|
-
}>()
|
|
7
|
+
class?: HTMLAttributes['class'];
|
|
8
|
+
}>();
|
|
8
9
|
</script>
|
|
9
10
|
|
|
10
11
|
<template>
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
>
|
|
15
|
-
<slot />
|
|
16
|
-
</div>
|
|
12
|
+
<div data-slot="data-list-text" :class="cn('line-clamp-3', props.class)">
|
|
13
|
+
<slot />
|
|
14
|
+
</div>
|
|
17
15
|
</template>
|
|
@@ -1,17 +1,15 @@
|
|
|
1
|
-
<script lang="ts"
|
|
2
|
-
import type { HTMLAttributes } from
|
|
3
|
-
import { cn } from
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import type { HTMLAttributes } from 'vue';
|
|
3
|
+
import { cn } from '../../lib/utils';
|
|
4
4
|
|
|
5
|
+
// Props
|
|
5
6
|
const props = defineProps<{
|
|
6
|
-
|
|
7
|
-
}>()
|
|
7
|
+
class?: HTMLAttributes['class'];
|
|
8
|
+
}>();
|
|
8
9
|
</script>
|
|
9
10
|
|
|
10
11
|
<template>
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
>
|
|
15
|
-
<slot />
|
|
16
|
-
</td>
|
|
12
|
+
<td data-slot="data-list-value" :class="cn('py-3 pl-2 align-top text-right font-semibold text-foreground', props.class)">
|
|
13
|
+
<slot />
|
|
14
|
+
</td>
|
|
17
15
|
</template>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { default as DataList } from
|
|
2
|
-
export { default as DataListItem } from
|
|
3
|
-
export { default as DataListLabel } from
|
|
4
|
-
export { default as DataListText } from
|
|
5
|
-
export { default as DataListValue } from
|
|
1
|
+
export { default as DataList } from './DataList.vue';
|
|
2
|
+
export { default as DataListItem } from './DataListItem.vue';
|
|
3
|
+
export { default as DataListLabel } from './DataListLabel.vue';
|
|
4
|
+
export { default as DataListText } from './DataListText.vue';
|
|
5
|
+
export { default as DataListValue } from './DataListValue.vue';
|