@imaginario27/air-ui-ds 1.0.0

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 (220) hide show
  1. package/assets/css/defaults.css +55 -0
  2. package/assets/css/main.css +238 -0
  3. package/assets/css/theme/colors.css +106 -0
  4. package/assets/css/theme/primitives.css +105 -0
  5. package/assets/css/theme/ui-theme.css +454 -0
  6. package/assets/images/placeholders/missing-image-placeholder.png +0 -0
  7. package/components/accordions/Accordion.vue +31 -0
  8. package/components/accordions/AccordionGroup.vue +78 -0
  9. package/components/accordions/AccordionItem.vue +39 -0
  10. package/components/action-panels/ActionPanel.vue +49 -0
  11. package/components/alerts/Alert.vue +159 -0
  12. package/components/avatars/Avatar.vue +152 -0
  13. package/components/avatars/AvatarStack.vue +97 -0
  14. package/components/avatars/AvatarStackCounter.vue +74 -0
  15. package/components/badges/Badge.vue +221 -0
  16. package/components/badges/BadgeStack.vue +110 -0
  17. package/components/badges/IconBadge.vue +57 -0
  18. package/components/badges/IconTextBadge.vue +50 -0
  19. package/components/breadcrumbs/Breadcrumbs.vue +54 -0
  20. package/components/buttons/ActionButton.vue +395 -0
  21. package/components/buttons/ActionIconButton.vue +283 -0
  22. package/components/buttons/AlertButton.vue +125 -0
  23. package/components/buttons/AlertIconButton.vue +105 -0
  24. package/components/buttons/PaginationButton.vue +45 -0
  25. package/components/buttons/options/OptionButton.vue +61 -0
  26. package/components/buttons/options/OptionButtonGroup.vue +155 -0
  27. package/components/buttons/options/OptionButtonSlider.vue +154 -0
  28. package/components/buttons/toggle/ToggleButton.vue +142 -0
  29. package/components/buttons/toggle/ToggleButtonGroup.vue +73 -0
  30. package/components/cards/Card.vue +33 -0
  31. package/components/cards/CardActions.vue +5 -0
  32. package/components/cards/CardBody.vue +5 -0
  33. package/components/cards/CardFooter.vue +20 -0
  34. package/components/cards/CardHeader.vue +5 -0
  35. package/components/cards/CardTitle.vue +13 -0
  36. package/components/cards/specific/ContactDetailsCard.vue +47 -0
  37. package/components/cards/specific/FeatureCard.vue +59 -0
  38. package/components/cards/specific/HelpTopicCard.vue +62 -0
  39. package/components/cards/specific/MetricCard.vue +42 -0
  40. package/components/cards/specific/TestimonialCard.vue +57 -0
  41. package/components/cards/specific/subscription/CurrentActiveSubscriptionCard.vue +105 -0
  42. package/components/cards/specific/subscription/SubscriptionPlanCard.vue +178 -0
  43. package/components/cards/specific/subscription/UniqueSubscriptionPlanCard.vue +106 -0
  44. package/components/collapsibles/Collapsible.vue +33 -0
  45. package/components/content/ContentItem.vue +144 -0
  46. package/components/content/ContentItemImage.vue +125 -0
  47. package/components/dividers/Divider.vue +35 -0
  48. package/components/dividers/TextLineDivider.vue +58 -0
  49. package/components/dropdowns/DropdownMenu.vue +207 -0
  50. package/components/dropdowns/DropdownMenuActions.vue +11 -0
  51. package/components/dropdowns/DropdownMenuItem.vue +240 -0
  52. package/components/dropdowns/DropdownSelect.vue +469 -0
  53. package/components/dropdowns/DropdownSelectItem.vue +182 -0
  54. package/components/empty-states/EmptyState.vue +170 -0
  55. package/components/features/Feature.vue +77 -0
  56. package/components/forms/DataDetails.vue +7 -0
  57. package/components/forms/DataDetailsActions.vue +23 -0
  58. package/components/forms/DataDetailsFieldGroup.vue +35 -0
  59. package/components/forms/DataDetailsRow.vue +22 -0
  60. package/components/forms/Form.vue +25 -0
  61. package/components/forms/FormActions.vue +23 -0
  62. package/components/forms/FormFieldGroup.vue +35 -0
  63. package/components/forms/FormRow.vue +22 -0
  64. package/components/forms/fields/ButtonField.vue +119 -0
  65. package/components/forms/fields/CheckboxField.vue +205 -0
  66. package/components/forms/fields/DataField.vue +99 -0
  67. package/components/forms/fields/FileUploadField.vue +326 -0
  68. package/components/forms/fields/InputField.vue +371 -0
  69. package/components/forms/fields/OptionButtonsGroupField.vue +120 -0
  70. package/components/forms/fields/RepeaterField.vue +109 -0
  71. package/components/forms/fields/SearchField.vue +184 -0
  72. package/components/forms/fields/SelectField.vue +233 -0
  73. package/components/forms/fields/SliderField.vue +759 -0
  74. package/components/forms/fields/SwitchField.vue +257 -0
  75. package/components/forms/fields/TextareaField.vue +205 -0
  76. package/components/forms/fields/ToggleButtonsGroupField.vue +65 -0
  77. package/components/forms/fields/radio/RadioButtonField.vue +238 -0
  78. package/components/forms/fields/radio/RadioField.vue +157 -0
  79. package/components/forms/fields/radio/RadioGroupField.vue +156 -0
  80. package/components/icons/ContainedIcon.vue +130 -0
  81. package/components/images/QRCode.vue +124 -0
  82. package/components/layouts/ContainerWrapper.vue +13 -0
  83. package/components/layouts/ContentBody.vue +30 -0
  84. package/components/layouts/Grid.vue +25 -0
  85. package/components/layouts/Heading.vue +159 -0
  86. package/components/layouts/MainContent.vue +26 -0
  87. package/components/layouts/MaxWidthContainer.vue +15 -0
  88. package/components/layouts/Overtitle.vue +25 -0
  89. package/components/layouts/headers/CompactHeader.vue +181 -0
  90. package/components/layouts/headers/PageHeader.vue +102 -0
  91. package/components/layouts/headers/WebAppHeader.vue +54 -0
  92. package/components/layouts/section/Section.vue +90 -0
  93. package/components/layouts/section/SectionBody.vue +12 -0
  94. package/components/layouts/section/SectionHeader.vue +12 -0
  95. package/components/layouts/section/SectionTitle.vue +13 -0
  96. package/components/lists/List.vue +69 -0
  97. package/components/lists/ListItem.vue +58 -0
  98. package/components/loaders/Loading.vue +83 -0
  99. package/components/loaders/LoadingScreen.vue +285 -0
  100. package/components/modals/DangerModalDialog.vue +149 -0
  101. package/components/modals/InfoModalDialog.vue +143 -0
  102. package/components/modals/ModalActions.vue +22 -0
  103. package/components/modals/ModalContent.vue +5 -0
  104. package/components/modals/ModalDescription.vue +5 -0
  105. package/components/modals/ModalDialog.vue +122 -0
  106. package/components/modals/ModalHeaderGroup.vue +19 -0
  107. package/components/modals/ModalHeadings.vue +5 -0
  108. package/components/modals/ModalSubtitle.vue +14 -0
  109. package/components/modals/ModalTitle.vue +14 -0
  110. package/components/modals/SuccessModalDialog.vue +90 -0
  111. package/components/modules/AppLogo.vue +46 -0
  112. package/components/modules/SVGImage.vue +44 -0
  113. package/components/navigation/links/NavLink.vue +112 -0
  114. package/components/navigation/nav-menu/NavFooterMenu.vue +91 -0
  115. package/components/navigation/nav-menu/NavMenu.vue +36 -0
  116. package/components/navigation/nav-menu/NavMenuItem.vue +44 -0
  117. package/components/navigation/nav-sidebar/BottomUserNavBar.vue +83 -0
  118. package/components/navigation/nav-sidebar/NavSidebar.vue +172 -0
  119. package/components/navigation/nav-sidebar/NavSidebarMenu.vue +14 -0
  120. package/components/navigation/nav-sidebar/NavSidebarMenuItem.vue +76 -0
  121. package/components/navigation/nav-sidebar/NavSidebarMenuSectionTitle.vue +54 -0
  122. package/components/navigation/table-of-contents/TableOfContents.vue +35 -0
  123. package/components/navigation/table-of-contents/TableOfContentsItem.vue +40 -0
  124. package/components/navigation/table-of-contents/TableOfContentsSidebar.vue +29 -0
  125. package/components/pagination/ButtonPagination.vue +274 -0
  126. package/components/pagination/RowsPerPage.vue +60 -0
  127. package/components/pagination/SimplePagination.vue +97 -0
  128. package/components/password/SecurePasswordCondition.vue +41 -0
  129. package/components/password/SecurePasswordConditions.vue +83 -0
  130. package/components/placeholders/ContentPlaceholder.vue +41 -0
  131. package/components/popovers/Popover.vue +128 -0
  132. package/components/rating/InteractiveRating.vue +94 -0
  133. package/components/rating/Rating.vue +60 -0
  134. package/components/rating/RatingItem.vue +54 -0
  135. package/components/skeletons/Skeleton.vue +11 -0
  136. package/components/spinners/Spinner.vue +13 -0
  137. package/components/steppers/CircleStepper.vue +122 -0
  138. package/components/steppers/Step.vue +72 -0
  139. package/components/steppers/StepIndicator.vue +228 -0
  140. package/components/steppers/TabStepper.vue +126 -0
  141. package/components/steppers/vertical-stepper/VerticalStep.vue +223 -0
  142. package/components/steppers/vertical-stepper/VerticalStepper.vue +63 -0
  143. package/components/tables/Table.vue +26 -0
  144. package/components/tables/TableBody.vue +5 -0
  145. package/components/tables/TableCell.vue +34 -0
  146. package/components/tables/TableCellActions.vue +7 -0
  147. package/components/tables/TableHeader.vue +5 -0
  148. package/components/tables/TableHeaderCell.vue +15 -0
  149. package/components/tables/TableRow.vue +14 -0
  150. package/components/tables/TableWrapper.vue +12 -0
  151. package/components/tabs/Tab.vue +145 -0
  152. package/components/tabs/TabBar.vue +64 -0
  153. package/components/tabs/TabContent.vue +5 -0
  154. package/components/tabs/TabsContainer.vue +5 -0
  155. package/components/transitions/HorizontalExpansionTransition.vue +12 -0
  156. package/components/transitions/VerticalExpansionTransition.vue +14 -0
  157. package/components/users/Author.vue +113 -0
  158. package/components/users/User.vue +53 -0
  159. package/composables/useAccordion.ts +12 -0
  160. package/composables/useDarkMode.ts +9 -0
  161. package/composables/useDropdownMenu.ts +25 -0
  162. package/composables/useForm.ts +134 -0
  163. package/composables/useFormValidationMode.ts +11 -0
  164. package/composables/useIsMobile.ts +27 -0
  165. package/composables/useMobileSidebar.ts +32 -0
  166. package/composables/useShiki.ts +12 -0
  167. package/composables/useTableOfContents.ts +50 -0
  168. package/composables/useToastifyConfig.ts +7 -0
  169. package/eslint.config.mjs +14 -0
  170. package/models/constants/app.ts +8 -0
  171. package/models/constants/form.ts +22 -0
  172. package/models/enums/alerts.ts +6 -0
  173. package/models/enums/aspect-ratios.ts +9 -0
  174. package/models/enums/avatars.ts +21 -0
  175. package/models/enums/badges.ts +10 -0
  176. package/models/enums/buttons.ts +38 -0
  177. package/models/enums/colors.ts +9 -0
  178. package/models/enums/content.ts +4 -0
  179. package/models/enums/counters.ts +4 -0
  180. package/models/enums/dividers.ts +9 -0
  181. package/models/enums/dropdowns.ts +18 -0
  182. package/models/enums/effects.ts +6 -0
  183. package/models/enums/emptyPlaceholders.ts +5 -0
  184. package/models/enums/formFields.ts +19 -0
  185. package/models/enums/formValidations.ts +4 -0
  186. package/models/enums/headings.ts +11 -0
  187. package/models/enums/icons.ts +22 -0
  188. package/models/enums/images.ts +16 -0
  189. package/models/enums/lists.ts +10 -0
  190. package/models/enums/loaders.ts +15 -0
  191. package/models/enums/navigation.ts +18 -0
  192. package/models/enums/order.ts +10 -0
  193. package/models/enums/orientations.ts +4 -0
  194. package/models/enums/pages.ts +10 -0
  195. package/models/enums/positions.ts +21 -0
  196. package/models/enums/rating.ts +12 -0
  197. package/models/enums/sections.ts +8 -0
  198. package/models/enums/selects.ts +16 -0
  199. package/models/enums/sliders.ts +4 -0
  200. package/models/enums/steppers.ts +20 -0
  201. package/models/enums/tabs.ts +11 -0
  202. package/models/enums/triggers.ts +4 -0
  203. package/models/types/accordions.ts +6 -0
  204. package/models/types/avatars.ts +4 -0
  205. package/models/types/badges.ts +4 -0
  206. package/models/types/buttons.ts +26 -0
  207. package/models/types/dropdowns.ts +20 -0
  208. package/models/types/forms.ts +14 -0
  209. package/models/types/navigation.ts +11 -0
  210. package/models/types/pagination.ts +4 -0
  211. package/models/types/pdfExportTable.ts +6 -0
  212. package/models/types/radio.ts +9 -0
  213. package/models/types/selects.ts +14 -0
  214. package/models/types/steppers.ts +17 -0
  215. package/models/types/tableOfContent.ts +6 -0
  216. package/models/types/tabs.ts +7 -0
  217. package/nuxt.config.ts +40 -0
  218. package/package.json +57 -0
  219. package/plugins/vue3-toastify.ts +14 -0
  220. package/tsconfig.json +7 -0
@@ -0,0 +1,454 @@
1
+ :root {
2
+ /* UI Theme - Colors */
3
+ --color-background-container-surface: var(--color-theme-neutral-white);
4
+ --color-background-overlay: #1829531f;
5
+ --color-background-surface: var(--color-theme-neutral-white);
6
+ --color-background-danger-bold: var(--color-theme-danger-700);
7
+ --color-background-danger-subtler: var(--color-theme-danger-100);
8
+ --color-background-danger-subtlest: var(--color-theme-danger-50);
9
+ --color-background-delete-default: var(--color-theme-danger-600);
10
+ --color-background-delete-hover: var(--color-theme-danger-500);
11
+ --color-background-delete-on-neutral-hover: var(--color-theme-danger-100);
12
+ --color-background-delete-soft: var(--color-theme-danger-100);
13
+ --color-background-delete-soft-hover: var(--color-theme-danger-200);
14
+ --color-background-info-bold: var(--color-theme-info-700);
15
+ --color-background-info-subtler: var(--color-theme-info-100);
16
+ --color-background-info-subtlest: var(--color-theme-info-50);
17
+ --color-background-neutral-active: var(--color-theme-neutral-100);
18
+ --color-background-neutral-bold: var(--color-theme-neutral-500);
19
+ --color-background-neutral-default: var(--color-theme-neutral-white);
20
+ --color-background-neutral-disabled: var(--color-theme-neutral-100);
21
+ --color-background-neutral-filled-transparent: #182953d9;
22
+ --color-background-neutral-hover: var(--color-theme-neutral-100);
23
+ --color-background-neutral-hover-subtle: var(--color-theme-neutral-100);
24
+ --color-background-neutral-sublter: var(--color-theme-neutral-100);
25
+ --color-background-neutral-subtle: var(--color-theme-neutral-200);
26
+ --color-background-neutral-subtlest: var(--color-theme-neutral-50);
27
+ --color-background-neutral-subtlest-on-container-surface: var(--color-theme-neutral-50);
28
+ --color-background-neutral-filled-default: var(--color-theme-neutral-950);
29
+ --color-background-neutral-filled-hover: var(--color-theme-neutral-800);
30
+ --color-background-primary-brand-active: var(--color-theme-primary-brand-600);
31
+ --color-background-primary-brand-checked: var(--color-theme-primary-brand-600);
32
+ --color-background-primary-brand-checked-subtlest: var(--color-theme-primary-brand-50);
33
+ --color-background-primary-brand-default: var(--color-theme-primary-brand-700);
34
+ --color-background-primary-brand-hover: var(--color-theme-primary-brand-500);
35
+ --color-background-primary-brand-on-checked-subtle-bg: var(--color-theme-primary-brand-100);
36
+ --color-background-primary-brand-soft: var(--color-theme-primary-brand-100);
37
+ --color-background-primary-brand-soft-hover: var(--color-theme-primary-brand-200);
38
+ --color-background-primary-brand-subtle-active: var(--color-theme-primary-brand-100);
39
+ --color-background-secondary-brand-checked: var(--color-theme-secondary-brand-600);
40
+ --color-background-secondary-brand-checked-subtlest: var(--color-theme-secondary-brand-50);
41
+ --color-background-secondary-brand-default: var(--color-theme-secondary-brand-600);
42
+ --color-background-secondary-brand-hover: var(--color-theme-secondary-brand-800);
43
+ --color-background-secondary-brand-on-checked-subtle-bg: var(--color-theme-secondary-brand-100);
44
+ --color-background-secondary-brand-soft: var(--color-theme-secondary-brand-100);
45
+ --color-background-success-bold: var(--color-theme-success-700);
46
+ --color-background-success-subtler: var(--color-theme-success-100);
47
+ --color-background-success-subtlest: var(--color-theme-success-50);
48
+ --color-background-warning-bold: var(--color-theme-warning-500);
49
+ --color-background-warning-subtler: var(--color-theme-warning-100);
50
+ --color-background-warning-subtlest: var(--color-theme-warning-50);
51
+ --color-border-danger: var(--color-theme-danger-300);
52
+ --color-border-default: var(--color-theme-neutral-200);
53
+ --color-border-error: var(--color-theme-danger-700);
54
+ --color-border-inactive: var(--color-theme-neutral-200);
55
+ --color-border-info: var(--color-theme-info-300);
56
+ --color-border-secondary-brand: var(--color-theme-secondary-brand-700);
57
+ --color-border-success: var(--color-theme-success-300);
58
+ --color-border-warning: var(--color-theme-warning-300);
59
+ --color-border-delete-default: var(--color-theme-danger-600);
60
+ --color-border-delete-subtle: var(--color-theme-danger-200);
61
+ --color-border-neutral-disabled: var(--color-theme-neutral-200);
62
+ --color-border-neutral-hover: var(--color-theme-neutral-400);
63
+ --color-border-neutral-on-filled: var(--color-theme-neutral-white);
64
+ --color-border-neutral-stacked: var(--color-theme-neutral-white);
65
+ --color-border-neutral-subtle: var(--color-theme-neutral-100);
66
+ --color-border-primary-brand-active: var(--color-theme-primary-brand-600);
67
+ --color-border-primary-brand-default: var(--color-theme-primary-brand-700);
68
+ --color-border-primary-brand-hover: var(--color-theme-primary-brand-500);
69
+ --color-chart-variant-five: #e6bb45;
70
+ --color-chart-variant-four: #e65a45;
71
+ --color-chart-variant-one: #5f45e6;
72
+ --color-chart-variant-six: #e64590;
73
+ --color-chart-variant-three: #45e663;
74
+ --color-chart-variant-two: #45e6de;
75
+ --color-icon-danger: var(--color-theme-danger-700);
76
+ --color-icon-danger-subtle: var(--color-theme-danger-400);
77
+ --color-icon-default: var(--color-theme-neutral-950);
78
+ --color-icon-delete: var(--color-theme-danger-600);
79
+ --color-icon-error: var(--color-theme-danger-600);
80
+ --color-icon-info: var(--color-theme-info-700);
81
+ --color-icon-info-subtle-strong: var(--color-theme-info-400);
82
+ --color-icon-rating: #e6c300;
83
+ --color-icon-success: var(--color-theme-success-700);
84
+ --color-icon-success-subtle: var(--color-theme-success-400);
85
+ --color-icon-warning: var(--color-theme-warning-700);
86
+ --color-icon-warning-on-bg: var(--color-theme-warning-700);
87
+ --color-icon-warning-subtle: var(--color-theme-warning-500);
88
+ --color-icon-neutral-disabled: var(--color-theme-neutral-400);
89
+ --color-icon-neutral-inactive: var(--color-theme-neutral-400);
90
+ --color-icon-neutral-on-filled-bg: var(--color-theme-neutral-white);
91
+ --color-icon-neutral-on-filled-secondary-brand-bg: var(--color-theme-neutral-white);
92
+ --color-icon-neutral-on-monochrome-active-bg: var(--color-theme-neutral-700);
93
+ --color-icon-neutral-on-monochrome-hover-bg: var(--color-theme-neutral-600);
94
+ --color-icon-neutral-on-neutral-bg: var(--color-theme-neutral-950);
95
+ --color-icon-neutral-on-primary-brand-soft-bg: var(--color-theme-neutral-400);
96
+ --color-icon-neutral-on-subtlest-bg: var(--color-theme-neutral-400);
97
+ --color-icon-neutral-subtle: var(--color-theme-neutral-600);
98
+ --color-icon-neutral-subtle-on-subtler-bg: var(--color-theme-neutral-600);
99
+ --color-icon-neutral-subtler: var(--color-theme-neutral-400);
100
+ --color-icon-neutral-subtlest: var(--color-theme-neutral-300);
101
+ --color-icon-primary-brand-active: var(--color-theme-primary-brand-500);
102
+ --color-icon-primary-brand-default: var(--color-theme-primary-brand-700);
103
+ --color-icon-primary-brand-hover: var(--color-theme-primary-brand-500);
104
+ --color-icon-primary-brand-on-neutral-hover-bg: var(--color-theme-primary-brand-500);
105
+ --color-icon-primary-brand-on-soft-bg: var(--color-theme-primary-brand-700);
106
+ --color-icon-primary-brand-rating: var(--color-theme-primary-brand-500);
107
+ --color-icon-secondary-brand-active: var(--color-theme-secondary-brand-500);
108
+ --color-icon-secondary-brand-default: var(--color-theme-secondary-brand-500);
109
+ --color-text-danger: var(--color-theme-danger-700);
110
+ --color-text-default: var(--color-theme-neutral-950);
111
+ --color-text-delete: var(--color-theme-danger-600);
112
+ --color-text-error: var(--color-theme-danger-700);
113
+ --color-text-info: var(--color-theme-info-700);
114
+ --color-text-success: var(--color-theme-success-700);
115
+ --color-text-warning: var(--color-theme-warning-700);
116
+ --color-text-warning-on-bg: var(--color-theme-warning-700);
117
+ --color-text-neutral-disabled: var(--color-theme-neutral-400);
118
+ --color-text-neutral-inactive: var(--color-theme-neutral-400);
119
+ --color-text-neutral-on-filled: var(--color-theme-neutral-white);
120
+ --color-text-neutral-on-monochrome-active-bg: var(--color-theme-neutral-700);
121
+ --color-text-neutral-on-monochrome-hover-bg: var(--color-theme-neutral-600);
122
+ --color-text-neutral-on-neutral-bg: var(--color-theme-neutral-950);
123
+ --color-text-neutral-on-neutral-filled-bg: var(--color-theme-neutral-white);
124
+ --color-text-neutral-on-primary-brand-soft-bg: var(--color-theme-neutral-950);
125
+ --color-text-neutral-subtle: var(--color-theme-neutral-600);
126
+ --color-text-neutral-subtle-on-disabled-bg: var(--color-theme-neutral-600);
127
+ --color-text-neutral-subtle-on-subtler-bg: var(--color-theme-neutral-600);
128
+ --color-text-neutral-subtler: var(--color-theme-neutral-400);
129
+ --color-text-neutral-subtlest: var(--color-theme-neutral-300);
130
+ --color-text-primary-brand-active: var(--color-theme-primary-brand-600);
131
+ --color-text-primary-brand-default: var(--color-theme-primary-brand-700);
132
+ --color-text-primary-brand-hover: var(--color-theme-primary-brand-500);
133
+ --color-text-primary-brand-on-checked-subtlest: var(--color-theme-primary-brand-700);
134
+ --color-text-primary-brand-on-neutral-hover-bg: var(--color-theme-primary-brand-500);
135
+ --color-text-primary-brand-on-soft-bg: var(--color-theme-primary-brand-700);
136
+ --color-text-secondary-brand-default: var(--color-theme-secondary-brand-700);
137
+ --color-text-secondary-brand-on-checked-subtlest: var(--color-theme-secondary-brand-700);
138
+ --color-text-secondary-brand-on-soft-bg: var(--color-theme-secondary-brand-700);
139
+ --color-theme-danger-100: var(--coral-red-100);
140
+ --color-theme-danger-200: var(--coral-red-200);
141
+ --color-theme-danger-300: var(--coral-red-300);
142
+ --color-theme-danger-400: var(--coral-red-400);
143
+ --color-theme-danger-50: var(--coral-red-50);
144
+ --color-theme-danger-500: var(--coral-red-500);
145
+ --color-theme-danger-600: var(--coral-red-600);
146
+ --color-theme-danger-700: var(--coral-red-700);
147
+ --color-theme-danger-800: var(--coral-red-800);
148
+ --color-theme-danger-900: var(--coral-red-900);
149
+ --color-theme-danger-950: var(--coral-red-950);
150
+ --color-theme-info-100: var(--prussian-blue-100);
151
+ --color-theme-info-200: var(--prussian-blue-200);
152
+ --color-theme-info-300: var(--prussian-blue-300);
153
+ --color-theme-info-400: var(--prussian-blue-400);
154
+ --color-theme-info-50: var(--prussian-blue-50);
155
+ --color-theme-info-500: var(--prussian-blue-500);
156
+ --color-theme-info-600: var(--prussian-blue-600);
157
+ --color-theme-info-700: var(--prussian-blue-700);
158
+ --color-theme-info-800: var(--prussian-blue-800);
159
+ --color-theme-info-900: var(--prussian-blue-900);
160
+ --color-theme-info-950: var(--prussian-blue-950);
161
+ --color-theme-neutral-100: var(--wild-blue-yonder-100);
162
+ --color-theme-neutral-200: var(--wild-blue-yonder-200);
163
+ --color-theme-neutral-300: var(--wild-blue-yonder-300);
164
+ --color-theme-neutral-400: var(--wild-blue-yonder-400);
165
+ --color-theme-neutral-50: var(--wild-blue-yonder-50);
166
+ --color-theme-neutral-500: var(--wild-blue-yonder-500);
167
+ --color-theme-neutral-600: var(--wild-blue-yonder-600);
168
+ --color-theme-neutral-700: var(--wild-blue-yonder-700);
169
+ --color-theme-neutral-800: var(--wild-blue-yonder-800);
170
+ --color-theme-neutral-900: var(--wild-blue-yonder-900);
171
+ --color-theme-neutral-950: var(--wild-blue-yonder-950);
172
+ --color-theme-neutral-black: #000000;
173
+ --color-theme-neutral-white: #ffffff;
174
+ --color-theme-primary-brand-100: var(--dark-blue-100);
175
+ --color-theme-primary-brand-200: var(--dark-blue-200);
176
+ --color-theme-primary-brand-300: var(--dark-blue-300);
177
+ --color-theme-primary-brand-400: var(--dark-blue-400);
178
+ --color-theme-primary-brand-50: var(--dark-blue-50);
179
+ --color-theme-primary-brand-500: var(--dark-blue-500);
180
+ --color-theme-primary-brand-600: var(--dark-blue-600);
181
+ --color-theme-primary-brand-700: var(--dark-blue-700);
182
+ --color-theme-primary-brand-800: var(--dark-blue-800);
183
+ --color-theme-primary-brand-900: var(--dark-blue-900);
184
+ --color-theme-primary-brand-950: var(--dark-blue-950);
185
+ --color-theme-secondary-brand-100: var(--purple-heart-100);
186
+ --color-theme-secondary-brand-200: var(--purple-heart-200);
187
+ --color-theme-secondary-brand-300: var(--purple-heart-300);
188
+ --color-theme-secondary-brand-400: var(--purple-heart-400);
189
+ --color-theme-secondary-brand-50: var(--purple-heart-50);
190
+ --color-theme-secondary-brand-500: var(--purple-heart-500);
191
+ --color-theme-secondary-brand-600: var(--purple-heart-600);
192
+ --color-theme-secondary-brand-700: var(--purple-heart-700);
193
+ --color-theme-secondary-brand-800: var(--purple-heart-800);
194
+ --color-theme-secondary-brand-900: var(--purple-heart-900);
195
+ --color-theme-secondary-brand-950: var(--purple-heart-950);
196
+ --color-theme-success-100: var(--emerald-100);
197
+ --color-theme-success-200: var(--emerald-200);
198
+ --color-theme-success-300: var(--emerald-300);
199
+ --color-theme-success-400: var(--emerald-400);
200
+ --color-theme-success-50: var(--emerald-50);
201
+ --color-theme-success-500: var(--emerald-500);
202
+ --color-theme-success-600: var(--emerald-600);
203
+ --color-theme-success-700: var(--emerald-700);
204
+ --color-theme-success-800: var(--emerald-800);
205
+ --color-theme-success-900: var(--emerald-900);
206
+ --color-theme-success-950: var(--emerald-950);
207
+ --color-theme-warning-100: var(--amber-100);
208
+ --color-theme-warning-200: var(--amber-200);
209
+ --color-theme-warning-300: var(--amber-300);
210
+ --color-theme-warning-400: var(--amber-400);
211
+ --color-theme-warning-50: var(--amber-50);
212
+ --color-theme-warning-500: var(--amber-500);
213
+ --color-theme-warning-600: var(--amber-600);
214
+ --color-theme-warning-700: var(--amber-700);
215
+ --color-theme-warning-800: var(--amber-800);
216
+ --color-theme-warning-900: var(--amber-900);
217
+ --color-theme-warning-950: var(--amber-950);
218
+ }
219
+
220
+
221
+ /* Dark mode */
222
+ .dark {
223
+ /* UI Theme - Colors */
224
+ --color-background-container-surface: var(--color-theme-neutral-50);
225
+ --color-background-overlay: #1829531f;
226
+ --color-background-surface: var(--color-theme-neutral-white);
227
+ --color-background-danger-bold: var(--color-theme-danger-400);
228
+ --color-background-danger-subtler: var(--color-theme-danger-100);
229
+ --color-background-danger-subtlest: var(--color-theme-danger-200);
230
+ --color-background-delete-default: var(--color-theme-danger-400);
231
+ --color-background-delete-hover: var(--color-theme-danger-500);
232
+ --color-background-delete-on-neutral-hover: var(--color-theme-danger-800);
233
+ --color-background-delete-soft: var(--color-theme-danger-900);
234
+ --color-background-delete-soft-hover: var(--color-theme-danger-800);
235
+ --color-background-info-bold: var(--color-theme-info-400);
236
+ --color-background-info-subtler: var(--color-theme-info-100);
237
+ --color-background-info-subtlest: var(--color-theme-info-200);
238
+ --color-background-neutral-active: var(--color-theme-neutral-100);
239
+ --color-background-neutral-bold: var(--color-theme-neutral-500);
240
+ --color-background-neutral-default: var(--color-theme-neutral-white);
241
+ --color-background-neutral-disabled: var(--color-theme-neutral-100);
242
+ --color-background-neutral-filled-transparent: #182953d9;
243
+ --color-background-neutral-hover: var(--color-theme-neutral-50);
244
+ --color-background-neutral-hover-subtle: var(--color-theme-neutral-200);
245
+ --color-background-neutral-sublter: var(--color-theme-neutral-100);
246
+ --color-background-neutral-subtle: var(--color-theme-neutral-200);
247
+ --color-background-neutral-subtlest: var(--color-theme-neutral-50);
248
+ --color-background-neutral-subtlest-on-container-surface: var(--color-theme-neutral-100);
249
+ --color-background-neutral-filled-default: var(--color-theme-neutral-950);
250
+ --color-background-neutral-filled-hover: var(--color-theme-neutral-800);
251
+ --color-background-primary-brand-active: var(--color-theme-primary-brand-600);
252
+ --color-background-primary-brand-checked: var(--color-theme-primary-brand-600);
253
+ --color-background-primary-brand-checked-subtlest: var(--color-theme-primary-brand-100);
254
+ --color-background-primary-brand-default: var(--color-theme-primary-brand-300);
255
+ --color-background-primary-brand-hover: var(--color-theme-primary-brand-500);
256
+ --color-background-primary-brand-on-checked-subtle-bg: var(--color-theme-primary-brand-50);
257
+ --color-background-primary-brand-soft: var(--color-theme-primary-brand-900);
258
+ --color-background-primary-brand-soft-hover: var(--color-theme-primary-brand-800);
259
+ --color-background-primary-brand-subtle-active: var(--color-theme-primary-brand-700);
260
+ --color-background-secondary-brand-checked: var(--color-theme-secondary-brand-600);
261
+ --color-background-secondary-brand-checked-subtlest: var(--color-theme-secondary-brand-100);
262
+ --color-background-secondary-brand-default: var(--color-theme-secondary-brand-400);
263
+ --color-background-secondary-brand-hover: var(--color-theme-secondary-brand-600);
264
+ --color-background-secondary-brand-on-checked-subtle-bg: var(--color-theme-secondary-brand-50);
265
+ --color-background-secondary-brand-soft: var(--color-theme-secondary-brand-700);
266
+ --color-background-success-bold: var(--color-theme-success-400);
267
+ --color-background-success-subtler: var(--color-theme-success-100);
268
+ --color-background-success-subtlest: var(--color-theme-success-200);
269
+ --color-background-warning-bold: var(--color-theme-warning-400);
270
+ --color-background-warning-subtler: var(--color-theme-warning-800);
271
+ --color-background-warning-subtlest: var(--color-theme-warning-900);
272
+ --color-border-danger: var(--color-theme-danger-200);
273
+ --color-border-default: var(--color-theme-neutral-100);
274
+ --color-border-error: var(--color-theme-danger-500);
275
+ --color-border-inactive: var(--color-theme-neutral-200);
276
+ --color-border-info: var(--color-theme-info-200);
277
+ --color-border-secondary-brand: var(--color-theme-secondary-brand-700);
278
+ --color-border-success: var(--color-theme-success-200);
279
+ --color-border-warning: var(--color-theme-warning-600);
280
+ --color-border-delete-default: var(--color-theme-danger-400);
281
+ --color-border-delete-subtle: var(--color-theme-danger-800);
282
+ --color-border-neutral-disabled: var(--color-theme-neutral-400);
283
+ --color-border-neutral-hover: var(--color-theme-neutral-700);
284
+ --color-border-neutral-on-filled: var(--color-theme-neutral-950);
285
+ --color-border-neutral-stacked: var(--color-theme-neutral-white);
286
+ --color-border-neutral-subtle: var(--color-theme-neutral-50);
287
+ --color-border-primary-brand-active: var(--color-theme-primary-brand-500);
288
+ --color-border-primary-brand-default: var(--color-theme-primary-brand-500);
289
+ --color-border-primary-brand-hover: var(--color-theme-primary-brand-700);
290
+ --color-chart-variant-five: #e6bb45;
291
+ --color-chart-variant-four: #e65a45;
292
+ --color-chart-variant-one: #5f45e6;
293
+ --color-chart-variant-six: #e64590;
294
+ --color-chart-variant-three: #45e663;
295
+ --color-chart-variant-two: #45e6de;
296
+ --color-icon-danger: var(--color-theme-danger-700);
297
+ --color-icon-danger-subtle: var(--color-theme-danger-400);
298
+ --color-icon-default: var(--color-theme-neutral-950);
299
+ --color-icon-delete: var(--color-theme-danger-400);
300
+ --color-icon-error: var(--color-theme-danger-500);
301
+ --color-icon-info: var(--color-theme-info-700);
302
+ --color-icon-info-subtle-strong: var(--color-theme-info-400);
303
+ --color-icon-rating: #e6c300;
304
+ --color-icon-success: var(--color-theme-success-700);
305
+ --color-icon-success-subtle: var(--color-theme-success-400);
306
+ --color-icon-warning: var(--color-theme-warning-700);
307
+ --color-icon-warning-on-bg: var(--color-theme-warning-300);
308
+ --color-icon-warning-subtle: var(--color-theme-warning-500);
309
+ --color-icon-neutral-disabled: var(--color-theme-neutral-400);
310
+ --color-icon-neutral-inactive: var(--color-theme-neutral-400);
311
+ --color-icon-neutral-on-filled-bg: var(--color-theme-neutral-950);
312
+ --color-icon-neutral-on-filled-secondary-brand-bg: var(--color-theme-neutral-white);
313
+ --color-icon-neutral-on-monochrome-active-bg: var(--color-theme-neutral-700);
314
+ --color-icon-neutral-on-monochrome-hover-bg: var(--color-theme-neutral-600);
315
+ --color-icon-neutral-on-neutral-bg: var(--color-theme-neutral-950);
316
+ --color-icon-neutral-on-primary-brand-soft-bg: var(--color-theme-neutral-600);
317
+ --color-icon-neutral-on-subtlest-bg: var(--color-theme-neutral-400);
318
+ --color-icon-neutral-subtle: var(--color-theme-neutral-700);
319
+ --color-icon-neutral-subtle-on-subtler-bg: var(--color-theme-neutral-700);
320
+ --color-icon-neutral-subtler: var(--color-theme-neutral-500);
321
+ --color-icon-neutral-subtlest: var(--color-theme-neutral-200);
322
+ --color-icon-primary-brand-active: var(--color-theme-primary-brand-600);
323
+ --color-icon-primary-brand-default: var(--color-theme-primary-brand-600);
324
+ --color-icon-primary-brand-hover: var(--color-theme-primary-brand-700);
325
+ --color-icon-primary-brand-on-neutral-hover-bg: var(--color-theme-primary-brand-700);
326
+ --color-icon-primary-brand-on-soft-bg: var(--color-theme-primary-brand-300);
327
+ --color-icon-primary-brand-rating: var(--color-theme-primary-brand-600);
328
+ --color-icon-secondary-brand-active: var(--color-theme-secondary-brand-600);
329
+ --color-icon-secondary-brand-default: var(--color-theme-secondary-brand-400);
330
+ --color-text-danger: var(--color-theme-danger-700);
331
+ --color-text-default: var(--color-theme-neutral-950);
332
+ --color-text-delete: var(--color-theme-danger-400);
333
+ --color-text-error: var(--color-theme-danger-500);
334
+ --color-text-info: var(--color-theme-info-700);
335
+ --color-text-success: var(--color-theme-success-700);
336
+ --color-text-warning: var(--color-theme-warning-700);
337
+ --color-text-warning-on-bg: var(--color-theme-warning-300);
338
+ --color-text-neutral-disabled: var(--color-theme-neutral-400);
339
+ --color-text-neutral-inactive: var(--color-theme-neutral-400);
340
+ --color-text-neutral-on-filled: var(--color-theme-neutral-950);
341
+ --color-text-neutral-on-monochrome-active-bg: var(--color-theme-neutral-700);
342
+ --color-text-neutral-on-monochrome-hover-bg: var(--color-theme-neutral-600);
343
+ --color-text-neutral-on-neutral-bg: var(--color-theme-neutral-950);
344
+ --color-text-neutral-on-neutral-filled-bg: var(--color-theme-neutral-white);
345
+ --color-text-neutral-on-primary-brand-soft-bg: var(--color-theme-neutral-200);
346
+ --color-text-neutral-subtle: var(--color-theme-neutral-700);
347
+ --color-text-neutral-subtle-on-disabled-bg: var(--color-theme-neutral-500);
348
+ --color-text-neutral-subtle-on-subtler-bg: var(--color-theme-neutral-600);
349
+ --color-text-neutral-subtler: var(--color-theme-neutral-400);
350
+ --color-text-neutral-subtlest: var(--color-theme-neutral-400);
351
+ --color-text-primary-brand-active: var(--color-theme-primary-brand-600);
352
+ --color-text-primary-brand-default: var(--color-theme-primary-brand-600);
353
+ --color-text-primary-brand-hover: var(--color-theme-primary-brand-700);
354
+ --color-text-primary-brand-on-checked-subtlest: var(--color-theme-primary-brand-900);
355
+ --color-text-primary-brand-on-neutral-hover-bg: var(--color-theme-primary-brand-700);
356
+ --color-text-primary-brand-on-soft-bg: var(--color-theme-primary-brand-300);
357
+ --color-text-secondary-brand-default: var(--color-theme-secondary-brand-400);
358
+ --color-text-secondary-brand-on-checked-subtlest: var(--color-theme-secondary-brand-900);
359
+ --color-text-secondary-brand-on-soft-bg: var(--color-theme-secondary-brand-300);
360
+ --color-theme-danger-100: var(--coral-red-900);
361
+ --color-theme-danger-200: var(--coral-red-800);
362
+ --color-theme-danger-300: var(--coral-red-700);
363
+ --color-theme-danger-400: var(--coral-red-600);
364
+ --color-theme-danger-50: var(--coral-red-950);
365
+ --color-theme-danger-500: var(--coral-red-500);
366
+ --color-theme-danger-600: var(--coral-red-400);
367
+ --color-theme-danger-700: var(--coral-red-300);
368
+ --color-theme-danger-800: var(--coral-red-200);
369
+ --color-theme-danger-900: var(--coral-red-100);
370
+ --color-theme-danger-950: var(--coral-red-50);
371
+ --color-theme-info-100: var(--prussian-blue-900);
372
+ --color-theme-info-200: var(--prussian-blue-800);
373
+ --color-theme-info-300: var(--prussian-blue-700);
374
+ --color-theme-info-400: var(--prussian-blue-600);
375
+ --color-theme-info-50: var(--prussian-blue-950);
376
+ --color-theme-info-500: var(--prussian-blue-500);
377
+ --color-theme-info-600: var(--prussian-blue-400);
378
+ --color-theme-info-700: var(--prussian-blue-300);
379
+ --color-theme-info-800: var(--prussian-blue-200);
380
+ --color-theme-info-900: var(--prussian-blue-100);
381
+ --color-theme-info-950: var(--prussian-blue-50);
382
+ --color-theme-neutral-100: var(--wild-blue-yonder-900);
383
+ --color-theme-neutral-200: var(--wild-blue-yonder-800);
384
+ --color-theme-neutral-300: var(--wild-blue-yonder-700);
385
+ --color-theme-neutral-400: var(--wild-blue-yonder-600);
386
+ --color-theme-neutral-50: var(--wild-blue-yonder-950);
387
+ --color-theme-neutral-500: var(--wild-blue-yonder-500);
388
+ --color-theme-neutral-600: var(--wild-blue-yonder-400);
389
+ --color-theme-neutral-700: var(--wild-blue-yonder-300);
390
+ --color-theme-neutral-800: var(--wild-blue-yonder-200);
391
+ --color-theme-neutral-900: var(--wild-blue-yonder-100);
392
+ --color-theme-neutral-950: var(--wild-blue-yonder-50);
393
+ --color-theme-neutral-black: #000000;
394
+ --color-theme-neutral-white: #1f212d;
395
+ --color-theme-primary-brand-100: var(--dark-blue-900);
396
+ --color-theme-primary-brand-200: var(--dark-blue-800);
397
+ --color-theme-primary-brand-300: var(--dark-blue-700);
398
+ --color-theme-primary-brand-400: var(--dark-blue-600);
399
+ --color-theme-primary-brand-50: var(--dark-blue-950);
400
+ --color-theme-primary-brand-500: var(--dark-blue-500);
401
+ --color-theme-primary-brand-600: var(--dark-blue-400);
402
+ --color-theme-primary-brand-700: var(--dark-blue-300);
403
+ --color-theme-primary-brand-800: var(--dark-blue-200);
404
+ --color-theme-primary-brand-900: var(--dark-blue-100);
405
+ --color-theme-primary-brand-950: var(--dark-blue-50);
406
+ --color-theme-secondary-brand-100: var(--purple-heart-900);
407
+ --color-theme-secondary-brand-200: var(--purple-heart-800);
408
+ --color-theme-secondary-brand-300: var(--purple-heart-700);
409
+ --color-theme-secondary-brand-400: var(--purple-heart-600);
410
+ --color-theme-secondary-brand-50: var(--purple-heart-950);
411
+ --color-theme-secondary-brand-500: var(--purple-heart-500);
412
+ --color-theme-secondary-brand-600: var(--purple-heart-400);
413
+ --color-theme-secondary-brand-700: var(--purple-heart-300);
414
+ --color-theme-secondary-brand-800: var(--purple-heart-200);
415
+ --color-theme-secondary-brand-900: var(--purple-heart-100);
416
+ --color-theme-secondary-brand-950: var(--purple-heart-50);
417
+ --color-theme-success-100: var(--emerald-900);
418
+ --color-theme-success-200: var(--emerald-800);
419
+ --color-theme-success-300: var(--emerald-700);
420
+ --color-theme-success-400: var(--emerald-600);
421
+ --color-theme-success-50: var(--emerald-950);
422
+ --color-theme-success-500: var(--emerald-500);
423
+ --color-theme-success-600: var(--emerald-400);
424
+ --color-theme-success-700: var(--emerald-300);
425
+ --color-theme-success-800: var(--emerald-200);
426
+ --color-theme-success-900: var(--emerald-100);
427
+ --color-theme-success-950: var(--emerald-50);
428
+ --color-theme-warning-100: var(--amber-900);
429
+ --color-theme-warning-200: var(--amber-800);
430
+ --color-theme-warning-300: var(--amber-700);
431
+ --color-theme-warning-400: var(--amber-600);
432
+ --color-theme-warning-50: var(--amber-950);
433
+ --color-theme-warning-500: var(--amber-500);
434
+ --color-theme-warning-600: var(--amber-400);
435
+ --color-theme-warning-700: var(--amber-300);
436
+ --color-theme-warning-800: var(--amber-200);
437
+ --color-theme-warning-900: var(--amber-100);
438
+ --color-theme-warning-950: var(--amber-50);
439
+ }
440
+
441
+ :root {
442
+ /* number */
443
+ --opacity-disabled: var(--opacity-50);
444
+ --radius-button: var(--rounded-base);
445
+ --spacing-column-gap: var(--space-5);
446
+ --spacing-content-body-bottom-padding: var(--space-6);
447
+ --spacing-content-side-padding: var(--space-8);
448
+ --spacing-content-side-padding-mobile: var(--space-6);
449
+ --spacing-section-xs: var(--space-8);
450
+ --spacing-section-sm: var(--space-10);
451
+ --spacing-section-md: var(--space-16);
452
+ --spacing-section-lg: var(--space-20);
453
+ --spacing-section-xl: var(--space-28);
454
+ }
@@ -0,0 +1,31 @@
1
+ <template>
2
+ <div
3
+ v-if="items"
4
+ :class="[
5
+ 'flex',
6
+ 'flex-col',
7
+ 'w-full',
8
+ 'gap-0',
9
+ 'divide-y',
10
+ 'divide-border-neutral-subtle',
11
+ 'border-t',
12
+ 'border-b',
13
+ 'border-border-neutral-subtle'
14
+ ]"
15
+ >
16
+ <AccordionItem
17
+ v-for="item in items" :key="item.id"
18
+ :title="item.title"
19
+ :content="item.content"
20
+ />
21
+ </div>
22
+ </template>
23
+ <script setup lang="ts">
24
+ // Props
25
+ defineProps({
26
+ items: {
27
+ type: Array as PropType<AccordionItem[]>,
28
+ required: true
29
+ }
30
+ })
31
+ </script>
@@ -0,0 +1,78 @@
1
+ <template >
2
+ <div
3
+ v-if="Object.keys(groupedAccordeons).length"
4
+ class="flex flex-col gap-3 w-full"
5
+ >
6
+ <div
7
+ v-for="(groupKey, index) in sortedGroupKeys"
8
+ :key="groupKey"
9
+ class="accordion-group flex flex-col gap-3 w-full"
10
+ >
11
+ <component
12
+ :is="titleTag"
13
+ :class="[
14
+ titleCustomClass,
15
+ { 'mt-4': index !== 0 }
16
+ ]"
17
+ >
18
+ {{ groupKey }}
19
+ </component>
20
+ <Accordion :items="groupedAccordeons[groupKey]" />
21
+ </div>
22
+ </div>
23
+
24
+ </template>
25
+
26
+ <script setup lang="ts">
27
+ // Props
28
+ const props = defineProps({
29
+ items: {
30
+ type: Array as PropType<AccordionItem[]>,
31
+ required: true
32
+ },
33
+ defaultGroupName: {
34
+ type: String as PropType<string>,
35
+ default: 'Group title'
36
+ },
37
+ defaultGroupPosition: {
38
+ type: String as PropType<OrderPosition>,
39
+ default: OrderPosition.START,
40
+ validator: (value: OrderPosition) => Object.values(OrderPosition).includes(value),
41
+ },
42
+ titleCustomClass: {
43
+ type: String as PropType<string>,
44
+ default: 'font-semibold text-lg text-text-neutral-subtle'
45
+ },
46
+ titleTag: {
47
+ type: String as PropType<'h3' | 'h4' | 'h5' | 'h6'>,
48
+ default: 'h3',
49
+ validator: (value: string) => ['h3', 'h4', 'h5', 'h6'].includes(value),
50
+ },
51
+ })
52
+
53
+ // Groups accordion items by their `group` property
54
+ const groupedAccordeons = computed(() => {
55
+ return props.items.reduce((acc, item) => {
56
+ const groupKey = item.group || props.defaultGroupName
57
+ if (!acc[groupKey]) {
58
+ acc[groupKey] = []
59
+ }
60
+ acc[groupKey].push(item)
61
+ return acc
62
+ }, {} as Record<string, AccordionItem[]>)
63
+ })
64
+
65
+ // Sorts the group keys based on the `defaultGroupPosition` prop
66
+ const sortedGroupKeys = computed(() => {
67
+ const keys = Object.keys(groupedAccordeons.value)
68
+
69
+ const compare = (a: string, b: string) => {
70
+ if (a === props.defaultGroupName) return props.defaultGroupPosition === OrderPosition.START ? -1 : 1
71
+ if (b === props.defaultGroupName) return props.defaultGroupPosition === OrderPosition.START ? 1 : -1
72
+ return 0
73
+ }
74
+
75
+ return keys.sort(compare)
76
+ })
77
+
78
+ </script>
@@ -0,0 +1,39 @@
1
+ <template>
2
+ <div class="w-full flex flex-col gap-2 py-3">
3
+ <div class="accordion-header flex justify-between gap-4 hover:cursor-pointer" @click="toggle">
4
+ <span class="font-semibold mt-1">
5
+ {{ title }}
6
+ </span>
7
+
8
+ <!-- This button does not have click event because the toggle is being controlled by the accordeon header div-->
9
+ <ActionIconButton
10
+ :icon="isOpen ? 'mdiMinus' : 'mdiPlus'"
11
+ :styleType="ButtonStyleType.NEUTRAL_TRANSPARENT"
12
+ :size="ButtonSize.MD"
13
+ />
14
+ </div>
15
+
16
+ <VerticalExpansionTransition v-show="isOpen">
17
+ <p class="text-sm">
18
+ {{ content }}
19
+ </p>
20
+ </VerticalExpansionTransition>
21
+ </div>
22
+ </template>
23
+
24
+ <script setup lang="ts">
25
+ // Props
26
+ defineProps({
27
+ title: {
28
+ type: String as PropType<string>,
29
+ default: 'Item title'
30
+ },
31
+ content: {
32
+ type: String as PropType<string>,
33
+ default: 'Item content'
34
+ }
35
+ })
36
+
37
+ // Composables
38
+ const { isOpen, toggle } = useAccordion()
39
+ </script>
@@ -0,0 +1,49 @@
1
+ <template>
2
+ <Card
3
+ :hasBorder
4
+ :hasShadow
5
+ :class="[
6
+ hasShadow ? '!shadow-sm' : undefined,
7
+ '!p-6',
8
+ orientation === Orientation.HORIZONTAL ? 'md:!flex-row' : undefined
9
+ ]"
10
+ >
11
+ <div class="flex flex-col gap-2 w-full">
12
+ <CardHeader>
13
+ <CardTitle :title />
14
+ </CardHeader>
15
+ <CardBody>
16
+ <p class="text-sm text-text-neutral-subtle">{{ description }}</p>
17
+ </CardBody>
18
+ </div>
19
+ <CardActions v-if="$slots['actions']">
20
+ <slot name="actions" />
21
+ </CardActions>
22
+ </Card>
23
+ </template>
24
+ <script setup lang="ts">
25
+ // Props
26
+ defineProps({
27
+ title: {
28
+ type: String as PropType<string>,
29
+ default: 'Title',
30
+ },
31
+ description: {
32
+ type: String as PropType<string>,
33
+ default: 'Description',
34
+ },
35
+ orientation: {
36
+ type: String as PropType<Orientation>,
37
+ default: Orientation.VERTICAL,
38
+ validator: (value: Orientation) => Object.values(Orientation).includes(value),
39
+ },
40
+ hasShadow: {
41
+ type: Boolean as PropType<boolean>,
42
+ default: true,
43
+ },
44
+ hasBorder: {
45
+ type: Boolean as PropType<boolean>,
46
+ default: false,
47
+ }
48
+ })
49
+ </script>