@brumaombra/ui-vintage 0.9.0 → 0.9.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 (337) hide show
  1. package/AGENTS.md +1 -1
  2. package/COMPONENTS.md +1 -1
  3. package/README.md +3 -3
  4. package/module.mjs +43 -43
  5. package/package.json +175 -175
  6. package/src/components/background-grid/BackgroundGrid.vue +4 -4
  7. package/src/components/blog/AllPostsSection.vue +33 -33
  8. package/src/components/blog/BlogContentRenderer.vue +111 -111
  9. package/src/components/blog/BlogFAQSection.vue +20 -20
  10. package/src/components/blog/BlogHeaderSection.vue +81 -81
  11. package/src/components/blog/BlogInfoSection.vue +50 -48
  12. package/src/components/blog/BlogPostHeader.vue +135 -135
  13. package/src/components/blog/BlogProgressBar.vue +33 -33
  14. package/src/components/blog/BlogSectionTitle.vue +22 -22
  15. package/src/components/blog/BlogTagsSection.vue +25 -25
  16. package/src/components/blog/CategoriesList.vue +14 -14
  17. package/src/components/blog/CategoriesSection.vue +11 -11
  18. package/src/components/blog/CategoryCard.vue +27 -26
  19. package/src/components/blog/HeaderCarousel.vue +99 -98
  20. package/src/components/blog/PostCard.vue +34 -34
  21. package/src/components/blog/PostsList.vue +15 -15
  22. package/src/components/blog/SocialShareSidebar.vue +92 -85
  23. package/src/components/blog/TableOfContents.vue +310 -308
  24. package/src/components/busy-indicator/BusyIndicator.vue +7 -7
  25. package/src/components/busy-indicator/busy-indicator-state.ts +56 -56
  26. package/src/components/card-grid/CardGrid.vue +35 -35
  27. package/src/components/chip/Chip.vue +16 -16
  28. package/src/components/confirm-dialog/ConfirmDialog.vue +51 -51
  29. package/src/components/confirm-dialog/confirm-dialog-state.ts +131 -131
  30. package/src/components/content/BlogList.vue +32 -31
  31. package/src/components/content/BlogTable.vue +36 -36
  32. package/src/components/content/CodeBlock.vue +139 -137
  33. package/src/components/content/Flow.vue +60 -60
  34. package/src/components/content/ProseHr.vue +16 -16
  35. package/src/components/content/ProsePre.vue +12 -12
  36. package/src/components/content/Terminal.vue +62 -60
  37. package/src/components/cookie-consent/CookieConsent.vue +36 -36
  38. package/src/components/cookie-consent/useCookieConsent.ts +37 -37
  39. package/src/components/dashboard-shell/DashboardShell.vue +171 -171
  40. package/src/components/data-list/DataList.vue +6 -6
  41. package/src/components/data-list/DataListItem.vue +4 -4
  42. package/src/components/data-list/DataListLabel.vue +4 -4
  43. package/src/components/data-list/DataListText.vue +4 -4
  44. package/src/components/data-list/DataListValue.vue +4 -4
  45. package/src/components/empty-state-card/EmptyStateCard.vue +41 -41
  46. package/src/components/error-page/ErrorPage.vue +73 -73
  47. package/src/components/info-card/InfoCard.vue +31 -31
  48. package/src/components/landing/landing-content/LandingContent.vue +4 -4
  49. package/src/components/landing/landing-footer/LandingFooter.vue +129 -129
  50. package/src/components/landing/landing-navbar/LandingNavbar.vue +50 -50
  51. package/src/components/landing/landing-shell/LandingShell.vue +36 -36
  52. package/src/components/language-flag/LanguageFlag.vue +25 -25
  53. package/src/components/language-flag/flags/ChineseFlag.vue +8 -8
  54. package/src/components/language-flag/flags/EnglishFlag.vue +7 -7
  55. package/src/components/language-flag/flags/FrenchFlag.vue +5 -5
  56. package/src/components/language-flag/flags/GermanFlag.vue +5 -5
  57. package/src/components/language-flag/flags/ItalianFlag.vue +7 -7
  58. package/src/components/language-flag/flags/JapaneseFlag.vue +4 -4
  59. package/src/components/language-flag/flags/PortugueseFlag.vue +57 -57
  60. package/src/components/language-flag/flags/RussianFlag.vue +5 -5
  61. package/src/components/language-flag/flags/SpanishFlag.vue +4 -4
  62. package/src/components/language-selector/LanguageSelector.vue +77 -77
  63. package/src/components/load-more-button/LoadMoreButton.vue +19 -18
  64. package/src/components/loading-state-card/LoadingStateCard.vue +29 -29
  65. package/src/components/message-dialog/MessageDialog.vue +62 -60
  66. package/src/components/message-dialog/message-dialog-state.ts +105 -105
  67. package/src/components/message-toast/MessageToast.vue +153 -150
  68. package/src/components/message-toast/message-toast-state.ts +146 -146
  69. package/src/components/page-header/PageHeader.vue +34 -34
  70. package/src/components/progress-component/ProgressComponent.vue +33 -33
  71. package/src/components/single-value-card/SingleValueCard.vue +59 -58
  72. package/src/components/slider-form-component/SliderFormComponent.vue +36 -36
  73. package/src/components/stat-strip/StatStrip.vue +22 -22
  74. package/src/components/switch-form-component/SwitchFormComponent.vue +20 -20
  75. package/src/components/text-link/TextLink.vue +14 -14
  76. package/src/components/theme-selector/ThemeSelector.vue +65 -62
  77. package/src/components/theme-selector/theme-transition.ts +63 -63
  78. package/src/components/ui/accordion/Accordion.vue +39 -39
  79. package/src/components/ui/alert/Alert.vue +5 -5
  80. package/src/components/ui/alert/AlertDescription.vue +4 -4
  81. package/src/components/ui/alert/AlertTitle.vue +4 -4
  82. package/src/components/ui/alert/index.ts +2 -2
  83. package/src/components/ui/alert-dialog/AlertDialog.vue +3 -3
  84. package/src/components/ui/alert-dialog/AlertDialogAction.vue +3 -3
  85. package/src/components/ui/alert-dialog/AlertDialogCancel.vue +3 -3
  86. package/src/components/ui/alert-dialog/AlertDialogContent.vue +7 -7
  87. package/src/components/ui/alert-dialog/AlertDialogDescription.vue +3 -3
  88. package/src/components/ui/alert-dialog/AlertDialogFooter.vue +4 -4
  89. package/src/components/ui/alert-dialog/AlertDialogHeader.vue +4 -4
  90. package/src/components/ui/alert-dialog/AlertDialogTitle.vue +3 -3
  91. package/src/components/ui/alert-dialog/AlertDialogTrigger.vue +3 -3
  92. package/src/components/ui/animated-number/AnimatedNumber.vue +49 -48
  93. package/src/components/ui/avatar/Avatar.vue +28 -28
  94. package/src/components/ui/avatar/AvatarFallback.vue +6 -6
  95. package/src/components/ui/avatar/AvatarGroup.vue +40 -40
  96. package/src/components/ui/avatar/AvatarImage.vue +3 -3
  97. package/src/components/ui/avatar/index.ts +17 -17
  98. package/src/components/ui/badge/Badge.vue +20 -20
  99. package/src/components/ui/breadcrumb/Breadcrumb.vue +4 -4
  100. package/src/components/ui/breadcrumb/BreadcrumbEllipsis.vue +10 -10
  101. package/src/components/ui/breadcrumb/BreadcrumbItem.vue +4 -4
  102. package/src/components/ui/breadcrumb/BreadcrumbLink.vue +4 -4
  103. package/src/components/ui/breadcrumb/BreadcrumbList.vue +4 -4
  104. package/src/components/ui/breadcrumb/BreadcrumbPage.vue +4 -4
  105. package/src/components/ui/breadcrumb/BreadcrumbSeparator.vue +4 -4
  106. package/src/components/ui/busy/Busy.vue +33 -33
  107. package/src/components/ui/button/Button.vue +23 -23
  108. package/src/components/ui/button/index.ts +56 -56
  109. package/src/components/ui/calendar/Calendar.vue +138 -138
  110. package/src/components/ui/calendar/CalendarCell.vue +7 -7
  111. package/src/components/ui/calendar/CalendarCellTrigger.vue +18 -18
  112. package/src/components/ui/calendar/CalendarGrid.vue +3 -3
  113. package/src/components/ui/calendar/CalendarGridBody.vue +3 -3
  114. package/src/components/ui/calendar/CalendarGridHead.vue +3 -3
  115. package/src/components/ui/calendar/CalendarGridRow.vue +3 -3
  116. package/src/components/ui/calendar/CalendarHeadCell.vue +7 -7
  117. package/src/components/ui/calendar/CalendarHeader.vue +7 -7
  118. package/src/components/ui/calendar/CalendarHeading.vue +6 -6
  119. package/src/components/ui/calendar/CalendarNextButton.vue +16 -16
  120. package/src/components/ui/calendar/CalendarPrevButton.vue +16 -16
  121. package/src/components/ui/calendar/index.ts +4 -4
  122. package/src/components/ui/card/Card.vue +20 -20
  123. package/src/components/ui/card/CardAction.vue +8 -8
  124. package/src/components/ui/card/CardContent.vue +4 -4
  125. package/src/components/ui/card/CardDescription.vue +12 -12
  126. package/src/components/ui/card/CardFooter.vue +4 -4
  127. package/src/components/ui/card/CardHeader.vue +8 -8
  128. package/src/components/ui/card/CardText.vue +8 -8
  129. package/src/components/ui/card/CardTitle.vue +8 -8
  130. package/src/components/ui/checkbox/Checkbox.vue +27 -27
  131. package/src/components/ui/collapsible/Collapsible.vue +3 -3
  132. package/src/components/ui/collapsible/CollapsibleContent.vue +3 -3
  133. package/src/components/ui/collapsible/CollapsibleTrigger.vue +3 -3
  134. package/src/components/ui/combobox/Combobox.vue +4 -4
  135. package/src/components/ui/combobox/ComboboxAnchor.vue +16 -16
  136. package/src/components/ui/combobox/ComboboxEmpty.vue +3 -3
  137. package/src/components/ui/combobox/ComboboxGroup.vue +9 -9
  138. package/src/components/ui/combobox/ComboboxInput.vue +6 -6
  139. package/src/components/ui/combobox/ComboboxItem.vue +18 -18
  140. package/src/components/ui/combobox/ComboboxList.vue +19 -19
  141. package/src/components/ui/combobox/ComboboxSelect.vue +79 -78
  142. package/src/components/ui/combobox/ComboboxSeparator.vue +1 -1
  143. package/src/components/ui/combobox/ComboboxTrigger.vue +11 -11
  144. package/src/components/ui/combobox/types.ts +5 -5
  145. package/src/components/ui/command/Command.vue +48 -48
  146. package/src/components/ui/command/CommandDialog.vue +14 -14
  147. package/src/components/ui/command/CommandEmpty.vue +4 -4
  148. package/src/components/ui/command/CommandGroup.vue +23 -23
  149. package/src/components/ui/command/CommandInput.vue +10 -10
  150. package/src/components/ui/command/CommandItem.vue +40 -40
  151. package/src/components/ui/command/CommandList.vue +9 -9
  152. package/src/components/ui/command/CommandSeparator.vue +3 -3
  153. package/src/components/ui/command/CommandShortcut.vue +8 -8
  154. package/src/components/ui/command/index.ts +11 -11
  155. package/src/components/ui/data-table/DataTable.vue +147 -146
  156. package/src/components/ui/data-table/index.ts +11 -11
  157. package/src/components/ui/date-picker/DatePicker.vue +32 -32
  158. package/src/components/ui/date-time-picker/DateTimePicker.vue +97 -97
  159. package/src/components/ui/dialog/Dialog.vue +3 -3
  160. package/src/components/ui/dialog/DialogClose.vue +3 -3
  161. package/src/components/ui/dialog/DialogContent.vue +22 -22
  162. package/src/components/ui/dialog/DialogDescription.vue +7 -7
  163. package/src/components/ui/dialog/DialogFooter.vue +8 -8
  164. package/src/components/ui/dialog/DialogHeader.vue +4 -4
  165. package/src/components/ui/dialog/DialogOverlay.vue +7 -7
  166. package/src/components/ui/dialog/DialogScrollContent.vue +33 -33
  167. package/src/components/ui/dialog/DialogTitle.vue +3 -3
  168. package/src/components/ui/dialog/DialogTrigger.vue +3 -3
  169. package/src/components/ui/dropdown-menu/DropdownMenu.vue +3 -3
  170. package/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +12 -12
  171. package/src/components/ui/dropdown-menu/DropdownMenuContent.vue +15 -15
  172. package/src/components/ui/dropdown-menu/DropdownMenuGroup.vue +3 -3
  173. package/src/components/ui/dropdown-menu/DropdownMenuItem.vue +12 -12
  174. package/src/components/ui/dropdown-menu/DropdownMenuLabel.vue +9 -9
  175. package/src/components/ui/dropdown-menu/DropdownMenuPortal.vue +3 -3
  176. package/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue +3 -3
  177. package/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +11 -11
  178. package/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue +1 -1
  179. package/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue +4 -4
  180. package/src/components/ui/dropdown-menu/DropdownMenuSub.vue +3 -3
  181. package/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue +15 -15
  182. package/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +16 -16
  183. package/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue +3 -3
  184. package/src/components/ui/dropdown-menu/classes.ts +16 -16
  185. package/src/components/ui/field/Field.vue +5 -5
  186. package/src/components/ui/field/FieldContent.vue +8 -8
  187. package/src/components/ui/field/FieldDescription.vue +10 -10
  188. package/src/components/ui/field/FieldError.vue +39 -39
  189. package/src/components/ui/field/FieldGroup.vue +8 -8
  190. package/src/components/ui/field/FieldLabel.vue +10 -10
  191. package/src/components/ui/field/FieldLegend.vue +11 -11
  192. package/src/components/ui/field/FieldSeparator.vue +11 -11
  193. package/src/components/ui/field/FieldSet.vue +9 -9
  194. package/src/components/ui/field/FieldTitle.vue +8 -8
  195. package/src/components/ui/field/field-context.ts +36 -36
  196. package/src/components/ui/field/index.ts +22 -22
  197. package/src/components/ui/file-dropzone/FileDropzone.vue +163 -154
  198. package/src/components/ui/file-dropzone/index.ts +19 -19
  199. package/src/components/ui/hover-card/HoverCard.vue +5 -5
  200. package/src/components/ui/hover-card/HoverCardContent.vue +13 -13
  201. package/src/components/ui/hover-card/HoverCardTrigger.vue +3 -3
  202. package/src/components/ui/input/Input.vue +13 -13
  203. package/src/components/ui/kbd/Kbd.vue +10 -10
  204. package/src/components/ui/kbd/KbdGroup.vue +49 -49
  205. package/src/components/ui/label/Label.vue +7 -7
  206. package/src/components/ui/native-select/NativeSelect.vue +17 -17
  207. package/src/components/ui/native-select/NativeSelectOptGroup.vue +3 -3
  208. package/src/components/ui/native-select/NativeSelectOption.vue +3 -3
  209. package/src/components/ui/number-field/NumberField.vue +90 -89
  210. package/src/components/ui/pagination/Pagination.vue +4 -4
  211. package/src/components/ui/pagination/PaginationContent.vue +4 -4
  212. package/src/components/ui/pagination/PaginationEllipsis.vue +10 -10
  213. package/src/components/ui/pagination/PaginationFirst.vue +9 -9
  214. package/src/components/ui/pagination/PaginationItem.vue +14 -14
  215. package/src/components/ui/pagination/PaginationLast.vue +9 -9
  216. package/src/components/ui/pagination/PaginationNext.vue +9 -9
  217. package/src/components/ui/pagination/PaginationPrevious.vue +9 -9
  218. package/src/components/ui/pagination/SimplePagination.vue +25 -25
  219. package/src/components/ui/pin-input/PinInput.vue +20 -20
  220. package/src/components/ui/pin-input/PinInputInput.vue +17 -17
  221. package/src/components/ui/pin-input/context.ts +1 -1
  222. package/src/components/ui/popover/Popover.vue +3 -3
  223. package/src/components/ui/popover/PopoverAnchor.vue +3 -3
  224. package/src/components/ui/popover/PopoverContent.vue +12 -12
  225. package/src/components/ui/popover/PopoverTrigger.vue +3 -3
  226. package/src/components/ui/progress/Progress.vue +16 -16
  227. package/src/components/ui/radio-group/RadioGroup.vue +7 -7
  228. package/src/components/ui/radio-group/RadioGroupCard.vue +39 -39
  229. package/src/components/ui/radio-group/RadioGroupItem.vue +20 -20
  230. package/src/components/ui/scroll-area/ScrollArea.vue +14 -14
  231. package/src/components/ui/scroll-area/ScrollBar.vue +12 -12
  232. package/src/components/ui/select/Select.vue +3 -3
  233. package/src/components/ui/select/SelectContent.vue +25 -25
  234. package/src/components/ui/select/SelectGroup.vue +3 -3
  235. package/src/components/ui/select/SelectItem.vue +25 -25
  236. package/src/components/ui/select/SelectItemContent.vue +32 -32
  237. package/src/components/ui/select/SelectItemText.vue +3 -3
  238. package/src/components/ui/select/SelectLabel.vue +3 -3
  239. package/src/components/ui/select/SelectScrollDownButton.vue +10 -10
  240. package/src/components/ui/select/SelectScrollUpButton.vue +10 -10
  241. package/src/components/ui/select/SelectSeparator.vue +2 -2
  242. package/src/components/ui/select/SelectTrigger.vue +15 -15
  243. package/src/components/ui/select/SelectValue.vue +3 -3
  244. package/src/components/ui/select/SelectValueContent.vue +39 -39
  245. package/src/components/ui/separator/Separator.vue +7 -7
  246. package/src/components/ui/sheet/Sheet.vue +3 -3
  247. package/src/components/ui/sheet/SheetClose.vue +3 -3
  248. package/src/components/ui/sheet/SheetContent.vue +22 -22
  249. package/src/components/ui/sheet/SheetDescription.vue +3 -3
  250. package/src/components/ui/sheet/SheetFooter.vue +3 -3
  251. package/src/components/ui/sheet/SheetHeader.vue +3 -3
  252. package/src/components/ui/sheet/SheetOverlay.vue +7 -7
  253. package/src/components/ui/sheet/SheetTitle.vue +3 -3
  254. package/src/components/ui/sheet/SheetTrigger.vue +3 -3
  255. package/src/components/ui/sidebar/Sidebar.vue +57 -57
  256. package/src/components/ui/sidebar/SidebarContent.vue +8 -8
  257. package/src/components/ui/sidebar/SidebarFooter.vue +8 -8
  258. package/src/components/ui/sidebar/SidebarGroup.vue +8 -8
  259. package/src/components/ui/sidebar/SidebarGroupAction.vue +9 -9
  260. package/src/components/ui/sidebar/SidebarGroupContent.vue +4 -4
  261. package/src/components/ui/sidebar/SidebarGroupLabel.vue +8 -8
  262. package/src/components/ui/sidebar/SidebarHeader.vue +8 -8
  263. package/src/components/ui/sidebar/SidebarInput.vue +8 -8
  264. package/src/components/ui/sidebar/SidebarInset.vue +9 -9
  265. package/src/components/ui/sidebar/SidebarMenu.vue +4 -4
  266. package/src/components/ui/sidebar/SidebarMenuAction.vue +18 -18
  267. package/src/components/ui/sidebar/SidebarMenuBadge.vue +14 -14
  268. package/src/components/ui/sidebar/SidebarMenuButton.vue +21 -21
  269. package/src/components/ui/sidebar/SidebarMenuButtonChild.vue +10 -10
  270. package/src/components/ui/sidebar/SidebarMenuItem.vue +4 -4
  271. package/src/components/ui/sidebar/SidebarMenuSkeleton.vue +10 -10
  272. package/src/components/ui/sidebar/SidebarMenuSub.vue +9 -9
  273. package/src/components/ui/sidebar/SidebarMenuSubButton.vue +17 -17
  274. package/src/components/ui/sidebar/SidebarMenuSubItem.vue +4 -4
  275. package/src/components/ui/sidebar/SidebarProvider.vue +46 -46
  276. package/src/components/ui/sidebar/SidebarRail.vue +13 -13
  277. package/src/components/ui/sidebar/SidebarSeparator.vue +4 -4
  278. package/src/components/ui/sidebar/SidebarTrigger.vue +6 -6
  279. package/src/components/ui/sidebar/index.ts +29 -29
  280. package/src/components/ui/sidebar/utils.ts +7 -7
  281. package/src/components/ui/skeleton/Skeleton.vue +6 -6
  282. package/src/components/ui/slider/Slider.vue +14 -14
  283. package/src/components/ui/spinner/Spinner.vue +21 -21
  284. package/src/components/ui/stepper/SimpleStepper.vue +27 -27
  285. package/src/components/ui/stepper/Stepper.vue +6 -6
  286. package/src/components/ui/stepper/StepperDescription.vue +5 -5
  287. package/src/components/ui/stepper/StepperIndicator.vue +18 -18
  288. package/src/components/ui/stepper/StepperItem.vue +4 -4
  289. package/src/components/ui/stepper/StepperSeparator.vue +7 -7
  290. package/src/components/ui/stepper/StepperTitle.vue +5 -5
  291. package/src/components/ui/stepper/StepperTrigger.vue +4 -4
  292. package/src/components/ui/stepper/index.ts +3 -3
  293. package/src/components/ui/switch/Switch.vue +15 -15
  294. package/src/components/ui/table/Table.vue +6 -6
  295. package/src/components/ui/table/TableBody.vue +4 -4
  296. package/src/components/ui/table/TableCaption.vue +4 -4
  297. package/src/components/ui/table/TableCell.vue +8 -8
  298. package/src/components/ui/table/TableEmpty.vue +14 -14
  299. package/src/components/ui/table/TableFooter.vue +8 -8
  300. package/src/components/ui/table/TableHead.vue +8 -8
  301. package/src/components/ui/table/TableHeader.vue +4 -4
  302. package/src/components/ui/table/TableRow.vue +8 -8
  303. package/src/components/ui/tabs/Tabs.vue +4 -4
  304. package/src/components/ui/tabs/TabsContent.vue +4 -4
  305. package/src/components/ui/tabs/TabsList.vue +15 -15
  306. package/src/components/ui/tabs/TabsTrigger.vue +10 -10
  307. package/src/components/ui/tags-input/TagsInput.vue +17 -17
  308. package/src/components/ui/tags-input/TagsInputInput.vue +6 -6
  309. package/src/components/ui/tags-input/TagsInputItem.vue +15 -15
  310. package/src/components/ui/tags-input/TagsInputItemDelete.vue +13 -13
  311. package/src/components/ui/tags-input/TagsInputItemText.vue +4 -4
  312. package/src/components/ui/textarea/Textarea.vue +12 -12
  313. package/src/components/ui/time-picker/TimePicker.vue +25 -25
  314. package/src/components/ui/toggle-group/Toggle.vue +10 -10
  315. package/src/components/ui/toggle-group/ToggleGroup.vue +38 -38
  316. package/src/components/ui/toggle-group/ToggleGroupItem.vue +9 -9
  317. package/src/components/ui/toggle-group/index.ts +46 -46
  318. package/src/components/ui/tooltip/Tooltip.vue +3 -3
  319. package/src/components/ui/tooltip/TooltipContent.vue +13 -13
  320. package/src/components/ui/tooltip/TooltipProvider.vue +4 -4
  321. package/src/components/ui/tooltip/TooltipTrigger.vue +3 -3
  322. package/src/i18n/de.json +185 -185
  323. package/src/i18n/en.json +185 -185
  324. package/src/i18n/es.json +185 -185
  325. package/src/i18n/fr.json +185 -185
  326. package/src/i18n/it.json +185 -185
  327. package/src/i18n/ja.json +185 -185
  328. package/src/i18n/pt.json +185 -185
  329. package/src/i18n/ru.json +185 -185
  330. package/src/i18n/zh.json +185 -185
  331. package/src/lib/color-tokens.ts +24 -24
  332. package/src/lib/i18n.ts +65 -65
  333. package/src/lib/utils.ts +33 -33
  334. package/src/nuxt-components.d.ts +2 -2
  335. package/src/runtime/ui-vintage-i18n-plugin.ts +49 -49
  336. package/src/shims-vue.d.ts +3 -3
  337. package/src/styles.css +377 -377
@@ -1,5 +1,7 @@
1
1
  <script setup lang="ts">
2
- import { CheckmarkCircle02Icon, Copy01Icon, CodeIcon } from '@hugeicons/core-free-icons';
2
+ import CheckmarkCircle02Icon from '@hugeicons/core-free-icons/CheckmarkCircle02Icon';
3
+ import CodeIcon from '@hugeicons/core-free-icons/CodeIcon';
4
+ import Copy01Icon from '@hugeicons/core-free-icons/Copy01Icon';
3
5
  import { HugeiconsIcon } from '@hugeicons/vue';
4
6
  import { computed, ref, watch } from 'vue';
5
7
  import { useI18n } from 'vue-i18n';
@@ -9,15 +11,15 @@ type CodeLanguage = string;
9
11
 
10
12
  // Props
11
13
  const props = withDefaults(defineProps<{
12
- code?: string;
13
- language?: CodeLanguage;
14
- title?: string;
15
- copyable?: boolean;
14
+ code?: string;
15
+ language?: CodeLanguage;
16
+ title?: string;
17
+ copyable?: boolean;
16
18
  }>(), {
17
- code: '',
18
- language: 'text',
19
- title: '',
20
- copyable: true
19
+ code: '',
20
+ language: 'text',
21
+ title: '',
22
+ copyable: true
21
23
  });
22
24
 
23
25
  const { t } = useI18n();
@@ -26,171 +28,171 @@ const highlightedCode = ref('');
26
28
  let highlightRequest = 0;
27
29
  const resolvedTitle = computed(() => props.title || t('uiVintage.code.title'));
28
30
  const languageLabels: Record<string, string> = {
29
- js: 'JavaScript',
30
- javascript: 'JavaScript',
31
- ts: 'TypeScript',
32
- typescript: 'TypeScript',
33
- vue: 'Vue',
34
- html: 'HTML',
35
- css: 'CSS',
36
- json: 'JSON',
37
- md: 'Markdown',
38
- markdown: 'Markdown',
39
- yaml: 'YAML',
40
- yml: 'YAML',
31
+ js: 'JavaScript',
32
+ javascript: 'JavaScript',
33
+ ts: 'TypeScript',
34
+ typescript: 'TypeScript',
35
+ vue: 'Vue',
36
+ html: 'HTML',
37
+ css: 'CSS',
38
+ json: 'JSON',
39
+ md: 'Markdown',
40
+ markdown: 'Markdown',
41
+ yaml: 'YAML',
42
+ yml: 'YAML',
41
43
  };
42
44
  const languageLabel = computed(() => props.language === 'text' ? t('uiVintage.code.plainText') : languageLabels[props.language] || props.language);
43
45
  const displayedCode = computed(() => {
44
- if (props.language !== 'json') return props.code.replace(/\n$/, '');
46
+ if (props.language !== 'json') return props.code.replace(/\n$/, '');
45
47
 
46
- try {
47
- return JSON.stringify(JSON.parse(props.code), null, 2);
48
- } catch {
49
- return props.code.replace(/\n$/, '');
50
- }
48
+ try {
49
+ return JSON.stringify(JSON.parse(props.code), null, 2);
50
+ } catch {
51
+ return props.code.replace(/\n$/, '');
52
+ }
51
53
  });
52
54
  const codeLines = computed(() => displayedCode.value.split(/\r?\n/));
53
55
 
54
56
  // Highlight code in the library so all consumers share the same rendering behavior.
55
57
  const highlightCode = async () => {
56
- const requestId = ++highlightRequest;
57
- highlightedCode.value = '';
58
-
59
- if (!displayedCode.value || props.language === 'text') return;
60
-
61
- try {
62
- // Load the highlighter only when a code block is rendered, so pages without code never download it
63
- const { codeToHtml } = await import('shiki');
64
- const html = await codeToHtml(displayedCode.value, {
65
- lang: props.language,
66
- themes: { light: 'github-light', dark: 'github-dark' },
67
- defaultColor: false
68
- });
69
-
70
- if (requestId === highlightRequest) {
71
- highlightedCode.value = html;
72
- }
73
- } catch {
74
- // Keep the escaped plain-text fallback for unsupported languages.
75
- }
58
+ const requestId = ++highlightRequest;
59
+ highlightedCode.value = '';
60
+
61
+ if (!displayedCode.value || props.language === 'text') return;
62
+
63
+ try {
64
+ // Load the highlighter only when a code block is rendered, so pages without code never download it
65
+ const { codeToHtml } = await import('shiki');
66
+ const html = await codeToHtml(displayedCode.value, {
67
+ lang: props.language,
68
+ themes: { light: 'github-light', dark: 'github-dark' },
69
+ defaultColor: false
70
+ });
71
+
72
+ if (requestId === highlightRequest) {
73
+ highlightedCode.value = html;
74
+ }
75
+ } catch {
76
+ // Keep the escaped plain-text fallback for unsupported languages.
77
+ }
76
78
  };
77
79
 
78
80
  watch([displayedCode, () => props.language], highlightCode, { immediate: true });
79
81
 
80
82
  // Copy the formatted code to the clipboard
81
83
  const copyCode = async () => {
82
- if (!props.copyable || !displayedCode.value || !navigator.clipboard) {
83
- return;
84
- }
85
-
86
- await navigator.clipboard.writeText(displayedCode.value);
87
- copied.value = true;
88
- window.setTimeout(() => {
89
- copied.value = false;
90
- }, 1800);
84
+ if (!props.copyable || !displayedCode.value || !navigator.clipboard) {
85
+ return;
86
+ }
87
+
88
+ await navigator.clipboard.writeText(displayedCode.value);
89
+ copied.value = true;
90
+ window.setTimeout(() => {
91
+ copied.value = false;
92
+ }, 1800);
91
93
  };
92
94
  </script>
93
95
 
94
96
  <template>
95
- <div class="not-prose my-6 sm:my-8">
96
- <div data-aos="blur-up" data-code-window class="overflow-hidden rounded border border-border bg-card text-foreground shadow-elevated-sm">
97
- <!-- Window title bar -->
98
- <div class="relative flex h-8 items-center border-b border-border bg-surface px-3">
99
- <!-- Traffic lights -->
100
- <span aria-hidden="true" class="flex items-center gap-2">
101
- <span class="size-3 rounded-full bg-destructive/85" />
102
- <span class="size-3 rounded-full bg-warning/85" />
103
- <span class="size-3 rounded-full bg-success/85" />
104
- </span>
105
-
106
- <!-- Window title -->
107
- <div class="pointer-events-none absolute inset-x-24 truncate text-center text-xs text-muted-foreground">{{ resolvedTitle }}</div>
108
-
109
- <!-- Copy code button -->
110
- <Button v-if="props.copyable"
111
- variant="ghost"
112
- size="icon"
113
- class="ml-auto size-6 text-muted-foreground hover:bg-accent hover:text-foreground"
114
- :aria-label="copied ? t('uiVintage.code.copied') : t('uiVintage.code.copy')"
115
- :title="copied ? t('uiVintage.code.copied') : t('uiVintage.code.copy')"
116
- :disabled="!displayedCode"
117
- @click="copyCode">
118
- <HugeiconsIcon :icon="copied ? CheckmarkCircle02Icon : Copy01Icon" class="size-3.5" />
119
- </Button>
120
-
121
- <!-- Announce the copy to screen readers -->
122
- <span v-if="props.copyable" class="sr-only" aria-live="polite">{{ copied ? t('uiVintage.code.copied') : '' }}</span>
123
- </div>
124
-
125
- <!-- Editor tabs -->
126
- <div class="flex h-9 items-stretch border-b border-border bg-surface">
127
- <!-- Active tab -->
128
- <div class="flex min-w-0 items-center gap-2 -mb-px border-r border-border border-t-2 border-t-primary bg-card px-3 text-foreground">
129
- <HugeiconsIcon :icon="CodeIcon" class="size-3.5 shrink-0 text-primary" />
130
- <span class="truncate text-xs">{{ resolvedTitle }}</span>
131
- </div>
132
- </div>
133
-
134
- <!-- Code content -->
135
- <div v-if="highlightedCode" class="code-block-content uv-code-block-content overflow-x-auto" v-html="highlightedCode" />
136
- <div v-else class="code-block-content overflow-x-auto">
137
- <pre><code><template v-for="(line, index) in codeLines" :key="index"><span class="line">{{ line }}</span>{{ index < codeLines.length - 1 ? '\n' : '' }}</template></code></pre>
138
- </div>
139
-
140
- <!-- Status bar -->
141
- <div class="flex h-6 items-center justify-between gap-3 border-t border-border bg-surface px-3 text-[11px] text-muted-foreground">
142
- <span class="truncate">{{ t('uiVintage.code.position', { line: codeLines.length, column: 1 }) }}</span>
143
- <span class="flex shrink-0 items-center gap-3">
144
- <span>UTF-8</span>
145
- <span>{{ languageLabel }}</span>
146
- </span>
147
- </div>
148
- </div>
149
- </div>
97
+ <div class="not-prose my-6 sm:my-8">
98
+ <div data-aos="blur-up" data-code-window class="overflow-hidden rounded border border-border bg-card text-foreground shadow-elevated-sm">
99
+ <!-- Window title bar -->
100
+ <div class="relative flex h-8 items-center border-b border-border bg-surface px-3">
101
+ <!-- Traffic lights -->
102
+ <span aria-hidden="true" class="flex items-center gap-2">
103
+ <span class="size-3 rounded-full bg-destructive/85" />
104
+ <span class="size-3 rounded-full bg-warning/85" />
105
+ <span class="size-3 rounded-full bg-success/85" />
106
+ </span>
107
+
108
+ <!-- Window title -->
109
+ <div class="pointer-events-none absolute inset-x-24 truncate text-center text-xs text-muted-foreground">{{ resolvedTitle }}</div>
110
+
111
+ <!-- Copy code button -->
112
+ <Button v-if="props.copyable"
113
+ variant="ghost"
114
+ size="icon"
115
+ class="ml-auto size-6 text-muted-foreground hover:bg-accent hover:text-foreground"
116
+ :aria-label="copied ? t('uiVintage.code.copied') : t('uiVintage.code.copy')"
117
+ :title="copied ? t('uiVintage.code.copied') : t('uiVintage.code.copy')"
118
+ :disabled="!displayedCode"
119
+ @click="copyCode">
120
+ <HugeiconsIcon :icon="copied ? CheckmarkCircle02Icon : Copy01Icon" class="size-3.5" />
121
+ </Button>
122
+
123
+ <!-- Announce the copy to screen readers -->
124
+ <span v-if="props.copyable" class="sr-only" aria-live="polite">{{ copied ? t('uiVintage.code.copied') : '' }}</span>
125
+ </div>
126
+
127
+ <!-- Editor tabs -->
128
+ <div class="flex h-9 items-stretch border-b border-border bg-surface">
129
+ <!-- Active tab -->
130
+ <div class="flex min-w-0 items-center gap-2 -mb-px border-r border-border border-t-2 border-t-primary bg-card px-3 text-foreground">
131
+ <HugeiconsIcon :icon="CodeIcon" class="size-3.5 shrink-0 text-primary" />
132
+ <span class="truncate text-xs">{{ resolvedTitle }}</span>
133
+ </div>
134
+ </div>
135
+
136
+ <!-- Code content -->
137
+ <div v-if="highlightedCode" class="code-block-content uv-code-block-content overflow-x-auto" v-html="highlightedCode" />
138
+ <div v-else class="code-block-content overflow-x-auto">
139
+ <pre><code><template v-for="(line, index) in codeLines" :key="index"><span class="line">{{ line }}</span>{{ index < codeLines.length - 1 ? '\n' : '' }}</template></code></pre>
140
+ </div>
141
+
142
+ <!-- Status bar -->
143
+ <div class="flex h-6 items-center justify-between gap-3 border-t border-border bg-surface px-3 text-[11px] text-muted-foreground">
144
+ <span class="truncate">{{ t('uiVintage.code.position', { line: codeLines.length, column: 1 }) }}</span>
145
+ <span class="flex shrink-0 items-center gap-3">
146
+ <span>UTF-8</span>
147
+ <span>{{ languageLabel }}</span>
148
+ </span>
149
+ </div>
150
+ </div>
151
+ </div>
150
152
  </template>
151
153
 
152
154
  <style scoped>
153
155
  .code-block-content :deep(pre) {
154
- margin: 0;
155
- min-width: max-content;
156
- padding: 0.75rem 1rem 0.75rem 0;
157
- background-color: transparent !important;
158
- color: var(--foreground);
159
- font-size: 0.75rem;
160
- line-height: 1.5rem;
161
- counter-reset: line;
156
+ margin: 0;
157
+ min-width: max-content;
158
+ padding: 0.75rem 1rem 0.75rem 0;
159
+ background-color: transparent !important;
160
+ color: var(--foreground);
161
+ font-size: 0.75rem;
162
+ line-height: 1.5rem;
163
+ counter-reset: line;
162
164
  }
163
165
 
164
166
  /* Line numbers in the editor gutter */
165
167
  .code-block-content :deep(.line)::before {
166
- counter-increment: line;
167
- content: counter(line);
168
- display: inline-block;
169
- width: 2.75rem;
170
- margin-right: 1rem;
171
- padding-right: 0.25rem;
172
- text-align: right;
173
- color: color-mix(in oklab, var(--muted-foreground) 65%, transparent);
174
- user-select: none;
168
+ counter-increment: line;
169
+ content: counter(line);
170
+ display: inline-block;
171
+ width: 2.75rem;
172
+ margin-right: 1rem;
173
+ padding-right: 0.25rem;
174
+ text-align: right;
175
+ color: color-mix(in oklab, var(--muted-foreground) 65%, transparent);
176
+ user-select: none;
175
177
  }
176
178
 
177
179
  @media (min-width: 640px) {
178
- .code-block-content :deep(pre) {
179
- padding: 1rem 1.25rem 1rem 0;
180
- font-size: 0.875rem;
181
- }
180
+ .code-block-content :deep(pre) {
181
+ padding: 1rem 1.25rem 1rem 0;
182
+ font-size: 0.875rem;
183
+ }
182
184
  }
183
185
  </style>
184
186
 
185
187
  <style>
186
188
  /* Shiki emits both themes as CSS variables; pick the one matching the library's `.dark` class and drop Nuxt Content's per-token backgrounds */
187
189
  .uv-code-block-content .shiki span {
188
- color: var(--shiki-light);
189
- background-color: transparent;
190
+ color: var(--shiki-light);
191
+ background-color: transparent;
190
192
  }
191
193
 
192
194
  .dark .uv-code-block-content .shiki span {
193
- color: var(--shiki-dark);
194
- background-color: transparent;
195
+ color: var(--shiki-dark);
196
+ background-color: transparent;
195
197
  }
196
- </style>
198
+ </style>
@@ -2,92 +2,92 @@
2
2
  import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../ui/card';
3
3
 
4
4
  type FlowItem = string | {
5
- label?: string;
6
- title?: string;
7
- description?: string;
5
+ label?: string;
6
+ title?: string;
7
+ description?: string;
8
8
  };
9
9
 
10
10
  // Props
11
11
  const props = withDefaults(defineProps<{
12
- title?: string;
13
- description?: string;
14
- items?: FlowItem[];
15
- orientation?: 'horizontal' | 'vertical';
12
+ title?: string;
13
+ description?: string;
14
+ items?: FlowItem[];
15
+ orientation?: 'horizontal' | 'vertical';
16
16
  }>(), {
17
- title: '',
18
- description: '',
19
- items: () => [],
20
- orientation: 'horizontal'
17
+ title: '',
18
+ description: '',
19
+ items: () => [],
20
+ orientation: 'horizontal'
21
21
  });
22
22
 
23
23
  // Get item label
24
24
  const getItemLabel = (item: FlowItem) => {
25
- if (typeof item === 'string') return item;
26
- return item.label || item.title || '';
25
+ if (typeof item === 'string') return item;
26
+ return item.label || item.title || '';
27
27
  };
28
28
 
29
29
  // Get item description
30
30
  const getItemDescription = (item: FlowItem) => {
31
- if (typeof item === 'string') return '';
32
- return item.description || '';
31
+ if (typeof item === 'string') return '';
32
+ return item.description || '';
33
33
  };
34
34
 
35
35
  // Check if orientation is vertical
36
36
  const isVertical = () => {
37
- return props.orientation === 'vertical';
37
+ return props.orientation === 'vertical';
38
38
  };
39
39
 
40
40
  // Format the step number with a leading zero
41
41
  const formatNumber = (index: number) => {
42
- return String(index + 1).padStart(2, '0');
42
+ return String(index + 1).padStart(2, '0');
43
43
  };
44
44
  </script>
45
45
 
46
46
  <template>
47
- <div class="not-prose my-6 sm:my-8">
48
- <Card data-aos="blur-up">
49
- <!-- Card header -->
50
- <CardHeader v-if="props.title || props.description">
51
- <!-- Card title -->
52
- <CardTitle v-if="props.title">
53
- {{ props.title }}
54
- </CardTitle>
47
+ <div class="not-prose my-6 sm:my-8">
48
+ <Card data-aos="blur-up">
49
+ <!-- Card header -->
50
+ <CardHeader v-if="props.title || props.description">
51
+ <!-- Card title -->
52
+ <CardTitle v-if="props.title">
53
+ {{ props.title }}
54
+ </CardTitle>
55
55
 
56
- <!-- Card description -->
57
- <CardDescription v-if="props.description">
58
- {{ props.description }}
59
- </CardDescription>
60
- </CardHeader>
56
+ <!-- Card description -->
57
+ <CardDescription v-if="props.description">
58
+ {{ props.description }}
59
+ </CardDescription>
60
+ </CardHeader>
61
61
 
62
- <!-- Card content -->
63
- <CardContent>
64
- <ol :class="['flex flex-col', !isVertical() && 'md:flex-row md:gap-4']">
65
- <!-- Flow step -->
66
- <li v-for="(item, index) in props.items"
67
- :key="`${getItemLabel(item)}-${index}`"
68
- data-aos="blur-up"
69
- :data-aos-delay="100 + index * 90"
70
- :class="['relative flex gap-4 pb-6 last:pb-0', !isVertical() && 'md:flex-1 md:flex-col md:gap-3 md:pb-0']">
71
- <!-- Step number -->
72
- <span class="relative z-10 flex size-7 shrink-0 items-center justify-center rounded border border-primary/30 bg-card text-[11px] font-semibold tabular-nums text-primary">
73
- {{ formatNumber(index) }}
74
- </span>
62
+ <!-- Card content -->
63
+ <CardContent>
64
+ <ol :class="['flex flex-col', !isVertical() && 'md:flex-row md:gap-4']">
65
+ <!-- Flow step -->
66
+ <li v-for="(item, index) in props.items"
67
+ :key="`${getItemLabel(item)}-${index}`"
68
+ data-aos="blur-up"
69
+ :data-aos-delay="100 + index * 90"
70
+ :class="['relative flex gap-4 pb-6 last:pb-0', !isVertical() && 'md:flex-1 md:flex-col md:gap-3 md:pb-0']">
71
+ <!-- Step number -->
72
+ <span class="relative z-10 flex size-7 shrink-0 items-center justify-center rounded border border-primary/30 bg-card text-[11px] font-semibold tabular-nums text-primary">
73
+ {{ formatNumber(index) }}
74
+ </span>
75
75
 
76
- <!-- Connector to the next step -->
77
- <span v-if="index < props.items.length - 1"
78
- aria-hidden="true"
79
- :class="['absolute top-8 bottom-1 left-3.5 w-px bg-border', !isVertical() && 'md:top-3.5 md:bottom-auto md:left-10 md:-right-2 md:h-px md:w-auto md:bg-linear-to-r md:from-primary/40 md:to-border']" />
76
+ <!-- Connector to the next step -->
77
+ <span v-if="index < props.items.length - 1"
78
+ aria-hidden="true"
79
+ :class="['absolute top-8 bottom-1 left-3.5 w-px bg-border', !isVertical() && 'md:top-3.5 md:bottom-auto md:left-10 md:-right-2 md:h-px md:w-auto md:bg-linear-to-r md:from-primary/40 md:to-border']" />
80
80
 
81
- <!-- Step text -->
82
- <div :class="['flex min-w-0 flex-col gap-1 pt-1', !isVertical() && 'md:pt-0']">
83
- <span class="text-xs font-semibold leading-5 text-foreground md:text-sm">{{ getItemLabel(item) }}</span>
84
- <p v-if="getItemDescription(item)" class="text-xs leading-5 text-muted-foreground">
85
- {{ getItemDescription(item) }}
86
- </p>
87
- </div>
88
- </li>
89
- </ol>
90
- </CardContent>
91
- </Card>
92
- </div>
93
- </template>
81
+ <!-- Step text -->
82
+ <div :class="['flex min-w-0 flex-col gap-1 pt-1', !isVertical() && 'md:pt-0']">
83
+ <span class="text-xs font-semibold leading-5 text-foreground md:text-sm">{{ getItemLabel(item) }}</span>
84
+ <p v-if="getItemDescription(item)" class="text-xs leading-5 text-muted-foreground">
85
+ {{ getItemDescription(item) }}
86
+ </p>
87
+ </div>
88
+ </li>
89
+ </ol>
90
+ </CardContent>
91
+ </Card>
92
+ </div>
93
+ </template>
@@ -1,29 +1,29 @@
1
1
  <script setup lang="ts">
2
- import { ChartLineData02Icon } from '@hugeicons/core-free-icons';
2
+ import ChartLineData02Icon from '@hugeicons/core-free-icons/ChartLineData02Icon';
3
3
  import { HugeiconsIcon } from '@hugeicons/vue';
4
4
  import type { HugeiconsIconDefinition } from '../../lib/common-types';
5
5
 
6
6
  // Props
7
7
  const props = withDefaults(defineProps<{
8
- icon?: HugeiconsIconDefinition;
8
+ icon?: HugeiconsIconDefinition;
9
9
  }>(), {
10
- icon: () => ChartLineData02Icon
10
+ icon: () => ChartLineData02Icon
11
11
  });
12
12
  </script>
13
13
 
14
14
  <template>
15
- <div aria-hidden="true" data-aos="blur-up" class="not-prose my-8 sm:my-14">
16
- <div class="flex items-center gap-3 sm:gap-4">
17
- <!-- Left line -->
18
- <div class="h-px flex-1 bg-linear-to-r from-transparent via-border to-primary/40" />
15
+ <div aria-hidden="true" data-aos="blur-up" class="not-prose my-8 sm:my-14">
16
+ <div class="flex items-center gap-3 sm:gap-4">
17
+ <!-- Left line -->
18
+ <div class="h-px flex-1 bg-linear-to-r from-transparent via-border to-primary/40" />
19
19
 
20
- <!-- Icon in the middle -->
21
- <div class="flex size-7 shrink-0 items-center justify-center rounded border border-primary/30 bg-card text-primary">
22
- <HugeiconsIcon :icon="props.icon" class="size-3.5" />
23
- </div>
20
+ <!-- Icon in the middle -->
21
+ <div class="flex size-7 shrink-0 items-center justify-center rounded border border-primary/30 bg-card text-primary">
22
+ <HugeiconsIcon :icon="props.icon" class="size-3.5" />
23
+ </div>
24
24
 
25
- <!-- Right line -->
26
- <div class="h-px flex-1 bg-linear-to-l from-transparent via-border to-primary/40" />
27
- </div>
28
- </div>
29
- </template>
25
+ <!-- Right line -->
26
+ <div class="h-px flex-1 bg-linear-to-l from-transparent via-border to-primary/40" />
27
+ </div>
28
+ </div>
29
+ </template>
@@ -8,13 +8,13 @@ defineOptions({ inheritAttrs: false });
8
8
 
9
9
  // Props
10
10
  const props = withDefaults(defineProps<{
11
- code?: string;
12
- language?: string;
13
- filename?: string;
11
+ code?: string;
12
+ language?: string;
13
+ filename?: string;
14
14
  }>(), {
15
- code: '',
16
- language: '',
17
- filename: ''
15
+ code: '',
16
+ language: '',
17
+ filename: ''
18
18
  });
19
19
 
20
20
  const normalizedLanguage = computed(() => props.language.toLowerCase());
@@ -23,12 +23,12 @@ const commands = computed(() => props.code.replace(/\n$/, '').split(/\r?\n/));
23
23
  </script>
24
24
 
25
25
  <template>
26
- <!-- Terminal value -->
27
- <Terminal v-if="isShellBlock" :commands="commands" :title="props.filename" />
26
+ <!-- Terminal value -->
27
+ <Terminal v-if="isShellBlock" :commands="commands" :title="props.filename" />
28
28
 
29
- <!-- Code block -->
30
- <CodeBlock v-else-if="normalizedLanguage" :code="props.code" :language="normalizedLanguage" :title="props.filename" />
29
+ <!-- Code block -->
30
+ <CodeBlock v-else-if="normalizedLanguage" :code="props.code" :language="normalizedLanguage" :title="props.filename" />
31
31
 
32
- <!-- Fallback pre block -->
33
- <pre v-else v-bind="$attrs"><slot /></pre>
32
+ <!-- Fallback pre block -->
33
+ <pre v-else v-bind="$attrs"><slot /></pre>
34
34
  </template>