Compare commits

...

3 Commits

Author SHA1 Message Date
578f87a8f9 1.0.94
Some checks failed
Default (tags) / security (push) Failing after 46s
Default (tags) / test (push) Failing after 40s
Default (tags) / release (push) Has been skipped
Default (tags) / metadata (push) Has been skipped
2025-06-16 14:36:44 +00:00
0acf341071 1.0.93
Some checks failed
Default (tags) / security (push) Failing after 48s
Default (tags) / test (push) Failing after 40s
Default (tags) / release (push) Has been skipped
Default (tags) / metadata (push) Has been skipped
2025-06-16 14:35:32 +00:00
87bbf0bbdc fix(demotools): update DeesDemoWrapper to handle multiple slotted elements in runAfterRender callback 2025-06-16 14:35:28 +00:00
5 changed files with 58 additions and 35 deletions

View File

@ -1,11 +1,11 @@
{ {
"name": "@design.estate/dees-wcctools", "name": "@design.estate/dees-wcctools",
"version": "1.0.92", "version": "1.0.94",
"private": false, "private": false,
"description": "A set of web component tools for creating element catalogues, enabling the structured development and documentation of custom elements and pages.", "description": "A set of web component tools for creating element catalogues, enabling the structured development and documentation of custom elements and pages.",
"exports": { "exports": {
".": "./dist_ts_web/index.js", ".": "./dist_ts_web/index.js",
"./demoTools": "./dist_ts_demotools" "./demotools": "./dist_ts_demotools"
}, },
"type": "module", "type": "module",
"scripts": { "scripts": {

View File

@ -30,22 +30,30 @@ A utility component for wrapping demo elements with post-render functionality.
**Usage:** **Usage:**
```typescript ```typescript
import { DeesDemoWrapper } from '@design.estate/dees-wcctools/demoTools'; import * as demoTools from '@design.estate/dees-wcctools/demotools';
// In your demo function: // In your demo function:
demo: () => html` demo: () => html`
<dees-demowrapper .runAfterRender=${(element) => { <dees-demowrapper .runAfterRender=${(children: HTMLCollection) => {
// Do something with the rendered element // Access all slotted elements
element.setAttribute('data-demo', 'true'); const firstElement = children[0] as HTMLElement;
console.log('Element rendered:', element); firstElement.setAttribute('data-demo', 'true');
console.log('All slotted elements:', children);
// Work with multiple elements
Array.from(children).forEach(child => {
console.log('Element rendered:', child);
});
}}> }}>
<my-custom-element></my-custom-element> <my-custom-element></my-custom-element>
<div>Additional content</div>
</dees-demowrapper> </dees-demowrapper>
` `
``` ```
**Features:** **Features:**
- Wraps demo elements without affecting layout (uses `display: contents`) - Wraps demo elements without affecting layout (uses `display: contents`)
- Provides access to the rendered element instance after mounting - Provides access to ALL slotted elements via HTMLCollection after mounting
- Supports async operations in runAfterRender callback - Supports async operations in runAfterRender callback
- Automatically handles timing to ensure element is fully rendered - Automatically handles timing to ensure elements are fully rendered
- Can handle multiple slotted elements, not just the first one

View File

@ -178,28 +178,33 @@ public static styles = [
The demo tools provide enhanced testing capabilities: The demo tools provide enhanced testing capabilities:
```typescript ```typescript
import * as demoTools from '@design.estate/dees-wcctools/demoTools'; import * as demoTools from '@design.estate/dees-wcctools/demotools';
@customElement('my-component') @customElement('my-component')
export class MyComponent extends DeesElement { export class MyComponent extends DeesElement {
public static demo = () => html` public static demo = () => html`
<dees-demowrapper .runAfterRender=${async (element: MyComponent) => { <dees-demowrapper .runAfterRender=${async (children: HTMLCollection) => {
// Access the rendered component instance // Access all slotted elements
console.log('Component mounted:', element); console.log('Slotted elements:', children.length);
// Access specific element (e.g., first child)
const myComponent = children[0] as MyComponent;
console.log('Component mounted:', myComponent);
// Simulate user interactions // Simulate user interactions
element.value = 'Test value'; myComponent.value = 'Test value';
await element.updateComplete; await myComponent.updateComplete;
// Trigger methods // Trigger methods
element.handleClick(); myComponent.handleClick();
// Assert component state // Work with multiple elements if present
if (element.isValid) { Array.from(children).forEach((child, index) => {
console.log('Component validation passed'); console.log(`Child ${index}:`, child.tagName);
} });
}}> }}>
<my-component></my-component> <my-component></my-component>
<div>Additional content</div>
</dees-demowrapper> </dees-demowrapper>
`; `;
} }
@ -304,10 +309,12 @@ For complex property types, implement custom logic in your demo:
```typescript ```typescript
public static demo = () => html` public static demo = () => html`
<dees-demowrapper .runAfterRender=${(el) => { <dees-demowrapper .runAfterRender=${(children) => {
// Set up complex property handling // Set up complex property handling for all children
el.addEventListener('property-change', (e) => { Array.from(children).forEach(child => {
console.log('Property changed:', e.detail); child.addEventListener('property-change', (e) => {
console.log('Property changed:', e.detail);
});
}); });
}}> }}>
<my-component></my-component> <my-component></my-component>
@ -346,9 +353,10 @@ Initialize the WCC Tools dashboard.
### DeesDemoWrapper ### DeesDemoWrapper
Component for wrapping demos with post-render logic. Component for wrapping demos with post-render logic.
- `runAfterRender`: Function called after the wrapped element renders - `runAfterRender`: Function called after the wrapped elements render
- Receives the first child element as parameter - Receives the complete HTMLCollection of all slotted elements
- Supports async operations - Supports async operations
- Access individual elements via array index or Array.from()
## Browser Support ## Browser Support
- Chrome/Edge (latest) - Chrome/Edge (latest)

View File

@ -34,11 +34,11 @@ The properties panel has timing issues detecting rendered elements because:
## Created DeesDemoWrapper Component ## Created DeesDemoWrapper Component
- Location: ts_demotools/demotools.ts - Location: ts_demotools/demotools.ts
- Allows wrapping demo elements with post-render functionality - Allows wrapping demo elements with post-render functionality
- Provides runAfterRender callback that receives the rendered element - Provides runAfterRender callback that receives ALL slotted elements as HTMLCollection
- Uses display: contents to not affect layout - Uses display: contents to not affect layout
- Handles timing automatically with 50ms delay after firstUpdated - Handles timing automatically with 50ms delay after firstUpdated
- Supports both sync and async callbacks - Supports both sync and async callbacks
- Exports available at @design.estate/dees-wcctools/demoTools - Exports available at @design.estate/dees-wcctools/demotools (lowercase)
# Documentation Update (COMPLETED) # Documentation Update (COMPLETED)
@ -51,3 +51,12 @@ The properties panel has timing issues detecting rendered elements because:
- API reference - API reference
- Browser support information - Browser support information
- Complete examples for all major features - Complete examples for all major features
# Enhanced DemoWrapper (COMPLETED)
## Modified runAfterRender callback:
- Now receives HTMLCollection of ALL slotted elements instead of just the first one
- Allows access to complete slotted DOM structure
- Updated documentation with correct import path (lowercase 'demotools')
- Examples show how to work with multiple slotted elements
- Maintains backward compatibility by accessing elements via index

View File

@ -3,7 +3,7 @@ import { DeesElement, customElement, html, css, property, type TemplateResult }
@customElement('dees-demowrapper') @customElement('dees-demowrapper')
export class DeesDemoWrapper extends DeesElement { export class DeesDemoWrapper extends DeesElement {
@property({ attribute: false }) @property({ attribute: false })
public runAfterRender: (element: HTMLElement) => void | Promise<void>; public runAfterRender: (children: HTMLCollection) => void | Promise<void>;
public static styles = [ public static styles = [
css` css`
@ -25,14 +25,12 @@ export class DeesDemoWrapper extends DeesElement {
// Wait a bit for slotted content to render // Wait a bit for slotted content to render
await new Promise(resolve => setTimeout(resolve, 50)); await new Promise(resolve => setTimeout(resolve, 50));
// Find the first element child (excluding text nodes) // Get all slotted elements
const slottedElements = this.children; const slottedElements = this.children;
if (slottedElements.length > 0 && this.runAfterRender) { if (slottedElements.length > 0 && this.runAfterRender) {
const firstElement = slottedElements[0] as HTMLElement; // Call the runAfterRender function with all slotted elements
// Call the runAfterRender function with the element
try { try {
await this.runAfterRender(firstElement); await this.runAfterRender(slottedElements);
} catch (error) { } catch (error) {
console.error('Error in runAfterRender:', error); console.error('Error in runAfterRender:', error);
} }