@design.estate/dees-catalog 3.35.1 → 3.37.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/dist_bundle/bundle.js +1391 -247
  2. package/dist_ts_web/00_commitinfo_data.js +1 -1
  3. package/dist_ts_web/elements/00group-button/dees-button/dees-button.d.ts +6 -0
  4. package/dist_ts_web/elements/00group-button/dees-button/dees-button.demo.js +69 -29
  5. package/dist_ts_web/elements/00group-button/dees-button/dees-button.js +75 -6
  6. package/dist_ts_web/elements/00group-chart/dees-chart-log/dees-chart-log.d.ts +104 -6
  7. package/dist_ts_web/elements/00group-chart/dees-chart-log/dees-chart-log.demo.js +153 -54
  8. package/dist_ts_web/elements/00group-chart/dees-chart-log/dees-chart-log.js +716 -153
  9. package/dist_ts_web/elements/dees-statsgrid/dees-statsgrid.d.ts +22 -1
  10. package/dist_ts_web/elements/dees-statsgrid/dees-statsgrid.demo.js +130 -2
  11. package/dist_ts_web/elements/dees-statsgrid/dees-statsgrid.js +322 -1
  12. package/dist_ts_web/services/DeesServiceLibLoader.d.ts +34 -1
  13. package/dist_ts_web/services/DeesServiceLibLoader.js +27 -1
  14. package/dist_ts_web/services/index.d.ts +1 -1
  15. package/dist_ts_web/services/versions.d.ts +1 -0
  16. package/dist_ts_web/services/versions.js +2 -1
  17. package/dist_watch/bundle.js +1389 -245
  18. package/dist_watch/bundle.js.map +3 -3
  19. package/package.json +1 -1
  20. package/ts_web/00_commitinfo_data.ts +1 -1
  21. package/ts_web/elements/00group-button/dees-button/dees-button.demo.ts +68 -28
  22. package/ts_web/elements/00group-button/dees-button/dees-button.ts +78 -6
  23. package/ts_web/elements/00group-chart/dees-chart-log/dees-chart-log.demo.ts +163 -56
  24. package/ts_web/elements/00group-chart/dees-chart-log/dees-chart-log.ts +756 -161
  25. package/ts_web/elements/dees-statsgrid/dees-statsgrid.demo.ts +130 -2
  26. package/ts_web/elements/dees-statsgrid/dees-statsgrid.ts +352 -1
  27. package/ts_web/services/DeesServiceLibLoader.ts +50 -1
  28. package/ts_web/services/index.ts +1 -1
  29. package/ts_web/services/versions.ts +1 -0
@@ -53587,26 +53587,26 @@ var init_fontawesome_svg_core = __esm({
53587
53587
  }
53588
53588
  };
53589
53589
  parse7 = {
53590
- icon: function icon(_icon2) {
53591
- if (_icon2 === null) {
53590
+ icon: function icon(_icon3) {
53591
+ if (_icon3 === null) {
53592
53592
  return null;
53593
53593
  }
53594
- if (_typeof(_icon2) === "object" && _icon2.prefix && _icon2.iconName) {
53594
+ if (_typeof(_icon3) === "object" && _icon3.prefix && _icon3.iconName) {
53595
53595
  return {
53596
- prefix: _icon2.prefix,
53597
- iconName: byAlias(_icon2.prefix, _icon2.iconName) || _icon2.iconName
53596
+ prefix: _icon3.prefix,
53597
+ iconName: byAlias(_icon3.prefix, _icon3.iconName) || _icon3.iconName
53598
53598
  };
53599
53599
  }
53600
- if (Array.isArray(_icon2) && _icon2.length === 2) {
53601
- var iconName = _icon2[1].indexOf("fa-") === 0 ? _icon2[1].slice(3) : _icon2[1];
53602
- var prefix4 = getCanonicalPrefix(_icon2[0]);
53600
+ if (Array.isArray(_icon3) && _icon3.length === 2) {
53601
+ var iconName = _icon3[1].indexOf("fa-") === 0 ? _icon3[1].slice(3) : _icon3[1];
53602
+ var prefix4 = getCanonicalPrefix(_icon3[0]);
53603
53603
  return {
53604
53604
  prefix: prefix4,
53605
53605
  iconName: byAlias(prefix4, iconName) || iconName
53606
53606
  };
53607
53607
  }
53608
- if (typeof _icon2 === "string" && (_icon2.indexOf("".concat(config2.cssPrefix, "-")) > -1 || _icon2.match(ICON_SELECTION_SYNTAX_PATTERN))) {
53609
- var canonicalIcon = getCanonicalIcon(_icon2.split(" "), {
53608
+ if (typeof _icon3 === "string" && (_icon3.indexOf("".concat(config2.cssPrefix, "-")) > -1 || _icon3.match(ICON_SELECTION_SYNTAX_PATTERN))) {
53609
+ var canonicalIcon = getCanonicalIcon(_icon3.split(" "), {
53610
53610
  skipLookups: true
53611
53611
  });
53612
53612
  return {
@@ -53614,11 +53614,11 @@ var init_fontawesome_svg_core = __esm({
53614
53614
  iconName: byAlias(canonicalIcon.prefix, canonicalIcon.iconName) || canonicalIcon.iconName
53615
53615
  };
53616
53616
  }
53617
- if (typeof _icon2 === "string") {
53617
+ if (typeof _icon3 === "string") {
53618
53618
  var _prefix = getDefaultUsablePrefix();
53619
53619
  return {
53620
53620
  prefix: _prefix,
53621
- iconName: byAlias(_prefix, _icon2) || _icon2
53621
+ iconName: byAlias(_prefix, _icon3) || _icon3
53622
53622
  };
53623
53623
  }
53624
53624
  }
@@ -101154,6 +101154,7 @@ var init_versions = __esm({
101154
101154
  CDN_VERSIONS = {
101155
101155
  xterm: "5.3.0",
101156
101156
  xtermAddonFit: "0.8.0",
101157
+ xtermAddonSearch: "0.13.0",
101157
101158
  highlightJs: "11.11.1",
101158
101159
  apexcharts: "5.3.6",
101159
101160
  tiptap: "2.23.0",
@@ -101173,12 +101174,14 @@ var init_DeesServiceLibLoader = __esm({
101173
101174
  // Cached library references
101174
101175
  xtermLib = null;
101175
101176
  xtermFitAddonLib = null;
101177
+ xtermSearchAddonLib = null;
101176
101178
  highlightJsLib = null;
101177
101179
  apexChartsLib = null;
101178
101180
  tiptapLib = null;
101179
101181
  // Loading promises to prevent duplicate concurrent loads
101180
101182
  xtermLoadingPromise = null;
101181
101183
  xtermFitAddonLoadingPromise = null;
101184
+ xtermSearchAddonLoadingPromise = null;
101182
101185
  highlightJsLoadingPromise = null;
101183
101186
  apexChartsLoadingPromise = null;
101184
101187
  tiptapLoadingPromise = null;
@@ -101242,6 +101245,30 @@ var init_DeesServiceLibLoader = __esm({
101242
101245
  })();
101243
101246
  return this.xtermFitAddonLoadingPromise;
101244
101247
  }
101248
+ /**
101249
+ * Load xterm-addon-search from CDN
101250
+ * @returns Promise resolving to SearchAddon class
101251
+ */
101252
+ async loadXtermSearchAddon() {
101253
+ if (this.xtermSearchAddonLib) {
101254
+ return this.xtermSearchAddonLib;
101255
+ }
101256
+ if (this.xtermSearchAddonLoadingPromise) {
101257
+ return this.xtermSearchAddonLoadingPromise;
101258
+ }
101259
+ this.xtermSearchAddonLoadingPromise = (async () => {
101260
+ const url = `${CDN_BASE}/xterm-addon-search@${CDN_VERSIONS.xtermAddonSearch}/+esm`;
101261
+ const module = await import(
101262
+ /* @vite-ignore */
101263
+ url
101264
+ );
101265
+ this.xtermSearchAddonLib = {
101266
+ SearchAddon: module.SearchAddon
101267
+ };
101268
+ return this.xtermSearchAddonLib;
101269
+ })();
101270
+ return this.xtermSearchAddonLoadingPromise;
101271
+ }
101245
101272
  /**
101246
101273
  * Inject xterm CSS styles into the document head
101247
101274
  */
@@ -101368,6 +101395,7 @@ var init_DeesServiceLibLoader = __esm({
101368
101395
  await Promise.all([
101369
101396
  this.loadXterm(),
101370
101397
  this.loadXtermFitAddon(),
101398
+ this.loadXtermSearchAddon(),
101371
101399
  this.loadHighlightJs(),
101372
101400
  this.loadApexCharts(),
101373
101401
  this.loadTiptap()
@@ -101382,6 +101410,8 @@ var init_DeesServiceLibLoader = __esm({
101382
101410
  return this.xtermLib !== null;
101383
101411
  case "xtermFitAddon":
101384
101412
  return this.xtermFitAddonLib !== null;
101413
+ case "xtermSearchAddon":
101414
+ return this.xtermSearchAddonLib !== null;
101385
101415
  case "highlightJs":
101386
101416
  return this.highlightJsLib !== null;
101387
101417
  case "apexCharts":
@@ -108343,7 +108373,49 @@ var generateCpuCores = (count2) => {
108343
108373
  }));
108344
108374
  };
108345
108375
  var demoFunc7 = () => {
108346
- return b2(_a11 || (_a11 = __template(["\n <dees-demowrapper>\n <style>\n ", '\n </style>\n \n <div class="demo-container">\n <dees-panel .title=', " .subtitle=", ">\n <dees-statsgrid\n .tiles=", "\n .gridActions=", "\n .minTileWidth=", "\n .gap=", '\n ></dees-statsgrid>\n \n <div id="action-output" style="margin-top: 16px; padding: 12px; background: ', "; border-radius: 6px; font-size: 14px; font-family: monospace; color: ", ';">\n <em>Click on tile actions or grid actions to see the result...</em>\n </div>\n </dees-panel>\n \n <dees-panel .title=', " .subtitle=", ">\n <dees-statsgrid\n .tiles=", "\n .minTileWidth=", "\n .gap=", '\n ></dees-statsgrid>\n \n <div class="tile-config">\n <div class="config-section">\n <div class="config-title">Configuration Options</div>\n <div class="config-description">\n Each tile type supports different properties:\n <ul style="margin: 8px 0; padding-left: 20px;">\n <li><strong>Number:</strong> value, unit, color, description</li>\n <li><strong>Gauge:</strong> value, unit, gaugeOptions (min, max, thresholds)</li>\n <li><strong>Percentage:</strong> value (0-100), color, description</li>\n <li><strong>Trend:</strong> value, unit, trendData array, description</li>\n <li><strong>Text:</strong> value (string), color, description</li>\n </ul>\n </div>\n </div>\n </div>\n </dees-panel>\n \n <dees-panel .title=', " .subtitle=", '>\n <h4 style="margin: 0 0 16px 0; font-size: 16px; font-weight: 600;">Compact Layout (180px tiles)</h4>\n <dees-statsgrid\n .tiles=', "\n .minTileWidth=", "\n .gap=", '\n ></dees-statsgrid>\n \n <h4 style="margin: 24px 0 16px 0; font-size: 16px; font-weight: 600;">Spacious Layout (320px tiles)</h4>\n <dees-statsgrid\n .tiles=', "\n .minTileWidth=", "\n .gap=", "\n ></dees-statsgrid>\n </dees-panel>\n \n <dees-panel .title=", " .subtitle=", '>\n <dees-statsgrid\n id="cpu-cores-grid"\n .tiles=', "\n .gridActions=", "\n .minTileWidth=", "\n .gap=", "\n ></dees-statsgrid>\n </dees-panel>\n\n <dees-panel .title=", " .subtitle=", '>\n <dees-statsgrid\n id="interactive-grid"\n .tiles=', "\n .gridActions=", "\n .minTileWidth=", "\n .gap=", "\n ></dees-statsgrid>\n </dees-panel>\n \n <dees-panel .title=", " .subtitle=", '>\n <div class="code-block">', "</div>\n </dees-panel>\n </div>\n \n <script>\n // Cleanup live updates on page unload\n window.addEventListener('beforeunload', () => {\n if ((window as any).liveUpdateInterval) {\n clearInterval((window as any).liveUpdateInterval);\n }\n });\n <\/script>\n </dees-demowrapper>\n "])), i`
108376
+ return b2(_a11 || (_a11 = __template(["\n <dees-demowrapper>\n <style>\n ", '\n </style>\n \n <div class="demo-container">\n <dees-panel .title=', " .subtitle=", ">\n <dees-statsgrid\n .tiles=", "\n .gridActions=", "\n .minTileWidth=", "\n .gap=", '\n ></dees-statsgrid>\n \n <div id="action-output" style="margin-top: 16px; padding: 12px; background: ', "; border-radius: 6px; font-size: 14px; font-family: monospace; color: ", ';">\n <em>Click on tile actions or grid actions to see the result...</em>\n </div>\n </dees-panel>\n \n <dees-panel .title=', " .subtitle=", ">\n <dees-statsgrid\n .tiles=", "\n .minTileWidth=", "\n .gap=", '\n ></dees-statsgrid>\n \n <div class="tile-config">\n <div class="config-section">\n <div class="config-title">Configuration Options</div>\n <div class="config-description">\n Each tile type supports different properties:\n <ul style="margin: 8px 0; padding-left: 20px;">\n <li><strong>Number:</strong> value, unit, color, description</li>\n <li><strong>Gauge:</strong> value, unit, gaugeOptions (min, max, thresholds)</li>\n <li><strong>Percentage:</strong> value (0-100), color, description</li>\n <li><strong>Trend:</strong> value, unit, trendData array, description</li>\n <li><strong>Text:</strong> value (string), color, description</li>\n </ul>\n </div>\n </div>\n </div>\n </dees-panel>\n \n <dees-panel .title=', " .subtitle=", '>\n <h4 style="margin: 0 0 16px 0; font-size: 16px; font-weight: 600;">Compact Layout (180px tiles)</h4>\n <dees-statsgrid\n .tiles=', "\n .minTileWidth=", "\n .gap=", '\n ></dees-statsgrid>\n \n <h4 style="margin: 24px 0 16px 0; font-size: 16px; font-weight: 600;">Spacious Layout (320px tiles)</h4>\n <dees-statsgrid\n .tiles=', "\n .minTileWidth=", "\n .gap=", "\n ></dees-statsgrid>\n </dees-panel>\n \n <dees-panel .title=", " .subtitle=", '>\n <dees-statsgrid\n id="cpu-cores-grid"\n .tiles=', "\n .gridActions=", "\n .minTileWidth=", "\n .gap=", "\n ></dees-statsgrid>\n </dees-panel>\n\n <dees-panel .title=", " .subtitle=", '>\n <dees-statsgrid\n id="interactive-grid"\n .tiles=', "\n .gridActions=", "\n .minTileWidth=", "\n .gap=", "\n ></dees-statsgrid>\n </dees-panel>\n \n <dees-panel .title=", " .subtitle=", '>\n <div class="code-block">', "</div>\n </dees-panel>\n\n <dees-panel .title=", " .subtitle=", ">\n <dees-statsgrid\n .tiles=", "\n .minTileWidth=", "\n .gap=", `
108377
+ ></dees-statsgrid>
108378
+
108379
+ <div class="tile-config">
108380
+ <div class="config-section">
108381
+ <div class="config-title">Partition Tile Properties</div>
108382
+ <div class="config-description">
108383
+ <ul style="margin: 8px 0; padding-left: 20px;">
108384
+ <li><strong>partitionData.used:</strong> Used space in bytes (auto-formatted)</li>
108385
+ <li><strong>partitionData.total:</strong> Total capacity in bytes</li>
108386
+ <li><strong>partitionData.filesystem:</strong> Filesystem type (ext4, xfs, ntfs)</li>
108387
+ <li><strong>partitionData.mountPoint:</strong> Mount point path (optional)</li>
108388
+ </ul>
108389
+ Color thresholds: Normal (&lt;75%), Warning (75-90%), Critical (&gt;90%)
108390
+ </div>
108391
+ </div>
108392
+ <div class="config-section">
108393
+ <div class="config-title">Disk Tile Properties</div>
108394
+ <div class="config-description">
108395
+ <ul style="margin: 8px 0; padding-left: 20px;">
108396
+ <li><strong>diskData.capacity:</strong> Total capacity in bytes</li>
108397
+ <li><strong>diskData.model:</strong> Disk model name (optional)</li>
108398
+ <li><strong>diskData.type:</strong> Disk type: 'ssd', 'hdd', or 'nvme'</li>
108399
+ <li><strong>diskData.iops:</strong> Read/write IOPS (optional)</li>
108400
+ <li><strong>diskData.health:</strong> Health percentage 0-100 (optional)</li>
108401
+ </ul>
108402
+ Health thresholds: Good (70-100%), Warning (30-70%), Critical (&lt;30%)
108403
+ </div>
108404
+ </div>
108405
+ </div>
108406
+ </dees-panel>
108407
+ </div>
108408
+
108409
+ <script>
108410
+ // Cleanup live updates on page unload
108411
+ window.addEventListener('beforeunload', () => {
108412
+ if ((window as any).liveUpdateInterval) {
108413
+ clearInterval((window as any).liveUpdateInterval);
108414
+ }
108415
+ });
108416
+ <\/script>
108417
+ </dees-demowrapper>
108418
+ `])), i`
108347
108419
  .demo-container {
108348
108420
  display: flex;
108349
108421
  flex-direction: column;
@@ -108839,7 +108911,108 @@ html\`
108839
108911
  }
108840
108912
  ]}
108841
108913
  ></dees-statsgrid>
108842
- \`;`);
108914
+ \`;`, "7. Disk & Storage Tiles", "Partition and physical disk visualization tiles", [
108915
+ {
108916
+ id: "root-partition",
108917
+ title: "Root Partition",
108918
+ value: 0,
108919
+ type: "partition",
108920
+ icon: "lucide:folder-root",
108921
+ partitionData: {
108922
+ used: 698341425152,
108923
+ // ~650 GB
108924
+ total: 1073741824e3,
108925
+ // ~1 TB
108926
+ filesystem: "ext4",
108927
+ mountPoint: "/"
108928
+ }
108929
+ },
108930
+ {
108931
+ id: "home-partition",
108932
+ title: "Home Partition",
108933
+ value: 0,
108934
+ type: "partition",
108935
+ icon: "lucide:home",
108936
+ partitionData: {
108937
+ used: 214748364800,
108938
+ // ~200 GB
108939
+ total: 536870912e3,
108940
+ // ~500 GB
108941
+ filesystem: "ext4",
108942
+ mountPoint: "/home"
108943
+ }
108944
+ },
108945
+ {
108946
+ id: "data-partition",
108947
+ title: "Data Partition",
108948
+ value: 0,
108949
+ type: "partition",
108950
+ icon: "lucide:database",
108951
+ partitionData: {
108952
+ used: 1932735283200,
108953
+ // ~1.8 TB (90% - critical)
108954
+ total: 2147483648e3,
108955
+ // ~2 TB
108956
+ filesystem: "xfs",
108957
+ mountPoint: "/data"
108958
+ }
108959
+ },
108960
+ {
108961
+ id: "nvme-ssd",
108962
+ title: "Primary NVMe",
108963
+ value: 0,
108964
+ type: "disk",
108965
+ icon: "lucide:hard-drive",
108966
+ columnSpan: 2,
108967
+ diskData: {
108968
+ capacity: 2e12,
108969
+ // 2 TB
108970
+ model: "Samsung 990 Pro",
108971
+ type: "nvme",
108972
+ iops: {
108973
+ read: 7450,
108974
+ write: 6900
108975
+ },
108976
+ health: 98
108977
+ }
108978
+ },
108979
+ {
108980
+ id: "sata-ssd",
108981
+ title: "Secondary SSD",
108982
+ value: 0,
108983
+ type: "disk",
108984
+ icon: "lucide:hard-drive",
108985
+ diskData: {
108986
+ capacity: 1e12,
108987
+ // 1 TB
108988
+ model: "Crucial MX500",
108989
+ type: "ssd",
108990
+ iops: {
108991
+ read: 560,
108992
+ write: 510
108993
+ },
108994
+ health: 85
108995
+ }
108996
+ },
108997
+ {
108998
+ id: "hdd-storage",
108999
+ title: "Backup HDD",
109000
+ value: 0,
109001
+ type: "disk",
109002
+ icon: "lucide:archive",
109003
+ diskData: {
109004
+ capacity: 8e12,
109005
+ // 8 TB
109006
+ model: "Seagate IronWolf",
109007
+ type: "hdd",
109008
+ iops: {
109009
+ read: 210,
109010
+ write: 195
109011
+ },
109012
+ health: 42
109013
+ }
109014
+ }
109015
+ ], 280, 16);
108843
109016
  };
108844
109017
 
108845
109018
  // ts_web/elements/00group-input/dees-input-base/dees-input-base.ts
@@ -122415,54 +122588,94 @@ var demoFunc26 = () => b2`
122415
122588
  <dees-panel .title=${"3. Buttons with Icons"} .subtitle=${"Combining icons with text for enhanced visual communication"}>
122416
122589
  <div class="icon-row">
122417
122590
  <dees-button>
122418
- <dees-icon iconFA="faPlus"></dees-icon>
122591
+ <dees-icon icon="fa:plus"></dees-icon>
122419
122592
  Add Item
122420
122593
  </dees-button>
122421
122594
  <dees-button type="destructive">
122422
- <dees-icon iconFA="faTrash"></dees-icon>
122595
+ <dees-icon icon="fa:trash"></dees-icon>
122423
122596
  Delete
122424
122597
  </dees-button>
122425
122598
  <dees-button type="outline">
122426
- <dees-icon iconFA="faDownload"></dees-icon>
122599
+ <dees-icon icon="lucide:Download"></dees-icon>
122427
122600
  Download
122428
122601
  </dees-button>
122429
122602
  </div>
122430
-
122603
+
122431
122604
  <div class="icon-row">
122432
122605
  <dees-button type="secondary" size="sm">
122433
- <dees-icon iconFA="faCog"></dees-icon>
122606
+ <dees-icon icon="fa:gear"></dees-icon>
122434
122607
  Settings
122435
122608
  </dees-button>
122436
122609
  <dees-button type="ghost">
122437
- <dees-icon iconFA="faChevronLeft"></dees-icon>
122610
+ <dees-icon icon="fa:caretLeft"></dees-icon>
122438
122611
  Back
122439
122612
  </dees-button>
122440
122613
  <dees-button type="ghost">
122441
122614
  Next
122442
- <dees-icon iconFA="faChevronRight"></dees-icon>
122615
+ <dees-icon icon="fa:caretRight"></dees-icon>
122443
122616
  </dees-button>
122444
122617
  </div>
122445
-
122618
+
122446
122619
  <div class="icon-row">
122447
122620
  <dees-button size="icon" type="default">
122448
- <dees-icon iconFA="faPlus"></dees-icon>
122621
+ <dees-icon icon="fa:plus"></dees-icon>
122449
122622
  </dees-button>
122450
122623
  <dees-button size="icon" type="secondary">
122451
- <dees-icon iconFA="faCog"></dees-icon>
122624
+ <dees-icon icon="fa:gear"></dees-icon>
122452
122625
  </dees-button>
122453
122626
  <dees-button size="icon" type="outline">
122454
- <dees-icon iconFA="faSearch"></dees-icon>
122627
+ <dees-icon icon="lucide:Search"></dees-icon>
122455
122628
  </dees-button>
122456
122629
  <dees-button size="icon" type="ghost">
122457
- <dees-icon iconFA="faEllipsisV"></dees-icon>
122630
+ <dees-icon icon="lucide:MoreVertical"></dees-icon>
122458
122631
  </dees-button>
122459
122632
  <dees-button size="icon" type="destructive">
122460
- <dees-icon iconFA="faTrash"></dees-icon>
122633
+ <dees-icon icon="fa:trash"></dees-icon>
122461
122634
  </dees-button>
122462
122635
  </div>
122463
122636
  </dees-panel>
122464
122637
  </dees-demowrapper>
122465
-
122638
+
122639
+ <dees-demowrapper .runAfterRender=${async (elementArg) => {
122640
+ const buttons = elementArg.querySelectorAll("dees-button");
122641
+ buttons.forEach((button) => {
122642
+ button.addEventListener("clicked", () => {
122643
+ const icon3 = button.getAttribute("icon") || "none";
122644
+ const position3 = button.getAttribute("iconPosition") || "left";
122645
+ console.log(`Icon property button: icon=${icon3}, position=${position3}`);
122646
+ });
122647
+ });
122648
+ }}>
122649
+ <dees-panel .title=${"4. Icons via Property"} .subtitle=${"Simplified icon syntax using the icon property"}>
122650
+ <div class="icon-row">
122651
+ <dees-button icon="fa:plus">Add Item</dees-button>
122652
+ <dees-button type="destructive" icon="fa:trash">Delete</dees-button>
122653
+ <dees-button type="outline" icon="lucide:Download">Download</dees-button>
122654
+ </div>
122655
+
122656
+ <div class="icon-row">
122657
+ <dees-button type="secondary" size="sm" icon="fa:gear">Settings</dees-button>
122658
+ <dees-button type="ghost" icon="fa:caretLeft">Back</dees-button>
122659
+ <dees-button type="ghost" icon="fa:caretRight" iconPosition="right">Next</dees-button>
122660
+ </div>
122661
+
122662
+ <div class="icon-row">
122663
+ <dees-button size="icon" type="default" icon="fa:plus"></dees-button>
122664
+ <dees-button size="icon" type="secondary" icon="lucide:Settings"></dees-button>
122665
+ <dees-button size="icon" type="outline" icon="lucide:Search"></dees-button>
122666
+ <dees-button size="icon" type="ghost" icon="lucide:MoreVertical"></dees-button>
122667
+ <dees-button size="icon" type="destructive" icon="fa:trash"></dees-button>
122668
+ </div>
122669
+
122670
+ <div style="margin-top: 16px;">
122671
+ <div class="code-snippet">
122672
+ &lt;dees-button icon="fa:plus"&gt;Add Item&lt;/dees-button&gt;<br>
122673
+ &lt;dees-button icon="fa:caretRight" iconPosition="right"&gt;Next&lt;/dees-button&gt;
122674
+ </div>
122675
+ </div>
122676
+ </dees-panel>
122677
+ </dees-demowrapper>
122678
+
122466
122679
  <dees-demowrapper .runAfterRender=${async (elementArg) => {
122467
122680
  const pendingButton = elementArg.querySelector('dees-button[status="pending"]');
122468
122681
  const successButton = elementArg.querySelector('dees-button[status="success"]');
@@ -122483,7 +122696,7 @@ var demoFunc26 = () => b2`
122483
122696
  });
122484
122697
  }
122485
122698
  }}>
122486
- <dees-panel .title=${"4. Button States"} .subtitle=${"Different states to indicate button status and loading conditions"}>
122699
+ <dees-panel .title=${"5. Button States"} .subtitle=${"Different states to indicate button status and loading conditions"}>
122487
122700
  <div class="button-group">
122488
122701
  <dees-button status="normal">Normal</dees-button>
122489
122702
  <dees-button status="pending">Processing...</dees-button>
@@ -122523,7 +122736,7 @@ var demoFunc26 = () => b2`
122523
122736
  });
122524
122737
  }
122525
122738
  }}>
122526
- <dees-panel .title=${"5. Event Handling"} .subtitle=${"Interactive examples with click event handling"}>
122739
+ <dees-panel .title=${"6. Event Handling"} .subtitle=${"Interactive examples with click event handling"}>
122527
122740
  <div class="button-group">
122528
122741
  <dees-button>Click Me</dees-button>
122529
122742
  <dees-button type="secondary" .eventDetailData=${"custom-data-123"}>
@@ -122559,7 +122772,7 @@ var demoFunc26 = () => b2`
122559
122772
  });
122560
122773
  }
122561
122774
  }}>
122562
- <dees-panel .title=${"6. Form Integration"} .subtitle=${"Buttons working within forms with automatic spacing"}>
122775
+ <dees-panel .title=${"7. Form Integration"} .subtitle=${"Buttons working within forms with automatic spacing"}>
122563
122776
  <dees-form>
122564
122777
  <dees-input-text label="Name" key="name" required></dees-input-text>
122565
122778
  <dees-input-text label="Email" key="email" type="email" required></dees-input-text>
@@ -122585,7 +122798,7 @@ var demoFunc26 = () => b2`
122585
122798
  }
122586
122799
  });
122587
122800
  }}>
122588
- <dees-panel .title=${"7. Backward Compatibility"} .subtitle=${"Old button types are automatically mapped to new variants"}>
122801
+ <dees-panel .title=${"8. Backward Compatibility"} .subtitle=${"Old button types are automatically mapped to new variants"}>
122589
122802
  <div class="button-group">
122590
122803
  <dees-button type="normal">Normal → Default</dees-button>
122591
122804
  <dees-button type="highlighted">Highlighted → Destructive</dees-button>
@@ -122623,36 +122836,36 @@ var demoFunc26 = () => b2`
122623
122836
  });
122624
122837
  }
122625
122838
  }}>
122626
- <dees-panel .title=${"8. Advanced Examples"} .subtitle=${"Complex button configurations and real-world use cases"}>
122839
+ <dees-panel .title=${"9. Advanced Examples"} .subtitle=${"Complex button configurations and real-world use cases"}>
122627
122840
  <div class="horizontal-group">
122628
122841
  <div class="vertical-group">
122629
122842
  <h4 style="margin: 0 0 8px 0; font-size: 14px; font-weight: 500;">Action Group</h4>
122630
122843
  <dees-button type="default" size="sm">
122631
- <dees-icon iconFA="faSave"></dees-icon>
122844
+ <dees-icon icon="lucide:Save"></dees-icon>
122632
122845
  Save Changes
122633
122846
  </dees-button>
122634
122847
  <dees-button type="secondary" size="sm">
122635
- <dees-icon iconFA="faUndo"></dees-icon>
122848
+ <dees-icon icon="lucide:Undo2"></dees-icon>
122636
122849
  Discard
122637
122850
  </dees-button>
122638
122851
  <dees-button type="ghost" size="sm">
122639
- <dees-icon iconFA="faQuestionCircle"></dees-icon>
122852
+ <dees-icon icon="lucide:HelpCircle"></dees-icon>
122640
122853
  Help
122641
122854
  </dees-button>
122642
122855
  </div>
122643
-
122856
+
122644
122857
  <div class="vertical-group">
122645
122858
  <h4 style="margin: 0 0 8px 0; font-size: 14px; font-weight: 500;">Danger Zone</h4>
122646
122859
  <dees-button type="destructive" size="sm">
122647
- <dees-icon iconFA="faTrash"></dees-icon>
122860
+ <dees-icon icon="fa:trash"></dees-icon>
122648
122861
  Delete Account
122649
122862
  </dees-button>
122650
122863
  <dees-button type="outline" size="sm">
122651
- <dees-icon iconFA="faArchive"></dees-icon>
122864
+ <dees-icon icon="lucide:Archive"></dees-icon>
122652
122865
  Archive Data
122653
122866
  </dees-button>
122654
122867
  <dees-button type="ghost" size="sm" disabled>
122655
- <dees-icon iconFA="faBan"></dees-icon>
122868
+ <dees-icon icon="lucide:Ban"></dees-icon>
122656
122869
  Not Available
122657
122870
  </dees-button>
122658
122871
  </div>
@@ -122661,8 +122874,7 @@ var demoFunc26 = () => b2`
122661
122874
  <div style="margin-top: 24px;">
122662
122875
  <h4 style="margin: 0 0 8px 0; font-size: 14px; font-weight: 500;">Code Example:</h4>
122663
122876
  <div class="code-snippet">
122664
- &lt;dees-button type="default" size="sm" @clicked="\${handleClick}"&gt;<br>
122665
- &nbsp;&nbsp;&lt;dees-icon iconFA="faSave"&gt;&lt;/dees-icon&gt;<br>
122877
+ &lt;dees-button type="default" size="sm" icon="lucide:Save" @clicked="\${handleClick}"&gt;<br>
122666
122878
  &nbsp;&nbsp;Save Changes<br>
122667
122879
  &lt;/dees-button&gt;
122668
122880
  </div>
@@ -122676,7 +122888,7 @@ var demoFunc26 = () => b2`
122676
122888
  init_dist_ts26();
122677
122889
  init_dist_ts25();
122678
122890
  init_theme();
122679
- var _insideForm_dec, _status_dec2, _size_dec2, _type_dec3, _isHidden_dec, _disabled_dec4, _eventDetailData_dec, _text_dec2, _a33, _DeesButton_decorators, _init31, _text2, _eventDetailData, _disabled4, _isHidden, _type3, _size2, _status2, _insideForm;
122891
+ var _iconPosition_dec, _icon_dec2, _insideForm_dec, _status_dec2, _size_dec2, _type_dec3, _isHidden_dec, _disabled_dec4, _eventDetailData_dec, _text_dec2, _a33, _DeesButton_decorators, _init31, _text2, _eventDetailData, _disabled4, _isHidden, _type3, _size2, _status2, _insideForm, _icon2, _iconPosition;
122680
122892
  _DeesButton_decorators = [t4("dees-button")];
122681
122893
  var DeesButton = class extends (_a33 = DeesElement, _text_dec2 = [n5({
122682
122894
  reflect: true,
@@ -122697,7 +122909,7 @@ var DeesButton = class extends (_a33 = DeesElement, _text_dec2 = [n5({
122697
122909
  })], _insideForm_dec = [n5({
122698
122910
  type: Boolean,
122699
122911
  reflect: true
122700
- })], _a33) {
122912
+ })], _icon_dec2 = [n5({ type: String, reflect: true })], _iconPosition_dec = [n5({ type: String, reflect: true })], _a33) {
122701
122913
  constructor() {
122702
122914
  super();
122703
122915
  __privateAdd(this, _text2, __runInitializers(_init31, 8, this)), __runInitializers(_init31, 11, this);
@@ -122708,6 +122920,8 @@ var DeesButton = class extends (_a33 = DeesElement, _text_dec2 = [n5({
122708
122920
  __privateAdd(this, _size2, __runInitializers(_init31, 28, this, "default")), __runInitializers(_init31, 31, this);
122709
122921
  __privateAdd(this, _status2, __runInitializers(_init31, 32, this, "normal")), __runInitializers(_init31, 35, this);
122710
122922
  __privateAdd(this, _insideForm, __runInitializers(_init31, 36, this, false)), __runInitializers(_init31, 39, this);
122923
+ __privateAdd(this, _icon2, __runInitializers(_init31, 40, this)), __runInitializers(_init31, 43, this);
122924
+ __privateAdd(this, _iconPosition, __runInitializers(_init31, 44, this, "left")), __runInitializers(_init31, 47, this);
122711
122925
  }
122712
122926
  async connectedCallback() {
122713
122927
  await super.connectedCallback();
@@ -122715,6 +122929,33 @@ var DeesButton = class extends (_a33 = DeesElement, _text_dec2 = [n5({
122715
122929
  this.insideForm = true;
122716
122930
  }
122717
122931
  }
122932
+ /**
122933
+ * Extracts icon and text from light DOM and sets properties
122934
+ */
122935
+ extractLightDom() {
122936
+ const iconElement = this.querySelector("dees-icon");
122937
+ const textContent = Array.from(this.childNodes).filter((node2) => node2.nodeType === Node.TEXT_NODE).map((node2) => node2.textContent?.trim()).filter(Boolean).join(" ");
122938
+ if (textContent && !this.text) {
122939
+ this.text = textContent;
122940
+ }
122941
+ if (iconElement) {
122942
+ const iconValue = iconElement.icon || iconElement.getAttribute("icon") || (iconElement.iconFA ? `fa:${iconElement.iconFA}` : null);
122943
+ if (iconValue) {
122944
+ const children2 = Array.from(this.childNodes);
122945
+ const iconIndex = children2.indexOf(iconElement);
122946
+ const textNodes = children2.filter(
122947
+ (node2) => node2.nodeType === Node.TEXT_NODE && node2.textContent?.trim()
122948
+ );
122949
+ if (textNodes.length > 0) {
122950
+ const firstTextIndex = children2.indexOf(textNodes[0]);
122951
+ this.iconPosition = iconIndex < firstTextIndex ? "left" : "right";
122952
+ }
122953
+ this.icon = iconValue;
122954
+ }
122955
+ iconElement.remove();
122956
+ }
122957
+ this.innerHTML = "";
122958
+ }
122718
122959
  render() {
122719
122960
  const typeMap = {
122720
122961
  "normal": "default",
@@ -122725,19 +122966,24 @@ var DeesButton = class extends (_a33 = DeesElement, _text_dec2 = [n5({
122725
122966
  };
122726
122967
  const actualType = typeMap[this.type] || this.type;
122727
122968
  const actualSize = this.type === "big" ? "lg" : this.size;
122969
+ const leftIcon = this.iconPosition === "left" && this.icon ? b2`<dees-icon .icon=${this.icon}></dees-icon>` : "";
122970
+ const rightIcon = this.iconPosition === "right" && this.icon ? b2`<dees-icon .icon=${this.icon}></dees-icon>` : "";
122971
+ const isIconOnly = actualSize === "icon" && this.icon;
122728
122972
  return b2`
122729
122973
  <div
122730
122974
  class="button ${this.isHidden ? "hidden" : ""} ${actualType} size-${actualSize} ${this.status} ${this.disabled ? "disabled" : ""}"
122731
122975
  @click="${this.dispatchClick}"
122732
122976
  >
122733
122977
  ${this.status === "normal" ? b2`` : b2`
122734
- <dees-spinner
122735
- .bnw=${true}
122978
+ <dees-spinner
122979
+ .bnw=${true}
122736
122980
  status="${this.status}"
122737
122981
  size="${actualSize === "sm" ? 14 : actualSize === "lg" ? 18 : 16}"
122738
122982
  ></dees-spinner>
122739
122983
  `}
122740
- <div class="textbox">${this.text || b2`<slot>Button</slot>`}</div>
122984
+ ${leftIcon}
122985
+ ${isIconOnly ? "" : b2`<div class="textbox">${this.text || "Button"}</div>`}
122986
+ ${rightIcon}
122741
122987
  </div>
122742
122988
  `;
122743
122989
  }
@@ -122755,6 +123001,7 @@ var DeesButton = class extends (_a33 = DeesElement, _text_dec2 = [n5({
122755
123001
  );
122756
123002
  }
122757
123003
  async firstUpdated() {
123004
+ this.extractLightDom();
122758
123005
  }
122759
123006
  };
122760
123007
  _init31 = __decoratorStart(_a33);
@@ -122766,6 +123013,8 @@ _type3 = new WeakMap();
122766
123013
  _size2 = new WeakMap();
122767
123014
  _status2 = new WeakMap();
122768
123015
  _insideForm = new WeakMap();
123016
+ _icon2 = new WeakMap();
123017
+ _iconPosition = new WeakMap();
122769
123018
  __decorateElement(_init31, 4, "text", _text_dec2, DeesButton, _text2);
122770
123019
  __decorateElement(_init31, 4, "eventDetailData", _eventDetailData_dec, DeesButton, _eventDetailData);
122771
123020
  __decorateElement(_init31, 4, "disabled", _disabled_dec4, DeesButton, _disabled4);
@@ -122774,6 +123023,8 @@ __decorateElement(_init31, 4, "type", _type_dec3, DeesButton, _type3);
122774
123023
  __decorateElement(_init31, 4, "size", _size_dec2, DeesButton, _size2);
122775
123024
  __decorateElement(_init31, 4, "status", _status_dec2, DeesButton, _status2);
122776
123025
  __decorateElement(_init31, 4, "insideForm", _insideForm_dec, DeesButton, _insideForm);
123026
+ __decorateElement(_init31, 4, "icon", _icon_dec2, DeesButton, _icon2);
123027
+ __decorateElement(_init31, 4, "iconPosition", _iconPosition_dec, DeesButton, _iconPosition);
122777
123028
  DeesButton = __decorateElement(_init31, 0, "DeesButton", _DeesButton_decorators, DeesButton);
122778
123029
  __publicField(DeesButton, "demo", demoFunc26);
122779
123030
  __publicField(DeesButton, "demoGroup", "Button");
@@ -123037,6 +123288,12 @@ __publicField(DeesButton, "styles", [
123037
123288
  height: 18px;
123038
123289
  }
123039
123290
 
123291
+ /* Text alignment */
123292
+ .textbox {
123293
+ display: flex;
123294
+ align-items: center;
123295
+ }
123296
+
123040
123297
  `
123041
123298
  ]);
123042
123299
  __runInitializers(_init31, 1, DeesButton);
@@ -123139,6 +123396,10 @@ var DeesStatsGrid = class extends (_a34 = DeesElement, _tiles_dec = [n5({ type:
123139
123396
  return this.renderMultiPercentage(tile);
123140
123397
  case "cpuCores":
123141
123398
  return this.renderCpuCores(tile);
123399
+ case "partition":
123400
+ return this.renderPartition(tile);
123401
+ case "disk":
123402
+ return this.renderDisk(tile);
123142
123403
  case "text":
123143
123404
  return b2`
123144
123405
  <div class="text-value" style="${tile.color ? `color: ${tile.color}` : ""}">
@@ -123324,6 +123585,103 @@ var DeesStatsGrid = class extends (_a34 = DeesElement, _tiles_dec = [n5({ type:
123324
123585
  </div>
123325
123586
  `;
123326
123587
  }
123588
+ formatBytes(bytes) {
123589
+ if (bytes === 0) return "0 B";
123590
+ const k4 = 1024;
123591
+ const sizes = ["B", "KB", "MB", "GB", "TB", "PB"];
123592
+ const i11 = Math.floor(Math.log(bytes) / Math.log(k4));
123593
+ return parseFloat((bytes / Math.pow(k4, i11)).toFixed(1)) + " " + sizes[i11];
123594
+ }
123595
+ renderPartition(tile) {
123596
+ if (!tile.partitionData) {
123597
+ return b2`<div class="tile-value">${tile.value}</div>`;
123598
+ }
123599
+ const { used, total, filesystem, mountPoint } = tile.partitionData;
123600
+ const percentage = Math.min(100, Math.max(0, used / total * 100));
123601
+ const free = total - used;
123602
+ const getColorClass = () => {
123603
+ if (percentage >= 90) return "critical";
123604
+ if (percentage >= 75) return "warning";
123605
+ return "";
123606
+ };
123607
+ return b2`
123608
+ <div class="partition-wrapper">
123609
+ <div class="partition-header">
123610
+ <span class="partition-percentage">${Math.round(percentage)}%</span>
123611
+ </div>
123612
+ <div class="partition-bar">
123613
+ <div
123614
+ class="partition-bar-fill ${getColorClass()}"
123615
+ style="width: ${percentage}%"
123616
+ ></div>
123617
+ </div>
123618
+ <div class="partition-stats">
123619
+ <div class="partition-stat">
123620
+ <span class="partition-stat-label">Used</span>
123621
+ <span class="partition-stat-value">${this.formatBytes(used)}</span>
123622
+ </div>
123623
+ <div class="partition-stat">
123624
+ <span class="partition-stat-label">Free</span>
123625
+ <span class="partition-stat-value">${this.formatBytes(free)}</span>
123626
+ </div>
123627
+ </div>
123628
+ <div class="partition-meta">
123629
+ <span class="partition-filesystem">${filesystem}</span>
123630
+ ${mountPoint ? b2`<span class="partition-mountpoint">${mountPoint}</span>` : ""}
123631
+ </div>
123632
+ </div>
123633
+ `;
123634
+ }
123635
+ renderDisk(tile) {
123636
+ if (!tile.diskData) {
123637
+ return b2`<div class="tile-value">${tile.value}</div>`;
123638
+ }
123639
+ const { capacity, model, type: type5, iops, health } = tile.diskData;
123640
+ const getHealthClass = (value2) => {
123641
+ if (value2 >= 70) return "good";
123642
+ if (value2 >= 30) return "warning";
123643
+ return "critical";
123644
+ };
123645
+ return b2`
123646
+ <div class="disk-wrapper">
123647
+ <div class="disk-capacity">${this.formatBytes(capacity)}</div>
123648
+ ${model || type5 ? b2`
123649
+ <div class="disk-model">
123650
+ ${model ? b2`<span>${model}</span>` : ""}
123651
+ ${type5 ? b2`<span class="disk-type-badge">${type5}</span>` : ""}
123652
+ </div>
123653
+ ` : ""}
123654
+ <div class="disk-metrics">
123655
+ ${iops ? b2`
123656
+ <div class="disk-iops">
123657
+ <div class="disk-iops-item">
123658
+ <span class="disk-iops-label">Read</span>
123659
+ <span class="disk-iops-value">${iops.read.toLocaleString()}</span>
123660
+ </div>
123661
+ <div class="disk-iops-item">
123662
+ <span class="disk-iops-label">Write</span>
123663
+ <span class="disk-iops-value">${iops.write.toLocaleString()}</span>
123664
+ </div>
123665
+ </div>
123666
+ ` : ""}
123667
+ ${health !== void 0 ? b2`
123668
+ <div class="disk-health">
123669
+ <div class="disk-health-header">
123670
+ <span class="disk-health-label">Health</span>
123671
+ <span class="disk-health-value">${health}%</span>
123672
+ </div>
123673
+ <div class="disk-health-bar">
123674
+ <div
123675
+ class="disk-health-fill ${getHealthClass(health)}"
123676
+ style="width: ${health}%"
123677
+ ></div>
123678
+ </div>
123679
+ </div>
123680
+ ` : ""}
123681
+ </div>
123682
+ </div>
123683
+ `;
123684
+ }
123327
123685
  async handleGridAction(action) {
123328
123686
  if (action.action) {
123329
123687
  await action.action();
@@ -123757,6 +124115,219 @@ __publicField(DeesStatsGrid, "styles", [
123757
124115
  max-width: 100%;
123758
124116
  }
123759
124117
 
124118
+ /* Partition Styles */
124119
+ .partition-wrapper {
124120
+ width: 100%;
124121
+ display: flex;
124122
+ flex-direction: column;
124123
+ flex: 1;
124124
+ gap: 8px;
124125
+ }
124126
+
124127
+ .partition-header {
124128
+ display: flex;
124129
+ align-items: baseline;
124130
+ gap: 8px;
124131
+ }
124132
+
124133
+ .partition-percentage {
124134
+ font-size: var(--value-font-size);
124135
+ font-weight: 600;
124136
+ color: ${cssManager.bdTheme("hsl(215.3 25% 8.8%)", "hsl(210 40% 98%)")};
124137
+ line-height: 1.1;
124138
+ letter-spacing: -0.025em;
124139
+ }
124140
+
124141
+ .partition-bar {
124142
+ width: 100%;
124143
+ height: 6px;
124144
+ background: ${cssManager.bdTheme("#e8e8e8", "#1a1a1a")};
124145
+ border-radius: 3px;
124146
+ overflow: hidden;
124147
+ }
124148
+
124149
+ .partition-bar-fill {
124150
+ height: 100%;
124151
+ background: ${cssManager.bdTheme("#333333", "#e0e0e0")};
124152
+ transition: width 0.6s cubic-bezier(0.4, 0, 0.2, 1);
124153
+ border-radius: 3px;
124154
+ }
124155
+
124156
+ .partition-bar-fill.warning {
124157
+ background: ${cssManager.bdTheme("hsl(45.4 93.4% 47.5%)", "hsl(45.4 93.4% 47.5%)")};
124158
+ }
124159
+
124160
+ .partition-bar-fill.critical {
124161
+ background: ${cssManager.bdTheme("hsl(0 84.2% 60.2%)", "hsl(0 84.2% 60.2%)")};
124162
+ }
124163
+
124164
+ .partition-stats {
124165
+ display: flex;
124166
+ justify-content: space-between;
124167
+ align-items: center;
124168
+ margin-top: auto;
124169
+ }
124170
+
124171
+ .partition-stat {
124172
+ display: flex;
124173
+ flex-direction: column;
124174
+ gap: 2px;
124175
+ }
124176
+
124177
+ .partition-stat-label {
124178
+ font-size: 10px;
124179
+ font-weight: 500;
124180
+ color: ${cssManager.bdTheme("hsl(215.4 16.3% 56.9%)", "hsl(215 20.2% 55.1%)")};
124181
+ text-transform: uppercase;
124182
+ letter-spacing: 0.02em;
124183
+ }
124184
+
124185
+ .partition-stat-value {
124186
+ font-size: 13px;
124187
+ font-weight: 600;
124188
+ color: ${cssManager.bdTheme("hsl(215.3 25% 8.8%)", "hsl(210 40% 98%)")};
124189
+ letter-spacing: -0.01em;
124190
+ }
124191
+
124192
+ .partition-meta {
124193
+ display: flex;
124194
+ align-items: center;
124195
+ gap: 6px;
124196
+ margin-top: 4px;
124197
+ }
124198
+
124199
+ .partition-filesystem {
124200
+ font-size: 11px;
124201
+ font-weight: 500;
124202
+ color: ${cssManager.bdTheme("hsl(215.4 16.3% 46.9%)", "hsl(215 20.2% 65.1%)")};
124203
+ background: ${cssManager.bdTheme("hsl(210 40% 96.1%)", "hsl(215 20.2% 16.8%)")};
124204
+ padding: 2px 6px;
124205
+ border-radius: 3px;
124206
+ }
124207
+
124208
+ .partition-mountpoint {
124209
+ font-size: 11px;
124210
+ color: ${cssManager.bdTheme("hsl(215.4 16.3% 56.9%)", "hsl(215 20.2% 55.1%)")};
124211
+ }
124212
+
124213
+ /* Disk Styles */
124214
+ .disk-wrapper {
124215
+ width: 100%;
124216
+ display: flex;
124217
+ flex-direction: column;
124218
+ flex: 1;
124219
+ gap: 8px;
124220
+ }
124221
+
124222
+ .disk-capacity {
124223
+ font-size: var(--value-font-size);
124224
+ font-weight: 600;
124225
+ color: ${cssManager.bdTheme("hsl(215.3 25% 8.8%)", "hsl(210 40% 98%)")};
124226
+ line-height: 1.1;
124227
+ letter-spacing: -0.025em;
124228
+ }
124229
+
124230
+ .disk-model {
124231
+ font-size: 12px;
124232
+ color: ${cssManager.bdTheme("hsl(215.4 16.3% 46.9%)", "hsl(215 20.2% 65.1%)")};
124233
+ display: flex;
124234
+ align-items: center;
124235
+ gap: 6px;
124236
+ }
124237
+
124238
+ .disk-type-badge {
124239
+ font-size: 10px;
124240
+ font-weight: 600;
124241
+ text-transform: uppercase;
124242
+ color: ${cssManager.bdTheme("hsl(215.4 16.3% 46.9%)", "hsl(215 20.2% 65.1%)")};
124243
+ background: ${cssManager.bdTheme("hsl(210 40% 96.1%)", "hsl(215 20.2% 16.8%)")};
124244
+ padding: 2px 6px;
124245
+ border-radius: 3px;
124246
+ }
124247
+
124248
+ .disk-metrics {
124249
+ display: flex;
124250
+ flex-direction: column;
124251
+ gap: 8px;
124252
+ margin-top: auto;
124253
+ }
124254
+
124255
+ .disk-iops {
124256
+ display: flex;
124257
+ align-items: center;
124258
+ gap: 12px;
124259
+ }
124260
+
124261
+ .disk-iops-item {
124262
+ display: flex;
124263
+ align-items: baseline;
124264
+ gap: 4px;
124265
+ }
124266
+
124267
+ .disk-iops-label {
124268
+ font-size: 10px;
124269
+ font-weight: 500;
124270
+ color: ${cssManager.bdTheme("hsl(215.4 16.3% 56.9%)", "hsl(215 20.2% 55.1%)")};
124271
+ text-transform: uppercase;
124272
+ }
124273
+
124274
+ .disk-iops-value {
124275
+ font-size: 13px;
124276
+ font-weight: 600;
124277
+ color: ${cssManager.bdTheme("hsl(215.3 25% 8.8%)", "hsl(210 40% 98%)")};
124278
+ }
124279
+
124280
+ .disk-health {
124281
+ display: flex;
124282
+ flex-direction: column;
124283
+ gap: 4px;
124284
+ }
124285
+
124286
+ .disk-health-header {
124287
+ display: flex;
124288
+ justify-content: space-between;
124289
+ align-items: baseline;
124290
+ }
124291
+
124292
+ .disk-health-label {
124293
+ font-size: 10px;
124294
+ font-weight: 500;
124295
+ color: ${cssManager.bdTheme("hsl(215.4 16.3% 56.9%)", "hsl(215 20.2% 55.1%)")};
124296
+ text-transform: uppercase;
124297
+ }
124298
+
124299
+ .disk-health-value {
124300
+ font-size: 12px;
124301
+ font-weight: 600;
124302
+ color: ${cssManager.bdTheme("hsl(215.3 25% 8.8%)", "hsl(210 40% 98%)")};
124303
+ }
124304
+
124305
+ .disk-health-bar {
124306
+ width: 100%;
124307
+ height: 4px;
124308
+ background: ${cssManager.bdTheme("#e8e8e8", "#1a1a1a")};
124309
+ border-radius: 2px;
124310
+ overflow: hidden;
124311
+ }
124312
+
124313
+ .disk-health-fill {
124314
+ height: 100%;
124315
+ transition: width 0.6s cubic-bezier(0.4, 0, 0.2, 1);
124316
+ border-radius: 2px;
124317
+ }
124318
+
124319
+ .disk-health-fill.good {
124320
+ background: ${cssManager.bdTheme("hsl(142.1 76.2% 36.3%)", "hsl(142.1 70.6% 45.3%)")};
124321
+ }
124322
+
124323
+ .disk-health-fill.warning {
124324
+ background: ${cssManager.bdTheme("hsl(45.4 93.4% 47.5%)", "hsl(45.4 93.4% 47.5%)")};
124325
+ }
124326
+
124327
+ .disk-health-fill.critical {
124328
+ background: ${cssManager.bdTheme("hsl(0 84.2% 60.2%)", "hsl(0 84.2% 60.2%)")};
124329
+ }
124330
+
123760
124331
  /* Trend Styles */
123761
124332
  .trend-container {
123762
124333
  width: 100%;
@@ -129853,8 +130424,10 @@ init_dist_ts26();
129853
130424
  var demoFunc33 = () => {
129854
130425
  return b2`
129855
130426
  <dees-demowrapper .runAfterRender=${async (elementArg) => {
129856
- const logElement = elementArg.querySelector("dees-chart-log");
129857
- let intervalId;
130427
+ const structuredLog = elementArg.querySelector("#structured-log");
130428
+ const rawLog = elementArg.querySelector("#raw-log");
130429
+ let structuredIntervalId;
130430
+ let rawIntervalId;
129858
130431
  const serverSources = ["Server", "Database", "API", "Auth", "Cache", "Queue", "WebSocket", "Scheduler"];
129859
130432
  const logTemplates = {
129860
130433
  debug: [
@@ -129893,6 +130466,20 @@ var demoFunc33 = () => {
129893
130466
  "Health check passed: all systems operational"
129894
130467
  ]
129895
130468
  };
130469
+ const dockerLogTemplates = [
130470
+ "\x1B[90m2024-01-15T10:23:45.123Z\x1B[0m \x1B[36mINFO\x1B[0m [nginx] GET /api/health 200 - 2ms",
130471
+ "\x1B[90m2024-01-15T10:23:45.456Z\x1B[0m \x1B[33mWARN\x1B[0m [redis] Connection pool running low: 3/10",
130472
+ "\x1B[90m2024-01-15T10:23:45.789Z\x1B[0m \x1B[31mERROR\x1B[0m [mongodb] Query timeout after 30000ms",
130473
+ "\x1B[90m2024-01-15T10:23:46.012Z\x1B[0m \x1B[36mINFO\x1B[0m [app] Processing batch job #{{jobId}}",
130474
+ "\x1B[90m2024-01-15T10:23:46.345Z\x1B[0m \x1B[32mOK\x1B[0m [health] All services healthy",
130475
+ "\x1B[90m2024-01-15T10:23:46.678Z\x1B[0m \x1B[36mINFO\x1B[0m [kafka] Message consumed from topic: events",
130476
+ "\x1B[90m2024-01-15T10:23:47.001Z\x1B[0m \x1B[35mDEBUG\x1B[0m [grpc] Request received: GetUser(id={{userId}})",
130477
+ "\x1B[90m2024-01-15T10:23:47.234Z\x1B[0m \x1B[31mERROR\x1B[0m [auth] Token validation failed: expired",
130478
+ "\x1B[90m2024-01-15T10:23:47.567Z\x1B[0m \x1B[33mWARN\x1B[0m [rate-limit] IP {{ip}} approaching rate limit",
130479
+ "\x1B[90m2024-01-15T10:23:47.890Z\x1B[0m \x1B[36mINFO\x1B[0m [websocket] Client connected: session={{session}}",
130480
+ // Multi-line log entry like stack traces
130481
+ "\x1B[31mError: Connection refused\x1B[0m\n at TcpConnection.connect (/app/node_modules/pg/lib/connection.js:12:15)\n at Pool.connect (/app/node_modules/pg/lib/pool.js:45:23)\n at async DatabaseService.query (/app/src/db/service.ts:89:12)"
130482
+ ];
129896
130483
  const generateRandomLog = () => {
129897
130484
  const levels = ["debug", "info", "warn", "error", "success"];
129898
130485
  const weights = [0.2, 0.5, 0.15, 0.1, 0.05];
@@ -129910,15 +130497,21 @@ var demoFunc33 = () => {
129910
130497
  const templates = logTemplates[level];
129911
130498
  const template = templates[Math.floor(Math.random() * templates.length)];
129912
130499
  const message2 = template.replace("{{module}}", ["express", "mongoose", "redis", "socket.io"][Math.floor(Math.random() * 4)]).replace("{{key}}", "user:" + Math.floor(Math.random() * 1e3)).replace("{{time}}", String(Math.floor(Math.random() * 500) + 50)).replace("{{headers}}", "Content-Type: application/json, Authorization: Bearer ...").replace("{{var}}", ["NODE_ENV", "DATABASE_URL", "API_KEY", "PORT"][Math.floor(Math.random() * 4)]).replace("{{method}}", ["GET", "POST", "PUT", "DELETE"][Math.floor(Math.random() * 4)]).replace("{{path}}", ["/api/users", "/api/auth/login", "/api/products", "/health"][Math.floor(Math.random() * 4)]).replace("{{userId}}", String(Math.floor(Math.random() * 1e4))).replace("{{jobId}}", "job_" + Math.random().toString(36).substring(2, 11)).replace("{{task}}", ["cleanup", "backup", "report-generation", "cache-refresh"][Math.floor(Math.random() * 4)]).replace("{{ip}}", `192.168.1.${Math.floor(Math.random() * 255)}`).replace("{{query}}", "SELECT * FROM users WHERE ...").replace("{{percent}}", String(Math.floor(Math.random() * 30) + 70)).replace("{{endpoint}}", "/api/v1/legacy").replace("{{days}}", String(Math.floor(Math.random() * 30) + 1)).replace("{{error}}", ["ECONNREFUSED", "ETIMEDOUT", "ENOTFOUND"][Math.floor(Math.random() * 3)]).replace("{{user}}", "user_" + Math.floor(Math.random() * 1e3)).replace("{{service}}", ["Redis", "MongoDB", "ElasticSearch"][Math.floor(Math.random() * 3)]).replace("{{port}}", String(3e3 + Math.floor(Math.random() * 10))).replace("{{size}}", String(Math.floor(Math.random() * 500) + 100));
129913
- logElement.addLog(level, message2, source);
130500
+ structuredLog.addLog(level, message2, source);
129914
130501
  };
129915
- const startSimulation = () => {
129916
- if (!intervalId) {
130502
+ const generateDockerLog = () => {
130503
+ const template = dockerLogTemplates[Math.floor(Math.random() * dockerLogTemplates.length)];
130504
+ const now2 = (/* @__PURE__ */ new Date()).toISOString();
130505
+ const logLine = template.replace(/2024-01-15T10:23:\d{2}\.\d{3}Z/g, now2).replace("{{jobId}}", String(Math.floor(Math.random() * 1e4))).replace("{{userId}}", String(Math.floor(Math.random() * 1e4))).replace("{{ip}}", `192.168.1.${Math.floor(Math.random() * 255)}`).replace("{{session}}", Math.random().toString(36).substring(2, 11));
130506
+ rawLog.writelnRaw(logLine);
130507
+ };
130508
+ const startStructuredSimulation = () => {
130509
+ if (!structuredIntervalId) {
129917
130510
  const scheduleNext = () => {
129918
130511
  generateRandomLog();
129919
130512
  const nextDelay = Math.random() * 2e3 + 500;
129920
- intervalId = window.setTimeout(() => {
129921
- if (intervalId) {
130513
+ structuredIntervalId = window.setTimeout(() => {
130514
+ if (structuredIntervalId) {
129922
130515
  scheduleNext();
129923
130516
  }
129924
130517
  }, nextDelay);
@@ -129926,57 +130519,131 @@ var demoFunc33 = () => {
129926
130519
  scheduleNext();
129927
130520
  }
129928
130521
  };
129929
- const stopSimulation = () => {
129930
- if (intervalId) {
129931
- window.clearTimeout(intervalId);
129932
- intervalId = null;
130522
+ const stopStructuredSimulation = () => {
130523
+ if (structuredIntervalId) {
130524
+ window.clearTimeout(structuredIntervalId);
130525
+ structuredIntervalId = null;
130526
+ }
130527
+ };
130528
+ const startRawSimulation = () => {
130529
+ if (!rawIntervalId) {
130530
+ const scheduleNext = () => {
130531
+ generateDockerLog();
130532
+ const nextDelay = Math.random() * 1e3 + 200;
130533
+ rawIntervalId = window.setTimeout(() => {
130534
+ if (rawIntervalId) {
130535
+ scheduleNext();
130536
+ }
130537
+ }, nextDelay);
130538
+ };
130539
+ scheduleNext();
130540
+ }
130541
+ };
130542
+ const stopRawSimulation = () => {
130543
+ if (rawIntervalId) {
130544
+ window.clearTimeout(rawIntervalId);
130545
+ rawIntervalId = null;
129933
130546
  }
129934
130547
  };
129935
130548
  const buttons = elementArg.querySelectorAll("dees-button");
129936
130549
  buttons.forEach((button) => {
129937
130550
  const text9 = button.textContent?.trim();
129938
- if (text9 === "Add Single Log") {
129939
- button.addEventListener("click", () => generateRandomLog());
129940
- } else if (text9 === "Start Simulation") {
129941
- button.addEventListener("click", () => startSimulation());
129942
- } else if (text9 === "Stop Simulation") {
129943
- button.addEventListener("click", () => stopSimulation());
130551
+ switch (text9) {
130552
+ case "Add Structured Log":
130553
+ button.addEventListener("click", () => generateRandomLog());
130554
+ break;
130555
+ case "Start Structured":
130556
+ button.addEventListener("click", () => startStructuredSimulation());
130557
+ break;
130558
+ case "Stop Structured":
130559
+ button.addEventListener("click", () => stopStructuredSimulation());
130560
+ break;
130561
+ case "Add Docker Log":
130562
+ button.addEventListener("click", () => generateDockerLog());
130563
+ break;
130564
+ case "Start Docker":
130565
+ button.addEventListener("click", () => startRawSimulation());
130566
+ break;
130567
+ case "Stop Docker":
130568
+ button.addEventListener("click", () => stopRawSimulation());
130569
+ break;
129944
130570
  }
129945
130571
  });
129946
130572
  }}>
129947
130573
  <style>
129948
- .demoBox {
129949
- position: relative;
129950
- background: #000000;
129951
- height: 100%;
129952
- width: 100%;
129953
- padding: 40px;
129954
- box-sizing: border-box;
129955
- display: flex;
129956
- flex-direction: column;
129957
- gap: 20px;
129958
- }
129959
- .controls {
129960
- display: flex;
129961
- gap: 10px;
129962
- flex-wrap: wrap;
129963
- }
129964
- .info {
129965
- color: #888;
129966
- font-size: 12px;
129967
- font-family: 'Geist Sans', sans-serif;
129968
- }
129969
- </style>
130574
+ ${i`
130575
+ .demoBox {
130576
+ position: relative;
130577
+ background: ${cssManager.bdTheme("hsl(0 0% 95%)", "hsl(0 0% 5%)")};
130578
+ height: 100%;
130579
+ width: 100%;
130580
+ padding: 40px;
130581
+ box-sizing: border-box;
130582
+ display: flex;
130583
+ flex-direction: column;
130584
+ gap: 24px;
130585
+ }
130586
+ .section {
130587
+ display: flex;
130588
+ flex-direction: column;
130589
+ gap: 12px;
130590
+ }
130591
+ .section-title {
130592
+ color: ${cssManager.bdTheme("hsl(0 0% 9%)", "hsl(0 0% 95%)")};
130593
+ font-size: 14px;
130594
+ font-weight: 600;
130595
+ font-family: 'Geist Sans', sans-serif;
130596
+ }
130597
+ .section-description {
130598
+ color: ${cssManager.bdTheme("hsl(215.4 16.3% 46.9%)", "hsl(215 20.2% 65.1%)")};
130599
+ font-size: 12px;
130600
+ font-family: 'Geist Sans', sans-serif;
130601
+ }
130602
+ .controls {
130603
+ display: flex;
130604
+ gap: 10px;
130605
+ flex-wrap: wrap;
130606
+ }
130607
+ `}
130608
+ </style>
129970
130609
  <div class="demoBox">
129971
- <div class="controls">
129972
- <dees-button>Add Single Log</dees-button>
129973
- <dees-button>Start Simulation</dees-button>
129974
- <dees-button>Stop Simulation</dees-button>
130610
+ <!-- Structured Logs Section -->
130611
+ <div class="section">
130612
+ <div class="section-title">Structured Logs (ILogEntry)</div>
130613
+ <div class="section-description">
130614
+ Structured log entries with level, message, and source. Supports search and keyword highlighting.
130615
+ </div>
130616
+ <div class="controls">
130617
+ <dees-button>Add Structured Log</dees-button>
130618
+ <dees-button>Start Structured</dees-button>
130619
+ <dees-button>Stop Structured</dees-button>
130620
+ </div>
130621
+ <dees-chart-log
130622
+ id="structured-log"
130623
+ .label=${"Production Server Logs"}
130624
+ .highlightKeywords=${["error", "failed", "timeout"]}
130625
+ .showMetrics=${true}
130626
+ ></dees-chart-log>
130627
+ </div>
130628
+
130629
+ <!-- Raw Logs Section -->
130630
+ <div class="section">
130631
+ <div class="section-title">Raw Logs (Docker/Container Style)</div>
130632
+ <div class="section-description">
130633
+ Raw log output with ANSI escape sequences for real Docker/container logs.
130634
+ </div>
130635
+ <div class="controls">
130636
+ <dees-button>Add Docker Log</dees-button>
130637
+ <dees-button>Start Docker</dees-button>
130638
+ <dees-button>Stop Docker</dees-button>
130639
+ </div>
130640
+ <dees-chart-log
130641
+ id="raw-log"
130642
+ .label=${"Docker Container Logs"}
130643
+ .mode=${"raw"}
130644
+ .showMetrics=${false}
130645
+ ></dees-chart-log>
129975
130646
  </div>
129976
- <div class="info">Simulating realistic server logs with various levels and sources</div>
129977
- <dees-chart-log
129978
- .label=${"Production Server Logs"}
129979
- ></dees-chart-log>
129980
130647
  </div>
129981
130648
  </dees-demowrapper>
129982
130649
  `;
@@ -129986,16 +130653,37 @@ var demoFunc33 = () => {
129986
130653
  init_dist_ts26();
129987
130654
  init_dist_ts25();
129988
130655
  init_theme();
129989
- var _maxEntries_dec, _autoScroll_dec, _logEntries_dec, _label_dec6, _a45, _DeesChartLog_decorators, _init47, _label6, _logEntries, _autoScroll, _maxEntries;
130656
+ init_services();
130657
+ var _terminalReady_dec, _metrics_dec, _filterMode_dec, _searchQuery_dec2, _showMetrics_dec, _highlightKeywords_dec, _maxEntries_dec, _autoScroll_dec, _logEntries_dec, _mode_dec, _label_dec6, _a45, _DeesChartLog_decorators, _init47, _label6, _mode, _logEntries, _autoScroll, _maxEntries, _highlightKeywords, _showMetrics, _searchQuery2, _filterMode, _metrics, _terminalReady;
129990
130658
  _DeesChartLog_decorators = [t4("dees-chart-log")];
129991
- var DeesChartLog = class extends (_a45 = DeesElement, _label_dec6 = [n5()], _logEntries_dec = [n5({ type: Array })], _autoScroll_dec = [n5({ type: Boolean })], _maxEntries_dec = [n5({ type: Number })], _a45) {
130659
+ var DeesChartLog = class extends (_a45 = DeesElement, _label_dec6 = [n5()], _mode_dec = [n5({ type: String })], _logEntries_dec = [n5({ type: Array })], _autoScroll_dec = [n5({ type: Boolean })], _maxEntries_dec = [n5({ type: Number })], _highlightKeywords_dec = [n5({ type: Array })], _showMetrics_dec = [n5({ type: Boolean })], _searchQuery_dec2 = [r5()], _filterMode_dec = [r5()], _metrics_dec = [r5()], _terminalReady_dec = [r5()], _a45) {
129992
130660
  constructor() {
129993
130661
  super();
129994
130662
  __privateAdd(this, _label6, __runInitializers(_init47, 8, this, "Server Logs")), __runInitializers(_init47, 11, this);
129995
- __privateAdd(this, _logEntries, __runInitializers(_init47, 12, this, [])), __runInitializers(_init47, 15, this);
129996
- __privateAdd(this, _autoScroll, __runInitializers(_init47, 16, this, true)), __runInitializers(_init47, 19, this);
129997
- __privateAdd(this, _maxEntries, __runInitializers(_init47, 20, this, 1e3)), __runInitializers(_init47, 23, this);
129998
- __publicField(this, "logContainer");
130663
+ __privateAdd(this, _mode, __runInitializers(_init47, 12, this, "structured")), __runInitializers(_init47, 15, this);
130664
+ __privateAdd(this, _logEntries, __runInitializers(_init47, 16, this, [])), __runInitializers(_init47, 19, this);
130665
+ __privateAdd(this, _autoScroll, __runInitializers(_init47, 20, this, true)), __runInitializers(_init47, 23, this);
130666
+ __privateAdd(this, _maxEntries, __runInitializers(_init47, 24, this, 1e4)), __runInitializers(_init47, 27, this);
130667
+ __privateAdd(this, _highlightKeywords, __runInitializers(_init47, 28, this, [])), __runInitializers(_init47, 31, this);
130668
+ __privateAdd(this, _showMetrics, __runInitializers(_init47, 32, this, true)), __runInitializers(_init47, 35, this);
130669
+ __privateAdd(this, _searchQuery2, __runInitializers(_init47, 36, this, "")), __runInitializers(_init47, 39, this);
130670
+ __privateAdd(this, _filterMode, __runInitializers(_init47, 40, this, false)), __runInitializers(_init47, 43, this);
130671
+ __privateAdd(this, _metrics, __runInitializers(_init47, 44, this, { debug: 0, info: 0, warn: 0, error: 0, success: 0, total: 0, rate: 0 })), __runInitializers(_init47, 47, this);
130672
+ __privateAdd(this, _terminalReady, __runInitializers(_init47, 48, this, false)), __runInitializers(_init47, 51, this);
130673
+ // Buffer of all log entries for filter mode
130674
+ __publicField(this, "logBuffer", []);
130675
+ // Track trailing hidden entries count for live updates in filter mode
130676
+ __publicField(this, "trailingHiddenCount", 0);
130677
+ // xterm instances
130678
+ __publicField(this, "terminal", null);
130679
+ __publicField(this, "fitAddon", null);
130680
+ __publicField(this, "searchAddon", null);
130681
+ __publicField(this, "resizeObserver", null);
130682
+ __publicField(this, "terminalThemeSubscription", null);
130683
+ __publicField(this, "domtoolsInstance", null);
130684
+ // Rate calculation
130685
+ __publicField(this, "rateBuffer", []);
130686
+ __publicField(this, "rateInterval", null);
129999
130687
  domtools_elementbasic_exports.setup();
130000
130688
  }
130001
130689
  render() {
@@ -130003,105 +130691,508 @@ var DeesChartLog = class extends (_a45 = DeesElement, _label_dec6 = [n5()], _log
130003
130691
  <div class="mainbox">
130004
130692
  <div class="header">
130005
130693
  <div class="title">${this.label}</div>
130694
+ <div class="search-box">
130695
+ <input
130696
+ type="text"
130697
+ placeholder="Search logs..."
130698
+ .value=${this.searchQuery}
130699
+ @input=${(e11) => this.handleSearchInput(e11)}
130700
+ @keydown=${(e11) => this.handleSearchKeydown(e11)}
130701
+ />
130702
+ <div class="search-nav">
130703
+ <button @click=${() => this.searchPrevious()} title="Previous match">↑</button>
130704
+ <button @click=${() => this.searchNext()} title="Next match">↓</button>
130705
+ </div>
130706
+ <button
130707
+ class="filter-toggle ${this.filterMode ? "active" : ""}"
130708
+ @click=${() => this.toggleFilterMode()}
130709
+ title="${this.filterMode ? "Switch to highlight mode" : "Switch to filter mode"}"
130710
+ >
130711
+ ${this.filterMode ? "Filter" : "Highlight"}
130712
+ </button>
130713
+ </div>
130006
130714
  <div class="controls">
130007
- <button
130715
+ <button
130008
130716
  class="control-button ${this.autoScroll ? "active" : ""}"
130009
- @click=${() => {
130010
- this.autoScroll = !this.autoScroll;
130011
- }}
130717
+ @click=${() => this.toggleAutoScroll()}
130012
130718
  >
130013
130719
  Auto Scroll
130014
130720
  </button>
130015
- <button
130016
- class="control-button"
130017
- @click=${() => {
130018
- this.clearLogs();
130019
- }}
130020
- >
130721
+ <button class="control-button" @click=${() => this.clearLogs()}>
130021
130722
  Clear
130022
130723
  </button>
130023
130724
  </div>
130024
130725
  </div>
130025
- <div class="logContainer">
130026
- ${this.logEntries.length === 0 ? b2`<div class="empty-state">No logs to display</div>` : this.logEntries.map((entry) => this.renderLogEntry(entry))}
130726
+
130727
+ <div class="terminal-container">
130728
+ ${!this.terminalReady ? b2`<div class="loading-state">Loading terminal...</div>` : ""}
130027
130729
  </div>
130730
+
130731
+ ${this.showMetrics ? b2`
130732
+ <div class="metrics-bar">
130733
+ <span class="metric error">errors: ${this.metrics.error}</span>
130734
+ <span class="metric warn">warns: ${this.metrics.warn}</span>
130735
+ <span class="metric info">info: ${this.metrics.info}</span>
130736
+ <span class="metric success">success: ${this.metrics.success}</span>
130737
+ <span class="metric debug">debug: ${this.metrics.debug}</span>
130738
+ <span class="metric rate">${this.metrics.rate.toFixed(1)} logs/sec</span>
130739
+ </div>
130740
+ ` : ""}
130028
130741
  </div>
130029
130742
  `;
130030
130743
  }
130031
- renderLogEntry(entry) {
130032
- const timestamp2 = new Date(entry.timestamp).toLocaleTimeString("en-US", {
130744
+ async firstUpdated() {
130745
+ this.domtoolsInstance = await this.domtoolsPromise;
130746
+ await this.initializeTerminal();
130747
+ if (this.logEntries.length > 0) {
130748
+ for (const entry of this.logEntries) {
130749
+ this.writeLogEntry(entry);
130750
+ }
130751
+ }
130752
+ }
130753
+ async initializeTerminal() {
130754
+ const libLoader = DeesServiceLibLoader.getInstance();
130755
+ const [xtermBundle, fitBundle, searchBundle] = await Promise.all([
130756
+ libLoader.loadXterm(),
130757
+ libLoader.loadXtermFitAddon(),
130758
+ libLoader.loadXtermSearchAddon()
130759
+ ]);
130760
+ await this.injectXtermStylesIntoShadow();
130761
+ this.terminal = new xtermBundle.Terminal({
130762
+ cursorBlink: false,
130763
+ disableStdin: true,
130764
+ fontSize: 12,
130765
+ fontFamily: "'SF Mono', 'Monaco', 'Consolas', 'Liberation Mono', 'Courier New', monospace",
130766
+ theme: this.getTerminalTheme(),
130767
+ scrollback: this.maxEntries,
130768
+ convertEol: true
130769
+ });
130770
+ this.fitAddon = new fitBundle.FitAddon();
130771
+ this.searchAddon = new searchBundle.SearchAddon();
130772
+ this.terminal.loadAddon(this.fitAddon);
130773
+ this.terminal.loadAddon(this.searchAddon);
130774
+ const container = this.shadowRoot.querySelector(".terminal-container");
130775
+ this.terminal.open(container);
130776
+ await new Promise((resolve2) => requestAnimationFrame(resolve2));
130777
+ this.fitAddon.fit();
130778
+ this.resizeObserver = new ResizeObserver(() => {
130779
+ this.fitAddon?.fit();
130780
+ });
130781
+ this.resizeObserver.observe(container);
130782
+ this.terminalThemeSubscription = this.domtoolsInstance.themeManager.themeObservable.subscribe(() => {
130783
+ if (this.terminal) {
130784
+ this.terminal.options.theme = this.getTerminalTheme();
130785
+ }
130786
+ });
130787
+ this.rateInterval = setInterval(() => this.calculateRate(), 1e3);
130788
+ this.terminalReady = true;
130789
+ }
130790
+ getTerminalTheme() {
130791
+ const isDark = this.domtoolsInstance?.themeManager?.isDarkMode ?? true;
130792
+ return isDark ? {
130793
+ background: "#0a0a0a",
130794
+ foreground: "#e0e0e0",
130795
+ cursor: "#e0e0e0",
130796
+ selectionBackground: "#404040",
130797
+ black: "#000000",
130798
+ red: "#ff5555",
130799
+ green: "#50fa7b",
130800
+ yellow: "#f1fa8c",
130801
+ blue: "#6272a4",
130802
+ magenta: "#ff79c6",
130803
+ cyan: "#8be9fd",
130804
+ white: "#f8f8f2",
130805
+ brightBlack: "#6272a4",
130806
+ brightRed: "#ff6e6e",
130807
+ brightGreen: "#69ff94",
130808
+ brightYellow: "#ffffa5",
130809
+ brightBlue: "#d6acff",
130810
+ brightMagenta: "#ff92df",
130811
+ brightCyan: "#a4ffff",
130812
+ brightWhite: "#ffffff"
130813
+ } : {
130814
+ background: "#ffffff",
130815
+ foreground: "#333333",
130816
+ cursor: "#333333",
130817
+ selectionBackground: "#add6ff",
130818
+ black: "#000000",
130819
+ red: "#cd3131",
130820
+ green: "#00bc00",
130821
+ yellow: "#949800",
130822
+ blue: "#0451a5",
130823
+ magenta: "#bc05bc",
130824
+ cyan: "#0598bc",
130825
+ white: "#555555",
130826
+ brightBlack: "#666666",
130827
+ brightRed: "#cd3131",
130828
+ brightGreen: "#14ce14",
130829
+ brightYellow: "#b5ba00",
130830
+ brightBlue: "#0451a5",
130831
+ brightMagenta: "#bc05bc",
130832
+ brightCyan: "#0598bc",
130833
+ brightWhite: "#a5a5a5"
130834
+ };
130835
+ }
130836
+ /**
130837
+ * Inject xterm CSS styles into shadow root
130838
+ * This is needed because shadow DOM doesn't inherit styles from document.head
130839
+ */
130840
+ async injectXtermStylesIntoShadow() {
130841
+ const styleId = "xterm-shadow-styles";
130842
+ if (this.shadowRoot.getElementById(styleId)) {
130843
+ return;
130844
+ }
130845
+ const cssUrl = `${CDN_BASE}/xterm@${CDN_VERSIONS.xterm}/css/xterm.css`;
130846
+ const response = await fetch(cssUrl);
130847
+ const cssText = await response.text();
130848
+ const style = document.createElement("style");
130849
+ style.id = styleId;
130850
+ style.textContent = cssText;
130851
+ this.shadowRoot.appendChild(style);
130852
+ }
130853
+ // =====================
130854
+ // Structured Log Methods
130855
+ // =====================
130856
+ /**
130857
+ * Add a single structured log entry
130858
+ */
130859
+ addLog(level, message2, source) {
130860
+ const entry = {
130861
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
130862
+ level,
130863
+ message: message2,
130864
+ source
130865
+ };
130866
+ this.logBuffer.push(entry);
130867
+ if (this.logBuffer.length > this.maxEntries) {
130868
+ this.logBuffer.shift();
130869
+ }
130870
+ if (!this.filterMode || !this.searchQuery) {
130871
+ this.writeLogEntry(entry);
130872
+ } else if (this.entryMatchesFilter(entry)) {
130873
+ this.trailingHiddenCount = 0;
130874
+ this.writeLogEntry(entry);
130875
+ } else {
130876
+ this.updateTrailingPlaceholder();
130877
+ }
130878
+ this.updateMetrics(entry.level);
130879
+ }
130880
+ /**
130881
+ * Add multiple structured log entries
130882
+ */
130883
+ updateLog(entries) {
130884
+ if (!entries) return;
130885
+ for (const entry of entries) {
130886
+ this.logBuffer.push(entry);
130887
+ if (this.logBuffer.length > this.maxEntries) {
130888
+ this.logBuffer.shift();
130889
+ }
130890
+ if (!this.filterMode || !this.searchQuery) {
130891
+ this.writeLogEntry(entry);
130892
+ } else if (this.entryMatchesFilter(entry)) {
130893
+ this.trailingHiddenCount = 0;
130894
+ this.writeLogEntry(entry);
130895
+ } else {
130896
+ this.updateTrailingPlaceholder();
130897
+ }
130898
+ this.updateMetrics(entry.level);
130899
+ }
130900
+ }
130901
+ /**
130902
+ * Update the trailing hidden placeholder in real-time
130903
+ * Clears the last line if a placeholder already exists, then writes updated count
130904
+ */
130905
+ updateTrailingPlaceholder() {
130906
+ if (!this.terminal) return;
130907
+ if (this.trailingHiddenCount > 0) {
130908
+ this.terminal.write("\x1B[1A\x1B[2K\r");
130909
+ }
130910
+ this.trailingHiddenCount++;
130911
+ this.writeHiddenPlaceholder(this.trailingHiddenCount);
130912
+ if (this.autoScroll) {
130913
+ this.terminal.scrollToBottom();
130914
+ }
130915
+ }
130916
+ /**
130917
+ * Check if a log entry matches the current filter
130918
+ */
130919
+ entryMatchesFilter(entry) {
130920
+ if (!this.searchQuery) return true;
130921
+ const query4 = this.searchQuery.toLowerCase();
130922
+ return entry.message.toLowerCase().includes(query4) || entry.level.toLowerCase().includes(query4) || (entry.source?.toLowerCase().includes(query4) ?? false);
130923
+ }
130924
+ writeLogEntry(entry) {
130925
+ if (!this.terminal) return;
130926
+ const formatted = this.formatLogEntry(entry);
130927
+ this.terminal.writeln(formatted);
130928
+ if (this.autoScroll) {
130929
+ this.terminal.scrollToBottom();
130930
+ }
130931
+ }
130932
+ formatLogEntry(entry) {
130933
+ const timestamp2 = this.formatTimestamp(entry.timestamp);
130934
+ const levelColors = {
130935
+ debug: "\x1B[90m",
130936
+ // Gray
130937
+ info: "\x1B[36m",
130938
+ // Cyan
130939
+ warn: "\x1B[33m",
130940
+ // Yellow
130941
+ error: "\x1B[31m",
130942
+ // Red
130943
+ success: "\x1B[32m"
130944
+ // Green
130945
+ };
130946
+ const reset = "\x1B[0m";
130947
+ const dim = "\x1B[2m";
130948
+ const levelStr = `${levelColors[entry.level]}[${entry.level.toUpperCase().padEnd(7)}]${reset}`;
130949
+ const sourceStr = entry.source ? `${dim}[${entry.source}]${reset} ` : "";
130950
+ const messageStr = this.applyHighlights(entry.message);
130951
+ return `${dim}${timestamp2}${reset} ${levelStr} ${sourceStr}${messageStr}`;
130952
+ }
130953
+ formatTimestamp(isoString) {
130954
+ const date = new Date(isoString);
130955
+ return date.toLocaleTimeString("en-US", {
130033
130956
  hour12: false,
130034
130957
  hour: "2-digit",
130035
130958
  minute: "2-digit",
130036
130959
  second: "2-digit",
130037
130960
  fractionalSecondDigits: 3
130038
130961
  });
130039
- return b2`
130040
- <div class="logEntry">
130041
- <span class="timestamp">${timestamp2}</span>
130042
- <span class="level ${entry.level}">${entry.level}</span>
130043
- ${entry.source ? b2`<span class="source">[${entry.source}]</span>` : ""}
130044
- <span class="message">${entry.message}</span>
130045
- </div>
130046
- `;
130047
130962
  }
130048
- async firstUpdated() {
130049
- await this.domtoolsPromise;
130050
- this.logContainer = this.shadowRoot.querySelector(".logContainer");
130051
- const demoLogs = [
130052
- { timestamp: (/* @__PURE__ */ new Date()).toISOString(), level: "info", message: "Server started on port 3000", source: "Server" },
130053
- { timestamp: (/* @__PURE__ */ new Date()).toISOString(), level: "debug", message: "Loading configuration from /etc/app/config.json", source: "Config" },
130054
- { timestamp: (/* @__PURE__ */ new Date()).toISOString(), level: "info", message: "Connected to MongoDB at mongodb://localhost:27017", source: "Database" },
130055
- { timestamp: (/* @__PURE__ */ new Date()).toISOString(), level: "success", message: "Database connection established successfully", source: "Database" },
130056
- { timestamp: (/* @__PURE__ */ new Date()).toISOString(), level: "warn", message: "No SSL certificate found, using self-signed certificate", source: "Security" },
130057
- { timestamp: (/* @__PURE__ */ new Date()).toISOString(), level: "info", message: "API routes initialized: GET /api/users, POST /api/users, DELETE /api/users/:id", source: "Router" },
130058
- { timestamp: (/* @__PURE__ */ new Date()).toISOString(), level: "debug", message: "Middleware stack: cors, bodyParser, authentication, errorHandler", source: "Middleware" },
130059
- { timestamp: (/* @__PURE__ */ new Date()).toISOString(), level: "info", message: "WebSocket server listening on ws://localhost:3001", source: "WebSocket" }
130060
- ];
130061
- this.logEntries = demoLogs;
130062
- this.scrollToBottom();
130063
- }
130064
- async updateLog(entries) {
130065
- if (entries) {
130066
- this.logEntries = [...this.logEntries, ...entries];
130067
- if (this.logEntries.length > this.maxEntries) {
130068
- this.logEntries = this.logEntries.slice(-this.maxEntries);
130963
+ applyHighlights(text9) {
130964
+ const keywords = [...this.highlightKeywords];
130965
+ if (this.filterMode && this.searchQuery) {
130966
+ keywords.push(this.searchQuery);
130967
+ }
130968
+ if (keywords.length === 0) return text9;
130969
+ let result = text9;
130970
+ for (const keyword of keywords) {
130971
+ const escaped = keyword.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
130972
+ const regex = new RegExp(`(${escaped})`, "gi");
130973
+ result = result.replace(regex, "\x1B[43m\x1B[30m$1\x1B[0m");
130974
+ }
130975
+ return result;
130976
+ }
130977
+ // =====================
130978
+ // Raw Log Methods
130979
+ // =====================
130980
+ /**
130981
+ * Write raw data to the terminal (for Docker logs, etc.)
130982
+ */
130983
+ writeRaw(data) {
130984
+ if (!this.terminal) return;
130985
+ this.terminal.write(data);
130986
+ this.recordLogEvent();
130987
+ if (this.autoScroll) {
130988
+ this.terminal.scrollToBottom();
130989
+ }
130990
+ }
130991
+ /**
130992
+ * Write a raw line to the terminal
130993
+ */
130994
+ writelnRaw(line) {
130995
+ if (!this.terminal) return;
130996
+ this.terminal.writeln(line);
130997
+ this.recordLogEvent();
130998
+ if (this.autoScroll) {
130999
+ this.terminal.scrollToBottom();
131000
+ }
131001
+ }
131002
+ // =====================
131003
+ // Search Methods
131004
+ // =====================
131005
+ handleSearchInput(e11) {
131006
+ const input = e11.target;
131007
+ const newQuery = input.value;
131008
+ const queryChanged = this.searchQuery !== newQuery;
131009
+ this.searchQuery = newQuery;
131010
+ if (this.filterMode && queryChanged) {
131011
+ this.reRenderFilteredLogs();
131012
+ } else if (this.searchQuery) {
131013
+ this.searchAddon?.findNext(this.searchQuery);
131014
+ }
131015
+ }
131016
+ handleSearchKeydown(e11) {
131017
+ if (e11.key === "Enter") {
131018
+ if (e11.shiftKey) {
131019
+ this.searchPrevious();
131020
+ } else {
131021
+ this.searchNext();
130069
131022
  }
130070
- this.requestUpdate();
130071
- await this.updateComplete;
130072
- if (this.autoScroll) {
130073
- this.scrollToBottom();
131023
+ } else if (e11.key === "Escape") {
131024
+ this.searchQuery = "";
131025
+ e11.target.value = "";
131026
+ }
131027
+ }
131028
+ /**
131029
+ * Search for a query in the terminal
131030
+ */
131031
+ search(query4) {
131032
+ this.searchQuery = query4;
131033
+ this.searchAddon?.findNext(query4);
131034
+ }
131035
+ /**
131036
+ * Find next search match
131037
+ */
131038
+ searchNext() {
131039
+ if (this.searchQuery) {
131040
+ this.searchAddon?.findNext(this.searchQuery);
131041
+ }
131042
+ }
131043
+ /**
131044
+ * Find previous search match
131045
+ */
131046
+ searchPrevious() {
131047
+ if (this.searchQuery) {
131048
+ this.searchAddon?.findPrevious(this.searchQuery);
131049
+ }
131050
+ }
131051
+ // =====================
131052
+ // Control Methods
131053
+ // =====================
131054
+ toggleAutoScroll() {
131055
+ this.autoScroll = !this.autoScroll;
131056
+ if (this.autoScroll && this.terminal) {
131057
+ this.terminal.scrollToBottom();
131058
+ }
131059
+ }
131060
+ /**
131061
+ * Toggle between filter mode and highlight mode
131062
+ */
131063
+ toggleFilterMode() {
131064
+ this.filterMode = !this.filterMode;
131065
+ this.reRenderFilteredLogs();
131066
+ }
131067
+ /**
131068
+ * Re-render logs based on current filter state
131069
+ * In filter mode: show matching logs with placeholders for hidden entries
131070
+ * In highlight mode: show all logs
131071
+ */
131072
+ reRenderFilteredLogs() {
131073
+ if (!this.terminal) return;
131074
+ this.terminal.clear();
131075
+ this.trailingHiddenCount = 0;
131076
+ if (!this.filterMode || !this.searchQuery) {
131077
+ for (const entry of this.logBuffer) {
131078
+ const formatted = this.formatLogEntry(entry);
131079
+ this.terminal.writeln(formatted);
130074
131080
  }
131081
+ } else {
131082
+ let hiddenCount = 0;
131083
+ for (const entry of this.logBuffer) {
131084
+ if (this.entryMatchesFilter(entry)) {
131085
+ if (hiddenCount > 0) {
131086
+ this.writeHiddenPlaceholder(hiddenCount);
131087
+ hiddenCount = 0;
131088
+ }
131089
+ const formatted = this.formatLogEntry(entry);
131090
+ this.terminal.writeln(formatted);
131091
+ } else {
131092
+ hiddenCount++;
131093
+ }
131094
+ }
131095
+ if (hiddenCount > 0) {
131096
+ this.writeHiddenPlaceholder(hiddenCount);
131097
+ this.trailingHiddenCount = hiddenCount;
131098
+ }
131099
+ }
131100
+ if (this.autoScroll) {
131101
+ this.terminal.scrollToBottom();
130075
131102
  }
130076
131103
  }
131104
+ /**
131105
+ * Write a placeholder line showing how many log entries are hidden by filter
131106
+ */
131107
+ writeHiddenPlaceholder(count2) {
131108
+ const dim = "\x1B[2m";
131109
+ const reset = "\x1B[0m";
131110
+ const text9 = count2 === 1 ? `[1 log line hidden by filter ...]` : `[${count2} log lines hidden by filter ...]`;
131111
+ this.terminal?.writeln(`${dim}${text9}${reset}`);
131112
+ }
131113
+ /**
131114
+ * Clear all logs and reset metrics
131115
+ */
130077
131116
  clearLogs() {
130078
- this.logEntries = [];
130079
- this.requestUpdate();
131117
+ this.terminal?.clear();
131118
+ this.logBuffer = [];
131119
+ this.trailingHiddenCount = 0;
131120
+ this.resetMetrics();
130080
131121
  }
131122
+ /**
131123
+ * Scroll to the bottom of the log
131124
+ */
130081
131125
  scrollToBottom() {
130082
- if (this.logContainer) {
130083
- this.logContainer.scrollTop = this.logContainer.scrollHeight;
130084
- }
131126
+ this.terminal?.scrollToBottom();
130085
131127
  }
130086
- addLog(level, message2, source) {
130087
- const newEntry = {
130088
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
130089
- level,
130090
- message: message2,
130091
- source
131128
+ // =====================
131129
+ // Metrics Methods
131130
+ // =====================
131131
+ updateMetrics(level) {
131132
+ this.metrics = {
131133
+ ...this.metrics,
131134
+ [level]: this.metrics[level] + 1,
131135
+ total: this.metrics.total + 1
130092
131136
  };
130093
- this.updateLog([newEntry]);
131137
+ this.recordLogEvent();
131138
+ }
131139
+ recordLogEvent() {
131140
+ this.rateBuffer.push(Date.now());
131141
+ }
131142
+ calculateRate() {
131143
+ const now2 = Date.now();
131144
+ this.rateBuffer = this.rateBuffer.filter((t9) => now2 - t9 < 1e4);
131145
+ const rate = this.rateBuffer.length / 10;
131146
+ if (rate !== this.metrics.rate) {
131147
+ this.metrics = { ...this.metrics, rate };
131148
+ }
131149
+ }
131150
+ resetMetrics() {
131151
+ this.metrics = { debug: 0, info: 0, warn: 0, error: 0, success: 0, total: 0, rate: 0 };
131152
+ this.rateBuffer = [];
131153
+ }
131154
+ // =====================
131155
+ // Lifecycle
131156
+ // =====================
131157
+ async disconnectedCallback() {
131158
+ await super.disconnectedCallback();
131159
+ if (this.resizeObserver) {
131160
+ this.resizeObserver.disconnect();
131161
+ }
131162
+ if (this.terminalThemeSubscription) {
131163
+ this.terminalThemeSubscription.unsubscribe();
131164
+ }
131165
+ if (this.rateInterval) {
131166
+ clearInterval(this.rateInterval);
131167
+ }
131168
+ if (this.terminal) {
131169
+ this.terminal.dispose();
131170
+ }
130094
131171
  }
130095
131172
  };
130096
131173
  _init47 = __decoratorStart(_a45);
130097
131174
  _label6 = new WeakMap();
131175
+ _mode = new WeakMap();
130098
131176
  _logEntries = new WeakMap();
130099
131177
  _autoScroll = new WeakMap();
130100
131178
  _maxEntries = new WeakMap();
131179
+ _highlightKeywords = new WeakMap();
131180
+ _showMetrics = new WeakMap();
131181
+ _searchQuery2 = new WeakMap();
131182
+ _filterMode = new WeakMap();
131183
+ _metrics = new WeakMap();
131184
+ _terminalReady = new WeakMap();
130101
131185
  __decorateElement(_init47, 4, "label", _label_dec6, DeesChartLog, _label6);
131186
+ __decorateElement(_init47, 4, "mode", _mode_dec, DeesChartLog, _mode);
130102
131187
  __decorateElement(_init47, 4, "logEntries", _logEntries_dec, DeesChartLog, _logEntries);
130103
131188
  __decorateElement(_init47, 4, "autoScroll", _autoScroll_dec, DeesChartLog, _autoScroll);
130104
131189
  __decorateElement(_init47, 4, "maxEntries", _maxEntries_dec, DeesChartLog, _maxEntries);
131190
+ __decorateElement(_init47, 4, "highlightKeywords", _highlightKeywords_dec, DeesChartLog, _highlightKeywords);
131191
+ __decorateElement(_init47, 4, "showMetrics", _showMetrics_dec, DeesChartLog, _showMetrics);
131192
+ __decorateElement(_init47, 4, "searchQuery", _searchQuery_dec2, DeesChartLog, _searchQuery2);
131193
+ __decorateElement(_init47, 4, "filterMode", _filterMode_dec, DeesChartLog, _filterMode);
131194
+ __decorateElement(_init47, 4, "metrics", _metrics_dec, DeesChartLog, _metrics);
131195
+ __decorateElement(_init47, 4, "terminalReady", _terminalReady_dec, DeesChartLog, _terminalReady);
130105
131196
  DeesChartLog = __decorateElement(_init47, 0, "DeesChartLog", _DeesChartLog_decorators, DeesChartLog);
130106
131197
  __publicField(DeesChartLog, "demo", demoFunc33);
130107
131198
  __publicField(DeesChartLog, "demoGroup", "Chart");
@@ -130109,13 +131200,12 @@ __publicField(DeesChartLog, "styles", [
130109
131200
  themeDefaultStyles,
130110
131201
  cssManager.defaultStyles,
130111
131202
  i`
130112
- /* TODO: Migrate hardcoded values to --dees-* CSS variables */
130113
131203
  :host {
130114
- font-family: 'SF Mono', 'Monaco', 'Consolas', 'Liberation Mono', 'Courier New', monospace;
131204
+ display: block;
131205
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
130115
131206
  color: ${cssManager.bdTheme("hsl(0 0% 3.9%)", "hsl(0 0% 98%)")};
130116
- font-size: 12px;
130117
- line-height: 1.5;
130118
131207
  }
131208
+
130119
131209
  .mainbox {
130120
131210
  position: relative;
130121
131211
  width: 100%;
@@ -130130,143 +131220,197 @@ __publicField(DeesChartLog, "styles", [
130130
131220
 
130131
131221
  .header {
130132
131222
  background: ${cssManager.bdTheme("hsl(0 0% 97%)", "hsl(0 0% 7%)")};
130133
- padding: 12px 16px;
131223
+ padding: 8px 12px;
130134
131224
  border-bottom: 1px solid ${cssManager.bdTheme("hsl(0 0% 89.8%)", "hsl(0 0% 14.9%)")};
130135
131225
  display: flex;
130136
- justify-content: space-between;
130137
131226
  align-items: center;
131227
+ gap: 12px;
130138
131228
  flex-shrink: 0;
131229
+ flex-wrap: wrap;
130139
131230
  }
130140
131231
 
130141
131232
  .title {
130142
131233
  font-weight: 500;
130143
131234
  font-size: 14px;
130144
131235
  color: ${cssManager.bdTheme("hsl(0 0% 9%)", "hsl(0 0% 95%)")};
130145
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
131236
+ white-space: nowrap;
130146
131237
  }
130147
131238
 
130148
- .controls {
131239
+ .search-box {
130149
131240
  display: flex;
130150
- gap: 8px;
131241
+ align-items: center;
131242
+ gap: 4px;
131243
+ flex: 1;
131244
+ min-width: 150px;
131245
+ max-width: 300px;
130151
131246
  }
130152
131247
 
130153
- .control-button {
130154
- background: ${cssManager.bdTheme("hsl(0 0% 100%)", "hsl(0 0% 14.9%)")};
130155
- border: 1px solid ${cssManager.bdTheme("hsl(0 0% 89.8%)", "hsl(0 0% 14.9%)")};
130156
- border-radius: 6px;
130157
- padding: 6px 12px;
130158
- color: ${cssManager.bdTheme("hsl(0 0% 45.1%)", "hsl(0 0% 63.9%)")};
130159
- cursor: pointer;
131248
+ .search-box input {
131249
+ flex: 1;
131250
+ padding: 4px 8px;
130160
131251
  font-size: 12px;
130161
- font-weight: 500;
130162
- transition: all 0.15s;
130163
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
130164
- }
130165
-
130166
- .control-button:hover {
130167
- background: ${cssManager.bdTheme("hsl(0 0% 95.1%)", "hsl(0 0% 14.9%)")};
130168
- border-color: ${cssManager.bdTheme("hsl(0 0% 79.8%)", "hsl(0 0% 20.9%)")};
130169
- color: ${cssManager.bdTheme("hsl(0 0% 15%)", "hsl(0 0% 93.9%)")};
131252
+ border: 1px solid ${cssManager.bdTheme("hsl(0 0% 89.8%)", "hsl(0 0% 14.9%)")};
131253
+ border-radius: 4px;
131254
+ background: ${cssManager.bdTheme("hsl(0 0% 100%)", "hsl(0 0% 9%)")};
131255
+ color: ${cssManager.bdTheme("hsl(0 0% 9%)", "hsl(0 0% 95%)")};
131256
+ outline: none;
130170
131257
  }
130171
131258
 
130172
- .control-button.active {
130173
- background: ${cssManager.bdTheme("hsl(0 0% 9%)", "hsl(0 0% 93.9%)")};
130174
- color: ${cssManager.bdTheme("hsl(0 0% 98%)", "hsl(0 0% 3.9%)")};
131259
+ .search-box input:focus {
131260
+ border-color: ${cssManager.bdTheme("hsl(222.2 47.4% 51.2%)", "hsl(217.2 91.2% 59.8%)")};
130175
131261
  }
130176
131262
 
130177
- .logContainer {
130178
- flex: 1;
130179
- overflow-y: auto;
130180
- overflow-x: hidden;
130181
- padding: 16px;
130182
- font-size: 12px;
131263
+ .search-box input::placeholder {
131264
+ color: ${cssManager.bdTheme("hsl(0 0% 63.9%)", "hsl(0 0% 45.1%)")};
130183
131265
  }
130184
131266
 
130185
- .logEntry {
130186
- margin-bottom: 4px;
131267
+ .search-nav {
130187
131268
  display: flex;
130188
- white-space: pre-wrap;
130189
- word-break: break-all;
130190
- font-variant-numeric: tabular-nums;
131269
+ gap: 2px;
130191
131270
  }
130192
131271
 
130193
- .timestamp {
130194
- color: ${cssManager.bdTheme("hsl(0 0% 63.9%)", "hsl(0 0% 45.1%)")};
130195
- margin-right: 12px;
130196
- flex-shrink: 0;
131272
+ .search-nav button {
131273
+ padding: 4px 6px;
131274
+ font-size: 11px;
131275
+ background: ${cssManager.bdTheme("hsl(0 0% 100%)", "hsl(0 0% 14.9%)")};
131276
+ border: 1px solid ${cssManager.bdTheme("hsl(0 0% 89.8%)", "hsl(0 0% 14.9%)")};
131277
+ border-radius: 3px;
131278
+ color: ${cssManager.bdTheme("hsl(0 0% 45.1%)", "hsl(0 0% 63.9%)")};
131279
+ cursor: pointer;
131280
+ line-height: 1;
130197
131281
  }
130198
131282
 
130199
- .level {
130200
- margin-right: 8px;
130201
- padding: 0 6px;
130202
- border-radius: 3px;
130203
- font-weight: 600;
130204
- text-transform: uppercase;
130205
- font-size: 10px;
130206
- flex-shrink: 0;
131283
+ .search-nav button:hover {
131284
+ background: ${cssManager.bdTheme("hsl(0 0% 95.1%)", "hsl(0 0% 20%)")};
131285
+ color: ${cssManager.bdTheme("hsl(0 0% 15%)", "hsl(0 0% 93.9%)")};
130207
131286
  }
130208
131287
 
130209
- .level.debug {
131288
+ .filter-toggle {
131289
+ padding: 4px 8px;
131290
+ font-size: 11px;
131291
+ font-weight: 500;
131292
+ background: ${cssManager.bdTheme("hsl(0 0% 100%)", "hsl(0 0% 14.9%)")};
131293
+ border: 1px solid ${cssManager.bdTheme("hsl(0 0% 89.8%)", "hsl(0 0% 14.9%)")};
131294
+ border-radius: 4px;
130210
131295
  color: ${cssManager.bdTheme("hsl(0 0% 45.1%)", "hsl(0 0% 63.9%)")};
130211
- background: ${cssManager.bdTheme("hsl(0 0% 45.1% / 0.1)", "hsl(0 0% 63.9% / 0.1)")};
131296
+ cursor: pointer;
131297
+ transition: all 0.15s;
131298
+ white-space: nowrap;
130212
131299
  }
130213
131300
 
130214
- .level.info {
130215
- color: ${cssManager.bdTheme("hsl(222.2 47.4% 51.2%)", "hsl(217.2 91.2% 59.8%)")};
130216
- background: ${cssManager.bdTheme("hsl(222.2 47.4% 51.2% / 0.1)", "hsl(217.2 91.2% 59.8% / 0.1)")};
131301
+ .filter-toggle:hover {
131302
+ background: ${cssManager.bdTheme("hsl(0 0% 95.1%)", "hsl(0 0% 20%)")};
131303
+ color: ${cssManager.bdTheme("hsl(0 0% 15%)", "hsl(0 0% 93.9%)")};
130217
131304
  }
130218
131305
 
130219
- .level.warn {
130220
- color: ${cssManager.bdTheme("hsl(25 95% 53%)", "hsl(25 95% 63%)")};
130221
- background: ${cssManager.bdTheme("hsl(25 95% 53% / 0.1)", "hsl(25 95% 63% / 0.1)")};
131306
+ .filter-toggle.active {
131307
+ background: ${cssManager.bdTheme("hsl(45 93% 47%)", "hsl(45 93% 47%)")};
131308
+ border-color: ${cssManager.bdTheme("hsl(45 93% 47%)", "hsl(45 93% 47%)")};
131309
+ color: hsl(0 0% 9%);
130222
131310
  }
130223
131311
 
130224
- .level.error {
130225
- color: ${cssManager.bdTheme("hsl(0 84.2% 60.2%)", "hsl(0 72.2% 50.6%)")};
130226
- background: ${cssManager.bdTheme("hsl(0 84.2% 60.2% / 0.1)", "hsl(0 72.2% 50.6% / 0.1)")};
131312
+ .controls {
131313
+ display: flex;
131314
+ gap: 6px;
131315
+ margin-left: auto;
130227
131316
  }
130228
131317
 
130229
- .level.success {
130230
- color: ${cssManager.bdTheme("hsl(142.1 76.2% 36.3%)", "hsl(142.1 70.6% 45.3%)")};
130231
- background: ${cssManager.bdTheme("hsl(142.1 76.2% 36.3% / 0.1)", "hsl(142.1 70.6% 45.3% / 0.1)")};
131318
+ .control-button {
131319
+ background: ${cssManager.bdTheme("hsl(0 0% 100%)", "hsl(0 0% 14.9%)")};
131320
+ border: 1px solid ${cssManager.bdTheme("hsl(0 0% 89.8%)", "hsl(0 0% 14.9%)")};
131321
+ border-radius: 4px;
131322
+ padding: 4px 10px;
131323
+ color: ${cssManager.bdTheme("hsl(0 0% 45.1%)", "hsl(0 0% 63.9%)")};
131324
+ cursor: pointer;
131325
+ font-size: 12px;
131326
+ font-weight: 500;
131327
+ transition: all 0.15s;
130232
131328
  }
130233
131329
 
130234
- .source {
130235
- color: ${cssManager.bdTheme("hsl(0 0% 45.1%)", "hsl(0 0% 63.9%)")};
130236
- margin-right: 8px;
130237
- flex-shrink: 0;
131330
+ .control-button:hover {
131331
+ background: ${cssManager.bdTheme("hsl(0 0% 95.1%)", "hsl(0 0% 20%)")};
131332
+ border-color: ${cssManager.bdTheme("hsl(0 0% 79.8%)", "hsl(0 0% 25%)")};
131333
+ color: ${cssManager.bdTheme("hsl(0 0% 15%)", "hsl(0 0% 93.9%)")};
130238
131334
  }
130239
131335
 
130240
- .message {
130241
- color: ${cssManager.bdTheme("hsl(0 0% 15%)", "hsl(0 0% 90%)")};
131336
+ .control-button.active {
131337
+ background: ${cssManager.bdTheme("hsl(222.2 47.4% 51.2%)", "hsl(217.2 91.2% 59.8%)")};
131338
+ border-color: ${cssManager.bdTheme("hsl(222.2 47.4% 51.2%)", "hsl(217.2 91.2% 59.8%)")};
131339
+ color: white;
131340
+ }
131341
+
131342
+ .terminal-container {
130242
131343
  flex: 1;
131344
+ overflow: hidden;
131345
+ padding: 8px;
131346
+ background: ${cssManager.bdTheme("hsl(0 0% 100%)", "hsl(0 0% 3.9%)")};
130243
131347
  }
130244
131348
 
130245
- .empty-state {
131349
+ .terminal-container .xterm {
131350
+ height: 100%;
131351
+ }
131352
+
131353
+ .loading-state {
130246
131354
  display: flex;
130247
131355
  align-items: center;
130248
131356
  justify-content: center;
130249
131357
  height: 100%;
130250
131358
  color: ${cssManager.bdTheme("hsl(0 0% 45.1%)", "hsl(0 0% 63.9%)")};
130251
131359
  font-style: italic;
131360
+ font-size: 13px;
130252
131361
  }
130253
131362
 
130254
- /* Custom scrollbar */
130255
- .logContainer::-webkit-scrollbar {
131363
+ .metrics-bar {
131364
+ background: ${cssManager.bdTheme("hsl(0 0% 97%)", "hsl(0 0% 7%)")};
131365
+ border-top: 1px solid ${cssManager.bdTheme("hsl(0 0% 89.8%)", "hsl(0 0% 14.9%)")};
131366
+ padding: 6px 12px;
131367
+ display: flex;
131368
+ gap: 16px;
131369
+ font-size: 11px;
131370
+ font-weight: 500;
131371
+ flex-shrink: 0;
131372
+ }
131373
+
131374
+ .metric {
131375
+ display: flex;
131376
+ align-items: center;
131377
+ gap: 4px;
131378
+ }
131379
+
131380
+ .metric::before {
131381
+ content: '';
130256
131382
  width: 8px;
131383
+ height: 8px;
131384
+ border-radius: 50%;
130257
131385
  }
130258
131386
 
130259
- .logContainer::-webkit-scrollbar-track {
130260
- background: ${cssManager.bdTheme("hsl(0 0% 95%)", "hsl(0 0% 10%)")};
131387
+ .metric.error::before {
131388
+ background: hsl(0 84.2% 60.2%);
130261
131389
  }
130262
131390
 
130263
- .logContainer::-webkit-scrollbar-thumb {
130264
- background: ${cssManager.bdTheme("hsl(0 0% 70%)", "hsl(0 0% 30%)")};
130265
- border-radius: 4px;
131391
+ .metric.warn::before {
131392
+ background: hsl(25 95% 53%);
130266
131393
  }
130267
131394
 
130268
- .logContainer::-webkit-scrollbar-thumb:hover {
130269
- background: ${cssManager.bdTheme("hsl(0 0% 60%)", "hsl(0 0% 40%)")};
131395
+ .metric.info::before {
131396
+ background: hsl(222.2 47.4% 51.2%);
131397
+ }
131398
+
131399
+ .metric.success::before {
131400
+ background: hsl(142.1 76.2% 36.3%);
131401
+ }
131402
+
131403
+ .metric.debug::before {
131404
+ background: hsl(0 0% 63.9%);
131405
+ }
131406
+
131407
+ .metric.rate {
131408
+ margin-left: auto;
131409
+ color: ${cssManager.bdTheme("hsl(0 0% 45.1%)", "hsl(0 0% 63.9%)")};
131410
+ }
131411
+
131412
+ .metric.rate::before {
131413
+ display: none;
130270
131414
  }
130271
131415
  `
130272
131416
  ]);
@@ -154160,9 +155304,9 @@ var openWidgetContextMenu = ({
154160
155304
  // ts_web/elements/dees-dashboardgrid/dees-dashboardgrid.ts
154161
155305
  init_dist_ts26();
154162
155306
  init_dees_icon();
154163
- var _previewWidgets_dec, _resolvedMargins_dec, _metrics_dec, _placeholderPosition_dec, _activeBreakpoint_dec, _layouts_dec, _showGridLines_dec, _rtl_dec, _cellHeightUnit_dec, _enableAnimation_dec, _editable_dec, _columns_dec2, _margin_dec, _cellHeight_dec, _widgets_dec2, _a75, _DeesDashboardgrid_decorators, _init78, _widgets2, _cellHeight, _margin, _columns2, _editable, _enableAnimation, _cellHeightUnit, _rtl, _showGridLines, _layouts, _activeBreakpoint, _placeholderPosition, _metrics, _resolvedMargins, _previewWidgets;
155307
+ var _previewWidgets_dec, _resolvedMargins_dec, _metrics_dec2, _placeholderPosition_dec, _activeBreakpoint_dec, _layouts_dec, _showGridLines_dec, _rtl_dec, _cellHeightUnit_dec, _enableAnimation_dec, _editable_dec, _columns_dec2, _margin_dec, _cellHeight_dec, _widgets_dec2, _a75, _DeesDashboardgrid_decorators, _init78, _widgets2, _cellHeight, _margin, _columns2, _editable, _enableAnimation, _cellHeightUnit, _rtl, _showGridLines, _layouts, _activeBreakpoint, _placeholderPosition, _metrics2, _resolvedMargins, _previewWidgets;
154164
155308
  _DeesDashboardgrid_decorators = [t4("dees-dashboardgrid")];
154165
- var DeesDashboardgrid = class extends (_a75 = DeesElement, _widgets_dec2 = [n5({ type: Array })], _cellHeight_dec = [n5({ type: Number })], _margin_dec = [n5({ type: Object })], _columns_dec2 = [n5({ type: Number })], _editable_dec = [n5({ type: Boolean })], _enableAnimation_dec = [n5({ type: Boolean, reflect: true })], _cellHeightUnit_dec = [n5({ type: String })], _rtl_dec = [n5({ type: Boolean })], _showGridLines_dec = [n5({ type: Boolean })], _layouts_dec = [n5({ attribute: false })], _activeBreakpoint_dec = [n5({ type: String })], _placeholderPosition_dec = [r5()], _metrics_dec = [r5()], _resolvedMargins_dec = [r5()], _previewWidgets_dec = [r5()], _a75) {
155309
+ var DeesDashboardgrid = class extends (_a75 = DeesElement, _widgets_dec2 = [n5({ type: Array })], _cellHeight_dec = [n5({ type: Number })], _margin_dec = [n5({ type: Object })], _columns_dec2 = [n5({ type: Number })], _editable_dec = [n5({ type: Boolean })], _enableAnimation_dec = [n5({ type: Boolean, reflect: true })], _cellHeightUnit_dec = [n5({ type: String })], _rtl_dec = [n5({ type: Boolean })], _showGridLines_dec = [n5({ type: Boolean })], _layouts_dec = [n5({ attribute: false })], _activeBreakpoint_dec = [n5({ type: String })], _placeholderPosition_dec = [r5()], _metrics_dec2 = [r5()], _resolvedMargins_dec = [r5()], _previewWidgets_dec = [r5()], _a75) {
154166
155310
  constructor() {
154167
155311
  super(...arguments);
154168
155312
  __privateAdd(this, _widgets2, __runInitializers(_init78, 8, this, [])), __runInitializers(_init78, 11, this);
@@ -154177,7 +155321,7 @@ var DeesDashboardgrid = class extends (_a75 = DeesElement, _widgets_dec2 = [n5({
154177
155321
  __privateAdd(this, _layouts, __runInitializers(_init78, 44, this)), __runInitializers(_init78, 47, this);
154178
155322
  __privateAdd(this, _activeBreakpoint, __runInitializers(_init78, 48, this, "base")), __runInitializers(_init78, 51, this);
154179
155323
  __privateAdd(this, _placeholderPosition, __runInitializers(_init78, 52, this, null)), __runInitializers(_init78, 55, this);
154180
- __privateAdd(this, _metrics, __runInitializers(_init78, 56, this, null)), __runInitializers(_init78, 59, this);
155324
+ __privateAdd(this, _metrics2, __runInitializers(_init78, 56, this, null)), __runInitializers(_init78, 59, this);
154181
155325
  __privateAdd(this, _resolvedMargins, __runInitializers(_init78, 60, this, null)), __runInitializers(_init78, 63, this);
154182
155326
  __privateAdd(this, _previewWidgets, __runInitializers(_init78, 64, this, null)), __runInitializers(_init78, 67, this);
154183
155327
  __publicField(this, "containerBounds", null);
@@ -154754,7 +155898,7 @@ _showGridLines = new WeakMap();
154754
155898
  _layouts = new WeakMap();
154755
155899
  _activeBreakpoint = new WeakMap();
154756
155900
  _placeholderPosition = new WeakMap();
154757
- _metrics = new WeakMap();
155901
+ _metrics2 = new WeakMap();
154758
155902
  _resolvedMargins = new WeakMap();
154759
155903
  _previewWidgets = new WeakMap();
154760
155904
  __decorateElement(_init78, 4, "widgets", _widgets_dec2, DeesDashboardgrid, _widgets2);
@@ -154769,7 +155913,7 @@ __decorateElement(_init78, 4, "showGridLines", _showGridLines_dec, DeesDashboard
154769
155913
  __decorateElement(_init78, 4, "layouts", _layouts_dec, DeesDashboardgrid, _layouts);
154770
155914
  __decorateElement(_init78, 4, "activeBreakpoint", _activeBreakpoint_dec, DeesDashboardgrid, _activeBreakpoint);
154771
155915
  __decorateElement(_init78, 4, "placeholderPosition", _placeholderPosition_dec, DeesDashboardgrid, _placeholderPosition);
154772
- __decorateElement(_init78, 4, "metrics", _metrics_dec, DeesDashboardgrid, _metrics);
155916
+ __decorateElement(_init78, 4, "metrics", _metrics_dec2, DeesDashboardgrid, _metrics2);
154773
155917
  __decorateElement(_init78, 4, "resolvedMargins", _resolvedMargins_dec, DeesDashboardgrid, _resolvedMargins);
154774
155918
  __decorateElement(_init78, 4, "previewWidgets", _previewWidgets_dec, DeesDashboardgrid, _previewWidgets);
154775
155919
  DeesDashboardgrid = __decorateElement(_init78, 0, "DeesDashboardgrid", _DeesDashboardgrid_decorators, DeesDashboardgrid);
@@ -157504,7 +158648,7 @@ init_group_runtime();
157504
158648
  // ts_web/00_commitinfo_data.ts
157505
158649
  var commitinfo = {
157506
158650
  name: "@design.estate/dees-catalog",
157507
- version: "3.35.1",
158651
+ version: "3.36.0",
157508
158652
  description: "A comprehensive library that provides dynamic web components for building sophisticated and modern web applications using JavaScript and TypeScript."
157509
158653
  };
157510
158654
  export {
@@ -159407,4 +160551,4 @@ ibantools/jsnext/ibantools.js:
159407
160551
  * @preferred
159408
160552
  *)
159409
160553
  */
159410
- //# sourceMappingURL=bundle-1768256969916.js.map
160554
+ //# sourceMappingURL=bundle-1768337007500.js.map