@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.
Files changed (418) hide show
  1. package/assets/css/ckeditor.css +4 -0
  2. package/assets/css/components/container.css +2 -2
  3. package/assets/css/tailwind.css +1 -1
  4. package/assets/css/typography.css +4 -0
  5. package/assets/symbols/download.svg +3 -0
  6. package/bundles.ts +4 -1
  7. package/components/Blokkli/TextMedia/index.vue +1 -2
  8. package/components/DesignSystem/Atoms/Caption.vue +15 -0
  9. package/components/DesignSystem/Atoms/LinkListItem.vue +21 -0
  10. package/components/DesignSystem/Molecules/MediaLightbox.vue +273 -0
  11. package/components/DesignSystem/Molecules/MediaSlider.vue +33 -22
  12. package/components/DesignSystem/Organisms/Map.vue +61 -0
  13. package/components/DesignSystem/README.md +489 -0
  14. package/components/Media/Image/index.vue +4 -162
  15. package/components/Media/RemoteVideo/index.vue +3 -3
  16. package/components/Node/Icms/Page/SearchResult/fragment.graphql +8 -0
  17. package/components/Node/Icms/Page/SearchResult/index.vue +12 -0
  18. package/components/Node/Icms/Page/Teaser/fragment.graphql +17 -0
  19. package/components/Node/Icms/Page/Teaser/index.vue +20 -0
  20. package/components/Node/Icms/Page/fragment.graphql +18 -0
  21. package/components/Node/Icms/Page/index.vue +5 -3
  22. package/components/Paragraph/CallToAction/index.vue +12 -8
  23. package/components/Paragraph/Card/Layout/index.vue +2 -2
  24. package/components/Paragraph/Contact/index.vue +1 -2
  25. package/components/Paragraph/Downloads/index.vue +4 -16
  26. package/components/Paragraph/FAQ/Layout/index.vue +24 -3
  27. package/components/Paragraph/FlipTeasers/index.vue +2 -2
  28. package/components/Paragraph/Gallery/index.vue +35 -172
  29. package/components/Paragraph/HeroImage/index.vue +13 -4
  30. package/components/Paragraph/IconText/Layout/index.vue +1 -2
  31. package/components/Paragraph/Media/index.vue +7 -2
  32. package/components/Paragraph/Table/index.vue +2 -2
  33. package/components/Paragraph/Team/Layout/index.vue +2 -2
  34. package/components/Paragraph/Teasers/fragment.graphql +2 -15
  35. package/components/Paragraph/Teasers/index.vue +12 -15
  36. package/components/Paragraph/TextMedia/index.vue +40 -33
  37. package/components/Paragraph/Timeline/Element/index.vue +1 -1
  38. package/components/Paragraph/Timeline/Layout/fragment.graphql +1 -0
  39. package/components/Paragraph/Timeline/Layout/index.vue +9 -6
  40. package/components/Paragraph/iFrame/index.vue +16 -2
  41. package/components/Search/Facets/FacetDropdownUI.vue +222 -0
  42. package/components/Search/Facets/FacetedSearchUI.vue +397 -0
  43. package/components/Search/Facets/fragment.graphql +40 -0
  44. package/components/Section/Footer/index.vue +15 -14
  45. package/components/Section/Header/GlobalMenu.vue +34 -34
  46. package/components/Section/Header/LanguageDropdown.vue +60 -73
  47. package/components/Section/Header/LanguageSwitcher.vue +37 -0
  48. package/components/Section/Header/MetaMenu.vue +27 -20
  49. package/components/Section/Header/index.vue +91 -79
  50. package/components/ui/accordion/Accordion.vue +2 -2
  51. package/components/ui/accordion/AccordionContent.vue +5 -5
  52. package/components/ui/accordion/AccordionItem.vue +9 -10
  53. package/components/ui/accordion/AccordionTrigger.vue +5 -5
  54. package/components/ui/alert/Alert.vue +17 -0
  55. package/components/ui/alert/AlertDescription.vue +14 -0
  56. package/components/ui/alert/AlertTitle.vue +14 -0
  57. package/components/ui/alert/index.ts +24 -0
  58. package/components/ui/alert-dialog/AlertDialog.vue +15 -0
  59. package/components/ui/alert-dialog/AlertDialogAction.vue +22 -0
  60. package/components/ui/alert-dialog/AlertDialogCancel.vue +29 -0
  61. package/components/ui/alert-dialog/AlertDialogContent.vue +43 -0
  62. package/components/ui/alert-dialog/AlertDialogDescription.vue +27 -0
  63. package/components/ui/alert-dialog/AlertDialogFooter.vue +21 -0
  64. package/components/ui/alert-dialog/AlertDialogHeader.vue +16 -0
  65. package/components/ui/alert-dialog/AlertDialogTitle.vue +24 -0
  66. package/components/ui/alert-dialog/AlertDialogTrigger.vue +12 -0
  67. package/components/ui/alert-dialog/index.ts +9 -0
  68. package/components/ui/aspect-ratio/AspectRatio.vue +12 -0
  69. package/components/ui/aspect-ratio/index.ts +1 -0
  70. package/components/ui/auto-form/AutoForm.vue +106 -0
  71. package/components/ui/auto-form/AutoFormField.vue +45 -0
  72. package/components/ui/auto-form/AutoFormFieldArray.vue +110 -0
  73. package/components/ui/auto-form/AutoFormFieldBoolean.vue +41 -0
  74. package/components/ui/auto-form/AutoFormFieldDate.vue +57 -0
  75. package/components/ui/auto-form/AutoFormFieldEnum.vue +49 -0
  76. package/components/ui/auto-form/AutoFormFieldFile.vue +74 -0
  77. package/components/ui/auto-form/AutoFormFieldInput.vue +36 -0
  78. package/components/ui/auto-form/AutoFormFieldNumber.vue +32 -0
  79. package/components/ui/auto-form/AutoFormFieldObject.vue +78 -0
  80. package/components/ui/auto-form/AutoFormLabel.vue +14 -0
  81. package/components/ui/auto-form/constant.ts +40 -0
  82. package/components/ui/auto-form/dependencies.ts +93 -0
  83. package/components/ui/auto-form/index.ts +15 -0
  84. package/components/ui/auto-form/interface.ts +95 -0
  85. package/components/ui/auto-form/utils.ts +188 -0
  86. package/components/ui/avatar/Avatar.vue +22 -0
  87. package/components/ui/avatar/AvatarFallback.vue +12 -0
  88. package/components/ui/avatar/AvatarImage.vue +10 -0
  89. package/components/ui/avatar/index.ts +25 -0
  90. package/components/ui/badge/Badge.vue +17 -0
  91. package/components/ui/badge/index.ts +26 -0
  92. package/components/ui/breadcrumb/Breadcrumb.vue +13 -0
  93. package/components/ui/breadcrumb/BreadcrumbEllipsis.vue +22 -0
  94. package/components/ui/breadcrumb/BreadcrumbItem.vue +16 -0
  95. package/components/ui/breadcrumb/BreadcrumbLink.vue +20 -0
  96. package/components/ui/breadcrumb/BreadcrumbList.vue +16 -0
  97. package/components/ui/breadcrumb/BreadcrumbPage.vue +19 -0
  98. package/components/ui/breadcrumb/BreadcrumbSeparator.vue +21 -0
  99. package/components/ui/breadcrumb/index.ts +7 -0
  100. package/components/ui/button/Button.vue +4 -2
  101. package/components/ui/button/index.ts +9 -9
  102. package/components/ui/calendar/Calendar.vue +62 -0
  103. package/components/ui/calendar/CalendarCell.vue +26 -0
  104. package/components/ui/calendar/CalendarCellTrigger.vue +40 -0
  105. package/components/ui/calendar/CalendarGrid.vue +26 -0
  106. package/components/ui/calendar/CalendarGridBody.vue +12 -0
  107. package/components/ui/calendar/CalendarGridHead.vue +12 -0
  108. package/components/ui/calendar/CalendarGridRow.vue +23 -0
  109. package/components/ui/calendar/CalendarHeadCell.vue +23 -0
  110. package/components/ui/calendar/CalendarHeader.vue +23 -0
  111. package/components/ui/calendar/CalendarHeading.vue +33 -0
  112. package/components/ui/calendar/CalendarNextButton.vue +34 -0
  113. package/components/ui/calendar/CalendarPrevButton.vue +34 -0
  114. package/components/ui/calendar/index.ts +12 -0
  115. package/components/ui/card/Card.vue +21 -0
  116. package/components/ui/card/CardContent.vue +14 -0
  117. package/components/ui/card/CardDescription.vue +14 -0
  118. package/components/ui/card/CardFooter.vue +14 -0
  119. package/components/ui/card/CardHeader.vue +14 -0
  120. package/components/ui/card/CardTitle.vue +18 -0
  121. package/components/ui/card/index.ts +6 -0
  122. package/components/ui/carousel/Carousel.vue +3 -23
  123. package/components/ui/carousel/CarouselContent.vue +1 -2
  124. package/components/ui/carousel/CarouselItem.vue +5 -7
  125. package/components/ui/carousel/CarouselNext.vue +7 -9
  126. package/components/ui/carousel/CarouselPrevious.vue +7 -9
  127. package/components/ui/carousel/index.ts +3 -1
  128. package/components/ui/carousel/interface.ts +3 -1
  129. package/components/ui/carousel/useCarousel.ts +13 -23
  130. package/components/ui/chart/ChartCrosshair.vue +45 -0
  131. package/components/ui/chart/ChartLegend.vue +50 -0
  132. package/components/ui/chart/ChartSingleTooltip.vue +64 -0
  133. package/components/ui/chart/ChartTooltip.vue +40 -0
  134. package/components/ui/chart/index.ts +18 -0
  135. package/components/ui/chart/interface.ts +64 -0
  136. package/components/ui/chart-area/AreaChart.vue +141 -0
  137. package/components/ui/chart-area/index.ts +66 -0
  138. package/components/ui/chart-bar/BarChart.vue +116 -0
  139. package/components/ui/chart-bar/index.ts +66 -0
  140. package/components/ui/chart-donut/DonutChart.vue +101 -0
  141. package/components/ui/chart-donut/index.ts +39 -0
  142. package/components/ui/chart-line/LineChart.vue +107 -0
  143. package/components/ui/chart-line/index.ts +66 -0
  144. package/components/ui/checkbox/Checkbox.vue +1 -1
  145. package/components/ui/collapsible/Collapsible.vue +15 -0
  146. package/components/ui/collapsible/CollapsibleContent.vue +12 -0
  147. package/components/ui/collapsible/CollapsibleTrigger.vue +12 -0
  148. package/components/ui/collapsible/index.ts +3 -0
  149. package/components/ui/command/Command.vue +31 -0
  150. package/components/ui/command/CommandDialog.vue +21 -0
  151. package/components/ui/command/CommandEmpty.vue +21 -0
  152. package/components/ui/command/CommandGroup.vue +30 -0
  153. package/components/ui/command/CommandInput.vue +35 -0
  154. package/components/ui/command/CommandItem.vue +27 -0
  155. package/components/ui/command/CommandList.vue +28 -0
  156. package/components/ui/command/CommandSeparator.vue +24 -0
  157. package/components/ui/command/CommandShortcut.vue +14 -0
  158. package/components/ui/command/index.ts +9 -0
  159. package/components/ui/context-menu/ContextMenu.vue +15 -0
  160. package/components/ui/context-menu/ContextMenuCheckboxItem.vue +41 -0
  161. package/components/ui/context-menu/ContextMenuContent.vue +37 -0
  162. package/components/ui/context-menu/ContextMenuGroup.vue +12 -0
  163. package/components/ui/context-menu/ContextMenuItem.vue +35 -0
  164. package/components/ui/context-menu/ContextMenuLabel.vue +27 -0
  165. package/components/ui/context-menu/ContextMenuPortal.vue +12 -0
  166. package/components/ui/context-menu/ContextMenuRadioGroup.vue +19 -0
  167. package/components/ui/context-menu/ContextMenuRadioItem.vue +41 -0
  168. package/components/ui/context-menu/ContextMenuSeparator.vue +22 -0
  169. package/components/ui/context-menu/ContextMenuShortcut.vue +14 -0
  170. package/components/ui/context-menu/ContextMenuSub.vue +19 -0
  171. package/components/ui/context-menu/ContextMenuSubContent.vue +36 -0
  172. package/components/ui/context-menu/ContextMenuSubTrigger.vue +36 -0
  173. package/components/ui/context-menu/ContextMenuTrigger.vue +14 -0
  174. package/components/ui/context-menu/index.ts +14 -0
  175. package/components/ui/dialog/Dialog.vue +2 -6
  176. package/components/ui/dialog/DialogClose.vue +2 -1
  177. package/components/ui/dialog/DialogContent.vue +10 -12
  178. package/components/ui/dialog/DialogDescription.vue +6 -10
  179. package/components/ui/dialog/DialogScrollContent.vue +15 -21
  180. package/components/ui/dialog/DialogTitle.vue +9 -6
  181. package/components/ui/dialog/DialogTrigger.vue +2 -1
  182. package/components/ui/drawer/Drawer.vue +19 -0
  183. package/components/ui/drawer/DrawerContent.vue +28 -0
  184. package/components/ui/drawer/DrawerDescription.vue +21 -0
  185. package/components/ui/drawer/DrawerFooter.vue +14 -0
  186. package/components/ui/drawer/DrawerHeader.vue +14 -0
  187. package/components/ui/drawer/DrawerOverlay.vue +19 -0
  188. package/components/ui/drawer/DrawerTitle.vue +21 -0
  189. package/components/ui/drawer/index.ts +8 -0
  190. package/components/ui/dropdown-menu/DropdownMenu.vue +15 -0
  191. package/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +41 -0
  192. package/components/ui/dropdown-menu/DropdownMenuContent.vue +39 -0
  193. package/components/ui/dropdown-menu/DropdownMenuGroup.vue +12 -0
  194. package/components/ui/dropdown-menu/DropdownMenuItem.vue +30 -0
  195. package/components/ui/dropdown-menu/DropdownMenuLabel.vue +26 -0
  196. package/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue +19 -0
  197. package/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +42 -0
  198. package/components/ui/dropdown-menu/DropdownMenuSeparator.vue +24 -0
  199. package/components/ui/dropdown-menu/DropdownMenuShortcut.vue +14 -0
  200. package/components/ui/dropdown-menu/DropdownMenuSub.vue +19 -0
  201. package/components/ui/dropdown-menu/DropdownMenuSubContent.vue +31 -0
  202. package/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +35 -0
  203. package/components/ui/dropdown-menu/DropdownMenuTrigger.vue +14 -0
  204. package/components/ui/dropdown-menu/index.ts +16 -0
  205. package/components/ui/form/FormControl.vue +16 -0
  206. package/components/ui/form/FormDescription.vue +20 -0
  207. package/components/ui/form/FormItem.vue +20 -0
  208. package/components/ui/form/FormLabel.vue +23 -0
  209. package/components/ui/form/FormMessage.vue +16 -0
  210. package/components/ui/form/index.ts +7 -0
  211. package/components/ui/form/injectionKeys.ts +4 -0
  212. package/components/ui/form/useFormField.ts +30 -0
  213. package/components/ui/hover-card/HoverCard.vue +15 -0
  214. package/components/ui/hover-card/HoverCardContent.vue +43 -0
  215. package/components/ui/hover-card/HoverCardTrigger.vue +12 -0
  216. package/components/ui/hover-card/index.ts +3 -0
  217. package/components/ui/input/Input.vue +1 -1
  218. package/components/ui/menubar/Menubar.vue +36 -0
  219. package/components/ui/menubar/MenubarCheckboxItem.vue +41 -0
  220. package/components/ui/menubar/MenubarContent.vue +45 -0
  221. package/components/ui/menubar/MenubarGroup.vue +12 -0
  222. package/components/ui/menubar/MenubarItem.vue +36 -0
  223. package/components/ui/menubar/MenubarLabel.vue +14 -0
  224. package/components/ui/menubar/MenubarMenu.vue +12 -0
  225. package/components/ui/menubar/MenubarRadioGroup.vue +20 -0
  226. package/components/ui/menubar/MenubarRadioItem.vue +41 -0
  227. package/components/ui/menubar/MenubarSeparator.vue +21 -0
  228. package/components/ui/menubar/MenubarShortcut.vue +14 -0
  229. package/components/ui/menubar/MenubarSub.vue +20 -0
  230. package/components/ui/menubar/MenubarSubContent.vue +40 -0
  231. package/components/ui/menubar/MenubarSubTrigger.vue +32 -0
  232. package/components/ui/menubar/MenubarTrigger.vue +31 -0
  233. package/components/ui/menubar/index.ts +15 -0
  234. package/components/ui/navigation-menu/NavigationMenu.vue +34 -0
  235. package/components/ui/navigation-menu/NavigationMenuContent.vue +35 -0
  236. package/components/ui/navigation-menu/NavigationMenuIndicator.vue +26 -0
  237. package/components/ui/navigation-menu/NavigationMenuItem.vue +12 -0
  238. package/components/ui/navigation-menu/NavigationMenuLink.vue +19 -0
  239. package/components/ui/navigation-menu/NavigationMenuList.vue +31 -0
  240. package/components/ui/navigation-menu/NavigationMenuTrigger.vue +36 -0
  241. package/components/ui/navigation-menu/NavigationMenuViewport.vue +35 -0
  242. package/components/ui/navigation-menu/index.ts +14 -0
  243. package/components/ui/number-field/NumberField.vue +24 -0
  244. package/components/ui/number-field/NumberFieldContent.vue +14 -0
  245. package/components/ui/number-field/NumberFieldDecrement.vue +26 -0
  246. package/components/ui/number-field/NumberFieldIncrement.vue +26 -0
  247. package/components/ui/number-field/NumberFieldInput.vue +16 -0
  248. package/components/ui/number-field/index.ts +5 -0
  249. package/components/ui/pagination/PaginationEllipsis.vue +24 -0
  250. package/components/ui/pagination/PaginationFirst.vue +31 -0
  251. package/components/ui/pagination/PaginationLast.vue +31 -0
  252. package/components/ui/pagination/PaginationNext.vue +31 -0
  253. package/components/ui/pagination/PaginationPrev.vue +31 -0
  254. package/components/ui/pagination/index.ts +10 -0
  255. package/components/ui/pin-input/PinInput.vue +25 -0
  256. package/components/ui/pin-input/PinInputGroup.vue +20 -0
  257. package/components/ui/pin-input/PinInputInput.vue +20 -0
  258. package/components/ui/pin-input/PinInputSeparator.vue +16 -0
  259. package/components/ui/pin-input/index.ts +4 -0
  260. package/components/ui/popover/Popover.vue +15 -0
  261. package/components/ui/popover/PopoverContent.vue +49 -0
  262. package/components/ui/popover/PopoverTrigger.vue +12 -0
  263. package/components/ui/popover/index.ts +3 -0
  264. package/components/ui/progress/Progress.vue +41 -0
  265. package/components/ui/progress/index.ts +1 -0
  266. package/components/ui/radio-group/RadioGroupItem.vue +1 -1
  267. package/components/ui/range-calendar/RangeCalendar.vue +62 -0
  268. package/components/ui/range-calendar/RangeCalendarCell.vue +26 -0
  269. package/components/ui/range-calendar/RangeCalendarCellTrigger.vue +42 -0
  270. package/components/ui/range-calendar/RangeCalendarGrid.vue +26 -0
  271. package/components/ui/range-calendar/RangeCalendarGridBody.vue +12 -0
  272. package/components/ui/range-calendar/RangeCalendarGridHead.vue +12 -0
  273. package/components/ui/range-calendar/RangeCalendarGridRow.vue +23 -0
  274. package/components/ui/range-calendar/RangeCalendarHeadCell.vue +23 -0
  275. package/components/ui/range-calendar/RangeCalendarHeader.vue +23 -0
  276. package/components/ui/range-calendar/RangeCalendarHeading.vue +33 -0
  277. package/components/ui/range-calendar/RangeCalendarNextButton.vue +34 -0
  278. package/components/ui/range-calendar/RangeCalendarPrevButton.vue +34 -0
  279. package/components/ui/range-calendar/index.ts +12 -0
  280. package/components/ui/resizable/ResizableHandle.vue +28 -0
  281. package/components/ui/resizable/ResizablePanelGroup.vue +23 -0
  282. package/components/ui/resizable/index.ts +3 -0
  283. package/components/ui/scroll-area/ScrollArea.vue +31 -0
  284. package/components/ui/scroll-area/ScrollBar.vue +32 -0
  285. package/components/ui/scroll-area/index.ts +2 -0
  286. package/components/ui/select/SelectContent.vue +1 -1
  287. package/components/ui/select/SelectItem.vue +1 -1
  288. package/components/ui/select/SelectSeparator.vue +1 -1
  289. package/components/ui/select/SelectTrigger.vue +1 -1
  290. package/components/ui/separator/Separator.vue +37 -0
  291. package/components/ui/separator/index.ts +1 -0
  292. package/components/ui/sheet/Sheet.vue +15 -0
  293. package/components/ui/sheet/SheetClose.vue +12 -0
  294. package/components/ui/sheet/SheetContent.vue +58 -0
  295. package/components/ui/sheet/SheetDescription.vue +24 -0
  296. package/components/ui/sheet/SheetFooter.vue +19 -0
  297. package/components/ui/sheet/SheetHeader.vue +16 -0
  298. package/components/ui/sheet/SheetTitle.vue +24 -0
  299. package/components/ui/sheet/SheetTrigger.vue +12 -0
  300. package/components/ui/sheet/index.ts +32 -0
  301. package/components/ui/sidebar/Sidebar.vue +85 -0
  302. package/components/ui/sidebar/SidebarContent.vue +17 -0
  303. package/components/ui/sidebar/SidebarFooter.vue +17 -0
  304. package/components/ui/sidebar/SidebarGroup.vue +17 -0
  305. package/components/ui/sidebar/SidebarGroupAction.vue +26 -0
  306. package/components/ui/sidebar/SidebarGroupContent.vue +17 -0
  307. package/components/ui/sidebar/SidebarGroupLabel.vue +24 -0
  308. package/components/ui/sidebar/SidebarHeader.vue +17 -0
  309. package/components/ui/sidebar/SidebarInput.vue +21 -0
  310. package/components/ui/sidebar/SidebarInset.vue +20 -0
  311. package/components/ui/sidebar/SidebarMenu.vue +17 -0
  312. package/components/ui/sidebar/SidebarMenuAction.vue +34 -0
  313. package/components/ui/sidebar/SidebarMenuBadge.vue +25 -0
  314. package/components/ui/sidebar/SidebarMenuButton.vue +51 -0
  315. package/components/ui/sidebar/SidebarMenuButtonChild.vue +35 -0
  316. package/components/ui/sidebar/SidebarMenuItem.vue +17 -0
  317. package/components/ui/sidebar/SidebarMenuSkeleton.vue +34 -0
  318. package/components/ui/sidebar/SidebarMenuSub.vue +21 -0
  319. package/components/ui/sidebar/SidebarMenuSubButton.vue +35 -0
  320. package/components/ui/sidebar/SidebarMenuSubItem.vue +8 -0
  321. package/components/ui/sidebar/SidebarProvider.vue +81 -0
  322. package/components/ui/sidebar/SidebarRail.vue +32 -0
  323. package/components/ui/sidebar/SidebarSeparator.vue +18 -0
  324. package/components/ui/sidebar/SidebarTrigger.vue +26 -0
  325. package/components/ui/sidebar/index.ts +60 -0
  326. package/components/ui/sidebar/utils.ts +19 -0
  327. package/components/ui/skeleton/Skeleton.vue +14 -0
  328. package/components/ui/skeleton/index.ts +1 -0
  329. package/components/ui/slider/Slider.vue +37 -0
  330. package/components/ui/slider/index.ts +1 -0
  331. package/components/ui/sonner/Sonner.vue +23 -0
  332. package/components/ui/sonner/index.ts +1 -0
  333. package/components/ui/stepper/Stepper.vue +32 -0
  334. package/components/ui/stepper/StepperDescription.vue +24 -0
  335. package/components/ui/stepper/StepperIndicator.vue +36 -0
  336. package/components/ui/stepper/StepperItem.vue +28 -0
  337. package/components/ui/stepper/StepperSeparator.vue +32 -0
  338. package/components/ui/stepper/StepperTitle.vue +24 -0
  339. package/components/ui/stepper/StepperTrigger.vue +27 -0
  340. package/components/ui/stepper/index.ts +7 -0
  341. package/components/ui/switch/Switch.vue +40 -0
  342. package/components/ui/switch/index.ts +1 -0
  343. package/components/ui/table/Table.vue +16 -0
  344. package/components/ui/table/TableBody.vue +14 -0
  345. package/components/ui/table/TableCaption.vue +14 -0
  346. package/components/ui/table/TableCell.vue +21 -0
  347. package/components/ui/table/TableEmpty.vue +38 -0
  348. package/components/ui/table/TableFooter.vue +14 -0
  349. package/components/ui/table/TableHead.vue +14 -0
  350. package/components/ui/table/TableHeader.vue +14 -0
  351. package/components/ui/table/TableRow.vue +14 -0
  352. package/components/ui/table/index.ts +9 -0
  353. package/components/ui/tabs/TabsContent.vue +6 -11
  354. package/components/ui/tabs/TabsList.vue +8 -8
  355. package/components/ui/tabs/TabsTrigger.vue +9 -11
  356. package/components/ui/tags-input/TagsInput.vue +24 -0
  357. package/components/ui/tags-input/TagsInputInput.vue +21 -0
  358. package/components/ui/tags-input/TagsInputItem.vue +24 -0
  359. package/components/ui/tags-input/TagsInputItemDelete.vue +26 -0
  360. package/components/ui/tags-input/TagsInputItemText.vue +21 -0
  361. package/components/ui/tags-input/index.ts +5 -0
  362. package/components/ui/textarea/Textarea.vue +1 -1
  363. package/components/ui/toast/Toast.vue +30 -0
  364. package/components/ui/toast/ToastAction.vue +21 -0
  365. package/components/ui/toast/ToastClose.vue +24 -0
  366. package/components/ui/toast/ToastDescription.vue +21 -0
  367. package/components/ui/toast/ToastProvider.vue +12 -0
  368. package/components/ui/toast/ToastTitle.vue +21 -0
  369. package/components/ui/toast/ToastViewport.vue +19 -0
  370. package/components/ui/toast/Toaster.vue +30 -0
  371. package/components/ui/toast/index.ts +39 -0
  372. package/components/ui/toast/use-toast.ts +165 -0
  373. package/components/ui/toggle/Toggle.vue +38 -0
  374. package/components/ui/toggle/index.ts +28 -0
  375. package/components/ui/toggle-group/ToggleGroup.vue +36 -0
  376. package/components/ui/toggle-group/ToggleGroupItem.vue +37 -0
  377. package/components/ui/toggle-group/index.ts +2 -0
  378. package/components/ui/tooltip/Tooltip.vue +15 -0
  379. package/components/ui/tooltip/TooltipContent.vue +33 -0
  380. package/components/ui/tooltip/TooltipProvider.vue +12 -0
  381. package/components/ui/tooltip/TooltipTrigger.vue +12 -0
  382. package/components/ui/tooltip/index.ts +4 -0
  383. package/components/ui/v-calendar/Calendar.vue +343 -0
  384. package/components/ui/v-calendar/index.ts +22 -0
  385. package/composables/useAccordionScroll.ts +1 -1
  386. package/composables/useContentSearch.ts +0 -0
  387. package/composables/useGlobalConfig.ts +57 -0
  388. package/composables/useGraphqlCacheability.ts +22 -0
  389. package/composables/useImageSources.ts +208 -0
  390. package/composables/useInitData.ts +20 -112
  391. package/composables/useMediaLightbox.ts +114 -0
  392. package/composables/useMenu.ts +66 -0
  393. package/composables/useMessageBus.ts +74 -0
  394. package/composables/useNavigationOffset.ts +1 -1
  395. package/layouts/default.vue +2 -2
  396. package/layouts/error.vue +8 -10
  397. package/modules/dynamicEntityComponentResolver.ts +162 -0
  398. package/modules/dynamicParagraphResolver.ts +1 -1
  399. package/nuxt.config.ts +11 -22
  400. package/package.json +2 -2
  401. package/pages/[...slug]/index.vue +2 -2
  402. package/pages/index.vue +2 -2
  403. package/pages/node/[nid]/index.vue +2 -2
  404. package/plugins/graphqlMiddleware.ts +27 -68
  405. package/plugins/initData.ts +105 -0
  406. package/queries/query.contentSearch.graphql +17 -0
  407. package/{composables → queries}/query.initData.graphql +2 -8
  408. package/queries/query.loadTranslations.graphql +5 -0
  409. package/tailwind.config.ts +1 -0
  410. package/types/initData.ts +1 -0
  411. package/components/Section/Header/SearchLink.vue +0 -26
  412. package/composables/languageLinks.ts +0 -31
  413. package/composables/useMainMenuLinks.ts +0 -69
  414. package/composables/useMetaMenuLinks.ts +0 -44
  415. package/modules/dynamicNodeResolver.ts +0 -95
  416. package/pages/search/index.vue +0 -69
  417. package/pages/static-page/example.vue +0 -40
  418. 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
- // Get the data.
55
- const img = useImage()
56
- const baseUrl = useRuntimeConfig().public.imageBaseUrl
57
- const sourceImage = baseUrl + props?.media?.sourceUrl?.path
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 md:px-40 lg:px-0"
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 md:px-40 lg:px-0"
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
 
@@ -0,0 +1,8 @@
1
+ fragment nodeIcmsPageSearchResult on NodeIcmsPage {
2
+ id
3
+ title: label
4
+ description: body
5
+ link: url {
6
+ path
7
+ }
8
+ }