Compare commits

...

6 Commits
v3.1.0 ... main

Author SHA1 Message Date
3616bbb9a7 v3.2.0
Some checks failed
Default (tags) / security (push) Failing after 16s
Default (tags) / test (push) Failing after 17s
Default (tags) / release (push) Has been skipped
Default (tags) / metadata (push) Has been skipped
2025-12-08 20:23:03 +00:00
27c071f7dc feat(dees-simple-appdash,dees-simple-login,dees-terminal): Revamp UI: dashboard & login styling, standardize icons to Lucide, and add terminal background/config 2025-12-08 20:23:03 +00:00
ac1ef4e497 v3.1.2
Some checks failed
Default (tags) / security (push) Failing after 12s
Default (tags) / test (push) Failing after 13s
Default (tags) / release (push) Has been skipped
Default (tags) / metadata (push) Has been skipped
2025-12-08 16:17:52 +00:00
9c61c0542b fix(DeesAppuiMainmenu, DeesAppuiSecondarymenu): Add position: relative to main and secondary app UI menus to fix positioning of overlays and tooltips 2025-12-08 16:17:52 +00:00
5c099c8057 v3.1.1
Some checks failed
Default (tags) / security (push) Failing after 15s
Default (tags) / test (push) Failing after 18s
Default (tags) / release (push) Has been skipped
Default (tags) / metadata (push) Has been skipped
2025-12-08 16:16:25 +00:00
82b4afa95a fix(dees-appui): Extract demos for main and secondary app menus, adjust collapsed styles and toggle placement, bump devDependency 2025-12-08 16:16:25 +00:00
12 changed files with 439 additions and 266 deletions

View File

@@ -1,5 +1,31 @@
# Changelog # Changelog
## 2025-12-08 - 3.2.0 - feat(dees-simple-appdash,dees-simple-login,dees-terminal)
Revamp UI: dashboard & login styling, standardize icons to Lucide, and add terminal background/config
- Standardize icon usage to Lucide prefixes in dees-simple-appdash; add fallback handling for legacy icon names
- Revamped dees-simple-appdash sidebar: updated spacing, typography, header icon wrapper, scrollbar styling, section labels, hover/selected states, and visual indicators
- Change 'Logout' label to 'Sign out' in dees-simple-appdash and add explicit status classes for controlbar (connected, terminal)
- Improve terminal UX: smoother launch/close animations, updated shadow and sizing logic in dees-simple-appdash
- Add background property to dees-terminal, sync it to a CSS variable and apply it to xterm theme for configurable terminal background
- Redesign dees-simple-login: new header/subheader, card layout, spacing, and updated submit text to 'Sign in'
- Bump devDependency @git.zone/tswatch to ^2.3.5
## 2025-12-08 - 3.1.2 - fix(DeesAppuiMainmenu, DeesAppuiSecondarymenu)
Add position: relative to main and secondary app UI menus to fix positioning of overlays and tooltips
- ts_web/elements/00group-appui/dees-appui-mainmenu/dees-appui-mainmenu.ts: add `position: relative` to host styles
- ts_web/elements/00group-appui/dees-appui-secondarymenu/dees-appui-secondarymenu.ts: add `position: relative` to host styles
- Fixes incorrect positioning for absolutely positioned children (tooltips, overlays, badges) inside the main and secondary menus
## 2025-12-08 - 3.1.1 - fix(dees-appui)
Extract demos for main and secondary app menus, adjust collapsed styles and toggle placement, bump devDependency
- Extracted inline demo markup into separate demo files: ts_web/elements/00group-appui/dees-appui-mainmenu/dees-appui-mainmenu.demo.ts and ts_web/elements/00group-appui/dees-appui-secondarymenu/dees-appui-secondarymenu.demo.ts and wired them up via imported demoFunc to reduce component size.
- Moved collapse toggle button markup in both dees-appui-mainmenu and dees-appui-secondarymenu templates to after the main container to improve layout/stacking and focus behavior.
- Adjusted collapsed logo/heading styles: removed extra padding/gap and hide logo text using display:none for a cleaner collapsed state.
- Bumped devDependency @git.zone/tswatch from ^2.3.1 to ^2.3.2 in package.json.
## 2025-12-08 - 3.1.0 - feat(dees-appui) ## 2025-12-08 - 3.1.0 - feat(dees-appui)
Add collapsible/compact mode to AppUI sidebars (mainmenu & secondarymenu) with toggles, tooltips and improved z-index stacking Add collapsible/compact mode to AppUI sidebars (mainmenu & secondarymenu) with toggles, tooltips and improved z-index stacking

View File

@@ -1,6 +1,6 @@
{ {
"name": "@design.estate/dees-catalog", "name": "@design.estate/dees-catalog",
"version": "3.1.0", "version": "3.2.0",
"private": false, "private": false,
"description": "A comprehensive library that provides dynamic web components for building sophisticated and modern web applications using JavaScript and TypeScript.", "description": "A comprehensive library that provides dynamic web components for building sophisticated and modern web applications using JavaScript and TypeScript.",
"main": "dist_ts_web/index.js", "main": "dist_ts_web/index.js",
@@ -48,7 +48,7 @@
"@git.zone/tsbuild": "^3.1.2", "@git.zone/tsbuild": "^3.1.2",
"@git.zone/tsbundle": "^2.6.3", "@git.zone/tsbundle": "^2.6.3",
"@git.zone/tstest": "^3.1.3", "@git.zone/tstest": "^3.1.3",
"@git.zone/tswatch": "^2.3.1", "@git.zone/tswatch": "^2.3.5",
"@push.rocks/projectinfo": "^5.0.2", "@push.rocks/projectinfo": "^5.0.2",
"@push.rocks/tapbundle": "^6.0.3", "@push.rocks/tapbundle": "^6.0.3",
"@types/node": "^24.10.1" "@types/node": "^24.10.1"

75
pnpm-lock.yaml generated
View File

@@ -98,10 +98,10 @@ importers:
version: 2.6.3 version: 2.6.3
'@git.zone/tstest': '@git.zone/tstest':
specifier: ^3.1.3 specifier: ^3.1.3
version: 3.1.3(@push.rocks/smartserve@1.3.0)(socks@2.8.7)(typescript@5.9.3) version: 3.1.3(@push.rocks/smartserve@1.4.0)(socks@2.8.7)(typescript@5.9.3)
'@git.zone/tswatch': '@git.zone/tswatch':
specifier: ^2.3.1 specifier: ^2.3.5
version: 2.3.1(@tiptap/pm@2.27.1) version: 2.3.5(@tiptap/pm@2.27.1)
'@push.rocks/projectinfo': '@push.rocks/projectinfo':
specifier: ^5.0.2 specifier: ^5.0.2
version: 5.0.2 version: 5.0.2
@@ -126,8 +126,8 @@ packages:
'@api.global/typedserver@3.0.80': '@api.global/typedserver@3.0.80':
resolution: {integrity: sha512-dcp0oXsjBL+XdFg1wUUP08uJQid5bQ0Yv3V3Y3lnI2QCbat0FU+Tsb0TZRnZ4+P150Vj/ITBqJUgDzFsF34grA==} resolution: {integrity: sha512-dcp0oXsjBL+XdFg1wUUP08uJQid5bQ0Yv3V3Y3lnI2QCbat0FU+Tsb0TZRnZ4+P150Vj/ITBqJUgDzFsF34grA==}
'@api.global/typedserver@7.11.0': '@api.global/typedserver@7.11.1':
resolution: {integrity: sha512-DHB3oGRgiLbAeRRFAlXIbjvNACw9YqsfOtLVCPq0nUcGMGSsUQ4SNrJ5OGk9GhVF8bl/jn8SF8w08rnApmZ0uw==} resolution: {integrity: sha512-1vQUJ2/DszDFHVkCmqqBy/qNiIP/jltFN3KxHtoNLxjbdBZYfw1Zd1Odjs6YSPalAD0p8wQ/alJblJEAewNQVg==}
'@api.global/typedsocket@3.1.1': '@api.global/typedsocket@3.1.1':
resolution: {integrity: sha512-Wkz3NlhmfdZMKqXXI2c2dMtGGmSmhdOegZiziL+9b2mqPYdc7Gd8AZRdEOKvbSoIvc9G22/5BEadIWHrfq66TA==} resolution: {integrity: sha512-Wkz3NlhmfdZMKqXXI2c2dMtGGmSmhdOegZiziL+9b2mqPYdc7Gd8AZRdEOKvbSoIvc9G22/5BEadIWHrfq66TA==}
@@ -316,6 +316,9 @@ packages:
'@borewit/text-codec@0.1.1': '@borewit/text-codec@0.1.1':
resolution: {integrity: sha512-5L/uBxmjaCIX5h8Z+uu+kA9BQLkc/Wl06UGR5ajNRxu+/XjonB5i8JpgFMrPj3LXTCPA0pv8yxUvbUi+QthGGA==} resolution: {integrity: sha512-5L/uBxmjaCIX5h8Z+uu+kA9BQLkc/Wl06UGR5ajNRxu+/XjonB5i8JpgFMrPj3LXTCPA0pv8yxUvbUi+QthGGA==}
'@cfworker/json-schema@4.1.1':
resolution: {integrity: sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og==}
'@cloudflare/workers-types@4.20251205.0': '@cloudflare/workers-types@4.20251205.0':
resolution: {integrity: sha512-7pup7fYkuQW5XD8RUS/vkxF9SXlrGyCXuZ4ro3uVQvca/GTeSa+8bZ8T4wbq1Aea5lmLIGSlKbhl2msME7bRBA==} resolution: {integrity: sha512-7pup7fYkuQW5XD8RUS/vkxF9SXlrGyCXuZ4ro3uVQvca/GTeSa+8bZ8T4wbq1Aea5lmLIGSlKbhl2msME7bRBA==}
@@ -329,8 +332,8 @@ packages:
'@dabh/diagnostics@2.0.8': '@dabh/diagnostics@2.0.8':
resolution: {integrity: sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==} resolution: {integrity: sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==}
'@design.estate/dees-catalog@2.0.7': '@design.estate/dees-catalog@3.1.2':
resolution: {integrity: sha512-rshv71LqA2PXaEEf6C1/hv6Yu2ovRuWaZhdnUznCDpjdYgxBq7PHkiHCNvg/m6wJ9Ue/03HcuuPqtj2bksgAag==} resolution: {integrity: sha512-T4ZhoZzl6NAWGhrz00MDFla5syeMz53euZ+QcBftRMmHuqPHDU/JlBi+K2SmILtnRfWH/lGYWBKugYop6q0chg==}
'@design.estate/dees-comms@1.0.30': '@design.estate/dees-comms@1.0.30':
resolution: {integrity: sha512-KchMlklJfKAjQiJiR0xmofXtQ27VgZtBIxcMwPE9d+h3jJRv+lPZxzBQVOM0eyM0uS44S5vJMZ11IeV4uDXSHg==} resolution: {integrity: sha512-KchMlklJfKAjQiJiR0xmofXtQ27VgZtBIxcMwPE9d+h3jJRv+lPZxzBQVOM0eyM0uS44S5vJMZ11IeV4uDXSHg==}
@@ -552,8 +555,8 @@ packages:
resolution: {integrity: sha512-t+/cKV21JHK8X7NGAmihs5M/eMm+V+jn4R5rzfwGG97WJFAcP5qE1Os9VYtyZw3tx/NZXA2yA4abo/ELluTuRA==} resolution: {integrity: sha512-t+/cKV21JHK8X7NGAmihs5M/eMm+V+jn4R5rzfwGG97WJFAcP5qE1Os9VYtyZw3tx/NZXA2yA4abo/ELluTuRA==}
hasBin: true hasBin: true
'@git.zone/tswatch@2.3.1': '@git.zone/tswatch@2.3.5':
resolution: {integrity: sha512-KjJRXs+XkXXXDUqmEb1tZuDM1IEVI/RzAo3wS2bFv/UhOY7iYAxPL+eKl55FxBFftB4ecAfxeBhbhijTbklAMA==} resolution: {integrity: sha512-wYekG7Q/wg5uptXHPHhVi7dHq19QnLoevQpcpAzF6hMiNbOozN3+4zxOktyJBl6EHUYcFvHXA4fZ4bkJpo5TcA==}
hasBin: true hasBin: true
'@hapi/bourne@3.0.0': '@hapi/bourne@3.0.0':
@@ -981,8 +984,8 @@ packages:
'@push.rocks/smarts3@3.0.3': '@push.rocks/smarts3@3.0.3':
resolution: {integrity: sha512-Y9nXMwurthJ9Z7yi0RwjhPFUC58aY8Mhia8kFo6Xj1tBM4LE8Oxg/ydejF7otHqQGr3QyqV5C4YrDEG17rUuzg==} resolution: {integrity: sha512-Y9nXMwurthJ9Z7yi0RwjhPFUC58aY8Mhia8kFo6Xj1tBM4LE8Oxg/ydejF7otHqQGr3QyqV5C4YrDEG17rUuzg==}
'@push.rocks/smartserve@1.3.0': '@push.rocks/smartserve@1.4.0':
resolution: {integrity: sha512-4ZR9uKVWXVAPzU5wtCQ1mA9jNmOlUl3oGr50EceLT6803UwbNcst7Ek/BhzSaZ0qb2pz0jO5T/V+icgvZ1/5ww==} resolution: {integrity: sha512-cEoXZQSBX3pOv9AyhxRPkrMAWzs2XQhTBmW95BFtTSNzZdji0XgqUu92p7iuF+NVuTFX1QZ8+dbCClLCoRRW7g==}
'@push.rocks/smartshell@3.3.0': '@push.rocks/smartshell@3.3.0':
resolution: {integrity: sha512-m0w618H6YBs+vXGz1CgS4nPi5CUAnqRtckcS9/koGwfcIx1IpjqmiP47BoCTbdgcv0IPUxQVBG1IXTHPuZ8Z5g==} resolution: {integrity: sha512-m0w618H6YBs+vXGz1CgS4nPi5CUAnqRtckcS9/koGwfcIx1IpjqmiP47BoCTbdgcv0IPUxQVBG1IXTHPuZ8Z5g==}
@@ -1020,8 +1023,8 @@ packages:
'@push.rocks/smartversion@3.0.5': '@push.rocks/smartversion@3.0.5':
resolution: {integrity: sha512-8MZSo1yqyaKxKq0Q5N188l4un++9GFWVbhCAX5mXJwewZHn97ujffTeL+eOQYpWFTEpUhaq1QhL4NhqObBCt1Q==} resolution: {integrity: sha512-8MZSo1yqyaKxKq0Q5N188l4un++9GFWVbhCAX5mXJwewZHn97ujffTeL+eOQYpWFTEpUhaq1QhL4NhqObBCt1Q==}
'@push.rocks/smartwatch@5.0.0': '@push.rocks/smartwatch@6.1.1':
resolution: {integrity: sha512-uuWUlTo0l5LWOWoOuTMG7zzxpUNKBcyqoB+zyQ24NHTtSYNcaUJtaQzTO2gxMXr5sqiZDkohlThS0KvsBc3g7w==} resolution: {integrity: sha512-wmhLKu9bdpvRcjOfitJOi4jsNKD7S2hVlVq6fAv3IhB2ZbRlSB+Hai4DwOlrdUZaWrg+dFIZU+/ifTOozOPiMg==}
engines: {node: '>=20.0.0'} engines: {node: '>=20.0.0'}
'@push.rocks/smartxml@2.0.0': '@push.rocks/smartxml@2.0.0':
@@ -4656,11 +4659,11 @@ snapshots:
'@push.rocks/webrequest': 3.0.37 '@push.rocks/webrequest': 3.0.37
'@push.rocks/webstream': 1.0.10 '@push.rocks/webstream': 1.0.10
'@api.global/typedserver@3.0.80(@push.rocks/smartserve@1.3.0)': '@api.global/typedserver@3.0.80(@push.rocks/smartserve@1.4.0)':
dependencies: dependencies:
'@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@1.3.0) '@api.global/typedsocket': 3.1.1(@push.rocks/smartserve@1.4.0)
'@cloudflare/workers-types': 4.20251205.0 '@cloudflare/workers-types': 4.20251205.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
@@ -4704,13 +4707,13 @@ snapshots:
- utf-8-validate - utf-8-validate
- vue - vue
'@api.global/typedserver@7.11.0(@tiptap/pm@2.27.1)': '@api.global/typedserver@7.11.1(@tiptap/pm@2.27.1)':
dependencies: dependencies:
'@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': 4.1.0(@push.rocks/smartserve@1.3.0) '@api.global/typedsocket': 4.1.0(@push.rocks/smartserve@1.4.0)
'@cloudflare/workers-types': 4.20251205.0 '@cloudflare/workers-types': 4.20251205.0
'@design.estate/dees-catalog': 2.0.7(@tiptap/pm@2.27.1) '@design.estate/dees-catalog': 3.1.2(@tiptap/pm@2.27.1)
'@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/smartdelay': 3.0.5 '@push.rocks/smartdelay': 3.0.5
@@ -4731,11 +4734,11 @@ snapshots:
'@push.rocks/smartpromise': 4.2.3 '@push.rocks/smartpromise': 4.2.3
'@push.rocks/smartrequest': 5.0.1 '@push.rocks/smartrequest': 5.0.1
'@push.rocks/smartrx': 3.0.10 '@push.rocks/smartrx': 3.0.10
'@push.rocks/smartserve': 1.3.0 '@push.rocks/smartserve': 1.4.0
'@push.rocks/smartsitemap': 2.0.4 '@push.rocks/smartsitemap': 2.0.4
'@push.rocks/smartstream': 3.2.5 '@push.rocks/smartstream': 3.2.5
'@push.rocks/smarttime': 4.1.1 '@push.rocks/smarttime': 4.1.1
'@push.rocks/smartwatch': 5.0.0 '@push.rocks/smartwatch': 6.1.1
'@push.rocks/taskbuffer': 3.5.0 '@push.rocks/taskbuffer': 3.5.0
'@push.rocks/webrequest': 4.0.1 '@push.rocks/webrequest': 4.0.1
'@push.rocks/webstore': 2.0.20 '@push.rocks/webstore': 2.0.20
@@ -4750,7 +4753,7 @@ snapshots:
- utf-8-validate - utf-8-validate
- vue - vue
'@api.global/typedsocket@3.1.1(@push.rocks/smartserve@1.3.0)': '@api.global/typedsocket@3.1.1(@push.rocks/smartserve@1.4.0)':
dependencies: dependencies:
'@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
@@ -4761,7 +4764,7 @@ snapshots:
'@push.rocks/smartstring': 4.1.0 '@push.rocks/smartstring': 4.1.0
'@push.rocks/smarturl': 3.1.0 '@push.rocks/smarturl': 3.1.0
optionalDependencies: optionalDependencies:
'@push.rocks/smartserve': 1.3.0 '@push.rocks/smartserve': 1.4.0
transitivePeerDependencies: transitivePeerDependencies:
- '@nuxt/kit' - '@nuxt/kit'
- bufferutil - bufferutil
@@ -4770,7 +4773,7 @@ snapshots:
- utf-8-validate - utf-8-validate
- vue - vue
'@api.global/typedsocket@4.1.0(@push.rocks/smartserve@1.3.0)': '@api.global/typedsocket@4.1.0(@push.rocks/smartserve@1.4.0)':
dependencies: dependencies:
'@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
@@ -4779,7 +4782,7 @@ snapshots:
'@push.rocks/smartjson': 5.2.0 '@push.rocks/smartjson': 5.2.0
'@push.rocks/smartpromise': 4.2.3 '@push.rocks/smartpromise': 4.2.3
'@push.rocks/smartrx': 3.0.10 '@push.rocks/smartrx': 3.0.10
'@push.rocks/smartserve': 1.3.0 '@push.rocks/smartserve': 1.4.0
'@push.rocks/smartstring': 4.1.0 '@push.rocks/smartstring': 4.1.0
'@push.rocks/smarturl': 3.1.0 '@push.rocks/smarturl': 3.1.0
@@ -5274,6 +5277,8 @@ snapshots:
'@borewit/text-codec@0.1.1': {} '@borewit/text-codec@0.1.1': {}
'@cfworker/json-schema@4.1.1': {}
'@cloudflare/workers-types@4.20251205.0': {} '@cloudflare/workers-types@4.20251205.0': {}
'@colors/colors@1.6.0': {} '@colors/colors@1.6.0': {}
@@ -5288,7 +5293,7 @@ snapshots:
enabled: 2.0.0 enabled: 2.0.0
kuler: 2.0.0 kuler: 2.0.0
'@design.estate/dees-catalog@2.0.7(@tiptap/pm@2.27.1)': '@design.estate/dees-catalog@3.1.2(@tiptap/pm@2.27.1)':
dependencies: dependencies:
'@design.estate/dees-domtools': 2.3.6 '@design.estate/dees-domtools': 2.3.6
'@design.estate/dees-element': 2.1.3 '@design.estate/dees-element': 2.1.3
@@ -5564,9 +5569,9 @@ 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.3(@push.rocks/smartserve@1.3.0)(socks@2.8.7)(typescript@5.9.3)': '@git.zone/tstest@3.1.3(@push.rocks/smartserve@1.4.0)(socks@2.8.7)(typescript@5.9.3)':
dependencies: dependencies:
'@api.global/typedserver': 3.0.80(@push.rocks/smartserve@1.3.0) '@api.global/typedserver': 3.0.80(@push.rocks/smartserve@1.4.0)
'@git.zone/tsbundle': 2.6.3 '@git.zone/tsbundle': 2.6.3
'@git.zone/tsrun': 2.0.0 '@git.zone/tsrun': 2.0.0
'@push.rocks/consolecolor': 2.0.3 '@push.rocks/consolecolor': 2.0.3
@@ -5613,9 +5618,9 @@ snapshots:
- utf-8-validate - utf-8-validate
- vue - vue
'@git.zone/tswatch@2.3.1(@tiptap/pm@2.27.1)': '@git.zone/tswatch@2.3.5(@tiptap/pm@2.27.1)':
dependencies: dependencies:
'@api.global/typedserver': 7.11.0(@tiptap/pm@2.27.1) '@api.global/typedserver': 7.11.1(@tiptap/pm@2.27.1)
'@git.zone/tsbundle': 2.6.3 '@git.zone/tsbundle': 2.6.3
'@git.zone/tsrun': 2.0.0 '@git.zone/tsrun': 2.0.0
'@push.rocks/early': 4.0.4 '@push.rocks/early': 4.0.4
@@ -5626,7 +5631,7 @@ snapshots:
'@push.rocks/smartlog': 3.1.10 '@push.rocks/smartlog': 3.1.10
'@push.rocks/smartlog-destination-local': 9.0.2 '@push.rocks/smartlog-destination-local': 9.0.2
'@push.rocks/smartshell': 3.3.0 '@push.rocks/smartshell': 3.3.0
'@push.rocks/smartwatch': 5.0.0 '@push.rocks/smartwatch': 6.1.1
'@push.rocks/taskbuffer': 3.5.0 '@push.rocks/taskbuffer': 3.5.0
transitivePeerDependencies: transitivePeerDependencies:
- '@nuxt/kit' - '@nuxt/kit'
@@ -6555,9 +6560,10 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- aws-crt - aws-crt
'@push.rocks/smartserve@1.3.0': '@push.rocks/smartserve@1.4.0':
dependencies: dependencies:
'@api.global/typedrequest': 3.2.5 '@api.global/typedrequest': 3.2.5
'@cfworker/json-schema': 4.1.1
'@push.rocks/lik': 6.2.2 '@push.rocks/lik': 6.2.2
'@push.rocks/smartenv': 6.0.0 '@push.rocks/smartenv': 6.0.0
'@push.rocks/smartlog': 3.1.10 '@push.rocks/smartlog': 3.1.10
@@ -6588,7 +6594,7 @@ snapshots:
'@push.rocks/smartsocket@2.1.0': '@push.rocks/smartsocket@2.1.0':
dependencies: dependencies:
'@api.global/typedrequest-interfaces': 3.0.19 '@api.global/typedrequest-interfaces': 3.0.19
'@api.global/typedserver': 3.0.80(@push.rocks/smartserve@1.3.0) '@api.global/typedserver': 3.0.80(@push.rocks/smartserve@1.4.0)
'@push.rocks/isohash': 2.0.1 '@push.rocks/isohash': 2.0.1
'@push.rocks/isounique': 1.0.5 '@push.rocks/isounique': 1.0.5
'@push.rocks/lik': 6.2.2 '@push.rocks/lik': 6.2.2
@@ -6672,7 +6678,7 @@ snapshots:
'@types/semver': 7.7.1 '@types/semver': 7.7.1
semver: 7.7.3 semver: 7.7.3
'@push.rocks/smartwatch@5.0.0': '@push.rocks/smartwatch@6.1.1':
dependencies: dependencies:
'@push.rocks/lik': 6.2.2 '@push.rocks/lik': 6.2.2
'@push.rocks/smartenv': 6.0.0 '@push.rocks/smartenv': 6.0.0
@@ -6715,20 +6721,17 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- '@aws-sdk/credential-providers' - '@aws-sdk/credential-providers'
- '@mongodb-js/zstd' - '@mongodb-js/zstd'
- '@nuxt/kit'
- aws-crt - aws-crt
- bare-abort-controller - bare-abort-controller
- bufferutil - bufferutil
- gcp-metadata - gcp-metadata
- kerberos - kerberos
- mongodb-client-encryption - mongodb-client-encryption
- react
- react-native-b4a - react-native-b4a
- snappy - snappy
- socks - socks
- supports-color - supports-color
- utf-8-validate - utf-8-validate
- vue
'@push.rocks/taskbuffer@3.5.0': '@push.rocks/taskbuffer@3.5.0':
dependencies: dependencies:

View File

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

View File

@@ -0,0 +1,50 @@
import { html } from '@design.estate/dees-element';
export const demoFunc = () => html`
<style>
.demo-mainmenu-container {
display: flex;
height: 100%;
background: #1a1a1a;
border-radius: 8px;
}
.demo-mainmenu-container .spacer {
flex: 1;
background: #0f0f0f;
}
</style>
<div class="demo-mainmenu-container">
<dees-appui-mainmenu
.logoIcon=${'lucide:box'}
.logoText=${'Acme App'}
.menuGroups=${[
{
tabs: [
{ key: 'Dashboard', iconName: 'lucide:home', action: () => console.log('Dashboard') },
{ key: 'Inbox', iconName: 'lucide:inbox', action: () => console.log('Inbox') },
]
},
{
name: 'Workspace',
tabs: [
{ key: 'Projects', iconName: 'lucide:folder', action: () => console.log('Projects') },
{ key: 'Tasks', iconName: 'lucide:checkSquare', action: () => console.log('Tasks') },
{ key: 'Documents', iconName: 'lucide:fileText', action: () => console.log('Documents') },
]
},
{
name: 'Analytics',
tabs: [
{ key: 'Reports', iconName: 'lucide:barChart3', action: () => console.log('Reports') },
{ key: 'Insights', iconName: 'lucide:lightbulb', action: () => console.log('Insights') },
]
}
]}
.bottomTabs=${[
{ key: 'Settings', iconName: 'lucide:settings', action: () => console.log('Settings') },
{ key: 'Help', iconName: 'lucide:helpCircle', action: () => console.log('Help') },
]}
></dees-appui-mainmenu>
<div class="spacer"></div>
</div>
`;

View File

@@ -12,6 +12,7 @@ import {
cssManager, cssManager,
} from '@design.estate/dees-element'; } from '@design.estate/dees-element';
import { DeesContextmenu } from '../../dees-contextmenu/dees-contextmenu.js'; import { DeesContextmenu } from '../../dees-contextmenu/dees-contextmenu.js';
import { demoFunc } from './dees-appui-mainmenu.demo.js';
/** /**
* the most left menu * the most left menu
@@ -19,49 +20,7 @@ import { DeesContextmenu } from '../../dees-contextmenu/dees-contextmenu.js';
*/ */
@customElement('dees-appui-mainmenu') @customElement('dees-appui-mainmenu')
export class DeesAppuiMainmenu extends DeesElement { export class DeesAppuiMainmenu extends DeesElement {
public static demo = () => html` public static demo = demoFunc;
<style>
.demo-mainmenu-container {
height: 500px;
background: #1a1a1a;
border-radius: 8px;
overflow: hidden;
}
</style>
<div class="demo-mainmenu-container">
<dees-appui-mainmenu
.logoIcon=${'lucide:box'}
.logoText=${'Acme App'}
.menuGroups=${[
{
tabs: [
{ key: 'Dashboard', iconName: 'lucide:home', action: () => console.log('Dashboard') },
{ key: 'Inbox', iconName: 'lucide:inbox', action: () => console.log('Inbox') },
]
},
{
name: 'Workspace',
tabs: [
{ key: 'Projects', iconName: 'lucide:folder', action: () => console.log('Projects') },
{ key: 'Tasks', iconName: 'lucide:checkSquare', action: () => console.log('Tasks') },
{ key: 'Documents', iconName: 'lucide:fileText', action: () => console.log('Documents') },
]
},
{
name: 'Analytics',
tabs: [
{ key: 'Reports', iconName: 'lucide:barChart3', action: () => console.log('Reports') },
{ key: 'Insights', iconName: 'lucide:lightbulb', action: () => console.log('Insights') },
]
}
]}
.bottomTabs=${[
{ key: 'Settings', iconName: 'lucide:settings', action: () => console.log('Settings') },
{ key: 'Help', iconName: 'lucide:helpCircle', action: () => console.log('Help') },
]}
></dees-appui-mainmenu>
</div>
`;
// INSTANCE // INSTANCE
@@ -98,6 +57,7 @@ export class DeesAppuiMainmenu extends DeesElement {
--menu-width-collapsed: 56px; --menu-width-collapsed: 56px;
--tooltip-bg: ${cssManager.bdTheme('#18181b', '#fafafa')}; --tooltip-bg: ${cssManager.bdTheme('#18181b', '#fafafa')};
--tooltip-fg: ${cssManager.bdTheme('#fafafa', '#18181b')}; --tooltip-fg: ${cssManager.bdTheme('#fafafa', '#18181b')};
position: relative;
display: block; display: block;
height: 100%; height: 100%;
} }
@@ -188,13 +148,12 @@ export class DeesAppuiMainmenu extends DeesElement {
:host([collapsed]) .logoSection { :host([collapsed]) .logoSection {
justify-content: center; justify-content: center;
padding: 0 8px; padding: 0;
gap: 0;
} }
:host([collapsed]) .logoSection .logoText { :host([collapsed]) .logoSection .logoText {
opacity: 0; display: none;
width: 0;
overflow: hidden;
} }
/* Middle Section (scrollable) */ /* Middle Section (scrollable) */
@@ -395,9 +354,6 @@ export class DeesAppuiMainmenu extends DeesElement {
const allTabs = this.getAllTabs(); const allTabs = this.getAllTabs();
return html` return html`
<button class="collapse-toggle" @click="${() => this.toggleCollapse()}">
<dees-icon .icon="${this.collapsed ? 'lucide:chevronRight' : 'lucide:chevronLeft'}"></dees-icon>
</button>
<div class="mainContainer" @contextmenu=${(eventArg: MouseEvent) => { <div class="mainContainer" @contextmenu=${(eventArg: MouseEvent) => {
DeesContextmenu.openContextMenuWithOptions(eventArg, [{ DeesContextmenu.openContextMenuWithOptions(eventArg, [{
name: 'app settings', name: 'app settings',
@@ -422,6 +378,9 @@ export class DeesAppuiMainmenu extends DeesElement {
</div> </div>
` : ''} ` : ''}
</div> </div>
<button class="collapse-toggle" @click="${() => this.toggleCollapse()}">
<dees-icon .icon="${this.collapsed ? 'lucide:chevronRight' : 'lucide:chevronLeft'}"></dees-icon>
</button>
`; `;
} }

View File

@@ -0,0 +1,52 @@
import { html } from '@design.estate/dees-element';
import type * as interfaces from '../../interfaces/index.js';
export const demoFunc = () => html`
<style>
.demo-secondarymenu-container {
display: flex;
height: 100%;
background: #1a1a1a;
border-radius: 8px;
}
.demo-secondarymenu-container .spacer {
flex: 1;
background: #0f0f0f;
}
</style>
<div class="demo-secondarymenu-container">
<dees-appui-secondarymenu
.heading=${'Projects'}
.groups=${[
{
name: 'Active',
iconName: 'lucide:folder',
items: [
{ key: 'Frontend App', iconName: 'code', action: () => console.log('Frontend'), badge: 3, badgeVariant: 'warning' },
{ key: 'API Server', iconName: 'server', action: () => console.log('API'), badge: 'new', badgeVariant: 'success' },
{ key: 'Database', iconName: 'database', action: () => console.log('Database') },
]
},
{
name: 'Archived',
iconName: 'lucide:archive',
collapsed: true,
items: [
{ key: 'Legacy System', iconName: 'box', action: () => console.log('Legacy') },
{ key: 'Old API', iconName: 'server', action: () => console.log('Old API') },
]
},
{
name: 'Settings',
iconName: 'lucide:settings',
items: [
{ key: 'Configuration', iconName: 'sliders', action: () => console.log('Config') },
{ key: 'Integrations', iconName: 'plug', action: () => console.log('Integrations'), badge: 5, badgeVariant: 'error' },
]
}
] as interfaces.ISecondaryMenuGroup[]}
@item-select=${(e: CustomEvent) => console.log('Selected:', e.detail)}
></dees-appui-secondarymenu>
<div class="spacer"></div>
</div>
`;

View File

@@ -14,6 +14,7 @@ import {
css, css,
cssManager, cssManager,
} from '@design.estate/dees-element'; } from '@design.estate/dees-element';
import { demoFunc } from './dees-appui-secondarymenu.demo.js';
/** /**
* Secondary navigation menu for sub-navigation within MainMenu views * Secondary navigation menu for sub-navigation within MainMenu views
@@ -21,51 +22,7 @@ import {
*/ */
@customElement('dees-appui-secondarymenu') @customElement('dees-appui-secondarymenu')
export class DeesAppuiSecondarymenu extends DeesElement { export class DeesAppuiSecondarymenu extends DeesElement {
public static demo = () => html` public static demo = demoFunc;
<style>
.demo-container {
height: 500px;
display: flex;
background: #1a1a1a;
border-radius: 8px;
overflow: hidden;
}
</style>
<div class="demo-container">
<dees-appui-secondarymenu
.heading=${'Projects'}
.groups=${[
{
name: 'Active',
iconName: 'lucide:folder',
items: [
{ key: 'Frontend App', iconName: 'code', action: () => console.log('Frontend'), badge: 3, badgeVariant: 'warning' },
{ key: 'API Server', iconName: 'server', action: () => console.log('API'), badge: 'new', badgeVariant: 'success' },
{ key: 'Database', iconName: 'database', action: () => console.log('Database') },
]
},
{
name: 'Archived',
iconName: 'lucide:archive',
collapsed: true,
items: [
{ key: 'Legacy System', iconName: 'box', action: () => console.log('Legacy') },
{ key: 'Old API', iconName: 'server', action: () => console.log('Old API') },
]
},
{
name: 'Settings',
iconName: 'lucide:settings',
items: [
{ key: 'Configuration', iconName: 'sliders', action: () => console.log('Config') },
{ key: 'Integrations', iconName: 'plug', action: () => console.log('Integrations'), badge: 5, badgeVariant: 'error' },
]
}
] as interfaces.ISecondaryMenuGroup[]}
@item-select=${(e: CustomEvent) => console.log('Selected:', e.detail)}
></dees-appui-secondarymenu>
</div>
`;
// INSTANCE // INSTANCE
@@ -120,6 +77,7 @@ export class DeesAppuiSecondarymenu extends DeesElement {
--badge-error-bg: ${cssManager.bdTheme('#fee2e2', '#450a0a')}; --badge-error-bg: ${cssManager.bdTheme('#fee2e2', '#450a0a')};
--badge-error-fg: ${cssManager.bdTheme('#991b1b', '#f87171')}; --badge-error-fg: ${cssManager.bdTheme('#991b1b', '#f87171')};
position: relative;
display: block; display: block;
height: 100%; height: 100%;
width: var(--sidebar-width-expanded); width: var(--sidebar-width-expanded);
@@ -486,9 +444,6 @@ export class DeesAppuiSecondarymenu extends DeesElement {
public render(): TemplateResult { public render(): TemplateResult {
return html` return html`
<button class="collapse-toggle" @click="${() => this.toggleCollapse()}">
<dees-icon .icon="${this.collapsed ? 'lucide:chevronRight' : 'lucide:chevronLeft'}"></dees-icon>
</button>
<div class="maincontainer"> <div class="maincontainer">
<div class="header"> <div class="header">
<span class="heading">${this.heading}</span> <span class="heading">${this.heading}</span>
@@ -499,6 +454,9 @@ export class DeesAppuiSecondarymenu extends DeesElement {
: this.renderLegacyOptions()} : this.renderLegacyOptions()}
</div> </div>
</div> </div>
<button class="collapse-toggle" @click="${() => this.toggleCollapse()}">
<dees-icon .icon="${this.collapsed ? 'lucide:chevronRight' : 'lucide:chevronLeft'}"></dees-icon>
</button>
`; `;
} }

View File

@@ -266,17 +266,17 @@ export const demoFunc = () => html`
.viewTabs=${[ .viewTabs=${[
{ {
name: 'Dashboard', name: 'Dashboard',
iconName: 'home', iconName: 'lucide:home',
element: DemoViewDashboard, element: DemoViewDashboard,
}, },
{ {
name: 'Analytics', name: 'Analytics',
iconName: 'lineChart', iconName: 'lucide:lineChart',
element: DemoViewAnalytics, element: DemoViewAnalytics,
}, },
{ {
name: 'Settings', name: 'Settings',
iconName: 'settings', iconName: 'lucide:settings',
element: DemoViewSettings, element: DemoViewSettings,
} }
] as IView[]} ] as IView[]}

View File

@@ -51,7 +51,7 @@ export class DeesSimpleAppDash extends DeesElement {
cssManager.defaultStyles, cssManager.defaultStyles,
css` css`
:host { :host {
color: ${cssManager.bdTheme('#333', '#ccc')}; color: ${cssManager.bdTheme('hsl(0 0% 15%)', 'hsl(0 0% 90%)')};
user-select: none; user-select: none;
display: block; display: block;
overflow: hidden; overflow: hidden;
@@ -75,109 +75,188 @@ export class DeesSimpleAppDash extends DeesElement {
left: 0px; left: 0px;
height: calc(100% - 24px); height: calc(100% - 24px);
width: 240px; width: 240px;
background: ${cssManager.bdTheme('#fafafa', '#000')}; background: ${cssManager.bdTheme('hsl(0 0% 99%)', 'hsl(0 0% 7%)')};
border-right: 1px solid ${cssManager.bdTheme('#e0e0e0', '#202020')}; border-right: 1px solid ${cssManager.bdTheme('hsl(0 0% 91%)', 'hsl(0 0% 13%)')};
font-size: 12px; font-size: 13px;
font-family: 'Geist Sans', sans-serif; font-family: 'Geist Sans', sans-serif;
z-index: 2; z-index: 2;
display: grid; display: grid;
grid-template-rows: auto min-content; grid-template-rows: auto 1fr min-content;
overflow: hidden; overflow: hidden;
} }
.sidebar-header { .sidebar-header {
padding: 16px 12px; padding: 20px 16px;
border-bottom: 1px solid ${cssManager.bdTheme('#e0e0e0', '#202020')}; border-bottom: 1px solid ${cssManager.bdTheme('hsl(0 0% 91%)', 'hsl(0 0% 13%)')};
display: flex; display: flex;
align-items: center; align-items: center;
gap: 8px; gap: 12px;
} }
.header-icon-wrapper {
display: flex;
align-items: center;
justify-content: center;
width: 36px;
height: 36px;
border-radius: 10px;
background: ${cssManager.bdTheme(
'linear-gradient(135deg, hsl(215 20% 95%) 0%, hsl(215 20% 90%) 100%)',
'linear-gradient(135deg, hsl(215 20% 18%) 0%, hsl(215 20% 14%) 100%)'
)};
box-shadow: ${cssManager.bdTheme(
'0 1px 2px rgb(0 0 0 / 0.05), inset 0 1px 0 rgb(255 255 255 / 0.5)',
'0 1px 2px rgb(0 0 0 / 0.2), inset 0 1px 0 rgb(255 255 255 / 0.05)'
)};
}
.header-icon-wrapper dees-icon {
font-size: 18px;
color: ${cssManager.bdTheme('hsl(215 20% 40%)', 'hsl(215 20% 70%)')};
}
.appName { .appName {
font-size: 14px; font-size: 15px;
font-weight: 600; font-weight: 600;
color: ${cssManager.bdTheme('#000', '#fff')}; color: ${cssManager.bdTheme('hsl(0 0% 9%)', 'hsl(0 0% 98%)')};
white-space: nowrap; white-space: nowrap;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
letter-spacing: -0.02em;
} }
.viewTabs-container { .viewTabs-container {
flex: 1;
overflow-y: auto; overflow-y: auto;
padding: 4px 0; padding: 12px 8px;
scrollbar-width: thin;
scrollbar-color: ${cssManager.bdTheme('hsl(0 0% 85%)', 'hsl(0 0% 20%)')} transparent;
}
.viewTabs-container::-webkit-scrollbar {
width: 6px;
}
.viewTabs-container::-webkit-scrollbar-track {
background: transparent;
}
.viewTabs-container::-webkit-scrollbar-thumb {
background: ${cssManager.bdTheme('hsl(0 0% 85%)', 'hsl(0 0% 20%)')};
border-radius: 3px;
}
.viewTabs-container::-webkit-scrollbar-thumb:hover {
background: ${cssManager.bdTheme('hsl(0 0% 75%)', 'hsl(0 0% 30%)')};
}
.section-label {
font-size: 11px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.05em;
color: ${cssManager.bdTheme('hsl(0 0% 50%)', 'hsl(0 0% 50%)')};
padding: 8px 12px 8px;
margin-bottom: 4px;
} }
.viewTabs { .viewTabs {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 2px;
} }
.viewTab { .viewTab {
display: flex; display: flex;
align-items: center; align-items: center;
gap: 8px; gap: 10px;
padding: 8px 12px; padding: 10px 12px;
cursor: default; cursor: default;
transition: background 0.1s; transition: all 0.15s ease;
color: ${cssManager.bdTheme('#333', '#ccc')}; color: ${cssManager.bdTheme('hsl(0 0% 40%)', 'hsl(0 0% 65%)')};
user-select: none; user-select: none;
position: relative; position: relative;
border-radius: 8px;
} }
.viewTab:hover { .viewTab:hover {
background: ${cssManager.bdTheme('rgba(0, 0, 0, 0.04)', 'rgba(255, 255, 255, 0.08)')}; background: ${cssManager.bdTheme('hsl(0 0% 0% / 0.04)', 'hsl(0 0% 100% / 0.05)')};
color: ${cssManager.bdTheme('hsl(0 0% 15%)', 'hsl(0 0% 90%)')};
} }
.viewTab:active { .viewTab:active {
background: ${cssManager.bdTheme('rgba(0, 0, 0, 0.08)', 'rgba(255, 255, 255, 0.12)')}; background: ${cssManager.bdTheme('hsl(0 0% 0% / 0.06)', 'hsl(0 0% 100% / 0.07)')};
transform: scale(0.99);
} }
.viewTab.selected { .viewTab.selected {
background: ${cssManager.bdTheme('rgba(0, 0, 0, 0.08)', 'rgba(255, 255, 255, 0.12)')}; background: ${cssManager.bdTheme('hsl(215 25% 95%)', 'hsl(215 20% 15%)')};
color: ${cssManager.bdTheme('#000', '#fff')}; color: ${cssManager.bdTheme('hsl(215 25% 30%)', 'hsl(215 25% 85%)')};
font-weight: 500; font-weight: 500;
} }
.viewTab.selected::before { .viewTab.selected::before {
content: ''; content: '';
position: absolute; position: absolute;
left: 0; left: 0;
top: 0; top: 8px;
bottom: 0; bottom: 8px;
width: 3px; width: 3px;
background: ${cssManager.bdTheme('#26a69a', '#26a69a')}; border-radius: 0 2px 2px 0;
} background: ${cssManager.bdTheme('hsl(215 70% 50%)', 'hsl(215 70% 60%)')};
.viewTab dees-icon {
font-size: 14px;
opacity: 0.7;
} }
.viewTab dees-icon {
font-size: 16px;
opacity: 0.55;
transition: all 0.15s ease;
}
.viewTab:hover dees-icon {
opacity: 0.75;
}
.viewTab.selected dees-icon {
opacity: 0.9;
color: ${cssManager.bdTheme('hsl(215 70% 45%)', 'hsl(215 70% 65%)')};
}
.viewTab span {
flex: 1;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.appActions { .appActions {
padding: 12px; padding: 12px 8px;
border-top: 1px solid ${cssManager.bdTheme('#e0e0e0', '#202020')}; border-top: 1px solid ${cssManager.bdTheme('hsl(0 0% 91%)', 'hsl(0 0% 13%)')};
} }
.action { .action {
display: flex; display: flex;
align-items: center; align-items: center;
gap: 8px; gap: 10px;
padding: 8px; padding: 10px 12px;
border-radius: 4px; border-radius: 8px;
cursor: default; cursor: default;
transition: background 0.1s; transition: all 0.15s ease;
color: ${cssManager.bdTheme('#333', '#ccc')}; color: ${cssManager.bdTheme('hsl(0 0% 40%)', 'hsl(0 0% 65%)')};
} }
.action:hover { .action:hover {
background: ${cssManager.bdTheme('rgba(0, 0, 0, 0.04)', 'rgba(255, 255, 255, 0.08)')}; background: ${cssManager.bdTheme('hsl(0 84% 60% / 0.08)', 'hsl(0 84% 60% / 0.12)')};
color: ${cssManager.bdTheme('hsl(0 84% 45%)', 'hsl(0 84% 65%)')};
} }
.action dees-icon { .action dees-icon {
font-size: 14px; font-size: 16px;
opacity: 0.7; opacity: 0.6;
transition: all 0.15s ease;
}
.action:hover dees-icon {
opacity: 0.9;
color: ${cssManager.bdTheme('hsl(0 84% 45%)', 'hsl(0 84% 65%)')};
} }
.appcontent { .appcontent {
@@ -189,46 +268,61 @@ export class DeesSimpleAppDash extends DeesElement {
bottom: 24px; bottom: 24px;
width: calc(100% - 240px); width: calc(100% - 240px);
overflow: auto; overflow: auto;
background: ${cssManager.bdTheme('#f5f5f5', '#000')}; background: ${cssManager.bdTheme('hsl(0 0% 97%)', 'hsl(0 0% 5%)')};
overscroll-behavior: contain; overscroll-behavior: contain;
} }
.controlbar { .controlbar {
color: #fff; color: #fff;
position: absolute; position: absolute;
bottom: 0px; bottom: 0px;
left: 0px; left: 0px;
width: 100%; width: 100%;
border-top: 1px solid ${cssManager.bdTheme('#00000020', '#ffffff20')};
height: 24px; height: 24px;
background: ${cssManager.bdTheme('#2196f3', '#1565c0')}; background: ${cssManager.bdTheme('hsl(220 13% 18%)', 'hsl(220 13% 12%)')};
z-index: 2; z-index: 2;
display: flex; display: flex;
justify-content: flex-end; justify-content: flex-end;
align-items: center; align-items: center;
flex-direction: row; flex-direction: row;
font-size: 12px; font-size: 11px;
font-weight: 500;
letter-spacing: 0.01em;
} }
.control { .control {
display: flex; display: flex;
align-items: center; align-items: center;
gap: 4px; gap: 6px;
margin-right: 16px; padding: 0 12px;
height: 100%;
white-space: nowrap; white-space: nowrap;
cursor: default; cursor: default;
opacity: 0.8; color: hsl(0 0% 70%);
transition: opacity 0.2s; transition: all 0.15s ease;
} border-left: 1px solid hsl(0 0% 100% / 0.08);
.control:hover {
opacity: 1;
}
.control dees-icon {
font-size: 14px;
} }
.control:first-child {
border-left: none;
}
.control:hover {
background: hsl(0 0% 100% / 0.06);
color: hsl(0 0% 95%);
}
.control dees-icon {
font-size: 13px;
}
.control.status-connected dees-icon {
color: hsl(142 70% 50%);
}
.control.status-terminal dees-icon {
color: hsl(45 90% 55%);
}
`, `,
]; ];
@@ -236,27 +330,30 @@ export class DeesSimpleAppDash extends DeesElement {
return html` return html`
<div class="maincontainer"> <div class="maincontainer">
<div class="appbar"> <div class="appbar">
<div> <div class="sidebar-header">
<div class="sidebar-header"> <div class="header-icon-wrapper">
<dees-icon .icon="${'lucide:grid3x3'}" style="font-size: 18px;"></dees-icon> <dees-icon .icon="${'lucide:layoutGrid'}"></dees-icon>
<div class="appName">${this.name}</div>
</div> </div>
<div class="viewTabs-container"> <div class="appName">${this.name}</div>
<div class="viewTabs"> </div>
${this.viewTabs.map( <div class="viewTabs-container">
(view) => html` <div class="section-label">Navigation</div>
<div <div class="viewTabs">
class="viewTab ${this.selectedView === view ? 'selected' : ''}" ${this.viewTabs.map(
@click=${() => this.loadView(view)} (view) => html`
> <div
${view.iconName ? html` class="viewTab ${this.selectedView === view ? 'selected' : ''}"
<dees-icon .icon="${`${view.iconName}`}"></dees-icon> @click=${() => this.loadView(view)}
` : ''} >
<span style="flex: 1;">${view.name}</span> ${view.iconName ? html`
</div> <dees-icon .icon="${view.iconName.includes(':') ? view.iconName : `lucide:${view.iconName}`}"></dees-icon>
` ` : html`
)} <dees-icon .icon="${'lucide:file'}"></dees-icon>
</div> `}
<span>${view.name}</span>
</div>
`
)}
</div> </div>
</div> </div>
<div class="appActions"> <div class="appActions">
@@ -264,7 +361,7 @@ export class DeesSimpleAppDash extends DeesElement {
this.dispatchEvent(new CustomEvent('logout', { bubbles: true, composed: true })); this.dispatchEvent(new CustomEvent('logout', { bubbles: true, composed: true }));
}}> }}>
<dees-icon .icon="${'lucide:logOut'}"></dees-icon> <dees-icon .icon="${'lucide:logOut'}"></dees-icon>
<span>Logout</span> <span>Sign out</span>
</div> </div>
</div> </div>
</div> </div>
@@ -272,11 +369,11 @@ export class DeesSimpleAppDash extends DeesElement {
<!-- Content goes here --> <!-- Content goes here -->
</div> </div>
<div class="controlbar"> <div class="controlbar">
<div class="control"> <div class="control status-connected">
<dees-icon .icon="${'lucide:wifi'}"></dees-icon> <dees-icon .icon="${'lucide:wifi'}"></dees-icon>
<span>Connected</span> <span>Connected</span>
</div> </div>
<div class="control" @click=${this.launchTerminal}> <div class="control status-terminal" @click=${this.launchTerminal}>
<dees-icon .icon="${'lucide:terminal'}"></dees-icon> <dees-icon .icon="${'lucide:terminal'}"></dees-icon>
<span>Terminal</span> <span>Terminal</span>
</div> </div>
@@ -315,10 +412,10 @@ export class DeesSimpleAppDash extends DeesElement {
terminal.style.right = '0px'; terminal.style.right = '0px';
terminal.style.bottom = '24px'; terminal.style.bottom = '24px';
terminal.style.opacity = '0'; terminal.style.opacity = '0';
terminal.style.transform = 'translateY(20px)'; terminal.style.transform = 'translateY(8px) scale(0.99)';
terminal.style.transition = 'all 0.2s'; terminal.style.transition = 'all 0.25s cubic-bezier(0.4, 0, 0.2, 1)';
terminal.style.background = '#000'; terminal.background = 'hsl(220 13% 8%)';
terminal.style.boxShadow = '0 4px 20px rgba(0, 0, 0, 0.3)'; terminal.style.boxShadow = '0 25px 50px -12px rgb(0 0 0 / 0.5), 0 0 0 1px rgb(255 255 255 / 0.05)';
terminal.style.maxWidth = `calc(${maincontainer.clientWidth}px -240px)`; terminal.style.maxWidth = `calc(${maincontainer.clientWidth}px -240px)`;
terminal.style.maxHeight = `calc(${maincontainer.clientHeight}px - 24px)`; terminal.style.maxHeight = `calc(${maincontainer.clientHeight}px - 24px)`;
@@ -327,7 +424,7 @@ export class DeesSimpleAppDash extends DeesElement {
await domtools.convenience.smartdelay.delayFor(0); await domtools.convenience.smartdelay.delayFor(0);
terminal.style.opacity = '1'; terminal.style.opacity = '1';
terminal.style.transform = 'translateY(0px)'; terminal.style.transform = 'translateY(0) scale(1)';
return terminal; return terminal;
} }
@@ -335,8 +432,8 @@ export class DeesSimpleAppDash extends DeesElement {
const domtools = await this.domtoolsPromise; const domtools = await this.domtoolsPromise;
if (this.currentTerminal) { if (this.currentTerminal) {
this.currentTerminal.style.opacity = '0'; this.currentTerminal.style.opacity = '0';
this.currentTerminal.style.transform = 'translateY(20px)'; this.currentTerminal.style.transform = 'translateY(8px) scale(0.99)';
await domtools.convenience.smartdelay.delayFor(200); await domtools.convenience.smartdelay.delayFor(250);
this.currentTerminal.remove(); this.currentTerminal.remove();
this.currentTerminal = null; this.currentTerminal = null;
} }

View File

@@ -29,14 +29,14 @@ export class DeesSimpleLogin extends DeesElement {
cssManager.defaultStyles, cssManager.defaultStyles,
css` css`
:host { :host {
color: ${cssManager.bdTheme('#333', '#ccc')}; color: ${cssManager.bdTheme('hsl(0 0% 3.9%)', 'hsl(0 0% 98%)')};
user-select: none; user-select: none;
display: block; display: block;
width: 100%; width: 100%;
height: 100%; height: 100%;
font-family: 'Geist Sans', sans-serif; font-family: 'Geist Sans', sans-serif;
} }
.loginContainer { .loginContainer {
position: absolute; position: absolute;
display: flex; display: flex;
@@ -46,7 +46,7 @@ export class DeesSimpleLogin extends DeesElement {
height: 100%; height: 100%;
top: 0; top: 0;
left: 0; left: 0;
background: ${cssManager.bdTheme('#f5f5f5', '#000')}; background: ${cssManager.bdTheme('hsl(0 0% 100%)', 'hsl(0 0% 3.9%)')};
} }
.slotContainer { .slotContainer {
@@ -56,43 +56,56 @@ export class DeesSimpleLogin extends DeesElement {
top: 0; top: 0;
left: 0; left: 0;
opacity: 0; opacity: 0;
transition: opacity 0.3s, transform 0.3s; transition: opacity 0.2s ease, transform 0.2s ease;
pointer-events: none; pointer-events: none;
} }
.login { .login {
min-width: 320px; width: 100%;
background: ${cssManager.bdTheme('#ffffff', '#111')}; max-width: 360px;
box-shadow: ${cssManager.bdTheme( display: flex;
'0 4px 12px rgba(0, 0, 0, 0.15)', flex-direction: column;
'0 4px 12px rgba(0, 0, 0, 0.3)' gap: 24px;
)}; }
border-radius: 8px;
border: 1px solid ${cssManager.bdTheme('#e0e0e0', '#202020')}; .login-header {
padding: 24px; display: flex;
transition: opacity 0.3s, transform 0.3s; flex-direction: column;
gap: 8px;
text-align: center;
} }
.header { .header {
text-align: center; font-size: 24px;
font-size: 16px;
font-weight: 600; font-weight: 600;
margin-bottom: 20px; letter-spacing: -0.025em;
color: ${cssManager.bdTheme('#000', '#fff')}; color: ${cssManager.bdTheme('hsl(0 0% 9%)', 'hsl(0 0% 98%)')};
} }
.login dees-form { .subheader {
font-size: 14px;
color: ${cssManager.bdTheme('hsl(0 0% 45.1%)', 'hsl(0 0% 63.9%)')};
}
.login-card {
background: ${cssManager.bdTheme('hsl(0 0% 100%)', 'hsl(0 0% 9%)')};
border: 1px solid ${cssManager.bdTheme('hsl(0 0% 89.8%)', 'hsl(0 0% 14.9%)')};
border-radius: 8px;
padding: 24px;
}
.login-card dees-form {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 12px; gap: 16px;
} }
.login dees-input-text { .login-card dees-input-text {
width: 100%; width: 100%;
} }
.login dees-form-submit { .login-card dees-form-submit {
margin-top: 4px; margin-top: 8px;
width: 100%; width: 100%;
} }
`, `,
@@ -102,12 +115,17 @@ export class DeesSimpleLogin extends DeesElement {
return html` return html`
<div class="loginContainer"> <div class="loginContainer">
<div class="login"> <div class="login">
<div class="header">Login to ${this.name}</div> <div class="login-header">
<dees-form> <div class="header">Sign in</div>
<dees-input-text key="username" label="Username" required></dees-input-text> <div class="subheader">Enter your credentials to access ${this.name}</div>
<dees-input-text key="password" label="Password" isPasswordBool required></dees-input-text> </div>
<dees-form-submit>Login</dees-form-submit> <div class="login-card">
</dees-form> <dees-form>
<dees-input-text key="username" label="Username" required></dees-input-text>
<dees-input-text key="password" label="Password" isPasswordBool required></dees-input-text>
<dees-form-submit>Sign in</dees-form-submit>
</dees-form>
</div>
</div> </div>
</div> </div>
<div class="slotContainer"> <div class="slotContainer">

View File

@@ -38,6 +38,9 @@ export class DeesTerminal extends DeesElement {
@property() @property()
accessor environment: {[key: string]: string} = {}; accessor environment: {[key: string]: string} = {};
@property()
accessor background: string = '#000000';
// exposing webcontainer // exposing webcontainer
private webcontainerDeferred = new domtools.plugins.smartpromise.Deferred<webcontainer.WebContainer>(); private webcontainerDeferred = new domtools.plugins.smartpromise.Deferred<webcontainer.WebContainer>();
public webcontainerPromise = this.webcontainerDeferred.promise; public webcontainerPromise = this.webcontainerDeferred.promise;
@@ -58,7 +61,7 @@ export class DeesTerminal extends DeesElement {
css` css`
:host { :host {
padding: 20px; padding: 20px;
background: #000; background: var(--dees-terminal-background, #000000);
position: absolute; position: absolute;
height: 100%; height: 100%;
width: 100%; width: 100%;
@@ -153,7 +156,7 @@ export class DeesTerminal extends DeesElement {
.xterm .composition-view { .xterm .composition-view {
/* TODO: Composition position got messed up somewhere */ /* TODO: Composition position got messed up somewhere */
background: #000; background: var(--dees-terminal-background, #000000);
color: #fff; color: #fff;
display: none; display: none;
position: absolute; position: absolute;
@@ -167,7 +170,7 @@ export class DeesTerminal extends DeesElement {
.xterm .xterm-viewport { .xterm .xterm-viewport {
/* On OS X this is required in order for the scroll bar to appear fully opaque */ /* On OS X this is required in order for the scroll bar to appear fully opaque */
background-color: #000; background-color: var(--dees-terminal-background, #000000);
overflow-y: scroll; overflow-y: scroll;
cursor: default; cursor: default;
position: absolute; position: absolute;
@@ -261,11 +264,18 @@ export class DeesTerminal extends DeesElement {
): Promise<void> { ): Promise<void> {
const domtools = await this.domtoolsPromise; const domtools = await this.domtoolsPromise;
super.firstUpdated(_changedProperties); super.firstUpdated(_changedProperties);
// Sync CSS variable with background property
this.style.setProperty('--dees-terminal-background', this.background);
const container = this.shadowRoot.getElementById('container'); const container = this.shadowRoot.getElementById('container');
const term = new Terminal({ const term = new Terminal({
convertEol: true, convertEol: true,
cursorBlink: true, cursorBlink: true,
theme: {
background: this.background,
},
}); });
this.fitAddon = new FitAddon(); this.fitAddon = new FitAddon();
term.loadAddon(this.fitAddon); term.loadAddon(this.fitAddon);