@brumaombra/ui-vintage 0.8.2 → 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 (134) hide show
  1. package/AGENTS.md +41 -0
  2. package/COMPONENTS.md +88 -17
  3. package/README.md +296 -262
  4. package/module.mjs +5 -11
  5. package/package.json +30 -12
  6. package/src/components/blog/BlogContentRenderer.vue +1 -1
  7. package/src/components/blog/BlogHeaderSection.vue +93 -19
  8. package/src/components/blog/BlogInfoSection.vue +39 -36
  9. package/src/components/blog/BlogPostHeader.vue +181 -0
  10. package/src/components/blog/BlogProgressBar.vue +3 -5
  11. package/src/components/blog/BlogSectionTitle.vue +8 -6
  12. package/src/components/blog/BlogTagsSection.vue +16 -7
  13. package/src/components/blog/CategoryCard.vue +18 -23
  14. package/src/components/blog/HeaderCarousel.vue +15 -6
  15. package/src/components/blog/PostCard.vue +13 -20
  16. package/src/components/blog/SocialShareSidebar.vue +24 -14
  17. package/src/components/blog/TableOfContents.vue +61 -28
  18. package/src/components/blog/index.ts +1 -0
  19. package/src/components/card-grid/CardGrid.vue +2 -2
  20. package/src/components/confirm-dialog/ConfirmDialog.vue +5 -0
  21. package/src/components/confirm-dialog/confirm-dialog-state.ts +22 -22
  22. package/src/components/content/BlogList.vue +28 -52
  23. package/src/components/content/BlogTable.vue +26 -30
  24. package/src/components/content/CodeBlock.vue +96 -22
  25. package/src/components/content/Flow.vue +29 -35
  26. package/src/components/content/ProseHr.vue +5 -5
  27. package/src/components/content/ProsePre.vue +9 -4
  28. package/src/components/content/Terminal.vue +42 -20
  29. package/src/components/cookie-consent/CookieConsent.vue +1 -1
  30. package/src/components/dashboard-shell/DashboardShell.vue +24 -7
  31. package/src/components/empty-state-card/EmptyStateCard.vue +2 -2
  32. package/src/components/error-page/ErrorPage.vue +3 -3
  33. package/src/components/info-card/InfoCard.vue +4 -4
  34. package/src/components/landing/landing-footer/LandingFooter.vue +16 -11
  35. package/src/components/landing/landing-navbar/LandingNavbar.vue +22 -6
  36. package/src/components/landing/landing-shell/LandingShell.vue +2 -7
  37. package/src/components/language-flag/index.ts +1 -0
  38. package/src/components/language-selector/LanguageSelector.vue +18 -10
  39. package/src/components/load-more-button/LoadMoreButton.vue +7 -12
  40. package/src/components/loading-state-card/LoadingStateCard.vue +2 -2
  41. package/src/components/message-dialog/MessageDialog.vue +11 -11
  42. package/src/components/message-dialog/message-dialog-state.ts +1 -4
  43. package/src/components/message-toast/MessageToast.vue +24 -9
  44. package/src/components/message-toast/message-toast-state.ts +20 -0
  45. package/src/components/page-header/PageHeader.vue +1 -1
  46. package/src/components/progress-component/ProgressComponent.vue +7 -3
  47. package/src/components/single-value-card/SingleValueCard.vue +37 -39
  48. package/src/components/slider-form-component/SliderFormComponent.vue +1 -1
  49. package/src/components/stat-strip/StatStrip.vue +36 -0
  50. package/src/components/stat-strip/index.ts +2 -0
  51. package/src/components/switch-form-component/SwitchFormComponent.vue +5 -5
  52. package/src/components/text-link/TextLink.vue +1 -1
  53. package/src/components/theme-selector/ThemeSelector.vue +2 -2
  54. package/src/components/theme-selector/theme-transition.ts +15 -3
  55. package/src/components/ui/accordion/Accordion.vue +18 -18
  56. package/src/components/ui/alert/AlertTitle.vue +1 -1
  57. package/src/components/ui/alert/index.ts +1 -1
  58. package/src/components/ui/avatar/AvatarFallback.vue +2 -1
  59. package/src/components/ui/avatar/AvatarGroup.vue +13 -3
  60. package/src/components/ui/breadcrumb/BreadcrumbEllipsis.vue +2 -2
  61. package/src/components/ui/busy/Busy.vue +5 -7
  62. package/src/components/ui/button/Button.vue +4 -2
  63. package/src/components/ui/button/index.ts +1 -4
  64. package/src/components/ui/calendar/Calendar.vue +12 -7
  65. package/src/components/ui/calendar/CalendarCell.vue +1 -1
  66. package/src/components/ui/calendar/CalendarCellTrigger.vue +1 -1
  67. package/src/components/ui/calendar/CalendarHeadCell.vue +1 -1
  68. package/src/components/ui/calendar/CalendarNextButton.vue +1 -1
  69. package/src/components/ui/calendar/CalendarPrevButton.vue +1 -1
  70. package/src/components/ui/card/Card.vue +5 -15
  71. package/src/components/ui/checkbox/Checkbox.vue +5 -1
  72. package/src/components/ui/combobox/ComboboxInput.vue +5 -1
  73. package/src/components/ui/command/CommandGroup.vue +17 -3
  74. package/src/components/ui/command/CommandInput.vue +1 -1
  75. package/src/components/ui/command/CommandList.vue +5 -1
  76. package/src/components/ui/data-table/DataTable.vue +11 -3
  77. package/src/components/ui/date-picker/DatePicker.vue +7 -1
  78. package/src/components/ui/date-time-picker/DateTimePicker.vue +5 -1
  79. package/src/components/ui/dropdown-menu/DropdownMenuItem.vue +1 -1
  80. package/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +1 -1
  81. package/src/components/ui/dropdown-menu/classes.ts +2 -0
  82. package/src/components/ui/field/Field.vue +4 -0
  83. package/src/components/ui/field/FieldLabel.vue +6 -2
  84. package/src/components/ui/field/field-context.ts +62 -0
  85. package/src/components/ui/field/index.ts +1 -0
  86. package/src/components/ui/file-dropzone/FileDropzone.vue +4 -4
  87. package/src/components/ui/input/Input.vue +5 -1
  88. package/src/components/ui/native-select/NativeSelect.vue +6 -2
  89. package/src/components/ui/number-field/NumberField.vue +5 -1
  90. package/src/components/ui/pagination/PaginationItem.vue +1 -1
  91. package/src/components/ui/pin-input/PinInputInput.vue +2 -2
  92. package/src/components/ui/progress/Progress.vue +2 -2
  93. package/src/components/ui/radio-group/RadioGroupCard.vue +1 -1
  94. package/src/components/ui/select/SelectItem.vue +1 -1
  95. package/src/components/ui/select/SelectItemContent.vue +1 -1
  96. package/src/components/ui/select/SelectTrigger.vue +5 -1
  97. package/src/components/ui/sidebar/Sidebar.vue +1 -1
  98. package/src/components/ui/sidebar/SidebarGroupAction.vue +1 -1
  99. package/src/components/ui/sidebar/SidebarGroupLabel.vue +1 -1
  100. package/src/components/ui/sidebar/SidebarInset.vue +1 -1
  101. package/src/components/ui/sidebar/SidebarMenuAction.vue +1 -1
  102. package/src/components/ui/sidebar/SidebarMenuBadge.vue +1 -1
  103. package/src/components/ui/sidebar/SidebarMenuSkeleton.vue +2 -2
  104. package/src/components/ui/sidebar/SidebarMenuSubButton.vue +1 -1
  105. package/src/components/ui/sidebar/SidebarProvider.vue +17 -6
  106. package/src/components/ui/sidebar/index.ts +2 -2
  107. package/src/components/ui/sidebar/utils.ts +1 -1
  108. package/src/components/ui/slider/Slider.vue +5 -4
  109. package/src/components/ui/spinner/Spinner.vue +3 -2
  110. package/src/components/ui/stepper/StepperDescription.vue +5 -3
  111. package/src/components/ui/stepper/StepperIndicator.vue +2 -2
  112. package/src/components/ui/stepper/StepperTitle.vue +5 -3
  113. package/src/components/ui/switch/Switch.vue +6 -2
  114. package/src/components/ui/tabs/TabsList.vue +1 -1
  115. package/src/components/ui/tabs/TabsTrigger.vue +1 -1
  116. package/src/components/ui/textarea/Textarea.vue +5 -1
  117. package/src/components/ui/time-picker/TimePicker.vue +2 -2
  118. package/src/components/ui/toggle-group/ToggleGroup.vue +1 -1
  119. package/src/components/ui/tooltip/TooltipContent.vue +1 -1
  120. package/src/i18n/de.json +16 -6
  121. package/src/i18n/en.json +16 -6
  122. package/src/i18n/es.json +16 -6
  123. package/src/i18n/fr.json +16 -6
  124. package/src/i18n/it.json +16 -6
  125. package/src/i18n/ja.json +16 -6
  126. package/src/i18n/pt.json +16 -6
  127. package/src/i18n/ru.json +16 -6
  128. package/src/i18n/zh.json +16 -6
  129. package/src/lib/color-tokens.ts +1 -1
  130. package/src/lib/i18n.ts +32 -4
  131. package/src/lib/utils.ts +21 -1
  132. package/src/runtime/ui-vintage-i18n-plugin.ts +11 -1
  133. package/src/styles.css +12 -16
  134. 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,10 +167,10 @@ 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
170
  --animate-uv-word-in: uv-word-in 0.9s var(--ease-spring) both;
171
171
  --animate-uv-grow-x: uv-grow-x 0.9s var(--ease-out-expo) both;
172
172
  --animate-uv-ken-burns: uv-ken-burns 9s ease-out both;
173
+ --animate-uv-draw: uv-draw 1s var(--ease-out-expo) both;
173
174
 
174
175
  @keyframes uv-word-in {
175
176
  0% { opacity: 0; transform: translateY(0.45em); filter: blur(8px); }
@@ -181,6 +182,12 @@ html {
181
182
  100% { transform: scaleX(1); }
182
183
  }
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
+
184
191
  @keyframes uv-ken-burns {
185
192
  0% { transform: scale(1.12); }
186
193
  100% { transform: scale(1); }
@@ -224,11 +231,6 @@ html {
224
231
  50% { transform: translateX(40%) scaleX(0.6); }
225
232
  100% { transform: translateX(120%) scaleX(0.4); }
226
233
  }
227
-
228
- @keyframes uv-gradient {
229
- 0%, 100% { background-position: 0% 50%; }
230
- 50% { background-position: 100% 50%; }
231
- }
232
234
  }
233
235
 
234
236
  /* Floating surfaces (popover, select, dropdown, tooltip, hover card) scale from their anchor */
@@ -335,15 +337,6 @@ html {
335
337
  }
336
338
  }
337
339
 
338
- /* Shared focus ring used by interactive primitives */
339
- @utility uv-focus-ring {
340
- outline: none;
341
-
342
- &:focus-visible {
343
- box-shadow: 0 0 0 1px var(--background), 0 0 0 3px color-mix(in oklab, var(--ring) 55%, transparent);
344
- }
345
- }
346
-
347
340
  /* Shared interactive states for inputs, textareas, and field-like triggers (base colors stay in utility classes) */
348
341
  @utility uv-field {
349
342
  transition-property: border-color, box-shadow, background-color, color, opacity;
@@ -369,6 +362,9 @@ html {
369
362
  }
370
363
 
371
364
  .dark {
365
+ /* Native controls (date/time pickers, scrollbars, form widgets) follow the theme */
366
+ color-scheme: dark;
367
+
372
368
  --background: var(--bg-main-dark);
373
369
  --foreground: var(--text-primary-dark);
374
370
  --card: var(--bg-card-dark);
@@ -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.