@brumaombra/ui-vintage 0.8.1 → 0.9.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 (142) hide show
  1. package/AGENTS.md +41 -0
  2. package/COMPONENTS.md +91 -17
  3. package/README.md +296 -262
  4. package/module.mjs +5 -11
  5. package/package.json +31 -13
  6. package/src/components/blog/AllPostsSection.vue +1 -2
  7. package/src/components/blog/BlogContentRenderer.vue +144 -49
  8. package/src/components/blog/BlogFAQSection.vue +13 -15
  9. package/src/components/blog/BlogHeaderSection.vue +103 -11
  10. package/src/components/blog/BlogInfoSection.vue +46 -42
  11. package/src/components/blog/BlogPostHeader.vue +181 -0
  12. package/src/components/blog/BlogProgressBar.vue +3 -2
  13. package/src/components/blog/BlogSectionTitle.vue +27 -6
  14. package/src/components/blog/BlogTagsSection.vue +20 -8
  15. package/src/components/blog/CategoriesList.vue +2 -2
  16. package/src/components/blog/CategoryCard.vue +23 -19
  17. package/src/components/blog/HeaderCarousel.vue +117 -145
  18. package/src/components/blog/PostCard.vue +25 -33
  19. package/src/components/blog/PostsList.vue +3 -2
  20. package/src/components/blog/SocialShareSidebar.vue +62 -42
  21. package/src/components/blog/TableOfContents.vue +71 -34
  22. package/src/components/blog/index.ts +1 -0
  23. package/src/components/card-grid/CardGrid.vue +2 -2
  24. package/src/components/confirm-dialog/ConfirmDialog.vue +5 -0
  25. package/src/components/confirm-dialog/confirm-dialog-state.ts +22 -22
  26. package/src/components/content/BlogList.vue +30 -42
  27. package/src/components/content/BlogTable.vue +26 -30
  28. package/src/components/content/CodeBlock.vue +96 -22
  29. package/src/components/content/Flow.vue +30 -36
  30. package/src/components/content/ProseHr.vue +6 -6
  31. package/src/components/content/ProsePre.vue +9 -4
  32. package/src/components/content/Terminal.vue +42 -14
  33. package/src/components/cookie-consent/CookieConsent.vue +1 -1
  34. package/src/components/dashboard-shell/DashboardShell.vue +24 -7
  35. package/src/components/empty-state-card/EmptyStateCard.vue +2 -2
  36. package/src/components/error-page/ErrorPage.vue +3 -3
  37. package/src/components/info-card/InfoCard.vue +4 -4
  38. package/src/components/landing/landing-footer/LandingFooter.vue +16 -6
  39. package/src/components/landing/landing-navbar/LandingNavbar.vue +63 -51
  40. package/src/components/language-flag/index.ts +1 -0
  41. package/src/components/language-selector/LanguageSelector.vue +18 -10
  42. package/src/components/load-more-button/LoadMoreButton.vue +7 -12
  43. package/src/components/loading-state-card/LoadingStateCard.vue +2 -2
  44. package/src/components/message-dialog/MessageDialog.vue +11 -11
  45. package/src/components/message-dialog/message-dialog-state.ts +1 -4
  46. package/src/components/message-toast/MessageToast.vue +24 -9
  47. package/src/components/message-toast/message-toast-state.ts +20 -0
  48. package/src/components/page-header/PageHeader.vue +1 -1
  49. package/src/components/progress-component/ProgressComponent.vue +7 -3
  50. package/src/components/single-value-card/SingleValueCard.vue +37 -39
  51. package/src/components/slider-form-component/SliderFormComponent.vue +1 -1
  52. package/src/components/stat-strip/StatStrip.vue +36 -0
  53. package/src/components/stat-strip/index.ts +2 -0
  54. package/src/components/switch-form-component/SwitchFormComponent.vue +5 -5
  55. package/src/components/text-link/TextLink.vue +1 -1
  56. package/src/components/theme-selector/ThemeSelector.vue +2 -2
  57. package/src/components/theme-selector/theme-transition.ts +15 -3
  58. package/src/components/ui/accordion/Accordion.vue +18 -18
  59. package/src/components/ui/alert/AlertTitle.vue +1 -1
  60. package/src/components/ui/alert/index.ts +1 -1
  61. package/src/components/ui/avatar/AvatarFallback.vue +2 -1
  62. package/src/components/ui/avatar/AvatarGroup.vue +13 -3
  63. package/src/components/ui/breadcrumb/BreadcrumbEllipsis.vue +2 -2
  64. package/src/components/ui/breadcrumb/BreadcrumbLink.vue +1 -1
  65. package/src/components/ui/breadcrumb/BreadcrumbList.vue +1 -1
  66. package/src/components/ui/breadcrumb/BreadcrumbPage.vue +1 -1
  67. package/src/components/ui/breadcrumb/BreadcrumbSeparator.vue +2 -6
  68. package/src/components/ui/busy/Busy.vue +5 -7
  69. package/src/components/ui/button/Button.vue +4 -2
  70. package/src/components/ui/button/index.ts +1 -4
  71. package/src/components/ui/calendar/Calendar.vue +12 -7
  72. package/src/components/ui/calendar/CalendarCell.vue +1 -1
  73. package/src/components/ui/calendar/CalendarCellTrigger.vue +1 -1
  74. package/src/components/ui/calendar/CalendarHeadCell.vue +1 -1
  75. package/src/components/ui/calendar/CalendarNextButton.vue +1 -1
  76. package/src/components/ui/calendar/CalendarPrevButton.vue +1 -1
  77. package/src/components/ui/card/Card.vue +5 -15
  78. package/src/components/ui/checkbox/Checkbox.vue +5 -1
  79. package/src/components/ui/combobox/ComboboxInput.vue +5 -1
  80. package/src/components/ui/command/CommandGroup.vue +17 -3
  81. package/src/components/ui/command/CommandInput.vue +1 -1
  82. package/src/components/ui/command/CommandItem.vue +2 -2
  83. package/src/components/ui/command/CommandList.vue +5 -1
  84. package/src/components/ui/data-table/DataTable.vue +11 -3
  85. package/src/components/ui/date-picker/DatePicker.vue +7 -1
  86. package/src/components/ui/date-time-picker/DateTimePicker.vue +5 -1
  87. package/src/components/ui/dropdown-menu/DropdownMenuItem.vue +1 -1
  88. package/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +1 -1
  89. package/src/components/ui/dropdown-menu/classes.ts +2 -0
  90. package/src/components/ui/field/Field.vue +4 -0
  91. package/src/components/ui/field/FieldLabel.vue +6 -2
  92. package/src/components/ui/field/field-context.ts +62 -0
  93. package/src/components/ui/field/index.ts +1 -0
  94. package/src/components/ui/file-dropzone/FileDropzone.vue +4 -4
  95. package/src/components/ui/input/Input.vue +5 -1
  96. package/src/components/ui/native-select/NativeSelect.vue +6 -2
  97. package/src/components/ui/number-field/NumberField.vue +5 -1
  98. package/src/components/ui/pagination/PaginationItem.vue +1 -1
  99. package/src/components/ui/pin-input/PinInputInput.vue +2 -2
  100. package/src/components/ui/progress/Progress.vue +2 -2
  101. package/src/components/ui/radio-group/RadioGroupCard.vue +1 -1
  102. package/src/components/ui/select/SelectItem.vue +1 -1
  103. package/src/components/ui/select/SelectItemContent.vue +1 -1
  104. package/src/components/ui/select/SelectTrigger.vue +5 -1
  105. package/src/components/ui/sidebar/Sidebar.vue +1 -1
  106. package/src/components/ui/sidebar/SidebarGroupAction.vue +1 -1
  107. package/src/components/ui/sidebar/SidebarGroupLabel.vue +1 -1
  108. package/src/components/ui/sidebar/SidebarInset.vue +1 -1
  109. package/src/components/ui/sidebar/SidebarMenuAction.vue +1 -1
  110. package/src/components/ui/sidebar/SidebarMenuBadge.vue +1 -1
  111. package/src/components/ui/sidebar/SidebarMenuSkeleton.vue +2 -2
  112. package/src/components/ui/sidebar/SidebarMenuSubButton.vue +1 -1
  113. package/src/components/ui/sidebar/SidebarProvider.vue +17 -6
  114. package/src/components/ui/sidebar/index.ts +2 -2
  115. package/src/components/ui/sidebar/utils.ts +1 -1
  116. package/src/components/ui/slider/Slider.vue +5 -4
  117. package/src/components/ui/spinner/Spinner.vue +3 -2
  118. package/src/components/ui/stepper/StepperDescription.vue +5 -3
  119. package/src/components/ui/stepper/StepperIndicator.vue +2 -2
  120. package/src/components/ui/stepper/StepperTitle.vue +5 -3
  121. package/src/components/ui/switch/Switch.vue +6 -2
  122. package/src/components/ui/tabs/TabsList.vue +1 -1
  123. package/src/components/ui/tabs/TabsTrigger.vue +1 -1
  124. package/src/components/ui/textarea/Textarea.vue +5 -1
  125. package/src/components/ui/time-picker/TimePicker.vue +2 -2
  126. package/src/components/ui/toggle-group/ToggleGroup.vue +1 -1
  127. package/src/components/ui/tooltip/TooltipContent.vue +1 -1
  128. package/src/i18n/de.json +19 -7
  129. package/src/i18n/en.json +19 -7
  130. package/src/i18n/es.json +19 -7
  131. package/src/i18n/fr.json +19 -7
  132. package/src/i18n/it.json +19 -7
  133. package/src/i18n/ja.json +19 -7
  134. package/src/i18n/pt.json +19 -7
  135. package/src/i18n/ru.json +19 -7
  136. package/src/i18n/zh.json +19 -7
  137. package/src/lib/color-tokens.ts +1 -1
  138. package/src/lib/i18n.ts +32 -4
  139. package/src/lib/utils.ts +21 -1
  140. package/src/runtime/ui-vintage-i18n-plugin.ts +11 -1
  141. package/src/styles.css +52 -16
  142. package/skills/ui-vintage/SKILL.md +0 -42
package/src/styles.css CHANGED
@@ -11,6 +11,8 @@ html {
11
11
  }
12
12
 
13
13
  :root {
14
+ color-scheme: light;
15
+
14
16
  /*********************** Core custom colors ***********************/
15
17
 
16
18
  --bg-main-light: #fafafa;
@@ -43,7 +45,6 @@ html {
43
45
 
44
46
  /*********************** Motion tokens ***********************/
45
47
 
46
- --uv-duration-instant: 90ms;
47
48
  --uv-duration-fast: 150ms;
48
49
  --uv-duration-base: 220ms;
49
50
  --uv-duration-slow: 420ms;
@@ -166,7 +167,31 @@ html {
166
167
  --animate-uv-fade-up: uv-fade-up 0.5s var(--ease-out-expo) both;
167
168
  --animate-uv-ping-soft: uv-ping-soft 1.8s var(--ease-out-expo) infinite;
168
169
  --animate-uv-indeterminate: uv-indeterminate 1.4s var(--ease-snappy) infinite;
169
- --animate-uv-gradient: uv-gradient 6s ease infinite;
170
+ --animate-uv-word-in: uv-word-in 0.9s var(--ease-spring) both;
171
+ --animate-uv-grow-x: uv-grow-x 0.9s var(--ease-out-expo) both;
172
+ --animate-uv-ken-burns: uv-ken-burns 9s ease-out both;
173
+ --animate-uv-draw: uv-draw 1s var(--ease-out-expo) both;
174
+
175
+ @keyframes uv-word-in {
176
+ 0% { opacity: 0; transform: translateY(0.45em); filter: blur(8px); }
177
+ 100% { opacity: 1; transform: translateY(0); filter: blur(0); }
178
+ }
179
+
180
+ @keyframes uv-grow-x {
181
+ 0% { transform: scaleX(0); }
182
+ 100% { transform: scaleX(1); }
183
+ }
184
+
185
+ /* Draws an SVG stroke that uses pathLength="1" and stroke-dasharray: 1 */
186
+ @keyframes uv-draw {
187
+ 0% { stroke-dashoffset: 1; }
188
+ 100% { stroke-dashoffset: 0; }
189
+ }
190
+
191
+ @keyframes uv-ken-burns {
192
+ 0% { transform: scale(1.12); }
193
+ 100% { transform: scale(1); }
194
+ }
170
195
 
171
196
  @keyframes uv-shimmer {
172
197
  0% { transform: translateX(-100%); }
@@ -206,11 +231,6 @@ html {
206
231
  50% { transform: translateX(40%) scaleX(0.6); }
207
232
  100% { transform: translateX(120%) scaleX(0.4); }
208
233
  }
209
-
210
- @keyframes uv-gradient {
211
- 0%, 100% { background-position: 0% 50%; }
212
- 50% { background-position: 100% 50%; }
213
- }
214
234
  }
215
235
 
216
236
  /* Floating surfaces (popover, select, dropdown, tooltip, hover card) scale from their anchor */
@@ -317,15 +337,6 @@ html {
317
337
  }
318
338
  }
319
339
 
320
- /* Shared focus ring used by interactive primitives */
321
- @utility uv-focus-ring {
322
- outline: none;
323
-
324
- &:focus-visible {
325
- box-shadow: 0 0 0 1px var(--background), 0 0 0 3px color-mix(in oklab, var(--ring) 55%, transparent);
326
- }
327
- }
328
-
329
340
  /* Shared interactive states for inputs, textareas, and field-like triggers (base colors stay in utility classes) */
330
341
  @utility uv-field {
331
342
  transition-property: border-color, box-shadow, background-color, color, opacity;
@@ -351,6 +362,9 @@ html {
351
362
  }
352
363
 
353
364
  .dark {
365
+ /* Native controls (date/time pickers, scrollbars, form widgets) follow the theme */
366
+ color-scheme: dark;
367
+
354
368
  --background: var(--bg-main-dark);
355
369
  --foreground: var(--text-primary-dark);
356
370
  --card: var(--bg-card-dark);
@@ -419,6 +433,28 @@ body {
419
433
  color: var(--text-primary-dark);
420
434
  }
421
435
 
436
+ /*********************** AOS scroll animations ***********************/
437
+
438
+ /*
439
+ * "blur-up" animation for AOS (https://github.com/michalsnik/aos), used by the blog components through data-aos="blur-up".
440
+ * Elements are only hidden once AOS has initialized them (.aos-init), so apps without AOS always show the content.
441
+ * The repeated attribute selector outranks the global AOS easing and duration rules; data-aos-delay keeps working.
442
+ */
443
+ [data-aos="blur-up"][data-aos="blur-up"][data-aos="blur-up"].aos-init {
444
+ opacity: 0;
445
+ transform: translate3d(0, 18px, 0);
446
+ filter: blur(6px);
447
+ transition-property: opacity, transform, filter;
448
+ transition-duration: 700ms, 900ms, 700ms;
449
+ transition-timing-function: var(--ease-out-expo), var(--ease-spring), var(--ease-out-expo);
450
+ }
451
+
452
+ [data-aos="blur-up"][data-aos="blur-up"][data-aos="blur-up"].aos-init.aos-animate {
453
+ opacity: 1;
454
+ transform: none;
455
+ filter: none;
456
+ }
457
+
422
458
  /*********************** Page transition animations ***********************/
423
459
 
424
460
  .page-enter-active {
@@ -1,42 +0,0 @@
1
- ---
2
- name: ui-vintage
3
- description: Build Nuxt UI with the @brumaombra/ui-vintage component library. Use whenever creating or changing pages, layouts, forms, tables, dialogs, toasts, or any other UI in an app that depends on @brumaombra/ui-vintage, before writing custom components or styles.
4
- ---
5
-
6
- # UI Vintage
7
-
8
- This app uses `@brumaombra/ui-vintage`, a Nuxt component library with its own design tokens, motion system, and runtime flows. Reuse it instead of building UI from scratch.
9
-
10
- ## 1. Read the catalog first
11
-
12
- The complete, version-matched API reference is installed with the package:
13
-
14
- `node_modules/@brumaombra/ui-vintage/COMPONENTS.md`
15
-
16
- Search it (for example for `### \`@brumaombra/ui-vintage/`, a component name, or a prop) instead of reading it top to bottom. It lists every entry point with its import line, components, props and defaults, events, slots, helpers, and usage examples. Never guess prop names: check them there.
17
-
18
- ## 2. Choose the component
19
-
20
- - Before writing a custom component, check the catalog's Contents list. Common mappings:
21
- - Searchable select → `combobox` (`ComboboxSelect`); plain select → `select`.
22
- - Table with sorting or selection → `data-table`; KPI tiles → `single-value-card`.
23
- - Confirmation → `showConfirmDialog` (`confirm-dialog`); notification → `showMessageToast` (`message-toast`); blocking load → `setBusy` (`busy-indicator`). These mount themselves, so do not add them to the template.
24
- - App layout with sidebar → `dashboard-shell`; marketing or blog layout → `landing`.
25
- - Empty and loading placeholders → `empty-state-card`, `loading-state-card`, `skeleton`.
26
- - Only build something new when no entry point fits, and compose it from library primitives (`card`, `button`, `field`, ...).
27
-
28
- ## 3. Follow the library conventions
29
-
30
- - Import from explicit subpaths: `import { Button } from '@brumaombra/ui-vintage/button'`. Never import from `@brumaombra/ui-vintage/src/...`.
31
- - Style with the semantic tokens (`bg-card`, `bg-surface`, `bg-accent`, `bg-primary`, `text-muted-foreground`, `border-border`, `border-border-strong`, ...). They adapt to dark mode, so do not write `dark:` color variants or hard-coded colors for surfaces and text.
32
- - Customize components through their props and the `class` prop (merged with tailwind-merge) rather than wrapping them in extra styled elements.
33
- - For motion, reuse the library utilities (`ease-spring`, `ease-out-expo`, `animate-uv-fade-up`, `animate-uv-pop`, `uv-floating-motion`, `shadow-elevated-*`). In custom transitions, name `scale`, `rotate`, and `translate` explicitly; Tailwind v4 does not animate them through `transform`.
34
- - Icons are Hugeicons definitions: import from `@hugeicons/core-free-icons` and pass them to `:icon` props, or render them with `HugeiconsIcon` from `@hugeicons/vue`.
35
- - Form controls use `v-model`. Mark invalid fields with `aria-invalid` and show messages with `FieldError`.
36
- - Library strings are translated through vue-i18n (`uiVintage.*` keys). App copy belongs in the app's own locale files.
37
-
38
- ## 4. Check your work
39
-
40
- - Every import path you used appears as an entry point in `COMPONENTS.md`.
41
- - Every prop and event you used appears in that component's table.
42
- - No new CSS reimplements something a component or token already provides.