slideshare/public/themes/default/style.css
Michael Mainguy c51931af9c Add image upload functionality for slide editing
- Create ImageUploadField component with file upload and URL input
- Support base64 encoding for local IndexedDB storage
- Add image preview, replacement, and removal functionality
- Update SlideEditor to use ImageUploadField for image slots
- Include file validation (5MB limit, image types only)
- Add responsive design and error handling
- Integrate with existing theme system and slot detection

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-21 09:45:24 -05:00

327 lines
6.9 KiB
CSS

/*
* Theme: Default
* Name: Default Theme
* Description: Clean and simple theme suitable for any presentation
* Author: Michael Mainguy (mike.mainguy@gmail.com)
* Version: 0.1.0
*/
:root {
--theme-primary: #2563eb;
--theme-secondary: #64748b;
--theme-accent: #0ea5e9;
--theme-background: #000000;
--theme-text: #ffffff;
--theme-text-secondary: #64748b;
--theme-font-heading: 'Inter', system-ui, sans-serif;
--theme-font-body: 'Inter', system-ui, sans-serif;
--theme-font-code: 'JetBrains Mono', 'Consolas', monospace;
--slide-padding: 5%;
--content-max-width: 90%;
}
/* Base slide styling - works with global .slide-container classes */
.slide-container .slide-content,
.slide {
width: 100%;
height: 100%;
background: var(--theme-background);
color: var(--theme-text);
font-family: var(--theme-font-body);
padding: var(--slide-padding);
box-sizing: border-box;
display: flex;
flex-direction: column;
position: relative;
overflow: hidden;
justify-content: center;
align-items: center;
/* Ensure content is properly centered within container */
text-align: center;
}
/* Master slide elements */
.master-slide {
position: absolute;
z-index: 1;
}
.master-slide.footer {
bottom: 0;
left: 0;
right: 0;
padding: 1rem;
text-align: center;
font-size: 0.875rem;
opacity: 0.6;
}
/* Slot styles */
.slot {
position: relative;
border: 2px dashed transparent;
min-height: 2rem;
transition: border-color 0.2s ease;
width: 100%;
max-width: var(--content-max-width);
margin: 0 auto;
/* Ensure slot content inherits proper centering */
text-align: inherit;
}
#main-image {
scale: .7;
}
.slot:hover,
.slot.editing {
border-color: var(--theme-accent);
border-radius: 4px;
}
.slot.empty {
border-color: var(--theme-secondary);
opacity: 0.5;
display: flex;
align-items: center;
justify-content: center;
}
.slot.empty::before {
content: attr(data-placeholder);
color: var(--theme-text-secondary);
font-style: italic;
}
/* Text slots */
.slot[data-type="title"] {
font-family: var(--theme-font-heading);
font-weight: bold;
line-height: 1.2;
text-align: center;
}
.slot[data-type="subtitle"] {
font-family: var(--theme-font-heading);
line-height: 1.4;
opacity: 0.8;
text-align: center;
}
.content-slot {
color: var(--theme-text-secondary);
background-color: var(--theme-background);
}
.slot[data-type="text"] {
line-height: 1.6;
/* Text content can be left-aligned for readability */
text-align: left;
}
/* Image slots */
.slot[data-type="image"] {
display: flex;
align-items: center;
justify-content: center;
background: #f8fafc;
border-radius: 8px;
}
.slot[data-type="image"] img {
max-width: 100%;
max-height: 100%;
object-fit: contain;
border-radius: 4px;
}
/* Layout-specific styles */
/* Title slide layout */
.layout-title-slide,
.slide-container .layout-title-slide {
justify-content: center;
align-items: center;
text-align: center;
}
.layout-title-slide .slot[data-slot="title"] {
font-size: clamp(2rem, 8vw, 4rem);
margin-bottom: 2rem;
width: 100%;
max-width: 80%;
color: var(--theme-primary);
text-align: center;
}
.layout-title-slide .slot[data-slot="subtitle"] {
font-size: clamp(1rem, 4vw, 2rem);
color: var(--theme-text-secondary);
width: 100%;
max-width: 80%;
text-align: center;
}
/* Content slide layout */
.layout-content-slide,
.slide-container .layout-content-slide {
justify-content: flex-start;
align-items: stretch;
/* Reset text alignment for content slides */
text-align: initial;
}
.layout-content-slide .slot[data-slot="title"] {
font-size: clamp(1.5rem, 6vw, 2.5rem);
margin-bottom: 2rem;
padding-bottom: 1rem;
border-bottom: 2px solid var(--theme-primary);
text-align: center;
width: 100%;
}
.layout-content-slide .slot[data-slot="subtitle"] {
font-size: clamp(1rem, 2vw, .5rem);
text-align: right;
width: 50%;
}
.layout-content-slide .slot[data-slot="content"] {
font-size: clamp(1rem, 2.5vw, 1.25rem);
flex: 1;
text-align: left;
width: 100%;
line-height: 1.6;
/* Ensure content doesn't get too wide */
max-width: 100%;
margin: 0 auto;
}
/* Two content blocks layout */
.layout-2-content-blocks,
.slide-container .layout-2-content-blocks {
justify-content: flex-start;
align-items: stretch;
/* Reset text alignment for two-column slides */
text-align: initial;
}
.layout-2-content-blocks .slot[data-slot="title"] {
font-size: clamp(1.5rem, 5vw, 2.5rem);
margin-bottom: 2rem;
padding-bottom: 1rem;
border-bottom: 2px solid var(--theme-primary);
text-align: center;
width: 100%;
}
.content-blocks-container {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 2rem;
flex: 1;
align-items: stretch;
width: 100%;
}
.layout-2-content-blocks .slot[data-slot="content1"],
.layout-2-content-blocks .slot[data-slot="content2"] {
font-size: clamp(0.9rem, 2.2vw, 1.1rem);
text-align: left;
width: 100%;
line-height: 1.6;
padding: 1rem;
background: rgba(255, 255, 255, 0.05);
border-radius: 0.5rem;
border: 1px solid rgba(255, 255, 255, 0.1);
}
/* Image slide layout */
.layout-image-slide,
.slide-container .layout-image-slide {
justify-content: flex-start;
align-items: stretch;
}
.layout-image-slide .slot[data-slot="title"] {
font-size: clamp(1.5rem, 6vw, 2.5rem);
margin-bottom: 2rem;
text-align: center;
width: 100%;
}
.layout-image-slide .slot[data-slot="image"] {
flex: 1;
margin-top: 1rem;
width: 100%;
display: flex;
align-items: center;
justify-content: center;
}
/* Aspect ratio specific adjustments */
.slide-container.aspect-16-9 .slide-content,
.slide-container.aspect-16-9 .slide {
--slide-padding: 4%;
--content-max-width: 85%;
}
.slide-container.aspect-4-3 .slide-content,
.slide-container.aspect-4-3 .slide {
--slide-padding: 6%;
--content-max-width: 80%;
}
.slide-container.aspect-16-10 .slide-content,
.slide-container.aspect-16-10 .slide {
--slide-padding: 5%;
--content-max-width: 85%;
}
/* Responsive adjustments */
@media (max-width: 768px) {
:root {
--slide-padding: 3%;
--content-max-width: 95%;
}
.layout-title-slide .slot[data-slot="title"] {
margin-bottom: 1rem;
font-size: clamp(1.5rem, 6vw, 3rem);
}
.layout-content-slide .slot[data-slot="title"] {
margin-bottom: 1rem;
font-size: clamp(1.2rem, 5vw, 2rem);
}
.layout-image-slide .slot[data-slot="title"] {
font-size: clamp(1.2rem, 5vw, 2rem);
}
/* Two content blocks responsive adjustments */
.content-blocks-container {
grid-template-columns: 1fr;
gap: 1rem;
}
.layout-2-content-blocks .slot[data-slot="content1"],
.layout-2-content-blocks .slot[data-slot="content2"] {
font-size: clamp(0.8rem, 2vw, 1rem);
padding: 0.75rem;
}
}
/* Print styles for presentations */
@media print {
.slide {
page-break-after: always;
width: 100%;
height: 100vh;
}
.slot {
border: none !important;
}
.slot.empty::before {
display: none;
}
}