# @design.estate/dees-wcctools
Web Component Development Tools - A powerful framework for building, testing, and documenting web components
## Overview
`@design.estate/dees-wcctools` provides a comprehensive development environment for web components, featuring:
- ๐จ Interactive component catalogue with live preview
- ๐ง Real-time property editing
- ๐ Theme switching (light/dark modes)
- ๐ฑ Responsive viewport testing
- ๐งช Advanced demo tools for component testing
- ๐ Zero-config setup with TypeScript and Lit support
## Installation
```bash
# Using npm
npm install @design.estate/dees-wcctools --save-dev
# Using pnpm (recommended)
pnpm add -D @design.estate/dees-wcctools
```
## Quick Start
### 1. Create Your Component
```typescript
import { DeesElement, customElement, html, css, property } from '@design.estate/dees-element';
@customElement('my-button')
export class MyButton extends DeesElement {
// Define a demo for the catalogue
public static demo = () => html`
`;
@property({ type: String })
public label: string = 'Button';
@property({ type: String })
public variant: 'primary' | 'secondary' = 'primary';
public static styles = [
css`
:host {
display: inline-block;
}
button {
padding: 8px 16px;
border-radius: 4px;
border: none;
font-size: 14px;
cursor: pointer;
transition: all 0.3s;
}
button.primary {
background: #007bff;
color: white;
}
button.secondary {
background: #6c757d;
color: white;
}
button:hover {
opacity: 0.9;
}
`
];
public render() {
return html`
`;
}
}
```
### 2. Set Up Your Catalogue
```typescript
// catalogue.ts
import { setupWccTools } from '@design.estate/dees-wcctools';
import { html } from 'lit';
// Import your components
import './components/my-button.js';
import './components/my-card.js';
// Define elements for the catalogue
const elements = {
'my-button': MyButton,
'my-card': MyCard,
};
// Optionally define pages
const pages = {
'home': () => html`
Welcome to My Component Library
Browse components using the sidebar.
`,
'getting-started': () => html`
Getting Started
Installation and usage instructions...
`,
};
// Initialize the catalogue
setupWccTools(elements, pages);
```
### 3. Create an HTML Entry Point
```html
Component Catalogue
```
## Features
### ๐ฏ Live Property Editing
The properties panel automatically detects and allows editing of:
- **String** properties with text inputs
- **Number** properties with number inputs
- **Boolean** properties with checkboxes
- **Enum** properties with select dropdowns
- **Object** and **Array** properties (read-only display)
### ๐ฑ Viewport Testing
Test your components across different screen sizes:
- **Phone** (320px width)
- **Phablet** (600px width)
- **Tablet** (768px width)
- **Desktop** (full width)
### ๐ Theme Support
Components automatically adapt to light/dark themes using the `goBright` property:
```typescript
public render() {
return html`
`;
}
```
Or use CSS custom properties:
```typescript
import { cssManager } from '@design.estate/dees-element';
public static styles = [
css`
:host {
color: ${cssManager.bdTheme('#000', '#fff')};
background: ${cssManager.bdTheme('#fff', '#000')};
}
`
];
```
### ๐งช Advanced Demo Tools
The demo tools provide enhanced testing capabilities:
```typescript
import * as demoTools from '@design.estate/dees-wcctools/demoTools';
@customElement('my-component')
export class MyComponent extends DeesElement {
public static demo = () => html`
{
// Access the rendered component instance
console.log('Component mounted:', element);
// Simulate user interactions
element.value = 'Test value';
await element.updateComplete;
// Trigger methods
element.handleClick();
// Assert component state
if (element.isValid) {
console.log('Component validation passed');
}
}}>
`;
}
```
### ๐ญ Container Queries Support
Components can respond to their container size:
```typescript
public static styles = [
css`
@container wccToolsViewport (min-width: 768px) {
:host {
flex-direction: row;
}
}
@container wccToolsViewport (max-width: 767px) {
:host {
flex-direction: column;
}
}
`
];
```
## Component Guidelines
### Required for Catalogue Display
1. Components must expose a static `demo` property returning a Lit template
2. Use `@property()` decorators for properties you want to be editable
3. Export component classes for proper detection
### Best Practices
```typescript
@customElement('best-practice-component')
export class BestPracticeComponent extends DeesElement {
// โ Static demo property
public static demo = () => html`
`;
// โ Typed properties with defaults
@property({ type: String })
public title: string = 'Default Title';
// โ Complex property without attribute
@property({ attribute: false })
public complexProp: { key: string } = { key: 'default' };
// โ Enum with proper typing
@property({ type: String })
public variant: 'small' | 'medium' | 'large' = 'medium';
}
```
## URL Routing
The catalogue uses URL routing for deep linking:
```
/wcctools-route/:type/:name/:viewport/:theme
Example:
/wcctools-route/element/my-button/desktop/dark
/wcctools-route/page/home/tablet/bright
```
## Development Workflow
### Build and Watch
```json
{
"scripts": {
"build": "tsbuild tsfolders --allowimplicitany && tsbundle element",
"watch": "tswatch element",
"serve": "http-server ./dist"
}
}
```
### Project Structure
```
my-components/
โโโ src/
โ โโโ components/
โ โ โโโ my-button.ts
โ โ โโโ my-card.ts
โ โโโ catalogue.ts
โโโ dist/
โโโ index.html
โโโ package.json
```
## Advanced Features
### Custom Property Handlers
For complex property types, implement custom logic in your demo:
```typescript
public static demo = () => html`
{
// Set up complex property handling
el.addEventListener('property-change', (e) => {
console.log('Property changed:', e.detail);
});
}}>
`;
```
### Responsive Testing Helpers
```typescript
import * as domtools from '@design.estate/dees-domtools';
public static styles = [
// Media query helpers
domtools.breakpoints.cssForPhone(css`
:host { font-size: 14px; }
`),
domtools.breakpoints.cssForTablet(css`
:host { font-size: 16px; }
`),
domtools.breakpoints.cssForDesktop(css`
:host { font-size: 18px; }
`)
];
```
## API Reference
### setupWccTools(elements, pages?)
Initialize the WCC Tools dashboard.
- `elements`: Object mapping element names to element classes
- `pages`: Optional object mapping page names to template functions
### DeesDemoWrapper
Component for wrapping demos with post-render logic.
- `runAfterRender`: Function called after the wrapped element renders
- Receives the first child element as parameter
- Supports async operations
## Browser Support
- Chrome/Edge (latest)
- Firefox (latest)
- Safari (latest)
- Mobile browsers with Web Components support
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.