@brumaombra/ui-vintage 0.7.7 → 0.7.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (273) hide show
  1. package/README.md +308 -48
  2. package/module.mjs +1 -1
  3. package/package.json +2 -1
  4. package/src/components/background-grid/BackgroundGrid.vue +11 -2
  5. package/src/components/background-grid/index.ts +2 -2
  6. package/src/components/blog/AllPostsSection.vue +25 -9
  7. package/src/components/blog/BlogFAQSection.vue +8 -3
  8. package/src/components/blog/BlogHeaderSection.vue +14 -11
  9. package/src/components/blog/BlogInfoSection.vue +13 -11
  10. package/src/components/blog/BlogSectionTitle.vue +5 -5
  11. package/src/components/blog/CategoriesList.vue +11 -3
  12. package/src/components/blog/CategoriesSection.vue +11 -3
  13. package/src/components/blog/CategoryCard.vue +10 -8
  14. package/src/components/blog/HeaderCarousel.vue +24 -15
  15. package/src/components/blog/PostCard.vue +16 -11
  16. package/src/components/blog/PostsList.vue +12 -3
  17. package/src/components/blog/SocialShareSidebar.vue +11 -11
  18. package/src/components/blog/TableOfContents.vue +29 -13
  19. package/src/components/busy-indicator/BusyIndicator.vue +2 -2
  20. package/src/components/busy-indicator/busy-indicator-state.ts +11 -12
  21. package/src/components/busy-indicator/index.ts +3 -3
  22. package/src/components/card-grid/CardGrid.vue +25 -11
  23. package/src/components/chip/Chip.vue +15 -15
  24. package/src/components/chip/index.ts +2 -2
  25. package/src/components/confirm-dialog/ConfirmDialog.vue +9 -9
  26. package/src/components/confirm-dialog/confirm-dialog-state.ts +15 -14
  27. package/src/components/confirm-dialog/index.ts +3 -12
  28. package/src/components/content/BlogList.vue +11 -8
  29. package/src/components/content/BlogTable.vue +18 -14
  30. package/src/components/content/ProseHr.vue +10 -7
  31. package/src/components/content/Terminal.vue +70 -0
  32. package/src/components/content/index.ts +2 -1
  33. package/src/components/dashboard-shell/DashboardShell.vue +49 -65
  34. package/src/components/dashboard-shell/index.ts +2 -2
  35. package/src/components/data-list/DataList.vue +11 -13
  36. package/src/components/data-list/DataListItem.vue +9 -11
  37. package/src/components/data-list/DataListLabel.vue +9 -11
  38. package/src/components/data-list/DataListText.vue +9 -11
  39. package/src/components/data-list/DataListValue.vue +9 -11
  40. package/src/components/data-list/index.ts +5 -5
  41. package/src/components/empty-state-card/EmptyStateCard.vue +21 -11
  42. package/src/components/error-page/ErrorPage.vue +24 -27
  43. package/src/components/error-page/index.ts +2 -2
  44. package/src/components/info-card/InfoCard.vue +17 -11
  45. package/src/components/landing/index.ts +6 -6
  46. package/src/components/landing/landing-content/LandingContent.vue +5 -7
  47. package/src/components/landing/landing-content/index.ts +2 -2
  48. package/src/components/landing/landing-footer/LandingFooter.vue +26 -29
  49. package/src/components/landing/landing-footer/index.ts +3 -3
  50. package/src/components/landing/landing-navbar/LandingNavbar.vue +15 -17
  51. package/src/components/landing/landing-navbar/index.ts +2 -2
  52. package/src/components/landing/landing-shell/LandingShell.vue +10 -13
  53. package/src/components/landing/landing-shell/index.ts +2 -2
  54. package/src/components/language-flag/LanguageFlag.vue +6 -5
  55. package/src/components/language-flag/index.ts +1 -0
  56. package/src/components/language-selector/LanguageSelector.vue +20 -21
  57. package/src/components/load-more-button/LoadMoreButton.vue +18 -14
  58. package/src/components/loading-state-card/LoadingStateCard.vue +13 -9
  59. package/src/components/message-dialog/MessageDialog.vue +19 -19
  60. package/src/components/message-dialog/index.ts +3 -11
  61. package/src/components/message-dialog/message-dialog-state.ts +12 -11
  62. package/src/components/message-toast/MessageToast.vue +16 -16
  63. package/src/components/message-toast/index.ts +2 -9
  64. package/src/components/message-toast/message-toast-state.ts +9 -9
  65. package/src/components/page-header/PageHeader.vue +8 -5
  66. package/src/components/progress-component/ProgressComponent.vue +13 -10
  67. package/src/components/single-value-card/SingleValueCard.vue +22 -19
  68. package/src/components/slider-form-component/SliderFormComponent.vue +11 -20
  69. package/src/components/slider-form-component/index.ts +2 -2
  70. package/src/components/switch-form-component/SwitchFormComponent.vue +7 -9
  71. package/src/components/switch-form-component/index.ts +2 -2
  72. package/src/components/text-link/TextLink.vue +11 -7
  73. package/src/components/theme-selector/ThemeSelector.vue +4 -4
  74. package/src/components/ui/accordion/Accordion.vue +12 -15
  75. package/src/components/ui/accordion/index.ts +1 -1
  76. package/src/components/ui/alert/Alert.vue +11 -10
  77. package/src/components/ui/alert/AlertDescription.vue +9 -8
  78. package/src/components/ui/alert/AlertTitle.vue +9 -8
  79. package/src/components/ui/alert/index.ts +10 -10
  80. package/src/components/ui/alert-dialog/AlertDialog.vue +13 -9
  81. package/src/components/ui/alert-dialog/AlertDialogAction.vue +14 -12
  82. package/src/components/ui/alert-dialog/AlertDialogCancel.vue +14 -16
  83. package/src/components/ui/alert-dialog/AlertDialogContent.vue +24 -27
  84. package/src/components/ui/alert-dialog/AlertDialogDescription.vue +13 -13
  85. package/src/components/ui/alert-dialog/AlertDialogFooter.vue +9 -12
  86. package/src/components/ui/alert-dialog/AlertDialogHeader.vue +9 -8
  87. package/src/components/ui/alert-dialog/AlertDialogTitle.vue +13 -11
  88. package/src/components/ui/alert-dialog/AlertDialogTrigger.vue +8 -7
  89. package/src/components/ui/alert-dialog/index.ts +9 -9
  90. package/src/components/ui/badge/Badge.vue +11 -12
  91. package/src/components/ui/badge/index.ts +1 -1
  92. package/src/components/ui/breadcrumb/Breadcrumb.vue +9 -12
  93. package/src/components/ui/breadcrumb/BreadcrumbEllipsis.vue +15 -19
  94. package/src/components/ui/breadcrumb/BreadcrumbItem.vue +10 -12
  95. package/src/components/ui/breadcrumb/BreadcrumbLink.vue +13 -17
  96. package/src/components/ui/breadcrumb/BreadcrumbList.vue +10 -12
  97. package/src/components/ui/breadcrumb/BreadcrumbPage.vue +10 -15
  98. package/src/components/ui/breadcrumb/BreadcrumbSeparator.vue +14 -18
  99. package/src/components/ui/breadcrumb/index.ts +7 -7
  100. package/src/components/ui/busy/Busy.vue +36 -29
  101. package/src/components/ui/busy/index.ts +1 -1
  102. package/src/components/ui/button/Button.vue +18 -19
  103. package/src/components/ui/button/index.ts +54 -35
  104. package/src/components/ui/calendar/Calendar.vue +167 -121
  105. package/src/components/ui/calendar/CalendarCell.vue +18 -17
  106. package/src/components/ui/calendar/CalendarCellTrigger.vue +31 -33
  107. package/src/components/ui/calendar/CalendarGrid.vue +14 -17
  108. package/src/components/ui/calendar/CalendarGridBody.vue +9 -11
  109. package/src/components/ui/calendar/CalendarGridHead.vue +10 -12
  110. package/src/components/ui/calendar/CalendarGridRow.vue +14 -16
  111. package/src/components/ui/calendar/CalendarHeadCell.vue +18 -17
  112. package/src/components/ui/calendar/CalendarHeader.vue +18 -17
  113. package/src/components/ui/calendar/CalendarHeading.vue +18 -22
  114. package/src/components/ui/calendar/CalendarNextButton.vue +29 -26
  115. package/src/components/ui/calendar/CalendarPrevButton.vue +29 -26
  116. package/src/components/ui/calendar/index.ts +17 -13
  117. package/src/components/ui/card/Card.vue +21 -13
  118. package/src/components/ui/card/CardAction.vue +12 -7
  119. package/src/components/ui/card/CardContent.vue +8 -7
  120. package/src/components/ui/card/CardDescription.vue +16 -7
  121. package/src/components/ui/card/CardFooter.vue +8 -7
  122. package/src/components/ui/card/CardHeader.vue +12 -7
  123. package/src/components/ui/card/CardText.vue +12 -7
  124. package/src/components/ui/card/CardTitle.vue +9 -7
  125. package/src/components/ui/card/index.ts +8 -8
  126. package/src/components/ui/command/Command.vue +71 -61
  127. package/src/components/ui/command/CommandDialog.vue +33 -23
  128. package/src/components/ui/command/CommandEmpty.vue +19 -20
  129. package/src/components/ui/command/CommandGroup.vue +32 -35
  130. package/src/components/ui/command/CommandInput.vue +25 -21
  131. package/src/components/ui/command/CommandItem.vue +62 -59
  132. package/src/components/ui/command/CommandList.vue +21 -18
  133. package/src/components/ui/command/CommandSeparator.vue +13 -11
  134. package/src/components/ui/command/CommandShortcut.vue +13 -8
  135. package/src/components/ui/command/index.ts +24 -20
  136. package/src/components/ui/date-picker/DatePicker.vue +46 -37
  137. package/src/components/ui/date-picker/index.ts +2 -2
  138. package/src/components/ui/date-time-picker/DateTimePicker.vue +99 -95
  139. package/src/components/ui/date-time-picker/index.ts +2 -2
  140. package/src/components/ui/dialog/Dialog.vue +12 -9
  141. package/src/components/ui/dialog/DialogClose.vue +8 -10
  142. package/src/components/ui/dialog/DialogContent.vue +36 -42
  143. package/src/components/ui/dialog/DialogDescription.vue +16 -11
  144. package/src/components/ui/dialog/DialogFooter.vue +13 -12
  145. package/src/components/ui/dialog/DialogHeader.vue +9 -8
  146. package/src/components/ui/dialog/DialogOverlay.vue +16 -11
  147. package/src/components/ui/dialog/DialogScrollContent.vue +47 -45
  148. package/src/components/ui/dialog/DialogTitle.vue +13 -12
  149. package/src/components/ui/dialog/DialogTrigger.vue +8 -7
  150. package/src/components/ui/dialog/index.ts +10 -10
  151. package/src/components/ui/field/Field.vue +12 -14
  152. package/src/components/ui/field/FieldContent.vue +13 -11
  153. package/src/components/ui/field/FieldDescription.vue +15 -13
  154. package/src/components/ui/field/FieldError.vue +43 -40
  155. package/src/components/ui/field/FieldGroup.vue +13 -11
  156. package/src/components/ui/field/FieldLabel.vue +16 -14
  157. package/src/components/ui/field/FieldLegend.vue +16 -14
  158. package/src/components/ui/field/FieldSeparator.vue +17 -15
  159. package/src/components/ui/field/FieldSet.vue +14 -12
  160. package/src/components/ui/field/FieldTitle.vue +13 -11
  161. package/src/components/ui/field/index.ts +36 -36
  162. package/src/components/ui/input/Input.vue +23 -20
  163. package/src/components/ui/input/index.ts +1 -1
  164. package/src/components/ui/label/Label.vue +16 -15
  165. package/src/components/ui/label/index.ts +1 -1
  166. package/src/components/ui/native-select/NativeSelect.vue +31 -41
  167. package/src/components/ui/native-select/NativeSelectOptGroup.vue +8 -7
  168. package/src/components/ui/native-select/NativeSelectOption.vue +8 -7
  169. package/src/components/ui/native-select/index.ts +3 -3
  170. package/src/components/ui/popover/Popover.vue +12 -9
  171. package/src/components/ui/popover/PopoverAnchor.vue +8 -7
  172. package/src/components/ui/popover/PopoverContent.vue +27 -31
  173. package/src/components/ui/popover/PopoverTrigger.vue +8 -7
  174. package/src/components/ui/popover/index.ts +4 -4
  175. package/src/components/ui/progress/Progress.vue +18 -32
  176. package/src/components/ui/progress/index.ts +1 -1
  177. package/src/components/ui/scroll-area/ScrollArea.vue +23 -26
  178. package/src/components/ui/scroll-area/ScrollBar.vue +22 -26
  179. package/src/components/ui/scroll-area/index.ts +2 -2
  180. package/src/components/ui/select/Select.vue +12 -9
  181. package/src/components/ui/select/SelectContent.vue +39 -40
  182. package/src/components/ui/select/SelectGroup.vue +8 -7
  183. package/src/components/ui/select/SelectItem.vue +36 -41
  184. package/src/components/ui/select/SelectItemContent.vue +22 -15
  185. package/src/components/ui/select/SelectItemText.vue +8 -7
  186. package/src/components/ui/select/SelectLabel.vue +10 -9
  187. package/src/components/ui/select/SelectScrollDownButton.vue +21 -17
  188. package/src/components/ui/select/SelectScrollUpButton.vue +21 -17
  189. package/src/components/ui/select/SelectSeparator.vue +11 -9
  190. package/src/components/ui/select/SelectTrigger.vue +27 -25
  191. package/src/components/ui/select/SelectValue.vue +8 -7
  192. package/src/components/ui/select/SelectValueContent.vue +30 -18
  193. package/src/components/ui/select/index.ts +13 -13
  194. package/src/components/ui/separator/Separator.vue +17 -18
  195. package/src/components/ui/separator/index.ts +1 -1
  196. package/src/components/ui/sheet/Sheet.vue +12 -9
  197. package/src/components/ui/sheet/SheetClose.vue +8 -7
  198. package/src/components/ui/sheet/SheetContent.vue +36 -37
  199. package/src/components/ui/sheet/SheetDescription.vue +12 -11
  200. package/src/components/ui/sheet/SheetFooter.vue +8 -7
  201. package/src/components/ui/sheet/SheetHeader.vue +8 -7
  202. package/src/components/ui/sheet/SheetOverlay.vue +16 -11
  203. package/src/components/ui/sheet/SheetTitle.vue +12 -11
  204. package/src/components/ui/sheet/SheetTrigger.vue +8 -7
  205. package/src/components/ui/sheet/index.ts +8 -8
  206. package/src/components/ui/sidebar/Sidebar.vue +68 -61
  207. package/src/components/ui/sidebar/SidebarContent.vue +13 -8
  208. package/src/components/ui/sidebar/SidebarFooter.vue +13 -8
  209. package/src/components/ui/sidebar/SidebarGroup.vue +13 -8
  210. package/src/components/ui/sidebar/SidebarGroupAction.vue +16 -16
  211. package/src/components/ui/sidebar/SidebarGroupContent.vue +9 -8
  212. package/src/components/ui/sidebar/SidebarGroupLabel.vue +15 -14
  213. package/src/components/ui/sidebar/SidebarHeader.vue +13 -8
  214. package/src/components/ui/sidebar/SidebarInput.vue +14 -12
  215. package/src/components/ui/sidebar/SidebarInset.vue +14 -12
  216. package/src/components/ui/sidebar/SidebarMenu.vue +9 -8
  217. package/src/components/ui/sidebar/SidebarMenuAction.vue +25 -23
  218. package/src/components/ui/sidebar/SidebarMenuBadge.vue +19 -17
  219. package/src/components/ui/sidebar/SidebarMenuButton.vue +33 -32
  220. package/src/components/ui/sidebar/SidebarMenuButtonChild.vue +19 -18
  221. package/src/components/ui/sidebar/SidebarMenuItem.vue +9 -8
  222. package/src/components/ui/sidebar/SidebarMenuSkeleton.vue +17 -12
  223. package/src/components/ui/sidebar/SidebarMenuSub.vue +14 -12
  224. package/src/components/ui/sidebar/SidebarMenuSubButton.vue +24 -21
  225. package/src/components/ui/sidebar/SidebarMenuSubItem.vue +9 -8
  226. package/src/components/ui/sidebar/SidebarProvider.vue +63 -53
  227. package/src/components/ui/sidebar/SidebarRail.vue +20 -18
  228. package/src/components/ui/sidebar/SidebarSeparator.vue +10 -9
  229. package/src/components/ui/sidebar/SidebarTrigger.vue +15 -14
  230. package/src/components/ui/sidebar/index.ts +62 -58
  231. package/src/components/ui/sidebar/utils.ts +16 -16
  232. package/src/components/ui/skeleton/Skeleton.vue +12 -9
  233. package/src/components/ui/skeleton/index.ts +1 -1
  234. package/src/components/ui/slider/Slider.vue +24 -19
  235. package/src/components/ui/slider/index.ts +1 -1
  236. package/src/components/ui/switch/Switch.vue +26 -23
  237. package/src/components/ui/switch/index.ts +1 -1
  238. package/src/components/ui/table/Table.vue +11 -10
  239. package/src/components/ui/table/TableBody.vue +9 -11
  240. package/src/components/ui/table/TableCaption.vue +9 -11
  241. package/src/components/ui/table/TableCell.vue +13 -16
  242. package/src/components/ui/table/TableEmpty.vue +22 -25
  243. package/src/components/ui/table/TableFooter.vue +13 -11
  244. package/src/components/ui/table/TableHead.vue +13 -11
  245. package/src/components/ui/table/TableHeader.vue +9 -11
  246. package/src/components/ui/table/TableRow.vue +13 -11
  247. package/src/components/ui/table/index.ts +9 -9
  248. package/src/components/ui/tabs/Tabs.vue +18 -18
  249. package/src/components/ui/tabs/TabsContent.vue +14 -15
  250. package/src/components/ui/tabs/TabsList.vue +18 -18
  251. package/src/components/ui/tabs/TabsTrigger.vue +19 -20
  252. package/src/components/ui/tabs/index.ts +4 -4
  253. package/src/components/ui/textarea/Textarea.vue +23 -20
  254. package/src/components/ui/textarea/index.ts +1 -1
  255. package/src/components/ui/time-picker/TimePicker.vue +33 -38
  256. package/src/components/ui/time-picker/index.ts +2 -2
  257. package/src/components/ui/tooltip/Tooltip.vue +12 -9
  258. package/src/components/ui/tooltip/TooltipContent.vue +28 -20
  259. package/src/components/ui/tooltip/TooltipProvider.vue +9 -8
  260. package/src/components/ui/tooltip/TooltipTrigger.vue +8 -7
  261. package/src/components/ui/tooltip/index.ts +4 -4
  262. package/src/i18n/de.json +5 -0
  263. package/src/i18n/en.json +5 -0
  264. package/src/i18n/es.json +5 -0
  265. package/src/i18n/fr.json +5 -0
  266. package/src/i18n/it.json +5 -0
  267. package/src/i18n/ja.json +5 -0
  268. package/src/i18n/pt.json +5 -0
  269. package/src/i18n/ru.json +5 -0
  270. package/src/i18n/zh.json +5 -0
  271. package/src/lib/common-types.ts +2 -0
  272. package/src/lib/i18n.ts +0 -5
  273. package/src/runtime/{ui-vintage-i18n-plugin.js → ui-vintage-i18n-plugin.ts} +30 -8
@@ -1,7 +1,7 @@
1
1
  <script setup lang="ts">
2
2
  import { computed, onMounted, onUnmounted, ref } from 'vue';
3
3
  import { useI18n } from 'vue-i18n';
4
- import { ComputerIcon, GibbousMoonIcon, Sun01Icon, Tick02Icon } from '@hugeicons/core-free-icons';
4
+ import { LaptopIcon, Moon01Icon, Sun01Icon, Tick02Icon } from '@hugeicons/core-free-icons';
5
5
  import { HugeiconsIcon } from '@hugeicons/vue';
6
6
  import { Button } from '../ui/button';
7
7
  import { Command, CommandGroup, CommandItem, CommandList } from '../ui/command';
@@ -18,9 +18,9 @@ const getThemeIcon = (theme: string) => {
18
18
  if (theme === 'light') {
19
19
  return Sun01Icon;
20
20
  } else if (theme === 'dark') {
21
- return GibbousMoonIcon;
21
+ return Moon01Icon;
22
22
  } else {
23
- return ComputerIcon;
23
+ return LaptopIcon;
24
24
  }
25
25
  };
26
26
 
@@ -112,7 +112,7 @@ onUnmounted(() => {
112
112
  </PopoverTrigger>
113
113
 
114
114
  <!-- Theme options -->
115
- <PopoverContent side="bottom" align="end" :side-offset="8" class="w-44 !p-0">
115
+ <PopoverContent side="bottom" align="end" :side-offset="8" class="w-44 p-0!">
116
116
  <Command :model-value="currentTheme">
117
117
  <CommandList>
118
118
  <CommandGroup :heading="t('uiVintage.theme.title')">
@@ -1,21 +1,18 @@
1
1
  <script setup lang="ts">
2
- import type { HTMLAttributes } from "vue";
3
- import { ref } from "vue";
4
- import { ArrowDown01Icon } from "@hugeicons/core-free-icons";
5
- import { HugeiconsIcon } from "@hugeicons/vue";
6
- import { Card, CardContent } from "@brumaombra/ui-vintage/card";
2
+ import type { HTMLAttributes } from 'vue';
3
+ import { ref } from 'vue';
4
+ import { ArrowDown01Icon } from '@hugeicons/core-free-icons';
5
+ import { HugeiconsIcon } from '@hugeicons/vue';
6
+ import { Card, CardContent } from '@brumaombra/ui-vintage/card';
7
+ import type { HugeiconsIconDefinition } from '../../../lib/common-types';
7
8
 
8
- type HugeiconsIconDefinition = readonly (readonly [string, { readonly [key: string]: string | number }])[];
9
-
10
- interface AccordionProps {
9
+ // Props
10
+ const props = withDefaults(defineProps<{
11
11
  title: string;
12
12
  initiallyExpanded?: boolean;
13
13
  icon?: HugeiconsIconDefinition | null;
14
- iconClass?: HTMLAttributes["class"];
15
- }
16
-
17
- // Props
18
- const props = withDefaults(defineProps<AccordionProps>(), {
14
+ iconClass?: HTMLAttributes['class'];
15
+ }>(), {
19
16
  initiallyExpanded: false
20
17
  });
21
18
 
@@ -28,10 +25,10 @@ const toggleExpanded = () => {
28
25
  </script>
29
26
 
30
27
  <template>
31
- <Card class="p-0! overflow-hidden" @click="toggleExpanded">
28
+ <Card class="p-0! overflow-hidden">
32
29
  <CardContent class="p-0! gap-0">
33
30
  <!-- Header -->
34
- <div class="flex items-center justify-between p-5 gap-4 text-left cursor-pointer">
31
+ <div class="flex items-center justify-between p-5 gap-4 text-left cursor-pointer" @click="toggleExpanded">
35
32
  <div class="flex items-center gap-3 min-w-0">
36
33
  <!-- Icon -->
37
34
  <div v-if="props.icon" class="flex h-8 w-8 shrink-0 items-center justify-center rounded bg-(--bg-card-light) border border-(--border-light) dark:bg-(--bg-card-dark) dark:border-(--border-dark) md:h-10 md:w-10">
@@ -1 +1 @@
1
- export { default as Accordion } from "./Accordion.vue"
1
+ export { default as Accordion } from './Accordion.vue';
@@ -1,17 +1,18 @@
1
1
  <script setup lang="ts">
2
- import type { HTMLAttributes } from "vue"
3
- import { getSurfaceToneClasses } from "../../../lib/color-tokens"
4
- import { cn } from "../../../lib/utils"
5
- import { alertClasses, type AlertColors } from "."
2
+ import type { HTMLAttributes } from 'vue';
3
+ import { getSurfaceToneClasses } from '../../../lib/color-tokens';
4
+ import { cn } from '../../../lib/utils';
5
+ import { alertClasses, type AlertColors } from '.';
6
6
 
7
+ // Props
7
8
  const props = defineProps<{
8
- class?: HTMLAttributes["class"]
9
- color?: AlertColors["color"]
10
- }>()
9
+ class?: HTMLAttributes['class'];
10
+ color?: AlertColors['color'];
11
+ }>();
11
12
  </script>
12
13
 
13
14
  <template>
14
- <div data-slot="alert" role="alert" :class="cn(alertClasses(), getSurfaceToneClasses(props.color ?? 'gray'), props.class)">
15
- <slot />
16
- </div>
15
+ <div data-slot="alert" role="alert" :class="cn(alertClasses(), getSurfaceToneClasses(props.color ?? 'gray'), props.class)">
16
+ <slot />
17
+ </div>
17
18
  </template>
@@ -1,14 +1,15 @@
1
1
  <script setup lang="ts">
2
- import type { HTMLAttributes } from "vue"
3
- import { cn } from "../../../lib/utils"
2
+ import type { HTMLAttributes } from 'vue';
3
+ import { cn } from '../../../lib/utils';
4
4
 
5
+ // Props
5
6
  const props = defineProps<{
6
- class?: HTMLAttributes["class"]
7
- }>()
7
+ class?: HTMLAttributes['class'];
8
+ }>();
8
9
  </script>
9
10
 
10
11
  <template>
11
- <div data-slot="alert-description" :class="cn('col-start-2 grid justify-items-start gap-1 [&_p]:leading-relaxed', props.class)">
12
- <slot />
13
- </div>
14
- </template>
12
+ <div data-slot="alert-description" :class="cn('col-start-2 grid justify-items-start gap-1 [&_p]:leading-relaxed', props.class)">
13
+ <slot />
14
+ </div>
15
+ </template>
@@ -1,14 +1,15 @@
1
1
  <script setup lang="ts">
2
- import type { HTMLAttributes } from "vue"
3
- import { cn } from "../../../lib/utils"
2
+ import type { HTMLAttributes } from 'vue';
3
+ import { cn } from '../../../lib/utils';
4
4
 
5
+ // Props
5
6
  const props = defineProps<{
6
- class?: HTMLAttributes["class"]
7
- }>()
7
+ class?: HTMLAttributes['class'];
8
+ }>();
8
9
  </script>
9
10
 
10
11
  <template>
11
- <div data-slot="alert-title" :class="cn('col-start-2 line-clamp-1 min-h-4 font-bold tracking-tight text-current', props.class)">
12
- <slot />
13
- </div>
14
- </template>
12
+ <div data-slot="alert-title" :class="cn('col-start-2 line-clamp-1 min-h-4 font-bold tracking-tight text-current', props.class)">
13
+ <slot />
14
+ </div>
15
+ </template>
@@ -1,15 +1,15 @@
1
- import type { ClassProp } from "class-variance-authority/types"
2
- import { cva } from "class-variance-authority"
3
- import type { ToneColor } from "../../../lib/color-tokens"
1
+ import type { ClassProp } from 'class-variance-authority/types';
2
+ import { cva } from 'class-variance-authority';
3
+ import type { ToneColor } from '../../../lib/color-tokens';
4
4
 
5
- export { default as Alert } from "./Alert.vue"
6
- export { default as AlertDescription } from "./AlertDescription.vue"
7
- export { default as AlertTitle } from "./AlertTitle.vue"
5
+ export { default as Alert } from './Alert.vue';
6
+ export { default as AlertDescription } from './AlertDescription.vue';
7
+ export { default as AlertTitle } from './AlertTitle.vue';
8
8
 
9
9
  export type AlertColors = {
10
- color?: ToneColor | null | undefined
11
- }
10
+ color?: ToneColor | null | undefined;
11
+ };
12
12
 
13
13
  export const alertClasses: (props?: ClassProp) => string = cva(
14
- "relative w-full rounded px-3 py-2 text-xs transition-colors duration-300 ease-in-out grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current sm:px-4 sm:py-3 sm:text-sm",
15
- )
14
+ 'relative w-full rounded px-3 py-2 text-xs transition-colors duration-300 ease-in-out grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current sm:px-4 sm:py-3 sm:text-sm',
15
+ );
@@ -1,15 +1,19 @@
1
1
  <script setup lang="ts">
2
- import type { AlertDialogEmits, AlertDialogProps } from "reka-ui"
3
- import { AlertDialogRoot, useForwardPropsEmits } from "reka-ui"
2
+ import type { AlertDialogEmits, AlertDialogProps } from 'reka-ui';
3
+ import { AlertDialogRoot, useForwardPropsEmits } from 'reka-ui';
4
4
 
5
- const props = defineProps<AlertDialogProps>()
6
- const emits = defineEmits<AlertDialogEmits>()
5
+ // Props
6
+ const props = defineProps<AlertDialogProps>();
7
7
 
8
- const forwarded = useForwardPropsEmits(props, emits)
8
+ // Emits
9
+ const emits = defineEmits<AlertDialogEmits>();
10
+
11
+ // Forward props and emits
12
+ const forwarded = useForwardPropsEmits(props, emits);
9
13
  </script>
10
14
 
11
15
  <template>
12
- <AlertDialogRoot v-slot="slotProps" data-slot="alert-dialog" v-bind="forwarded">
13
- <slot v-bind="slotProps" />
14
- </AlertDialogRoot>
15
- </template>
16
+ <AlertDialogRoot v-slot="slotProps" data-slot="alert-dialog" v-bind="forwarded">
17
+ <slot v-bind="slotProps" />
18
+ </AlertDialogRoot>
19
+ </template>
@@ -1,18 +1,20 @@
1
1
  <script setup lang="ts">
2
- import type { AlertDialogActionProps } from "reka-ui"
3
- import type { HTMLAttributes } from "vue"
4
- import { reactiveOmit } from "@vueuse/core"
5
- import { AlertDialogAction } from "reka-ui"
6
- import { cn } from "../../../lib/utils"
7
- import { buttonVariants } from '../button'
2
+ import type { AlertDialogActionProps } from 'reka-ui';
3
+ import type { HTMLAttributes } from 'vue';
4
+ import { reactiveOmit } from '@vueuse/core';
5
+ import { AlertDialogAction } from 'reka-ui';
6
+ import { cn } from '../../../lib/utils';
7
+ import { buttonVariants } from '../button';
8
8
 
9
- const props = defineProps<AlertDialogActionProps & { class?: HTMLAttributes["class"] }>()
9
+ // Props
10
+ const props = defineProps<AlertDialogActionProps & { class?: HTMLAttributes['class'] }>();
10
11
 
11
- const delegatedProps = reactiveOmit(props, "class")
12
+ // Omit local class from delegated props
13
+ const delegatedProps = reactiveOmit(props, 'class');
12
14
  </script>
13
15
 
14
16
  <template>
15
- <AlertDialogAction v-bind="delegatedProps" :class="cn(buttonVariants(), props.class)">
16
- <slot />
17
- </AlertDialogAction>
18
- </template>
17
+ <AlertDialogAction v-bind="delegatedProps" :class="cn(buttonVariants(), props.class)">
18
+ <slot />
19
+ </AlertDialogAction>
20
+ </template>
@@ -1,22 +1,20 @@
1
1
  <script setup lang="ts">
2
- import type { AlertDialogCancelProps } from "reka-ui"
3
- import type { HTMLAttributes } from "vue"
4
- import { reactiveOmit } from "@vueuse/core"
5
- import { AlertDialogCancel } from "reka-ui"
6
- import { cn } from "../../../lib/utils"
7
- import { buttonVariants } from '../button'
2
+ import type { AlertDialogCancelProps } from 'reka-ui';
3
+ import type { HTMLAttributes } from 'vue';
4
+ import { reactiveOmit } from '@vueuse/core';
5
+ import { AlertDialogCancel } from 'reka-ui';
6
+ import { cn } from '../../../lib/utils';
7
+ import { buttonVariants } from '../button';
8
8
 
9
- const props = defineProps<AlertDialogCancelProps & { class?: HTMLAttributes["class"] }>()
9
+ // Props
10
+ const props = defineProps<AlertDialogCancelProps & { class?: HTMLAttributes['class'] }>();
10
11
 
11
- const delegatedProps = reactiveOmit(props, "class")
12
+ // Omit local class from delegated props
13
+ const delegatedProps = reactiveOmit(props, 'class');
12
14
  </script>
13
15
 
14
16
  <template>
15
- <AlertDialogCancel v-bind="delegatedProps" :class="cn(
16
- buttonVariants({ variant: 'secondary' }),
17
- 'mt-2 sm:mt-0',
18
- props.class,
19
- )">
20
- <slot />
21
- </AlertDialogCancel>
22
- </template>
17
+ <AlertDialogCancel v-bind="delegatedProps" :class="cn(buttonVariants({ variant: 'secondary' }), 'mt-2 sm:mt-0', props.class)">
18
+ <slot />
19
+ </AlertDialogCancel>
20
+ </template>
@@ -1,36 +1,33 @@
1
1
  <script setup lang="ts">
2
- import type { AlertDialogContentEmits, AlertDialogContentProps } from "reka-ui"
3
- import type { HTMLAttributes } from "vue"
4
- import { reactiveOmit } from "@vueuse/core"
5
- import {
6
- AlertDialogContent,
7
- AlertDialogOverlay,
8
- AlertDialogPortal,
9
- useForwardPropsEmits,
10
- } from "reka-ui"
11
- import { cn } from "../../../lib/utils"
2
+ import type { AlertDialogContentEmits, AlertDialogContentProps } from 'reka-ui';
3
+ import type { HTMLAttributes } from 'vue';
4
+ import { reactiveOmit } from '@vueuse/core';
5
+ import { AlertDialogContent, AlertDialogOverlay, AlertDialogPortal, useForwardPropsEmits } from 'reka-ui';
6
+ import { cn } from '../../../lib/utils';
12
7
 
8
+ // Keep attrs on the dialog content element
13
9
  defineOptions({
14
- inheritAttrs: false,
15
- })
10
+ inheritAttrs: false
11
+ });
16
12
 
17
- const props = defineProps<AlertDialogContentProps & { class?: HTMLAttributes["class"] }>()
18
- const emits = defineEmits<AlertDialogContentEmits>()
13
+ // Props
14
+ const props = defineProps<AlertDialogContentProps & { class?: HTMLAttributes['class'] }>();
19
15
 
20
- const delegatedProps = reactiveOmit(props, "class")
16
+ // Emits
17
+ const emits = defineEmits<AlertDialogContentEmits>();
21
18
 
22
- const forwarded = useForwardPropsEmits(delegatedProps, emits)
19
+ // Omit local class from delegated props
20
+ const delegatedProps = reactiveOmit(props, 'class');
21
+
22
+ // Forward props and emits
23
+ const forwarded = useForwardPropsEmits(delegatedProps, emits);
23
24
  </script>
24
25
 
25
26
  <template>
26
- <AlertDialogPortal>
27
- <AlertDialogOverlay data-slot="alert-dialog-overlay" class="fixed inset-0 z-50 bg-black/45 backdrop-blur-[2px] transition-[opacity,backdrop-filter] ease-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500 data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0" />
28
- <AlertDialogContent data-slot="alert-dialog-content" v-bind="{ ...$attrs, ...forwarded }" :class="cn(
29
- 'bg-card text-card-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-[95%] max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-0 overflow-hidden rounded border border-border shadow-2xl duration-200 sm:max-w-lg',
30
- props.class,
31
- )
32
- ">
33
- <slot />
34
- </AlertDialogContent>
35
- </AlertDialogPortal>
36
- </template>
27
+ <AlertDialogPortal>
28
+ <AlertDialogOverlay data-slot="alert-dialog-overlay" class="fixed inset-0 z-50 bg-black/45 backdrop-blur-[2px] transition-[opacity,backdrop-filter] ease-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500 data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0" />
29
+ <AlertDialogContent data-slot="alert-dialog-content" v-bind="{ ...$attrs, ...forwarded }" :class="cn('bg-card text-card-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-[95%] max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-0 overflow-hidden rounded border border-border shadow-2xl duration-200 sm:max-w-lg', props.class)">
30
+ <slot />
31
+ </AlertDialogContent>
32
+ </AlertDialogPortal>
33
+ </template>
@@ -1,19 +1,19 @@
1
1
  <script setup lang="ts">
2
- import type { AlertDialogDescriptionProps } from "reka-ui"
3
- import type { HTMLAttributes } from "vue"
4
- import { reactiveOmit } from "@vueuse/core"
5
- import {
6
- AlertDialogDescription,
7
- } from "reka-ui"
8
- import { cn } from "../../../lib/utils"
2
+ import type { AlertDialogDescriptionProps } from 'reka-ui';
3
+ import type { HTMLAttributes } from 'vue';
4
+ import { reactiveOmit } from '@vueuse/core';
5
+ import { AlertDialogDescription } from 'reka-ui';
6
+ import { cn } from '../../../lib/utils';
9
7
 
10
- const props = defineProps<AlertDialogDescriptionProps & { class?: HTMLAttributes["class"] }>()
8
+ // Props
9
+ const props = defineProps<AlertDialogDescriptionProps & { class?: HTMLAttributes['class'] }>();
11
10
 
12
- const delegatedProps = reactiveOmit(props, "class")
11
+ // Omit local class from delegated props
12
+ const delegatedProps = reactiveOmit(props, 'class');
13
13
  </script>
14
14
 
15
15
  <template>
16
- <AlertDialogDescription data-slot="alert-dialog-description" v-bind="delegatedProps" :class="cn('text-xs leading-6 text-muted-foreground sm:text-sm', props.class)">
17
- <slot />
18
- </AlertDialogDescription>
19
- </template>
16
+ <AlertDialogDescription data-slot="alert-dialog-description" v-bind="delegatedProps" :class="cn('text-xs leading-6 text-muted-foreground sm:text-sm', props.class)">
17
+ <slot />
18
+ </AlertDialogDescription>
19
+ </template>
@@ -1,18 +1,15 @@
1
1
  <script setup lang="ts">
2
- import type { HTMLAttributes } from "vue"
3
- import { cn } from "../../../lib/utils"
2
+ import type { HTMLAttributes } from 'vue';
3
+ import { cn } from '../../../lib/utils';
4
4
 
5
+ // Props
5
6
  const props = defineProps<{
6
- class?: HTMLAttributes["class"]
7
- }>()
7
+ class?: HTMLAttributes['class'];
8
+ }>();
8
9
  </script>
9
10
 
10
11
  <template>
11
- <div data-slot="alert-dialog-footer" :class="cn(
12
- 'flex flex-col-reverse gap-3 border-t border-border px-5 py-4 sm:flex-row-reverse sm:px-6',
13
- props.class,
14
- )
15
- ">
16
- <slot />
17
- </div>
18
- </template>
12
+ <div data-slot="alert-dialog-footer" :class="cn('flex flex-col-reverse gap-3 border-t border-border px-5 py-4 sm:flex-row-reverse sm:px-6', props.class)">
13
+ <slot />
14
+ </div>
15
+ </template>
@@ -1,14 +1,15 @@
1
1
  <script setup lang="ts">
2
- import type { HTMLAttributes } from "vue"
3
- import { cn } from "../../../lib/utils"
2
+ import type { HTMLAttributes } from 'vue';
3
+ import { cn } from '../../../lib/utils';
4
4
 
5
+ // Props
5
6
  const props = defineProps<{
6
- class?: HTMLAttributes["class"]
7
- }>()
7
+ class?: HTMLAttributes['class'];
8
+ }>();
8
9
  </script>
9
10
 
10
11
  <template>
11
- <div data-slot="alert-dialog-header" :class="cn('flex flex-col gap-1.5 text-center sm:text-left', props.class)">
12
- <slot />
13
- </div>
14
- </template>
12
+ <div data-slot="alert-dialog-header" :class="cn('flex flex-col gap-1.5 text-center sm:text-left', props.class)">
13
+ <slot />
14
+ </div>
15
+ </template>
@@ -1,17 +1,19 @@
1
1
  <script setup lang="ts">
2
- import type { AlertDialogTitleProps } from "reka-ui"
3
- import type { HTMLAttributes } from "vue"
4
- import { reactiveOmit } from "@vueuse/core"
5
- import { AlertDialogTitle } from "reka-ui"
6
- import { cn } from "../../../lib/utils"
2
+ import type { AlertDialogTitleProps } from 'reka-ui';
3
+ import type { HTMLAttributes } from 'vue';
4
+ import { reactiveOmit } from '@vueuse/core';
5
+ import { AlertDialogTitle } from 'reka-ui';
6
+ import { cn } from '../../../lib/utils';
7
7
 
8
- const props = defineProps<AlertDialogTitleProps & { class?: HTMLAttributes["class"] }>()
8
+ // Props
9
+ const props = defineProps<AlertDialogTitleProps & { class?: HTMLAttributes['class'] }>();
9
10
 
10
- const delegatedProps = reactiveOmit(props, "class")
11
+ // Omit local class from delegated props
12
+ const delegatedProps = reactiveOmit(props, 'class');
11
13
  </script>
12
14
 
13
15
  <template>
14
- <AlertDialogTitle data-slot="alert-dialog-title" v-bind="delegatedProps" :class="cn('text-base font-semibold', props.class)">
15
- <slot />
16
- </AlertDialogTitle>
17
- </template>
16
+ <AlertDialogTitle data-slot="alert-dialog-title" v-bind="delegatedProps" :class="cn('text-base font-semibold', props.class)">
17
+ <slot />
18
+ </AlertDialogTitle>
19
+ </template>
@@ -1,12 +1,13 @@
1
1
  <script setup lang="ts">
2
- import type { AlertDialogTriggerProps } from "reka-ui"
3
- import { AlertDialogTrigger } from "reka-ui"
2
+ import type { AlertDialogTriggerProps } from 'reka-ui';
3
+ import { AlertDialogTrigger } from 'reka-ui';
4
4
 
5
- const props = defineProps<AlertDialogTriggerProps>()
5
+ // Props
6
+ const props = defineProps<AlertDialogTriggerProps>();
6
7
  </script>
7
8
 
8
9
  <template>
9
- <AlertDialogTrigger data-slot="alert-dialog-trigger" v-bind="props">
10
- <slot />
11
- </AlertDialogTrigger>
12
- </template>
10
+ <AlertDialogTrigger data-slot="alert-dialog-trigger" v-bind="props">
11
+ <slot />
12
+ </AlertDialogTrigger>
13
+ </template>
@@ -1,9 +1,9 @@
1
- export { default as AlertDialog } from "./AlertDialog.vue"
2
- export { default as AlertDialogAction } from "./AlertDialogAction.vue"
3
- export { default as AlertDialogCancel } from "./AlertDialogCancel.vue"
4
- export { default as AlertDialogContent } from "./AlertDialogContent.vue"
5
- export { default as AlertDialogDescription } from "./AlertDialogDescription.vue"
6
- export { default as AlertDialogFooter } from "./AlertDialogFooter.vue"
7
- export { default as AlertDialogHeader } from "./AlertDialogHeader.vue"
8
- export { default as AlertDialogTitle } from "./AlertDialogTitle.vue"
9
- export { default as AlertDialogTrigger } from "./AlertDialogTrigger.vue"
1
+ export { default as AlertDialog } from './AlertDialog.vue';
2
+ export { default as AlertDialogAction } from './AlertDialogAction.vue';
3
+ export { default as AlertDialogCancel } from './AlertDialogCancel.vue';
4
+ export { default as AlertDialogContent } from './AlertDialogContent.vue';
5
+ export { default as AlertDialogDescription } from './AlertDialogDescription.vue';
6
+ export { default as AlertDialogFooter } from './AlertDialogFooter.vue';
7
+ export { default as AlertDialogHeader } from './AlertDialogHeader.vue';
8
+ export { default as AlertDialogTitle } from './AlertDialogTitle.vue';
9
+ export { default as AlertDialogTrigger } from './AlertDialogTrigger.vue';
@@ -1,21 +1,20 @@
1
1
  <script setup lang="ts">
2
- import type { HTMLAttributes } from "vue"
3
- import { HugeiconsIcon } from "@hugeicons/vue"
4
- import { getSurfaceToneClasses, type ToneColor } from "../../../lib/color-tokens"
5
- import { cn } from "../../../lib/utils"
6
-
7
- type HugeiconsIconDefinition = readonly (readonly [string, { readonly [key: string]: string | number }])[]
2
+ import type { HTMLAttributes } from 'vue';
3
+ import { HugeiconsIcon } from '@hugeicons/vue';
4
+ import { getSurfaceToneClasses, type ToneColor } from '../../../lib/color-tokens';
5
+ import { cn } from '../../../lib/utils';
6
+ import type { HugeiconsIconDefinition } from '../../../lib/common-types';
8
7
 
9
8
  // Props
10
9
  const props = withDefaults(defineProps<{
11
- text: string
12
- icon?: HugeiconsIconDefinition | null
13
- color?: ToneColor
14
- class?: HTMLAttributes["class"]
10
+ text: string;
11
+ icon?: HugeiconsIconDefinition | null;
12
+ color?: ToneColor;
13
+ class?: HTMLAttributes['class'];
15
14
  }>(), {
16
15
  icon: null,
17
- color: "gray"
18
- })
16
+ color: 'gray'
17
+ });
19
18
  </script>
20
19
 
21
20
  <template>
@@ -1 +1 @@
1
- export { default as Badge } from "./Badge.vue"
1
+ export { default as Badge } from './Badge.vue';
@@ -1,17 +1,14 @@
1
- <script lang="ts" setup>
2
- import type { HTMLAttributes } from "vue"
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue';
3
3
 
4
+ // Props
4
5
  const props = defineProps<{
5
- class?: HTMLAttributes["class"]
6
- }>()
6
+ class?: HTMLAttributes['class'];
7
+ }>();
7
8
  </script>
8
9
 
9
10
  <template>
10
- <nav
11
- aria-label="breadcrumb"
12
- data-slot="breadcrumb"
13
- :class="props.class"
14
- >
15
- <slot />
16
- </nav>
17
- </template>
11
+ <nav aria-label="breadcrumb" data-slot="breadcrumb" :class="props.class">
12
+ <slot />
13
+ </nav>
14
+ </template>
@@ -1,24 +1,20 @@
1
- <script lang="ts" setup>
2
- import type { HTMLAttributes } from "vue"
3
- import { MoreHorizontalIcon } from "@hugeicons/core-free-icons"
4
- import { HugeiconsIcon } from "@hugeicons/vue"
5
- import { cn } from "../../../lib/utils"
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue';
3
+ import { MoreHorizontalIcon } from '@hugeicons/core-free-icons';
4
+ import { HugeiconsIcon } from '@hugeicons/vue';
5
+ import { cn } from '../../../lib/utils';
6
6
 
7
+ // Props
7
8
  const props = defineProps<{
8
- class?: HTMLAttributes["class"]
9
- }>()
9
+ class?: HTMLAttributes['class'];
10
+ }>();
10
11
  </script>
11
12
 
12
13
  <template>
13
- <span
14
- data-slot="breadcrumb-ellipsis"
15
- role="presentation"
16
- aria-hidden="true"
17
- :class="cn('flex size-9 items-center justify-center', props.class)"
18
- >
19
- <slot>
20
- <HugeiconsIcon :icon="MoreHorizontalIcon" class="size-4" />
21
- </slot>
22
- <span class="sr-only">More</span>
23
- </span>
24
- </template>
14
+ <span data-slot="breadcrumb-ellipsis" role="presentation" aria-hidden="true" :class="cn('flex size-9 items-center justify-center', props.class)">
15
+ <slot>
16
+ <HugeiconsIcon :icon="MoreHorizontalIcon" class="size-4" />
17
+ </slot>
18
+ <span class="sr-only">More</span>
19
+ </span>
20
+ </template>