UNPKG

@datametria/vue-components

Version:

DATAMETRIA Vue.js 3 Component Library with Multi-Brand Theming - 51 components + 10 composables with theming support, WCAG 2.2 AA, dark mode, responsive system

624 lines (525 loc) 16.8 kB
:root { --dm-primary: #0072CE; --dm-secondary: #4B0078; --dm-success: #10b981; --dm-error: #ef4444; --dm-warning: #f59e0b; --dm-info: #06b6d4; --dm-gray-50: #f9fafb; --dm-gray-100: #f3f4f6; --dm-gray-700: #374151; --dm-gray-900: #111827; /* Gradientes corporativos */ --gradient-primary: linear-gradient(135deg, #0072CE 0%, #005ba3 100%); --gradient-secondary: linear-gradient(135deg, #4B0078 0%, #3a005c 100%); --gradient-success: linear-gradient(135deg, #10b981 0%, #059669 100%); --gradient-warning: linear-gradient(135deg, #f59e0b 0%, #d97706 100%); /* Bordas temáticas */ --border-success: #10b981; --border-warning: #f59e0b; --border-info: #06b6d4; --border-feature: #8b5cf6; --border-error: #ef4444; --dm-space-2: 0.5rem; --dm-space-3: 0.75rem; --dm-space-4: 1rem; --dm-text-sm: 0.875rem; --dm-text-base: 1rem; --dm-text-lg: 1.125rem; /* Fluid typography */ --dm-text-xs-fluid: clamp(0.75rem, 0.7rem + 0.25vw, 0.875rem); --dm-text-sm-fluid: clamp(0.875rem, 0.8rem + 0.375vw, 1rem); --dm-text-base-fluid: clamp(1rem, 0.9rem + 0.5vw, 1.125rem); --dm-text-lg-fluid: clamp(1.125rem, 1rem + 0.625vw, 1.25rem); --dm-text-xl-fluid: clamp(1.25rem, 1.1rem + 0.75vw, 1.5rem); --dm-text-2xl-fluid: clamp(1.5rem, 1.3rem + 1vw, 1.875rem); --dm-text-3xl-fluid: clamp(1.875rem, 1.6rem + 1.375vw, 2.25rem); --dm-radius: 0.375rem; --dm-transition: 200ms ease-in-out; --dm-focus-ring: 0 0 0 3px rgba(0, 114, 206, 0.1); /* Accessibility Scale (default 1.0, range 0.8-2.0) */ --user-scale: 1.0; /* Scaled typography */ --dm-text-sm-scaled: calc(var(--dm-text-sm) * var(--user-scale)); --dm-text-base-scaled: calc(var(--dm-text-base) * var(--user-scale)); --dm-text-lg-scaled: calc(var(--dm-text-lg) * var(--user-scale)); /* Scaled spacing */ --dm-space-2-scaled: calc(var(--dm-space-2) * var(--user-scale)); --dm-space-3-scaled: calc(var(--dm-space-3) * var(--user-scale)); --dm-space-4-scaled: calc(var(--dm-space-4) * var(--user-scale)); /* Shimmer animation */ --shimmer-bg: linear-gradient(90deg, transparent 0%, rgba(255, 255, 255, 0.4) 50%, transparent 100%); --shimmer-duration: 1.5s; /* Enhanced transitions */ --transition-fast: 150ms ease-out; --transition-normal: 200ms ease-in-out; --transition-slow: 300ms ease-in-out; --transition-bounce: 400ms cubic-bezier(0.68, -0.55, 0.265, 1.55); --transition-smooth: 250ms cubic-bezier(0.4, 0, 0.2, 1); /* Responsive breakpoints */ --breakpoint-xs: 475px; --breakpoint-sm: 640px; --breakpoint-md: 768px; --breakpoint-lg: 1024px; --breakpoint-xl: 1280px; --breakpoint-2xl: 1536px; /* Fluid spacing system */ --space-xs-fluid: clamp(0.25rem, 0.2rem + 0.25vw, 0.375rem); --space-sm-fluid: clamp(0.5rem, 0.4rem + 0.5vw, 0.75rem); --space-md-fluid: clamp(1rem, 0.8rem + 1vw, 1.5rem); --space-lg-fluid: clamp(1.5rem, 1.2rem + 1.5vw, 2.25rem); --space-xl-fluid: clamp(2rem, 1.6rem + 2vw, 3rem); --space-2xl-fluid: clamp(2.5rem, 2rem + 2.5vw, 3.75rem); /* Fluid border radius */ --radius-sm-fluid: clamp(0.125rem, 0.1rem + 0.125vw, 0.25rem); --radius-md-fluid: clamp(0.375rem, 0.3rem + 0.375vw, 0.5rem); --radius-lg-fluid: clamp(0.5rem, 0.4rem + 0.5vw, 0.75rem); --radius-xl-fluid: clamp(0.75rem, 0.6rem + 0.75vw, 1rem); /* Container max-widths */ --container-xs: 475px; --container-sm: 640px; --container-md: 768px; --container-lg: 1024px; --container-xl: 1280px; --container-2xl: 1536px; /* Grid system */ --grid-cols-1: repeat(1, minmax(0, 1fr)); --grid-cols-2: repeat(2, minmax(0, 1fr)); --grid-cols-3: repeat(3, minmax(0, 1fr)); --grid-cols-4: repeat(4, minmax(0, 1fr)); --grid-cols-6: repeat(6, minmax(0, 1fr)); --grid-cols-12: repeat(12, minmax(0, 1fr)); /* Responsive grid gaps */ --gap-xs: clamp(0.5rem, 0.4rem + 0.5vw, 0.75rem); --gap-sm: clamp(0.75rem, 0.6rem + 0.75vw, 1rem); --gap-md: clamp(1rem, 0.8rem + 1vw, 1.5rem); --gap-lg: clamp(1.5rem, 1.2rem + 1.5vw, 2rem); --gap-xl: clamp(2rem, 1.6rem + 2vw, 2.5rem); } } /* Dark Mode Variables */ [data-theme="dark"] { --dm-primary: #3b82f6; --dm-secondary: #8b5cf6; --dm-success: #22c55e; --dm-error: #f87171; --dm-warning: #fbbf24; --dm-info: #38bdf8; --dm-bg-primary: #111827; --dm-bg-secondary: #1f2937; --dm-text-primary: #f9fafb; --dm-text-secondary: #d1d5db; --dm-gray-50: #1f2937; --dm-gray-100: #374151; --dm-gray-700: #d1d5db; --dm-gray-900: #f9fafb; /* Dark mode gradients */ --gradient-primary: linear-gradient(135deg, #3b82f6 0%, #1d4ed8 100%); --gradient-secondary: linear-gradient(135deg, #8b5cf6 0%, #7c3aed 100%); --gradient-success: linear-gradient(135deg, #22c55e 0%, #16a34a 100%); --gradient-warning: linear-gradient(135deg, #fbbf24 0%, #f59e0b 100%); /* Dark mode borders */ --border-success: #22c55e; --border-warning: #fbbf24; --border-info: #38bdf8; --border-feature: #a78bfa; --border-error: #f87171; /* Dark mode shimmer */ --shimmer-bg: linear-gradient(90deg, transparent 0%, rgba(255, 255, 255, 0.1) 50%, transparent 100%); } /* Shimmer Animation */ @keyframes shimmer { 0% { background-position: -200% 0; } 100% { background-position: 200% 0; } } .shimmer { background: var(--dm-gray-200, #e5e7eb); background-image: var(--shimmer-bg); background-size: 200% 100%; background-repeat: no-repeat; animation: shimmer var(--shimmer-duration) ease-in-out infinite; } [data-theme="dark"] .shimmer { background: var(--dm-gray-700, #374151); } /* Enhanced transition utilities */ .transition-fast { transition: all var(--transition-fast); } .transition-normal { transition: all var(--transition-normal); } .transition-slow { transition: all var(--transition-slow); } .transition-bounce { transition: all var(--transition-bounce); } .transition-smooth { transition: all var(--transition-smooth); } /* Fade transitions */ .fade-enter-active, .fade-leave-active { transition: opacity var(--transition-normal); } .fade-enter-from, .fade-leave-to { opacity: 0; } /* Slide transitions */ .slide-up-enter-active, .slide-up-leave-active { transition: all var(--transition-smooth); } .slide-up-enter-from { opacity: 0; transform: translateY(20px); } .slide-up-leave-to { opacity: 0; transform: translateY(-20px); } .slide-down-enter-active, .slide-down-leave-active { transition: all var(--transition-smooth); } .slide-down-enter-from { opacity: 0; transform: translateY(-20px); } .slide-down-leave-to { opacity: 0; transform: translateY(20px); } /* Scale transitions */ .scale-enter-active, .scale-leave-active { transition: all var(--transition-bounce); } .scale-enter-from, .scale-leave-to { opacity: 0; transform: scale(0.9); } /* Respect user motion preferences */ @media (prefers-reduced-motion: reduce) { .shimmer { animation: none; } .transition-fast, .transition-normal, .transition-slow, .transition-bounce, .transition-smooth { transition: none; } .fade-enter-active, .fade-leave-active, .slide-up-enter-active, .slide-up-leave-active, .slide-down-enter-active, .slide-down-leave-active, .scale-enter-active, .scale-leave-active { transition: none; } } /* Responsive breakpoints */ @media (min-width: 475px) { .xs\:block { display: block; } .xs\:hidden { display: none; } .xs\:text-sm { font-size: var(--dm-text-sm); } .xs\:text-base { font-size: var(--dm-text-base); } } @media (min-width: 640px) { .sm\:block { display: block; } .sm\:hidden { display: none; } .sm\:text-sm { font-size: var(--dm-text-sm); } .sm\:text-base { font-size: var(--dm-text-base); } .sm\:text-lg { font-size: var(--dm-text-lg); } } @media (min-width: 768px) { .md\:block { display: block; } .md\:hidden { display: none; } .md\:text-sm { font-size: var(--dm-text-sm); } .md\:text-base { font-size: var(--dm-text-base); } .md\:text-lg { font-size: var(--dm-text-lg); } .md\:text-xl { font-size: 1.25rem; } } @media (min-width: 1024px) { .lg\:block { display: block; } .lg\:hidden { display: none; } .lg\:text-sm { font-size: var(--dm-text-sm); } .lg\:text-base { font-size: var(--dm-text-base); } .lg\:text-lg { font-size: var(--dm-text-lg); } .lg\:text-xl { font-size: 1.25rem; } .lg\:text-2xl { font-size: 1.5rem; } } @media (min-width: 1280px) { .xl\:block { display: block; } .xl\:hidden { display: none; } .xl\:text-lg { font-size: var(--dm-text-lg); } .xl\:text-xl { font-size: 1.25rem; } .xl\:text-2xl { font-size: 1.5rem; } .xl\:text-3xl { font-size: 1.875rem; } } @media (min-width: 1536px) { .\32xl\:block { display: block; } .\32xl\:hidden { display: none; } .\32xl\:text-xl { font-size: 1.25rem; } .\32xl\:text-2xl { font-size: 1.5rem; } .\32xl\:text-3xl { font-size: 1.875rem; } .\32xl\:text-4xl { font-size: 2.25rem; } } /* Container queries */ .container-query { container-type: inline-size; } @container (min-width: 320px) { .cq-xs\:block { display: block; } .cq-xs\:hidden { display: none; } .cq-xs\:text-sm { font-size: var(--dm-text-sm); } } @container (min-width: 480px) { .cq-sm\:block { display: block; } .cq-sm\:hidden { display: none; } .cq-sm\:text-base { font-size: var(--dm-text-base); } } @container (min-width: 640px) { .cq-md\:block { display: block; } .cq-md\:hidden { display: none; } .cq-md\:text-lg { font-size: var(--dm-text-lg); } } @container (min-width: 768px) { .cq-lg\:block { display: block; } .cq-lg\:hidden { display: none; } .cq-lg\:text-xl { font-size: 1.25rem; } } /* Aspect ratio utilities */ .aspect-square { aspect-ratio: 1 / 1; } .aspect-video { aspect-ratio: 16 / 9; } .aspect-photo { aspect-ratio: 4 / 3; } .aspect-portrait { aspect-ratio: 3 / 4; } .aspect-wide { aspect-ratio: 21 / 9; } .aspect-golden { aspect-ratio: 1.618 / 1; } /* Fallback for browsers without aspect-ratio support */ @supports not (aspect-ratio: 1 / 1) { .aspect-square::before { content: ''; display: block; padding-top: 100%; } .aspect-video::before { content: ''; display: block; padding-top: 56.25%; /* 9/16 * 100% */ } .aspect-photo::before { content: ''; display: block; padding-top: 75%; /* 3/4 * 100% */ } .aspect-portrait::before { content: ''; display: block; padding-top: 133.33%; /* 4/3 * 100% */ } .aspect-wide::before { content: ''; display: block; padding-top: 42.86%; /* 9/21 * 100% */ } .aspect-golden::before { content: ''; display: block; padding-top: 61.8%; /* 1/1.618 * 100% */ } } /* Enhanced responsive utilities */ .container { width: 100%; margin-left: auto; margin-right: auto; padding-left: var(--space-sm-fluid); padding-right: var(--space-sm-fluid); } @media (min-width: 475px) { .container { max-width: var(--container-xs); } } @media (min-width: 640px) { .container { max-width: var(--container-sm); } } @media (min-width: 768px) { .container { max-width: var(--container-md); } } @media (min-width: 1024px) { .container { max-width: var(--container-lg); } } @media (min-width: 1280px) { .container { max-width: var(--container-xl); } } @media (min-width: 1536px) { .container { max-width: var(--container-2xl); } } /* Responsive grid system */ .grid { display: grid; gap: var(--gap-md); } .grid-cols-1 { grid-template-columns: var(--grid-cols-1); } .grid-cols-2 { grid-template-columns: var(--grid-cols-2); } .grid-cols-3 { grid-template-columns: var(--grid-cols-3); } .grid-cols-4 { grid-template-columns: var(--grid-cols-4); } .grid-cols-6 { grid-template-columns: var(--grid-cols-6); } .grid-cols-12 { grid-template-columns: var(--grid-cols-12); } /* Responsive grid columns */ @media (min-width: 640px) { .sm\:grid-cols-1 { grid-template-columns: var(--grid-cols-1); } .sm\:grid-cols-2 { grid-template-columns: var(--grid-cols-2); } .sm\:grid-cols-3 { grid-template-columns: var(--grid-cols-3); } .sm\:grid-cols-4 { grid-template-columns: var(--grid-cols-4); } } @media (min-width: 768px) { .md\:grid-cols-1 { grid-template-columns: var(--grid-cols-1); } .md\:grid-cols-2 { grid-template-columns: var(--grid-cols-2); } .md\:grid-cols-3 { grid-template-columns: var(--grid-cols-3); } .md\:grid-cols-4 { grid-template-columns: var(--grid-cols-4); } .md\:grid-cols-6 { grid-template-columns: var(--grid-cols-6); } } @media (min-width: 1024px) { .lg\:grid-cols-1 { grid-template-columns: var(--grid-cols-1); } .lg\:grid-cols-2 { grid-template-columns: var(--grid-cols-2); } .lg\:grid-cols-3 { grid-template-columns: var(--grid-cols-3); } .lg\:grid-cols-4 { grid-template-columns: var(--grid-cols-4); } .lg\:grid-cols-6 { grid-template-columns: var(--grid-cols-6); } .lg\:grid-cols-12 { grid-template-columns: var(--grid-cols-12); } } /* Fluid spacing utilities */ .space-xs { margin: var(--space-xs-fluid); } .space-sm { margin: var(--space-sm-fluid); } .space-md { margin: var(--space-md-fluid); } .space-lg { margin: var(--space-lg-fluid); } .space-xl { margin: var(--space-xl-fluid); } .space-2xl { margin: var(--space-2xl-fluid); } .p-xs { padding: var(--space-xs-fluid); } .p-sm { padding: var(--space-sm-fluid); } .p-md { padding: var(--space-md-fluid); } .p-lg { padding: var(--space-lg-fluid); } .p-xl { padding: var(--space-xl-fluid); } .p-2xl { padding: var(--space-2xl-fluid); } .gap-xs { gap: var(--gap-xs); } .gap-sm { gap: var(--gap-sm); } .gap-md { gap: var(--gap-md); } .gap-lg { gap: var(--gap-lg); } .gap-xl { gap: var(--gap-xl); } /* Fluid border radius utilities */ .rounded-sm { border-radius: var(--radius-sm-fluid); } .rounded-md { border-radius: var(--radius-md-fluid); } .rounded-lg { border-radius: var(--radius-lg-fluid); } .rounded-xl { border-radius: var(--radius-xl-fluid); } /* Responsive text alignment */ .text-left { text-align: left; } .text-center { text-align: center; } .text-right { text-align: right; } @media (min-width: 640px) { .sm\:text-left { text-align: left; } .sm\:text-center { text-align: center; } .sm\:text-right { text-align: right; } } @media (min-width: 768px) { .md\:text-left { text-align: left; } .md\:text-center { text-align: center; } .md\:text-right { text-align: right; } } @media (min-width: 1024px) { .lg\:text-left { text-align: left; } .lg\:text-center { text-align: center; } .lg\:text-right { text-align: right; } } /* Responsive flexbox utilities */ .flex { display: flex; } .flex-col { flex-direction: column; } .flex-row { flex-direction: row; } .flex-wrap { flex-wrap: wrap; } .flex-nowrap { flex-wrap: nowrap; } .justify-start { justify-content: flex-start; } .justify-center { justify-content: center; } .justify-end { justify-content: flex-end; } .justify-between { justify-content: space-between; } .justify-around { justify-content: space-around; } .justify-evenly { justify-content: space-evenly; } .items-start { align-items: flex-start; } .items-center { align-items: center; } .items-end { align-items: flex-end; } .items-stretch { align-items: stretch; } @media (min-width: 640px) { .sm\:flex { display: flex; } .sm\:flex-col { flex-direction: column; } .sm\:flex-row { flex-direction: row; } .sm\:justify-start { justify-content: flex-start; } .sm\:justify-center { justify-content: center; } .sm\:justify-end { justify-content: flex-end; } .sm\:justify-between { justify-content: space-between; } } @media (min-width: 768px) { .md\:flex { display: flex; } .md\:flex-col { flex-direction: column; } .md\:flex-row { flex-direction: row; } .md\:justify-start { justify-content: flex-start; } .md\:justify-center { justify-content: center; } .md\:justify-end { justify-content: flex-end; } .md\:justify-between { justify-content: space-between; } } @media (min-width: 1024px) { .lg\:flex { display: flex; } .lg\:flex-col { flex-direction: column; } .lg\:flex-row { flex-direction: row; } .lg\:justify-start { justify-content: flex-start; } .lg\:justify-center { justify-content: center; } .lg\:justify-end { justify-content: flex-end; } .lg\:justify-between { justify-content: space-between; } } /* Mobile-first responsive adjustments */ @media (max-width: 640px) { :root { --dm-text-sm: 0.8rem; --dm-text-base: 0.9rem; --dm-space-2: 0.375rem; --dm-space-3: 0.625rem; --dm-space-4: 0.875rem; } .container { padding-left: 1rem; padding-right: 1rem; } } @media (max-width: 475px) { :root { --dm-text-sm: 0.75rem; --dm-text-base: 0.875rem; --dm-space-2: 0.25rem; --dm-space-3: 0.5rem; --dm-space-4: 0.75rem; } .container { padding-left: 0.75rem; padding-right: 0.75rem; } }