@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.
- package/AGENTS.md +41 -0
- package/COMPONENTS.md +91 -17
- package/README.md +296 -262
- package/module.mjs +5 -11
- package/package.json +31 -13
- package/src/components/blog/AllPostsSection.vue +1 -2
- package/src/components/blog/BlogContentRenderer.vue +144 -49
- package/src/components/blog/BlogFAQSection.vue +13 -15
- package/src/components/blog/BlogHeaderSection.vue +103 -11
- package/src/components/blog/BlogInfoSection.vue +46 -42
- package/src/components/blog/BlogPostHeader.vue +181 -0
- package/src/components/blog/BlogProgressBar.vue +3 -2
- package/src/components/blog/BlogSectionTitle.vue +27 -6
- package/src/components/blog/BlogTagsSection.vue +20 -8
- package/src/components/blog/CategoriesList.vue +2 -2
- package/src/components/blog/CategoryCard.vue +23 -19
- package/src/components/blog/HeaderCarousel.vue +117 -145
- package/src/components/blog/PostCard.vue +25 -33
- package/src/components/blog/PostsList.vue +3 -2
- package/src/components/blog/SocialShareSidebar.vue +62 -42
- package/src/components/blog/TableOfContents.vue +71 -34
- package/src/components/blog/index.ts +1 -0
- package/src/components/card-grid/CardGrid.vue +2 -2
- package/src/components/confirm-dialog/ConfirmDialog.vue +5 -0
- package/src/components/confirm-dialog/confirm-dialog-state.ts +22 -22
- package/src/components/content/BlogList.vue +30 -42
- package/src/components/content/BlogTable.vue +26 -30
- package/src/components/content/CodeBlock.vue +96 -22
- package/src/components/content/Flow.vue +30 -36
- package/src/components/content/ProseHr.vue +6 -6
- package/src/components/content/ProsePre.vue +9 -4
- package/src/components/content/Terminal.vue +42 -14
- package/src/components/cookie-consent/CookieConsent.vue +1 -1
- package/src/components/dashboard-shell/DashboardShell.vue +24 -7
- package/src/components/empty-state-card/EmptyStateCard.vue +2 -2
- package/src/components/error-page/ErrorPage.vue +3 -3
- package/src/components/info-card/InfoCard.vue +4 -4
- package/src/components/landing/landing-footer/LandingFooter.vue +16 -6
- package/src/components/landing/landing-navbar/LandingNavbar.vue +63 -51
- package/src/components/language-flag/index.ts +1 -0
- package/src/components/language-selector/LanguageSelector.vue +18 -10
- package/src/components/load-more-button/LoadMoreButton.vue +7 -12
- package/src/components/loading-state-card/LoadingStateCard.vue +2 -2
- package/src/components/message-dialog/MessageDialog.vue +11 -11
- package/src/components/message-dialog/message-dialog-state.ts +1 -4
- package/src/components/message-toast/MessageToast.vue +24 -9
- package/src/components/message-toast/message-toast-state.ts +20 -0
- package/src/components/page-header/PageHeader.vue +1 -1
- package/src/components/progress-component/ProgressComponent.vue +7 -3
- package/src/components/single-value-card/SingleValueCard.vue +37 -39
- package/src/components/slider-form-component/SliderFormComponent.vue +1 -1
- package/src/components/stat-strip/StatStrip.vue +36 -0
- package/src/components/stat-strip/index.ts +2 -0
- package/src/components/switch-form-component/SwitchFormComponent.vue +5 -5
- package/src/components/text-link/TextLink.vue +1 -1
- package/src/components/theme-selector/ThemeSelector.vue +2 -2
- package/src/components/theme-selector/theme-transition.ts +15 -3
- package/src/components/ui/accordion/Accordion.vue +18 -18
- package/src/components/ui/alert/AlertTitle.vue +1 -1
- package/src/components/ui/alert/index.ts +1 -1
- package/src/components/ui/avatar/AvatarFallback.vue +2 -1
- package/src/components/ui/avatar/AvatarGroup.vue +13 -3
- package/src/components/ui/breadcrumb/BreadcrumbEllipsis.vue +2 -2
- package/src/components/ui/breadcrumb/BreadcrumbLink.vue +1 -1
- package/src/components/ui/breadcrumb/BreadcrumbList.vue +1 -1
- package/src/components/ui/breadcrumb/BreadcrumbPage.vue +1 -1
- package/src/components/ui/breadcrumb/BreadcrumbSeparator.vue +2 -6
- package/src/components/ui/busy/Busy.vue +5 -7
- package/src/components/ui/button/Button.vue +4 -2
- package/src/components/ui/button/index.ts +1 -4
- package/src/components/ui/calendar/Calendar.vue +12 -7
- package/src/components/ui/calendar/CalendarCell.vue +1 -1
- package/src/components/ui/calendar/CalendarCellTrigger.vue +1 -1
- package/src/components/ui/calendar/CalendarHeadCell.vue +1 -1
- package/src/components/ui/calendar/CalendarNextButton.vue +1 -1
- package/src/components/ui/calendar/CalendarPrevButton.vue +1 -1
- package/src/components/ui/card/Card.vue +5 -15
- package/src/components/ui/checkbox/Checkbox.vue +5 -1
- package/src/components/ui/combobox/ComboboxInput.vue +5 -1
- package/src/components/ui/command/CommandGroup.vue +17 -3
- package/src/components/ui/command/CommandInput.vue +1 -1
- package/src/components/ui/command/CommandItem.vue +2 -2
- package/src/components/ui/command/CommandList.vue +5 -1
- package/src/components/ui/data-table/DataTable.vue +11 -3
- package/src/components/ui/date-picker/DatePicker.vue +7 -1
- package/src/components/ui/date-time-picker/DateTimePicker.vue +5 -1
- package/src/components/ui/dropdown-menu/DropdownMenuItem.vue +1 -1
- package/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +1 -1
- package/src/components/ui/dropdown-menu/classes.ts +2 -0
- package/src/components/ui/field/Field.vue +4 -0
- package/src/components/ui/field/FieldLabel.vue +6 -2
- package/src/components/ui/field/field-context.ts +62 -0
- package/src/components/ui/field/index.ts +1 -0
- package/src/components/ui/file-dropzone/FileDropzone.vue +4 -4
- package/src/components/ui/input/Input.vue +5 -1
- package/src/components/ui/native-select/NativeSelect.vue +6 -2
- package/src/components/ui/number-field/NumberField.vue +5 -1
- package/src/components/ui/pagination/PaginationItem.vue +1 -1
- package/src/components/ui/pin-input/PinInputInput.vue +2 -2
- package/src/components/ui/progress/Progress.vue +2 -2
- package/src/components/ui/radio-group/RadioGroupCard.vue +1 -1
- package/src/components/ui/select/SelectItem.vue +1 -1
- package/src/components/ui/select/SelectItemContent.vue +1 -1
- package/src/components/ui/select/SelectTrigger.vue +5 -1
- package/src/components/ui/sidebar/Sidebar.vue +1 -1
- package/src/components/ui/sidebar/SidebarGroupAction.vue +1 -1
- package/src/components/ui/sidebar/SidebarGroupLabel.vue +1 -1
- package/src/components/ui/sidebar/SidebarInset.vue +1 -1
- package/src/components/ui/sidebar/SidebarMenuAction.vue +1 -1
- package/src/components/ui/sidebar/SidebarMenuBadge.vue +1 -1
- package/src/components/ui/sidebar/SidebarMenuSkeleton.vue +2 -2
- package/src/components/ui/sidebar/SidebarMenuSubButton.vue +1 -1
- package/src/components/ui/sidebar/SidebarProvider.vue +17 -6
- package/src/components/ui/sidebar/index.ts +2 -2
- package/src/components/ui/sidebar/utils.ts +1 -1
- package/src/components/ui/slider/Slider.vue +5 -4
- package/src/components/ui/spinner/Spinner.vue +3 -2
- package/src/components/ui/stepper/StepperDescription.vue +5 -3
- package/src/components/ui/stepper/StepperIndicator.vue +2 -2
- package/src/components/ui/stepper/StepperTitle.vue +5 -3
- package/src/components/ui/switch/Switch.vue +6 -2
- package/src/components/ui/tabs/TabsList.vue +1 -1
- package/src/components/ui/tabs/TabsTrigger.vue +1 -1
- package/src/components/ui/textarea/Textarea.vue +5 -1
- package/src/components/ui/time-picker/TimePicker.vue +2 -2
- package/src/components/ui/toggle-group/ToggleGroup.vue +1 -1
- package/src/components/ui/tooltip/TooltipContent.vue +1 -1
- package/src/i18n/de.json +19 -7
- package/src/i18n/en.json +19 -7
- package/src/i18n/es.json +19 -7
- package/src/i18n/fr.json +19 -7
- package/src/i18n/it.json +19 -7
- package/src/i18n/ja.json +19 -7
- package/src/i18n/pt.json +19 -7
- package/src/i18n/ru.json +19 -7
- package/src/i18n/zh.json +19 -7
- package/src/lib/color-tokens.ts +1 -1
- package/src/lib/i18n.ts +32 -4
- package/src/lib/utils.ts +21 -1
- package/src/runtime/ui-vintage-i18n-plugin.ts +11 -1
- package/src/styles.css +52 -16
- 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-
|
|
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.
|