UNPKG

@gleb.askerko/componentkit-js

Version:

Lightweight, framework-agnostic JavaScript component library with progress gift components

571 lines (492 loc) 11.7 kB
/* ComponentKit.js - Core Styles */ :root { --ck-primary: #3b82f6; --ck-primary-hover: #2563eb; --ck-secondary: #d9f99d; --ck-secondary-hover: #cbd5e1; --ck-success: #10b981; --ck-danger: #ef4444; --ck-warning: #f59e0b; --ck-text: #1e293b; --ck-text-muted: #64748b; --ck-border: #d1d5db; --ck-border-focus: var(--ck-primary); --ck-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); --ck-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05); --ck-radius: 0.5rem; --ck-font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, sans-serif; --ck-transition: all 0.2s ease-in-out; } /* Button Component */ .ck-button { display: inline-flex; align-items: center; justify-content: center; font-family: var(--ck-font-family); font-weight: 600; border: none; border-radius: var(--ck-radius); cursor: pointer; transition: var(--ck-transition); text-decoration: none; outline: none; user-select: none; position: relative; } .ck-button:focus { outline: 2px solid var(--ck-border-focus); outline-offset: 2px; } .ck-button--primary { background-color: var(--ck-primary); color: white; } .ck-button--primary:hover { background-color: var(--ck-primary-hover); } .ck-button--secondary { background-color: var(--ck-secondary); color: var(--ck-text); } .ck-button--secondary:hover { background-color: var(--ck-secondary-hover); } .ck-button--outline { background-color: transparent; color: var(--ck-primary); border: 2px solid var(--ck-primary); } .ck-button--outline:hover { background-color: var(--ck-primary); color: white; } .ck-button--small { padding: 0.5rem 1rem; font-size: 0.875rem; } .ck-button--medium { padding: 0.75rem 1.5rem; font-size: 1rem; } .ck-button--large { padding: 1rem 2rem; font-size: 1.125rem; } .ck-button--disabled, .ck-button:disabled { opacity: 0.5; cursor: not-allowed; pointer-events: none; } /* Input Component */ .ck-input-wrapper { display: flex; flex-direction: column; gap: 0.5rem; } .ck-input-label { font-family: var(--ck-font-family); font-weight: 500; color: var(--ck-text); font-size: 0.875rem; } .ck-input { font-family: var(--ck-font-family); padding: 0.75rem 1rem; border: 1px solid var(--ck-border); border-radius: var(--ck-radius); font-size: 1rem; transition: var(--ck-transition); outline: none; background-color: white; } .ck-input:focus { border-color: var(--ck-border-focus); box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); } .ck-input--error { border-color: var(--ck-danger); background-color: #fef2f2; } .ck-input--error:focus { border-color: var(--ck-danger); box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.1); } .ck-input--disabled { opacity: 0.5; cursor: not-allowed; background-color: #f9fafb; } .ck-input-error { color: var(--ck-danger); font-size: 0.875rem; font-family: var(--ck-font-family); } /* Card Component */ .ck-card { font-family: var(--ck-font-family); background-color: white; border-radius: var(--ck-radius); overflow: hidden; } .ck-card--default { border: 1px solid var(--ck-border); box-shadow: var(--ck-shadow); } .ck-card--elevated { box-shadow: var(--ck-shadow-lg); } .ck-card--outlined { border: 2px solid var(--ck-border); } .ck-card-header { padding: 1.5rem; border-bottom: 1px solid var(--ck-border); } .ck-card-title { margin: 0; font-size: 1.25rem; font-weight: 600; color: var(--ck-text); } .ck-card-body { padding: 1.5rem; } .ck-card-content { margin: 0; color: var(--ck-text-muted); line-height: 1.5; } .ck-card-footer { padding: 1rem 1.5rem; border-top: 1px solid var(--ck-border); background-color: #f9fafb; display: flex; gap: 0.75rem; justify-content: flex-end; } .ck-card-action { margin: 0; } /* Modal Component */ .ck-modal-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(0, 0, 0, 0.5); display: flex; align-items: center; justify-content: center; z-index: 1000; opacity: 0; transition: opacity 0.3s ease-in-out; padding: 1rem; } .ck-modal-overlay.ck-modal--open { opacity: 1; } .ck-modal { font-family: var(--ck-font-family); background-color: white; border-radius: var(--ck-radius); box-shadow: var(--ck-shadow-lg); width: 100%; max-height: 90vh; overflow-y: auto; transform: translateY(-20px); transition: transform 0.3s ease-in-out; } .ck-modal-overlay.ck-modal--open .ck-modal { transform: translateY(0); } .ck-modal--small { max-width: 400px; } .ck-modal--medium { max-width: 500px; } .ck-modal--large { max-width: 800px; } .ck-modal-header { padding: 1.5rem; border-bottom: 1px solid var(--ck-border); display: flex; align-items: center; justify-content: flex-start; } .ck-modal-title { margin: 0; font-size: 1.25rem; font-weight: 600; color: var(--ck-text); } .ck-modal-close { background: none; border: none; font-size: 1.5rem; cursor: pointer; color: var(--ck-text-muted); padding: 0.25rem; border-radius: 0.25rem; transition: var(--ck-transition); } .ck-modal-close:hover { background-color: #f3f4f6; color: var(--ck-text); } .ck-modal-body { padding: 1.5rem; } .ck-modal-content { color: var(--ck-text-muted); line-height: 1.5; } .ck-modal-footer { padding: 1rem 1.5rem; border-top: 1px solid var(--ck-border); background-color: #f9fafb; display: flex; gap: 0.75rem; justify-content: flex-end; } /* Responsive Design */ @media (max-width: 768px) { .ck-modal { margin: 0.5rem; max-height: calc(100vh - 1rem); } .ck-modal--small, .ck-modal--medium, .ck-modal--large { max-width: none; } .ck-card-footer { flex-direction: column; } .ck-button { width: 100%; justify-content: center; } } /* Animation keyframes */ @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } @keyframes slideUp { from { transform: translateY(20px); opacity: 0; } to { transform: translateY(0); opacity: 1; } } /* Progress Gift Component */ .ck-progress-gift-wrapper { font-family: var(--ck-font-family); background-color: white; border-radius: var(--ck-radius); padding: 1rem 1rem 0.5rem 1rem; border: 1px solid var(--ck-border); box-shadow: var(--ck-shadow); min-height: 6.25rem; height: 6.25rem; width: 100%; /* Адаптивная ширина */ max-width: 800px; /* Максимальная ширина */ min-width: 320px; /* Минимальная ширина для мобильных */ display: flex; flex-direction: column; position: relative; } .ck-progress-version { position: absolute; top: 0; left: 0; font-size: 0.625rem; /* 10px */ color: #000000; /* черный текст */ background: transparent; /* убираем подложку */ padding: 0.125rem 0.375rem; /* 2px 6px */ border-radius: 0; font-family: ui-monospace, SFMono-Regular, 'SF Mono', Consolas, 'Liberation Mono', Menlo, monospace; z-index: 1; user-select: none; pointer-events: none; } /* Progress bar row with gift icon */ .ck-progress-gift-row { display: flex; align-items: center; gap: 0.75rem; margin-bottom: 0; } .ck-progress-gift-icon { font-size: 2rem; transition: none; transform-origin: center; flex-shrink: 0; } /* Анимация полета подарка */ .ck-progress-gift-flying { position: absolute; font-size: 1.5rem; z-index: 100; pointer-events: none; transform-origin: center; } @keyframes giftFly { 0% { transform: translate(var(--start-x), var(--start-y)) scale(1.2) rotate(0deg); opacity: 1; } 15% { transform: translate(calc(var(--start-x) + (var(--end-x) - var(--start-x)) * 0.15), calc(var(--start-y) + (var(--end-y) - var(--start-y)) * 0.05 - 40px)) scale(1.3) rotate(54deg); opacity: 1; } 30% { transform: translate(calc(var(--start-x) + (var(--end-x) - var(--start-x)) * 0.3), calc(var(--start-y) + (var(--end-y) - var(--start-y)) * 0.15 - 70px)) scale(1.25) rotate(108deg); opacity: 1; } 50% { transform: translate(calc(var(--start-x) + (var(--end-x) - var(--start-x)) * 0.5), calc(var(--start-y) + (var(--end-y) - var(--start-y)) * 0.3 - 90px)) scale(1.2) rotate(180deg); opacity: 1; } 70% { transform: translate(calc(var(--start-x) + (var(--end-x) - var(--start-x)) * 0.7), calc(var(--start-y) + (var(--end-y) - var(--start-y)) * 0.6 - 70px)) scale(1.1) rotate(252deg); opacity: 1; } 85% { transform: translate(calc(var(--start-x) + (var(--end-x) - var(--start-x)) * 0.85), calc(var(--start-y) + (var(--end-y) - var(--start-y)) * 0.8 - 30px)) scale(1.05) rotate(306deg); opacity: 1; } 95% { transform: translate(calc(var(--start-x) + (var(--end-x) - var(--start-x)) * 0.95), calc(var(--start-y) + (var(--end-y) - var(--start-y)) * 0.95 - 10px)) scale(1) rotate(342deg); opacity: 1; } 100% { transform: translate(var(--end-x), var(--end-y)) scale(0.9) rotate(360deg); opacity: 0; } } .ck-progress-gift-container { position: relative; height: 100%; display: flex; flex-direction: column; justify-content: flex-start; } .ck-progress-gift-bar { flex: 1; height: 2rem; background-color: var(--ck-secondary); border-radius: var(--ck-radius); overflow: hidden; position: relative; } .ck-progress-gift-fill { height: 100%; background: linear-gradient(90deg, var(--ck-success) 0%, #34d399 50%, var(--ck-success) 100%); border-radius: var(--ck-radius); transition: none; position: relative; width: 0%; } .ck-progress-gift-fill::before { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: linear-gradient(90deg, transparent 0%, rgba(255, 255, 255, 0.3) 50%, transparent 100%); animation: shimmer 2s infinite; } @keyframes shimmer { 0% { transform: translateX(-100%); } 100% { transform: translateX(100%); } } .ck-progress-gift-text { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); text-align: center; font-size: 0.875rem; font-weight: 600; color: white; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.5); z-index: 10; white-space: nowrap; } /* Gifts row styles */ .ck-progress-gifts-row { display: flex; align-items: center; justify-content: flex-start; flex-wrap: nowrap; /* Запрещаем перенос */ gap: 0.25rem; margin-top: 0; height: 1.5rem; min-height: 1.5rem; position: relative; bottom: 0; overflow: hidden; /* Скрываем переполнение */ } .ck-progress-gift-earned { font-size: 1.125rem; opacity: 0; transform: scale(0.5); transition: none; } .ck-progress-gift-earned--visible { opacity: 1; transform: scale(1); } .ck-progress-gifts-overflow { font-size: 0.875rem; font-weight: 600; color: var(--ck-text-muted); background-color: var(--ck-secondary); padding: 0.125rem 0.5rem; border-radius: 1rem; line-height: 1.25; } /* Progress Gift Variants */ .ck-progress-gift-wrapper--compact { padding: 1rem; } .ck-progress-gift-wrapper--compact .ck-progress-gift-bar { height: 1rem; } .ck-progress-gift-wrapper--compact .ck-progress-gift-icon { font-size: 1.5rem; } .ck-progress-gift-wrapper--large { padding: 2rem; } .ck-progress-gift-wrapper--large .ck-progress-gift-bar { height: 2rem; } .ck-progress-gift-wrapper--large .ck-progress-gift-icon { font-size: 2.5rem; } /* Utility classes */ .ck-sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; }