@iqual/nuxt-icms 1.1.0 → 1.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/css/ckeditor.css +4 -0
- package/assets/css/components/container.css +2 -2
- package/assets/css/tailwind.css +1 -1
- package/assets/css/typography.css +4 -0
- package/assets/symbols/download.svg +3 -0
- package/bundles.ts +4 -1
- package/components/Blokkli/TextMedia/index.vue +1 -2
- package/components/DesignSystem/Atoms/Caption.vue +15 -0
- package/components/DesignSystem/Atoms/LinkListItem.vue +21 -0
- package/components/DesignSystem/Molecules/MediaLightbox.vue +273 -0
- package/components/DesignSystem/Molecules/MediaSlider.vue +33 -22
- package/components/DesignSystem/Organisms/Map.vue +61 -0
- package/components/DesignSystem/README.md +489 -0
- package/components/Media/Image/index.vue +4 -162
- package/components/Media/RemoteVideo/index.vue +3 -3
- package/components/Node/Icms/Page/SearchResult/fragment.graphql +8 -0
- package/components/Node/Icms/Page/SearchResult/index.vue +12 -0
- package/components/Node/Icms/Page/Teaser/fragment.graphql +17 -0
- package/components/Node/Icms/Page/Teaser/index.vue +20 -0
- package/components/Node/Icms/Page/fragment.graphql +18 -0
- package/components/Node/Icms/Page/index.vue +5 -3
- package/components/Paragraph/CallToAction/index.vue +12 -8
- package/components/Paragraph/Card/Layout/index.vue +2 -2
- package/components/Paragraph/Contact/index.vue +1 -2
- package/components/Paragraph/Downloads/index.vue +4 -16
- package/components/Paragraph/FAQ/Layout/index.vue +24 -3
- package/components/Paragraph/FlipTeasers/index.vue +2 -2
- package/components/Paragraph/Gallery/index.vue +35 -172
- package/components/Paragraph/HeroImage/index.vue +13 -4
- package/components/Paragraph/IconText/Layout/index.vue +1 -2
- package/components/Paragraph/Media/index.vue +7 -2
- package/components/Paragraph/Table/index.vue +2 -2
- package/components/Paragraph/Team/Layout/index.vue +2 -2
- package/components/Paragraph/Teasers/fragment.graphql +2 -15
- package/components/Paragraph/Teasers/index.vue +12 -15
- package/components/Paragraph/TextMedia/index.vue +40 -33
- package/components/Paragraph/Timeline/Element/index.vue +1 -1
- package/components/Paragraph/Timeline/Layout/fragment.graphql +1 -0
- package/components/Paragraph/Timeline/Layout/index.vue +9 -6
- package/components/Paragraph/iFrame/index.vue +16 -2
- package/components/Search/Facets/FacetDropdownUI.vue +222 -0
- package/components/Search/Facets/FacetedSearchUI.vue +397 -0
- package/components/Search/Facets/fragment.graphql +40 -0
- package/components/Section/Footer/index.vue +15 -14
- package/components/Section/Header/GlobalMenu.vue +34 -34
- package/components/Section/Header/LanguageDropdown.vue +60 -73
- package/components/Section/Header/LanguageSwitcher.vue +37 -0
- package/components/Section/Header/MetaMenu.vue +27 -20
- package/components/Section/Header/index.vue +91 -79
- package/components/ui/accordion/Accordion.vue +2 -2
- package/components/ui/accordion/AccordionContent.vue +5 -5
- package/components/ui/accordion/AccordionItem.vue +9 -10
- package/components/ui/accordion/AccordionTrigger.vue +5 -5
- package/components/ui/alert/Alert.vue +17 -0
- package/components/ui/alert/AlertDescription.vue +14 -0
- package/components/ui/alert/AlertTitle.vue +14 -0
- package/components/ui/alert/index.ts +24 -0
- package/components/ui/alert-dialog/AlertDialog.vue +15 -0
- package/components/ui/alert-dialog/AlertDialogAction.vue +22 -0
- package/components/ui/alert-dialog/AlertDialogCancel.vue +29 -0
- package/components/ui/alert-dialog/AlertDialogContent.vue +43 -0
- package/components/ui/alert-dialog/AlertDialogDescription.vue +27 -0
- package/components/ui/alert-dialog/AlertDialogFooter.vue +21 -0
- package/components/ui/alert-dialog/AlertDialogHeader.vue +16 -0
- package/components/ui/alert-dialog/AlertDialogTitle.vue +24 -0
- package/components/ui/alert-dialog/AlertDialogTrigger.vue +12 -0
- package/components/ui/alert-dialog/index.ts +9 -0
- package/components/ui/aspect-ratio/AspectRatio.vue +12 -0
- package/components/ui/aspect-ratio/index.ts +1 -0
- package/components/ui/auto-form/AutoForm.vue +106 -0
- package/components/ui/auto-form/AutoFormField.vue +45 -0
- package/components/ui/auto-form/AutoFormFieldArray.vue +110 -0
- package/components/ui/auto-form/AutoFormFieldBoolean.vue +41 -0
- package/components/ui/auto-form/AutoFormFieldDate.vue +57 -0
- package/components/ui/auto-form/AutoFormFieldEnum.vue +49 -0
- package/components/ui/auto-form/AutoFormFieldFile.vue +74 -0
- package/components/ui/auto-form/AutoFormFieldInput.vue +36 -0
- package/components/ui/auto-form/AutoFormFieldNumber.vue +32 -0
- package/components/ui/auto-form/AutoFormFieldObject.vue +78 -0
- package/components/ui/auto-form/AutoFormLabel.vue +14 -0
- package/components/ui/auto-form/constant.ts +40 -0
- package/components/ui/auto-form/dependencies.ts +93 -0
- package/components/ui/auto-form/index.ts +15 -0
- package/components/ui/auto-form/interface.ts +95 -0
- package/components/ui/auto-form/utils.ts +188 -0
- package/components/ui/avatar/Avatar.vue +22 -0
- package/components/ui/avatar/AvatarFallback.vue +12 -0
- package/components/ui/avatar/AvatarImage.vue +10 -0
- package/components/ui/avatar/index.ts +25 -0
- package/components/ui/badge/Badge.vue +17 -0
- package/components/ui/badge/index.ts +26 -0
- package/components/ui/breadcrumb/Breadcrumb.vue +13 -0
- package/components/ui/breadcrumb/BreadcrumbEllipsis.vue +22 -0
- package/components/ui/breadcrumb/BreadcrumbItem.vue +16 -0
- package/components/ui/breadcrumb/BreadcrumbLink.vue +20 -0
- package/components/ui/breadcrumb/BreadcrumbList.vue +16 -0
- package/components/ui/breadcrumb/BreadcrumbPage.vue +19 -0
- package/components/ui/breadcrumb/BreadcrumbSeparator.vue +21 -0
- package/components/ui/breadcrumb/index.ts +7 -0
- package/components/ui/button/Button.vue +4 -2
- package/components/ui/button/index.ts +9 -9
- package/components/ui/calendar/Calendar.vue +62 -0
- package/components/ui/calendar/CalendarCell.vue +26 -0
- package/components/ui/calendar/CalendarCellTrigger.vue +40 -0
- package/components/ui/calendar/CalendarGrid.vue +26 -0
- package/components/ui/calendar/CalendarGridBody.vue +12 -0
- package/components/ui/calendar/CalendarGridHead.vue +12 -0
- package/components/ui/calendar/CalendarGridRow.vue +23 -0
- package/components/ui/calendar/CalendarHeadCell.vue +23 -0
- package/components/ui/calendar/CalendarHeader.vue +23 -0
- package/components/ui/calendar/CalendarHeading.vue +33 -0
- package/components/ui/calendar/CalendarNextButton.vue +34 -0
- package/components/ui/calendar/CalendarPrevButton.vue +34 -0
- package/components/ui/calendar/index.ts +12 -0
- package/components/ui/card/Card.vue +21 -0
- package/components/ui/card/CardContent.vue +14 -0
- package/components/ui/card/CardDescription.vue +14 -0
- package/components/ui/card/CardFooter.vue +14 -0
- package/components/ui/card/CardHeader.vue +14 -0
- package/components/ui/card/CardTitle.vue +18 -0
- package/components/ui/card/index.ts +6 -0
- package/components/ui/carousel/Carousel.vue +3 -23
- package/components/ui/carousel/CarouselContent.vue +1 -2
- package/components/ui/carousel/CarouselItem.vue +5 -7
- package/components/ui/carousel/CarouselNext.vue +7 -9
- package/components/ui/carousel/CarouselPrevious.vue +7 -9
- package/components/ui/carousel/index.ts +3 -1
- package/components/ui/carousel/interface.ts +3 -1
- package/components/ui/carousel/useCarousel.ts +13 -23
- package/components/ui/chart/ChartCrosshair.vue +45 -0
- package/components/ui/chart/ChartLegend.vue +50 -0
- package/components/ui/chart/ChartSingleTooltip.vue +64 -0
- package/components/ui/chart/ChartTooltip.vue +40 -0
- package/components/ui/chart/index.ts +18 -0
- package/components/ui/chart/interface.ts +64 -0
- package/components/ui/chart-area/AreaChart.vue +141 -0
- package/components/ui/chart-area/index.ts +66 -0
- package/components/ui/chart-bar/BarChart.vue +116 -0
- package/components/ui/chart-bar/index.ts +66 -0
- package/components/ui/chart-donut/DonutChart.vue +101 -0
- package/components/ui/chart-donut/index.ts +39 -0
- package/components/ui/chart-line/LineChart.vue +107 -0
- package/components/ui/chart-line/index.ts +66 -0
- package/components/ui/checkbox/Checkbox.vue +1 -1
- package/components/ui/collapsible/Collapsible.vue +15 -0
- package/components/ui/collapsible/CollapsibleContent.vue +12 -0
- package/components/ui/collapsible/CollapsibleTrigger.vue +12 -0
- package/components/ui/collapsible/index.ts +3 -0
- package/components/ui/command/Command.vue +31 -0
- package/components/ui/command/CommandDialog.vue +21 -0
- package/components/ui/command/CommandEmpty.vue +21 -0
- package/components/ui/command/CommandGroup.vue +30 -0
- package/components/ui/command/CommandInput.vue +35 -0
- package/components/ui/command/CommandItem.vue +27 -0
- package/components/ui/command/CommandList.vue +28 -0
- package/components/ui/command/CommandSeparator.vue +24 -0
- package/components/ui/command/CommandShortcut.vue +14 -0
- package/components/ui/command/index.ts +9 -0
- package/components/ui/context-menu/ContextMenu.vue +15 -0
- package/components/ui/context-menu/ContextMenuCheckboxItem.vue +41 -0
- package/components/ui/context-menu/ContextMenuContent.vue +37 -0
- package/components/ui/context-menu/ContextMenuGroup.vue +12 -0
- package/components/ui/context-menu/ContextMenuItem.vue +35 -0
- package/components/ui/context-menu/ContextMenuLabel.vue +27 -0
- package/components/ui/context-menu/ContextMenuPortal.vue +12 -0
- package/components/ui/context-menu/ContextMenuRadioGroup.vue +19 -0
- package/components/ui/context-menu/ContextMenuRadioItem.vue +41 -0
- package/components/ui/context-menu/ContextMenuSeparator.vue +22 -0
- package/components/ui/context-menu/ContextMenuShortcut.vue +14 -0
- package/components/ui/context-menu/ContextMenuSub.vue +19 -0
- package/components/ui/context-menu/ContextMenuSubContent.vue +36 -0
- package/components/ui/context-menu/ContextMenuSubTrigger.vue +36 -0
- package/components/ui/context-menu/ContextMenuTrigger.vue +14 -0
- package/components/ui/context-menu/index.ts +14 -0
- package/components/ui/dialog/Dialog.vue +2 -6
- package/components/ui/dialog/DialogClose.vue +2 -1
- package/components/ui/dialog/DialogContent.vue +10 -12
- package/components/ui/dialog/DialogDescription.vue +6 -10
- package/components/ui/dialog/DialogScrollContent.vue +15 -21
- package/components/ui/dialog/DialogTitle.vue +9 -6
- package/components/ui/dialog/DialogTrigger.vue +2 -1
- package/components/ui/drawer/Drawer.vue +19 -0
- package/components/ui/drawer/DrawerContent.vue +28 -0
- package/components/ui/drawer/DrawerDescription.vue +21 -0
- package/components/ui/drawer/DrawerFooter.vue +14 -0
- package/components/ui/drawer/DrawerHeader.vue +14 -0
- package/components/ui/drawer/DrawerOverlay.vue +19 -0
- package/components/ui/drawer/DrawerTitle.vue +21 -0
- package/components/ui/drawer/index.ts +8 -0
- package/components/ui/dropdown-menu/DropdownMenu.vue +15 -0
- package/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +41 -0
- package/components/ui/dropdown-menu/DropdownMenuContent.vue +39 -0
- package/components/ui/dropdown-menu/DropdownMenuGroup.vue +12 -0
- package/components/ui/dropdown-menu/DropdownMenuItem.vue +30 -0
- package/components/ui/dropdown-menu/DropdownMenuLabel.vue +26 -0
- package/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue +19 -0
- package/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +42 -0
- package/components/ui/dropdown-menu/DropdownMenuSeparator.vue +24 -0
- package/components/ui/dropdown-menu/DropdownMenuShortcut.vue +14 -0
- package/components/ui/dropdown-menu/DropdownMenuSub.vue +19 -0
- package/components/ui/dropdown-menu/DropdownMenuSubContent.vue +31 -0
- package/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +35 -0
- package/components/ui/dropdown-menu/DropdownMenuTrigger.vue +14 -0
- package/components/ui/dropdown-menu/index.ts +16 -0
- package/components/ui/form/FormControl.vue +16 -0
- package/components/ui/form/FormDescription.vue +20 -0
- package/components/ui/form/FormItem.vue +20 -0
- package/components/ui/form/FormLabel.vue +23 -0
- package/components/ui/form/FormMessage.vue +16 -0
- package/components/ui/form/index.ts +7 -0
- package/components/ui/form/injectionKeys.ts +4 -0
- package/components/ui/form/useFormField.ts +30 -0
- package/components/ui/hover-card/HoverCard.vue +15 -0
- package/components/ui/hover-card/HoverCardContent.vue +43 -0
- package/components/ui/hover-card/HoverCardTrigger.vue +12 -0
- package/components/ui/hover-card/index.ts +3 -0
- package/components/ui/input/Input.vue +1 -1
- package/components/ui/menubar/Menubar.vue +36 -0
- package/components/ui/menubar/MenubarCheckboxItem.vue +41 -0
- package/components/ui/menubar/MenubarContent.vue +45 -0
- package/components/ui/menubar/MenubarGroup.vue +12 -0
- package/components/ui/menubar/MenubarItem.vue +36 -0
- package/components/ui/menubar/MenubarLabel.vue +14 -0
- package/components/ui/menubar/MenubarMenu.vue +12 -0
- package/components/ui/menubar/MenubarRadioGroup.vue +20 -0
- package/components/ui/menubar/MenubarRadioItem.vue +41 -0
- package/components/ui/menubar/MenubarSeparator.vue +21 -0
- package/components/ui/menubar/MenubarShortcut.vue +14 -0
- package/components/ui/menubar/MenubarSub.vue +20 -0
- package/components/ui/menubar/MenubarSubContent.vue +40 -0
- package/components/ui/menubar/MenubarSubTrigger.vue +32 -0
- package/components/ui/menubar/MenubarTrigger.vue +31 -0
- package/components/ui/menubar/index.ts +15 -0
- package/components/ui/navigation-menu/NavigationMenu.vue +34 -0
- package/components/ui/navigation-menu/NavigationMenuContent.vue +35 -0
- package/components/ui/navigation-menu/NavigationMenuIndicator.vue +26 -0
- package/components/ui/navigation-menu/NavigationMenuItem.vue +12 -0
- package/components/ui/navigation-menu/NavigationMenuLink.vue +19 -0
- package/components/ui/navigation-menu/NavigationMenuList.vue +31 -0
- package/components/ui/navigation-menu/NavigationMenuTrigger.vue +36 -0
- package/components/ui/navigation-menu/NavigationMenuViewport.vue +35 -0
- package/components/ui/navigation-menu/index.ts +14 -0
- package/components/ui/number-field/NumberField.vue +24 -0
- package/components/ui/number-field/NumberFieldContent.vue +14 -0
- package/components/ui/number-field/NumberFieldDecrement.vue +26 -0
- package/components/ui/number-field/NumberFieldIncrement.vue +26 -0
- package/components/ui/number-field/NumberFieldInput.vue +16 -0
- package/components/ui/number-field/index.ts +5 -0
- package/components/ui/pagination/PaginationEllipsis.vue +24 -0
- package/components/ui/pagination/PaginationFirst.vue +31 -0
- package/components/ui/pagination/PaginationLast.vue +31 -0
- package/components/ui/pagination/PaginationNext.vue +31 -0
- package/components/ui/pagination/PaginationPrev.vue +31 -0
- package/components/ui/pagination/index.ts +10 -0
- package/components/ui/pin-input/PinInput.vue +25 -0
- package/components/ui/pin-input/PinInputGroup.vue +20 -0
- package/components/ui/pin-input/PinInputInput.vue +20 -0
- package/components/ui/pin-input/PinInputSeparator.vue +16 -0
- package/components/ui/pin-input/index.ts +4 -0
- package/components/ui/popover/Popover.vue +15 -0
- package/components/ui/popover/PopoverContent.vue +49 -0
- package/components/ui/popover/PopoverTrigger.vue +12 -0
- package/components/ui/popover/index.ts +3 -0
- package/components/ui/progress/Progress.vue +41 -0
- package/components/ui/progress/index.ts +1 -0
- package/components/ui/radio-group/RadioGroupItem.vue +1 -1
- package/components/ui/range-calendar/RangeCalendar.vue +62 -0
- package/components/ui/range-calendar/RangeCalendarCell.vue +26 -0
- package/components/ui/range-calendar/RangeCalendarCellTrigger.vue +42 -0
- package/components/ui/range-calendar/RangeCalendarGrid.vue +26 -0
- package/components/ui/range-calendar/RangeCalendarGridBody.vue +12 -0
- package/components/ui/range-calendar/RangeCalendarGridHead.vue +12 -0
- package/components/ui/range-calendar/RangeCalendarGridRow.vue +23 -0
- package/components/ui/range-calendar/RangeCalendarHeadCell.vue +23 -0
- package/components/ui/range-calendar/RangeCalendarHeader.vue +23 -0
- package/components/ui/range-calendar/RangeCalendarHeading.vue +33 -0
- package/components/ui/range-calendar/RangeCalendarNextButton.vue +34 -0
- package/components/ui/range-calendar/RangeCalendarPrevButton.vue +34 -0
- package/components/ui/range-calendar/index.ts +12 -0
- package/components/ui/resizable/ResizableHandle.vue +28 -0
- package/components/ui/resizable/ResizablePanelGroup.vue +23 -0
- package/components/ui/resizable/index.ts +3 -0
- package/components/ui/scroll-area/ScrollArea.vue +31 -0
- package/components/ui/scroll-area/ScrollBar.vue +32 -0
- package/components/ui/scroll-area/index.ts +2 -0
- package/components/ui/select/SelectContent.vue +1 -1
- package/components/ui/select/SelectItem.vue +1 -1
- package/components/ui/select/SelectSeparator.vue +1 -1
- package/components/ui/select/SelectTrigger.vue +1 -1
- package/components/ui/separator/Separator.vue +37 -0
- package/components/ui/separator/index.ts +1 -0
- package/components/ui/sheet/Sheet.vue +15 -0
- package/components/ui/sheet/SheetClose.vue +12 -0
- package/components/ui/sheet/SheetContent.vue +58 -0
- package/components/ui/sheet/SheetDescription.vue +24 -0
- package/components/ui/sheet/SheetFooter.vue +19 -0
- package/components/ui/sheet/SheetHeader.vue +16 -0
- package/components/ui/sheet/SheetTitle.vue +24 -0
- package/components/ui/sheet/SheetTrigger.vue +12 -0
- package/components/ui/sheet/index.ts +32 -0
- package/components/ui/sidebar/Sidebar.vue +85 -0
- package/components/ui/sidebar/SidebarContent.vue +17 -0
- package/components/ui/sidebar/SidebarFooter.vue +17 -0
- package/components/ui/sidebar/SidebarGroup.vue +17 -0
- package/components/ui/sidebar/SidebarGroupAction.vue +26 -0
- package/components/ui/sidebar/SidebarGroupContent.vue +17 -0
- package/components/ui/sidebar/SidebarGroupLabel.vue +24 -0
- package/components/ui/sidebar/SidebarHeader.vue +17 -0
- package/components/ui/sidebar/SidebarInput.vue +21 -0
- package/components/ui/sidebar/SidebarInset.vue +20 -0
- package/components/ui/sidebar/SidebarMenu.vue +17 -0
- package/components/ui/sidebar/SidebarMenuAction.vue +34 -0
- package/components/ui/sidebar/SidebarMenuBadge.vue +25 -0
- package/components/ui/sidebar/SidebarMenuButton.vue +51 -0
- package/components/ui/sidebar/SidebarMenuButtonChild.vue +35 -0
- package/components/ui/sidebar/SidebarMenuItem.vue +17 -0
- package/components/ui/sidebar/SidebarMenuSkeleton.vue +34 -0
- package/components/ui/sidebar/SidebarMenuSub.vue +21 -0
- package/components/ui/sidebar/SidebarMenuSubButton.vue +35 -0
- package/components/ui/sidebar/SidebarMenuSubItem.vue +8 -0
- package/components/ui/sidebar/SidebarProvider.vue +81 -0
- package/components/ui/sidebar/SidebarRail.vue +32 -0
- package/components/ui/sidebar/SidebarSeparator.vue +18 -0
- package/components/ui/sidebar/SidebarTrigger.vue +26 -0
- package/components/ui/sidebar/index.ts +60 -0
- package/components/ui/sidebar/utils.ts +19 -0
- package/components/ui/skeleton/Skeleton.vue +14 -0
- package/components/ui/skeleton/index.ts +1 -0
- package/components/ui/slider/Slider.vue +37 -0
- package/components/ui/slider/index.ts +1 -0
- package/components/ui/sonner/Sonner.vue +23 -0
- package/components/ui/sonner/index.ts +1 -0
- package/components/ui/stepper/Stepper.vue +32 -0
- package/components/ui/stepper/StepperDescription.vue +24 -0
- package/components/ui/stepper/StepperIndicator.vue +36 -0
- package/components/ui/stepper/StepperItem.vue +28 -0
- package/components/ui/stepper/StepperSeparator.vue +32 -0
- package/components/ui/stepper/StepperTitle.vue +24 -0
- package/components/ui/stepper/StepperTrigger.vue +27 -0
- package/components/ui/stepper/index.ts +7 -0
- package/components/ui/switch/Switch.vue +40 -0
- package/components/ui/switch/index.ts +1 -0
- package/components/ui/table/Table.vue +16 -0
- package/components/ui/table/TableBody.vue +14 -0
- package/components/ui/table/TableCaption.vue +14 -0
- package/components/ui/table/TableCell.vue +21 -0
- package/components/ui/table/TableEmpty.vue +38 -0
- package/components/ui/table/TableFooter.vue +14 -0
- package/components/ui/table/TableHead.vue +14 -0
- package/components/ui/table/TableHeader.vue +14 -0
- package/components/ui/table/TableRow.vue +14 -0
- package/components/ui/table/index.ts +9 -0
- package/components/ui/tabs/TabsContent.vue +6 -11
- package/components/ui/tabs/TabsList.vue +8 -8
- package/components/ui/tabs/TabsTrigger.vue +9 -11
- package/components/ui/tags-input/TagsInput.vue +24 -0
- package/components/ui/tags-input/TagsInputInput.vue +21 -0
- package/components/ui/tags-input/TagsInputItem.vue +24 -0
- package/components/ui/tags-input/TagsInputItemDelete.vue +26 -0
- package/components/ui/tags-input/TagsInputItemText.vue +21 -0
- package/components/ui/tags-input/index.ts +5 -0
- package/components/ui/textarea/Textarea.vue +1 -1
- package/components/ui/toast/Toast.vue +30 -0
- package/components/ui/toast/ToastAction.vue +21 -0
- package/components/ui/toast/ToastClose.vue +24 -0
- package/components/ui/toast/ToastDescription.vue +21 -0
- package/components/ui/toast/ToastProvider.vue +12 -0
- package/components/ui/toast/ToastTitle.vue +21 -0
- package/components/ui/toast/ToastViewport.vue +19 -0
- package/components/ui/toast/Toaster.vue +30 -0
- package/components/ui/toast/index.ts +39 -0
- package/components/ui/toast/use-toast.ts +165 -0
- package/components/ui/toggle/Toggle.vue +38 -0
- package/components/ui/toggle/index.ts +28 -0
- package/components/ui/toggle-group/ToggleGroup.vue +36 -0
- package/components/ui/toggle-group/ToggleGroupItem.vue +37 -0
- package/components/ui/toggle-group/index.ts +2 -0
- package/components/ui/tooltip/Tooltip.vue +15 -0
- package/components/ui/tooltip/TooltipContent.vue +33 -0
- package/components/ui/tooltip/TooltipProvider.vue +12 -0
- package/components/ui/tooltip/TooltipTrigger.vue +12 -0
- package/components/ui/tooltip/index.ts +4 -0
- package/components/ui/v-calendar/Calendar.vue +343 -0
- package/components/ui/v-calendar/index.ts +22 -0
- package/composables/useAccordionScroll.ts +1 -1
- package/composables/useContentSearch.ts +0 -0
- package/composables/useGlobalConfig.ts +57 -0
- package/composables/useGraphqlCacheability.ts +22 -0
- package/composables/useImageSources.ts +208 -0
- package/composables/useInitData.ts +20 -112
- package/composables/useMediaLightbox.ts +114 -0
- package/composables/useMenu.ts +66 -0
- package/composables/useMessageBus.ts +74 -0
- package/composables/useNavigationOffset.ts +1 -1
- package/layouts/default.vue +2 -2
- package/layouts/error.vue +8 -10
- package/modules/dynamicEntityComponentResolver.ts +162 -0
- package/modules/dynamicParagraphResolver.ts +1 -1
- package/nuxt.config.ts +11 -22
- package/package.json +2 -2
- package/pages/[...slug]/index.vue +2 -2
- package/pages/index.vue +2 -2
- package/pages/node/[nid]/index.vue +2 -2
- package/plugins/graphqlMiddleware.ts +27 -68
- package/plugins/initData.ts +105 -0
- package/queries/query.contentSearch.graphql +17 -0
- package/{composables → queries}/query.initData.graphql +2 -8
- package/queries/query.loadTranslations.graphql +5 -0
- package/tailwind.config.ts +1 -0
- package/types/initData.ts +1 -0
- package/components/Section/Header/SearchLink.vue +0 -26
- package/composables/languageLinks.ts +0 -31
- package/composables/useMainMenuLinks.ts +0 -69
- package/composables/useMetaMenuLinks.ts +0 -44
- package/modules/dynamicNodeResolver.ts +0 -95
- package/pages/search/index.vue +0 -69
- package/pages/static-page/example.vue +0 -40
- package/queries/fragment.routeQuery.graphql +0 -51
|
@@ -0,0 +1,489 @@
|
|
|
1
|
+
# ICMS Design System Documentation
|
|
2
|
+
|
|
3
|
+
The ICMS Design System is built following Atomic Design principles with Vue 3, Nuxt 3, TypeScript, and Tailwind CSS. It provides a comprehensive set of reusable components organized into Atoms, Molecules, and Organisms.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
- [Architecture](#architecture)
|
|
8
|
+
- [Technology Stack](#technology-stack)
|
|
9
|
+
- [Component Hierarchy](#component-hierarchy)
|
|
10
|
+
- [Atoms](#atoms)
|
|
11
|
+
- [Molecules](#molecules)
|
|
12
|
+
- [Organisms](#organisms)
|
|
13
|
+
- [Composables](#composables)
|
|
14
|
+
- [Styling Guidelines](#styling-guidelines)
|
|
15
|
+
- [Best Practices](#best-practices)
|
|
16
|
+
- [Usage Examples](#usage-examples)
|
|
17
|
+
|
|
18
|
+
## Architecture
|
|
19
|
+
|
|
20
|
+
The design system follows **Atomic Design methodology**:
|
|
21
|
+
|
|
22
|
+
- **Atoms**: Basic building blocks (buttons, inputs, containers)
|
|
23
|
+
- **Molecules**: Simple combinations of atoms (cards, forms, navigation items)
|
|
24
|
+
- **Organisms**: Complex components combining molecules and atoms (headers, sections, content blocks)
|
|
25
|
+
|
|
26
|
+
### File Structure
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
components/DesignSystem/
|
|
30
|
+
├── Atoms/ # Basic UI elements
|
|
31
|
+
├── Molecules/ # Component combinations
|
|
32
|
+
└── Organisms/ # Complex layout components
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Technology Stack
|
|
36
|
+
|
|
37
|
+
- **Vue 3**: Composition API with `<script setup>` syntax
|
|
38
|
+
- **TypeScript**: Full type safety
|
|
39
|
+
- **Tailwind CSS**: Utility-first styling
|
|
40
|
+
- **Tailwind Variants**: Type-safe component variants
|
|
41
|
+
- **Container Queries**: Responsive design with `@container`
|
|
42
|
+
- **GraphQL**: Type-safe data fetching
|
|
43
|
+
- **Nuxt 3**: Framework with auto-imports
|
|
44
|
+
|
|
45
|
+
### Key Dependencies
|
|
46
|
+
|
|
47
|
+
```typescript
|
|
48
|
+
import { tv } from 'tailwind-variants' // Component variants
|
|
49
|
+
import cn from '@iqual/nuxt-icms/composables/useCn' // Class merging
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Component Hierarchy
|
|
53
|
+
|
|
54
|
+
### Atoms
|
|
55
|
+
|
|
56
|
+
| Component | Purpose | Key Features |
|
|
57
|
+
|-----------|---------|--------------|
|
|
58
|
+
| `Button.vue` | Interactive elements | Multiple styles, color schemes, link integration |
|
|
59
|
+
| `Caption.vue` | Text captions | Typography variants |
|
|
60
|
+
| `Container.vue` | Layout wrapper | Responsive containers |
|
|
61
|
+
| `GridRow.vue` | Grid layout | CSS Grid implementation |
|
|
62
|
+
| `LinkListItem.vue` | Navigation items | Styled list items |
|
|
63
|
+
|
|
64
|
+
### Molecules
|
|
65
|
+
|
|
66
|
+
| Component | Purpose | Key Features |
|
|
67
|
+
|-----------|---------|--------------|
|
|
68
|
+
| `ButtonGroup.vue` | Button collections | Grouped button layout |
|
|
69
|
+
| `Card.vue` | Content cards | Media integration, color schemes |
|
|
70
|
+
| `IconText.vue` | Icon + text combinations | Flexible icon positioning |
|
|
71
|
+
| `MediaLightbox.vue` | Media overlay | Carousel, keyboard navigation |
|
|
72
|
+
| `MediaSlider.vue` | Media carousels | Touch/swipe support |
|
|
73
|
+
| `Partnership.vue` | Partner displays | Logo arrangements |
|
|
74
|
+
| `Table.vue` | Data tables | Responsive table layout |
|
|
75
|
+
| `TitleComposition.vue` | Heading combinations | Semantic heading structure |
|
|
76
|
+
| `iFrame.vue` | Embedded content | Responsive iframe wrapper |
|
|
77
|
+
|
|
78
|
+
### Organisms
|
|
79
|
+
|
|
80
|
+
| Component | Purpose | Key Features |
|
|
81
|
+
|-----------|---------|--------------|
|
|
82
|
+
| `ContentBlock.vue` | Rich content | Flexible content layout |
|
|
83
|
+
| `FlipTeaser.vue` | Interactive cards | Hover/click animations |
|
|
84
|
+
| `LogoElement.vue` | Brand display | Logo arrangements |
|
|
85
|
+
| `Map.vue` | Geographic content | Map integration |
|
|
86
|
+
| `TeamElement.vue` | People showcase | Team member cards |
|
|
87
|
+
| `TeaserCard.vue` | Content previews | Image + text teasers |
|
|
88
|
+
| `Testimonial.vue` | User feedback | Quote formatting |
|
|
89
|
+
| `TimelineElement.vue` | Chronological content | Timeline layout |
|
|
90
|
+
| `TwoColumnTextElement.vue` | Text layout | Multi-column text |
|
|
91
|
+
|
|
92
|
+
## Atoms
|
|
93
|
+
|
|
94
|
+
### Button
|
|
95
|
+
|
|
96
|
+
The foundational interactive component with comprehensive styling options.
|
|
97
|
+
|
|
98
|
+
```vue
|
|
99
|
+
<DesignSystemAtomsButton
|
|
100
|
+
label="Click me"
|
|
101
|
+
subline="Optional subtitle"
|
|
102
|
+
link="/example"
|
|
103
|
+
:target-blank="false"
|
|
104
|
+
style="normal"
|
|
105
|
+
color-scheme="accent"
|
|
106
|
+
text-alignment="center"
|
|
107
|
+
/>
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
**Props:**
|
|
111
|
+
- `label` (string): Button text
|
|
112
|
+
- `subline` (string): Optional subtitle
|
|
113
|
+
- `link` (string): Navigation target
|
|
114
|
+
- `targetBlank` (boolean): Open in new tab
|
|
115
|
+
- `style` (string): `normal`, `focus`, `minimal`
|
|
116
|
+
- `colorScheme` (string): `none`, `dark`, `light`, `accent`
|
|
117
|
+
- `textAlignment` (string): `left`, `center`, `right`
|
|
118
|
+
|
|
119
|
+
**Variants:**
|
|
120
|
+
- **Normal**: Standard button appearance
|
|
121
|
+
- **Focus**: Emphasized styling
|
|
122
|
+
- **Minimal**: Text-only, underlined
|
|
123
|
+
|
|
124
|
+
### Container
|
|
125
|
+
|
|
126
|
+
Responsive layout wrapper with consistent spacing.
|
|
127
|
+
|
|
128
|
+
```vue
|
|
129
|
+
<DesignSystemAtomsContainer>
|
|
130
|
+
<p>Content goes here</p>
|
|
131
|
+
</DesignSystemAtomsContainer>
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
**Features:**
|
|
135
|
+
- Responsive max-width
|
|
136
|
+
- Consistent horizontal padding
|
|
137
|
+
- Container query support
|
|
138
|
+
|
|
139
|
+
### GridRow
|
|
140
|
+
|
|
141
|
+
CSS Grid implementation for flexible layouts.
|
|
142
|
+
|
|
143
|
+
```vue
|
|
144
|
+
<DesignSystemAtomsGridRow :columns="3">
|
|
145
|
+
<div>Item 1</div>
|
|
146
|
+
<div>Item 2</div>
|
|
147
|
+
<div>Item 3</div>
|
|
148
|
+
</DesignSystemAtomsGridRow>
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## Molecules
|
|
152
|
+
|
|
153
|
+
### Card
|
|
154
|
+
|
|
155
|
+
Versatile content container with media support.
|
|
156
|
+
|
|
157
|
+
```vue
|
|
158
|
+
<DesignSystemMoleculesCard
|
|
159
|
+
title="Card Title"
|
|
160
|
+
title-weight="semibold"
|
|
161
|
+
text="Card description text"
|
|
162
|
+
:image="imageMedia"
|
|
163
|
+
:icon="iconMedia"
|
|
164
|
+
color-scheme="light"
|
|
165
|
+
/>
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
**Props:**
|
|
169
|
+
- `title` (string): Card heading
|
|
170
|
+
- `titleWeight` (string): Font weight
|
|
171
|
+
- `text` (string): Description
|
|
172
|
+
- `image` (MediaFragment): Optional image
|
|
173
|
+
- `icon` (MediaFragment): Optional icon
|
|
174
|
+
- `colorScheme` (string): Color variant
|
|
175
|
+
|
|
176
|
+
**Color Schemes:**
|
|
177
|
+
- `none`: Default background
|
|
178
|
+
- `dark`: Dark theme
|
|
179
|
+
- `light`: Light theme
|
|
180
|
+
- `accent`: Brand colors
|
|
181
|
+
|
|
182
|
+
### MediaLightbox
|
|
183
|
+
|
|
184
|
+
Advanced media overlay with carousel functionality.
|
|
185
|
+
|
|
186
|
+
```vue
|
|
187
|
+
<DesignSystemMoleculesMediaLightbox
|
|
188
|
+
:media-objects="mediaArray"
|
|
189
|
+
:current-index="0"
|
|
190
|
+
:is-open="showLightbox"
|
|
191
|
+
@close="showLightbox = false"
|
|
192
|
+
@navigate="handleNavigation"
|
|
193
|
+
/>
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
**Features:**
|
|
197
|
+
- Multi-media support (images, videos, remote videos)
|
|
198
|
+
- Keyboard navigation (arrow keys, escape)
|
|
199
|
+
- Touch/swipe gestures
|
|
200
|
+
- Automatic video controls
|
|
201
|
+
- Loading states
|
|
202
|
+
- Error handling
|
|
203
|
+
|
|
204
|
+
**Props:**
|
|
205
|
+
- `mediaObjects` (MediaFragment[]): Media array
|
|
206
|
+
- `currentIndex` (number): Starting position
|
|
207
|
+
- `isOpen` (boolean): Visibility state
|
|
208
|
+
|
|
209
|
+
**Events:**
|
|
210
|
+
- `close`: Lightbox closed
|
|
211
|
+
- `navigate`: Index changed
|
|
212
|
+
|
|
213
|
+
### MediaSlider
|
|
214
|
+
|
|
215
|
+
Touch-enabled media carousel for galleries.
|
|
216
|
+
|
|
217
|
+
```vue
|
|
218
|
+
<DesignSystemMoleculesMediaSlider
|
|
219
|
+
:media-objects="images"
|
|
220
|
+
:current-index="0"
|
|
221
|
+
@click="openLightbox"
|
|
222
|
+
/>
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
**Features:**
|
|
226
|
+
- Touch/swipe support
|
|
227
|
+
- Responsive image sizing
|
|
228
|
+
- Automatic thumbnail generation
|
|
229
|
+
- Click-to-expand integration
|
|
230
|
+
|
|
231
|
+
## Organisms
|
|
232
|
+
|
|
233
|
+
### TeaserCard
|
|
234
|
+
|
|
235
|
+
Content preview component with image and text.
|
|
236
|
+
|
|
237
|
+
```vue
|
|
238
|
+
<DesignSystemOrganismsTeaserCard
|
|
239
|
+
:image="teaserImage"
|
|
240
|
+
pretitle="Category"
|
|
241
|
+
title="Article Title"
|
|
242
|
+
subtitle="Subtitle"
|
|
243
|
+
text="Preview text..."
|
|
244
|
+
:link="'/article/slug'"
|
|
245
|
+
link-label="Read more"
|
|
246
|
+
color-scheme="light"
|
|
247
|
+
/>
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
**Props:**
|
|
251
|
+
- `image` (MediaFragment): Preview image
|
|
252
|
+
- `pretitle` (string): Category/tag
|
|
253
|
+
- `title` (string): Main heading
|
|
254
|
+
- `subtitle` (string): Secondary heading
|
|
255
|
+
- `text` (string): Description
|
|
256
|
+
- `link` (string): Target URL
|
|
257
|
+
- `linkLabel` (string): CTA text
|
|
258
|
+
- `colorScheme` (string): Theme variant
|
|
259
|
+
|
|
260
|
+
### ContentBlock
|
|
261
|
+
|
|
262
|
+
Flexible content container for rich text and media.
|
|
263
|
+
|
|
264
|
+
```vue
|
|
265
|
+
<DesignSystemOrganismsContentBlock
|
|
266
|
+
pretitle="Section"
|
|
267
|
+
title="Main Heading"
|
|
268
|
+
title-style="heading-2"
|
|
269
|
+
title-weight="bold"
|
|
270
|
+
subtitle="Subheading"
|
|
271
|
+
text="<p>Rich HTML content...</p>"
|
|
272
|
+
/>
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
**Features:**
|
|
276
|
+
- Semantic heading hierarchy
|
|
277
|
+
- Rich text support
|
|
278
|
+
- Flexible typography scaling
|
|
279
|
+
- Responsive spacing
|
|
280
|
+
|
|
281
|
+
## Composables
|
|
282
|
+
|
|
283
|
+
The design system includes several composables for enhanced functionality:
|
|
284
|
+
|
|
285
|
+
### useMediaLightbox
|
|
286
|
+
|
|
287
|
+
Manages lightbox state and media navigation.
|
|
288
|
+
|
|
289
|
+
```typescript
|
|
290
|
+
const { mediaObjects, openLightbox, closeLightbox } = useMediaLightbox()
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
### useCn
|
|
294
|
+
|
|
295
|
+
Utility for merging Tailwind classes.
|
|
296
|
+
|
|
297
|
+
```typescript
|
|
298
|
+
import cn from '@iqual/nuxt-icms/composables/useCn'
|
|
299
|
+
|
|
300
|
+
const classes = cn('base-class', conditionalClass && 'conditional', props.className)
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
### useIsMobile
|
|
304
|
+
|
|
305
|
+
Responsive design helper.
|
|
306
|
+
|
|
307
|
+
```typescript
|
|
308
|
+
const { isMobile } = useIsMobile()
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
## Styling Guidelines
|
|
312
|
+
|
|
313
|
+
### Color Schemes
|
|
314
|
+
|
|
315
|
+
The system supports four primary color schemes:
|
|
316
|
+
|
|
317
|
+
1. **None**: Default/transparent backgrounds
|
|
318
|
+
2. **Dark**: Dark theme with light text
|
|
319
|
+
3. **Light**: Light backgrounds with dark text
|
|
320
|
+
4. **Accent**: Brand colors and highlights
|
|
321
|
+
|
|
322
|
+
### Responsive Design
|
|
323
|
+
|
|
324
|
+
Components use container queries (`@container`) for intrinsic responsiveness:
|
|
325
|
+
|
|
326
|
+
```css
|
|
327
|
+
@container {
|
|
328
|
+
.component {
|
|
329
|
+
@apply flex-col;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
@container (min-width: 768px) {
|
|
334
|
+
.component {
|
|
335
|
+
@apply flex-row;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
### Typography
|
|
341
|
+
|
|
342
|
+
Semantic heading structure with utility classes:
|
|
343
|
+
|
|
344
|
+
- `heading-1` through `heading-6`: Semantic levels
|
|
345
|
+
- Font weights: `light`, `normal`, `medium`, `semibold`, `bold`
|
|
346
|
+
- Text alignment: `left`, `center`, `right`
|
|
347
|
+
|
|
348
|
+
### Spacing
|
|
349
|
+
|
|
350
|
+
Consistent spacing using Tailwind's spacing scale:
|
|
351
|
+
|
|
352
|
+
- Component padding: `p-6`, `p-16` for larger screens
|
|
353
|
+
- Component gaps: `gap-6`, `gap-16`
|
|
354
|
+
- Margin utilities: `mb-2`, `mb-4`, `mt-auto`
|
|
355
|
+
|
|
356
|
+
## Best Practices
|
|
357
|
+
|
|
358
|
+
### Component Development
|
|
359
|
+
|
|
360
|
+
1. **Use TypeScript interfaces** for prop definitions
|
|
361
|
+
2. **Implement Tailwind Variants** for consistent styling
|
|
362
|
+
3. **Support container queries** for responsive design
|
|
363
|
+
4. **Include accessibility attributes** (ARIA labels, semantic HTML)
|
|
364
|
+
5. **Handle loading and error states** for media components
|
|
365
|
+
|
|
366
|
+
### Performance
|
|
367
|
+
|
|
368
|
+
1. **Lazy load media** components when possible
|
|
369
|
+
2. **Use computed properties** for expensive calculations
|
|
370
|
+
3. **Implement proper image sizing** with `imageSizes` prop
|
|
371
|
+
4. **Minimize bundle size** with tree-shaking
|
|
372
|
+
|
|
373
|
+
### Accessibility
|
|
374
|
+
|
|
375
|
+
1. **Semantic HTML elements** (`button`, `nav`, `main`, etc.)
|
|
376
|
+
2. **ARIA labels and roles** for complex components
|
|
377
|
+
3. **Keyboard navigation** support
|
|
378
|
+
4. **Focus management** in modals and overlays
|
|
379
|
+
5. **Screen reader support** with proper text alternatives
|
|
380
|
+
|
|
381
|
+
### Maintainability
|
|
382
|
+
|
|
383
|
+
1. **Consistent naming conventions** (`PascalCase` for components)
|
|
384
|
+
2. **Comprehensive prop documentation** with TypeScript
|
|
385
|
+
3. **Reusable style variants** with Tailwind Variants
|
|
386
|
+
4. **Modular component architecture** following Atomic Design
|
|
387
|
+
|
|
388
|
+
## Usage Examples
|
|
389
|
+
|
|
390
|
+
### Basic Page Layout
|
|
391
|
+
|
|
392
|
+
```vue
|
|
393
|
+
<template>
|
|
394
|
+
<DesignSystemAtomsContainer>
|
|
395
|
+
<DesignSystemOrganismsContentBlock
|
|
396
|
+
title="Page Title"
|
|
397
|
+
title-style="heading-1"
|
|
398
|
+
text="<p>Page content...</p>"
|
|
399
|
+
/>
|
|
400
|
+
|
|
401
|
+
<DesignSystemAtomsGridRow :columns="3">
|
|
402
|
+
<DesignSystemMoleculesCard
|
|
403
|
+
v-for="item in items"
|
|
404
|
+
:key="item.id"
|
|
405
|
+
:title="item.title"
|
|
406
|
+
:text="item.description"
|
|
407
|
+
:image="item.image"
|
|
408
|
+
color-scheme="light"
|
|
409
|
+
/>
|
|
410
|
+
</DesignSystemAtomsGridRow>
|
|
411
|
+
</DesignSystemAtomsContainer>
|
|
412
|
+
</template>
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
### Interactive Gallery
|
|
416
|
+
|
|
417
|
+
```vue
|
|
418
|
+
<template>
|
|
419
|
+
<DesignSystemMoleculesMediaSlider
|
|
420
|
+
:media-objects="galleryImages"
|
|
421
|
+
@click="openLightbox"
|
|
422
|
+
/>
|
|
423
|
+
|
|
424
|
+
<DesignSystemMoleculesMediaLightbox
|
|
425
|
+
:media-objects="galleryImages"
|
|
426
|
+
:current-index="currentIndex"
|
|
427
|
+
:is-open="showLightbox"
|
|
428
|
+
@close="showLightbox = false"
|
|
429
|
+
@navigate="currentIndex = $event"
|
|
430
|
+
/>
|
|
431
|
+
</template>
|
|
432
|
+
|
|
433
|
+
<script setup>
|
|
434
|
+
const { mediaObjects, openLightbox } = useMediaLightbox()
|
|
435
|
+
const showLightbox = ref(false)
|
|
436
|
+
const currentIndex = ref(0)
|
|
437
|
+
|
|
438
|
+
const handleImageClick = (index: number) => {
|
|
439
|
+
currentIndex.value = index
|
|
440
|
+
showLightbox.value = true
|
|
441
|
+
}
|
|
442
|
+
</script>
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
### Button Variations
|
|
446
|
+
|
|
447
|
+
```vue
|
|
448
|
+
<template>
|
|
449
|
+
<div class="space-y-4">
|
|
450
|
+
<!-- Primary CTA -->
|
|
451
|
+
<DesignSystemAtomsButton
|
|
452
|
+
label="Get Started"
|
|
453
|
+
style="focus"
|
|
454
|
+
color-scheme="accent"
|
|
455
|
+
text-alignment="center"
|
|
456
|
+
/>
|
|
457
|
+
|
|
458
|
+
<!-- Secondary action -->
|
|
459
|
+
<DesignSystemAtomsButton
|
|
460
|
+
label="Learn More"
|
|
461
|
+
style="normal"
|
|
462
|
+
color-scheme="light"
|
|
463
|
+
/>
|
|
464
|
+
|
|
465
|
+
<!-- Minimal link -->
|
|
466
|
+
<DesignSystemAtomsButton
|
|
467
|
+
label="Skip this step"
|
|
468
|
+
style="minimal"
|
|
469
|
+
color-scheme="none"
|
|
470
|
+
/>
|
|
471
|
+
</div>
|
|
472
|
+
</template>
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
---
|
|
476
|
+
|
|
477
|
+
## Contributing
|
|
478
|
+
|
|
479
|
+
When adding new components:
|
|
480
|
+
|
|
481
|
+
1. Follow Atomic Design principles
|
|
482
|
+
2. Use TypeScript for all props and events
|
|
483
|
+
3. Implement Tailwind Variants for styling
|
|
484
|
+
4. Include comprehensive documentation
|
|
485
|
+
5. Add usage examples
|
|
486
|
+
6. Test across different screen sizes
|
|
487
|
+
7. Ensure accessibility compliance
|
|
488
|
+
|
|
489
|
+
For questions or contributions, refer to the project's main documentation or contact the development team.
|
|
@@ -20,7 +20,6 @@
|
|
|
20
20
|
:class="elementClass"
|
|
21
21
|
:loading="imageLoading"
|
|
22
22
|
/>
|
|
23
|
-
|
|
24
23
|
<figcaption v-if="showCaption && media?.caption"
|
|
25
24
|
v-text="media?.caption"
|
|
26
25
|
:class="figcaptionClass" />
|
|
@@ -28,9 +27,6 @@
|
|
|
28
27
|
</template>
|
|
29
28
|
|
|
30
29
|
<script lang="ts" setup>
|
|
31
|
-
import cn from '@iqual/nuxt-icms/composables/useCn'
|
|
32
|
-
import { checkDensities, parseDensities, parseSize, parseSizes } from '/node_modules/@nuxt/image/dist/runtime/utils'
|
|
33
|
-
import type { ImageOptions, ImageSizesOptions, CreateImageOptions, ResolvedImage, ImageCTX, $Img, ImageSizes, ImageSizesVariant } from '/node_modules/@nuxt/image/dist/runtime/types'
|
|
34
30
|
import type { MediaImageFragment } from '#graphql-operations'
|
|
35
31
|
|
|
36
32
|
const props = withDefaults(
|
|
@@ -51,165 +47,11 @@ const props = withDefaults(
|
|
|
51
47
|
},
|
|
52
48
|
)
|
|
53
49
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
const placeHolderImage = computed(() => {
|
|
60
|
-
return img(sourceImage, {format: 'webp', width: 100, blur: 100})
|
|
61
|
-
})
|
|
62
|
-
|
|
63
|
-
const imageSources = computed(() => {
|
|
64
|
-
const sources = []
|
|
65
|
-
const imgSizes = props.imageSizes ?? Object.keys(img.options.screens).map(key => `${key}:100vw`).join(' ');
|
|
66
|
-
|
|
67
|
-
// No aspect ratios provided.
|
|
68
|
-
if (!props?.imageAspectRatios) {
|
|
69
|
-
sources.push(img.getSizes(sourceImage, {
|
|
70
|
-
sizes: imgSizes,
|
|
71
|
-
modifiers: {
|
|
72
|
-
format: 'webp'
|
|
73
|
-
}
|
|
74
|
-
}));
|
|
75
|
-
return sources
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
// Aspect ratios provided.
|
|
79
|
-
const parsedAspectRatios = parseSizes(props?.imageAspectRatios)
|
|
80
|
-
const parsedImageSizes = parseSizes(imgSizes)
|
|
81
|
-
const densities = img.options.densities
|
|
82
|
-
const keys = Object.keys(parsedImageSizes);
|
|
83
|
-
const lastKey = keys[keys.length - 1];
|
|
84
|
-
|
|
85
|
-
for (const keyAspectRatios in parsedAspectRatios) {
|
|
86
|
-
const [l, h] = parsedAspectRatios[keyAspectRatios].split('/').map(Number);
|
|
87
|
-
const hwRatio = (l && h) ? h / l : 0
|
|
88
|
-
const sizeVariants = []
|
|
89
|
-
const srcsetVariants = []
|
|
90
|
-
|
|
91
|
-
let screenSizes = Object.keys(parsedImageSizes)
|
|
92
|
-
if (Object.keys(parsedImageSizes).includes(keyAspectRatios)) {
|
|
93
|
-
const minSizeIndex = Object.keys(parsedImageSizes).indexOf(keyAspectRatios)
|
|
94
|
-
screenSizes = Object.keys(parsedImageSizes).slice(minSizeIndex)
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
for (const index in screenSizes) {
|
|
98
|
-
const screenSize = screenSizes[index]
|
|
99
|
-
|
|
100
|
-
const variant = getSizesVariant(screenSize, String(parsedImageSizes[screenSize]), hwRatio)
|
|
101
|
-
if (variant === undefined) {
|
|
102
|
-
continue
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
// Add size variant with 'media'.
|
|
106
|
-
sizeVariants.push({
|
|
107
|
-
size: variant.size,
|
|
108
|
-
screenMaxWidth: variant.screenMaxWidth,
|
|
109
|
-
media: `(max-width: ${variant.screenMaxWidth}px)`,
|
|
110
|
-
})
|
|
111
|
-
|
|
112
|
-
// Add srcset variants and ignore densities (for current 'size' processed).
|
|
113
|
-
srcsetVariants.push({
|
|
114
|
-
width: variant._cWidth,
|
|
115
|
-
src: img(sourceImage, {
|
|
116
|
-
width: variant._cWidth ? variant._cWidth : undefined,
|
|
117
|
-
height: variant._cHeight ? variant._cHeight : undefined,
|
|
118
|
-
fit: 'cover',
|
|
119
|
-
format: 'webp'
|
|
120
|
-
}),
|
|
121
|
-
})
|
|
122
|
-
|
|
123
|
-
// Make sure to not create duplicate size variants for the same screen size.
|
|
124
|
-
if (keyAspectRatios != screenSize && Object.keys(parsedAspectRatios).includes(screenSize)) {
|
|
125
|
-
break
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
const media = sizeVariants.slice(-1)[0]?.media
|
|
130
|
-
finaliseSizeVariants(sizeVariants)
|
|
131
|
-
finaliseSrcsetVariants(srcsetVariants)
|
|
132
|
-
|
|
133
|
-
const sizesVal = sizeVariants.length ? sizeVariants.map(v => `${v.media ? v.media + ' ' : ''}${v.size}`).join(', ') : undefined
|
|
134
|
-
const suffix = sizesVal ? 'w' : 'x'
|
|
135
|
-
const srcsetVal = srcsetVariants.map(v => `${v.src} ${v.width}${suffix}`).join(', ')
|
|
136
|
-
|
|
137
|
-
let source = {
|
|
138
|
-
sizes: sizesVal,
|
|
139
|
-
srcset: srcsetVal,
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
if (keyAspectRatios != Object.keys(parsedAspectRatios).slice(-1)[0]) {
|
|
143
|
-
source.media = media
|
|
144
|
-
}
|
|
145
|
-
sources.push(source)
|
|
146
|
-
}
|
|
147
|
-
return sources
|
|
50
|
+
const { placeHolderImage, imageSources } = useImageSources({
|
|
51
|
+
media: toRef(props, 'media'),
|
|
52
|
+
imageAspectRatios: toRef(props, 'imageAspectRatios'),
|
|
53
|
+
imageSizes: toRef(props, 'imageSizes'),
|
|
148
54
|
})
|
|
149
55
|
|
|
150
|
-
// Helper function, copied from NuxtImage.
|
|
151
|
-
function getSizesVariant(key: string, size: string, hwRatio: number): ImageSizesVariant | undefined {
|
|
152
|
-
const screenMaxWidth = (img.options.screens && img.options.screens[key]) || Number.parseInt(key)
|
|
153
|
-
const isFluid = size.endsWith('vw')
|
|
154
|
-
if (!isFluid && /^\d+$/.test(size)) {
|
|
155
|
-
size = size + 'px'
|
|
156
|
-
}
|
|
157
|
-
if (!isFluid && !size.endsWith('px')) {
|
|
158
|
-
return undefined
|
|
159
|
-
}
|
|
160
|
-
let _cWidth = Number.parseInt(size)
|
|
161
|
-
if (!screenMaxWidth || !_cWidth) {
|
|
162
|
-
return undefined
|
|
163
|
-
}
|
|
164
|
-
if (isFluid) {
|
|
165
|
-
_cWidth = Math.round((_cWidth / 100) * screenMaxWidth)
|
|
166
|
-
}
|
|
167
|
-
const _cHeight = Math.round(_cWidth * hwRatio)
|
|
168
|
-
return {
|
|
169
|
-
size,
|
|
170
|
-
screenMaxWidth,
|
|
171
|
-
_cWidth,
|
|
172
|
-
_cHeight,
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
// Helper function, copied from NuxtImage.
|
|
177
|
-
function finaliseSizeVariants(sizeVariants: any[]) {
|
|
178
|
-
sizeVariants.sort((v1, v2) => v1.screenMaxWidth - v2.screenMaxWidth)
|
|
179
|
-
|
|
180
|
-
// de-duplicate size variants (by key `media`)
|
|
181
|
-
let previousMedia = null
|
|
182
|
-
for (let i = sizeVariants.length - 1; i >= 0; i--) {
|
|
183
|
-
const sizeVariant = sizeVariants[i]
|
|
184
|
-
if (sizeVariant.media === previousMedia) {
|
|
185
|
-
sizeVariants.splice(i, 1)
|
|
186
|
-
}
|
|
187
|
-
previousMedia = sizeVariant.media
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
for (let i = 0; i < sizeVariants.length; i++) {
|
|
191
|
-
sizeVariants[i].media = sizeVariants[i + 1]?.media || ''
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
// Helper function, copied from NuxtImage.
|
|
196
|
-
function finaliseSrcsetVariants(srcsetVariants: any[]) {
|
|
197
|
-
// sort by width
|
|
198
|
-
srcsetVariants.sort((v1, v2) => v1.width - v2.width)
|
|
199
|
-
|
|
200
|
-
// de-duplicate srcset variants (by key `width`)
|
|
201
|
-
let previousWidth = null
|
|
202
|
-
for (let i = srcsetVariants.length - 1; i >= 0; i--) {
|
|
203
|
-
const sizeVariant = srcsetVariants[i]
|
|
204
|
-
if (sizeVariant.width === previousWidth) {
|
|
205
|
-
srcsetVariants.splice(i, 1)
|
|
206
|
-
}
|
|
207
|
-
previousWidth = sizeVariant.width
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
|
|
211
56
|
</script>
|
|
212
57
|
|
|
213
|
-
<style scoped>
|
|
214
|
-
|
|
215
|
-
</style>
|
|
@@ -7,19 +7,19 @@
|
|
|
7
7
|
:title="media?.title"
|
|
8
8
|
allow="autoplay; encrypted-media; picture-in-picture"
|
|
9
9
|
allowfullscreen
|
|
10
|
-
class="aspect-video w-full
|
|
10
|
+
class="aspect-video w-full"
|
|
11
11
|
:class="elementClass"
|
|
12
12
|
/>
|
|
13
13
|
|
|
14
14
|
<button
|
|
15
15
|
v-if="!isPlaying"
|
|
16
|
-
class="relative flex aspect-video w-full cursor-pointer items-center justify-center
|
|
16
|
+
class="relative flex aspect-video w-full cursor-pointer items-center justify-center"
|
|
17
|
+
:class="elementClass"
|
|
17
18
|
@click.prevent="isPlaying = true"
|
|
18
19
|
>
|
|
19
20
|
<img
|
|
20
21
|
:src="thumbnailUrl"
|
|
21
22
|
class="absolute left-0 top-0 aspect-video size-full object-cover"
|
|
22
|
-
:class="elementClass"
|
|
23
23
|
:alt="thumbnailAlt"
|
|
24
24
|
/>
|
|
25
25
|
|