Compare commits

...

6 Commits

Author SHA1 Message Date
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
219 changed files with 5537 additions and 567 deletions

View File

@@ -1,5 +1,34 @@
# Changelog # Changelog
## 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) ## 2026-01-25 - 3.37.1 - fix(editor)
fix monaco/editor layout, update dev deps, simplify watch script and remove Playwright snapshots fix monaco/editor layout, update dev deps, simplify watch script and remove Playwright snapshots

View File

@@ -1,6 +1,6 @@
{ {
"name": "@design.estate/dees-catalog", "name": "@design.estate/dees-catalog",
"version": "3.37.1", "version": "3.39.1",
"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",
@@ -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",
@@ -46,7 +46,7 @@
"devDependencies": { "devDependencies": {
"@git.zone/tsbuild": "^4.1.2", "@git.zone/tsbuild": "^4.1.2",
"@git.zone/tsbundle": "^2.8.3", "@git.zone/tsbundle": "^2.8.3",
"@git.zone/tstest": "^3.1.7", "@git.zone/tstest": "^3.1.8",
"@git.zone/tswatch": "^3.0.1", "@git.zone/tswatch": "^3.0.1",
"@push.rocks/projectinfo": "^5.0.2", "@push.rocks/projectinfo": "^5.0.2",
"@types/node": "^25.0.10" "@types/node": "^25.0.10"

53
pnpm-lock.yaml generated
View File

@@ -15,8 +15,8 @@ importers:
specifier: ^2.1.5 specifier: ^2.1.5
version: 2.1.5 version: 2.1.5
'@design.estate/dees-wcctools': '@design.estate/dees-wcctools':
specifier: ^3.7.1 specifier: ^3.8.0
version: 3.7.1 version: 3.8.0
'@fortawesome/fontawesome-svg-core': '@fortawesome/fontawesome-svg-core':
specifier: ^7.1.0 specifier: ^7.1.0
version: 7.1.0 version: 7.1.0
@@ -94,8 +94,8 @@ importers:
specifier: ^2.8.3 specifier: ^2.8.3
version: 2.8.3 version: 2.8.3
'@git.zone/tstest': '@git.zone/tstest':
specifier: ^3.1.7 specifier: ^3.1.8
version: 3.1.7(@push.rocks/smartserve@2.0.1)(socks@2.8.7)(typescript@5.9.3) version: 3.1.8(@push.rocks/smartserve@2.0.1)(socks@2.8.7)(typescript@5.9.3)
'@git.zone/tswatch': '@git.zone/tswatch':
specifier: ^3.0.1 specifier: ^3.0.1
version: 3.0.1(@tiptap/pm@2.27.2) version: 3.0.1(@tiptap/pm@2.27.2)
@@ -340,6 +340,9 @@ packages:
'@cloudflare/workers-types@4.20260124.0': '@cloudflare/workers-types@4.20260124.0':
resolution: {integrity: sha512-h6TJlew6AtGuEXFc+k5ifalk+tg3fkg0lla6XbMAb2AKKfJGwlFNTwW2xyT/Ha92KY631CIJ+Ace08DPdFohdA==} resolution: {integrity: sha512-h6TJlew6AtGuEXFc+k5ifalk+tg3fkg0lla6XbMAb2AKKfJGwlFNTwW2xyT/Ha92KY631CIJ+Ace08DPdFohdA==}
'@cloudflare/workers-types@4.20260127.0':
resolution: {integrity: sha512-4M1HLcWViSdT/pAeDGEB5x5P3sqW7UIi34QrBRnxXbqjAY9if8vBU/lWRWnM+UqKzxWGB2LYjEVOzZrp0jZL+w==}
'@configvault.io/interfaces@1.0.17': '@configvault.io/interfaces@1.0.17':
resolution: {integrity: sha512-bEcCUR2VBDJsTin8HQh8Uw/mlYl2v8A3jMIaQ+MTB9Hrqd6CZL2dL7iJdWyFl/3EIX+LDxWFR+Oq7liIq7w+1Q==} resolution: {integrity: sha512-bEcCUR2VBDJsTin8HQh8Uw/mlYl2v8A3jMIaQ+MTB9Hrqd6CZL2dL7iJdWyFl/3EIX+LDxWFR+Oq7liIq7w+1Q==}
@@ -355,8 +358,8 @@ packages:
'@design.estate/dees-element@2.1.5': '@design.estate/dees-element@2.1.5':
resolution: {integrity: sha512-czUOFvBiUKi34I+/keDRDc71fuORZS0NfbSuD2jJ4D1ODiTPjaZ6A6SkdQ2QqCEzVsx73XF99Pu8pxPnaOLnHg==} resolution: {integrity: sha512-czUOFvBiUKi34I+/keDRDc71fuORZS0NfbSuD2jJ4D1ODiTPjaZ6A6SkdQ2QqCEzVsx73XF99Pu8pxPnaOLnHg==}
'@design.estate/dees-wcctools@3.7.1': '@design.estate/dees-wcctools@3.8.0':
resolution: {integrity: sha512-BiNWghUoC05RTQOGVCTK+wis6d18LyLY+2p8vHC0q2OBw9hrPoY8k9EplpQgY40MvP0sTXWUwaa7VPXra8ASjA==} resolution: {integrity: sha512-CC14iVKUrguzD9jIrdPBd9fZ4egVJEZMxl5y8iy0l7WLumeoYvGsoXj5INVkRPLRVLqziIdi4Je1hXqHt2NU+g==}
'@emnapi/core@1.8.1': '@emnapi/core@1.8.1':
resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==}
@@ -559,8 +562,8 @@ packages:
resolution: {integrity: sha512-NEcnsjvlC1o3Z6SS3VhKCf6Ev+Sh4EAinmggslrIR/ppMrvjDbXNFXoyr3PB+GLeSAR0JRZ1fGvVYjpEzjBdIg==} resolution: {integrity: sha512-NEcnsjvlC1o3Z6SS3VhKCf6Ev+Sh4EAinmggslrIR/ppMrvjDbXNFXoyr3PB+GLeSAR0JRZ1fGvVYjpEzjBdIg==}
hasBin: true hasBin: true
'@git.zone/tstest@3.1.7': '@git.zone/tstest@3.1.8':
resolution: {integrity: sha512-YCDA+65LJhoY3WJxrNduKlpGf37aq4bFe+fdRqE0dZ2W1f7j3sUunBaBzckShSHKRjkMdPZKr0W0sXFXUK/PcA==} resolution: {integrity: sha512-nmiLGeOkKMkLDyIk5BUBLx5ExskFbKHKlPdrWCARPVFkU4cAAiuIyJWVfLwISoS0TO/zSInLqArPwIc76yvaNw==}
hasBin: true hasBin: true
'@git.zone/tswatch@3.0.1': '@git.zone/tswatch@3.0.1':
@@ -851,8 +854,8 @@ packages:
'@push.rocks/smartbucket@3.3.10': '@push.rocks/smartbucket@3.3.10':
resolution: {integrity: sha512-0H2MioALspC8Aj0Q1FPCs2w4k2u9oJg7Q5yM8+1TZo7aRfrdxgM5HQ7z3apUaqC3ZEDewW6vSlttjHFHhMEC3A==} resolution: {integrity: sha512-0H2MioALspC8Aj0Q1FPCs2w4k2u9oJg7Q5yM8+1TZo7aRfrdxgM5HQ7z3apUaqC3ZEDewW6vSlttjHFHhMEC3A==}
'@push.rocks/smartbucket@4.3.1': '@push.rocks/smartbucket@4.4.1':
resolution: {integrity: sha512-fMA8w98/E+usaaLkLm6wDj1XSpR0shTtG8AxTdwWIlH1YemQj/aCf4wReezDxUFVoUpC3HMzzV2RTFtQvHndeQ==} resolution: {integrity: sha512-68GFLgJKW+LXvuN+yuV8O/FozGMecraoT+PkI5whdRPFe7N3u2iYIHWAUjvQvVU4ygpdJv0kih2JDf5k3PYycw==}
'@push.rocks/smartbuffer@3.0.5': '@push.rocks/smartbuffer@3.0.5':
resolution: {integrity: sha512-pWYF08Mn8s/KF/9nHRk7pZPzuMjmYVQay2c5gGexdayxn1W4eCSYYhWH73vR2JBfGeGq/izbRNuUuEaIEeTIKA==} resolution: {integrity: sha512-pWYF08Mn8s/KF/9nHRk7pZPzuMjmYVQay2c5gGexdayxn1W4eCSYYhWH73vR2JBfGeGq/izbRNuUuEaIEeTIKA==}
@@ -1927,8 +1930,8 @@ packages:
asynckit@0.4.0: asynckit@0.4.0:
resolution: {integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k=} resolution: {integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k=}
axios@1.13.2: axios@1.13.3:
resolution: {integrity: sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==} resolution: {integrity: sha512-ERT8kdX7DZjtUm7IitEyV7InTHAF42iJuMArIiDIV5YtPanJkgw4hw5Dyg9fh0mihdWNn1GKaeIWErfe56UQ1g==}
b4a@1.7.3: b4a@1.7.3:
resolution: {integrity: sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==} resolution: {integrity: sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==}
@@ -1952,8 +1955,8 @@ packages:
bare-abort-controller: bare-abort-controller:
optional: true optional: true
bare-fs@4.5.2: bare-fs@4.5.3:
resolution: {integrity: sha512-veTnRzkb6aPHOvSKIOy60KzURfBdUflr5VReI+NSaPL6xf+XLdONQgZgpYvUuZLVQ8dCqxpBAudaOM1+KpAUxw==} resolution: {integrity: sha512-9+kwVx8QYvt3hPWnmb19tPnh38c6Nihz8Lx3t0g9+4GoIf3/fTgYwM4Z6NxgI+B9elLQA7mLE9PpqcWtOMRDiQ==}
engines: {bare: '>=1.16.0'} engines: {bare: '>=1.16.0'}
peerDependencies: peerDependencies:
bare-buffer: '*' bare-buffer: '*'
@@ -4048,7 +4051,7 @@ snapshots:
'@api.global/typedrequest': 3.2.5 '@api.global/typedrequest': 3.2.5
'@api.global/typedrequest-interfaces': 3.0.19 '@api.global/typedrequest-interfaces': 3.0.19
'@api.global/typedsocket': 3.1.1(@push.rocks/smartserve@2.0.1) '@api.global/typedsocket': 3.1.1(@push.rocks/smartserve@2.0.1)
'@cloudflare/workers-types': 4.20260124.0 '@cloudflare/workers-types': 4.20260127.0
'@design.estate/dees-comms': 1.0.30 '@design.estate/dees-comms': 1.0.30
'@push.rocks/lik': 6.2.2 '@push.rocks/lik': 6.2.2
'@push.rocks/smartchok': 1.2.0 '@push.rocks/smartchok': 1.2.0
@@ -4719,6 +4722,8 @@ snapshots:
'@cloudflare/workers-types@4.20260124.0': {} '@cloudflare/workers-types@4.20260124.0': {}
'@cloudflare/workers-types@4.20260127.0': {}
'@configvault.io/interfaces@1.0.17': '@configvault.io/interfaces@1.0.17':
dependencies: dependencies:
'@api.global/typedrequest-interfaces': 3.0.19 '@api.global/typedrequest-interfaces': 3.0.19
@@ -4727,7 +4732,7 @@ snapshots:
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
@@ -4803,7 +4808,7 @@ snapshots:
- supports-color - supports-color
- vue - vue
'@design.estate/dees-wcctools@3.7.1': '@design.estate/dees-wcctools@3.8.0':
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
@@ -5002,7 +5007,7 @@ snapshots:
'@push.rocks/smartshell': 3.3.0 '@push.rocks/smartshell': 3.3.0
tsx: 4.21.0 tsx: 4.21.0
'@git.zone/tstest@3.1.7(@push.rocks/smartserve@2.0.1)(socks@2.8.7)(typescript@5.9.3)': '@git.zone/tstest@3.1.8(@push.rocks/smartserve@2.0.1)(socks@2.8.7)(typescript@5.9.3)':
dependencies: dependencies:
'@api.global/typedserver': 3.0.80(@push.rocks/smartserve@2.0.1) '@api.global/typedserver': 3.0.80(@push.rocks/smartserve@2.0.1)
'@git.zone/tsbundle': 2.8.3 '@git.zone/tsbundle': 2.8.3
@@ -5572,7 +5577,7 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- aws-crt - aws-crt
'@push.rocks/smartbucket@4.3.1': '@push.rocks/smartbucket@4.4.1':
dependencies: dependencies:
'@aws-sdk/client-s3': 3.975.0 '@aws-sdk/client-s3': 3.975.0
'@push.rocks/smartmime': 2.0.4 '@push.rocks/smartmime': 2.0.4
@@ -6023,7 +6028,7 @@ snapshots:
'@push.rocks/smarts3@3.0.3': '@push.rocks/smarts3@3.0.3':
dependencies: dependencies:
'@push.rocks/smartbucket': 4.3.1 '@push.rocks/smartbucket': 4.4.1
'@push.rocks/smartfs': 1.3.1 '@push.rocks/smartfs': 1.3.1
'@push.rocks/smartpath': 6.0.0 '@push.rocks/smartpath': 6.0.0
'@push.rocks/smartxml': 2.0.0 '@push.rocks/smartxml': 2.0.0
@@ -7112,7 +7117,7 @@ snapshots:
dependencies: dependencies:
'@peculiar/x509': 1.14.3 '@peculiar/x509': 1.14.3
asn1js: 3.0.7 asn1js: 3.0.7
axios: 1.13.2(debug@4.4.3) axios: 1.13.3(debug@4.4.3)
debug: 4.4.3 debug: 4.4.3
node-forge: 1.3.3 node-forge: 1.3.3
transitivePeerDependencies: transitivePeerDependencies:
@@ -7171,7 +7176,7 @@ snapshots:
asynckit@0.4.0: {} asynckit@0.4.0: {}
axios@1.13.2(debug@4.4.3): axios@1.13.3(debug@4.4.3):
dependencies: dependencies:
follow-redirects: 1.15.11(debug@4.4.3) follow-redirects: 1.15.11(debug@4.4.3)
form-data: 4.0.5 form-data: 4.0.5
@@ -7187,7 +7192,7 @@ snapshots:
bare-events@2.8.2: {} bare-events@2.8.2: {}
bare-fs@4.5.2: bare-fs@4.5.3:
dependencies: dependencies:
bare-events: 2.8.2 bare-events: 2.8.2
bare-path: 3.0.0 bare-path: 3.0.0
@@ -9403,7 +9408,7 @@ snapshots:
pump: 3.0.3 pump: 3.0.3
tar-stream: 3.1.7 tar-stream: 3.1.7
optionalDependencies: optionalDependencies:
bare-fs: 4.5.2 bare-fs: 4.5.3
bare-path: 3.0.0 bare-path: 3.0.0
transitivePeerDependencies: transitivePeerDependencies:
- bare-abort-controller - bare-abort-controller

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
@@ -974,3 +1061,50 @@ Features:
- `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)

406
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 **70+ 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,13 @@ 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
## 📦 Installation ## 📦 Installation
@@ -52,16 +53,16 @@ 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) |
| **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** | [`DeesEditor`](#deeseditor), [`DeesTerminal`](#deesterminal), [`DeesUpdater`](#deesupdater) |
| **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 +118,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 +135,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 +288,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 +344,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 +683,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 +708,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 +728,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 +737,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 +753,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 +882,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 +929,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 +956,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 +993,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 +1169,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 +1178,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 +1194,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 +1217,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.
@@ -1189,7 +1367,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,7 +1395,7 @@ Theme provider component that wraps children and provides CSS custom properties
--- ---
### Development Components ### Workspace / IDE Components
#### `DeesEditor` #### `DeesEditor`
Code editor component with syntax highlighting and code completion, powered by Monaco Editor. Code editor component with syntax highlighting and code completion, powered by Monaco Editor.
@@ -1236,28 +1414,6 @@ Code editor component with syntax highlighting and code completion, powered by M
></dees-editor> ></dees-editor>
``` ```
#### `DeesEditorMarkdown`
Markdown editor component with live preview.
```typescript
<dees-editor-markdown
.value=${markdown}
@change=${handleMarkdownChange}
.options=${{ preview: true, toolbar: true, spellcheck: true }}
></dees-editor-markdown>
```
#### `DeesEditorMarkdownoutlet`
Markdown preview component for rendering markdown content.
```typescript
<dees-editor-markdownoutlet
.markdown=${markdownContent}
.theme=${'github'}
allowHtml={false}
></dees-editor-markdownoutlet>
```
#### `DeesTerminal` #### `DeesTerminal`
Terminal emulator component for command-line interface. Terminal emulator component for command-line interface.
@@ -1286,7 +1442,7 @@ Component for managing application updates and version control.
--- ---
### Auth & Utilities Components ### Pre-built Templates
#### `DeesSimpleAppdash` #### `DeesSimpleAppdash`
Simple application dashboard component for quick prototyping. Simple application dashboard component for quick prototyping.
@@ -1360,6 +1516,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 +1533,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 +1552,36 @@ 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>;
}
``` ```
--- ---

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.1', version: '3.39.1',
description: 'A comprehensive library that provides dynamic web components for building sophisticated and modern web applications using JavaScript and TypeScript.' description: 'A comprehensive library that provides dynamic web components for building sophisticated and modern web applications using JavaScript and TypeScript.'
} }

View File

@@ -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;

View File

@@ -1,6 +1,6 @@
import { html, css, cssManager } from '@design.estate/dees-element'; import { html, css, cssManager } 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 type { IStatsTile, ICpuCore, IPartitionData, IDiskData } from '../dees-statsgrid/dees-statsgrid.js'; import type { IStatsTile, ICpuCore, IPartitionData, IDiskData } from '../dees-statsgrid/dees-statsgrid.js';
// Helper function to generate random CPU core data // Helper function to generate random CPU core data

View File

@@ -1,6 +1,6 @@
import { demoFunc } from './dees-statsgrid.demo.js'; import { demoFunc } from './dees-statsgrid.demo.js';
import * as plugins from '../00plugins.js'; import * as plugins from '../../00plugins.js';
import { cssGeistFontFamily } from '../00fonts.js'; import { cssGeistFontFamily } from '../../00fonts.js';
import { import {
customElement, customElement,
html, html,
@@ -13,10 +13,10 @@ import {
} from '@design.estate/dees-element'; } from '@design.estate/dees-element';
import type { TemplateResult } from '@design.estate/dees-element'; import type { TemplateResult } from '@design.estate/dees-element';
import '../dees-icon/dees-icon.js'; import '../../00group-utility/dees-icon/dees-icon.js';
import '../dees-contextmenu/dees-contextmenu.js'; import '../../00group-overlay/dees-contextmenu/dees-contextmenu.js';
import '../00group-button/dees-button/dees-button.js'; import '../../00group-button/dees-button/dees-button.js';
import { themeDefaultStyles } from '../00theme.js'; import { themeDefaultStyles } from '../../00theme.js';
declare global { declare global {
interface HTMLElementTagNameMap { interface HTMLElementTagNameMap {
@@ -96,6 +96,7 @@ export interface IStatsTile {
@customElement('dees-statsgrid') @customElement('dees-statsgrid')
export class DeesStatsGrid extends DeesElement { export class DeesStatsGrid extends DeesElement {
public static demo = demoFunc; public static demo = demoFunc;
public static demoGroups = ['Data View'];
@property({ type: Array }) @property({ type: Array })
accessor tiles: IStatsTile[] = []; accessor tiles: IStatsTile[] = [];

View File

@@ -1,5 +1,5 @@
import { type ITableAction } from './dees-table.js'; import { type ITableAction } from './dees-table.js';
import * as plugins from '../00plugins.js'; import * as plugins from '../../00plugins.js';
import { html, css, cssManager } from '@design.estate/dees-element'; import { html, css, cssManager } from '@design.estate/dees-element';
interface ITableDemoData { interface ITableDemoData {

View File

@@ -1,10 +1,10 @@
import * as plugins from '../00plugins.js'; import * as plugins from '../../00plugins.js';
import { demoFunc } from './dees-table.demo.js'; import { demoFunc } from './dees-table.demo.js';
import { customElement, html, DeesElement, property, type TemplateResult, directives } from '@design.estate/dees-element'; import { customElement, html, DeesElement, property, type TemplateResult, directives } from '@design.estate/dees-element';
import { DeesContextmenu } from '../dees-contextmenu/dees-contextmenu.js'; import { DeesContextmenu } from '../../00group-overlay/dees-contextmenu/dees-contextmenu.js';
import * as domtools from '@design.estate/dees-domtools'; import * as domtools from '@design.estate/dees-domtools';
import { type TIconKey } from '../dees-icon/dees-icon.js'; import { type TIconKey } from '../../00group-utility/dees-icon/dees-icon.js';
import { tableStyles } from './styles.js'; import { tableStyles } from './styles.js';
import type { Column, ITableAction, ITableActionDataArg, TDisplayFunction } from './types.js'; import type { Column, ITableAction, ITableActionDataArg, TDisplayFunction } from './types.js';
import { import {
@@ -14,7 +14,7 @@ import {
getViewData as getViewDataFn, getViewData as getViewDataFn,
} from './data.js'; } from './data.js';
import { compileLucenePredicate } from './lucene.js'; import { compileLucenePredicate } from './lucene.js';
import { themeDefaultStyles } from '../00theme.js'; import { themeDefaultStyles } from '../../00theme.js';
export type { Column, ITableAction, ITableActionDataArg, TDisplayFunction } from './types.js'; export type { Column, ITableAction, ITableActionDataArg, TDisplayFunction } from './types.js';
@@ -30,6 +30,7 @@ declare global {
@customElement('dees-table') @customElement('dees-table')
export class DeesTable<T> extends DeesElement { export class DeesTable<T> extends DeesElement {
public static demo = demoFunc; public static demo = demoFunc;
public static demoGroups = ['Data View'];
// INSTANCE // INSTANCE
@property({ @property({

View File

@@ -1,6 +1,6 @@
import { cssManager, css, type CSSResult } from '@design.estate/dees-element'; import { cssManager, css, type CSSResult } from '@design.estate/dees-element';
import { cssGeistFontFamily } from '../00fonts.js'; import { cssGeistFontFamily } from '../../00fonts.js';
import { themeDefaultStyles } from '../00theme.js'; import { themeDefaultStyles } from '../../00theme.js';
export const tableStyles: CSSResult[] = [ export const tableStyles: CSSResult[] = [
themeDefaultStyles, themeDefaultStyles,

View File

@@ -1,5 +1,5 @@
import type { TemplateResult } from '@design.estate/dees-element'; import type { TemplateResult } from '@design.estate/dees-element';
import type { TIconKey } from '../dees-icon/dees-icon.js'; import type { TIconKey } from '../../00group-utility/dees-icon/dees-icon.js';
export interface ITableActionDataArg<T> { export interface ITableActionDataArg<T> {
item: T; item: T;

View File

@@ -1,3 +1,5 @@
// Data View Components // Data View Components
export * from './dees-dataview-codebox/index.js'; export * from './dees-dataview-codebox/index.js';
export * from './dees-dataview-statusobject/index.js'; export * from './dees-dataview-statusobject/index.js';
export * from './dees-table/index.js';
export * from './dees-statsgrid/index.js';

View File

@@ -7,8 +7,8 @@ import {
state, state,
cssManager, cssManager,
} 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 type { import type {
IActionBarOptions, IActionBarOptions,
IActionBarResult, IActionBarResult,
@@ -25,6 +25,7 @@ declare global {
@customElement('dees-actionbar') @customElement('dees-actionbar')
export class DeesActionbar extends DeesElement { export class DeesActionbar extends DeesElement {
// STATIC // STATIC
public static demoGroups = ['Feedback', 'Overlay'];
public static demo = () => { public static demo = () => {
const getActionbar = (e: Event) => { const getActionbar = (e: Event) => {
const button = e.currentTarget as HTMLElement; const button = e.currentTarget as HTMLElement;

View File

@@ -11,7 +11,7 @@ import {
import * as domtools from '@design.estate/dees-domtools'; import * as domtools from '@design.estate/dees-domtools';
import { demoFunc } from './dees-badge.demo.js'; import { demoFunc } from './dees-badge.demo.js';
import { themeDefaultStyles } from '../00theme.js'; import { themeDefaultStyles } from '../../00theme.js';
declare global { declare global {
interface HTMLElementTagNameMap { interface HTMLElementTagNameMap {
@@ -22,6 +22,7 @@ declare global {
@customElement('dees-badge') @customElement('dees-badge')
export class DeesBadge extends DeesElement { export class DeesBadge extends DeesElement {
public static demo = demoFunc; public static demo = demoFunc;
public static demoGroups = ['Feedback'];
@property({ type: String }) @property({ type: String })
accessor type: 'default' | 'primary' | 'success' | 'warning' | 'error' = 'default'; accessor type: 'default' | 'primary' | 'success' | 'warning' | 'error' = 'default';

View File

@@ -11,7 +11,7 @@ import {
import * as domtools from '@design.estate/dees-domtools'; import * as domtools from '@design.estate/dees-domtools';
import { demoFunc } from './dees-hint.demo.js'; import { demoFunc } from './dees-hint.demo.js';
import { themeDefaultStyles } from '../00theme.js'; import { themeDefaultStyles } from '../../00theme.js';
declare global { declare global {
interface HTMLElementTagNameMap { interface HTMLElementTagNameMap {
@@ -22,6 +22,7 @@ declare global {
@customElement('dees-hint') @customElement('dees-hint')
export class DeesHint extends DeesElement { export class DeesHint extends DeesElement {
public static demo = demoFunc; public static demo = demoFunc;
public static demoGroups = ['Feedback'];
@property({ type: String }) @property({ type: String })
accessor type: 'info' | 'warn' | 'error' | 'critical' = 'info'; accessor type: 'info' | 'warn' | 'error' | 'critical' = 'info';

View File

@@ -1,5 +1,5 @@
import * as plugins from '../00plugins.js'; import * as plugins from '../../00plugins.js';
import * as colors from '../00colors.js'; import * as colors from '../../00colors.js';
import { demoFunc } from './dees-progressbar.demo.js'; import { demoFunc } from './dees-progressbar.demo.js';
import { import {
customElement, customElement,
@@ -16,12 +16,13 @@ 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 { themeDefaultStyles } from '../00theme.js'; import { themeDefaultStyles } from '../../00theme.js';
@customElement('dees-progressbar') @customElement('dees-progressbar')
export class DeesProgressbar extends DeesElement { export class DeesProgressbar extends DeesElement {
// STATIC // STATIC
public static demo = demoFunc; public static demo = demoFunc;
public static demoGroups = ['Feedback'];
// INSTANCE // INSTANCE
@property({ @property({

View File

@@ -11,7 +11,7 @@ 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 { themeDefaultStyles } from '../00theme.js'; import { themeDefaultStyles } from '../../00theme.js';
declare global { declare global {
interface HTMLElementTagNameMap { interface HTMLElementTagNameMap {
@@ -21,6 +21,7 @@ declare global {
@customElement('dees-spinner') @customElement('dees-spinner')
export class DeesSpinner extends DeesElement { export class DeesSpinner extends DeesElement {
public static demoGroups = ['Feedback'];
public static demo = () => html` public static demo = () => html`
<dees-spinner></dees-spinner> <dees-spinner></dees-spinner>
<dees-spinner status="success"></dees-spinner> <dees-spinner status="success"></dees-spinner>

View File

@@ -1,6 +1,6 @@
import { html, css, cssManager } from '@design.estate/dees-element'; import { html, css, cssManager } from '@design.estate/dees-element';
import { DeesToast } from '../dees-toast/dees-toast.js'; import { DeesToast } from '../dees-toast/dees-toast.js';
import '../00group-button/dees-button/dees-button.js'; import '../../00group-button/dees-button/dees-button.js';
export const demoFunc = () => html` export const demoFunc = () => html`
<style> <style>

View File

@@ -1,10 +1,10 @@
import { customElement, DeesElement, type TemplateResult, html, css, property, cssManager } from '@design.estate/dees-element'; import { customElement, DeesElement, type TemplateResult, html, css, property, cssManager } from '@design.estate/dees-element';
import * as domtools from '@design.estate/dees-domtools'; import * as domtools from '@design.estate/dees-domtools';
import { zIndexLayers } from '../00zindex.js'; import { zIndexLayers } from '../../00zindex.js';
import { demoFunc } from './dees-toast.demo.js'; import { demoFunc } from './dees-toast.demo.js';
import { cssGeistFontFamily } from '../00fonts.js'; import { cssGeistFontFamily } from '../../00fonts.js';
import { themeDefaultStyles } from '../00theme.js'; import { themeDefaultStyles } from '../../00theme.js';
declare global { declare global {
interface HTMLElementTagNameMap { interface HTMLElementTagNameMap {
@@ -26,6 +26,7 @@ export interface IToastOptions {
export class DeesToast extends DeesElement { export class DeesToast extends DeesElement {
// STATIC // STATIC
public static demo = demoFunc; public static demo = demoFunc;
public static demoGroups = ['Feedback', 'Overlay'];
private static toastContainers = new Map<ToastPosition, HTMLDivElement>(); private static toastContainers = new Map<ToastPosition, HTMLDivElement>();

View File

@@ -0,0 +1,7 @@
// Feedback Components
export * from './dees-actionbar/index.js';
export * from './dees-badge/index.js';
export * from './dees-hint/index.js';
export * from './dees-progressbar/index.js';
export * from './dees-spinner/index.js';
export * from './dees-toast/index.js';

View File

@@ -19,7 +19,7 @@ declare global {
@customElement('dees-form-submit') @customElement('dees-form-submit')
export class DeesFormSubmit extends DeesElement { export class DeesFormSubmit extends DeesElement {
public static demo = demoFunc; public static demo = demoFunc;
public static demoGroup = 'Form'; public static demoGroups = ['Form', 'Button'];
@property({ @property({
type: Boolean, type: Boolean,

View File

@@ -22,7 +22,7 @@ import { DeesInputPhone } from '../../00group-input/dees-input-phone/dees-input-
import { DeesInputToggle } from '../../00group-input/dees-input-toggle/dees-input-toggle.js'; import { DeesInputToggle } from '../../00group-input/dees-input-toggle/dees-input-toggle.js';
import { DeesInputTypelist } from '../../00group-input/dees-input-typelist/dees-input-typelist.js'; import { DeesInputTypelist } from '../../00group-input/dees-input-typelist/dees-input-typelist.js';
import { DeesFormSubmit } from '../dees-form-submit/dees-form-submit.js'; import { DeesFormSubmit } from '../dees-form-submit/dees-form-submit.js';
import { DeesTable } from '../../dees-table/index.js'; import { DeesTable } from '../../00group-dataview/dees-table/index.js';
import { demoFunc } from './dees-form.demo.js'; import { demoFunc } from './dees-form.demo.js';
// Unified set for form input types // Unified set for form input types
@@ -68,7 +68,7 @@ declare global {
@customElement('dees-form') @customElement('dees-form')
export class DeesForm extends DeesElement { export class DeesForm extends DeesElement {
public static demo = demoFunc; public static demo = demoFunc;
public static demoGroup = 'Form'; public static demoGroups = ['Form'];
public name: string = 'myform'; public name: string = 'myform';
public changeSubject = new domtools.plugins.smartrx.rxjs.Subject(); public changeSubject = new domtools.plugins.smartrx.rxjs.Subject();

View File

@@ -1,6 +1,6 @@
import { html, css, cssManager } from '@design.estate/dees-element'; import { html, css, cssManager } 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 type { DeesInputCheckbox } from '../dees-input-checkbox/dees-input-checkbox.js'; import type { DeesInputCheckbox } from '../dees-input-checkbox/dees-input-checkbox.js';
import '../../00group-button/dees-button/dees-button.js'; import '../../00group-button/dees-button/dees-button.js';

View File

@@ -21,7 +21,7 @@ declare global {
export class DeesInputCheckbox extends DeesInputBase<DeesInputCheckbox> { export class DeesInputCheckbox extends DeesInputBase<DeesInputCheckbox> {
// STATIC // STATIC
public static demo = demoFunc; public static demo = demoFunc;
public static demoGroup = 'Input'; public static demoGroups = ['Input'];
// INSTANCE // INSTANCE

View File

@@ -9,9 +9,9 @@ import {
state, state,
} from '@design.estate/dees-element'; } from '@design.estate/dees-element';
import { themeDefaultStyles } from '../../00theme.js'; import { themeDefaultStyles } from '../../00theme.js';
import { DeesModal } from '../../dees-modal/dees-modal.js'; import { DeesModal } from '../../00group-overlay/dees-modal/dees-modal.js';
import '../../dees-icon/dees-icon.js'; import '../../00group-utility/dees-icon/dees-icon.js';
import '../../dees-label/dees-label.js'; import '../../00group-layout/dees-label/dees-label.js';
import '../../00group-workspace/dees-workspace-monaco/dees-workspace-monaco.js'; import '../../00group-workspace/dees-workspace-monaco/dees-workspace-monaco.js';
import { DeesWorkspaceMonaco } from '../../00group-workspace/dees-workspace-monaco/dees-workspace-monaco.js'; import { DeesWorkspaceMonaco } from '../../00group-workspace/dees-workspace-monaco/dees-workspace-monaco.js';
@@ -54,7 +54,7 @@ export class DeesInputCode extends DeesInputBase<string> {
.value=${'const greeting: string = "Hello World";\nconsole.log(greeting);'} .value=${'const greeting: string = "Hello World";\nconsole.log(greeting);'}
></dees-input-code> ></dees-input-code>
`; `;
public static demoGroup = 'Input'; public static demoGroups = ['Input', 'Workspace'];
// INSTANCE // INSTANCE
@property({ type: String }) @property({ type: String })

View File

@@ -9,8 +9,8 @@ import { demoFunc } from './demo.js';
import { datepickerStyles } from './styles.js'; import { datepickerStyles } from './styles.js';
import { renderDatepicker } from './template.js'; import { renderDatepicker } from './template.js';
import type { IDateEvent } from './types.js'; import type { IDateEvent } from './types.js';
import '../../dees-icon/dees-icon.js'; import '../../00group-utility/dees-icon/dees-icon.js';
import '../../dees-label/dees-label.js'; import '../../00group-layout/dees-label/dees-label.js';
declare global { declare global {
@@ -22,7 +22,7 @@ declare global {
@customElement('dees-input-datepicker') @customElement('dees-input-datepicker')
export class DeesInputDatepicker extends DeesInputBase<DeesInputDatepicker> { export class DeesInputDatepicker extends DeesInputBase<DeesInputDatepicker> {
public static demo = demoFunc; public static demo = demoFunc;
public static demoGroup = 'Input'; public static demoGroups = ['Input'];
@property({ type: String }) @property({ type: String })
accessor value: string = ''; accessor value: string = '';

View File

@@ -1,6 +1,6 @@
import { html, css } from '@design.estate/dees-element'; import { html, css } 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 './component.js'; import './component.js';
import type { DeesInputDatepicker } from './component.js'; import type { DeesInputDatepicker } from './component.js';

View File

@@ -1,6 +1,6 @@
import { html, css } from '@design.estate/dees-element'; import { html, css } 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';

View File

@@ -22,7 +22,7 @@ declare global {
@customElement('dees-input-dropdown') @customElement('dees-input-dropdown')
export class DeesInputDropdown extends DeesInputBase<DeesInputDropdown> { export class DeesInputDropdown extends DeesInputBase<DeesInputDropdown> {
public static demo = demoFunc; public static demo = demoFunc;
public static demoGroup = 'Input'; public static demoGroups = ['Input'];
// INSTANCE // INSTANCE

View File

@@ -1,8 +1,8 @@
import { DeesInputBase } from '../dees-input-base/dees-input-base.js'; import { DeesInputBase } from '../dees-input-base/dees-input-base.js';
import { demoFunc } from './demo.js'; import { demoFunc } from './demo.js';
import { fileuploadStyles } from './styles.js'; import { fileuploadStyles } from './styles.js';
import '../../dees-icon/dees-icon.js'; import '../../00group-utility/dees-icon/dees-icon.js';
import '../../dees-label/dees-label.js'; import '../../00group-layout/dees-label/dees-label.js';
import { import {
customElement, customElement,
@@ -21,7 +21,7 @@ declare global {
@customElement('dees-input-fileupload') @customElement('dees-input-fileupload')
export class DeesInputFileupload extends DeesInputBase<DeesInputFileupload> { export class DeesInputFileupload extends DeesInputBase<DeesInputFileupload> {
public static demo = demoFunc; public static demo = demoFunc;
public static demoGroup = 'Input'; public static demoGroups = ['Input'];
@property({ attribute: false }) @property({ attribute: false })
accessor value: File[] = []; accessor value: File[] = [];

View File

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

View File

@@ -17,7 +17,7 @@ import { themeDefaultStyles } from '../../00theme.js';
export class DeesInputIban extends DeesInputBase<DeesInputIban> { export class DeesInputIban extends DeesInputBase<DeesInputIban> {
// STATIC // STATIC
public static demo = demoFunc; public static demo = demoFunc;
public static demoGroup = 'Input'; public static demoGroups = ['Input'];
// INSTANCE // INSTANCE
@state() @state()

View File

@@ -1,6 +1,6 @@
import { html, css } from '@design.estate/dees-element'; import { html, css } 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 '../dees-input-text/dees-input-text.js'; import '../dees-input-text/dees-input-text.js';
import '../../00group-form/dees-form-submit/dees-form-submit.js'; import '../../00group-form/dees-form-submit/dees-form-submit.js';

View File

@@ -8,7 +8,7 @@ import {
type TemplateResult, type TemplateResult,
} from '@design.estate/dees-element'; } from '@design.estate/dees-element';
import { DeesInputBase } from '../dees-input-base/dees-input-base.js'; import { DeesInputBase } from '../dees-input-base/dees-input-base.js';
import '../../dees-icon/dees-icon.js'; import '../../00group-utility/dees-icon/dees-icon.js';
import '../../00group-button/dees-button/dees-button.js'; import '../../00group-button/dees-button/dees-button.js';
import { demoFunc } from './dees-input-list.demo.js'; import { demoFunc } from './dees-input-list.demo.js';
import { themeDefaultStyles } from '../../00theme.js'; import { themeDefaultStyles } from '../../00theme.js';
@@ -23,7 +23,7 @@ declare global {
export class DeesInputList extends DeesInputBase<DeesInputList> { export class DeesInputList extends DeesInputBase<DeesInputList> {
// STATIC // STATIC
public static demo = demoFunc; public static demo = demoFunc;
public static demoGroup = 'Input'; public static demoGroups = ['Input'];
// INSTANCE // INSTANCE
@property({ type: Array }) @property({ type: Array })

View File

@@ -22,7 +22,7 @@ declare global {
@customElement('dees-input-multitoggle') @customElement('dees-input-multitoggle')
export class DeesInputMultitoggle extends DeesInputBase<DeesInputMultitoggle> { export class DeesInputMultitoggle extends DeesInputBase<DeesInputMultitoggle> {
public static demo = demoFunc; public static demo = demoFunc;
public static demoGroup = 'Input'; public static demoGroups = ['Input'];
@property() @property()

View File

@@ -22,7 +22,7 @@ declare global {
export class DeesInputPhone extends DeesInputBase<DeesInputPhone> { export class DeesInputPhone extends DeesInputBase<DeesInputPhone> {
// STATIC // STATIC
public static demo = demoFunc; public static demo = demoFunc;
public static demoGroup = 'Input'; public static demoGroups = ['Input'];
// INSTANCE // INSTANCE
@state() @state()

View File

@@ -1,5 +1,5 @@
import { html, css, cssManager } from '@design.estate/dees-element'; import { html, css, cssManager } from '@design.estate/dees-element';
import '../../dees-shopping-productcard/dees-shopping-productcard.js'; import '../../00group-simple/dees-shopping-productcard/dees-shopping-productcard.js';
export const demoFunc = () => html` export const demoFunc = () => html`
<dees-demowrapper> <dees-demowrapper>

View File

@@ -13,7 +13,7 @@ declare global {
@customElement('dees-input-quantityselector') @customElement('dees-input-quantityselector')
export class DeesInputQuantitySelector extends DeesInputBase<DeesInputQuantitySelector> { export class DeesInputQuantitySelector extends DeesInputBase<DeesInputQuantitySelector> {
public static demo = demoFunc; public static demo = demoFunc;
public static demoGroup = 'Input'; public static demoGroups = ['Input'];
// INSTANCE // INSTANCE

View File

@@ -1,6 +1,6 @@
import { html, css } from '@design.estate/dees-element'; import { html, css } 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';
export const demoFunc = () => html` export const demoFunc = () => html`
<dees-demowrapper> <dees-demowrapper>

View File

@@ -21,7 +21,7 @@ type RadioOption = string | { option: string; key: string; payload?: any };
@customElement('dees-input-radiogroup') @customElement('dees-input-radiogroup')
export class DeesInputRadiogroup extends DeesInputBase<string | object> { export class DeesInputRadiogroup extends DeesInputBase<string | object> {
public static demo = demoFunc; public static demo = demoFunc;
public static demoGroup = 'Input'; public static demoGroups = ['Input'];
// INSTANCE // INSTANCE

View File

@@ -3,7 +3,7 @@ import { demoFunc } from './demo.js';
import { richtextStyles } from './styles.js'; import { richtextStyles } from './styles.js';
import { renderRichtext } from './template.js'; import { renderRichtext } from './template.js';
import type { IToolbarButton } from './types.js'; import type { IToolbarButton } from './types.js';
import '../../dees-icon/dees-icon.js'; import '../../00group-utility/dees-icon/dees-icon.js';
import { import {
customElement, customElement,
@@ -28,7 +28,7 @@ declare global {
@customElement('dees-input-richtext') @customElement('dees-input-richtext')
export class DeesInputRichtext extends DeesInputBase<string> { export class DeesInputRichtext extends DeesInputBase<string> {
public static demo = demoFunc; public static demo = demoFunc;
public static demoGroup = 'Input'; public static demoGroups = ['Input'];
// INSTANCE // INSTANCE
@property({ @property({

View File

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

View File

@@ -1,6 +1,6 @@
import { html, css } from '@design.estate/dees-element'; import { html, css } 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';
export const demoFunc = () => html` export const demoFunc = () => html`
<dees-demowrapper> <dees-demowrapper>

View File

@@ -8,7 +8,7 @@ import {
type TemplateResult, type TemplateResult,
} from '@design.estate/dees-element'; } from '@design.estate/dees-element';
import { DeesInputBase } from '../dees-input-base/dees-input-base.js'; import { DeesInputBase } from '../dees-input-base/dees-input-base.js';
import '../../dees-icon/dees-icon.js'; import '../../00group-utility/dees-icon/dees-icon.js';
import { demoFunc } from './dees-input-tags.demo.js'; import { demoFunc } from './dees-input-tags.demo.js';
import { themeDefaultStyles } from '../../00theme.js'; import { themeDefaultStyles } from '../../00theme.js';
@@ -22,7 +22,7 @@ declare global {
export class DeesInputTags extends DeesInputBase<DeesInputTags> { export class DeesInputTags extends DeesInputBase<DeesInputTags> {
// STATIC // STATIC
public static demo = demoFunc; public static demo = demoFunc;
public static demoGroup = 'Input'; public static demoGroups = ['Input'];
// INSTANCE // INSTANCE
@property({ type: Array }) @property({ type: Array })

View File

@@ -1,6 +1,6 @@
import { html, css, cssManager } from '@design.estate/dees-element'; import { html, css, cssManager } 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 type { DeesInputText } from '../dees-input-text/dees-input-text.js'; import type { DeesInputText } from '../dees-input-text/dees-input-text.js';
export const demoFunc = () => html` export const demoFunc = () => html`

View File

@@ -22,7 +22,7 @@ declare global {
@customElement('dees-input-text') @customElement('dees-input-text')
export class DeesInputText extends DeesInputBase { export class DeesInputText extends DeesInputBase {
public static demo = demoFunc; public static demo = demoFunc;
public static demoGroup = 'Input'; public static demoGroups = ['Input'];
// INSTANCE // INSTANCE
@property({ @property({

View File

@@ -1,6 +1,6 @@
import { html, css, cssManager } from '@design.estate/dees-element'; import { html, css, cssManager } 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 type { DeesInputToggle } from './dees-input-toggle.js'; import type { DeesInputToggle } from './dees-input-toggle.js';
export const demoFunc = () => html` export const demoFunc = () => html`

View File

@@ -22,7 +22,7 @@ declare global {
export class DeesInputToggle extends DeesInputBase<DeesInputToggle> { export class DeesInputToggle extends DeesInputBase<DeesInputToggle> {
// STATIC // STATIC
public static demo = demoFunc; public static demo = demoFunc;
public static demoGroup = 'Input'; public static demoGroups = ['Input'];
// INSTANCE // INSTANCE

View File

@@ -16,7 +16,7 @@ import { themeDefaultStyles } from '../../00theme.js';
@customElement('dees-input-typelist') @customElement('dees-input-typelist')
export class DeesInputTypelist extends DeesInputBase<DeesInputTypelist> { export class DeesInputTypelist extends DeesInputBase<DeesInputTypelist> {
public static demo = demoFunc; public static demo = demoFunc;
public static demoGroup = 'Input'; public static demoGroups = ['Input'];
// INSTANCE // INSTANCE

View File

@@ -1,6 +1,6 @@
import { html, css, type TemplateResult } from '@design.estate/dees-element'; import { html, css, type TemplateResult } 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 type { DeesInputWysiwyg } from './dees-input-wysiwyg/dees-input-wysiwyg.js'; import type { DeesInputWysiwyg } from './dees-input-wysiwyg/dees-input-wysiwyg.js';
import type { IBlock } from './dees-input-wysiwyg/wysiwyg.types.js'; import type { IBlock } from './dees-input-wysiwyg/wysiwyg.types.js';

View File

@@ -1,6 +1,6 @@
import { DeesInputBase } from '../dees-input-base/dees-input-base.js'; import { DeesInputBase } from '../dees-input-base/dees-input-base.js';
import { demoFunc } from '../dees-input-wysiwyg.demo.js'; import { demoFunc } from '../dees-input-wysiwyg.demo.js';
import { DeesModal } from '../../dees-modal/dees-modal.js'; import { DeesModal } from '../../00group-overlay/dees-modal/dees-modal.js';
import { import {
customElement, customElement,
@@ -39,7 +39,7 @@ declare global {
@customElement('dees-input-wysiwyg') @customElement('dees-input-wysiwyg')
export class DeesInputWysiwyg extends DeesInputBase<string> { export class DeesInputWysiwyg extends DeesInputBase<string> {
public static demo = demoFunc; public static demo = demoFunc;
public static demoGroup = 'Input'; public static demoGroups = ['Input', 'Workspace'];
@property({ type: String }) @property({ type: String })
accessor value: string = ''; accessor value: string = '';

View File

@@ -8,7 +8,7 @@ import {
state, state,
} from '@design.estate/dees-element'; } from '@design.estate/dees-element';
import { zIndexRegistry } from '../../00zindex.js'; import { zIndexRegistry } from '../../00zindex.js';
import '../../dees-icon/dees-icon.js'; import '../../00group-utility/dees-icon/dees-icon.js';
import { type ISlashMenuItem } from './wysiwyg.types.js'; import { type ISlashMenuItem } from './wysiwyg.types.js';
import { WysiwygShortcuts } from './wysiwyg.shortcuts.js'; import { WysiwygShortcuts } from './wysiwyg.shortcuts.js';

View File

@@ -14,7 +14,7 @@ import { WysiwygSelection } from './wysiwyg.selection.js';
import { BlockRegistry, type IBlockEventHandlers } from './blocks/index.js'; import { BlockRegistry, type IBlockEventHandlers } from './blocks/index.js';
import './wysiwyg.blockregistration.js'; import './wysiwyg.blockregistration.js';
import { WysiwygShortcuts } from './wysiwyg.shortcuts.js'; import { WysiwygShortcuts } from './wysiwyg.shortcuts.js';
import '../../dees-contextmenu/dees-contextmenu.js'; import '../../00group-overlay/dees-contextmenu/dees-contextmenu.js';
import { themeDefaultStyles } from '../../00theme.js'; import { themeDefaultStyles } from '../../00theme.js';
declare global { declare global {

View File

@@ -1,5 +1,5 @@
import { html, type TemplateResult, cssManager } from '@design.estate/dees-element'; import { html, type TemplateResult, cssManager } from '@design.estate/dees-element';
import { DeesModal } from '../../dees-modal/dees-modal.js'; import { DeesModal } from '../../00group-overlay/dees-modal/dees-modal.js';
import { type IBlock } from './wysiwyg.types.js'; import { type IBlock } from './wysiwyg.types.js';
import { WysiwygShortcuts } from './wysiwyg.shortcuts.js'; import { WysiwygShortcuts } from './wysiwyg.shortcuts.js';
import { PROGRAMMING_LANGUAGES } from './wysiwyg.constants.js'; import { PROGRAMMING_LANGUAGES } from './wysiwyg.constants.js';

View File

@@ -1,6 +1,6 @@
import { html, css } from '@design.estate/dees-element'; import { html, css } 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 './dees-input-profilepicture.js'; import './dees-input-profilepicture.js';
import type { DeesInputProfilePicture } from './dees-input-profilepicture.js'; import type { DeesInputProfilePicture } from './dees-input-profilepicture.js';

View File

@@ -8,8 +8,8 @@ import {
type TemplateResult, type TemplateResult,
} from '@design.estate/dees-element'; } from '@design.estate/dees-element';
import { DeesInputBase } from '../dees-input-base/dees-input-base.js'; import { DeesInputBase } from '../dees-input-base/dees-input-base.js';
import '../../dees-icon/dees-icon.js'; import '../../00group-utility/dees-icon/dees-icon.js';
import '../../dees-label/dees-label.js'; import '../../00group-layout/dees-label/dees-label.js';
import { ProfilePictureModal } from './profilepicture.modal.js'; import { ProfilePictureModal } from './profilepicture.modal.js';
import { demoFunc } from './dees-input-profilepicture.demo.js'; import { demoFunc } from './dees-input-profilepicture.demo.js';
import { themeDefaultStyles } from '../../00theme.js'; import { themeDefaultStyles } from '../../00theme.js';
@@ -25,7 +25,7 @@ export type ProfileShape = 'square' | 'round';
@customElement('dees-input-profilepicture') @customElement('dees-input-profilepicture')
export class DeesInputProfilePicture extends DeesInputBase<DeesInputProfilePicture> { export class DeesInputProfilePicture extends DeesInputBase<DeesInputProfilePicture> {
public static demo = demoFunc; public static demo = demoFunc;
public static demoGroup = 'Input'; public static demoGroups = ['Input'];
@property({ type: String }) @property({ type: String })
accessor value: string = ''; // Base64 encoded image or URL accessor value: string = ''; // Base64 encoded image or URL

View File

@@ -11,10 +11,10 @@ import {
import * as colors from '../../00colors.js'; import * as colors from '../../00colors.js';
import { cssGeistFontFamily } from '../../00fonts.js'; import { cssGeistFontFamily } from '../../00fonts.js';
import { zIndexRegistry } from '../../00zindex.js'; import { zIndexRegistry } from '../../00zindex.js';
import '../../dees-icon/dees-icon.js'; import '../../00group-utility/dees-icon/dees-icon.js';
import '../../00group-button/dees-button/dees-button.js'; import '../../00group-button/dees-button/dees-button.js';
import '../../dees-windowlayer/dees-windowlayer.js'; import '../../00group-overlay/dees-windowlayer/dees-windowlayer.js';
import { DeesWindowLayer } from '../../dees-windowlayer/dees-windowlayer.js'; import { DeesWindowLayer } from '../../00group-overlay/dees-windowlayer/dees-windowlayer.js';
import { ImageCropper } from './profilepicture.cropper.js'; import { ImageCropper } from './profilepicture.cropper.js';
import type { ProfileShape } from './dees-input-profilepicture.js'; import type { ProfileShape } from './dees-input-profilepicture.js';
import { themeDefaultStyles } from '../../00theme.js'; import { themeDefaultStyles } from '../../00theme.js';

View File

@@ -12,7 +12,7 @@ import {
import * as domtools from '@design.estate/dees-domtools'; import * as domtools from '@design.estate/dees-domtools';
import { demoFunc } from './dees-chips.demo.js'; import { demoFunc } from './dees-chips.demo.js';
import { themeDefaultStyles } from '../00theme.js'; import { themeDefaultStyles } from '../../00theme.js';
declare global { declare global {
interface HTMLElementTagNameMap { interface HTMLElementTagNameMap {
@@ -25,6 +25,7 @@ type Tag = { key: string; value: string };
@customElement('dees-chips') @customElement('dees-chips')
export class DeesChips extends DeesElement { export class DeesChips extends DeesElement {
public static demo = demoFunc; public static demo = demoFunc;
public static demoGroups = ['Layout'];
@property() @property()
accessor selectionMode: 'none' | 'single' | 'multiple' = 'single'; accessor selectionMode: 'none' | 'single' | 'multiple' = 'single';

View File

@@ -1,7 +1,7 @@
import type { DashboardWidget } from './types.js'; import type { DashboardWidget } from './types.js';
import { DeesContextmenu } from '../dees-contextmenu/dees-contextmenu.js'; import { DeesContextmenu } from '../../00group-overlay/dees-contextmenu/dees-contextmenu.js';
import type { DeesDashboardgrid } from './dees-dashboardgrid.js'; import type { DeesDashboardgrid } from './dees-dashboardgrid.js';
import * as plugins from '../00plugins.js'; import * as plugins from '../../00plugins.js';
export interface WidgetContextMenuOptions { export interface WidgetContextMenuOptions {
widget: DashboardWidget; widget: DashboardWidget;

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