slideshare/public/themes/default/style.css
Michael Mainguy 72cce3af0f Add Mermaid diagram support with dedicated diagram-slide layout
- Implement complete Mermaid.js integration for rich diagram rendering
- Add diagram-slide.html layout with title, diagram, and notes slots
- Create diagramProcessor.ts with async rendering and error handling
- Add comprehensive SVG element support to HTML sanitizer
- Implement async template rendering system for diagram processing
- Add SlidePreview component with loading states for better UX
- Support all major Mermaid diagram types (flowchart, sequence, gantt, pie, etc.)
- Add dark theme integration with custom color scheme
- Include diagram-specific styling and responsive design
- Add diagram field editor with syntax highlighting styling

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-22 05:41:50 -05:00

878 lines
18 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: #9563eb;
--theme-secondary: #94748b;
--theme-accent: #eea5e9;
--theme-background: #001112;
--theme-text: #ffffff;
--theme-text-secondary: #94a4ab;
--theme-font-heading: 'Inter', system-ui, sans-serif;
--theme-font-body: 'Inter', system-ui, sans-serif;
--theme-font-code: '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-primary);
font-family: var(--theme-font-body);
padding: var(--slide-padding);
box-sizing: border-box;
display: flex;
flex-direction: column;
position: relative;
overflow: hidden;
/* 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;
}
.slot[data-slot="image"] {
width: 100%;
}
.slot[data-slot="image"] img {
width: 100%;
}
.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;
}
.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;
}
.slot[data-type="image"] {
display: flex;
align-items: center;
justify-content: center;
background: #fffffd;
border-radius: 8px;
}
.slot[data-type="image"] img {
max-width: 100px;
max-height: 100px;
border-radius: 4px;
}
.slot[data-slot="title"] {
font-size: clamp(5rem, 8vw, 4rem);
margin-bottom: 2rem;
width: 80%;
text-align: center;
}
.slot[data-slot="subtitle"] {
font-size: clamp(1rem, 4vw, 2rem);
color: var(--theme-text-secondary);
width: 100%;
max-width: 80%;
text-align: center;
}
.content-blocks-container {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 2rem;
flex: 1;
align-items: stretch;
width: 100%;
}
.slot[data-slot="content"],
.slot[data-slot="content1"],
.slot[data-slot="content2"] {
font-size: clamp(0.9rem, 2.2vw, 1.1rem);
text-align: left;
width: 100%;
line-height: 1.6;
padding: 2rem;
color: var(--theme-text-secondary);
}
/* 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%;
}
/* 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;
}
}
.fade-in {
opacity: 1;
animation-name: fadeInOpacity;
animation-iteration-count: 1;
animation-timing-function: ease-in;
animation-duration: 1s;
}
.fade-in-slow {
opacity: 0;
animation-name: fadeInOpacity;
animation-iteration-count: 1;
animation-timing-function: ease-in;
animation-duration: 2s;
animation-delay: 1s;
animation-fill-mode: forwards;
}
@keyframes fadeInOpacity {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
/* Enhanced code blocks with syntax highlighting */
.slide-code {
background: #1e1e1e !important;
border: 1px solid var(--theme-secondary);
border-radius: 8px;
padding: 1.5rem;
margin: 1.5em 0;
overflow-x: auto;
font-family: var(--theme-font-code);
font-size: clamp(0.75rem, 1.5vw, 0.9rem);
line-height: 1.4;
position: relative;
}
.slide-code code {
background: none !important;
padding: 0 !important;
color: #e6e6e6;
font-family: inherit;
}
/* Prism.js syntax highlighting theme for slides */
.token.comment,
.token.prolog,
.token.doctype,
.token.cdata {
color: #6a9955;
font-style: italic;
}
.token.punctuation {
color: #d4d4d4;
}
.token.property,
.token.tag,
.token.boolean,
.token.number,
.token.constant,
.token.symbol,
.token.deleted {
color: #b5cea8;
}
.token.selector,
.token.attr-name,
.token.string,
.token.char,
.token.builtin,
.token.inserted {
color: #ce9178;
}
.token.operator,
.token.entity,
.token.url,
.language-css .token.string,
.style .token.string {
color: #d4d4d4;
}
.token.atrule,
.token.attr-value,
.token.keyword {
color: #569cd6;
}
.token.function,
.token.class-name {
color: #dcdcaa;
}
.token.regex,
.token.important,
.token.variable {
color: #d16969;
}
.token.important,
.token.bold {
font-weight: bold;
}
.token.italic {
font-style: italic;
}
/* Language labels for code blocks */
.slide-code::before {
content: attr(class);
position: absolute;
top: 0.5rem;
right: 1rem;
font-size: 0.75rem;
color: var(--theme-text-secondary);
text-transform: uppercase;
letter-spacing: 0.5px;
opacity: 0.7;
}
.slide-code.language-javascript::before { content: 'JavaScript'; }
.slide-code.language-typescript::before { content: 'TypeScript'; }
.slide-code.language-python::before { content: 'Python'; }
.slide-code.language-bash::before { content: 'Bash'; }
.slide-code.language-json::before { content: 'JSON'; }
.slide-code.language-css::before { content: 'CSS'; }
.slide-code.language-markup::before { content: 'HTML'; }
.slide-code.language-html::before { content: 'HTML'; }
.slide-code.language-sql::before { content: 'SQL'; }
.slide-code.language-yaml::before { content: 'YAML'; }
/* Mermaid diagram styling */
.mermaid-container {
margin: 2rem 0;
padding: 1rem;
background: rgba(255, 255, 255, 0.05);
border-radius: 8px;
border: 1px solid var(--theme-secondary);
text-align: center;
overflow-x: auto;
}
.mermaid-diagram {
max-width: 100%;
height: auto;
}
.mermaid-diagram svg {
max-width: 100%;
height: auto;
background: transparent;
}
.mermaid-error {
color: #ff6b6b;
background: rgba(255, 107, 107, 0.1);
padding: 1rem;
border-radius: 4px;
border: 1px solid #ff6b6b;
font-family: var(--theme-font-code);
font-size: 0.9rem;
}
/* Enhanced slide callouts */
.slide-callout {
background: rgba(149, 116, 235, 0.15);
border-left: 4px solid var(--theme-primary);
padding: 1rem 1.5rem;
margin: 1.5em 0;
border-radius: 0 8px 8px 0;
font-style: italic;
color: var(--theme-text);
position: relative;
}
.slide-callout::before {
content: '💡';
position: absolute;
left: -12px;
top: 50%;
transform: translateY(-50%);
background: var(--theme-background);
padding: 0.25rem;
border-radius: 50%;
font-style: normal;
}
/* Enhanced slide lists */
.slide-list {
margin: 1.5em 0;
padding-left: 2rem;
}
.slide-list li {
margin: 0.75em 0;
color: var(--theme-text);
line-height: 1.6;
position: relative;
}
.slide-list li::marker {
color: var(--theme-accent);
font-weight: 600;
}
/* Enhanced slide tables */
.slide-table-wrapper {
margin: 2rem 0;
overflow-x: auto;
border-radius: 8px;
border: 1px solid var(--theme-secondary);
}
.slide-table {
width: 100%;
border-collapse: collapse;
background: rgba(255, 255, 255, 0.02);
}
.slide-table th,
.slide-table td {
padding: 0.75rem 1rem;
text-align: left;
border-bottom: 1px solid var(--theme-secondary);
}
.slide-table th {
background: rgba(149, 116, 235, 0.2);
font-weight: 600;
color: var(--theme-primary);
border-bottom: 2px solid var(--theme-primary);
}
.slide-table tr:nth-child(even) {
background: rgba(255, 255, 255, 0.03);
}
.slide-table tr:hover {
background: rgba(149, 116, 235, 0.1);
}
/* JavaScript syntax highlighting with Prism.js */
.language-javascript,
.code-block,
.markdown-content pre,
.markdown-content code {
background: #1e1e1e;
border: 1px solid var(--theme-secondary);
border-radius: 8px;
padding: 1.5rem;
margin: 1.5em 0;
overflow-x: auto;
font-family: var(--theme-font-code);
font-size: clamp(0.75rem, 1.5vw, 0.9rem);
line-height: 1.4;
position: relative;
white-space: pre-wrap;
display: block;
}
.language-javascript code,
.code-block code {
background: none;
padding: 0;
color: #e6e6e6;
font-family: inherit;
}
/* JavaScript-specific Prism tokens */
.language-javascript .token.comment,
.language-javascript .token.prolog,
.language-javascript .token.doctype,
.language-javascript .token.cdata,
.markdown-content .token.comment,
.markdown-content .token.prolog,
.markdown-content .token.doctype,
.markdown-content .token.cdata {
color: #6a9955;
font-style: italic;
}
.language-javascript .token.punctuation {
color: #d4d4d4;
}
.language-javascript .token.property,
.language-javascript .token.tag,
.language-javascript .token.boolean,
.language-javascript .token.number,
.language-javascript .token.constant,
.language-javascript .token.symbol,
.language-javascript .token.deleted {
color: #b5cea8;
}
.language-javascript .token.selector,
.language-javascript .token.attr-name,
.language-javascript .token.string,
.language-javascript .token.char,
.language-javascript .token.builtin,
.language-javascript .token.inserted {
color: #ce9178;
}
.language-javascript .token.operator,
.language-javascript .token.entity,
.language-javascript .token.url {
color: #d4d4d4;
}
.language-javascript .token.atrule,
.language-javascript .token.attr-value,
.language-javascript .token.keyword {
color: #569cd6;
}
.language-javascript .token.function,
.language-javascript .token.class-name {
color: #dcdcaa;
}
.language-javascript .token.regex,
.language-javascript .token.important,
.language-javascript .token.variable {
color: #d16969;
}
.language-javascript .token.important,
.language-javascript .token.bold {
font-weight: bold;
}
.language-javascript .token.italic {
font-style: italic;
}
/* Universal token styles for markdown content */
.markdown-content .token.punctuation { color: #d4d4d4; }
.markdown-content .token.property,
.markdown-content .token.tag,
.markdown-content .token.boolean,
.markdown-content .token.number,
.markdown-content .token.constant,
.markdown-content .token.symbol,
.markdown-content .token.deleted { color: #b5cea8; }
.markdown-content .token.selector,
.markdown-content .token.attr-name,
.markdown-content .token.string,
.markdown-content .token.char,
.markdown-content .token.builtin,
.markdown-content .token.inserted { color: #ce9178; }
.markdown-content .token.operator,
.markdown-content .token.entity,
.markdown-content .token.url { color: #d4d4d4; }
.markdown-content .token.atrule,
.markdown-content .token.attr-value,
.markdown-content .token.keyword { color: #569cd6; }
.markdown-content .token.function,
.markdown-content .token.class-name { color: #dcdcaa; }
.markdown-content .token.regex,
.markdown-content .token.important,
.markdown-content .token.variable { color: #d16969; }
.markdown-content .token.parameter { color: #9cdcfe; }
.markdown-content .token.important,
.markdown-content .token.bold { font-weight: bold; }
.markdown-content .token.italic { font-style: italic; }
/* Language label */
.language-javascript::before {
content: 'JavaScript';
position: absolute;
top: 0.5rem;
right: 1rem;
font-size: 0.75rem;
color: var(--theme-text-secondary);
text-transform: uppercase;
letter-spacing: 0.5px;
opacity: 0.7;
}
/* Code slide layout */
.layout-code-slide,
.slide-container .layout-code-slide {
justify-content: flex-start;
align-items: stretch;
text-align: left;
padding: 2rem;
}
.layout-code-slide .slot[data-slot="title"] {
font-size: clamp(1.5rem, 4vw, 2rem);
margin-bottom: 1.5rem;
text-align: center;
color: var(--theme-text);
}
.layout-code-slide .slot[data-slot="code"] {
flex: 1;
margin-bottom: 1rem;
}
.layout-code-slide .slot[data-slot="notes"] {
font-size: clamp(0.9rem, 2vw, 1rem);
color: var(--theme-text-secondary);
line-height: 1.5;
text-align: left;
}
/* Code slot styling - now targets the pre element */
pre.slot[data-type="code"],
pre.code-content {
background: #1e1e1e !important;
border: 1px solid var(--theme-secondary);
border-radius: 8px;
padding: 1.5rem;
margin: 0;
overflow-x: auto;
font-family: var(--theme-font-code);
font-size: clamp(0.75rem, 1.5vw, 0.9rem);
line-height: 1.4;
color: #e6e6e6;
position: relative;
white-space: pre !important;
display: block !important;
text-align: left !important;
}
/* Override any inherited slot styles for code elements */
pre.slot[data-type="code"] * {
white-space: inherit;
display: inline;
}
/* Ensure spans from highlighting don't break lines */
pre.slot[data-type="code"] .hljs-keyword,
pre.slot[data-type="code"] .hljs-string,
pre.slot[data-type="code"] .hljs-number,
pre.slot[data-type="code"] .hljs-comment,
pre.slot[data-type="code"] .hljs-function,
pre.slot[data-type="code"] .hljs-variable,
pre.slot[data-type="code"] .hljs-punctuation,
pre.slot[data-type="code"] .hljs-operator,
pre.slot[data-type="code"] span {
display: inline !important;
white-space: inherit !important;
}
pre.slot[data-type="code"]::before,
pre.code-content::before {
content: 'JavaScript';
position: absolute;
top: 0.5rem;
right: 1rem;
font-size: 0.75rem;
color: var(--theme-text-secondary);
text-transform: uppercase;
letter-spacing: 0.5px;
opacity: 0.7;
font-family: var(--theme-font-body);
}
/* Highlight.js token colors (VS Code Dark theme) */
.hljs-keyword,
.hljs-built_in,
.hljs-type,
.hljs-literal { color: #569cd6; }
.hljs-string,
.hljs-regexp { color: #ce9178; }
.hljs-number { color: #b5cea8; }
.hljs-comment {
color: #6a9955;
font-style: italic;
}
.hljs-function .hljs-title,
.hljs-title.function_ { color: #dcdcaa; }
.hljs-variable,
.hljs-params { color: #9cdcfe; }
.hljs-punctuation,
.hljs-operator { color: #d4d4d4; }
.hljs-attr,
.hljs-property { color: #92c5f7; }
.hljs-tag,
.hljs-name { color: #569cd6; }
.hljs-attribute { color: #9cdcfe; }
/* Code editor textarea styling */
.field-textarea.code-field {
font-family: var(--theme-font-code);
font-size: 0.9rem;
line-height: 1.4;
background: #1a1a1a;
color: #e6e6e6;
border: 1px solid var(--theme-secondary);
border-radius: 4px;
padding: 0.75rem;
white-space: pre;
tab-size: 2;
}
.field-textarea.code-field::placeholder {
color: #6a6a6a;
font-style: italic;
}
/* Diagram editor textarea styling */
.field-textarea.diagram-field {
font-family: var(--theme-font-code);
font-size: 0.9rem;
line-height: 1.4;
background: #0f1419;
color: #e6e6e6;
border: 1px solid var(--theme-accent);
border-radius: 4px;
padding: 0.75rem;
white-space: pre;
tab-size: 2;
}
.field-textarea.diagram-field::placeholder {
color: #6a6a6a;
font-style: italic;
}
/* Diagram slide layout */
.layout-diagram-slide,
.slide-container .layout-diagram-slide {
justify-content: flex-start;
align-items: stretch;
text-align: center;
padding: 2rem;
}
.layout-diagram-slide .slot[data-slot="title"] {
font-size: clamp(1.5rem, 4vw, 2rem);
margin-bottom: 1.5rem;
text-align: center;
color: var(--theme-text);
}
.layout-diagram-slide .slot[data-slot="diagram"] {
flex: 1;
margin-bottom: 1rem;
display: flex;
align-items: center;
justify-content: center;
}
.layout-diagram-slide .slot[data-slot="notes"] {
font-size: clamp(0.9rem, 2vw, 1rem);
color: var(--theme-text-secondary);
line-height: 1.5;
text-align: center;
max-height: 20vh;
overflow-y: auto;
}
/* Enhanced Mermaid diagram styling */
.mermaid-container {
margin: 1rem 0;
padding: 1.5rem;
background: rgba(255, 255, 255, 0.02);
border-radius: 12px;
border: 1px solid var(--theme-secondary);
text-align: center;
overflow: hidden;
width: 100%;
max-width: 100%;
}
.mermaid-diagram {
max-width: 100%;
height: auto;
display: flex;
align-items: center;
justify-content: center;
}
.mermaid-diagram svg {
max-width: 100%;
height: auto;
background: transparent;
border-radius: 8px;
}
.diagram-error {
color: #ff6b6b;
background: rgba(255, 107, 107, 0.1);
padding: 1.5rem;
border-radius: 8px;
border: 1px solid #ff6b6b;
font-family: var(--theme-font-code);
font-size: 0.9rem;
text-align: left;
}
.diagram-error strong {
display: block;
margin-bottom: 0.5rem;
color: #ff8a8a;
}
.error-content {
background: rgba(0, 0, 0, 0.2);
padding: 0.75rem;
border-radius: 4px;
margin-top: 0.75rem;
white-space: pre-wrap;
font-size: 0.8rem;
overflow-x: auto;
}
/* Preview loading states */
.preview-loading,
.slide-loading {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
display: flex;
flex-direction: column;
align-items: center;
gap: 1rem;
color: var(--theme-text-secondary);
font-size: 0.9rem;
z-index: 10;
}
.loading-spinner {
width: 2rem;
height: 2rem;
border: 2px solid var(--theme-secondary);
border-top: 2px solid var(--theme-accent);
border-radius: 50%;
animation: spin 1s linear infinite;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
/* Responsive adjustments for enhanced features */
@media (max-width: 768px) {
.layout-code-slide {
padding: 1rem;
}
.hljs-code,
.hljs-code pre,
.hljs-code code {
padding: 1rem;
font-size: 0.8rem;
}
.hljs-code::before {
font-size: 0.7rem;
}
}