UNPKG

@slidef/cli

Version:

CLI tool for converting PDF slides to web-viewable format

608 lines (526 loc) 11.4 kB
/* Close button - top right */ .close-container { position: fixed; top: 0; right: 0; z-index: var(--z-controls); padding: var(--spacing-md); opacity: 0; transition: opacity var(--transition-normal); pointer-events: none; } body.controls-visible .close-container { opacity: 1; pointer-events: auto; } /* Menu - bottom right */ .menu-container { position: fixed; bottom: 0; right: 0; z-index: var(--z-controls); padding: var(--spacing-md); display: flex; gap: var(--spacing-sm); opacity: 0; transition: opacity var(--transition-normal); pointer-events: none; } body.controls-visible .menu-container { opacity: 1; pointer-events: auto; } .icon-button { display: flex; align-items: center; justify-content: center; width: 44px; height: 44px; border-radius: 50%; border: none; cursor: pointer; /* Apple Liquid Glass effect */ background: linear-gradient( 135deg, rgba(255, 255, 255, 0.4) 0%, rgba(255, 255, 255, 0.25) 100% ); backdrop-filter: blur(20px) saturate(180%); -webkit-backdrop-filter: blur(20px) saturate(180%); /* Subtle borders and shadows */ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.15), 0 2px 8px rgba(0, 0, 0, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.5), inset 0 -1px 0 rgba(0, 0, 0, 0.05), 0 0 0 0.5px rgba(255, 255, 255, 0.2); /* Smooth transitions */ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); /* Icon color */ color: rgba(0, 0, 0, 0.75); } .icon-button:hover { background: linear-gradient( 135deg, rgba(255, 255, 255, 0.5) 0%, rgba(255, 255, 255, 0.35) 100% ); box-shadow: 0 12px 48px rgba(0, 0, 0, 0.2), 0 4px 12px rgba(0, 0, 0, 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.6), inset 0 -1px 0 rgba(0, 0, 0, 0.05), 0 0 0 0.5px rgba(255, 255, 255, 0.3); transform: translateY(-1px); } .icon-button:active { transform: translateY(0) scale(0.96); box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15), 0 1px 4px rgba(0, 0, 0, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.4), inset 0 -1px 0 rgba(0, 0, 0, 0.05), 0 0 0 0.5px rgba(255, 255, 255, 0.2); } /* Slide container */ .slide-container { position: fixed; top: 0; left: 0; right: 0; bottom: 0; display: flex; align-items: center; justify-content: center; padding: 0; /* No padding - fullscreen */ background-color: #333333; overflow: hidden; } .slides-wrapper { position: relative; width: 100%; height: 100%; display: flex; align-items: center; transition: transform 0.3s ease-out; } .slide-image { position: absolute; max-width: 100%; max-height: 100%; object-fit: contain; user-select: none; -webkit-user-drag: none; flex-shrink: 0; } .slide-prev { left: -100%; } .slide-current { left: 0; right: 0; margin: 0 auto; } .slide-next { right: -100%; left: auto; } /* Scroll container */ .scroll-container { position: fixed; top: 0; left: 0; right: 0; bottom: 0; overflow-y: auto; overflow-x: hidden; background-color: #b2b2b2; padding: var(--spacing-md) 0; } .scroll-slide { width: 100%; max-width: 1200px; margin: 0 auto var(--spacing-md) auto; display: block; } .scroll-slide:last-child { margin-bottom: 0; } /* Hide slide container in scroll mode */ body.scroll-mode .slide-container { display: none; } body.scroll-mode .scroll-container { display: block; } /* Hide navigation areas in scroll mode */ body.scroll-mode .nav-area { display: none; } /* Show progress bar in scroll mode */ body.scroll-mode .progress-container { opacity: 1; pointer-events: auto; } /* Click areas for navigation */ .nav-area { position: fixed; top: 0; bottom: 0; width: 30%; z-index: 5; cursor: pointer; } .nav-area-prev { left: 0; cursor: w-resize; } .nav-area-next { right: 0; cursor: e-resize; } .nav-area:disabled { cursor: not-allowed; opacity: 0.5; } /* Navigation buttons - hidden, we use click areas instead */ .nav-button { display: none; } /* Progress bar - bottom of screen */ .progress-container { position: fixed; bottom: 0; left: 0; right: 0; z-index: var(--z-progress); opacity: 0; transition: opacity var(--transition-normal); pointer-events: none; } body.controls-visible .progress-container { opacity: 1; pointer-events: auto; } .progress-bar { position: relative; height: 4px; background: var(--progress-bg); cursor: pointer; transition: height var(--transition-fast); } .progress-bar:hover { height: 6px; } .progress-fill { position: absolute; top: 0; left: 0; height: 100%; background: var(--progress-fill); transition: width var(--transition-fast); } /* Thumbnail preview */ .thumbnail-preview { position: absolute; bottom: calc(100% + var(--spacing-sm)); left: 50%; transform: translateX(-50%); padding: var(--spacing-xs); background: var(--thumbnail-bg); border: 1px solid var(--border-color); border-radius: 8px; box-shadow: 0 4px 12px var(--thumbnail-shadow); pointer-events: none; z-index: var(--z-thumbnail); } .thumbnail-image { max-width: 200px; max-height: 150px; display: block; border-radius: 4px; } .thumbnail-number { text-align: center; margin-top: var(--spacing-xs); font-size: 0.75rem; color: var(--text-secondary); } /* Loading state */ .slide-image[src=""] { display: none; } /* Responsive */ @media (max-width: 768px) { .slide-title { font-size: 1rem; } .nav-button { width: 50px; height: 50px; } .thumbnail-image { max-width: 150px; max-height: 112px; } } /* Share Modal */ .share-modal { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0, 0, 0, 0.7); display: flex; align-items: center; justify-content: center; z-index: 100; backdrop-filter: blur(4px); } .share-modal-content { background: var(--bg-primary); border-radius: 12px; width: 90%; max-width: 600px; max-height: 80vh; overflow-y: auto; box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3); } .share-modal-header { display: flex; justify-content: space-between; align-items: center; padding: var(--spacing-lg); border-bottom: 1px solid var(--border-color); } .share-modal-header h2 { font-size: 1.5rem; font-weight: 600; margin: 0; } .modal-close-button { display: flex; align-items: center; justify-content: center; width: 32px; height: 32px; border-radius: 50%; background: var(--bg-secondary); transition: background var(--transition-fast); } .modal-close-button:hover { background: var(--border-color); } .share-modal-body { padding: var(--spacing-lg); } .share-option { margin-bottom: var(--spacing-lg); } .share-option:last-child { margin-bottom: 0; } .share-option h3 { font-size: 1rem; font-weight: 600; margin-bottom: var(--spacing-xs); } .share-option p { color: var(--text-secondary); font-size: 0.875rem; margin-bottom: var(--spacing-sm); } .share-mode-options { display: flex; gap: var(--spacing-md); margin-bottom: var(--spacing-sm); } .share-mode-option { display: flex; align-items: center; gap: var(--spacing-xs); cursor: pointer; padding: var(--spacing-sm); border: 1px solid var(--border-color); border-radius: 6px; flex: 1; transition: background var(--transition-fast), border-color var(--transition-fast); } .share-mode-option:hover { background: var(--bg-secondary); } .share-mode-option input[type="radio"] { cursor: pointer; } .share-mode-option input[type="radio"]:checked + span { font-weight: 600; } .share-mode-option:has(input[type="radio"]:checked) { border-color: var(--progress-fill); background: rgba(160, 32, 240, 0.05); } .share-input-group { display: flex; gap: var(--spacing-sm); } .share-input, .share-textarea { flex: 1; padding: var(--spacing-sm); border: 1px solid var(--border-color); border-radius: 6px; font-family: 'Monaco', 'Menlo', 'Consolas', monospace; font-size: 0.875rem; background: var(--bg-secondary); color: var(--text-primary); } .share-textarea { min-height: 80px; resize: vertical; } .copy-button { padding: var(--spacing-sm) var(--spacing-md); background: var(--text-primary); color: var(--bg-primary); border-radius: 6px; font-weight: 500; transition: opacity var(--transition-fast); } .copy-button:hover { opacity: 0.8; } .copy-button:active { transform: scale(0.95); } /* Overview Modal */ .overview-modal { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0, 0, 0, 0.85); backdrop-filter: blur(8px); z-index: 100; } .overview-modal-content { position: fixed; top: 0; left: 0; right: 0; bottom: 0; overflow-y: auto; overflow-x: hidden; padding: var(--spacing-md); padding-top: calc(var(--spacing-md) + 60px); } .overview-modal-header { position: fixed; top: var(--spacing-lg); right: var(--spacing-lg); z-index: 101; } .overview-modal-header .modal-close-button { /* Brighter version for dark background */ background: linear-gradient( 135deg, rgba(255, 255, 255, 0.95) 0%, rgba(255, 255, 255, 0.85) 100% ); box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.2), inset 0 1px 0 rgba(255, 255, 255, 1), inset 0 -1px 0 rgba(0, 0, 0, 0.1), 0 0 0 0.5px rgba(255, 255, 255, 0.5); } .overview-modal-header .modal-close-button:hover { background: linear-gradient( 135deg, rgba(255, 255, 255, 1) 0%, rgba(255, 255, 255, 0.95) 100% ); box-shadow: 0 12px 48px rgba(0, 0, 0, 0.5), 0 4px 12px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 1), inset 0 -1px 0 rgba(0, 0, 0, 0.1), 0 0 0 0.5px rgba(255, 255, 255, 0.6); } .overview-modal-header h2 { display: none; } .overview-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: var(--spacing-lg); width: 100%; } .overview-slide { position: relative; cursor: pointer; border: 2px solid transparent; border-radius: 8px; overflow: hidden; transition: transform var(--transition-fast), border-color var(--transition-fast); background: var(--bg-secondary); } .overview-slide:hover { transform: scale(1.05); border-color: var(--progress-fill); } .overview-slide.active { border-color: var(--progress-fill); box-shadow: 0 0 0 3px rgba(76, 175, 80, 0.2); } .overview-slide-image { width: 100%; aspect-ratio: 16 / 9; object-fit: contain; background: #f0f0f0; display: block; } .overview-slide-number { position: absolute; bottom: 8px; right: 8px; background: rgba(0, 0, 0, 0.8); color: white; padding: 4px 8px; border-radius: 4px; font-size: 0.75rem; font-weight: 600; } /* Loading spinner */ .slide-image.loading { opacity: 0; } .slide-loading { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 48px; height: 48px; border: 4px solid rgba(255, 255, 255, 0.2); border-top-color: rgba(255, 255, 255, 0.8); border-radius: 50%; animation: spin 0.8s linear infinite; z-index: 10; } @keyframes spin { to { transform: translate(-50%, -50%) rotate(360deg); } } @media (max-width: 768px) { .overview-grid { grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: var(--spacing-sm); } /* Hide fullscreen button on mobile */ #fullscreen-toggle { display: none; } }