diff --git a/app/assets/stylesheets/theme.css b/app/assets/stylesheets/theme.css index 119ec50..e99a83f 100755 --- a/app/assets/stylesheets/theme.css +++ b/app/assets/stylesheets/theme.css @@ -1,10 +1,473 @@ -/* Additional styles for enhanced Aperonight design */ +:root { + /* Colors */ + --color-primary-50: #f5f3ff; + --color-primary-100: #ede9fe; + --color-primary-200: #ddd6fe; + --color-primary-300: #c4b5fd; + --color-primary-400: #a78bfa; + --color-primary-500: #667eea; + --color-primary-600: #667eea; + --color-primary-700: #5a6fd8; + --color-primary-800: #4e63c6; + --color-primary-900: #4257b4; + + --color-accent-50: #fffbeb; + --color-accent-100: #fef3c7; + --color-accent-200: #fde68a; + --color-accent-300: #fcd34d; + --color-accent-400: #facc15; + --color-accent-500: #facc15; + --color-accent-600: #e6c213; + --color-accent-700: #d1b811; + --color-accent-800: #bdae0f; + --color-accent-900: #a8a40d; + + --color-secondary-50: #f0e9f9; + --color-secondary-100: #e2d4f3; + --color-secondary-200: #c5a9e7; + --color-secondary-300: #a87edc; + --color-secondary-400: #8b53d0; + --color-secondary-500: #764ba2; + --color-secondary-600: #764ba2; + --color-secondary-700: #68428f; + --color-secondary-800: #5a397c; + --color-secondary-900: #4c3069; + + --color-neutral-50: #fafafa; + --color-neutral-100: #f5f5f5; + --color-neutral-200: #e5e5e5; + --color-neutral-300: #d4d4d4; + --color-neutral-400: #a3a3a3; + --color-neutral-500: #737373; + --color-neutral-600: #525252; + --color-neutral-700: #404040; + --color-neutral-800: #262626; + --color-neutral-900: #171717; + + --color-success: #10b981; + --color-success-light: #d1fae5; + --color-success-dark: #047857; + + --color-warning: #f59e0b; + --color-warning-light: #fef3c7; + --color-warning-dark: #b45309; + + --color-danger: #ef4444; + --color-danger-light: #fee2e2; + --color-danger-dark: #b91c1c; + + /* Typography */ + --font-sans: 'Plus Jakarta Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; + --font-display: 'Outfit', var(--font-sans); + + --text-xs: 0.75rem; /* 12px */ + --text-sm: 0.875rem; /* 14px */ + --text-base: 1rem; /* 16px */ + --text-lg: 1.125rem; /* 18px */ + --text-xl: 1.25rem; /* 20px */ + --text-2xl: 1.5rem; /* 24px */ + --text-3xl: 1.875rem; /* 30px */ + --text-4xl: 2.25rem; /* 36px */ + --text-5xl: 3rem; /* 48px */ + + /* Spacing */ + --space-1: 0.25rem; /* 4px */ + --space-2: 0.5rem; /* 8px */ + --space-3: 0.75rem; /* 12px */ + --space-4: 1rem; /* 16px */ + --space-5: 1.25rem; /* 20px */ + --space-6: 1.5rem; /* 24px */ + --space-8: 2rem; /* 32px */ + --space-10: 2.5rem; /* 40px */ + --space-12: 3rem; /* 48px */ + --space-16: 4rem; /* 64px */ + --space-20: 5rem; /* 80px */ + + /* Radius */ + --radius: 0.25rem; /* 4px */ + --radius-md: 0.5rem; /* 8px */ + --radius-lg: 0.75rem; /* 12px */ + --radius-xl: 1rem; /* 16px */ + --radius-2xl: 1.5rem; /* 24px */ + --radius-full: 9999px; + + /* Shadows */ + --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05); + --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); + --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05); + --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); + --shadow-2xl: 0 25px 50px -12px rgba(0, 0, 0, 0.25); + + --shadow-purple-sm: 0 1px 3px 0 rgba(102, 126, 234, 0.1), 0 1px 2px 0 rgba(102, 126, 234, 0.06); + --shadow-purple-md: 0 4px 6px -1px rgba(102, 126, 234, 0.1), 0 2px 4px -1px rgba(102, 126, 234, 0.06); + --shadow-purple-lg: 0 10px 15px -3px rgba(102, 126, 234, 0.1), 0 4px 6px -2px rgba(102, 126, 234, 0.05); + + /* Transitions */ + --duration-fast: 150ms; + --duration-normal: 300ms; + --duration-slow: 500ms; + + --ease-out: cubic-bezier(0.25, 0.46, 0.45, 0.94); +} + +/* Base styles */ + +body { + font-family: var(--font-sans); + line-height: 1.6; + color: var(--color-neutral-900); + background: var(--color-neutral-50); +} + +.container { + max-width: 1200px; + margin: 0 auto; + padding: 0 var(--space-4); +} + +/* Typography */ +h1, h2, h3, h4, h5, h6 { + font-family: var(--font-display); + font-weight: 700; + line-height: 1.2; + margin-bottom: var(--space-2); +} + +h1 { + font-size: var(--text-4xl); + font-weight: 900; +} + +h2 { + font-size: var(--text-3xl); + font-weight: 800; +} + +h3 { + font-size: var(--text-2xl); + font-weight: 700; +} + +h4 { + font-size: var(--text-xl); + font-weight: 700; +} + +p { + margin-bottom: var(--space-4); +} + +/* Buttons */ +.btn { + display: inline-flex; + align-items: center; + justify-content: center; + gap: var(--space-2); + font-family: var(--font-display); + font-weight: 700; + border: none; + cursor: pointer; + border-radius: var(--radius-lg); + transition: all var(--duration-normal) var(--ease-out); + text-transform: uppercase; + letter-spacing: 0.05em; + white-space: nowrap; +} + +.btn-sm { + padding: var(--space-2) var(--space-4); + font-size: var(--text-sm); +} + +.btn-md { + padding: var(--space-3) var(--space-6); + font-size: var(--text-base); +} + +.btn-lg { + padding: var(--space-4) var(--space-8); + font-size: var(--text-lg); +} + +.btn-primary { + background: var(--color-primary-500); + color: white; + box-shadow: var(--shadow-purple-md); +} + +.btn-primary:hover { + background: var(--color-primary-600); + transform: translateY(-2px); + box-shadow: var(--shadow-purple-lg); +} + +.btn-secondary { + background: var(--color-neutral-800); + color: white; +} + +.btn-secondary:hover { + background: var(--color-neutral-900); + transform: translateY(-2px); +} + +.btn-secondary-alt { + background-color: transparent; + color: var(--color-gray-700); + border: 2px solid var(--color-gray-300); +} + +.btn-secondary-alt:hover { + background-color: var(--color-gray-100); + color: var(--color-gray-900); + border-color: var(--color-gray-400); +} + +.btn-accent { + background: var(--color-accent-400); + color: var(--color-neutral-900); + font-weight: 800; +} + +.btn-accent:hover { + background: var(--color-accent-500); + transform: translateY(-2px); + box-shadow: var(--shadow-lg); +} + +.btn-dark { + background: var(--color-neutral-900); + color: white; +} + +.btn-dark:hover { + background: var(--color-neutral-800); + transform: translateY(-2px); +} + +.btn-outline { + background: transparent; + border: 2px solid var(--color-primary-500); + color: var(--color-primary-500); +} + +.btn-outline:hover { + background: var(--color-primary-50); + transform: translateY(-2px); +} + +.btn-ghost { + background: transparent; + color: var(--color-neutral-700); +} + +.btn-ghost:hover { + background: var(--color-neutral-100); +} + +/* Form elements */ +.form-group { + margin-bottom: var(--space-4); +} + +.form-label { + font-family: var(--font-display); + font-size: var(--text-sm); + font-weight: 700; + color: var(--color-neutral-700); + margin-bottom: var(--space-2); + text-transform: uppercase; + letter-spacing: 0.05em; + display: block; +} + +.form-input, +.form-select, +.form-textarea { + background: var(--color-neutral-50); + border: 2px solid var(--color-neutral-200); + border-radius: var(--radius-lg); + padding: var(--space-4); + font-size: var(--text-base); + font-weight: 500; + color: var(--color-neutral-900); + transition: all var(--duration-normal) var(--ease-out); + font-family: var(--font-sans); + width: 100%; +} + +.form-input:focus, +.form-select:focus, +.form-textarea:focus { + outline: none; + border-color: var(--color-primary-500); + background: white; + box-shadow: 0 0 0 4px rgba(102, 126, 234, 0.1); +} + +.form-input::placeholder { + color: var(--color-neutral-500); +} + +.form-select { + cursor: pointer; + appearance: none; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3e%3c/svg%3e"); + background-position: right 12px center; + background-repeat: no-repeat; + background-size: 16px; + padding-right: var(--space-12); +} + +.form-textarea { + min-height: 100px; + resize: vertical; +} + +.form-error { + color: var(--color-danger); + font-size: var(--text-sm); + margin-top: var(--space-1); + display: flex; + align-items: center; + gap: var(--space-1); +} + +.focus-ring { + transition: all var(--duration-normal) var(--ease-out); +} + +.focus-ring:focus { + outline: none; + border-color: var(--color-primary-500); + background: white; + box-shadow: 0 0 0 4px rgba(102, 126, 234, 0.1); +} + +/* Badges */ +.badge { + display: inline-flex; + align-items: center; + padding: var(--space-1) var(--space-3); + border-radius: var(--radius-full); + font-size: var(--text-xs); + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.05em; +} + +.badge-available { + background: var(--color-success-light); + color: var(--color-success-dark); + border: 1px solid var(--color-success); +} + +.badge-limited { + background: var(--color-warning-light); + color: var(--color-warning-dark); + border: 1px solid var(--color-warning); +} + +.badge-sold-out { + background: var(--color-danger-light); + color: var(--color-danger-dark); + border: 1px border var(--color-danger); +} + +.badge-featured { + background: var(--color-accent-100); + color: var(--color-accent-700); + border: 1px solid var(--color-accent-300); +} + +.badge-vip { + background: var(--color-primary-100); + color: var(--color-primary-800); + border: 1px solid var(--color-primary-300); +} + +/* Cards */ +.card { + background: white; + border-radius: var(--radius-xl); + padding: var(--space-6); + border: 1px solid var(--color-neutral-200); + box-shadow: var(--shadow-sm); + transition: all var(--duration-slow) var(--ease-out); +} + +.card.hover-lift:hover { + transform: translateY(-8px) scale(1.02); + box-shadow: var(--shadow-2xl); + border-color: var(--color-primary-200); +} + +.card-header { + margin-bottom: var(--space-4); +} + +.card-body { + margin-bottom: var(--space-4); +} + +.event-card { + background: white; + border-radius: var(--radius-xl); + overflow: hidden; + box-shadow: var(--shadow-md); + transition: all var(--duration-slow) var(--ease-out); + border: 1px solid var(--color-neutral-200); + position: relative; +} + .event-card.hover-glow:hover { transform: translateY(-8px) scale(1.02); box-shadow: var(--shadow-2xl); border-color: var(--color-primary-200); } +/* Navigation */ +.nav { + background: white; + box-shadow: var(--shadow-sm); + position: sticky; + top: 0; + z-index: 100; +} + +.nav-link { + color: var(--color-neutral-700); + text-decoration: none; + font-weight: 600; + padding: var(--space-3) var(--space-2); + border-radius: var(--radius); + transition: all var(--duration-normal); +} + +.nav-link:hover { + color: var(--color-primary-600); + background: var(--color-primary-50); +} + +/* Search box */ +.search-box { + position: relative; + max-width: 400px; +} + +.search-input { + padding-left: var(--space-12); +} + +.search-icon { + position: absolute; + left: var(--space-4); + top: 50%; + transform: translateY(-50%); + color: var(--color-neutral-400); +} + +/* Price tags */ .price-tag { display: inline-flex; align-items: center; @@ -25,21 +488,290 @@ font-size: var(--text-2xl); } -.search-box { +/* Avatars */ +.avatar-group { + display: flex; + align-items: center; + gap: var(--space-2); +} + +.avatar { + width: 40px; + height: 40px; + border-radius: var(--radius-full); + background: var(--color-primary-100); + display: flex; + align-items: center; + justify-content: center; + font-weight: 600; + color: var(--color-primary-600); + border: 2px solid white; + box-shadow: var(--shadow-sm); position: relative; +} + +.avatar-lg { + width: 60px; + height: 60px; +} + +.avatar-sm { + width: 32px; + height: 32px; + font-size: var(--text-xs); +} + +.avatar-image { width: 100%; + height: 100%; + object-fit: cover; + border-radius: var(--radius-full); } -.search-input { - padding-left: var(--space-12); -} - -.search-icon { +.avatar-status { position: absolute; - left: var(--space-4); - top: 50%; - transform: translateY(-50%); + bottom: 0; + right: 0; + width: 12px; + height: 12px; + border-radius: var(--radius-full); + border: 2px solid white; +} + +.status-online { background: var(--color-success); } +.status-offline { background: var(--color-neutral-400); } +.status-busy { background: var(--color-danger); } + +/* Progress bars */ +.progress-bar { + width: 100%; + height: 8px; + background: var(--color-neutral-200); + border-radius: var(--radius-full); + overflow: hidden; + margin-bottom: var(--space-3); +} + +.progress-fill { + height: 100%; + background: var(--color-primary-500); + border-radius: var(--radius-full); + transition: width var(--duration-slow) var(--ease-out); +} + +/* Rating stars */ +.rating { + display: flex; + gap: var(--space-1); + align-items: center; +} + +.rating-star { + width: 16px; + height: 16px; + color: var(--color-warning); +} + +.rating-star.filled { + fill: currentColor; +} + +.rating-star.empty { + fill: none; + stroke: currentColor; + stroke-width: 2; +} + +/* Notifications */ +.notification { + display: flex; + align-items: center; + gap: var(--space-3); + padding: var(--space-4); + border-radius: var(--radius-lg); + margin-bottom: var(--space-3); + font-weight: 500; +} + +.notification-success { + background: var(--color-success-light); + color: var(--color-success-dark); + border: 1px solid var(--color-success); +} + +.notification-warning { + background: var(--color-warning-light); + color: var(--color-warning-dark); + border: 1px solid var(--color-warning); +} + +.notification-error { + background: var(--color-danger-light); + color: var(--color-danger-dark); + border: 1px solid var(--color-danger); +} + +.notification-info { + background: var(--color-primary-50); + color: var(--color-primary-800); + border: 1px solid var(--color-primary-200); +} + +/* Tabs */ +.tabs { + border-bottom: 1px solid var(--color-neutral-200); + margin-bottom: var(--space-6); +} + +.tab-list { + display: flex; + gap: var(--space-1); +} + +.tab-button { + background: none; + border: none; + padding: var(--space-3) var(--space-4); + font-weight: 500; + color: var(--color-neutral-600); + cursor: pointer; + border-bottom: 2px solid transparent; + transition: all var(--duration-normal); + font-family: var(--font-display); +} + +.tab-button:hover { + color: var(--color-primary-600); + background: var(--color-primary-50); + border-radius: var(--radius-md) var(--radius-md) 0 0; +} + +.tab-button.active { + color: var(--color-primary-600); + border-bottom-color: var(--color-primary-600); +} + +.tab-content { + display: none; + padding: var(--space-4) 0; +} + +.tab-content.active { + display: block; +} + +/* Tooltips */ +.tooltip { + position: relative; + display: inline-block; +} + +.tooltip-content { + position: absolute; + bottom: 125%; + left: 50%; + transform: translateX(-50%); + background: var(--color-neutral-900); + color: white; + padding: var(--space-2) var(--space-3); + border-radius: var(--radius); + font-size: var(--text-sm); + white-space: nowrap; + opacity: 0; + visibility: hidden; + transition: all var(--duration-normal); + z-index: 100; +} + +.tooltip-content::after { + content: ''; + position: absolute; + top: 100%; + left: 50%; + transform: translateX(-50%); + border: 5px solid transparent; + border-top-color: var(--color-neutral-900); +} + +.tooltip:hover .tooltip-content { + opacity: 1; + visibility: visible; +} + +/* Loading states */ +.loading-spinner { + width: 40px; + height: 40px; + border: 3px solid var(--color-neutral-200); + border-top-color: var(--color-primary-600); + border-radius: var(--radius-full); + animation: spin 1s linear infinite; +} + +.loading-dots { + display: flex; + gap: var(--space-1); +} + +.loading-dot { + width: 8px; + height: 8px; + background: var(--color-primary-600); + border-radius: var(--radius-full); + animation: bounce 1.4s infinite both; +} + +.loading-dot:nth-child(2) { animation-delay: 0.2s; } +.loading-dot:nth-child(3) { animation-delay: 0.4s; } + +@keyframes spin { + to { transform: rotate(360deg); } +} + +@keyframes bounce { + 0%, 80%, 100% { transform: scale(0); } + 40% { transform: scale(1); } +} + +/* Breadcrumbs */ +.breadcrumb { + display: inline-flex; + align-items: center; + gap: var(--space-2); + background: white; + padding: var(--space-3) var(--space-4); + border-radius: var(--radius-xl); + box-shadow: var(--shadow-sm); + border: 1px solid var(--color-neutral-100); + margin-bottom: var(--space-8); +} + +.breadcrumb-item { + display: inline-flex; + align-items: center; + font-size: var(--text-sm); + font-weight: var(--font-medium); +} + +.breadcrumb-link { + color: var(--color-neutral-700); + text-decoration: none; + transition: all var(--duration-fast) var(--ease-out); +} + +.breadcrumb-link:hover { + color: var(--color-primary-600); +} + +.breadcrumb-current { + color: var(--color-primary-600); + font-weight: var(--font-medium); +} + +.breadcrumb-separator { color: var(--color-neutral-400); + width: var(--space-4); + height: var(--space-4); } /* Hero section */ @@ -213,4 +945,79 @@ .card-event-description { color: var(--color-neutral-500); line-height: 1.5; +} + +/* Additional styles for enhanced Aperonight design */ +.event-card.hover-glow:hover { + transform: translateY(-8px) scale(1.02); + box-shadow: var(--shadow-2xl); + border-color: var(--color-primary-200); +} + +.price-tag { + display: inline-flex; + align-items: center; + gap: var(--space-1); + font-family: var(--font-display); + font-weight: 800; +} + +.price-tag-sm { + font-size: var(--text-sm); +} + +.price-tag-md { + font-size: var(--text-lg); +} + +.price-tag-lg { + font-size: var(--text-2xl); +} + +.search-box { + position: relative; + width: 100%; +} + +.search-input { + padding-left: var(--space-12); +} + +.search-icon { + position: absolute; + left: var(--space-4); + top: 50%; + transform: translateY(-50%); + color: var(--color-neutral-400); +} + +/* Responsive adjustments */ +@media (max-width: 768px) { + .container { + padding: 0 var(--space-3); + } + + h1 { + font-size: var(--text-3xl); + } + + h2 { + font-size: var(--text-2xl); + } + + .btn-lg { + padding: var(--space-3) var(--space-6); + font-size: var(--text-base); + } + + .btn-md { + padding: var(--space-2) var(--space-4); + font-size: var(--text-sm); + } + + .form-input, + .form-select, + .form-textarea { + padding: var(--space-3); + } } \ No newline at end of file diff --git a/app/views/components/_breadcrumb.html.erb b/app/views/components/_breadcrumb.html.erb new file mode 100644 index 0000000..4f96a47 --- /dev/null +++ b/app/views/components/_breadcrumb.html.erb @@ -0,0 +1,31 @@ +<%# Dynamic breadcrumb navigation component %> +<%# Usage: render 'components/breadcrumb', crumbs: [ %> +<%# { name: 'Home', path: root_path }, %> +<%# { name: 'Events', path: events_path }, %> +<%# { name: 'Current Event', path: nil } %> +<%# ] %> + + + \ No newline at end of file diff --git a/app/views/events/show.html.erb b/app/views/events/show.html.erb index e96af24..ea06b41 100755 --- a/app/views/events/show.html.erb +++ b/app/views/events/show.html.erb @@ -1,210 +1,115 @@ -
<%= @event.description %>
+<%= @event.venue_name %>
+<%= @event.venue_address %>
+<%= @event.start_time.strftime("%A %d %B %Y") %>
+À <%= @event.start_time.strftime("%H:%M") %>
+<%= @event.user.first_name %> <%= @event.user.last_name %>
+ <% else %> +<%= @event.user.email.split("@").first %>
+ <% end %> + <% if @event.user.company_name.present? %> +<%= @event.user.company_name %>
+ <% end %> +<%= @event.description %>
-<%= @event.venue_name %>
-<%= @event.venue_address %>
-<%= @event.start_time.strftime("%A %d %B %Y") %>
-À - <%= @event.start_time.strftime("%H:%M") %>
-<%= @event.user.first_name %> - <%= @event.user.last_name %>
- <% else %> -<%= @event.user.email.split("@").first %>
- <% end %> - <% if @event.user.company_name.present? %> -<%= @event.user.company_name %>
- <% end %> -Les billets pour cet événement ne sont pas encore - disponibles ou sont épuisés.
+Les billets pour cet événement ne sont pas encore disponibles ou sont épuisés.
Téléchargez ou consultez la facture de votre commande.
ID: #<%= @ticket.id %>