Compare commits

..

12 Commits

Author SHA1 Message Date
69840de3a6 v3.41.0
Some checks failed
Default (tags) / security (push) Failing after 1s
Default (tags) / test (push) Failing after 1s
Default (tags) / release (push) Has been skipped
Default (tags) / metadata (push) Has been skipped
2026-01-27 12:36:46 +00:00
85badfbd21 feat(docs): document new media & tile components and expand Workspace/IDE component docs; update component count to 90+ 2026-01-27 12:36:46 +00:00
264e460365 v3.40.0
Some checks failed
Default (tags) / security (push) Failing after 1s
Default (tags) / test (push) Failing after 1s
Default (tags) / release (push) Has been skipped
Default (tags) / metadata (push) Has been skipped
2026-01-27 11:36:24 +00:00
bfda6b75e7 feat(dees-tile): unify tile badge styling and markup; replace component-specific badge classes with shared tile-badge classes and update related imports/tests 2026-01-27 11:36:24 +00:00
825a74b810 v3.39.1
Some checks failed
Default (tags) / security (push) Failing after 1s
Default (tags) / test (push) Failing after 1s
Default (tags) / release (push) Has been skipped
Default (tags) / metadata (push) Has been skipped
2026-01-27 11:10:39 +00:00
f6bf0f8a45 fix(dees-tile-note): use horizontal pointer position to scroll note body by computing percentage from clientX and element width instead of clientY and height 2026-01-27 11:10:39 +00:00
66661e05a9 v3.39.0
Some checks failed
Default (tags) / security (push) Failing after 1s
Default (tags) / test (push) Failing after 1s
Default (tags) / release (push) Has been skipped
Default (tags) / metadata (push) Has been skipped
2026-01-27 10:57:42 +00:00
162688cdb5 feat(components): add large set of new UI components and demos, reorganize groups, and bump a few dependencies 2026-01-27 10:57:42 +00:00
8158b791c7 v3.38.0
Some checks failed
Default (tags) / security (push) Failing after 1s
Default (tags) / test (push) Failing after 1s
Default (tags) / release (push) Has been skipped
Default (tags) / metadata (push) Has been skipped
2026-01-26 01:28:31 +00:00
ed8167385f feat(appui): add app shell and bottom bar APIs, new input components, and update README component listings and docs 2026-01-26 01:28:31 +00:00
b472057e9d v3.37.1
Some checks failed
Default (tags) / security (push) Failing after 1s
Default (tags) / test (push) Failing after 1s
Default (tags) / release (push) Has been skipped
Default (tags) / metadata (push) Has been skipped
2026-01-25 13:51:54 +00:00
1bbf853043 fix(editor): fix monaco/editor layout, update dev deps, simplify watch script and remove Playwright snapshots 2026-01-25 13:51:54 +00:00
291 changed files with 7007 additions and 3089 deletions

3
.gitignore vendored
View File

@@ -16,4 +16,5 @@ node_modules/
dist/ dist/
dist_*/ dist_*/
# custom # custom
.playwright-mcp/

Binary file not shown.

Before

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

View File

@@ -1,5 +1,61 @@
# Changelog # Changelog
## 2026-01-27 - 3.41.0 - feat(docs)
document new media & tile components and expand Workspace/IDE component docs; update component count to 90+
- Updated README component count from 70+ to 90+.
- Added Media & Tile components documentation (DeesTilePdf, DeesTileImage, DeesTileAudio, DeesTileVideo, DeesTileNote, DeesTileFolder, DeesPreview, DeesPdfViewer, DeesImageViewer, DeesAudioViewer, DeesVideoViewer).
- Expanded Workspace/IDE documentation and introduced workspace subcomponents (DeesWorkspace, DeesWorkspaceMonaco, DeesWorkspaceDiffEditor, DeesWorkspaceFiletree, DeesWorkspaceTerminal, DeesWorkspaceTerminalPreview, DeesWorkspaceMarkdown, DeesWorkspaceMarkdownoutlet, DeesWorkspaceBottombar).
- Enhanced Contextmenu docs to demonstrate nested submenus and programmatic API usage.
- Added ITileFolderItem interface example for tile folder items.
## 2026-01-27 - 3.40.0 - feat(dees-tile)
unify tile badge styling and markup; replace component-specific badge classes with shared tile-badge classes and update related imports/tests
- Add shared badge styles: .tile-badge-corner, .tile-badge-topright, .tile-badge and layout rules in dees-tile-shared/styles.ts
- Update tile components (audio, video, image, folder, note, pdf) to use new badge markup and remove duplicated badge CSS
- Shift badge positioning when a tile label is present (.tile-container:has(.tile-label))
- Remove older per-component badge rules (duration-badge, item-count-badge, dimension-badge, note-language/note-line-indicator, preview-page-indicator) and replace with unified classes
- Update tests to import dees-contextmenu and dees-dashboardgrid from new 00group-overlay / 00group-layout paths to reflect folder reorganization
## 2026-01-27 - 3.39.1 - fix(dees-tile-note)
use horizontal pointer position to scroll note body by computing percentage from clientX and element width instead of clientY and height
- Changed ts_web/elements/00group-media/dees-tile-note/component.ts: use x = e.clientX - rect.left and percentage = x / rect.width to drive scrollTop calculation instead of using vertical coordinates
- Fixes incorrect scroll mapping where vertical mouse position was used for horizontal scrolling interaction
## 2026-01-27 - 3.39.0 - feat(components)
add large set of new UI components and demos, reorganize groups, and bump a few dependencies
- Add Media viewers: dees-image-viewer, dees-audio-viewer, dees-video-viewer, DeesPdf/DeesPdfViewer and related PDF utilities (CanvasPool, PdfManager) and demos
- Introduce dees-preview composite that auto-detects content and delegates to appropriate viewers
- New Tile system (DeesTileBase) and tile components: dees-tile-pdf, dees-tile-image, dees-tile-audio, dees-tile-video, dees-tile-note, dees-tile-folder plus demos
- Add dashboard/grid system: dees-dashboardgrid with drag/resize, collision resolution, layout helpers, demos and utilities
- Data view additions: dees-table with lucene-like query parser, column utilities, and dees-statsgrid enhancements (including cpuCores visualization)
- New feedback & overlay components: dees-toast, dees-actionbar, dees-progressbar, dees-spinner, dees-badge and supporting demos/interfaces
- Many layout and utility components added or improved: dees-panel, dees-chips, dees-heading, dees-label, dees-pagination, dees-stepper, and associated demos
- Refactor project structure: components organized into 00group-* directories and demo metadata migrated from demoGroup to demoGroups (string[]); many import path updates to match new grouping
- Deprecations/notes: dees-pdf-preview and legacy dees-pdf marked as deprecated in favor of new viewers/tiles
- Dependency bumps in package.json: @design.estate/dees-wcctools -> ^3.8.0, @git.zone/tstest -> ^3.1.8
## 2026-01-26 - 3.38.0 - feat(appui)
add app shell and bottom bar APIs, new input components, and update README component listings and docs
- README: updated components count (80+ → 70+), reorganized categories (added App Shell / Pre-built Templates, renamed Workspace/IDE) and improved typography
- Document listing: added DeesActionbar, DeesInputToggle, DeesInputCode, DeesAppuiBottombar and other component entries
- Menu item interface: added closeable and onClose properties for dismissible menu items
- IViewDefinition: expanded content type to accept element constructors and async content, added badgeVariant and cache flags
- New interfaces added: IBottomBarWidget, IBottomBarAction, IViewActivationContext to support bottom bar widgets/actions and view activation context
## 2026-01-25 - 3.37.1 - fix(editor)
fix monaco/editor layout, update dev deps, simplify watch script and remove Playwright snapshots
- Make dees-input-code host and inner wrappers flex so Monaco editor grows to fill available height (set flex, min-height and height:100% where needed).
- Set dees-workspace-monaco and editor-wrapper to stretch so the embedded Monaco editor fills the component.
- Bump dev dependencies: @git.zone/tsbuild -> ^4.1.2, @git.zone/tsbundle -> ^2.8.3, @git.zone/tstest -> ^3.1.7, @git.zone/tswatch -> ^3.0.1; also bump @types/node -> ^25.0.10 and lucide -> ^0.563.0.
- Change npm script: watch from "tswatch element" to "tswatch" and add @git.zone/tswatch preset in npmextra.json.
- Add .playwright-mcp/ to .gitignore and remove many Playwright screenshot/test artifact PNGs to keep repo tidy.
## 2026-01-13 - 3.37.0 - feat(dees-button,dees-statsgrid) ## 2026-01-13 - 3.37.0 - feat(dees-button,dees-statsgrid)
add unified icon property and icon-position support to dees-button; add partition and disk tile types to dees-statsgrid add unified icon property and icon-position support to dees-button; add partition and disk tile types to dees-statsgrid

View File

@@ -59,5 +59,8 @@
"bundler": "esbuild" "bundler": "esbuild"
} }
] ]
},
"@git.zone/tswatch": {
"preset": "element"
} }
} }

View File

@@ -1,6 +1,6 @@
{ {
"name": "@design.estate/dees-catalog", "name": "@design.estate/dees-catalog",
"version": "3.37.0", "version": "3.41.0",
"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",
@@ -9,7 +9,7 @@
"scripts": { "scripts": {
"test": "tstest test/ --web --verbose --timeout 30 --logfile", "test": "tstest test/ --web --verbose --timeout 30 --logfile",
"build": "tsbuild tsfolders --allowimplicitany && tsbundle", "build": "tsbuild tsfolders --allowimplicitany && tsbundle",
"watch": "tswatch element", "watch": "tswatch",
"buildDocs": "tsdoc", "buildDocs": "tsdoc",
"postinstall": "node scripts/update-monaco-version.cjs" "postinstall": "node scripts/update-monaco-version.cjs"
}, },
@@ -18,7 +18,7 @@
"dependencies": { "dependencies": {
"@design.estate/dees-domtools": "^2.3.7", "@design.estate/dees-domtools": "^2.3.7",
"@design.estate/dees-element": "^2.1.5", "@design.estate/dees-element": "^2.1.5",
"@design.estate/dees-wcctools": "^3.7.1", "@design.estate/dees-wcctools": "^3.8.0",
"@fortawesome/fontawesome-svg-core": "^7.1.0", "@fortawesome/fontawesome-svg-core": "^7.1.0",
"@fortawesome/free-brands-svg-icons": "^7.1.0", "@fortawesome/free-brands-svg-icons": "^7.1.0",
"@fortawesome/free-regular-svg-icons": "^7.1.0", "@fortawesome/free-regular-svg-icons": "^7.1.0",
@@ -37,19 +37,19 @@
"apexcharts": "^5.3.6", "apexcharts": "^5.3.6",
"highlight.js": "11.11.1", "highlight.js": "11.11.1",
"ibantools": "^4.5.1", "ibantools": "^4.5.1",
"lucide": "^0.562.0", "lucide": "^0.563.0",
"monaco-editor": "0.55.1", "monaco-editor": "0.55.1",
"pdfjs-dist": "^4.10.38", "pdfjs-dist": "^4.10.38",
"xterm": "^5.3.0", "xterm": "^5.3.0",
"xterm-addon-fit": "^0.8.0" "xterm-addon-fit": "^0.8.0"
}, },
"devDependencies": { "devDependencies": {
"@git.zone/tsbuild": "^4.1.0", "@git.zone/tsbuild": "^4.1.2",
"@git.zone/tsbundle": "^2.8.1", "@git.zone/tsbundle": "^2.8.3",
"@git.zone/tstest": "^3.1.4", "@git.zone/tstest": "^3.1.8",
"@git.zone/tswatch": "^2.3.13", "@git.zone/tswatch": "^3.0.1",
"@push.rocks/projectinfo": "^5.0.2", "@push.rocks/projectinfo": "^5.0.2",
"@types/node": "^25.0.6" "@types/node": "^25.0.10"
}, },
"files": [ "files": [
"ts/**/*", "ts/**/*",

3748
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -912,6 +912,93 @@ appui.getBottomBarVisible();
- `ts_web/elements/00group-appui/dees-appui-bottombar/dees-appui-bottombar.demo.ts` - Demo - `ts_web/elements/00group-appui/dees-appui-bottombar/dees-appui-bottombar.demo.ts` - Demo
- `ts_web/elements/interfaces/appconfig.ts` - New interfaces added - `ts_web/elements/interfaces/appconfig.ts` - New interfaces added
## Media Components (2026-01-26)
New media viewer components and a unified preview composite component.
### Directory: `ts_web/elements/00group-media/`
#### dees-image-viewer
- Image display with zoom, pan, fit, and download controls
- Properties: `src`, `alt`, `fit` ('contain'|'cover'|'actual'), `showToolbar`
- Features: mouse wheel zoom, click-drag pan, double-click toggle, checkerboard transparency background
- Toolbar matches PDF viewer pattern (48px height, 32px buttons, 16px icons, 6px border-radius)
#### dees-audio-viewer
- Audio player with waveform visualization via Web Audio API
- Properties: `src`, `title`, `artist`, `showWaveform`, `autoplay`, `loop`
- Features: canvas waveform rendering, play/pause, seek, volume control, mute toggle, loop toggle
- Uses `HTMLAudioElement` for playback, `AudioContext.decodeAudioData` for waveform data
#### dees-video-viewer
- Video player with custom overlay controls
- Properties: `src`, `poster`, `showControls`, `autoplay`, `loop`, `muted`
- Features: custom controls bar with gradient, seekbar, volume slider, fullscreen toggle, auto-hide controls, 16:9 aspect ratio
### dees-preview (Composite Component)
- Auto-detects content type and delegates to the appropriate viewer
- Directory: `ts_web/elements/dees-preview/`
- Properties: `url`, `file` (File object), `base64`, `textContent`, `contentType` (override), `language`, `mimeType`, `filename`, `showToolbar`, `showFilename`
- Content type detection priority: explicit override → MIME type → file extension → fallback
- Renders: image→DeesImageViewer, pdf→DeesPdfViewer, code→DeesDataviewCodebox, audio→DeesAudioViewer, video→DeesVideoViewer, text→pre, unknown→placeholder
- Header bar with file type icon, filename, and type badge
### dees-dataview-codebox modification
- Removed `<dees-windowcontrols>` elements from the appbar (Step 1 of the plan)
- Now shows clean centered filename title bar without fake window buttons
### Icon Sizing Convention
- All `dees-icon` elements in buttons need explicit `font-size: 16px` CSS rule
- Toolbar buttons: 32px × 32px, border-radius: 6px
- Placeholder/error icons: `font-size: 32px`
- Pattern: `.button-class dees-icon { font-size: 16px; }`
## Tile Component System (2026-01-27)
A family of 200×260px content preview cards with a shared abstract base class. All tiles support lazy loading (IntersectionObserver with 200px margin), hover lift effect, click events, loading/error states, and three sizes (small: 150×195, default: 200×260, large: 250×325).
### Architecture
- **DeesTileBase** (`dees-tile-shared/DeesTileBase.ts`) — Abstract base class extending DeesElement
- Common properties: `clickable`, `loading`, `error`, `size`, `label`
- IntersectionObserver lazy loading via `onBecameVisible()` hook
- Click dispatch via `tile-click` CustomEvent (detail from `getTileClickDetail()`)
- Subclasses implement `renderTileContent(): TemplateResult`
### Components
| Tag | Class | Description |
|-----|-------|-------------|
| `dees-tile-pdf` | `DeesTilePdf` | PDF page thumbnail with hover-to-browse pages. Canvas-rendered via PDF.js/CanvasPool. |
| `dees-tile-image` | `DeesTileImage` | Image thumbnail with `object-fit: cover`, dimension detection on load |
| `dees-tile-audio` | `DeesTileAudio` | Music icon + mini waveform (AudioContext decode), duration badge |
| `dees-tile-video` | `DeesTileVideo` | Auto-captured first frame, duration badge, hover muted auto-preview |
| `dees-tile-note` | `DeesTileNote` | First ~12 lines of text in monospace, gradient fade, optional language badge |
| `dees-tile-folder` | `DeesTileFolder` | 2×2 grid of mini-previews (thumbnails or type icons), item count badge |
### Deprecations
- `dees-pdf-preview` → Use `dees-tile-pdf` instead. Old tag still works as a thin wrapper with console warning.
- `dees-pdf` deprecation comment updated to reference `DeesTilePdf`.
### File Structure
All tile components live in `ts_web/elements/00group-media/dees-tile-*/`:
- `component.ts` — Main component class
- `demo.ts` — Demo function
- `index.ts` — Re-export
- `styles.ts` — (PDF tile only) Component-specific styles
- Shared base: `dees-tile-shared/{DeesTileBase,styles,index}.ts`
### Interface: ITileFolderItem
```typescript
interface ITileFolderItem {
type: 'pdf' | 'image' | 'audio' | 'video' | 'note' | 'folder' | 'unknown';
thumbnailSrc?: string;
name: string;
}
```
## StatsGrid Enhancements (2026-01-12) ## StatsGrid Enhancements (2026-01-12)
### Column Spanning ### Column Spanning
@@ -973,4 +1060,51 @@ Features:
- `trend` - Sparkline with recent data - `trend` - Sparkline with recent data
- `text` - Text value display - `text` - Text value display
- `multiPercentage` - Multiple progress bars - `multiPercentage` - Multiple progress bars
- `cpuCores` - Vertical bar visualization for CPU cores - `cpuCores` - Vertical bar visualization for CPU cores
## Component Group Taxonomy (2026-01-27)
All components are organized into `00group-*` directories with 14 groups visible in the wcctools sidebar. The `demoGroups` property (plural, `string[]`) replaces the old `demoGroup` (singular). Components can belong to multiple groups.
### Group Directories
| Directory | Group Name | Count |
|-----------|-----------|-------|
| `00group-appui` | App UI | 10 |
| `00group-button` | Button | 3 |
| `00group-chart` | Chart | 2 |
| `00group-dataview` | Data View | 4 |
| `00group-feedback` | Feedback | 6 |
| `00group-form` | Form | 2 |
| `00group-input` | Input | 18 |
| `00group-layout` | Layout | 7 |
| `00group-media` | Media | 14 (viewers + PDF + tiles) |
| `00group-overlay` | Overlay | 4 |
| `00group-simple` | Simple | 3 |
| `00group-utility` | Utility | 5 |
| `00group-workspace` | Workspace | 9 |
| `00group-runtime` | (internal) | - |
### Multi-Group Components
Some components appear in multiple groups via `demoGroups = ['Primary', 'Secondary']`:
- `dees-chart-log`: Chart, Workspace
- `dees-dataview-codebox`: Data View, Workspace
- `dees-input-code`: Input, Workspace
- `dees-input-wysiwyg`: Input, Workspace
- `dees-form-submit`: Form, Button
- `dees-preview`: Media, Data View
- `dees-pdf*` / `dees-tile-pdf`: Media, PDF
- `dees-stepper`: Layout, Form
- `dees-label`: Layout, Input
- `dees-toast`: Feedback, Overlay
- `dees-actionbar`: Feedback, Overlay
### Import Conventions
- Within same group: `import '../sibling-component/file.js'`
- Cross-group (from depth-2): `import '../../00group-X/component/file.js'`
- Shared utilities: `import '../../00plugins.js'`, `import '../../00theme.js'`, etc.
### Key Notes
- The old `demoGroup` property (singular, string) is fully removed
- All 79 components with demos use `demoGroups` (plural, string[])
- `00group-pdf` no longer exists; PDF components are in `00group-media`
- `dees-search` and `dees-tooltip` remain standalone (no demos)

660
readme.md
View File

@@ -1,6 +1,6 @@
# @design.estate/dees-catalog # @design.estate/dees-catalog
A comprehensive web components library built with TypeScript and LitElement, providing **80+ production-ready UI components** for building modern web applications with consistent design and behavior. 🚀 A comprehensive web components library built with TypeScript and LitElement, providing **90+ production-ready UI components** for building modern web applications with consistent design and behavior. 🚀
[![TypeScript](https://img.shields.io/badge/TypeScript-5.0+-blue.svg)](https://www.typescriptlang.org/) [![TypeScript](https://img.shields.io/badge/TypeScript-5.0+-blue.svg)](https://www.typescriptlang.org/)
[![LitElement](https://img.shields.io/badge/LitElement-4.0+-orange.svg)](https://lit.dev/) [![LitElement](https://img.shields.io/badge/LitElement-4.0+-orange.svg)](https://lit.dev/)
@@ -11,12 +11,15 @@ For reporting bugs, issues, or security vulnerabilities, please visit [community
## ✨ Features ## ✨ Features
- 🎨 **Consistent Design System** - Beautiful, cohesive components following modern UI/UX principles - 🎨 **Consistent Design System** Beautiful, cohesive components following modern UI/UX principles
- 🌙 **Dark/Light Theme Support** - All components automatically adapt to your theme - 🌙 **Dark/Light Theme Support** All components automatically adapt to your theme
- ⌨️ **Keyboard Accessible** - Full keyboard navigation and ARIA support - ⌨️ **Keyboard Accessible** Full keyboard navigation and ARIA support
- 📱 **Responsive** - Mobile-first design that works across all screen sizes - 📱 **Responsive** Mobile-first design that works across all screen sizes
- 🔧 **TypeScript-First** - Fully typed APIs with excellent IDE support - 🔧 **TypeScript-First** Fully typed APIs with excellent IDE support
- 🧩 **Modular** - Use only what you need, tree-shakeable architecture - 🧩 **Modular** Use only what you need, tree-shakeable architecture
- 🏗️ **Full App Shell**`dees-appui` provides a complete application framework with menus, routing, activity log, and bottom bar
- 🎬 **Media Components** — Rich tile-based previews for PDFs, images, audio, video, notes, and folders
- 💻 **IDE Workspace** — Full workspace component with Monaco editor, file tree, terminal, and diff viewer
## 📦 Installation ## 📦 Installation
@@ -52,16 +55,17 @@ For developers working on this library, please refer to the [UI Components Playb
| Category | Components | | Category | Components |
|----------|------------| |----------|------------|
| **Core UI** | [`DeesButton`](#deesbutton), [`DeesButtonExit`](#deesbuttonexit), [`DeesButtonGroup`](#deesbuttongroup), [`DeesBadge`](#deesbadge), [`DeesChips`](#deeschips), [`DeesHeading`](#deesheading), [`DeesHint`](#deeshint), [`DeesIcon`](#deesicon), [`DeesLabel`](#deeslabel), [`DeesPanel`](#deespanel), [`DeesSearchbar`](#deessearchbar), [`DeesSpinner`](#deesspinner), [`DeesToast`](#deestoast), [`DeesWindowcontrols`](#deeswindowcontrols) | | **Core UI** | [`DeesButton`](#deesbutton), [`DeesButtonExit`](#deesbuttonexit), [`DeesButtonGroup`](#deesbuttongroup), [`DeesBadge`](#deesbadge), [`DeesChips`](#deeschips), [`DeesHeading`](#deesheading), [`DeesHint`](#deeshint), [`DeesIcon`](#deesicon), [`DeesLabel`](#deeslabel), [`DeesPanel`](#deespanel), [`DeesSearchbar`](#deessearchbar), [`DeesSpinner`](#deesspinner), [`DeesToast`](#deestoast), [`DeesWindowcontrols`](#deeswindowcontrols), [`DeesActionbar`](#deesactionbar) |
| **Forms** | [`DeesForm`](#deesform), [`DeesInputText`](#deesinputtext), [`DeesInputCheckbox`](#deesinputcheckbox), [`DeesInputDropdown`](#deesinputdropdown), [`DeesInputRadiogroup`](#deesinputradiogroup), [`DeesInputFileupload`](#deesinputfileupload), [`DeesInputIban`](#deesinputiban), [`DeesInputPhone`](#deesinputphone), [`DeesInputQuantitySelector`](#deesinputquantityselector), [`DeesInputMultitoggle`](#deesinputmultitoggle), [`DeesInputTags`](#deesinputtags), [`DeesInputTypelist`](#deesinputtypelist), [`DeesInputList`](#deesinputlist), [`DeesInputProfilepicture`](#deesinputprofilepicture), [`DeesInputRichtext`](#deesinputrichtext), [`DeesInputWysiwyg`](#deesinputwysiwyg), [`DeesInputDatepicker`](#deesinputdatepicker), [`DeesInputSearchselect`](#deesinputsearchselect), [`DeesFormSubmit`](#deesformsubmit) | | **Forms** | [`DeesForm`](#deesform), [`DeesInputText`](#deesinputtext), [`DeesInputCheckbox`](#deesinputcheckbox), [`DeesInputDropdown`](#deesinputdropdown), [`DeesInputRadiogroup`](#deesinputradiogroup), [`DeesInputFileupload`](#deesinputfileupload), [`DeesInputIban`](#deesinputiban), [`DeesInputPhone`](#deesinputphone), [`DeesInputQuantitySelector`](#deesinputquantityselector), [`DeesInputMultitoggle`](#deesinputmultitoggle), [`DeesInputToggle`](#deesinputtoggle), [`DeesInputTags`](#deesinputtags), [`DeesInputTypelist`](#deesinputtypelist), [`DeesInputList`](#deesinputlist), [`DeesInputProfilepicture`](#deesinputprofilepicture), [`DeesInputRichtext`](#deesinputrichtext), [`DeesInputWysiwyg`](#deesinputwysiwyg), [`DeesInputDatepicker`](#deesinputdatepicker), [`DeesInputSearchselect`](#deesinputsearchselect), [`DeesInputCode`](#deesinputcode), [`DeesFormSubmit`](#deesformsubmit) |
| **Layout** | [`DeesAppui`](#deesappui), [`DeesAppuiMainmenu`](#deesappuimainmenu), [`DeesAppuiSecondarymenu`](#deesappuisecondarymenu), [`DeesAppuiMaincontent`](#deesappuimaincontent), [`DeesAppuiAppbar`](#deesappuiappbar), [`DeesAppuiActivitylog`](#deesappuiactivitylog), [`DeesAppuiProfiledropdown`](#deesappuiprofiledropdown), [`DeesAppuiTabs`](#deesappuitabs), [`DeesMobileNavigation`](#deesmobilenavigation), [`DeesDashboardGrid`](#deesdashboardgrid) | | **App Shell (Layout)** | [`DeesAppui`](#deesappui-), [`DeesAppuiMainmenu`](#deesappuimainmenu), [`DeesAppuiSecondarymenu`](#deesappuisecondarymenu), [`DeesAppuiMaincontent`](#deesappuimaincontent), [`DeesAppuiAppbar`](#deesappuiappbar), [`DeesAppuiActivitylog`](#deesappuiactivitylog), [`DeesAppuiBottombar`](#deesappuibottombar), [`DeesAppuiProfiledropdown`](#deesappuiprofiledropdown), [`DeesAppuiTabs`](#deesappuitabs), [`DeesMobileNavigation`](#deesmobilenavigation), [`DeesDashboardGrid`](#deesdashboardgrid) |
| **Data Display** | [`DeesTable`](#deestable), [`DeesDataviewCodebox`](#deesdataviewcodebox), [`DeesDataviewStatusobject`](#deesdataviewstatusobject), [`DeesPdf`](#deespdf), [`DeesStatsGrid`](#deesstatsgrid), [`DeesPagination`](#deespagination) | | **Data Display** | [`DeesTable`](#deestable), [`DeesDataviewCodebox`](#deesdataviewcodebox), [`DeesDataviewStatusobject`](#deesdataviewstatusobject), [`DeesPdf`](#deespdf), [`DeesStatsGrid`](#deesstatsgrid), [`DeesPagination`](#deespagination) |
| **Media & Tiles** | [`DeesTilePdf`](#deestilepdf), [`DeesTileImage`](#deestileimage), [`DeesTileAudio`](#deestileaudio), [`DeesTileVideo`](#deestilevideo), [`DeesTileNote`](#deestilenote), [`DeesTileFolder`](#deestilefolder), [`DeesPreview`](#deespreview), [`DeesPdfViewer`](#deespdfviewer), [`DeesPdfPreview`](#deespdfpreview), [`DeesImageViewer`](#deesimageviewer), [`DeesAudioViewer`](#deesaudioviewer), [`DeesVideoViewer`](#deesvideoviewer) |
| **Visualization** | [`DeesChartArea`](#deeschartarea), [`DeesChartLog`](#deeschartlog) | | **Visualization** | [`DeesChartArea`](#deeschartarea), [`DeesChartLog`](#deeschartlog) |
| **Dialogs & Overlays** | [`DeesModal`](#deesmodal), [`DeesContextmenu`](#deescontextmenu), [`DeesSpeechbubble`](#deesspeechbubble), [`DeesWindowlayer`](#deeswindowlayer) | | **Dialogs & Overlays** | [`DeesModal`](#deesmodal), [`DeesContextmenu`](#deescontextmenu), [`DeesSpeechbubble`](#deesspeechbubble), [`DeesWindowlayer`](#deeswindowlayer) |
| **Navigation** | [`DeesStepper`](#deesstepper), [`DeesProgressbar`](#deesprogressbar) | | **Navigation** | [`DeesStepper`](#deesstepper), [`DeesProgressbar`](#deesprogressbar) |
| **Development** | [`DeesEditor`](#deeseditor), [`DeesEditorMarkdown`](#deeseditormarkdown), [`DeesEditorMarkdownoutlet`](#deeseditormarkdownoutlet), [`DeesTerminal`](#deesterminal), [`DeesUpdater`](#deesupdater) | | **Workspace / IDE** | [`DeesWorkspace`](#deesworkspace), [`DeesWorkspaceMonaco`](#deesworkspacemonaco), [`DeesWorkspaceDiffEditor`](#deesworkspacediffeditor), [`DeesWorkspaceFiletree`](#deesworkspacefiletree), [`DeesWorkspaceTerminal`](#deesworkspaceterminal), [`DeesWorkspaceTerminalPreview`](#deesworkspaceterminalpreview), [`DeesWorkspaceMarkdown`](#deesworkspacemarkdown), [`DeesWorkspaceMarkdownoutlet`](#deesworkspacemarkdownoutlet), [`DeesWorkspaceBottombar`](#deesworkspacebottombar) |
| **Theming** | [`DeesTheme`](#deestheme) | | **Theming** | [`DeesTheme`](#deestheme) |
| **Auth & Utilities** | [`DeesSimpleAppdash`](#deessimpleappdash), [`DeesSimpleLogin`](#deessimplelogin) | | **Pre-built Templates** | [`DeesSimpleAppdash`](#deessimpleappdash), [`DeesSimpleLogin`](#deessimplelogin) |
| **Shopping** | [`DeesShoppingProductcard`](#deesshoppingproductcard) | | **Shopping** | [`DeesShoppingProductcard`](#deesshoppingproductcard) |
--- ---
@@ -117,14 +121,14 @@ Interactive chips/tags with selection capabilities.
Display icons from FontAwesome and Lucide icon libraries with library prefixes. Display icons from FontAwesome and Lucide icon libraries with library prefixes.
```typescript ```typescript
// FontAwesome icons - use 'fa:' prefix // FontAwesome icons use 'fa:' prefix
<dees-icon <dees-icon
icon="fa:check" // FontAwesome icon with fa: prefix icon="fa:check" // FontAwesome icon with fa: prefix
iconSize="24" // Size in pixels iconSize="24" // Size in pixels
color="#22c55e" // Optional: custom color color="#22c55e" // Optional: custom color
></dees-icon> ></dees-icon>
// Lucide icons - use 'lucide:' prefix // Lucide icons use 'lucide:' prefix
<dees-icon <dees-icon
icon="lucide:menu" // Lucide icon with lucide: prefix icon="lucide:menu" // Lucide icon with lucide: prefix
iconSize="24" // Size in pixels iconSize="24" // Size in pixels
@@ -134,7 +138,7 @@ Display icons from FontAwesome and Lucide icon libraries with library prefixes.
// Legacy API (deprecated but still supported) // Legacy API (deprecated but still supported)
<dees-icon <dees-icon
iconFA="check" // Without prefix - assumes FontAwesome iconFA="check" // Without prefix assumes FontAwesome
></dees-icon> ></dees-icon>
``` ```
@@ -287,6 +291,18 @@ Window control buttons (minimize, maximize, close) for desktop-like applications
></dees-windowcontrols> ></dees-windowcontrols>
``` ```
#### `DeesActionbar`
Floating action bar for contextual actions.
```typescript
<dees-actionbar
.actions=${[
{ icon: 'lucide:save', label: 'Save', action: () => handleSave() },
{ icon: 'lucide:trash', label: 'Delete', action: () => handleDelete() }
]}
></dees-actionbar>
```
--- ---
### Form Components ### Form Components
@@ -331,6 +347,18 @@ Checkbox input component for boolean values.
></dees-input-checkbox> ></dees-input-checkbox>
``` ```
#### `DeesInputToggle`
Toggle switch component for boolean on/off states.
```typescript
<dees-input-toggle
key="darkMode"
label="Enable Dark Mode"
.value=${true}
@change=${handleToggle}
></dees-input-toggle>
```
#### `DeesInputDropdown` #### `DeesInputDropdown`
Dropdown selection component with search and filtering capabilities. Dropdown selection component with search and filtering capabilities.
@@ -658,6 +686,19 @@ Advanced block-based editor with slash commands and rich content blocks.
- Collaborative editing ready - Collaborative editing ready
- Extensible block types - Extensible block types
#### `DeesInputCode`
Code input component for editing source code with syntax highlighting.
```typescript
<dees-input-code
key="snippet"
label="Code Snippet"
.value=${codeString}
language="typescript"
@change=${handleCodeChange}
></dees-input-code>
```
#### `DeesFormSubmit` #### `DeesFormSubmit`
Submit button component specifically designed for `DeesForm`. Submit button component specifically designed for `DeesForm`.
@@ -670,10 +711,10 @@ Submit button component specifically designed for `DeesForm`.
--- ---
### Layout Components ### App Shell (Layout) Components
#### `DeesAppui` #### `DeesAppui` 🏗️
A comprehensive application shell component providing a complete UI framework with navigation, menus, activity logging, and view management. A comprehensive application shell component providing a complete UI framework with navigation, menus, activity logging, bottom bar, and view management.
> **Full API Documentation**: See [ts_web/elements/00group-appui/dees-appui/readme.md](./ts_web/elements/00group-appui/dees-appui/readme.md) for complete documentation including all programmatic APIs, view lifecycle hooks, and TypeScript interfaces. > **Full API Documentation**: See [ts_web/elements/00group-appui/dees-appui/readme.md](./ts_web/elements/00group-appui/dees-appui/readme.md) for complete documentation including all programmatic APIs, view lifecycle hooks, and TypeScript interfaces.
@@ -690,7 +731,6 @@ class MyApp extends DeesElement {
async firstUpdated() { async firstUpdated() {
this.appui = this.shadowRoot.querySelector('dees-appui'); this.appui = this.shadowRoot.querySelector('dees-appui');
// Configure with views and menu
this.appui.configure({ this.appui.configure({
branding: { logoIcon: 'lucide:box', logoText: 'My App' }, branding: { logoIcon: 'lucide:box', logoText: 'My App' },
views: [ views: [
@@ -700,7 +740,13 @@ class MyApp extends DeesElement {
mainMenu: { mainMenu: {
sections: [{ name: 'Main', views: ['dashboard', 'settings'] }] sections: [{ name: 'Main', views: ['dashboard', 'settings'] }]
}, },
defaultView: 'dashboard' defaultView: 'dashboard',
bottomBar: {
visible: true,
widgets: [
{ id: 'status', iconName: 'lucide:activity', label: 'Online', status: 'success' }
]
}
}); });
} }
@@ -710,43 +756,123 @@ class MyApp extends DeesElement {
} }
``` ```
**Key Features:** **Architecture Overview:**
- **Configure API**: Single `configure()` method for complete app setup
- **View Management**: Automatic view caching, lazy loading, and lifecycle hooks
- **Programmatic APIs**: Full control over AppBar, Main Menu, Secondary Menu, Content Tabs, and Activity Log
- **View Lifecycle Hooks**: `onActivate()`, `onDeactivate()`, and `canDeactivate()` for view components
- **Hash-based Routing**: Automatic URL synchronization with view navigation
- **RxJS Observables**: `viewChanged$` and `viewLifecycle$` for reactive programming
- **TypeScript-first**: Typed `IViewActivationContext` passed to views on activation
- **Activity Log Toggle**: Built-in appbar button to show/hide activity panel with entry count badge
**Programmatic APIs include:** ```
- `navigateToView(viewId, params?)` - Navigate between views ┌─────────────────────────────────────────────────────────────────────┐
- `setAppBarMenus()`, `setBreadcrumbs()`, `setUser()` - Control the app bar │ AppBar (dees-appui-appbar) │
- `setMainMenu()`, `setMainMenuSelection()`, `setMainMenuBadge()` - Control main navigation │ ├── Menus (File, Edit, View...) │
- `setMainMenuCollapsed()`, `setMainMenuVisible()` - Control main menu visibility │ ├── Breadcrumbs │
- `setSecondaryMenu()`, `setSecondaryMenuCollapsed()`, `setSecondaryMenuVisible()` - Control secondary menu │ ├── User Profile + Dropdown │
- `setContentTabs()`, `setContentTabsVisible()` - Control view-specific UI │ └── Activity Log Toggle │
- `activityLog.add()`, `activityLog.addMany()`, `activityLog.clear()` - Manage activity entries ├─────────────┬───────────────────────────────────┬───────────────────┤
- `setActivityLogVisible()`, `toggleActivityLog()`, `getActivityLogVisible()` - Control activity panel │ Main Menu │ Content Area │ Activity Log
│ (collapsed/ │ ├── Content Tabs │ (slide panel) │
│ expanded) │ │ (closable, from tables/lists)│ │
│ │ └── View Container │ │
│ ┌─────────┐ │ └── Active View │ │
│ │ 🏠 Home │ ├─────────────────────────────────┐ │ │
│ │ 📁 Files│ │ Secondary Menu │ │ │
│ │ ⚙ Set.. │ │ ├── Collapsible Groups │ │ │
│ │ │ │ │ ├── Tabs / Actions │ │ │
│ └─────────┘ │ │ ├── Filters / Links │ │ │
│ │ │ └── Dividers / Headers │ │ │
├─────────────┴──┴───────────────────────────────┴───────────────────┤
│ Bottom Bar (dees-appui-bottombar) — 24px status bar │
│ ├── Status widgets (left/right) │
│ └── Action buttons (left/right) │
└─────────────────────────────────────────────────────────────────────┘
```
**Configuration (`IAppConfig`):**
**View Visibility Control:**
```typescript ```typescript
// In your view's onActivate hook interface IAppConfig {
onActivate(context: IViewActivationContext) { branding?: { logoIcon?: string; logoText?: string };
// Hide secondary menu for a fullscreen view appBar?: IAppBarConfig;
context.appui.setSecondaryMenuVisible(false); views: IViewDefinition[];
mainMenu?: IMainMenuConfig;
// Hide content tabs defaultView?: string;
context.appui.setContentTabsVisible(false); activityLog?: IActivityLogConfig;
bottomBar?: IBottomBarConfig;
// Collapse main menu to give more space onViewChange?: (viewId: string, view: IViewDefinition) => void;
context.appui.setMainMenuCollapsed(true); onSearch?: (query: string) => void;
} }
``` ```
**Key Features:**
- 🔧 **Configure API** — Single `configure()` method for complete app setup
- 📄 **View Management** — Automatic view caching, lazy loading, and lifecycle hooks (`onActivate`, `onDeactivate`, `canDeactivate`)
- 🧭 **Hash-based Routing** — Automatic URL synchronization with view navigation and parameterized routes
- 📊 **Activity Log** — Slide-out panel with stacked entries, date grouping, search, and filtering
- 📌 **Bottom Status Bar** — Configurable widgets and actions with status colors and loading states
- 🎯 **RxJS Observables**`viewChanged$` and `viewLifecycle$` for reactive programming
- 🏷️ **TypeScript-first** — Typed `IViewActivationContext` passed to views on activation
**Programmatic APIs:**
| Area | Methods |
|------|---------|
| **Navigation** | `navigateToView(viewId, params?)`, `getCurrentView()`, `getViewRegistry()` |
| **App Bar** | `setAppBarMenus()`, `updateAppBarMenu()`, `setBreadcrumbs()`, `setUser()`, `setProfileMenuItems()`, `setSearchVisible()`, `onSearch()`, `setWindowControlsVisible()` |
| **Main Menu** | `setMainMenu()`, `updateMainMenuGroup()`, `addMainMenuItem()`, `removeMainMenuItem()`, `setMainMenuSelection()`, `setMainMenuCollapsed()`, `setMainMenuVisible()`, `setMainMenuBadge()`, `clearMainMenuBadge()` |
| **Secondary Menu** | `setSecondaryMenu()`, `updateSecondaryMenuGroup()`, `addSecondaryMenuItem()`, `setSecondaryMenuSelection()`, `setSecondaryMenuCollapsed()`, `setSecondaryMenuVisible()`, `clearSecondaryMenu()` |
| **Content Tabs** | `setContentTabs()`, `addContentTab()`, `removeContentTab()`, `selectContentTab()`, `getSelectedContentTab()`, `setContentTabsVisible()`, `setContentTabsAutoHide()` |
| **Activity Log** | `activityLog.add()`, `activityLog.addMany()`, `activityLog.clear()`, `activityLog.getEntries()`, `activityLog.filter()`, `activityLog.search()`, `setActivityLogVisible()`, `toggleActivityLog()`, `getActivityLogVisible()` |
| **Bottom Bar** | `bottomBar.addWidget()`, `bottomBar.updateWidget()`, `bottomBar.removeWidget()`, `bottomBar.getWidget()`, `bottomBar.clearWidgets()`, `bottomBar.addAction()`, `bottomBar.removeAction()`, `bottomBar.clearActions()`, `setBottomBarVisible()`, `getBottomBarVisible()` |
| **Observables** | `viewChanged$`, `viewLifecycle$` |
**View Lifecycle Hooks:**
```typescript
import { DeesElement, customElement } from '@design.estate/dees-element';
import type { IViewActivationContext, IViewLifecycle } from '@design.estate/dees-catalog';
@customElement('my-settings-view')
class MySettingsView extends DeesElement implements IViewLifecycle {
// Called when view becomes visible
async onActivate(context: IViewActivationContext) {
const { appui, viewId, params } = context;
// Set view-specific secondary menu
appui.setSecondaryMenu({
heading: 'Settings',
groups: [{ name: 'Options', items: [...] }]
});
// Control visibility of other shell parts
appui.setContentTabsVisible(false);
appui.setSecondaryMenuVisible(true);
}
// Called when navigating away
onDeactivate() { /* cleanup */ }
// Return false or a message string to block navigation
canDeactivate(): boolean | string {
if (this.hasUnsavedChanges) return 'You have unsaved changes. Leave anyway?';
return true;
}
}
```
**Secondary Menu Item Types:**
The secondary menu supports **8 distinct item types** for building rich contextual sidebars:
| Type | Description |
|------|-------------|
| **Tab** (default) | Selectable item that stays highlighted |
| **Action** | Executes on click without staying selected (blue styling) |
| **Filter** | Checkbox toggle for filtering |
| **MultiFilter** | Collapsible multi-select filter box |
| **Divider** | Visual separator line |
| **Header** | Non-interactive section label |
| **Link** | Opens an external URL |
| **Danger Action** | Red-styled action with optional confirmation |
#### `DeesAppuiMainmenu` #### `DeesAppuiMainmenu`
Main navigation menu component for application-wide navigation. Main navigation menu component for application-wide navigation. Supports collapsed (icon-only) mode.
```typescript ```typescript
<dees-appui-mainmenu <dees-appui-mainmenu
@@ -759,12 +885,12 @@ Main navigation menu component for application-wide navigation.
] ]
} }
]} ]}
collapsed // Optional: show collapsed version collapsed // Optional: show collapsed icon-only version
></dees-appui-mainmenu> ></dees-appui-mainmenu>
``` ```
#### `DeesAppuiSecondarymenu` #### `DeesAppuiSecondarymenu`
Secondary navigation component for sub-section selection with collapsible groups and badges. Secondary navigation component for sub-section selection with collapsible groups, badges, and 8 item types.
```typescript ```typescript
<dees-appui-secondarymenu <dees-appui-secondarymenu
@@ -806,28 +932,12 @@ Professional application bar component with hierarchical menus, breadcrumb navig
.menuItems=${[ .menuItems=${[
{ {
name: 'File', name: 'File',
action: async () => {}, // No-op for parent menu items action: async () => {},
submenu: [ submenu: [
{ { name: 'New File', shortcut: 'Cmd+N', iconName: 'file-plus', action: async () => handleNewFile() },
name: 'New File', { name: 'Open...', shortcut: 'Cmd+O', iconName: 'folder-open', action: async () => handleOpen() },
shortcut: 'Cmd+N', { divider: true },
iconName: 'file-plus', { name: 'Save', shortcut: 'Cmd+S', iconName: 'save', action: async () => handleSave(), disabled: true }
action: async () => handleNewFile()
},
{
name: 'Open...',
shortcut: 'Cmd+O',
iconName: 'folder-open',
action: async () => handleOpen()
},
{ divider: true }, // Menu separator
{
name: 'Save',
shortcut: 'Cmd+S',
iconName: 'save',
action: async () => handleSave(),
disabled: true // Disabled state
}
] ]
} }
]} ]}
@@ -849,12 +959,12 @@ Professional application bar component with hierarchical menus, breadcrumb navig
``` ```
**Key Features:** **Key Features:**
- **Hierarchical Menu System** - Top-level menus with dropdown submenus, icons, and keyboard shortcuts - **Hierarchical Menu System** Top-level menus with dropdown submenus, icons, and keyboard shortcuts
- **Keyboard Navigation** - Full keyboard support (Tab, Arrow keys, Enter, Escape) - **Keyboard Navigation** Full keyboard support (Tab, Arrow keys, Enter, Escape)
- **Breadcrumb Navigation** - Customizable breadcrumb trail with click events - **Breadcrumb Navigation** Customizable breadcrumb trail with click events
- **User Account Section** - Avatar with status indicator and profile dropdown - **User Account Section** Avatar with status indicator and profile dropdown
- **Activity Log Toggle** - Button with badge count to show/hide activity panel - **Activity Log Toggle** Button with badge count to show/hide activity panel
- **Accessibility** - Full ARIA support with menubar roles - **Accessibility** Full ARIA support with menubar roles
#### `DeesAppuiActivitylog` #### `DeesAppuiActivitylog`
Real-time activity log panel for displaying user actions and system events. Real-time activity log panel for displaying user actions and system events.
@@ -886,6 +996,61 @@ activityLog.search('settings'); // Search by message
- Animated slide-in/out panel - Animated slide-in/out panel
- Theme-aware styling - Theme-aware styling
#### `DeesAppuiBottombar`
A 24px fixed-height status bar at the bottom of the application shell. Supports status widgets and action buttons positioned left or right.
```typescript
// Configure via DeesAppui
appui.configure({
bottomBar: {
visible: true,
widgets: [
{
id: 'status',
iconName: 'lucide:activity',
label: 'System Online',
status: 'success', // 'idle' | 'active' | 'success' | 'warning' | 'error'
tooltip: 'All systems operational',
onClick: () => console.log('Status clicked'),
},
{
id: 'version',
iconName: 'lucide:gitBranch',
label: 'v1.2.3',
position: 'right',
}
],
actions: [
{
id: 'terminal',
iconName: 'lucide:terminal',
tooltip: 'Open Terminal',
position: 'right',
onClick: () => console.log('Terminal clicked'),
}
]
}
});
// Programmatic updates
appui.bottomBar.addWidget({ id: 'build', iconName: 'lucide:hammer', label: 'Building...', loading: true, status: 'active' });
appui.bottomBar.updateWidget('build', { label: 'Build complete', loading: false, status: 'success' });
appui.bottomBar.removeWidget('build');
appui.bottomBar.addAction({ id: 'refresh', iconName: 'lucide:refreshCw', onClick: () => location.reload() });
appui.bottomBar.removeAction('refresh');
appui.setBottomBarVisible(false);
```
**Key Features:**
- Configurable status widgets with icons, labels, and colored status indicators
- Loading spinner state for widgets
- Contextual actions with icon buttons
- Left/right positioning for both widgets and actions
- Tooltips on hover
- Context menu support per widget
#### `DeesAppuiTabs` #### `DeesAppuiTabs`
Reusable tab component with horizontal/vertical layout support. Reusable tab component with horizontal/vertical layout support.
@@ -1007,7 +1172,7 @@ A responsive grid component for displaying statistical data with various visuali
value: 125420, value: 125420,
unit: '$', unit: '$',
type: 'number', type: 'number',
icon: 'faDollarSign', icon: 'lucide:dollarSign',
description: '+12.5% from last month', description: '+12.5% from last month',
color: '#22c55e' color: '#22c55e'
}, },
@@ -1016,7 +1181,7 @@ A responsive grid component for displaying statistical data with various visuali
title: 'CPU Usage', title: 'CPU Usage',
value: 73, value: 73,
type: 'gauge', type: 'gauge',
icon: 'faMicrochip', icon: 'lucide:cpu',
gaugeOptions: { gaugeOptions: {
min: 0, max: 100, min: 0, max: 100,
thresholds: [ thresholds: [
@@ -1032,8 +1197,22 @@ A responsive grid component for displaying statistical data with various visuali
value: '1.2k', value: '1.2k',
unit: '/min', unit: '/min',
type: 'trend', type: 'trend',
icon: 'faServer', icon: 'lucide:server',
trendData: [45, 52, 38, 65, 72, 68, 75, 82, 79, 85, 88, 92] trendData: [45, 52, 38, 65, 72, 68, 75, 82, 79, 85, 88, 92]
},
{
id: 'cores',
title: 'CPU Cores',
value: 0,
type: 'cpuCores',
icon: 'lucide:cpu',
columnSpan: 2,
coresData: [
{ id: 0, usage: 45, label: '0' },
{ id: 1, usage: 72, label: '1' },
{ id: 2, usage: 30, label: '2' },
{ id: 3, usage: 88, label: '3' }
]
} }
]} ]}
.minTileWidth=${250} .minTileWidth=${250}
@@ -1041,6 +1220,8 @@ A responsive grid component for displaying statistical data with various visuali
></dees-statsgrid> ></dees-statsgrid>
``` ```
**Tile Types:** `number`, `gauge`, `percentage`, `trend`, `text`, `multiPercentage`, `cpuCores`
#### `DeesPagination` #### `DeesPagination`
Pagination component for navigating through large datasets. Pagination component for navigating through large datasets.
@@ -1056,6 +1237,146 @@ Pagination component for navigating through large datasets.
--- ---
### Media & Tile Components 🎬
A rich collection of tile-based preview components for displaying media files in grids. All tiles share a consistent base class (`DeesTileBase`) with lazy loading via `IntersectionObserver`, hover interactions, click events, context menus, and three size variants (`small`, `default`, `large`).
All tile badges use a unified styling system with label-awareness — when a `label` is set, bottom badges automatically shift up to avoid overlapping.
#### `DeesTilePdf`
PDF document tile with live page preview on hover.
```typescript
<dees-tile-pdf
pdfUrl="/documents/report.pdf"
label="Annual Report"
clickable
@tile-click=${handleClick}
></dees-tile-pdf>
```
**Key Features:**
- Renders first page as canvas preview
- Hover to scrub through pages (mouse X position maps to page number)
- Shows page count badge, hover page indicator
- Detects A4/Letter vs non-standard aspect ratios
#### `DeesTileImage`
Image tile with lazy loading and dimension display.
```typescript
<dees-tile-image
src="/photos/landscape.jpg"
alt="Mountain landscape"
label="landscape.jpg"
clickable
@tile-click=${handleClick}
></dees-tile-image>
```
**Key Features:**
- Lazy loads image on scroll into view
- Shows image dimensions on hover (e.g. "1920 × 1080")
- Checkerboard background for transparent images
#### `DeesTileAudio`
Audio file tile with waveform visualization.
```typescript
<dees-tile-audio
src="/music/track.mp3"
title="Summer Vibes"
artist="DJ Example"
clickable
@tile-click=${handleClick}
></dees-tile-audio>
```
**Key Features:**
- Generates waveform visualization from audio data
- Shows duration badge (e.g. "3:42")
- Displays title and artist metadata
- Play overlay on hover
#### `DeesTileVideo`
Video tile with thumbnail capture and hover preview.
```typescript
<dees-tile-video
src="/videos/intro.mp4"
poster="/thumbs/intro.jpg"
label="Introduction"
clickable
@tile-click=${handleClick}
></dees-tile-video>
```
**Key Features:**
- Auto-captures first frame as thumbnail (or uses provided `poster`)
- Plays video preview on hover
- Shows duration badge
- Play button overlay
#### `DeesTileNote`
Code/text snippet tile with syntax-aware display.
```typescript
<dees-tile-note
title="config.ts"
language="TypeScript"
.content=${codeString}
clickable
@tile-click=${handleClick}
></dees-tile-note>
```
**Key Features:**
- Monospace font with line numbers
- Language badge (top-right)
- Scrollable content on hover (mouse X position controls scroll)
- Line indicator badge while scrolling
- Gradient fade at bottom
#### `DeesTileFolder`
Folder tile with 2×2 content preview grid.
```typescript
<dees-tile-folder
name="Project Assets"
.items=${[
{ type: 'image', name: 'logo.png', thumbnailSrc: '/thumbs/logo.png' },
{ type: 'pdf', name: 'spec.pdf' },
{ type: 'audio', name: 'jingle.mp3' },
{ type: 'video', name: 'demo.mp4' },
]}
clickable
@tile-click=${handleClick}
></dees-tile-folder>
```
**Key Features:**
- 2×2 preview grid showing first 4 items (thumbnails or type icons)
- Item count badge (e.g. "12 items")
- Folder icon header with name
- Supports: `pdf`, `image`, `audio`, `video`, `note`, `folder`, `unknown` types
#### `DeesPreview`
Unified preview component that auto-selects the right tile type based on content.
#### `DeesPdfViewer` / `DeesPdfPreview`
Full PDF viewing components with navigation controls.
#### `DeesImageViewer`
Full-screen image viewer with zoom and pan.
#### `DeesAudioViewer`
Audio playback component with waveform and controls.
#### `DeesVideoViewer`
Video playback component with standard controls.
---
### Visualization Components ### Visualization Components
#### `DeesChartArea` #### `DeesChartArea`
@@ -1116,16 +1437,41 @@ DeesModal.createAndShow({
``` ```
#### `DeesContextmenu` #### `DeesContextmenu`
Context menu component for right-click actions. Context menu component for right-click actions with nested submenu support.
```typescript ```typescript
<dees-contextmenu // Programmatic usage
.items=${[ DeesContextmenu.openContextMenuWithOptions(mouseEvent, [
{ label: 'Edit', icon: 'edit', action: () => handleEdit() }, {
{ label: 'Delete', icon: 'trash', action: () => handleDelete() } name: 'Edit',
]} iconName: 'lucide:edit',
position="right" action: async () => handleEdit()
></dees-contextmenu> },
{ divider: true },
{
name: 'More Options',
iconName: 'lucide:moreHorizontal',
submenu: [
{ name: 'Duplicate', iconName: 'lucide:copy', action: async () => handleDuplicate() },
{ name: 'Archive', iconName: 'lucide:archive', action: async () => handleArchive() },
]
},
{
name: 'Delete',
iconName: 'lucide:trash2',
action: async () => handleDelete()
}
]);
// Component-based (implement getContextMenuItems on any element)
class MyComponent extends DeesElement {
getContextMenuItems() {
return [
{ name: 'View Details', iconName: 'lucide:eye', action: async () => { ... } },
{ name: 'Edit', iconName: 'lucide:edit', action: async () => { ... } },
];
}
}
``` ```
#### `DeesSpeechbubble` #### `DeesSpeechbubble`
@@ -1189,7 +1535,7 @@ Progress indicator component for tracking completion status.
Theme provider component that wraps children and provides CSS custom properties for consistent theming. Theme provider component that wraps children and provides CSS custom properties for consistent theming.
```typescript ```typescript
// Basic usage - wrap your app // Basic usage wrap your app
<dees-theme> <dees-theme>
<my-app></my-app> <my-app></my-app>
</dees-theme> </dees-theme>
@@ -1217,76 +1563,71 @@ Theme provider component that wraps children and provides CSS custom properties
--- ---
### Development Components ### Workspace / IDE Components 💻
#### `DeesEditor` A full-featured IDE workspace component suite for building browser-based code editors, terminal interfaces, and documentation viewers.
Code editor component with syntax highlighting and code completion, powered by Monaco Editor.
#### `DeesWorkspace`
Top-level workspace shell that composes editor, file tree, terminal, and bottom bar into an IDE-like layout.
```typescript ```typescript
<dees-editor <dees-workspace></dees-workspace>
```
#### `DeesWorkspaceMonaco`
Monaco Editor integration for code editing with full IntelliSense, syntax highlighting, and language support.
```typescript
<dees-workspace-monaco
.value=${code} .value=${code}
@change=${handleCodeChange}
.language=${'typescript'} .language=${'typescript'}
.theme=${'vs-dark'} @change=${handleCodeChange}
.options=${{ ></dees-workspace-monaco>
lineNumbers: true,
minimap: { enabled: true },
autoClosingBrackets: 'always'
}}
></dees-editor>
``` ```
#### `DeesEditorMarkdown` #### `DeesWorkspaceDiffEditor`
Markdown editor component with live preview. Side-by-side diff editor powered by Monaco for comparing file versions.
```typescript ```typescript
<dees-editor-markdown <dees-workspace-diff-editor
.value=${markdown} .originalValue=${originalCode}
@change=${handleMarkdownChange} .modifiedValue=${modifiedCode}
.options=${{ preview: true, toolbar: true, spellcheck: true }} .language=${'typescript'}
></dees-editor-markdown> ></dees-workspace-diff-editor>
``` ```
#### `DeesEditorMarkdownoutlet` #### `DeesWorkspaceFiletree`
Markdown preview component for rendering markdown content. File tree navigation component with expand/collapse, file icons, and selection.
```typescript ```typescript
<dees-editor-markdownoutlet <dees-workspace-filetree
.markdown=${markdownContent} .files=${fileTreeData}
.theme=${'github'} @file-select=${handleFileSelect}
allowHtml={false} ></dees-workspace-filetree>
></dees-editor-markdownoutlet>
``` ```
#### `DeesTerminal` #### `DeesWorkspaceTerminal`
Terminal emulator component for command-line interface. Terminal emulator component powered by xterm.js.
```typescript ```typescript
<dees-terminal <dees-workspace-terminal></dees-workspace-terminal>
.commands=${{
'echo': (args) => `Echo: ${args.join(' ')}`,
'help': () => 'Available commands: echo, help'
}}
.prompt=${'$'}
.welcomeMessage=${'Welcome! Type "help" for available commands.'}
></dees-terminal>
``` ```
#### `DeesUpdater` #### `DeesWorkspaceTerminalPreview`
Component for managing application updates and version control. Terminal with integrated preview pane for output visualization.
```typescript #### `DeesWorkspaceMarkdown`
<dees-updater Markdown editor with live preview.
.currentVersion=${'1.5.2'}
.checkInterval=${3600000} #### `DeesWorkspaceMarkdownoutlet`
.autoUpdate=${false} Read-only markdown renderer for documentation display.
@update-available=${handleUpdateAvailable}
></dees-updater> #### `DeesWorkspaceBottombar`
``` IDE-style bottom status bar for the workspace.
--- ---
### Auth & Utilities Components ### Pre-built Templates
#### `DeesSimpleAppdash` #### `DeesSimpleAppdash`
Simple application dashboard component for quick prototyping. Simple application dashboard component for quick prototyping.
@@ -1360,6 +1701,8 @@ interface IMenuItem {
action: () => void; action: () => void;
badge?: string | number; badge?: string | number;
badgeVariant?: 'default' | 'success' | 'warning' | 'error'; badgeVariant?: 'default' | 'success' | 'warning' | 'error';
closeable?: boolean;
onClose?: () => void;
} }
// Menu group interface for organized menus // Menu group interface for organized menus
@@ -1375,11 +1718,13 @@ interface IViewDefinition {
id: string; id: string;
name: string; name: string;
iconName?: string; iconName?: string;
content: string | HTMLElement | (() => TemplateResult); content: string | (new () => HTMLElement) | (() => TemplateResult) | (() => Promise<any>);
secondaryMenu?: ISecondaryMenuGroup[]; secondaryMenu?: ISecondaryMenuGroup[];
contentTabs?: IMenuItem[]; contentTabs?: IMenuItem[];
route?: string; route?: string;
badge?: string | number; badge?: string | number;
badgeVariant?: 'default' | 'success' | 'warning' | 'error';
cache?: boolean;
} }
// Activity log entry // Activity log entry
@@ -1392,6 +1737,43 @@ interface IActivityEntry {
iconName?: string; iconName?: string;
data?: Record<string, unknown>; data?: Record<string, unknown>;
} }
// Bottom bar widget
interface IBottomBarWidget {
id: string;
iconName?: string;
label?: string;
status?: 'idle' | 'active' | 'success' | 'warning' | 'error';
tooltip?: string;
loading?: boolean;
onClick?: () => void;
position?: 'left' | 'right';
order?: number;
}
// Bottom bar action button
interface IBottomBarAction {
id: string;
iconName: string;
tooltip?: string;
onClick: () => void | Promise<void>;
disabled?: boolean;
position?: 'left' | 'right';
}
// View activation context (passed to onActivate)
interface IViewActivationContext {
appui: DeesAppui;
viewId: string;
params?: Record<string, string>;
}
// Tile folder item (for DeesTileFolder)
interface ITileFolderItem {
type: 'pdf' | 'image' | 'audio' | 'video' | 'note' | 'folder' | 'unknown';
thumbnailSrc?: string;
name: string;
}
``` ```
--- ---

View File

@@ -1,6 +1,6 @@
import { expect, tap } from '@git.zone/tstest/tapbundle'; import { expect, tap } from '@git.zone/tstest/tapbundle';
import { DeesContextmenu } from '../ts_web/elements/dees-contextmenu/dees-contextmenu.js'; import { DeesContextmenu } from '../ts_web/elements/00group-overlay/dees-contextmenu/dees-contextmenu.js';
import { demoFunc } from '../ts_web/elements/dees-contextmenu/dees-contextmenu.demo.js'; import { demoFunc } from '../ts_web/elements/00group-overlay/dees-contextmenu/dees-contextmenu.demo.js';
tap.test('should render context menu demo', async () => { tap.test('should render context menu demo', async () => {
// Create demo container // Create demo container

View File

@@ -1,5 +1,5 @@
import { expect, tap } from '@git.zone/tstest/tapbundle'; import { expect, tap } from '@git.zone/tstest/tapbundle';
import { DeesContextmenu } from '../ts_web/elements/dees-contextmenu/dees-contextmenu.js'; import { DeesContextmenu } from '../ts_web/elements/00group-overlay/dees-contextmenu/dees-contextmenu.js';
tap.test('should close all parent menus when clicking action in nested submenu', async () => { tap.test('should close all parent menus when clicking action in nested submenu', async () => {
let actionCalled = false; let actionCalled = false;

View File

@@ -1,5 +1,5 @@
import { expect, tap } from '@git.zone/tstest/tapbundle'; import { expect, tap } from '@git.zone/tstest/tapbundle';
import { DeesContextmenu } from '../ts_web/elements/dees-contextmenu/dees-contextmenu.js'; import { DeesContextmenu } from '../ts_web/elements/00group-overlay/dees-contextmenu/dees-contextmenu.js';
import { DeesElement, customElement, html } from '@design.estate/dees-element'; import { DeesElement, customElement, html } from '@design.estate/dees-element';
// Create a test element with shadow DOM // Create a test element with shadow DOM

View File

@@ -1,5 +1,5 @@
import { expect, tap } from '@git.zone/tstest/tapbundle'; import { expect, tap } from '@git.zone/tstest/tapbundle';
import { DeesContextmenu } from '../ts_web/elements/dees-contextmenu/dees-contextmenu.js'; import { DeesContextmenu } from '../ts_web/elements/00group-overlay/dees-contextmenu/dees-contextmenu.js';
tap.test('should show context menu with nested submenu', async () => { tap.test('should show context menu with nested submenu', async () => {
// Create a test element with context menu items // Create a test element with context menu items

View File

@@ -3,8 +3,8 @@ import { tap, expect } from '@git.zone/tstest/tapbundle';
import { import {
resolveWidgetPlacement, resolveWidgetPlacement,
collectCollisions, collectCollisions,
} from '../ts_web/elements/dees-dashboardgrid/layout.ts'; } from '../ts_web/elements/00group-layout/dees-dashboardgrid/layout.ts';
import type { DashboardWidget } from '../ts_web/elements/dees-dashboardgrid/types.ts'; import type { DashboardWidget } from '../ts_web/elements/00group-layout/dees-dashboardgrid/types.ts';
tap.test('dashboardgrid does not overlap widgets after swap attempt', async () => { tap.test('dashboardgrid does not overlap widgets after swap attempt', async () => {
const widgets: DashboardWidget[] = [ const widgets: DashboardWidget[] = [

View File

@@ -1,6 +1,6 @@
import { expect, tap } from '@git.zone/tstest/tapbundle'; import { expect, tap } from '@git.zone/tstest/tapbundle';
import { DeesInputWysiwyg } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-input-wysiwyg.js'; import { DeesInputWysiwyg } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-input-wysiwyg.js';
import { DeesContextmenu } from '../ts_web/elements/dees-contextmenu/dees-contextmenu.js'; import { DeesContextmenu } from '../ts_web/elements/00group-overlay/dees-contextmenu/dees-contextmenu.js';
tap.test('should change block type via context menu', async () => { tap.test('should change block type via context menu', async () => {
// Create WYSIWYG editor with a paragraph // Create WYSIWYG editor with a paragraph

View File

@@ -1,6 +1,6 @@
import { expect, tap } from '@git.zone/tstest/tapbundle'; import { expect, tap } from '@git.zone/tstest/tapbundle';
import { DeesInputWysiwyg } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-input-wysiwyg.js'; import { DeesInputWysiwyg } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-input-wysiwyg.js';
import { DeesContextmenu } from '../ts_web/elements/dees-contextmenu/dees-contextmenu.js'; import { DeesContextmenu } from '../ts_web/elements/00group-overlay/dees-contextmenu/dees-contextmenu.js';
tap.test('should show context menu on WYSIWYG blocks', async () => { tap.test('should show context menu on WYSIWYG blocks', async () => {
// Create WYSIWYG editor // Create WYSIWYG editor

View File

@@ -3,6 +3,6 @@
*/ */
export const commitinfo = { export const commitinfo = {
name: '@design.estate/dees-catalog', name: '@design.estate/dees-catalog',
version: '3.37.0', version: '3.41.0',
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

@@ -10,8 +10,8 @@ import {
} from '@design.estate/dees-element'; } from '@design.estate/dees-element';
import * as domtools from '@design.estate/dees-domtools'; import * as domtools from '@design.estate/dees-domtools';
import { DeesContextmenu } from '../../dees-contextmenu/dees-contextmenu.js'; import { DeesContextmenu } from '../../00group-overlay/dees-contextmenu/dees-contextmenu.js';
import '../../dees-icon/dees-icon.js'; import '../../00group-utility/dees-icon/dees-icon.js';
import type { IActivityEntry, IActivityLogAPI } from '../../interfaces/appconfig.js'; import type { IActivityEntry, IActivityLogAPI } from '../../interfaces/appconfig.js';
import { demoFunc } from './dees-appui-activitylog.demo.js'; import { demoFunc } from './dees-appui-activitylog.demo.js';
import { themeDefaultStyles } from '../../00theme.js'; import { themeDefaultStyles } from '../../00theme.js';
@@ -20,7 +20,7 @@ import { themeDefaultStyles } from '../../00theme.js';
export class DeesAppuiActivitylog extends DeesElement implements IActivityLogAPI { export class DeesAppuiActivitylog extends DeesElement implements IActivityLogAPI {
// STATIC // STATIC
public static demo = demoFunc; public static demo = demoFunc;
public static demoGroup = 'App UI'; public static demoGroups = ['App UI'];
// INSTANCE PROPERTIES // INSTANCE PROPERTIES
@state() @state()

View File

@@ -15,8 +15,8 @@ import { appuiAppbarStyles } from './styles.js';
import { renderAppuiAppbar } from './template.js'; import { renderAppuiAppbar } from './template.js';
// Import required components // Import required components
import '../../dees-icon/dees-icon.js'; import '../../00group-utility/dees-icon/dees-icon.js';
import '../../dees-windowcontrols/dees-windowcontrols.js'; import '../../00group-utility/dees-windowcontrols/dees-windowcontrols.js';
import '../dees-appui-profiledropdown/dees-appui-profiledropdown.js'; import '../dees-appui-profiledropdown/dees-appui-profiledropdown.js';
declare global { declare global {
@@ -28,7 +28,7 @@ declare global {
@customElement('dees-appui-appbar') @customElement('dees-appui-appbar')
export class DeesAppuiBar extends DeesElement { export class DeesAppuiBar extends DeesElement {
public static demo = demoFunc; public static demo = demoFunc;
public static demoGroup = 'App UI'; public static demoGroups = ['App UI'];
// INSTANCE PROPERTIES // INSTANCE PROPERTIES
@property({ type: Array }) @property({ type: Array })

View File

@@ -8,8 +8,8 @@ import {
state, state,
} from '@design.estate/dees-element'; } from '@design.estate/dees-element';
import { themeDefaultStyles } from '../../00theme.js'; import { themeDefaultStyles } from '../../00theme.js';
import '../../dees-icon/dees-icon.js'; import '../../00group-utility/dees-icon/dees-icon.js';
import { DeesContextmenu } from '../../dees-contextmenu/dees-contextmenu.js'; import { DeesContextmenu } from '../../00group-overlay/dees-contextmenu/dees-contextmenu.js';
import type { import type {
IBottomBarWidget, IBottomBarWidget,
IBottomBarAction, IBottomBarAction,
@@ -26,7 +26,7 @@ declare global {
@customElement('dees-appui-bottombar') @customElement('dees-appui-bottombar')
export class DeesAppuiBottombar extends DeesElement implements IBottomBarAPI { export class DeesAppuiBottombar extends DeesElement implements IBottomBarAPI {
public static demo = demoFunc; public static demo = demoFunc;
public static demoGroup = 'App UI'; public static demoGroups = ['App UI'];
// INSTANCE PROPERTIES // INSTANCE PROPERTIES
@state() @state()

View File

@@ -31,7 +31,7 @@ export class DeesAppuiMaincontent extends DeesElement {
</div> </div>
</dees-appui-maincontent> </dees-appui-maincontent>
`; `;
public static demoGroup = 'App UI'; public static demoGroups = ['App UI'];
// INSTANCE // INSTANCE
@property({ @property({

View File

@@ -11,7 +11,7 @@ import {
css, css,
cssManager, cssManager,
} from '@design.estate/dees-element'; } from '@design.estate/dees-element';
import { DeesContextmenu } from '../../dees-contextmenu/dees-contextmenu.js'; import { DeesContextmenu } from '../../00group-overlay/dees-contextmenu/dees-contextmenu.js';
import { demoFunc } from './dees-appui-mainmenu.demo.js'; import { demoFunc } from './dees-appui-mainmenu.demo.js';
import { themeDefaultStyles } from '../../00theme.js'; import { themeDefaultStyles } from '../../00theme.js';
@@ -22,7 +22,7 @@ import { themeDefaultStyles } from '../../00theme.js';
@customElement('dees-appui-mainmenu') @customElement('dees-appui-mainmenu')
export class DeesAppuiMainmenu extends DeesElement { export class DeesAppuiMainmenu extends DeesElement {
public static demo = demoFunc; public static demo = demoFunc;
public static demoGroup = 'App UI'; public static demoGroups = ['App UI'];
// INSTANCE // INSTANCE

View File

@@ -35,7 +35,7 @@ export class DeesAppuiProfileDropdown extends DeesElement {
.isOpen=${true} .isOpen=${true}
></dees-appui-profiledropdown> ></dees-appui-profiledropdown>
`; `;
public static demoGroup = 'App UI'; public static demoGroups = ['App UI'];
@property({ type: Object }) @property({ type: Object })
accessor user: { accessor user: {

View File

@@ -1,8 +1,8 @@
import * as plugins from '../../00plugins.js'; import * as plugins from '../../00plugins.js';
import * as interfaces from '../../interfaces/index.js'; import * as interfaces from '../../interfaces/index.js';
import { DeesContextmenu } from '../../dees-contextmenu/dees-contextmenu.js'; import { DeesContextmenu } from '../../00group-overlay/dees-contextmenu/dees-contextmenu.js';
import '../../dees-icon/dees-icon.js'; import '../../00group-utility/dees-icon/dees-icon.js';
import { import {
DeesElement, DeesElement,
@@ -33,7 +33,7 @@ import { themeDefaultStyles } from '../../00theme.js';
@customElement('dees-appui-secondarymenu') @customElement('dees-appui-secondarymenu')
export class DeesAppuiSecondarymenu extends DeesElement { export class DeesAppuiSecondarymenu extends DeesElement {
public static demo = demoFunc; public static demo = demoFunc;
public static demoGroup = 'App UI'; public static demoGroups = ['App UI'];
// INSTANCE // INSTANCE

View File

@@ -18,7 +18,7 @@ import { themeDefaultStyles } from '../../00theme.js';
@customElement('dees-appui-tabs') @customElement('dees-appui-tabs')
export class DeesAppuiTabs extends DeesElement { export class DeesAppuiTabs extends DeesElement {
public static demo = demoFunc; public static demo = demoFunc;
public static demoGroup = 'App UI'; public static demoGroups = ['App UI'];
// INSTANCE // INSTANCE
@property({ @property({

View File

@@ -3,8 +3,8 @@ import type { DeesAppui } from './dees-appui.js';
import type { IAppConfig, IViewActivationContext } from '../../interfaces/appconfig.js'; import type { IAppConfig, IViewActivationContext } from '../../interfaces/appconfig.js';
import type * as interfaces from '../../interfaces/index.js'; import type * as interfaces from '../../interfaces/index.js';
import '@design.estate/dees-wcctools/demotools'; import '@design.estate/dees-wcctools/demotools';
import '../../dees-statsgrid/dees-statsgrid.js'; import '../../00group-dataview/dees-statsgrid/dees-statsgrid.js';
import type { IStatsTile } from '../../dees-statsgrid/dees-statsgrid.js'; import type { IStatsTile } from '../../00group-dataview/dees-statsgrid/dees-statsgrid.js';
// Demo view component with lifecycle hooks // Demo view component with lifecycle hooks
@customElement('demo-dashboard-view') @customElement('demo-dashboard-view')

View File

@@ -39,7 +39,7 @@ declare global {
@customElement('dees-appui') @customElement('dees-appui')
export class DeesAppui extends DeesElement { export class DeesAppui extends DeesElement {
public static demo = demoFunc; public static demo = demoFunc;
public static demoGroup = 'App UI'; public static demoGroups = ['App UI'];
// ========================================== // ==========================================
// REACTIVE OBSERVABLES (RxJS Subjects) // REACTIVE OBSERVABLES (RxJS Subjects)

View File

@@ -1,6 +1,6 @@
import { html, css } from '@design.estate/dees-element'; import { html, css } from '@design.estate/dees-element';
import '../00group-button/dees-button/dees-button.js'; import '../00group-button/dees-button/dees-button.js';
import '../dees-panel/dees-panel.js'; import '../../00group-layout/dees-panel/dees-panel.js';
import '@design.estate/dees-wcctools/demotools'; import '@design.estate/dees-wcctools/demotools';
export const demoFunc = () => html` export const demoFunc = () => html`

View File

@@ -1,6 +1,6 @@
import * as plugins from '../00plugins.js'; import * as plugins from '../../00plugins.js';
import { zIndexRegistry } from '../00zindex.js'; import { zIndexRegistry } from '../../00zindex.js';
import { cssGeistFontFamily } from '../00fonts.js'; import { cssGeistFontFamily } from '../../00fonts.js';
import { import {
cssManager, cssManager,
css, css,
@@ -12,13 +12,14 @@ import {
property, property,
state, state,
} from '@design.estate/dees-element'; } from '@design.estate/dees-element';
import { DeesWindowLayer } from '../dees-windowlayer/dees-windowlayer.js'; import { DeesWindowLayer } from '../../00group-overlay/dees-windowlayer/dees-windowlayer.js';
import '../dees-icon/dees-icon.js'; import '../../00group-utility/dees-icon/dees-icon.js';
import { themeDefaultStyles } from '../00theme.js'; import { themeDefaultStyles } from '../../00theme.js';
@customElement('dees-mobilenavigation') @customElement('dees-mobilenavigation')
export class DeesMobilenavigation extends DeesElement { export class DeesMobilenavigation extends DeesElement {
// STATIC // STATIC
public static demoGroups = ['App UI'];
public static demo = () => html` public static demo = () => html`
<dees-button @click=${() => { <dees-button @click=${() => {
DeesMobilenavigation.createAndShow([ DeesMobilenavigation.createAndShow([

View File

@@ -8,3 +8,4 @@ export * from './dees-appui-mainmenu/index.js';
export * from './dees-appui-secondarymenu/index.js'; export * from './dees-appui-secondarymenu/index.js';
export * from './dees-appui-profiledropdown/index.js'; export * from './dees-appui-profiledropdown/index.js';
export * from './dees-appui-tabs/index.js'; export * from './dees-appui-tabs/index.js';
export * from './dees-mobilenavigation/index.js';

View File

@@ -16,7 +16,7 @@ export class DeesButtonExit extends DeesElement {
public static demo = () => html` public static demo = () => html`
<dees-button-exit></dees-button-exit> <dees-button-exit></dees-button-exit>
`; `;
public static demoGroup = 'Button'; public static demoGroups = ['Button'];
// INSTANCE // INSTANCE
@property({ @property({

View File

@@ -21,7 +21,7 @@ declare global {
@customElement('dees-button-group') @customElement('dees-button-group')
export class DeesButtonGroup extends DeesElement { export class DeesButtonGroup extends DeesElement {
public static demo = demoFunc; public static demo = demoFunc;
public static demoGroup = 'Button'; public static demoGroups = ['Button'];
@property() @property()
accessor label: string = ''; accessor label: string = '';

View File

@@ -1,10 +1,10 @@
import { html, css, cssManager, domtools } from '@design.estate/dees-element'; import { html, css, cssManager, domtools } from '@design.estate/dees-element';
import '@design.estate/dees-wcctools/demotools'; import '@design.estate/dees-wcctools/demotools';
import '../../dees-panel/dees-panel.js'; import '../../00group-layout/dees-panel/dees-panel.js';
import '../../00group-form/dees-form/dees-form.js'; import '../../00group-form/dees-form/dees-form.js';
import '../../00group-form/dees-form-submit/dees-form-submit.js'; import '../../00group-form/dees-form-submit/dees-form-submit.js';
import '../../00group-input/dees-input-text/dees-input-text.js'; import '../../00group-input/dees-input-text/dees-input-text.js';
import '../../dees-icon/dees-icon.js'; import '../../00group-utility/dees-icon/dees-icon.js';
import type { DeesButton } from '../dees-button/dees-button.js'; import type { DeesButton } from '../dees-button/dees-button.js';
export const demoFunc = () => html` export const demoFunc = () => html`

View File

@@ -23,7 +23,7 @@ declare global {
@customElement('dees-button') @customElement('dees-button')
export class DeesButton extends DeesElement { export class DeesButton extends DeesElement {
public static demo = demoFunc; public static demo = demoFunc;
public static demoGroup = 'Button'; public static demoGroups = ['Button'];
@property({ @property({
reflect: true, reflect: true,

View File

@@ -23,7 +23,7 @@ declare global {
@customElement('dees-chart-area') @customElement('dees-chart-area')
export class DeesChartArea extends DeesElement { export class DeesChartArea extends DeesElement {
public static demo = demoFunc; public static demo = demoFunc;
public static demoGroup = 'Chart'; public static demoGroups = ['Chart'];
// instance // instance
@state() @state()

View File

@@ -44,7 +44,7 @@ export interface ILogMetrics {
@customElement('dees-chart-log') @customElement('dees-chart-log')
export class DeesChartLog extends DeesElement { export class DeesChartLog extends DeesElement {
public static demo = demoFunc; public static demo = demoFunc;
public static demoGroup = 'Chart'; public static demoGroups = ['Chart', 'Workspace'];
@property() @property()
accessor label: string = 'Server Logs'; accessor label: string = 'Server Logs';

View File

@@ -15,7 +15,7 @@ import type { HLJSApi } from 'highlight.js';
import * as smartstring from '@push.rocks/smartstring'; import * as smartstring from '@push.rocks/smartstring';
import * as domtools from '@design.estate/dees-domtools'; import * as domtools from '@design.estate/dees-domtools';
import { DeesContextmenu } from '../../dees-contextmenu/dees-contextmenu.js'; import { DeesContextmenu } from '../../00group-overlay/dees-contextmenu/dees-contextmenu.js';
import { DeesServiceLibLoader } from '../../../services/index.js'; import { DeesServiceLibLoader } from '../../../services/index.js';
declare global { declare global {
@@ -27,7 +27,7 @@ declare global {
@customElement('dees-dataview-codebox') @customElement('dees-dataview-codebox')
export class DeesDataviewCodebox extends DeesElement { export class DeesDataviewCodebox extends DeesElement {
public static demo = demoFunc; public static demo = demoFunc;
public static demoGroup = 'Data View'; public static demoGroups = ['Data View', 'Workspace'];
@property() @property()
accessor progLang: string = 'typescript'; accessor progLang: string = 'typescript';
@@ -206,9 +206,7 @@ export class DeesDataviewCodebox extends DeesElement {
}}" }}"
> >
<div class="appbar"> <div class="appbar">
<dees-windowcontrols type="mac" position="left"></dees-windowcontrols>
<div class="fileName">index.ts</div> <div class="fileName">index.ts</div>
<dees-windowcontrols type="mac" position="right"></dees-windowcontrols>
</div> </div>
<div class="codegrid"> <div class="codegrid">
<div class="lineNumbers"> <div class="lineNumbers">

View File

@@ -15,7 +15,7 @@ import {
} from '@design.estate/dees-element'; } from '@design.estate/dees-element';
import * as tsclass from '@tsclass/tsclass'; import * as tsclass from '@tsclass/tsclass';
import { DeesContextmenu } from '../../dees-contextmenu/dees-contextmenu.js'; import { DeesContextmenu } from '../../00group-overlay/dees-contextmenu/dees-contextmenu.js';
import { themeDefaultStyles } from '../../00theme.js'; import { themeDefaultStyles } from '../../00theme.js';
declare global { declare global {
@@ -27,7 +27,7 @@ declare global {
@customElement('dees-dataview-statusobject') @customElement('dees-dataview-statusobject')
export class DeesDataviewStatusobject extends DeesElement { export class DeesDataviewStatusobject extends DeesElement {
public static demo = demoFunc; public static demo = demoFunc;
public static demoGroup = 'Data View'; public static demoGroups = ['Data View'];
@property({ type: Object }) accessor statusObject: tsclass.code.IStatusObject; @property({ type: Object }) accessor statusObject: tsclass.code.IStatusObject;

Some files were not shown because too many files have changed in this diff Show More