This commit is contained in:
2025-06-26 11:57:04 +00:00
parent 09e35d0245
commit 3ea7186d6c
3 changed files with 198 additions and 683 deletions

View File

@@ -1,4 +1,4 @@
import { html, type TemplateResult } from '@design.estate/dees-element';
import { html, type TemplateResult, cssManager } from '@design.estate/dees-element';
import { DeesModal } from '../dees-modal.js';
import { type IBlock } from './wysiwyg.types.js';
import { WysiwygShortcuts } from './wysiwyg.shortcuts.js';
@@ -16,37 +16,56 @@ export class WysiwygModalManager {
heading: 'Select Programming Language',
content: html`
<style>
.language-container {
padding: 16px;
max-height: 400px;
overflow-y: auto;
}
.language-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
gap: 8px;
padding: 16px;
}
.language-button {
padding: 12px;
background: var(--dees-color-box);
border: 1px solid var(--dees-color-line-bright);
border-radius: 4px;
padding: 12px 8px;
background: transparent;
border: 1px solid ${cssManager.bdTheme('#e5e7eb', '#374151')};
border-radius: 6px;
cursor: pointer;
text-align: center;
transition: all 0.2s;
font-size: 13px;
font-weight: 500;
transition: all 0.15s ease;
color: ${cssManager.bdTheme('#374151', '#e5e7eb')};
}
.language-button:hover {
background: var(--dees-color-box-highlight);
border-color: var(--dees-color-primary);
background: ${cssManager.bdTheme('#f9fafb', '#1f2937')};
border-color: ${cssManager.bdTheme('#d1d5db', '#4b5563')};
}
.language-button.selected {
background: ${cssManager.bdTheme('#f3f4f6', '#374151')};
border-color: ${cssManager.bdTheme('#9ca3af', '#6b7280')};
color: ${cssManager.bdTheme('#111827', '#f9fafb')};
}
</style>
<div class="language-grid">
${this.getLanguages().map(lang => html`
<div class="language-button" @click="${(e: MouseEvent) => {
selectedLanguage = lang.toLowerCase();
const modal = (e.target as HTMLElement).closest('dees-modal');
if (modal) {
const okButton = modal.shadowRoot?.querySelector('.bottomButton.ok') as HTMLElement;
if (okButton) okButton.click();
}
}}">${lang}</div>
`)}
<div class="language-container">
<div class="language-grid">
${this.getLanguages().map(lang => html`
<div
class="language-button ${selectedLanguage === lang.toLowerCase() ? 'selected' : ''}"
@click="${() => {
selectedLanguage = lang.toLowerCase();
// Close modal by finding it in DOM
const modal = document.querySelector('dees-modal');
if (modal && typeof (modal as any).destroy === 'function') {
(modal as any).destroy();
}
resolve(selectedLanguage);
}}">
${lang}
</div>
`)}
</div>
</div>
`,
menuOptions: [
@@ -56,13 +75,6 @@ export class WysiwygModalManager {
modal.destroy();
resolve(null);
}
},
{
name: 'OK',
action: async (modal) => {
modal.destroy();
resolve(selectedLanguage);
}
}
]
});
@@ -76,48 +88,61 @@ export class WysiwygModalManager {
block: IBlock,
onUpdate: (block: IBlock) => void
): Promise<void> {
const content = html`
<style>
.settings-container {
padding: 16px;
}
.settings-section {
margin-bottom: 20px;
margin-bottom: 24px;
}
.settings-section:last-child {
margin-bottom: 0;
}
.settings-label {
font-weight: 500;
margin-bottom: 8px;
color: var(--dees-color-text);
color: ${cssManager.bdTheme('#6b7280', '#9ca3af')};
font-size: 12px;
text-transform: uppercase;
letter-spacing: 0.05em;
}
.block-type-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
gap: 8px;
margin-bottom: 16px;
}
.block-type-button {
padding: 12px;
background: var(--dees-color-box);
border: 1px solid var(--dees-color-line-bright);
border-radius: 4px;
background: transparent;
border: 1px solid ${cssManager.bdTheme('#e5e7eb', '#374151')};
border-radius: 6px;
cursor: pointer;
text-align: center;
transition: all 0.2s;
text-align: left;
transition: all 0.15s ease;
display: flex;
align-items: center;
gap: 8px;
font-size: 13px;
color: ${cssManager.bdTheme('#374151', '#e5e7eb')};
}
.block-type-button:hover {
background: var(--dees-color-box-highlight);
border-color: var(--dees-color-primary);
background: ${cssManager.bdTheme('#f9fafb', '#1f2937')};
border-color: ${cssManager.bdTheme('#d1d5db', '#4b5563')};
}
.block-type-button.selected {
background: var(--dees-color-primary);
color: white;
background: ${cssManager.bdTheme('#f3f4f6', '#374151')};
border-color: ${cssManager.bdTheme('#9ca3af', '#6b7280')};
color: ${cssManager.bdTheme('#111827', '#f9fafb')};
}
.block-type-icon {
font-weight: 600;
font-weight: 500;
font-size: 16px;
width: 20px;
text-align: center;
flex-shrink: 0;
opacity: 0.7;
}
</style>
<div class="settings-container">
@@ -131,7 +156,7 @@ export class WysiwygModalManager {
content,
menuOptions: [
{
name: 'Close',
name: 'Done',
action: async (modal) => {
modal.destroy();
}
@@ -147,57 +172,55 @@ export class WysiwygModalManager {
block: IBlock,
onUpdate: (block: IBlock) => void
): TemplateResult {
const currentLanguage = block.metadata?.language || 'plain text';
const currentLanguage = block.metadata?.language || 'javascript';
return html`
<style>
.settings-section {
margin-bottom: 16px;
}
.settings-label {
font-weight: 500;
margin-bottom: 8px;
}
.language-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 8px;
grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
gap: 6px;
}
.language-button {
padding: 8px;
background: var(--dees-color-box);
border: 1px solid var(--dees-color-line-bright);
padding: 8px 4px;
background: transparent;
border: 1px solid ${cssManager.bdTheme('#e5e7eb', '#374151')};
border-radius: 4px;
cursor: pointer;
text-align: center;
transition: all 0.2s;
transition: all 0.15s ease;
font-size: 12px;
color: ${cssManager.bdTheme('#374151', '#e5e7eb')};
}
.language-button:hover {
background: var(--dees-color-box-highlight);
border-color: var(--dees-color-primary);
background: ${cssManager.bdTheme('#f9fafb', '#1f2937')};
border-color: ${cssManager.bdTheme('#d1d5db', '#4b5563')};
}
.language-button.selected {
background: var(--dees-color-primary);
color: white;
background: ${cssManager.bdTheme('#f3f4f6', '#374151')};
border-color: ${cssManager.bdTheme('#9ca3af', '#6b7280')};
color: ${cssManager.bdTheme('#111827', '#f9fafb')};
}
</style>
<div class="settings-section">
<div class="settings-label">Programming Language</div>
<div class="language-grid">
${this.getLanguages().map(lang => html`
<div class="language-button ${currentLanguage === lang.toLowerCase() ? 'selected' : ''}"
@click="${(e: MouseEvent) => {
<div
class="language-button ${currentLanguage === lang.toLowerCase() ? 'selected' : ''}"
@click="${() => {
if (!block.metadata) block.metadata = {};
block.metadata.language = lang.toLowerCase();
onUpdate(block);
// Close modal
const modal = (e.target as HTMLElement).closest('dees-modal');
if (modal) {
const closeButton = modal.shadowRoot?.querySelector('.bottomButton') as HTMLElement;
if (closeButton) closeButton.click();
// Close modal immediately
const modal = document.querySelector('dees-modal');
if (modal && typeof (modal as any).destroy === 'function') {
(modal as any).destroy();
}
}}">${lang}</div>
}}"
data-lang="${lang}"
>${lang}</div>
`)}
</div>
</div>
@@ -228,6 +251,8 @@ export class WysiwygModalManager {
<div
class="block-type-button ${block.type === item.type ? 'selected' : ''}"
@click="${async (e: MouseEvent) => {
const button = e.currentTarget as HTMLElement;
const oldType = block.type;
block.type = item.type as IBlock['type'];
@@ -252,11 +277,10 @@ export class WysiwygModalManager {
onUpdate(block);
// Close modal after selection
const modal = (e.target as HTMLElement).closest('dees-modal');
if (modal) {
const closeButton = modal.shadowRoot?.querySelector('.bottomButton') as HTMLElement;
if (closeButton) closeButton.click();
// Close modal immediately
const modal = document.querySelector('dees-modal');
if (modal && typeof (modal as any).destroy === 'function') {
(modal as any).destroy();
}
}}"
>