/** * Skill Demos - Interactive before/after demonstrations * Renaissance Edition */ /* ============================================ TABBED CONTAINER ============================================ */ .demo-tabbed-container { display: flex; flex-direction: column; } .demo-tabs { display: flex; gap: 0; margin-bottom: 0; justify-content: center; background: var(--color-paper); border-bottom: 1px solid var(--color-mist); } .demo-tab { padding: var(--spacing-sm) var(--spacing-lg); background: transparent; border: none; border-bottom: 2px solid transparent; font-family: var(--font-mono); font-size: 0.75rem; font-weight: 500; letter-spacing: 0.05em; text-transform: uppercase; color: var(--color-ash); cursor: pointer; transition: all var(--duration-fast) var(--ease-out); } .demo-tab:hover { color: var(--color-text); background: var(--color-cream); } .demo-tab.active { color: var(--color-accent); border-bottom-color: var(--color-accent); background: var(--color-accent-dim); } .demo-panels { flex: 1; } .demo-panel { display: none; } .demo-panel.active { display: block; animation: fadeSlideIn 0.3s var(--ease-out); } @keyframes fadeSlideIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } /* ============================================ DEMO CONTAINER ============================================ */ .demo-container { background: var(--color-paper); border: none; border-radius: 0; overflow: hidden; } .demo-header { display: flex; align-items: center; justify-content: center; padding: var(--spacing-sm) var(--spacing-md); background: var(--color-paper); border-bottom: 1px solid var(--color-mist); min-height: 48px; } .demo-toggle { display: flex; align-items: center; gap: var(--spacing-md); } .demo-toggle-label { font-family: var(--font-mono); font-size: 0.6875rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.08em; color: var(--color-ash); transition: color var(--duration-fast) var(--ease-out); cursor: pointer; } .demo-toggle-label:hover { color: var(--color-text); } .demo-toggle-label.active { color: var(--color-accent); } .demo-toggle-switch { position: relative; width: 44px; height: 24px; background: var(--color-mist); border-radius: 12px; cursor: pointer; transition: background var(--duration-fast) var(--ease-out); border: 1px solid transparent; padding: 0; font: inherit; } .demo-toggle-switch:focus-visible { outline: 2px solid var(--color-accent); outline-offset: 2px; } .demo-toggle-switch:hover { border-color: var(--color-ash); } .demo-toggle-switch::after { content: ''; position: absolute; top: 3px; left: 3px; width: 16px; height: 16px; background: var(--color-paper); border-radius: 50%; box-shadow: 0 1px 4px rgba(0,0,0,0.15); transition: transform var(--duration-base) var(--ease-spring); } .demo-toggle-switch.active { background: var(--color-accent); } .demo-toggle-switch.active::after { transform: translateX(20px); } .demo-viewport { padding: var(--spacing-xl); display: flex; align-items: center; justify-content: center; min-height: 280px; background: var(--color-cream); transition: background var(--duration-base) var(--ease-out); } .demo-viewport[data-state="after"] { background: var(--color-paper); } .demo-caption { padding: var(--spacing-sm) var(--spacing-md); font-family: var(--font-mono); font-size: 0.6875rem; letter-spacing: 0.03em; color: var(--color-ash); text-align: center; } /* ============================================ UX WRITING DEMOS ============================================ */ .uxw-demo { width: 100%; max-width: 320px; padding: var(--spacing-lg); background: var(--color-paper); border: 1px solid var(--color-mist); border-radius: 6px; text-align: center; } /* Error Messages */ .uxw-error-icon { font-size: 2rem; margin-bottom: var(--spacing-sm); } .uxw-error-title { font-weight: 600; color: #c00; margin-bottom: var(--spacing-xs); } .uxw-error-text { font-size: 0.875rem; color: var(--color-ash); } .uxw-error-action { margin-top: var(--spacing-sm); font-size: 0.875rem; color: var(--color-accent); cursor: pointer; text-decoration: underline; } .uxw-error-after .uxw-error-icon { color: var(--color-accent); } .uxw-error-after .uxw-error-title { color: var(--color-text); } .uxw-error-after .uxw-error-text { color: var(--color-charcoal); } /* Button Labels */ .uxw-button-context { font-size: 0.875rem; color: var(--color-charcoal); margin-bottom: var(--spacing-md); font-weight: 500; } .uxw-button-row { display: flex; gap: var(--spacing-sm); justify-content: center; } .uxw-btn { padding: var(--spacing-xs) var(--spacing-md); border-radius: 4px; font-size: 0.875rem; font-weight: 500; cursor: pointer; border: none; } .uxw-btn-primary { background: var(--color-text); color: var(--color-paper); } .uxw-btn-secondary { background: transparent; color: var(--color-ash); border: 1px solid var(--color-mist); } .uxw-btn-danger { background: #c00; color: white; } /* Empty States */ .uxw-empty-icon { font-size: 2.5rem; margin-bottom: var(--spacing-sm); opacity: 0.4; } .uxw-empty-title { font-weight: 500; color: var(--color-ash); } .uxw-empty-text { font-size: 0.875rem; color: var(--color-charcoal); margin-top: var(--spacing-xs); } .uxw-empty-action { margin-top: var(--spacing-md); } .uxw-empty-after .uxw-empty-icon { opacity: 1; } .uxw-empty-after .uxw-empty-title { color: var(--color-text); } /* ============================================ SPATIAL DESIGN DEMOS ============================================ */ .spatial-demo { width: 100%; max-width: 340px; padding: var(--spacing-md); background: var(--color-paper); border: 1px solid var(--color-mist); border-radius: 6px; } /* Grid Systems */ .spatial-grid-before { display: flex; flex-wrap: wrap; gap: 6px; } .spatial-grid-after { display: grid; grid-template-columns: 1fr 1fr; gap: var(--spacing-sm); } .spatial-card-item { padding: var(--spacing-sm); background: var(--color-bg); border: 1px solid var(--color-mist); border-radius: 4px; font-size: 0.8125rem; color: var(--color-charcoal); text-align: center; } .spatial-grid-after .spatial-card-item { width: auto !important; } /* Visual Hierarchy */ .spatial-hierarchy-before .spatial-h-title, .spatial-hierarchy-before .spatial-h-subtitle, .spatial-hierarchy-before .spatial-h-cta, .spatial-hierarchy-before .spatial-h-link { font-size: 0.9375rem; margin-bottom: var(--spacing-xs); color: var(--color-charcoal); } .spatial-hierarchy-after .spatial-h-title { font-family: var(--font-display); font-size: 1.75rem; font-weight: 300; font-style: italic; margin-bottom: var(--spacing-xs); color: var(--color-text); } .spatial-hierarchy-after .spatial-h-subtitle { font-size: 0.6875rem; text-transform: uppercase; letter-spacing: 0.1em; color: var(--color-ash); margin-bottom: var(--spacing-md); } .spatial-hierarchy-after .spatial-h-cta { display: inline-block; padding: var(--spacing-sm) var(--spacing-lg); background: var(--color-text); color: var(--color-paper); font-size: 0.875rem; font-weight: 500; border-radius: 4px; margin-bottom: var(--spacing-sm); } .spatial-hierarchy-after .spatial-h-link { font-size: 0.75rem; color: var(--color-ash); } /* Whitespace */ .spatial-whitespace-before { padding: var(--spacing-xs) !important; } .spatial-whitespace-before .spatial-ws-title { font-size: 1rem; font-weight: 600; margin-bottom: 2px; } .spatial-whitespace-before .spatial-ws-price { font-size: 0.875rem; color: var(--color-ash); margin-bottom: 4px; } .spatial-whitespace-before .spatial-ws-features { font-size: 0.75rem; color: var(--color-ash); margin-bottom: 6px; } .spatial-whitespace-before .spatial-ws-btn { width: 100%; padding: 6px; font-size: 0.75rem; background: var(--color-text); color: var(--color-paper); border: none; border-radius: 3px; cursor: pointer; } .spatial-whitespace-after { padding: var(--spacing-lg) !important; } .spatial-whitespace-after .spatial-ws-title { font-family: var(--font-display); font-size: 1.5rem; font-weight: 400; margin-bottom: var(--spacing-sm); } .spatial-whitespace-after .spatial-ws-price { font-size: 1.25rem; font-weight: 600; color: var(--color-text); margin-bottom: var(--spacing-sm); } .spatial-whitespace-after .spatial-ws-features { font-size: 0.8125rem; color: var(--color-ash); margin-bottom: var(--spacing-lg); line-height: 1.6; } .spatial-whitespace-after .spatial-ws-btn { width: 100%; padding: var(--spacing-sm); font-size: 0.875rem; background: var(--color-text); color: var(--color-paper); border: none; border-radius: 4px; cursor: pointer; font-weight: 500; } /* ============================================ MOTION DESIGN DEMOS ============================================ */ .motion-demo { display: flex; flex-direction: column; align-items: center; gap: var(--spacing-sm); width: 100%; max-width: 280px; } /* Staggered Reveal */ .motion-stagger-demo { align-items: stretch; } .motion-list-item { display: flex; align-items: center; gap: var(--spacing-sm); padding: var(--spacing-sm) var(--spacing-md); background: var(--color-bg); border: 1px solid var(--color-mist); border-radius: 4px; font-size: 0.875rem; color: var(--color-charcoal); } .motion-dot { width: 8px; height: 8px; background: var(--color-accent); border-radius: 50%; } .demo-viewport[data-state="after"] .motion-list-item { opacity: 0; transform: translateY(12px); animation: staggerIn 0.35s cubic-bezier(0.16, 1, 0.3, 1) forwards; } .demo-viewport[data-state="after"] .motion-list-item:nth-child(1) { animation-delay: 0s; } .demo-viewport[data-state="after"] .motion-list-item:nth-child(2) { animation-delay: 0.05s; } .demo-viewport[data-state="after"] .motion-list-item:nth-child(3) { animation-delay: 0.1s; } .demo-viewport[data-state="after"] .motion-list-item:nth-child(4) { animation-delay: 0.15s; } @keyframes staggerIn { to { opacity: 1; transform: translateY(0); } } /* Micro-interactions */ .motion-btn { padding: 12px 24px; font-size: 0.9375rem; font-weight: 500; border: none; border-radius: 4px; cursor: pointer; } .motion-btn-before { background: var(--color-charcoal); color: var(--color-paper); } .motion-btn-after { background: var(--color-text); color: var(--color-paper); transition: transform 0.2s cubic-bezier(0.34, 1.56, 0.64, 1), box-shadow 0.2s ease; } .motion-btn-after:hover { transform: translateY(-2px); box-shadow: 0 4px 12px rgba(0,0,0,0.15); } .motion-btn-after:active { transform: translateY(0) scale(0.98); } /* State Transitions */ .motion-card { padding: var(--spacing-md); background: var(--color-bg); border: 1px solid var(--color-mist); border-radius: 6px; text-align: center; min-width: 140px; } .motion-card-icon { font-size: 1.5rem; margin-bottom: var(--spacing-xs); } .motion-card-text { font-size: 0.8125rem; color: var(--color-charcoal); } .motion-card-after { transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); } .demo-viewport[data-state="after"] .motion-card-after { background: color-mix(in oklch, var(--color-accent) 10%, var(--color-paper)); border-color: var(--color-accent); } .demo-viewport[data-state="after"] .motion-card-after .motion-card-icon { animation: checkPop 0.4s cubic-bezier(0.34, 1.56, 0.64, 1); } @keyframes checkPop { 50% { transform: scale(1.3); } } /* ============================================ TYPOGRAPHY DEMOS ============================================ */ .typo-demo { width: 100%; max-width: 320px; text-align: left; } /* Font Pairing */ .typo-pairing-before { font-family: 'Inter', system-ui, sans-serif; } .typo-pairing-before .typo-heading { font-size: 1.5rem; font-weight: 600; margin-bottom: var(--spacing-xs); } .typo-pairing-before .typo-body { font-size: 0.9375rem; line-height: 1.5; color: var(--color-ash); } .typo-pairing-after .typo-heading { font-family: var(--font-display); font-size: 2rem; font-weight: 300; font-style: italic; letter-spacing: -0.02em; margin-bottom: var(--spacing-sm); color: var(--color-text); } .typo-pairing-after .typo-body { font-family: var(--font-body); font-size: 0.9375rem; line-height: 1.7; color: var(--color-charcoal); } /* Hierarchy */ .typo-hierarchy-before .typo-h1 { font-size: 1.125rem; font-weight: 600; margin-bottom: 4px; } .typo-hierarchy-before .typo-meta { font-size: 0.9375rem; color: var(--color-ash); margin-bottom: var(--spacing-xs); } .typo-hierarchy-before .typo-p { font-size: 0.875rem; line-height: 1.5; color: var(--color-charcoal); } .typo-hierarchy-after .typo-h1 { font-family: var(--font-display); font-size: 2.25rem; font-weight: 300; letter-spacing: -0.03em; margin-bottom: 2px; line-height: 1.1; } .typo-hierarchy-after .typo-meta { font-size: 0.6875rem; text-transform: uppercase; letter-spacing: 0.12em; color: var(--color-accent); margin-bottom: var(--spacing-md); } .typo-hierarchy-after .typo-p { font-size: 0.9375rem; line-height: 1.7; color: var(--color-ash); } /* ============================================ INTERACTION DESIGN DEMOS ============================================ */ .int-demo { display: flex; flex-direction: column; gap: var(--spacing-md); width: 100%; max-width: 280px; } /* Button States */ .int-states-demo { gap: var(--spacing-lg); } .int-state-row { display: flex; align-items: center; gap: var(--spacing-md); } .int-state-label { font-size: 0.6875rem; text-transform: uppercase; letter-spacing: 0.08em; color: var(--color-ash); width: 40px; } .int-btn { flex: 1; padding: var(--spacing-sm) var(--spacing-md); font-size: 0.875rem; font-weight: 500; border-radius: 4px; cursor: pointer; } .int-btn-poor { background: var(--color-charcoal); color: var(--color-paper); border: none; } .int-btn-good { background: var(--color-text); color: var(--color-paper); border: 2px solid transparent; transition: all 0.15s ease; } .int-btn-good:hover { background: var(--color-charcoal); } .int-btn-good:focus { outline: none; border-color: var(--color-accent); box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-accent) 25%, transparent); } .int-btn-good:active { transform: scale(0.98); } /* Affordances */ .int-aff-item { padding: var(--spacing-sm) var(--spacing-md); border-radius: 4px; font-size: 0.875rem; cursor: pointer; } .int-aff-poor { color: var(--color-charcoal); } .int-aff-good { color: var(--color-accent); text-decoration: underline; text-underline-offset: 2px; } .int-aff-good::after { content: ' →'; } .int-affordance-after .int-aff-item { background: var(--color-bg); border: 1px solid var(--color-mist); color: var(--color-accent); text-decoration: underline; text-underline-offset: 2px; transition: background 0.15s ease; } .int-affordance-after .int-aff-item:hover { background: color-mix(in oklch, var(--color-accent) 5%, var(--color-paper)); } .int-affordance-after .int-aff-item::after { content: ' →'; } /* Feedback */ .int-feedback-before, .int-feedback-after { display: flex; align-items: center; gap: var(--spacing-md); flex-direction: row; } .int-fb-btn { width: 48px; height: 48px; border-radius: 50%; border: none; cursor: pointer; display: flex; align-items: center; justify-content: center; } .int-fb-btn svg { width: 22px; height: 22px; } .int-fb-silent { background: var(--color-mist); color: var(--color-ash); } .int-fb-active { background: var(--color-charcoal); color: var(--color-paper); transition: all 0.15s cubic-bezier(0.34, 1.56, 0.64, 1); } .int-fb-active:hover { transform: scale(1.1); } .int-fb-active:active { transform: scale(0.95); } .int-fb-active.liked { background: var(--color-accent); animation: heartPop 0.35s cubic-bezier(0.34, 1.56, 0.64, 1); } @keyframes heartPop { 50% { transform: scale(1.25); } } .int-fb-label { font-size: 0.875rem; color: var(--color-charcoal); } /* ============================================ COLOR & CONTRAST DEMOS ============================================ */ .color-demo { width: 100%; max-width: 300px; } /* Color Palette */ .color-palette-before, .color-palette-after { display: flex; flex-wrap: wrap; gap: var(--spacing-xs); padding: var(--spacing-md); background: var(--color-paper); border: 1px solid var(--color-mist); border-radius: 6px; } .color-swatch { width: 40px; height: 40px; border-radius: 4px; transition: background 0.2s ease; } .color-card { width: 100%; margin-top: var(--spacing-sm); padding: var(--spacing-sm); background: var(--color-paper); border: 1px solid var(--color-mist); border-radius: 4px; display: flex; flex-direction: column; gap: 4px; } .color-card span { font-size: 0.8125rem; font-weight: 500; transition: color 0.2s ease; } .color-card button { padding: 6px; border: none; border-radius: 3px; font-size: 0.75rem; font-weight: 500; cursor: pointer; transition: all 0.2s ease; } /* Before - Clashing colors */ .color-palette-before .swatch-1 { background: #ff6b6b; } .color-palette-before .swatch-2 { background: #4ecdc4; } .color-palette-before .swatch-3 { background: #ffe66d; } .color-palette-before .swatch-4 { background: #95e1d3; } .color-palette-before .swatch-5 { background: #f38181; } .color-palette-before .card-title { color: #ff6b6b; } .color-palette-before .card-subtitle { color: #4ecdc4; } .color-palette-before .card-btn { background: #ffe66d; color: #333; } /* After - Harmonious palette */ .color-palette-after .swatch-1 { background: var(--color-text); } .color-palette-after .swatch-2 { background: var(--color-charcoal); } .color-palette-after .swatch-3 { background: var(--color-ash); } .color-palette-after .swatch-4 { background: var(--color-mist); } .color-palette-after .swatch-5 { background: var(--color-accent); } .color-palette-after .card-title { color: var(--color-text); } .color-palette-after .card-subtitle { color: var(--color-ash); } .color-palette-after .card-btn { background: var(--color-accent); color: var(--color-paper); } /* Strategic Accent */ .color-accent-card { padding: var(--spacing-md); border-radius: 6px; } .color-accent-before .color-accent-card { background: #f5f5f5; border: 1px solid #e0e0e0; } .color-accent-before .color-accent-title { font-weight: 600; color: #333; margin-bottom: 4px; } .color-accent-before .color-accent-text { font-size: 0.8125rem; color: #666; margin-bottom: var(--spacing-sm); } .color-accent-before .color-accent-btn { width: 100%; padding: var(--spacing-xs); background: #333; color: white; border: none; border-radius: 4px; font-size: 0.8125rem; cursor: pointer; } .color-accent-after .color-accent-card { background: color-mix(in oklch, var(--color-accent) 8%, var(--color-paper)); border: 1px solid color-mix(in oklch, var(--color-accent) 20%, var(--color-paper)); } .color-accent-after .color-accent-title { font-weight: 600; color: var(--color-text); margin-bottom: 4px; } .color-accent-after .color-accent-text { font-size: 0.8125rem; color: var(--color-ash); margin-bottom: var(--spacing-sm); } .color-accent-after .color-accent-btn { width: 100%; padding: var(--spacing-xs); background: var(--color-accent); color: var(--color-paper); border: none; border-radius: 4px; font-size: 0.8125rem; font-weight: 500; cursor: pointer; } /* Contrast Ratios */ .color-contrast-static { display: flex; flex-direction: column; gap: var(--spacing-sm); } .contrast-example { padding: var(--spacing-md); border-radius: 6px; text-align: center; } .contrast-fail { background: #f0f0f0; color: #a0a0a0; } .contrast-pass { background: var(--color-charcoal); color: var(--color-paper); } .contrast-badge { display: inline-block; font-size: 0.5625rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.1em; padding: 2px 6px; border-radius: 2px; margin-bottom: 4px; } .contrast-fail .contrast-badge { background: #ddd; } .contrast-pass .contrast-badge { background: var(--color-accent); color: var(--color-paper); } .contrast-text { font-size: 1rem; font-weight: 500; margin-bottom: 2px; } .contrast-ratio { font-size: 0.6875rem; opacity: 0.7; } /* ============================================ RESPONSIVE DESIGN DEMOS ============================================ */ .resp-demo { width: 100%; max-width: 340px; } /* Touch Targets */ .resp-touch-demo { display: flex; flex-direction: column; gap: var(--spacing-lg); } .resp-touch-row { display: flex; align-items: center; gap: var(--spacing-md); } .resp-label { font-size: 0.6875rem; text-transform: uppercase; letter-spacing: 0.08em; color: var(--color-ash); width: 70px; } .resp-touch-targets { display: flex; gap: 4px; } .resp-touch-targets button { border: none; border-radius: 4px; cursor: pointer; font-weight: 500; } .resp-touch-bad button { width: 24px; height: 24px; font-size: 0.75rem; background: var(--color-mist); color: var(--color-ash); } .resp-touch-good button { width: 44px; height: 44px; font-size: 1rem; background: var(--color-text); color: var(--color-paper); } /* Fluid Layout */ .resp-fluid-demo { padding: var(--spacing-md); background: var(--color-bg); border: 1px solid var(--color-mist); border-radius: 6px; } .resp-fluid-container { display: flex; flex-direction: column; gap: var(--spacing-md); } .resp-fluid-fixed, .resp-fluid-adaptive { font-size: 0.75rem; color: var(--color-ash); } .resp-fluid-fixed span, .resp-fluid-adaptive span { display: block; margin-bottom: 4px; } .resp-fluid-bar { height: 24px; background: var(--color-mist); border-radius: 4px; } .resp-fluid-adaptive .resp-fluid-bar { background: var(--color-accent); } /* Adaptive Content */ .resp-adapt-demo { display: flex; gap: var(--spacing-sm); align-items: flex-end; } .resp-device { text-align: center; } .resp-device > span { display: block; margin-top: 4px; font-size: 0.625rem; color: var(--color-ash); text-transform: uppercase; letter-spacing: 0.08em; } .resp-device-screen { background: var(--color-paper); border: 2px solid var(--color-mist); border-radius: 4px; padding: 4px; display: flex; flex-direction: column; gap: 3px; } .resp-device-mobile .resp-device-screen { width: 50px; height: 80px; } .resp-device-tablet .resp-device-screen { width: 80px; height: 60px; } .resp-device-desktop .resp-device-screen { width: 120px; height: 70px; } .resp-block { background: var(--color-mist); border-radius: 2px; } .resp-block-row { display: flex; gap: 3px; flex: 1; } .resp-header { height: 16px; background: var(--color-charcoal); } .resp-sidebar { width: 30%; background: var(--color-charcoal); } .resp-content { flex: 1; } /* ============================================ ANIMATIONS ============================================ */ @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; } }