diff --git a/ts_web/elements/dees-chart-log.ts b/ts_web/elements/dees-chart-log.ts index f2e5bba..a6204f7 100644 --- a/ts_web/elements/dees-chart-log.ts +++ b/ts_web/elements/dees-chart-log.ts @@ -53,17 +53,17 @@ export class DeesChartLog extends DeesElement { cssManager.defaultStyles, css` :host { - font-family: 'Geist Mono', 'Consolas', 'Monaco', monospace; - color: #ccc; + font-family: 'SF Mono', 'Monaco', 'Consolas', 'Liberation Mono', 'Courier New', monospace; + color: ${cssManager.bdTheme('hsl(0 0% 3.9%)', 'hsl(0 0% 98%)')}; font-size: 12px; - line-height: 1.4; + line-height: 1.5; } .mainbox { position: relative; width: 100%; height: 400px; - background: ${cssManager.bdTheme('#f8f9fa', '#0a0a0a')}; - border: 1px solid ${cssManager.bdTheme('#dee2e6', '#333')}; + background: ${cssManager.bdTheme('hsl(0 0% 100%)', 'hsl(0 0% 3.9%)')}; + border: 1px solid ${cssManager.bdTheme('hsl(0 0% 89.8%)', 'hsl(0 0% 14.9%)')}; border-radius: 8px; display: flex; flex-direction: column; @@ -71,9 +71,9 @@ export class DeesChartLog extends DeesElement { } .header { - background: ${cssManager.bdTheme('#e9ecef', '#1a1a1a')}; - padding: 8px 16px; - border-bottom: 1px solid ${cssManager.bdTheme('#dee2e6', '#333')}; + background: ${cssManager.bdTheme('hsl(0 0% 97%)', 'hsl(0 0% 7%)')}; + padding: 12px 16px; + border-bottom: 1px solid ${cssManager.bdTheme('hsl(0 0% 89.8%)', 'hsl(0 0% 14.9%)')}; display: flex; justify-content: space-between; align-items: center; @@ -81,8 +81,10 @@ export class DeesChartLog extends DeesElement { } .title { - font-weight: 600; - color: ${cssManager.bdTheme('#212529', '#fff')}; + font-weight: 500; + font-size: 14px; + color: ${cssManager.bdTheme('hsl(0 0% 9%)', 'hsl(0 0% 95%)')}; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; } .controls { @@ -91,44 +93,48 @@ export class DeesChartLog extends DeesElement { } .control-button { - background: ${cssManager.bdTheme('#e9ecef', '#2a2a2a')}; - border: 1px solid ${cssManager.bdTheme('#ced4da', '#444')}; - border-radius: 4px; - padding: 4px 8px; - color: ${cssManager.bdTheme('#495057', '#ccc')}; + background: ${cssManager.bdTheme('hsl(0 0% 100%)', 'hsl(0 0% 14.9%)')}; + border: 1px solid ${cssManager.bdTheme('hsl(0 0% 89.8%)', 'hsl(0 0% 14.9%)')}; + border-radius: 6px; + padding: 6px 12px; + color: ${cssManager.bdTheme('hsl(0 0% 45.1%)', 'hsl(0 0% 63.9%)')}; cursor: pointer; - font-size: 11px; - transition: all 0.2s; + font-size: 12px; + font-weight: 500; + transition: all 0.15s; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; } .control-button:hover { - background: ${cssManager.bdTheme('#dee2e6', '#3a3a3a')}; - border-color: ${cssManager.bdTheme('#adb5bd', '#555')}; + background: ${cssManager.bdTheme('hsl(0 0% 95.1%)', 'hsl(0 0% 14.9%)')}; + border-color: ${cssManager.bdTheme('hsl(0 0% 79.8%)', 'hsl(0 0% 20.9%)')}; + color: ${cssManager.bdTheme('hsl(0 0% 15%)', 'hsl(0 0% 93.9%)')}; } .control-button.active { - background: ${cssManager.bdTheme('#007bff', '#4a4a4a')}; - color: ${cssManager.bdTheme('#fff', '#fff')}; + background: ${cssManager.bdTheme('hsl(0 0% 9%)', 'hsl(0 0% 93.9%)')}; + color: ${cssManager.bdTheme('hsl(0 0% 98%)', 'hsl(0 0% 3.9%)')}; } .logContainer { flex: 1; overflow-y: auto; overflow-x: hidden; - padding: 8px 16px; + padding: 16px; font-size: 12px; } .logEntry { - margin-bottom: 2px; + margin-bottom: 4px; display: flex; white-space: pre-wrap; word-break: break-all; + font-variant-numeric: tabular-nums; } .timestamp { - color: ${cssManager.bdTheme('#6c757d', '#666')}; - margin-right: 8px; + color: ${cssManager.bdTheme('hsl(0 0% 63.9%)', 'hsl(0 0% 45.1%)')}; + margin-right: 12px; flex-shrink: 0; } @@ -143,38 +149,38 @@ export class DeesChartLog extends DeesElement { } .level.debug { - color: ${cssManager.bdTheme('#6c757d', '#999')}; - background: ${cssManager.bdTheme('rgba(108, 117, 125, 0.1)', '#333')}; + color: ${cssManager.bdTheme('hsl(0 0% 45.1%)', 'hsl(0 0% 63.9%)')}; + background: ${cssManager.bdTheme('hsl(0 0% 45.1% / 0.1)', 'hsl(0 0% 63.9% / 0.1)')}; } .level.info { - color: ${cssManager.bdTheme('#0066cc', '#4a9eff')}; - background: ${cssManager.bdTheme('rgba(0, 102, 204, 0.1)', 'rgba(74, 158, 255, 0.1)')}; + color: ${cssManager.bdTheme('hsl(222.2 47.4% 51.2%)', 'hsl(217.2 91.2% 59.8%)')}; + background: ${cssManager.bdTheme('hsl(222.2 47.4% 51.2% / 0.1)', 'hsl(217.2 91.2% 59.8% / 0.1)')}; } .level.warn { - color: ${cssManager.bdTheme('#ff8800', '#ffb84a')}; - background: ${cssManager.bdTheme('rgba(255, 136, 0, 0.1)', 'rgba(255, 184, 74, 0.1)')}; + color: ${cssManager.bdTheme('hsl(25 95% 53%)', 'hsl(25 95% 63%)')}; + background: ${cssManager.bdTheme('hsl(25 95% 53% / 0.1)', 'hsl(25 95% 63% / 0.1)')}; } .level.error { - color: ${cssManager.bdTheme('#dc3545', '#ff4a4a')}; - background: ${cssManager.bdTheme('rgba(220, 53, 69, 0.1)', 'rgba(255, 74, 74, 0.1)')}; + color: ${cssManager.bdTheme('hsl(0 84.2% 60.2%)', 'hsl(0 72.2% 50.6%)')}; + background: ${cssManager.bdTheme('hsl(0 84.2% 60.2% / 0.1)', 'hsl(0 72.2% 50.6% / 0.1)')}; } .level.success { - color: ${cssManager.bdTheme('#28a745', '#4aff88')}; - background: ${cssManager.bdTheme('rgba(40, 167, 69, 0.1)', 'rgba(74, 255, 136, 0.1)')}; + color: ${cssManager.bdTheme('hsl(142.1 76.2% 36.3%)', 'hsl(142.1 70.6% 45.3%)')}; + background: ${cssManager.bdTheme('hsl(142.1 76.2% 36.3% / 0.1)', 'hsl(142.1 70.6% 45.3% / 0.1)')}; } .source { - color: ${cssManager.bdTheme('#6c757d', '#888')}; + color: ${cssManager.bdTheme('hsl(0 0% 45.1%)', 'hsl(0 0% 63.9%)')}; margin-right: 8px; flex-shrink: 0; } .message { - color: ${cssManager.bdTheme('#212529', '#ddd')}; + color: ${cssManager.bdTheme('hsl(0 0% 15%)', 'hsl(0 0% 90%)')}; flex: 1; } @@ -183,7 +189,7 @@ export class DeesChartLog extends DeesElement { align-items: center; justify-content: center; height: 100%; - color: ${cssManager.bdTheme('#6c757d', '#666')}; + color: ${cssManager.bdTheme('hsl(0 0% 45.1%)', 'hsl(0 0% 63.9%)')}; font-style: italic; } @@ -193,16 +199,16 @@ export class DeesChartLog extends DeesElement { } .logContainer::-webkit-scrollbar-track { - background: ${cssManager.bdTheme('#e9ecef', '#1a1a1a')}; + background: ${cssManager.bdTheme('hsl(0 0% 95%)', 'hsl(0 0% 10%)')}; } .logContainer::-webkit-scrollbar-thumb { - background: ${cssManager.bdTheme('#adb5bd', '#444')}; + background: ${cssManager.bdTheme('hsl(0 0% 70%)', 'hsl(0 0% 30%)')}; border-radius: 4px; } .logContainer::-webkit-scrollbar-thumb:hover { - background: ${cssManager.bdTheme('#6c757d', '#555')}; + background: ${cssManager.bdTheme('hsl(0 0% 60%)', 'hsl(0 0% 40%)')}; } `, ]; diff --git a/ts_web/elements/dees-dataview-statusobject.demo.ts b/ts_web/elements/dees-dataview-statusobject.demo.ts index b2368cc..815667f 100644 --- a/ts_web/elements/dees-dataview-statusobject.demo.ts +++ b/ts_web/elements/dees-dataview-statusobject.demo.ts @@ -3,47 +3,162 @@ import * as tsclass from '@tsclass/tsclass'; export const demoFunc = () => html`
- - +
+ Right-click on any detail row to copy the value, key, or key:value combination +
+
+
+
Service Health Status
+ + +
+ +
+
Database Cluster Status
+ + +
+ +
+
Build Pipeline Status
+ + +
+
`; diff --git a/ts_web/elements/dees-dataview-statusobject.ts b/ts_web/elements/dees-dataview-statusobject.ts index 3edc7b0..e41c06d 100644 --- a/ts_web/elements/dees-dataview-statusobject.ts +++ b/ts_web/elements/dees-dataview-statusobject.ts @@ -15,6 +15,7 @@ import { } from '@design.estate/dees-element'; import * as tsclass from '@tsclass/tsclass'; +import { DeesContextmenu } from './dees-contextmenu.js'; declare global { interface HTMLElementTagNameMap { @@ -31,109 +32,128 @@ export class DeesDataviewStatusobject extends DeesElement { public static styles = [ cssManager.defaultStyles, css` + :host { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif; + } + .mainbox { border-radius: 8px; - background: ${cssManager.bdTheme('#fff', '#1b1b1b')}; - box-shadow: 0px 1px 3px #00000030; + background: ${cssManager.bdTheme('hsl(0 0% 100%)', 'hsl(0 0% 3.9%)')}; + border: 1px solid ${cssManager.bdTheme('hsl(0 0% 89.8%)', 'hsl(0 0% 14.9%)')}; + box-shadow: 0 1px 3px 0 hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1); min-height: 48px; - color: ${cssManager.bdTheme('#000', '#fff')}; - border-top: ${cssManager.bdTheme('none', '1px solid #ffffff10')}; + color: ${cssManager.bdTheme('hsl(0 0% 9%)', 'hsl(0 0% 98%)')}; cursor: default; + overflow: hidden; } .heading { display: grid; align-items: center; - grid-template-columns: 40px auto 120px; + grid-template-columns: 48px auto 100px; + height: 56px; + padding: 0 16px; + background: ${cssManager.bdTheme('hsl(0 0% 97%)', 'hsl(0 0% 7%)')}; + border-bottom: 1px solid ${cssManager.bdTheme('hsl(0 0% 89.8%)', 'hsl(0 0% 14.9%)')}; } h1 { display: block; margin: 0px; - padding: 0px; - height: 48px; - text-transform: uppercase; - font-size: 12px; - line-height: 48px; + padding: 0px 12px; + font-size: 14px; + font-weight: 500; + letter-spacing: -0.01em; + color: ${cssManager.bdTheme('hsl(0 0% 15%)', 'hsl(0 0% 93.9%)')}; } .statusdot { - height: 8px; - width: 8px; - border-radius: 6px; - background: grey; + height: 10px; + width: 10px; + border-radius: 50%; + background: ${cssManager.bdTheme('hsl(0 0% 63.9%)', 'hsl(0 0% 45.1%)')}; margin: auto; + box-shadow: 0 0 0 3px ${cssManager.bdTheme('hsl(0 0% 63.9% / 0.2)', 'hsl(0 0% 45.1% / 0.2)')}; + transition: all 0.2s ease; } .copyMain { - font-size: 10px; - font-weight: 600; - text-transform: uppercase; - border: 1px solid ${cssManager.bdTheme('#e0e0e0', '#444')}; + font-size: 12px; + font-weight: 500; + background: ${cssManager.bdTheme('hsl(0 0% 100%)', 'hsl(0 0% 14.9%)')}; + border: 1px solid ${cssManager.bdTheme('hsl(0 0% 89.8%)', 'hsl(0 0% 14.9%)')}; text-align: center; - padding: 4px; - border-radius: 3px; - margin-right: 16px; - color: ${cssManager.bdTheme('#333', '#ffffff80')}; + padding: 6px 12px; + border-radius: 6px; + color: ${cssManager.bdTheme('hsl(0 0% 45.1%)', 'hsl(0 0% 63.9%)')}; user-select: none; + cursor: pointer; + transition: all 0.15s ease; } .copyMain:hover { - background: ${cssManager.bdTheme(colors.bright.blue, colors.dark.blue)}; - border: 1px solid ${cssManager.bdTheme(colors.bright.blue, colors.dark.blue)}; - color: #fff; + background: ${cssManager.bdTheme('hsl(0 0% 95.1%)', 'hsl(0 0% 14.9%)')}; + border-color: ${cssManager.bdTheme('hsl(0 0% 79.8%)', 'hsl(0 0% 20.9%)')}; + color: ${cssManager.bdTheme('hsl(0 0% 15%)', 'hsl(0 0% 93.9%)')}; } .copyMain:active { - background: ${cssManager.bdTheme(colors.bright.blueActive, colors.dark.blueActive)}; - border: 1px solid ${cssManager.bdTheme(colors.bright.blueActive, colors.dark.blueActive)}; - color: #fff; + background: ${cssManager.bdTheme('hsl(0 0% 91%)', 'hsl(0 0% 14.9%)')}; + transform: scale(0.98); } .statusdot.ok { - background: green; + background: ${cssManager.bdTheme('hsl(142.1 76.2% 36.3%)', 'hsl(142.1 70.6% 45.3%)')}; + box-shadow: 0 0 0 3px ${cssManager.bdTheme('hsl(142.1 76.2% 36.3% / 0.2)', 'hsl(142.1 70.6% 45.3% / 0.2)')}; } - .statusdot.not_ok{ - background: red; + .statusdot.not_ok { + background: ${cssManager.bdTheme('hsl(0 84.2% 60.2%)', 'hsl(0 72.2% 50.6%)')}; + box-shadow: 0 0 0 3px ${cssManager.bdTheme('hsl(0 84.2% 60.2% / 0.2)', 'hsl(0 72.2% 50.6% / 0.2)')}; } .statusdot.partly_ok { - background: orange; + background: ${cssManager.bdTheme('hsl(25 95% 53%)', 'hsl(25 95% 63%)')}; + box-shadow: 0 0 0 3px ${cssManager.bdTheme('hsl(25 95% 53% / 0.2)', 'hsl(25 95% 63% / 0.2)')}; } .detail { min-height: 60px; align-items: center; display: grid; - grid-template-columns: 40px auto; - border-top: 1px dotted ${cssManager.bdTheme('#e0e0e0', '#282828')}; - transition: all 0.2s; + grid-template-columns: 48px auto; + border-top: 1px solid ${cssManager.bdTheme('hsl(0 0% 94%)', 'hsl(0 0% 14.9%)')}; + transition: background-color 0.15s ease; + padding-right: 16px; + cursor: context-menu; } .detail:hover { - background: #ffffff05; + background: ${cssManager.bdTheme('hsl(0 0% 97%)', 'hsl(0 0% 7%)')}; } .detail:active { - background: #ffffff10; + background: ${cssManager.bdTheme('hsl(0 0% 95%)', 'hsl(0 0% 9%)')}; } .detail .detailsText { - padding-top: 8px; - padding-bottom: 8px; - padding-right: 8px; + padding: 12px; word-break: break-all; } .detail .detailsText .label { font-size: 12px; - color: #ffffff80 + font-weight: 500; + color: ${cssManager.bdTheme('hsl(0 0% 45.1%)', 'hsl(0 0% 63.9%)')} + margin-bottom: 2px; + letter-spacing: -0.01em; } .detail .detailsText .value { font-size: 14px; - font-family: 'Intel One Mono', 'Geist Mono'; + font-family: 'Intel One Mono', 'Geist Mono', monospace; + color: ${cssManager.bdTheme('hsl(0 0% 15%)', 'hsl(0 0% 90%)')}; + line-height: 1.5; } `, ]; @@ -143,12 +163,40 @@ export class DeesDataviewStatusobject extends DeesElement {
-

${this.statusObject?.name || 'no status object assigned'}

-
Copy as JSON
+

${this.statusObject?.name || 'No status object assigned'}

+
Copy JSON
${this.statusObject?.details?.map((detailArg) => { return html` -
+
{ + event.preventDefault(); + DeesContextmenu.openContextMenuWithOptions(event, [ + { + name: 'Copy Value', + iconName: 'lucideCopy', + action: async () => { + await this.copyToClipboard(detailArg.value, 'Value'); + }, + }, + { + name: 'Copy Key', + iconName: 'lucideKey', + action: async () => { + await this.copyToClipboard(detailArg.name, 'Key'); + }, + }, + { + name: 'Copy Key:Value', + iconName: 'lucideCopyPlus', + action: async () => { + await this.copyToClipboard(`${detailArg.name}: ${detailArg.value}`, 'Key:Value'); + }, + }, + ]); + }} + >
${detailArg.name}
@@ -162,4 +210,42 @@ export class DeesDataviewStatusobject extends DeesElement { } async firstUpdated() {} + + private async copyToClipboard(text: string, type: string = 'Text') { + try { + await navigator.clipboard.writeText(text); + console.log(`${type} copied to clipboard`); + // You could add visual feedback here if needed + } catch (err) { + console.error(`Failed to copy ${type}:`, err); + } + } + + private async handleCopyAsJson() { + if (!this.statusObject) return; + + try { + await navigator.clipboard.writeText(JSON.stringify(this.statusObject, null, 2)); + + // Show feedback + const button = this.shadowRoot.querySelector('.copyMain') as HTMLElement; + const originalText = button.textContent; + button.textContent = 'Copied!'; + + // Apply success styles based on theme + const isDark = !this.goBright; + button.style.background = isDark ? 'hsl(142.1 70.6% 45.3% / 0.1)' : 'hsl(142.1 76.2% 36.3% / 0.1)'; + button.style.borderColor = isDark ? 'hsl(142.1 70.6% 45.3%)' : 'hsl(142.1 76.2% 36.3%)'; + button.style.color = isDark ? 'hsl(142.1 70.6% 45.3%)' : 'hsl(142.1 76.2% 36.3%)'; + + setTimeout(() => { + button.textContent = originalText; + button.style.background = ''; + button.style.borderColor = ''; + button.style.color = ''; + }, 1500); + } catch (err) { + console.error('Failed to copy:', err); + } + } }