@veristone/nuxt-v-app 0.1.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 (136) hide show
  1. package/README.md +42 -0
  2. package/app/app.vue +7 -0
  3. package/app/assets/css/v-app.css +313 -0
  4. package/app/components/V/A/Badge.vue +75 -0
  5. package/app/components/V/A/Btn/Add.vue +17 -0
  6. package/app/components/V/A/Btn/Back.vue +25 -0
  7. package/app/components/V/A/Btn/ConfirmDelete.vue +45 -0
  8. package/app/components/V/A/Btn/Edit.vue +35 -0
  9. package/app/components/V/A/Btn/Export.vue +28 -0
  10. package/app/components/V/A/Btn/Refresh.vue +21 -0
  11. package/app/components/V/A/Btn/Submit.vue +45 -0
  12. package/app/components/V/A/Btn/View.vue +23 -0
  13. package/app/components/V/A/Card.legacy.vue +291 -0
  14. package/app/components/V/A/Card.vue +108 -0
  15. package/app/components/V/A/CompanyMenu.vue +83 -0
  16. package/app/components/V/A/Data/KeyValue.vue +98 -0
  17. package/app/components/V/A/Data/StatusBadge.vue +44 -0
  18. package/app/components/V/A/DataField.vue +140 -0
  19. package/app/components/V/A/DataGrid.vue +43 -0
  20. package/app/components/V/A/DataTable.vue +144 -0
  21. package/app/components/V/A/EmptyState.vue +154 -0
  22. package/app/components/V/A/Fmt/Currency.vue +36 -0
  23. package/app/components/V/A/Fmt/DateTime.vue +34 -0
  24. package/app/components/V/A/Fmt/Percent.vue +47 -0
  25. package/app/components/V/A/LoadingState.vue +140 -0
  26. package/app/components/V/A/MetricCard.vue +129 -0
  27. package/app/components/V/A/Modal/Base.vue +195 -0
  28. package/app/components/V/A/Modal/Confirm.vue +92 -0
  29. package/app/components/V/A/Modal/Form.vue +105 -0
  30. package/app/components/V/A/Navigation.vue +110 -0
  31. package/app/components/V/A/QuickActions.vue +169 -0
  32. package/app/components/V/A/Slide.vue +109 -0
  33. package/app/components/V/A/Slideover.vue +259 -0
  34. package/app/components/V/A/State/Empty.vue +20 -0
  35. package/app/components/V/A/State/Error.vue +34 -0
  36. package/app/components/V/A/State/Loading.vue +33 -0
  37. package/app/components/V/A/StatsCard.vue +215 -0
  38. package/app/components/V/A/StatusBadge.vue +215 -0
  39. package/app/components/V/A/Table.vue +674 -0
  40. package/app/components/V/A/UserMenu.vue +127 -0
  41. package/app/components/V/A/WelcomeHeader.vue +96 -0
  42. package/app/components/V/Modal.vue +36 -0
  43. package/app/components/Va/Blocks/VaBlockGridCharts.vue +32 -0
  44. package/app/components/Va/Blocks/VaBlockGridKPI.vue +32 -0
  45. package/app/components/Va/Blocks/VaBlockGridTables.vue +23 -0
  46. package/app/components/Va/Blocks/VaBlockKpiGrid.vue +8 -0
  47. package/app/components/Va/Blocks/VaBlockSessionFilterBar.vue +8 -0
  48. package/app/components/Va/Cards/VaCardDonutChart.vue +59 -0
  49. package/app/components/Va/Cards/VaCardHeader.vue +10 -0
  50. package/app/components/Va/Cards/VaCardKpi.vue +17 -0
  51. package/app/components/Va/Cards/VaCardKpi2.vue +55 -0
  52. package/app/components/Va/Cards/VaCardLatestOrders.vue +82 -0
  53. package/app/components/Va/Cards/VaCardPopularProducts.vue +88 -0
  54. package/app/components/Va/Cards/VaCardRevenueBarChart.vue +49 -0
  55. package/app/components/Va/Cards/VaCardSubtitle.vue +5 -0
  56. package/app/components/Va/Cards/VaCardTitle.vue +5 -0
  57. package/app/components/Va/Cards/VaCardWithActiveUsers.vue +41 -0
  58. package/app/components/Va/Cards/VaCardWithChart.vue +135 -0
  59. package/app/components/Va/Cards/VaCardWithChartBlock.vue +26 -0
  60. package/app/components/Va/Cards/VaCardWithIndicator.vue +39 -0
  61. package/app/components/Va/Cards/VaCardWithProgressCircle.vue +34 -0
  62. package/app/components/Va/Cards/types.ts +11 -0
  63. package/app/components/Va/Charts/VaChartAppPerformanceBar.vue +118 -0
  64. package/app/components/Va/Charts/VaChartAppPerformanceBarChart.vue +118 -0
  65. package/app/components/Va/Charts/VaChartAreaMini.vue +127 -0
  66. package/app/components/Va/Charts/VaChartBarMini.vue +68 -0
  67. package/app/components/Va/Charts/VaChartCardinalMulti.vue +108 -0
  68. package/app/components/Va/Charts/VaChartColorBarChart.vue +78 -0
  69. package/app/components/Va/Charts/VaChartDonutHalf.vue +35 -0
  70. package/app/components/Va/Charts/VaChartDonutMini.vue +77 -0
  71. package/app/components/Va/Charts/VaChartExpensesBar.vue +58 -0
  72. package/app/components/Va/Charts/VaChartFinanceSummary.vue +96 -0
  73. package/app/components/Va/Charts/VaChartGoogleSearchConsole.vue +90 -0
  74. package/app/components/Va/Charts/VaChartIncomeBar.vue +82 -0
  75. package/app/components/Va/Charts/VaChartLegend.vue +25 -0
  76. package/app/components/Va/Charts/VaChartLineMini.vue +205 -0
  77. package/app/components/Va/Charts/VaChartRealtimeTraffic.vue +182 -0
  78. package/app/components/Va/Charts/VaChartRevenue.vue +43 -0
  79. package/app/components/Va/Charts/VaChartRevenueLine.vue +42 -0
  80. package/app/components/Va/Charts/VaChartRevenuevsCost.vue +84 -0
  81. package/app/components/Va/Charts/VaChartSearchIntent.vue +179 -0
  82. package/app/components/Va/Charts/VaChartSpendingTrend.vue +127 -0
  83. package/app/components/Va/Charts/VaChartStackedHorizontal.vue +64 -0
  84. package/app/components/Va/Charts/VaChartStepMinimal.vue +109 -0
  85. package/app/components/Va/Charts/VaChartStockComparisonLine.vue +86 -0
  86. package/app/components/Va/Charts/VaChartStocksPortfolioLine.vue +161 -0
  87. package/app/components/Va/Charts/VaChartStocksSectorLine.vue +223 -0
  88. package/app/components/Va/Charts/VaChartTasksCategories.vue +96 -0
  89. package/app/components/Va/Charts/VaChartTasksProgress.vue +130 -0
  90. package/app/components/Va/Charts/VaChartTrafficOverview.vue +112 -0
  91. package/app/components/Va/Charts/VaChartWebPerformanceLineChart.vue +114 -0
  92. package/app/components/Va/Charts/VaChartWinLostBar.vue +110 -0
  93. package/app/components/Va/Charts/VaChartWinLostDonut.vue +107 -0
  94. package/app/components/Va/Charts/VaChartWinLostLine.vue +111 -0
  95. package/app/components/Va/Charts/types.ts +10 -0
  96. package/app/components/Va/Dashboard/Navigation/types.ts +8 -0
  97. package/app/components/Va/Dashboard/VaDashboardKPICard.vue +31 -0
  98. package/app/components/Va/Dashboard/VaDashboardNavigation.vue +50 -0
  99. package/app/components/Va/Dashboard/VaDashboardPricePlan.vue +102 -0
  100. package/app/components/Va/Dashboard/VaDashboardUsageChart.vue +84 -0
  101. package/app/components/Va/Dashboard/VaDashboardUsageRequestChart.vue +46 -0
  102. package/app/components/Va/Layout/NotificationsSlideover.vue +169 -0
  103. package/app/components/Va/Layout/SideNav/types.ts +5 -0
  104. package/app/components/Va/Layout/SideNav.vue +108 -0
  105. package/app/components/Va/Layout/TeamsMenu.vue +57 -0
  106. package/app/components/Va/Layout/UserMenu.vue +57 -0
  107. package/app/composables/useDashboard.ts +25 -0
  108. package/app/composables/useVAAnimation.ts +324 -0
  109. package/app/composables/useVAUtils.ts +118 -0
  110. package/app/composables/useVCrud.ts +647 -0
  111. package/app/composables/useVFetch.ts +46 -0
  112. package/app/composables/useVFileUpload.ts +45 -0
  113. package/app/composables/useVToast.ts +73 -0
  114. package/app/composables/useXATableColumns.ts +456 -0
  115. package/app/data/BillingStats.ts +65 -0
  116. package/app/data/SearchData.ts +58 -0
  117. package/app/data/TasksData.ts +101 -0
  118. package/app/data/dashboardData.ts +113 -0
  119. package/app/layouts/default.vue +171 -0
  120. package/app/layouts/legacy.vue +61 -0
  121. package/app/pages/playground/base.vue +498 -0
  122. package/app/pages/playground/blocks.vue +108 -0
  123. package/app/pages/playground/buttons.vue +237 -0
  124. package/app/pages/playground/cards.vue +326 -0
  125. package/app/pages/playground/charts.vue +338 -0
  126. package/app/pages/playground/dashboard.vue +315 -0
  127. package/app/pages/playground/formatters.vue +329 -0
  128. package/app/pages/playground/index.vue +109 -0
  129. package/app/pages/playground/layout.vue +159 -0
  130. package/app/pages/playground/modals.vue +606 -0
  131. package/app/pages/playground/states.vue +282 -0
  132. package/app/pages/playground/tables.vue +618 -0
  133. package/app/pages/test-layout.vue +10 -0
  134. package/nuxt.config.ts +12 -0
  135. package/package.json +71 -0
  136. package/tsconfig.json +18 -0
@@ -0,0 +1,33 @@
1
+ <script setup lang="ts">
2
+ const props = withDefaults(defineProps<{
3
+ rows?: number
4
+ variant?: 'rows' | 'card' | 'spinner'
5
+ message?: string
6
+ size?: 'sm' | 'md' | 'lg'
7
+ }>(), {
8
+ rows: 3,
9
+ variant: 'rows',
10
+ size: 'md'
11
+ })
12
+ </script>
13
+
14
+ <template>
15
+ <div class="w-full animate-pulse">
16
+ <div v-if="variant === 'spinner'" class="flex flex-col items-center justify-center py-8">
17
+ <UIcon name="i-lucide-loader-2" class="animate-spin text-primary-500" :class="{ 'w-6 h-6': size === 'sm', 'w-8 h-8': size === 'md', 'w-12 h-12': size === 'lg' }" />
18
+ <p v-if="message" class="mt-3 text-sm text-gray-500 font-medium">{{ message }}</p>
19
+ </div>
20
+
21
+ <div v-else-if="variant === 'card'" class="rounded-xl border border-gray-100 dark:border-gray-800 bg-white dark:bg-gray-900 p-4 space-y-4">
22
+ <div class="h-6 bg-gray-200 dark:bg-gray-800 rounded w-1/3" />
23
+ <div class="space-y-2">
24
+ <div class="h-4 bg-gray-200 dark:bg-gray-800 rounded w-full" />
25
+ <div class="h-4 bg-gray-200 dark:bg-gray-800 rounded w-5/6" />
26
+ </div>
27
+ </div>
28
+
29
+ <div v-else class="space-y-3">
30
+ <div v-for="i in rows" :key="i" class="h-4 bg-gray-200 dark:bg-gray-800 rounded" :style="{ width: `${Math.random() * 40 + 60}%` }" />
31
+ </div>
32
+ </div>
33
+ </template>
@@ -0,0 +1,215 @@
1
+ <script setup lang="ts">
2
+ type StatFormat = 'number' | 'currency' | 'percentage'
3
+ type AccentColor = 'coral' | 'teal' | 'amber' | 'navy' | 'success' | 'warning' | 'gold'
4
+
5
+ const props = withDefaults(defineProps<{
6
+ label: string
7
+ value?: string | number
8
+ previousValue?: string | number | null
9
+ format?: StatFormat
10
+ icon?: string
11
+ accentColor?: AccentColor
12
+ loading?: boolean
13
+ animationDelay?: string
14
+ }>(), {
15
+ value: '',
16
+ previousValue: null,
17
+ format: 'number',
18
+ icon: '',
19
+ accentColor: 'coral',
20
+ loading: false,
21
+ animationDelay: '0s'
22
+ })
23
+
24
+ const accentColors: Record<AccentColor, string> = {
25
+ coral: '#ff5c35',
26
+ teal: '#00a4bd',
27
+ amber: '#f5a623',
28
+ navy: '#2d3e50',
29
+ success: '#00a4bd',
30
+ warning: '#f5a623',
31
+ gold: '#d4af37'
32
+ }
33
+
34
+ const accentStyle = computed(() => ({
35
+ '--stat-accent': accentColors[props.accentColor] || accentColors.coral
36
+ }))
37
+
38
+ const formattedValue = computed(() => {
39
+ if (props.loading) return '—'
40
+ const num = typeof props.value === 'string' ? parseFloat(props.value) : props.value
41
+
42
+ if (isNaN(num as number)) return props.value
43
+
44
+ switch (props.format) {
45
+ case 'currency':
46
+ return new Intl.NumberFormat('en-US', {
47
+ style: 'currency',
48
+ currency: 'USD',
49
+ minimumFractionDigits: 0,
50
+ maximumFractionDigits: 0
51
+ }).format(num as number)
52
+ case 'percentage':
53
+ return `${(num as number).toFixed(1)}%`
54
+ default:
55
+ return new Intl.NumberFormat('en-US').format(num as number)
56
+ }
57
+ })
58
+
59
+ const trend = computed(() => {
60
+ if (props.previousValue === null || props.loading) return null
61
+
62
+ const current = typeof props.value === 'string' ? parseFloat(props.value) : props.value
63
+ const previous = typeof props.previousValue === 'string' ? parseFloat(props.previousValue) : props.previousValue
64
+
65
+ if (isNaN(current as number) || isNaN(previous as number) || previous === 0) return null
66
+
67
+ const change = (((current as number) - (previous as number)) / (previous as number)) * 100
68
+ return {
69
+ direction: change > 0 ? 'up' : change < 0 ? 'down' : 'neutral',
70
+ value: Math.abs(change).toFixed(1)
71
+ }
72
+ })
73
+
74
+ const trendIcon = computed(() => {
75
+ if (!trend.value) return ''
76
+ return trend.value.direction === 'up'
77
+ ? 'i-lucide-trending-up'
78
+ : trend.value.direction === 'down'
79
+ ? 'i-lucide-trending-down'
80
+ : 'i-lucide-minus'
81
+ })
82
+ </script>
83
+
84
+ <template>
85
+ <div
86
+ class="va-stats-card-wrapper rounded-xl border border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-900 p-5 transition-all duration-200 shadow-[0_2px_9px_rgba(0,0,0,0.08)] hover:shadow-[0_4px_12px_rgba(61,113,136,0.12)] hover:-translate-y-0.5 animate-fade-in-up"
87
+ :style="{ animationDelay }"
88
+ >
89
+ <div
90
+ class="va-stats-card"
91
+ :style="accentStyle"
92
+ >
93
+ <div v-if="icon" class="va-stats-card__icon" :style="{ background: `${accentColors[accentColor]}15`, color: accentColors[accentColor] }">
94
+ <UIcon :name="icon" class="size-5" />
95
+ </div>
96
+
97
+ <div class="va-stats-card__content">
98
+ <p class="va-stats-card__label">{{ label }}</p>
99
+
100
+ <div class="va-stats-card__value-row">
101
+ <template v-if="loading">
102
+ <div class="va-stats-card__skeleton" />
103
+ </template>
104
+ <template v-else>
105
+ <span class="va-stats-card__value tabular-nums">{{ formattedValue }}</span>
106
+
107
+ <div
108
+ v-if="trend"
109
+ class="va-stats-card__trend"
110
+ :class="`va-stats-card__trend--${trend.direction}`"
111
+ >
112
+ <UIcon :name="trendIcon" class="size-4" />
113
+ <span>{{ trend.value }}%</span>
114
+ </div>
115
+ </template>
116
+ </div>
117
+ </div>
118
+ </div>
119
+ </div>
120
+ </template>
121
+
122
+ <style scoped>
123
+ .va-stats-card {
124
+ display: flex;
125
+ align-items: flex-start;
126
+ gap: 1rem;
127
+ }
128
+
129
+ .va-stats-card__icon {
130
+ flex-shrink: 0;
131
+ width: 2.75rem;
132
+ height: 2.75rem;
133
+ display: flex;
134
+ align-items: center;
135
+ justify-content: center;
136
+ border-radius: 10px;
137
+ transition: transform 0.2s ease;
138
+ }
139
+
140
+ .va-stats-card:hover .va-stats-card__icon {
141
+ transform: scale(1.05);
142
+ }
143
+
144
+ .va-stats-card__content {
145
+ flex: 1;
146
+ min-width: 0;
147
+ }
148
+
149
+ .va-stats-card__label {
150
+ font-size: 0.8125rem;
151
+ font-weight: 500;
152
+ color: var(--color-text-muted);
153
+ margin-bottom: 0.375rem;
154
+ text-transform: uppercase;
155
+ letter-spacing: 0.03em;
156
+ }
157
+
158
+ .va-stats-card__value-row {
159
+ display: flex;
160
+ align-items: baseline;
161
+ gap: 0.75rem;
162
+ flex-wrap: wrap;
163
+ }
164
+
165
+ .va-stats-card__value {
166
+ font-family: var(--font-display);
167
+ font-size: 1.75rem;
168
+ font-weight: 700;
169
+ color: var(--color-text-primary);
170
+ line-height: 1.2;
171
+ letter-spacing: -0.02em;
172
+ }
173
+
174
+ .dark .va-stats-card__value {
175
+ color: #ffffff;
176
+ }
177
+
178
+ .va-stats-card__skeleton {
179
+ height: 2rem;
180
+ width: 6rem;
181
+ background: rgba(255, 255, 255, 0.1);
182
+ border-radius: 4px;
183
+ animation: vaStatsPulse 1.5s ease-in-out infinite;
184
+ }
185
+
186
+ @keyframes vaStatsPulse {
187
+ 0%, 100% { opacity: 0.5; }
188
+ 50% { opacity: 1; }
189
+ }
190
+
191
+ .va-stats-card__trend {
192
+ display: inline-flex;
193
+ align-items: center;
194
+ gap: 0.25rem;
195
+ font-size: 0.75rem;
196
+ font-weight: 600;
197
+ padding: 0.125rem 0.5rem;
198
+ border-radius: 9999px;
199
+ }
200
+
201
+ .va-stats-card__trend--up {
202
+ color: var(--color-success, #00a4bd);
203
+ background: rgba(0, 164, 189, 0.1);
204
+ }
205
+
206
+ .va-stats-card__trend--down {
207
+ color: var(--color-error, #f2545b);
208
+ background: rgba(242, 84, 91, 0.1);
209
+ }
210
+
211
+ .va-stats-card__trend--neutral {
212
+ color: var(--color-text-muted);
213
+ background: var(--color-surface-muted);
214
+ }
215
+ </style>
@@ -0,0 +1,215 @@
1
+ <template>
2
+ <span
3
+ class="va-status-badge"
4
+ :class="[
5
+ `va-status-badge--${status}`,
6
+ `va-status-badge--${size}`,
7
+ `va-status-badge--${variant}`
8
+ ]"
9
+ >
10
+ <span v-if="showDot" class="va-status-badge__dot" />
11
+ <span class="va-status-badge__text">
12
+ <slot>{{ label }}</slot>
13
+ </span>
14
+ </span>
15
+ </template>
16
+
17
+ <script setup lang="ts">
18
+ type BadgeStatus = 'success' | 'warning' | 'error' | 'info' | 'neutral' | 'gold'
19
+ type BadgeSize = 'sm' | 'md' | 'lg'
20
+ type BadgeVariant = 'subtle' | 'solid' | 'outline'
21
+
22
+ withDefaults(defineProps<{
23
+ label?: string
24
+ status?: BadgeStatus
25
+ size?: BadgeSize
26
+ variant?: BadgeVariant
27
+ showDot?: boolean
28
+ }>(), {
29
+ label: '',
30
+ status: 'neutral',
31
+ size: 'md',
32
+ variant: 'subtle',
33
+ showDot: true
34
+ })
35
+ </script>
36
+
37
+ <style scoped>
38
+ .va-status-badge {
39
+ display: inline-flex;
40
+ align-items: center;
41
+ gap: 0.375rem;
42
+ font-weight: 600;
43
+ text-transform: uppercase;
44
+ letter-spacing: 0.05em;
45
+ border-radius: 100px;
46
+ transition: all 0.2s ease;
47
+ }
48
+
49
+ .va-status-badge--sm {
50
+ padding: 0.25rem 0.625rem;
51
+ font-size: 0.6875rem;
52
+ }
53
+
54
+ .va-status-badge--md {
55
+ padding: 0.375rem 0.875rem;
56
+ font-size: 0.75rem;
57
+ }
58
+
59
+ .va-status-badge--lg {
60
+ padding: 0.5rem 1.125rem;
61
+ font-size: 0.8125rem;
62
+ }
63
+
64
+ .va-status-badge__dot {
65
+ width: 6px;
66
+ height: 6px;
67
+ border-radius: 50%;
68
+ animation: vaBadgePulse 2s ease-in-out infinite;
69
+ }
70
+
71
+ .va-status-badge--sm .va-status-badge__dot {
72
+ width: 5px;
73
+ height: 5px;
74
+ }
75
+
76
+ .va-status-badge--lg .va-status-badge__dot {
77
+ width: 7px;
78
+ height: 7px;
79
+ }
80
+
81
+ @keyframes vaBadgePulse {
82
+ 0%, 100% { opacity: 1; }
83
+ 50% { opacity: 0.5; }
84
+ }
85
+
86
+ /* Subtle Variant */
87
+ .va-status-badge--subtle.va-status-badge--success {
88
+ background: rgba(34, 197, 94, 0.12);
89
+ color: #4ade80;
90
+ }
91
+ .va-status-badge--subtle.va-status-badge--success .va-status-badge__dot {
92
+ background: #22c55e;
93
+ box-shadow: 0 0 6px #22c55e;
94
+ }
95
+
96
+ .va-status-badge--subtle.va-status-badge--warning {
97
+ background: rgba(245, 158, 11, 0.12);
98
+ color: #fbbf24;
99
+ }
100
+ .va-status-badge--subtle.va-status-badge--warning .va-status-badge__dot {
101
+ background: #f59e0b;
102
+ box-shadow: 0 0 6px #f59e0b;
103
+ }
104
+
105
+ .va-status-badge--subtle.va-status-badge--error {
106
+ background: rgba(239, 68, 68, 0.12);
107
+ color: #f87171;
108
+ }
109
+ .va-status-badge--subtle.va-status-badge--error .va-status-badge__dot {
110
+ background: #ef4444;
111
+ box-shadow: 0 0 6px #ef4444;
112
+ }
113
+
114
+ .va-status-badge--subtle.va-status-badge--info {
115
+ background: rgba(59, 130, 246, 0.12);
116
+ color: #60a5fa;
117
+ }
118
+ .va-status-badge--subtle.va-status-badge--info .va-status-badge__dot {
119
+ background: #3b82f6;
120
+ box-shadow: 0 0 6px #3b82f6;
121
+ }
122
+
123
+ .va-status-badge--subtle.va-status-badge--neutral {
124
+ background: rgba(156, 163, 175, 0.12);
125
+ color: #9ca3af;
126
+ }
127
+ .va-status-badge--subtle.va-status-badge--neutral .va-status-badge__dot {
128
+ background: #6b7280;
129
+ }
130
+
131
+ .va-status-badge--subtle.va-status-badge--gold {
132
+ background: rgba(212, 175, 55, 0.12);
133
+ color: #e8c96f;
134
+ }
135
+ .va-status-badge--subtle.va-status-badge--gold .va-status-badge__dot {
136
+ background: #d4af37;
137
+ box-shadow: 0 0 6px #d4af37;
138
+ }
139
+
140
+ /* Solid Variant */
141
+ .va-status-badge--solid.va-status-badge--success {
142
+ background: #22c55e;
143
+ color: #052e16;
144
+ }
145
+
146
+ .va-status-badge--solid.va-status-badge--warning {
147
+ background: #f59e0b;
148
+ color: #451a03;
149
+ }
150
+
151
+ .va-status-badge--solid.va-status-badge--error {
152
+ background: #ef4444;
153
+ color: #450a0a;
154
+ }
155
+
156
+ .va-status-badge--solid.va-status-badge--info {
157
+ background: #3b82f6;
158
+ color: #1e3a5f;
159
+ }
160
+
161
+ .va-status-badge--solid.va-status-badge--neutral {
162
+ background: #6b7280;
163
+ color: #1f2937;
164
+ }
165
+
166
+ .va-status-badge--solid.va-status-badge--gold {
167
+ background: #d4af37;
168
+ color: #1a1a1a;
169
+ }
170
+
171
+ .va-status-badge--solid .va-status-badge__dot {
172
+ background: currentColor;
173
+ opacity: 0.5;
174
+ }
175
+
176
+ /* Outline Variant */
177
+ .va-status-badge--outline {
178
+ background: transparent;
179
+ border: 1px solid currentColor;
180
+ }
181
+
182
+ .va-status-badge--outline.va-status-badge--success {
183
+ color: #4ade80;
184
+ border-color: rgba(34, 197, 94, 0.4);
185
+ }
186
+
187
+ .va-status-badge--outline.va-status-badge--warning {
188
+ color: #fbbf24;
189
+ border-color: rgba(245, 158, 11, 0.4);
190
+ }
191
+
192
+ .va-status-badge--outline.va-status-badge--error {
193
+ color: #f87171;
194
+ border-color: rgba(239, 68, 68, 0.4);
195
+ }
196
+
197
+ .va-status-badge--outline.va-status-badge--info {
198
+ color: #60a5fa;
199
+ border-color: rgba(59, 130, 246, 0.4);
200
+ }
201
+
202
+ .va-status-badge--outline.va-status-badge--neutral {
203
+ color: #9ca3af;
204
+ border-color: rgba(156, 163, 175, 0.4);
205
+ }
206
+
207
+ .va-status-badge--outline.va-status-badge--gold {
208
+ color: #e8c96f;
209
+ border-color: rgba(212, 175, 55, 0.4);
210
+ }
211
+
212
+ .va-status-badge--outline .va-status-badge__dot {
213
+ background: currentColor;
214
+ }
215
+ </style>