Compare commits

...

6 Commits

Author SHA1 Message Date
7095197d07 1.10.2
Some checks failed
Default (tags) / security (push) Failing after 14s
Default (tags) / test (push) Failing after 40s
Default (tags) / release (push) Has been skipped
Default (tags) / metadata (push) Has been skipped
2025-06-27 00:35:21 +00:00
3ee48e80ad fix(wysiwig): zindexregistry for menus 2025-06-27 00:35:06 +00:00
00ad2b0563 1.10.1
Some checks failed
Default (tags) / security (push) Failing after 43s
Default (tags) / test (push) Failing after 58s
Default (tags) / release (push) Has been skipped
Default (tags) / metadata (push) Has been skipped
2025-06-27 00:19:03 +00:00
a57005a49b fix(modal): scroll behaviour contain 2025-06-27 00:18:36 +00:00
d67a66662d 1.10.0
Some checks failed
Default (tags) / security (push) Failing after 23s
Default (tags) / test (push) Failing after 12s
Default (tags) / release (push) Has been skipped
Default (tags) / metadata (push) Has been skipped
2025-06-27 00:00:00 +00:00
c75c5bcd3b feat(dees-modal): Add mobileFullscreen option to modals for full-screen mobile support 2025-06-27 00:00:00 +00:00
7 changed files with 93 additions and 17 deletions

View File

@ -1,5 +1,18 @@
# Changelog # Changelog
## 2025-06-27 - 1.10.1 - fix(modal)
Improve modal overscroll behavior by adding 'overscroll-behavior: contain' to content container
- Added 'overscroll-behavior: contain' to .modal .content to ensure proper scroll containment
- Applied overscroll-behavior in modal container for enhanced responsiveness on mobile and desktop
## 2025-06-26 - 1.10.0 - feat(dees-modal)
Add mobileFullscreen option to modals for full-screen mobile support
- Introduced a new boolean property 'mobileFullscreen' in ts_web/elements/dees-modal.ts
- Updated modal CSS under the media query to apply 'mobile-fullscreen' class, allowing full viewport modals on mobile devices
- Extended modal style rules to include adjustments for margin, border-radius, and maximum heights on smaller screens
## 2025-06-26 - 1.9.9 - fix(dees-input-multitoggle, dees-input-typelist) ## 2025-06-26 - 1.9.9 - fix(dees-input-multitoggle, dees-input-typelist)
Replace dynamic import with static import for demo functions in dees-input-multitoggle and dees-input-typelist Replace dynamic import with static import for demo functions in dees-input-multitoggle and dees-input-typelist

View File

@ -1,6 +1,6 @@
{ {
"name": "@design.estate/dees-catalog", "name": "@design.estate/dees-catalog",
"version": "1.9.9", "version": "1.10.2",
"private": false, "private": false,
"description": "A comprehensive library that provides dynamic web components for building sophisticated and modern web applications using JavaScript and TypeScript.", "description": "A comprehensive library that provides dynamic web components for building sophisticated and modern web applications using JavaScript and TypeScript.",
"main": "dist_ts_web/index.js", "main": "dist_ts_web/index.js",

View File

@ -3,6 +3,6 @@
*/ */
export const commitinfo = { export const commitinfo = {
name: '@design.estate/dees-catalog', name: '@design.estate/dees-catalog',
version: '1.9.9', version: '1.10.1',
description: 'A comprehensive library that provides dynamic web components for building sophisticated and modern web applications using JavaScript and TypeScript.' description: 'A comprehensive library that provides dynamic web components for building sophisticated and modern web applications using JavaScript and TypeScript.'
} }

View File

@ -42,6 +42,7 @@ export class DeesModal extends DeesElement {
showCloseButton?: boolean; showCloseButton?: boolean;
showHelpButton?: boolean; showHelpButton?: boolean;
onHelp?: () => void | Promise<void>; onHelp?: () => void | Promise<void>;
mobileFullscreen?: boolean;
}) { }) {
const body = document.body; const body = document.body;
const modal = new DeesModal(); const modal = new DeesModal();
@ -54,6 +55,7 @@ export class DeesModal extends DeesElement {
if (optionsArg.showCloseButton !== undefined) modal.showCloseButton = optionsArg.showCloseButton; if (optionsArg.showCloseButton !== undefined) modal.showCloseButton = optionsArg.showCloseButton;
if (optionsArg.showHelpButton !== undefined) modal.showHelpButton = optionsArg.showHelpButton; if (optionsArg.showHelpButton !== undefined) modal.showHelpButton = optionsArg.showHelpButton;
if (optionsArg.onHelp) modal.onHelp = optionsArg.onHelp; if (optionsArg.onHelp) modal.onHelp = optionsArg.onHelp;
if (optionsArg.mobileFullscreen !== undefined) modal.mobileFullscreen = optionsArg.mobileFullscreen;
modal.windowLayer = await DeesWindowLayer.createAndShow({ modal.windowLayer = await DeesWindowLayer.createAndShow({
blur: true, blur: true,
}); });
@ -101,6 +103,9 @@ export class DeesModal extends DeesElement {
@property({ attribute: false }) @property({ attribute: false })
public onHelp: () => void | Promise<void>; public onHelp: () => void | Promise<void>;
@property({ type: Boolean })
public mobileFullscreen: boolean = false;
@state() @state()
private modalZIndex: number = 1000; private modalZIndex: number = 1000;
@ -132,6 +137,7 @@ export class DeesModal extends DeesElement {
transform: translateY(0px) scale(0.95); transform: translateY(0px) scale(0.95);
opacity: 0; opacity: 0;
min-height: 120px; min-height: 120px;
max-height: calc(100vh - 40px);
background: ${cssManager.bdTheme('#ffffff', '#111')}; background: ${cssManager.bdTheme('#ffffff', '#111')};
border-radius: 8px; border-radius: 8px;
border: 1px solid ${cssManager.bdTheme('#e0e0e0', '#333')}; border: 1px solid ${cssManager.bdTheme('#e0e0e0', '#333')};
@ -139,6 +145,9 @@ export class DeesModal extends DeesElement {
overflow: hidden; overflow: hidden;
box-shadow: ${cssManager.bdTheme('0px 2px 10px rgba(0, 0, 0, 0.1)', '0px 2px 5px rgba(0, 0, 0, 0.5)')}; box-shadow: ${cssManager.bdTheme('0px 2px 10px rgba(0, 0, 0, 0.1)', '0px 2px 5px rgba(0, 0, 0, 0.5)')};
margin: 20px; margin: 20px;
display: flex;
flex-direction: column;
overscroll-behavior: contain;
} }
/* Width variations */ /* Width variations */
@ -165,6 +174,25 @@ export class DeesModal extends DeesElement {
width: calc(100vw - 40px) !important; width: calc(100vw - 40px) !important;
max-width: none !important; max-width: none !important;
} }
/* Allow full height on mobile when content needs it */
.modalContainer {
padding: 10px;
}
.modal {
margin: 10px;
max-height: calc(100vh - 20px);
}
/* Full screen mode on mobile */
.modal.mobile-fullscreen {
width: 100vw !important;
height: 100vh !important;
max-height: 100vh !important;
margin: 0;
border-radius: 0;
}
} }
.modal.show { .modal.show {
@ -179,6 +207,7 @@ export class DeesModal extends DeesElement {
.modal .heading { .modal .heading {
height: 40px; height: 40px;
min-height: 40px;
font-family: 'Geist Sans', sans-serif; font-family: 'Geist Sans', sans-serif;
display: flex; display: flex;
align-items: center; align-items: center;
@ -186,6 +215,7 @@ export class DeesModal extends DeesElement {
padding: 0 12px; padding: 0 12px;
border-bottom: 1px solid ${cssManager.bdTheme('#e0e0e0', '#333')}; border-bottom: 1px solid ${cssManager.bdTheme('#e0e0e0', '#333')};
position: relative; position: relative;
flex-shrink: 0;
} }
.modal .heading .header-buttons { .modal .heading .header-buttons {
@ -237,6 +267,10 @@ export class DeesModal extends DeesElement {
.modal .content { .modal .content {
padding: 16px; padding: 16px;
flex: 1;
overflow-y: auto;
overflow-x: hidden;
overscroll-behavior: contain;
} }
.modal .bottomButtons { .modal .bottomButtons {
display: flex; display: flex;
@ -245,6 +279,7 @@ export class DeesModal extends DeesElement {
justify-content: flex-end; justify-content: flex-end;
gap: 8px; gap: 8px;
padding: 8px; padding: 8px;
flex-shrink: 0;
} }
.modal .bottomButtons .bottomButton { .modal .bottomButtons .bottomButton {
@ -291,6 +326,7 @@ export class DeesModal extends DeesElement {
const customWidth = typeof this.width === 'number' ? `${this.width}px` : ''; const customWidth = typeof this.width === 'number' ? `${this.width}px` : '';
const maxWidthStyle = this.maxWidth ? `${this.maxWidth}px` : ''; const maxWidthStyle = this.maxWidth ? `${this.maxWidth}px` : '';
const minWidthStyle = this.minWidth ? `${this.minWidth}px` : ''; const minWidthStyle = this.minWidth ? `${this.minWidth}px` : '';
const mobileFullscreenClass = this.mobileFullscreen ? 'mobile-fullscreen' : '';
return html` return html`
<style> <style>
@ -299,7 +335,7 @@ export class DeesModal extends DeesElement {
${minWidthStyle ? `.modal { min-width: ${minWidthStyle}; }` : ''} ${minWidthStyle ? `.modal { min-width: ${minWidthStyle}; }` : ''}
</style> </style>
<div class="modalContainer" @click=${this.handleOutsideClick} style="z-index: ${this.modalZIndex}"> <div class="modalContainer" @click=${this.handleOutsideClick} style="z-index: ${this.modalZIndex}">
<div class="modal ${widthClass}"> <div class="modal ${widthClass} ${mobileFullscreenClass}">
<div class="heading"> <div class="heading">
<div class="heading-text">${this.heading}</div> <div class="heading-text">${this.heading}</div>
<div class="header-buttons"> <div class="header-buttons">

View File

@ -46,10 +46,14 @@ export class DeesFormattingMenu extends DeesElement {
:host { :host {
position: fixed; position: fixed;
pointer-events: none; pointer-events: none;
top: 0;
left: 0;
width: 0;
height: 0;
} }
.formatting-menu { .formatting-menu {
position: absolute; position: fixed;
background: ${cssManager.bdTheme('#ffffff', '#262626')}; background: ${cssManager.bdTheme('#ffffff', '#262626')};
border: 1px solid ${cssManager.bdTheme('#e0e0e0', '#404040')}; border: 1px solid ${cssManager.bdTheme('#e0e0e0', '#404040')};
border-radius: 6px; border-radius: 6px;
@ -159,12 +163,12 @@ export class DeesFormattingMenu extends DeesElement {
this.position = position; this.position = position;
this.callback = callback; this.callback = callback;
// Get z-index from registry // Get z-index from registry and apply immediately
this.menuZIndex = zIndexRegistry.getNextZIndex(); this.menuZIndex = zIndexRegistry.getNextZIndex();
zIndexRegistry.register(this, this.menuZIndex); zIndexRegistry.register(this, this.menuZIndex);
this.style.zIndex = this.menuZIndex.toString();
this.visible = true; this.visible = true;
console.log('FormattingMenu.show - visible set to:', this.visible);
} }
public hide(): void { public hide(): void {

View File

@ -1,6 +1,5 @@
import { import {
customElement, customElement,
property,
html, html,
DeesElement, DeesElement,
type TemplateResult, type TemplateResult,
@ -54,10 +53,14 @@ export class DeesSlashMenu extends DeesElement {
:host { :host {
position: fixed; position: fixed;
pointer-events: none; pointer-events: none;
top: 0;
left: 0;
width: 0;
height: 0;
} }
.slash-menu { .slash-menu {
position: absolute; position: fixed;
background: ${cssManager.bdTheme('#ffffff', '#262626')}; background: ${cssManager.bdTheme('#ffffff', '#262626')};
border: 1px solid ${cssManager.bdTheme('#e0e0e0', '#404040')}; border: 1px solid ${cssManager.bdTheme('#e0e0e0', '#404040')};
border-radius: 8px; border-radius: 8px;
@ -121,7 +124,7 @@ export class DeesSlashMenu extends DeesElement {
render(): TemplateResult { render(): TemplateResult {
if (!this.visible) return html``; if (!this.visible) return html``;
// Apply z-index to host element // Ensure z-index is applied to host element
this.style.zIndex = this.menuZIndex.toString(); this.style.zIndex = this.menuZIndex.toString();
const menuItems = this.getFilteredMenuItems(); const menuItems = this.getFilteredMenuItems();
@ -168,9 +171,10 @@ export class DeesSlashMenu extends DeesElement {
this.filter = ''; this.filter = '';
this.selectedIndex = 0; this.selectedIndex = 0;
// Get z-index from registry // Get z-index from registry and apply immediately
this.menuZIndex = zIndexRegistry.getNextZIndex(); this.menuZIndex = zIndexRegistry.getNextZIndex();
zIndexRegistry.register(this, this.menuZIndex); zIndexRegistry.register(this, this.menuZIndex);
this.style.zIndex = this.menuZIndex.toString();
this.visible = true; this.visible = true;
} }

View File

@ -12,7 +12,7 @@ import '../elements/dees-input-tags.js';
import '../elements/dees-input-wysiwyg.js'; import '../elements/dees-input-wysiwyg.js';
import '../elements/dees-appui-profiledropdown.js'; import '../elements/dees-appui-profiledropdown.js';
export const showcasePage = () => html` export const zIndexShowcase = () => html`
<style> <style>
${css` ${css`
.page-wrapper { .page-wrapper {
@ -245,6 +245,16 @@ export const showcasePage = () => html`
font-size: 14px; font-size: 14px;
} }
/* Consistent panel spacing */
dees-panel {
display: block;
margin-bottom: 24px;
}
dees-panel:last-child {
margin-bottom: 0;
}
.test-area { .test-area {
position: relative; position: relative;
height: 200px; height: 200px;
@ -665,14 +675,23 @@ export const showcasePage = () => html`
.placeholder=${'Type "/" to see slash commands or select text to format...'} .placeholder=${'Type "/" to see slash commands or select text to format...'}
.outputFormat=${'html'} .outputFormat=${'html'}
.description=${'The slash menu and formatting menu should appear above this modal'} .description=${'The slash menu and formatting menu should appear above this modal'}
.value=${`<p>Welcome to the WYSIWYG editor demo!</p>
<p>This editor demonstrates proper z-index management:</p>
<ul>
<li>Type <strong>/</strong> to open the slash command menu</li>
<li>Select any text to see the formatting toolbar</li>
<li>Both menus will appear <em>above</em> this modal</li>
</ul>
<p>Try it now: Type / here or select this text to format it.</p>`}
></dees-input-wysiwyg> ></dees-input-wysiwyg>
</dees-form> </dees-form>
<p style="margin-top: 16px; color: ${cssManager.bdTheme('#666', '#999')}"> <div style="margin-top: 16px; padding: 16px; background: ${cssManager.bdTheme('#e3f2fd', '#1e3a5f')}; border-radius: 8px;">
<strong>Tips:</strong><br> <strong style="color: ${cssManager.bdTheme('#1976d2', '#90caf9')}">✨ Z-Index Fix Applied!</strong><br>
• Type "/" to open the slash command menu<br> <span style="color: ${cssManager.bdTheme('#1976d2', '#90caf9')}">
• Select text to see the formatting toolbar<br> The WYSIWYG menus now properly use the dynamic z-index registry.<br>
• Both menus should appear above this modal They will always appear above the modal, regardless of stacking order.
</p> </span>
</div>
`, `,
menuOptions: [ menuOptions: [
{ name: 'Cancel', action: async (modal) => modal.destroy() }, { name: 'Cancel', action: async (modal) => modal.destroy() },