1023 lines
27 KiB
CSS
1023 lines
27 KiB
CSS
/* Google Fonts - Cairo (Arabic) and Montserrat (English) */
|
|
@import url('https://fonts.googleapis.com/css2?family=Cairo:wght@300;400;600;700&family=Montserrat:wght@300;400;600;700&display=swap');
|
|
|
|
@import 'tailwindcss';
|
|
@import '../../vendor/livewire/flux/dist/flux.css';
|
|
|
|
@source '../views';
|
|
@source '../../vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php';
|
|
@source '../../vendor/livewire/flux-pro/stubs/**/*.blade.php';
|
|
@source '../../vendor/livewire/flux/stubs/**/*.blade.php';
|
|
|
|
@theme {
|
|
/* Font definitions - to be updated in typography story */
|
|
--font-sans: 'Instrument Sans', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
|
|
--font-arabic: 'Cairo', 'Tajawal', ui-sans-serif, system-ui, sans-serif;
|
|
--font-english: 'Montserrat', 'Lato', ui-sans-serif, system-ui, sans-serif;
|
|
|
|
/* Font Size Scale */
|
|
--font-size-xs: 0.75rem; /* 12px */
|
|
--font-size-sm: 0.875rem; /* 14px - Small text */
|
|
--font-size-base: 1rem; /* 16px - Body text */
|
|
--font-size-lg: 1.125rem; /* 18px */
|
|
--font-size-xl: 1.25rem; /* 20px */
|
|
--font-size-2xl: 1.5rem; /* 24px - H3 */
|
|
--font-size-3xl: 2rem; /* 32px - H2 */
|
|
--font-size-4xl: 2.5rem; /* 40px - H1 */
|
|
|
|
/* ==========================================================================
|
|
LIBRA Brand Palette - Dark Charcoal & Warm Gold (Story 12.2)
|
|
========================================================================== */
|
|
|
|
/* Primary Dark Forest Green Palette */
|
|
--color-primary: #2D3624; /* Dark Forest Green - Header/Footer backgrounds */
|
|
--color-primary-light: #3D4634; /* Lighter Forest Green - Primary hover state */
|
|
|
|
/* CTA Warm Gold */
|
|
--color-cta: #A68966; /* Warm Gold - CTA buttons, links, accents */
|
|
--color-cta-hover: #8A7555; /* Darker Gold - Button hover state */
|
|
--color-cta-light: #C4A882; /* Light Gold - Light CTA accent */
|
|
|
|
/* Active Olive Green */
|
|
--color-active: #4A5D23; /* Olive Green - Active states, language toggle */
|
|
--color-active-hover: #5A7030; /* Olive Hover - Active state hover */
|
|
|
|
/* Neutrals */
|
|
--color-background: #F4F1EA; /* Warm Cream - Main page background */
|
|
--color-text: #2D322A; /* Forest Green - Headings, body text */
|
|
--color-card: #FFFFFF; /* Pure White - Card backgrounds */
|
|
|
|
/* For text on dark backgrounds */
|
|
--color-off-white: #F4F1EA; /* Warm Cream */
|
|
|
|
/* Semantic Aliases - used by components */
|
|
--color-accent: var(--color-cta); /* Maps to Warm Gold */
|
|
--color-accent-content: var(--color-cta); /* Maps to Warm Gold */
|
|
--color-accent-foreground: var(--color-text); /* Forest Green - text on accent backgrounds */
|
|
--color-body: var(--color-text); /* Maps to Forest Green for body text */
|
|
|
|
/* Backward Compatibility Aliases (legacy class names) */
|
|
--color-navy: var(--color-primary); /* Maps to Dark Charcoal */
|
|
--color-gold: var(--color-cta); /* Maps to Warm Gold */
|
|
--color-gold-light: var(--color-cta-light); /* Maps to Light Gold */
|
|
--color-cream: var(--color-background); /* Maps to Warm Cream */
|
|
--color-charcoal: var(--color-primary); /* Maps to Dark Charcoal */
|
|
--color-warm-gray: var(--color-cta); /* Maps to Warm Gold */
|
|
|
|
/* Status Colors - unchanged per AC6 */
|
|
--color-success: #27AE60;
|
|
--color-danger: #E74C3C;
|
|
--color-warning: #F39C12;
|
|
}
|
|
|
|
@layer base {
|
|
|
|
*,
|
|
::after,
|
|
::before,
|
|
::backdrop,
|
|
::file-selector-button {
|
|
border-color: var(--color-gray-200, currentColor);
|
|
}
|
|
}
|
|
|
|
/* ==========================================================================
|
|
Flux UI Light Mode Overrides
|
|
Ensure proper text visibility after dark mode removal
|
|
========================================================================== */
|
|
|
|
/* Flux Headings - ensure dark text */
|
|
[data-flux-heading] {
|
|
color: rgb(24 24 27) !important;
|
|
}
|
|
|
|
/* Flux Text/Subheading - ensure readable gray */
|
|
[data-flux-text],
|
|
[data-flux-subheading] {
|
|
color: rgb(113 113 122) !important;
|
|
}
|
|
|
|
/* Navlist group headings */
|
|
[data-flux-navlist-group] > div:first-child {
|
|
color: rgb(113 113 122) !important;
|
|
}
|
|
|
|
/* Navlist items */
|
|
[data-flux-navlist-item] {
|
|
color: rgb(63 63 70) !important;
|
|
}
|
|
|
|
[data-flux-navlist-item]:hover {
|
|
color: rgb(24 24 27) !important;
|
|
background-color: rgb(244 244 245) !important;
|
|
}
|
|
|
|
[data-flux-navlist-item][data-current="true"],
|
|
[data-flux-navlist-item][aria-current="page"] {
|
|
color: rgb(24 24 27) !important;
|
|
background-color: rgb(244 244 245) !important;
|
|
}
|
|
|
|
/* Flux Menu items */
|
|
[data-flux-menu-item] {
|
|
color: rgb(63 63 70) !important;
|
|
}
|
|
|
|
[data-flux-menu-item]:hover {
|
|
color: rgb(24 24 27) !important;
|
|
background-color: rgb(244 244 245) !important;
|
|
}
|
|
|
|
/* Flux Modal content */
|
|
[data-flux-modal] {
|
|
background-color: rgb(255 255 255) !important;
|
|
color: rgb(24 24 27) !important;
|
|
}
|
|
|
|
/* Flux Dropdown/Select */
|
|
[data-flux-menu],
|
|
[data-flux-listbox] {
|
|
background-color: rgb(255 255 255) !important;
|
|
border-color: rgb(228 228 231) !important;
|
|
}
|
|
|
|
/* Flux Profile text */
|
|
[data-flux-profile] span {
|
|
color: rgb(63 63 70) !important;
|
|
}
|
|
|
|
/* Flux Badge - ensure text is visible */
|
|
[data-flux-badge] {
|
|
color: rgb(255 255 255) !important;
|
|
}
|
|
|
|
/* Flux Badge variants with proper contrast */
|
|
[data-flux-badge][data-variant="outline"] {
|
|
color: rgb(63 63 70) !important;
|
|
}
|
|
|
|
/* Flux Callout text */
|
|
[data-flux-callout],
|
|
[data-flux-callout] * {
|
|
color: rgb(63 63 70) !important;
|
|
}
|
|
|
|
[data-flux-callout-heading] {
|
|
color: rgb(24 24 27) !important;
|
|
}
|
|
|
|
/* Flux Table cells */
|
|
[data-flux-table] td,
|
|
[data-flux-table] th {
|
|
color: rgb(63 63 70) !important;
|
|
}
|
|
|
|
[data-flux-table] th {
|
|
color: rgb(24 24 27) !important;
|
|
}
|
|
|
|
/* Flux Card content */
|
|
[data-flux-card] {
|
|
background-color: rgb(255 255 255) !important;
|
|
color: rgb(63 63 70) !important;
|
|
}
|
|
|
|
/* Flux Separator */
|
|
[data-flux-separator] {
|
|
background-color: rgb(228 228 231) !important;
|
|
}
|
|
|
|
/* ==========================================================================
|
|
Logo Badge Styling (Story 12.2)
|
|
Creates "seal/stamp" effect for logo on Dark Charcoal backgrounds
|
|
========================================================================== */
|
|
|
|
.logo-badge {
|
|
border: 2px solid var(--color-text);
|
|
box-shadow: 4px 4px 6px rgba(45, 54, 36, 0.5);
|
|
}
|
|
|
|
/* ==========================================================================
|
|
Flux UI Form Component Styling (Story 9.5)
|
|
========================================================================== */
|
|
|
|
/* Field wrapper - grid layout with gap */
|
|
[data-flux-field]:not(ui-radio, ui-checkbox) {
|
|
@apply grid gap-2;
|
|
}
|
|
|
|
/* Label styling - semibold weight per specs */
|
|
[data-flux-label] {
|
|
@apply !mb-0 !leading-tight font-semibold text-body;
|
|
}
|
|
|
|
/* Input, Textarea, Select base styling */
|
|
input[data-flux-control],
|
|
textarea[data-flux-control],
|
|
[data-flux-control] input,
|
|
select[data-flux-control],
|
|
[data-flux-select-button] {
|
|
@apply border-body/30 rounded-md transition-colors text-body;
|
|
}
|
|
|
|
/* Focus states - Warm Gold border with subtle ring (AC4) */
|
|
input:focus[data-flux-control],
|
|
textarea:focus[data-flux-control],
|
|
select:focus[data-flux-control],
|
|
[data-flux-control] input:focus,
|
|
[data-flux-select-button]:focus {
|
|
@apply outline-hidden border-cta ring-2 ring-cta/20;
|
|
}
|
|
|
|
/* Textarea minimum height */
|
|
textarea[data-flux-control] {
|
|
@apply min-h-[120px] resize-y;
|
|
}
|
|
|
|
/* Checkbox styling - Warm Gold accent when checked (AC4) */
|
|
[data-flux-checkbox] input[type="checkbox"],
|
|
input[type="checkbox"][data-flux-control] {
|
|
@apply w-5 h-5 rounded border-body/30 text-cta focus:ring-cta focus:ring-offset-0;
|
|
}
|
|
|
|
/* Radio styling - Warm Gold accent when selected (AC4) */
|
|
[data-flux-radio] input[type="radio"],
|
|
input[type="radio"][data-flux-control] {
|
|
@apply w-5 h-5 border-body/30 text-cta focus:ring-cta focus:ring-offset-0;
|
|
}
|
|
|
|
/* Error state styling for Flux fields */
|
|
[data-flux-field]:has([data-flux-error]) input[data-flux-control],
|
|
[data-flux-field]:has([data-flux-error]) textarea[data-flux-control],
|
|
[data-flux-field]:has([data-flux-error]) select[data-flux-control],
|
|
[data-flux-field]:has([data-flux-error]) [data-flux-select-button] {
|
|
@apply border-danger;
|
|
}
|
|
|
|
[data-flux-field]:has([data-flux-error]) input:focus[data-flux-control],
|
|
[data-flux-field]:has([data-flux-error]) textarea:focus[data-flux-control],
|
|
[data-flux-field]:has([data-flux-error]) select:focus[data-flux-control],
|
|
[data-flux-field]:has([data-flux-error]) [data-flux-select-button]:focus {
|
|
@apply border-danger ring-danger/20;
|
|
}
|
|
|
|
/* Error message styling */
|
|
[data-flux-error] {
|
|
@apply text-sm text-danger mt-1;
|
|
}
|
|
|
|
/* RTL support for Flux components */
|
|
[dir="rtl"] [data-flux-label] {
|
|
@apply text-right;
|
|
}
|
|
|
|
[dir="rtl"] [data-flux-error] {
|
|
@apply text-right;
|
|
}
|
|
|
|
[dir="rtl"] input[data-flux-control],
|
|
[dir="rtl"] textarea[data-flux-control],
|
|
[dir="rtl"] select[data-flux-control] {
|
|
@apply text-right;
|
|
}
|
|
|
|
/* \[:where(&)\]:size-4 {
|
|
@apply size-4;
|
|
} */
|
|
|
|
/* Prose Brand styling for blog posts - Dark Charcoal & Warm Gold (AC5, AC8) */
|
|
.prose-brand {
|
|
--tw-prose-headings: var(--color-text); /* Forest Green */
|
|
--tw-prose-links: var(--color-cta); /* Warm Gold */
|
|
--tw-prose-bold: var(--color-text); /* Forest Green */
|
|
--tw-prose-body: var(--color-text); /* Forest Green */
|
|
}
|
|
|
|
.prose-brand a {
|
|
color: var(--color-cta); /* Warm Gold (AC5) */
|
|
text-decoration: underline;
|
|
}
|
|
|
|
.prose-brand a:hover {
|
|
color: var(--color-cta-hover); /* Darker Gold (AC5) */
|
|
}
|
|
|
|
/* Backward compatibility alias for prose-navy */
|
|
.prose-navy {
|
|
--tw-prose-headings: var(--color-text);
|
|
--tw-prose-links: var(--color-cta);
|
|
--tw-prose-bold: var(--color-text);
|
|
--tw-prose-body: var(--color-text);
|
|
}
|
|
|
|
.prose-navy a {
|
|
color: var(--color-cta);
|
|
text-decoration: underline;
|
|
}
|
|
|
|
.prose-navy a:hover {
|
|
color: var(--color-cta-hover);
|
|
}
|
|
|
|
/* Dynamic Font Selection based on language */
|
|
html[lang="ar"] body {
|
|
font-family: var(--font-arabic);
|
|
}
|
|
|
|
html[lang="en"] body {
|
|
font-family: var(--font-english);
|
|
}
|
|
|
|
/* Typography Base Styles */
|
|
body {
|
|
font-size: var(--font-size-base);
|
|
line-height: 1.6;
|
|
}
|
|
|
|
h1, h2, h3, h4, h5, h6 {
|
|
line-height: 1.3;
|
|
}
|
|
|
|
h1 {
|
|
font-size: var(--font-size-4xl);
|
|
font-weight: 700;
|
|
}
|
|
|
|
h2 {
|
|
font-size: var(--font-size-3xl);
|
|
font-weight: 600;
|
|
}
|
|
|
|
h3 {
|
|
font-size: var(--font-size-2xl);
|
|
font-weight: 600;
|
|
}
|
|
|
|
small, .text-sm {
|
|
font-size: var(--font-size-sm);
|
|
}
|
|
|
|
/* ==========================================================================
|
|
Button Styling System (Story 9.4)
|
|
========================================================================== */
|
|
|
|
/* Primary button - Warm Gold background with White text (AC3) */
|
|
.btn-primary {
|
|
@apply bg-cta text-white rounded-md px-6 py-3 font-semibold transition-colors;
|
|
@apply hover:bg-cta-hover;
|
|
@apply focus:outline-none focus:ring-2 focus:ring-cta focus:ring-offset-2;
|
|
}
|
|
|
|
/* Secondary button - Dark Charcoal border, Dark text (AC3) */
|
|
.btn-secondary {
|
|
@apply bg-transparent border-2 border-primary text-text rounded-md px-6 py-3 font-semibold transition-colors;
|
|
@apply hover:bg-primary hover:text-off-white;
|
|
@apply focus:outline-none focus:ring-2 focus:ring-cta focus:ring-offset-2;
|
|
}
|
|
|
|
/* Danger button - Red background */
|
|
.btn-danger {
|
|
@apply bg-danger text-white rounded-md px-6 py-3 font-semibold transition-colors;
|
|
@apply hover:bg-danger/90;
|
|
@apply focus:outline-none focus:ring-2 focus:ring-danger focus:ring-offset-2;
|
|
}
|
|
|
|
/* Disabled state - applies to all button variants */
|
|
.btn-disabled,
|
|
.btn-primary:disabled,
|
|
.btn-secondary:disabled,
|
|
.btn-danger:disabled,
|
|
button.btn-primary:disabled,
|
|
button.btn-secondary:disabled,
|
|
button.btn-danger:disabled {
|
|
@apply !bg-[#CCCCCC] !text-[#666666] !cursor-not-allowed !border-transparent;
|
|
@apply hover:!bg-[#CCCCCC];
|
|
}
|
|
|
|
/* Size variants */
|
|
.btn-sm {
|
|
@apply px-4 py-2 text-sm;
|
|
}
|
|
|
|
.btn-lg {
|
|
@apply px-8 py-4 text-lg;
|
|
}
|
|
|
|
/* Full width for mobile */
|
|
.btn-full {
|
|
@apply w-full;
|
|
}
|
|
|
|
/* Loading state */
|
|
.btn-loading {
|
|
@apply relative pointer-events-none opacity-75;
|
|
}
|
|
|
|
/* Icon spacing within buttons */
|
|
.btn-icon-left {
|
|
@apply flex items-center gap-2;
|
|
}
|
|
|
|
.btn-icon-right {
|
|
@apply flex items-center gap-2 flex-row-reverse;
|
|
}
|
|
|
|
/* Button groups - adjust border-radius for grouped buttons */
|
|
.btn-group {
|
|
@apply flex;
|
|
}
|
|
|
|
.btn-group > .btn-primary:not(:first-child):not(:last-child),
|
|
.btn-group > .btn-secondary:not(:first-child):not(:last-child),
|
|
.btn-group > .btn-danger:not(:first-child):not(:last-child) {
|
|
@apply rounded-none;
|
|
}
|
|
|
|
.btn-group > .btn-primary:first-child,
|
|
.btn-group > .btn-secondary:first-child,
|
|
.btn-group > .btn-danger:first-child {
|
|
@apply rounded-e-none;
|
|
}
|
|
|
|
.btn-group > .btn-primary:last-child,
|
|
.btn-group > .btn-secondary:last-child,
|
|
.btn-group > .btn-danger:last-child {
|
|
@apply rounded-s-none;
|
|
}
|
|
|
|
/* RTL support for icon buttons */
|
|
[dir="rtl"] .btn-icon-left {
|
|
@apply flex-row-reverse;
|
|
}
|
|
|
|
[dir="rtl"] .btn-icon-right {
|
|
@apply flex-row;
|
|
}
|
|
|
|
/* ==========================================================================
|
|
Form Styling System (Story 9.5)
|
|
========================================================================== */
|
|
|
|
/* Input field styling - Warm Gold focus (AC4) */
|
|
.input-field {
|
|
@apply w-full border border-body/30 rounded-md px-4 py-3
|
|
focus:border-cta focus:ring-2 focus:ring-cta/20
|
|
transition-colors outline-none bg-white;
|
|
}
|
|
|
|
/* Input error state */
|
|
.input-error {
|
|
@apply border-danger focus:border-danger focus:ring-danger/20;
|
|
}
|
|
|
|
/* Form label styling */
|
|
.form-label {
|
|
@apply block text-sm font-semibold text-body mb-2;
|
|
}
|
|
|
|
/* Required field indicator - for manual class usage */
|
|
.form-label-required::after {
|
|
content: ' *';
|
|
@apply text-danger;
|
|
}
|
|
|
|
/* Required indicator styling for Flux labels with .required class */
|
|
[data-flux-label].required::after {
|
|
content: ' *';
|
|
@apply text-danger;
|
|
}
|
|
|
|
/* Error message styling */
|
|
.error-message {
|
|
@apply text-sm text-danger mt-1;
|
|
}
|
|
|
|
/* Textarea specific styling - Warm Gold focus (AC4) */
|
|
.textarea-field {
|
|
@apply w-full border border-body/30 rounded-md px-4 py-3
|
|
focus:border-cta focus:ring-2 focus:ring-cta/20
|
|
transition-colors outline-none bg-white
|
|
min-h-[120px] resize-y;
|
|
}
|
|
|
|
/* Select dropdown styling - Warm Gold focus (AC4) */
|
|
.select-field {
|
|
@apply w-full border border-body/30 rounded-md px-4 py-3
|
|
focus:border-cta focus:ring-2 focus:ring-cta/20
|
|
transition-colors outline-none bg-white;
|
|
}
|
|
|
|
/* Custom checkbox styling - Warm Gold (AC4) */
|
|
.checkbox-custom {
|
|
@apply w-5 h-5 rounded border-body/30 text-cta
|
|
focus:ring-cta focus:ring-offset-0;
|
|
}
|
|
|
|
/* Custom radio styling - Warm Gold (AC4) */
|
|
.radio-custom {
|
|
@apply w-5 h-5 border-body/30 text-cta
|
|
focus:ring-cta focus:ring-offset-0;
|
|
}
|
|
|
|
/* Checkbox/Radio with error state */
|
|
.checkbox-error,
|
|
.radio-error {
|
|
@apply border-danger;
|
|
}
|
|
|
|
/* RTL support for form labels */
|
|
[dir="rtl"] .form-label {
|
|
@apply text-right;
|
|
}
|
|
|
|
/* RTL support for error messages */
|
|
[dir="rtl"] .error-message {
|
|
@apply text-right;
|
|
}
|
|
|
|
/* RTL support for form fields - use logical properties */
|
|
[dir="rtl"] .input-field,
|
|
[dir="rtl"] .textarea-field,
|
|
[dir="rtl"] .select-field {
|
|
@apply text-right;
|
|
}
|
|
|
|
/* ==========================================================================
|
|
Card & Container Styling System (Story 9.6)
|
|
========================================================================== */
|
|
|
|
/* Container max-width - 1200px centered */
|
|
.container-max {
|
|
@apply max-w-[1200px] mx-auto px-4 sm:px-6 lg:px-8;
|
|
}
|
|
|
|
/* Card shadow values */
|
|
.shadow-card {
|
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
|
}
|
|
|
|
.shadow-card-hover {
|
|
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
|
|
}
|
|
|
|
/* ==========================================================================
|
|
RTL/LTR Layout Utilities (Story 9.8)
|
|
========================================================================== */
|
|
|
|
/* RTL-aware icon flipping - use on directional icons like chevrons, arrows */
|
|
[dir="rtl"] .flip-rtl {
|
|
transform: scaleX(-1);
|
|
}
|
|
|
|
/* Force LTR for numbers, emails, code, and other content that should stay LTR */
|
|
.ltr-content {
|
|
direction: ltr;
|
|
unicode-bidi: embed;
|
|
text-align: inherit;
|
|
}
|
|
|
|
/* Inline LTR content within RTL text flow */
|
|
.ltr-inline {
|
|
direction: ltr;
|
|
unicode-bidi: isolate;
|
|
}
|
|
|
|
/* ==========================================================================
|
|
Responsive Design System (Story 9.9)
|
|
Breakpoints per PRD Section 7.4:
|
|
- Mobile: < 576px (single column, stacked layouts)
|
|
- Tablet: 576px - 991px (two columns where appropriate)
|
|
- Desktop: 992px - 1199px (full layouts with sidebars)
|
|
- Large Desktop: >= 1200px (max-width container: 1200px)
|
|
========================================================================== */
|
|
|
|
/* Prevent horizontal page scroll at any viewport */
|
|
html, body {
|
|
@apply overflow-x-hidden;
|
|
}
|
|
|
|
/* Ensure images/media don't overflow */
|
|
img, video, iframe {
|
|
@apply max-w-full h-auto;
|
|
}
|
|
|
|
/* Touch-friendly targets - minimum 44px for interactive elements */
|
|
.touch-target {
|
|
@apply min-h-[44px] min-w-[44px];
|
|
}
|
|
|
|
/* Dashboard grid - responsive column layout */
|
|
.dashboard-grid {
|
|
@apply grid gap-4;
|
|
@apply grid-cols-1; /* Mobile: single column */
|
|
@apply sm:grid-cols-2; /* Tablet: 2 columns */
|
|
@apply lg:grid-cols-3; /* Desktop: 3 columns */
|
|
@apply xl:grid-cols-4; /* Large: 4 columns */
|
|
}
|
|
|
|
/* Stats grid - responsive layout for stat cards */
|
|
.stats-grid {
|
|
@apply grid gap-4;
|
|
@apply grid-cols-1; /* Mobile: single column */
|
|
@apply sm:grid-cols-2; /* Tablet: 2 columns */
|
|
@apply lg:grid-cols-4; /* Desktop: 4 columns */
|
|
}
|
|
|
|
/* Widget grid - responsive layout for dashboard widgets */
|
|
.widget-grid {
|
|
@apply grid gap-6;
|
|
@apply grid-cols-1; /* Mobile: single column */
|
|
@apply lg:grid-cols-3; /* Desktop: 3 columns */
|
|
}
|
|
|
|
/* Responsive table wrapper - horizontal scroll for tables on mobile */
|
|
.table-responsive {
|
|
@apply overflow-x-auto -mx-4 px-4;
|
|
@apply sm:mx-0 sm:px-0; /* Remove negative margin on larger screens */
|
|
}
|
|
|
|
/* Table wrapper with shadow indicator for scrollable content */
|
|
.table-scroll-wrapper {
|
|
@apply relative overflow-x-auto;
|
|
-webkit-overflow-scrolling: touch;
|
|
}
|
|
|
|
/* Form layout - responsive form field arrangement */
|
|
.form-row {
|
|
@apply flex flex-col gap-4;
|
|
@apply sm:flex-row sm:items-end;
|
|
}
|
|
|
|
/* Form actions - responsive button placement */
|
|
.form-actions {
|
|
@apply flex flex-col gap-3;
|
|
@apply sm:flex-row sm:justify-end;
|
|
}
|
|
|
|
/* Mobile-first button - full width on mobile, auto on larger screens */
|
|
.btn-responsive {
|
|
@apply w-full sm:w-auto;
|
|
}
|
|
|
|
/* Card full-width on mobile */
|
|
.card-responsive {
|
|
@apply w-full;
|
|
}
|
|
|
|
/* Collapsible content - for accordion sections on mobile */
|
|
.collapsible-content {
|
|
@apply transition-all duration-200 ease-in-out overflow-hidden;
|
|
}
|
|
|
|
/* Modal responsive - full screen on mobile, centered on desktop */
|
|
.modal-responsive {
|
|
@apply fixed inset-0 sm:inset-auto sm:relative;
|
|
@apply w-full sm:max-w-lg sm:mx-auto;
|
|
@apply h-full sm:h-auto sm:max-h-[90vh];
|
|
@apply rounded-none sm:rounded-lg;
|
|
}
|
|
|
|
/* Charts container - responsive height */
|
|
.chart-container {
|
|
@apply h-64 sm:h-72 lg:h-80;
|
|
@apply w-full;
|
|
}
|
|
|
|
/* Header actions - stack on mobile, inline on larger screens */
|
|
.header-actions {
|
|
@apply flex flex-col gap-3 w-full;
|
|
@apply sm:flex-row sm:w-auto sm:items-center;
|
|
}
|
|
|
|
/* Page header - responsive layout */
|
|
.page-header {
|
|
@apply flex flex-col gap-4;
|
|
@apply sm:flex-row sm:items-center sm:justify-between;
|
|
}
|
|
|
|
/* Filter bar - responsive layout */
|
|
.filter-bar {
|
|
@apply flex flex-col gap-4;
|
|
@apply sm:flex-row sm:items-end sm:flex-wrap;
|
|
}
|
|
|
|
/* Content section - responsive padding */
|
|
.section-responsive {
|
|
@apply px-4 py-6;
|
|
@apply sm:px-6 sm:py-8;
|
|
@apply lg:px-8;
|
|
}
|
|
|
|
/* RTL-aware responsive sidebar */
|
|
@media (max-width: 991px) {
|
|
.sidebar-responsive {
|
|
@apply fixed inset-y-0 start-0 w-64;
|
|
@apply transform -translate-x-full transition-transform duration-200;
|
|
@apply z-40;
|
|
}
|
|
.sidebar-responsive.open {
|
|
@apply translate-x-0;
|
|
}
|
|
/* RTL: sidebar comes from right */
|
|
[dir="rtl"] .sidebar-responsive {
|
|
@apply end-0 start-auto translate-x-full;
|
|
}
|
|
[dir="rtl"] .sidebar-responsive.open {
|
|
@apply translate-x-0;
|
|
}
|
|
}
|
|
|
|
/* Sidebar overlay for mobile */
|
|
.sidebar-overlay {
|
|
@apply fixed inset-0 bg-black/50 z-30;
|
|
@apply transition-opacity duration-200;
|
|
}
|
|
|
|
/* Sticky sidebar for desktop */
|
|
@media (min-width: 1024px) {
|
|
body:has(> [data-flux-sidebar]) {
|
|
display: flex;
|
|
align-items: flex-start;
|
|
}
|
|
|
|
[data-flux-sidebar] {
|
|
position: sticky !important;
|
|
top: 0 !important;
|
|
height: 100vh !important;
|
|
flex-shrink: 0;
|
|
}
|
|
}
|
|
|
|
/* Calendar responsive - smaller cells on mobile */
|
|
.calendar-grid {
|
|
@apply grid grid-cols-7 gap-1;
|
|
}
|
|
|
|
.calendar-cell {
|
|
@apply h-10 sm:h-12;
|
|
@apply text-sm sm:text-base;
|
|
}
|
|
|
|
/* Time slot grid - responsive columns */
|
|
.time-slots-grid {
|
|
@apply grid gap-2;
|
|
@apply grid-cols-2 sm:grid-cols-3 md:grid-cols-4;
|
|
}
|
|
|
|
/* Time slot button - touch-friendly */
|
|
.time-slot-btn {
|
|
@apply p-3 min-h-[44px];
|
|
@apply text-sm sm:text-base;
|
|
}
|
|
|
|
/* Post/blog grid - responsive layout */
|
|
.posts-grid {
|
|
@apply grid gap-6;
|
|
@apply grid-cols-1;
|
|
@apply sm:grid-cols-2;
|
|
@apply lg:grid-cols-3;
|
|
}
|
|
|
|
/* Timeline/case view - responsive layout */
|
|
.timeline-container {
|
|
@apply relative;
|
|
}
|
|
|
|
.timeline-line {
|
|
@apply absolute top-0 bottom-0 w-0.5 bg-zinc-200;
|
|
@apply start-4 sm:start-6;
|
|
}
|
|
|
|
.timeline-item {
|
|
@apply relative ps-10 sm:ps-14;
|
|
@apply pb-6;
|
|
}
|
|
|
|
.timeline-dot {
|
|
@apply absolute start-2 sm:start-4;
|
|
@apply w-4 h-4 sm:w-5 sm:h-5;
|
|
@apply rounded-full bg-accent;
|
|
@apply transform -translate-x-1/2;
|
|
}
|
|
|
|
/* Empty state - responsive sizing */
|
|
.empty-state {
|
|
@apply py-8 sm:py-12;
|
|
@apply text-center;
|
|
}
|
|
|
|
.empty-state-icon {
|
|
@apply w-12 h-12 sm:w-16 sm:h-16;
|
|
@apply mx-auto mb-4;
|
|
}
|
|
|
|
/* Pagination responsive */
|
|
.pagination-responsive {
|
|
@apply flex flex-wrap justify-center gap-1;
|
|
@apply sm:gap-2;
|
|
}
|
|
|
|
/* Hide on mobile / show on desktop utilities */
|
|
.hide-mobile {
|
|
@apply hidden sm:block;
|
|
}
|
|
|
|
.show-mobile {
|
|
@apply block sm:hidden;
|
|
}
|
|
|
|
/* Stack on mobile, inline on desktop */
|
|
.stack-mobile {
|
|
@apply flex flex-col;
|
|
@apply sm:flex-row sm:items-center;
|
|
}
|
|
|
|
/* Gap utilities for responsive spacing */
|
|
.gap-responsive {
|
|
@apply gap-3 sm:gap-4 lg:gap-6;
|
|
}
|
|
|
|
/* Text size responsive */
|
|
.text-responsive-sm {
|
|
@apply text-xs sm:text-sm;
|
|
}
|
|
|
|
.text-responsive-base {
|
|
@apply text-sm sm:text-base;
|
|
}
|
|
|
|
.text-responsive-lg {
|
|
@apply text-base sm:text-lg lg:text-xl;
|
|
}
|
|
|
|
.text-responsive-xl {
|
|
@apply text-lg sm:text-xl lg:text-2xl;
|
|
}
|
|
|
|
/* Heading responsive sizes */
|
|
.heading-responsive-page {
|
|
@apply text-xl sm:text-2xl lg:text-3xl;
|
|
@apply font-bold;
|
|
}
|
|
|
|
.heading-responsive-section {
|
|
@apply text-lg sm:text-xl;
|
|
@apply font-semibold;
|
|
}
|
|
|
|
/* ==========================================================================
|
|
Animations & Micro-interactions (Story 9.11)
|
|
Subtle, professional animations under 300ms
|
|
========================================================================== */
|
|
|
|
/* Base transitions */
|
|
.transition-default {
|
|
@apply transition-all duration-150 ease-in-out;
|
|
}
|
|
|
|
.transition-slow {
|
|
@apply transition-all duration-200 ease-in-out;
|
|
}
|
|
|
|
/* Button hover transition - 150ms ease */
|
|
.btn {
|
|
@apply transition-colors duration-150;
|
|
}
|
|
|
|
/* Card lift effect - 200ms ease */
|
|
.card-hover {
|
|
@apply transition-all duration-200;
|
|
}
|
|
|
|
.card-hover:hover {
|
|
@apply -translate-y-0.5;
|
|
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
|
|
}
|
|
|
|
/* Link color transition */
|
|
.link-transition {
|
|
@apply transition-colors duration-150;
|
|
}
|
|
|
|
/* Skeleton loader - pulse animation */
|
|
.skeleton {
|
|
@apply animate-pulse bg-accent/30 rounded;
|
|
}
|
|
|
|
/* Toast animation classes */
|
|
.toast-enter {
|
|
@apply transform translate-x-full opacity-0;
|
|
}
|
|
|
|
.toast-enter-active {
|
|
@apply transform translate-x-0 opacity-100 transition-all duration-200;
|
|
}
|
|
|
|
/* RTL toast animation - slides from left */
|
|
[dir="rtl"] .toast-enter {
|
|
@apply -translate-x-full;
|
|
}
|
|
|
|
[dir="rtl"] .toast-enter-active {
|
|
@apply translate-x-0;
|
|
}
|
|
|
|
/* Success checkmark animation */
|
|
@keyframes checkmark {
|
|
0% { stroke-dashoffset: 100; }
|
|
100% { stroke-dashoffset: 0; }
|
|
}
|
|
|
|
.checkmark-animated path {
|
|
stroke-dasharray: 100;
|
|
animation: checkmark 0.3s ease-in-out forwards;
|
|
}
|
|
|
|
/* Error shake animation */
|
|
@keyframes shake {
|
|
0%, 100% { transform: translateX(0); }
|
|
25% { transform: translateX(-5px); }
|
|
75% { transform: translateX(5px); }
|
|
}
|
|
|
|
.shake {
|
|
animation: shake 0.3s ease-in-out;
|
|
}
|
|
|
|
/* Modal animation classes */
|
|
.modal-enter {
|
|
@apply opacity-0 scale-95;
|
|
}
|
|
|
|
.modal-enter-active {
|
|
@apply opacity-100 scale-100 transition-all duration-200;
|
|
}
|
|
|
|
.modal-backdrop-enter {
|
|
@apply opacity-0;
|
|
}
|
|
|
|
.modal-backdrop-enter-active {
|
|
@apply opacity-100 transition-opacity duration-200;
|
|
}
|
|
|
|
/* Progress bar animation */
|
|
.progress-bar {
|
|
@apply transition-all duration-200 ease-out;
|
|
}
|
|
|
|
/* ==========================================================================
|
|
Auth Background Pattern (Story 13.3)
|
|
Subtle geometric dot pattern for auth form panels
|
|
========================================================================== */
|
|
|
|
/* Pattern overlay using pseudo-element - fixed positioning doesn't scroll */
|
|
.auth-pattern {
|
|
position: relative;
|
|
}
|
|
|
|
.auth-pattern::before {
|
|
content: '';
|
|
position: absolute;
|
|
inset: 0;
|
|
background-image: url('/images/auth-pattern.svg');
|
|
background-repeat: repeat;
|
|
pointer-events: none;
|
|
z-index: 0;
|
|
}
|
|
|
|
/* Ensure content stays above pattern */
|
|
.auth-pattern > * {
|
|
position: relative;
|
|
z-index: 1;
|
|
}
|
|
|
|
/* ==========================================================================
|
|
Accessibility Styles (Story 9.10)
|
|
WCAG 2.1 AA Compliance
|
|
========================================================================== */
|
|
|
|
/* Focus styles - visible Warm Gold outline for keyboard navigation (AC4) */
|
|
:focus-visible {
|
|
@apply outline-2 outline-offset-2 outline-cta;
|
|
}
|
|
|
|
/* Skip link - hidden until focused, Dark Charcoal bg with Warm Cream text */
|
|
.skip-link {
|
|
@apply sr-only focus:not-sr-only focus:absolute focus:top-4 focus:start-4
|
|
focus:bg-primary focus:text-off-white focus:px-4 focus:py-2 focus:rounded-md
|
|
focus:font-semibold focus:z-[100];
|
|
}
|
|
|
|
/* Reduced motion - respect user preference for reduced animations */
|
|
@media (prefers-reduced-motion: reduce) {
|
|
*,
|
|
*::before,
|
|
*::after {
|
|
animation-duration: 0.01ms !important;
|
|
animation-iteration-count: 1 !important;
|
|
transition-duration: 0.01ms !important;
|
|
scroll-behavior: auto !important;
|
|
}
|
|
}
|