myio-js-library 0.1.468 → 0.1.469

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.
package/dist/index.cjs CHANGED
@@ -1139,7 +1139,7 @@ module.exports = __toCommonJS(index_exports);
1139
1139
  // package.json
1140
1140
  var package_default = {
1141
1141
  name: "myio-js-library",
1142
- version: "0.1.468",
1142
+ version: "0.1.469",
1143
1143
  description: "A clean, standalone JS SDK for MYIO projects",
1144
1144
  license: "MIT",
1145
1145
  repository: "github:gh-myio/myio-js-library",
@@ -5638,6 +5638,12 @@ var MyIOSelectionStoreClass = class _MyIOSelectionStoreClass {
5638
5638
  ingestionId: entity.ingestionId || entityId,
5639
5639
  // ⭐ ADD: Store ingestionId for API calls
5640
5640
  customerName: entity.customerName || entity.ownerName || entity.centralName || "",
5641
+ // RFC-0157: Operational metrics for comparison modal
5642
+ domain: entity.domain || null,
5643
+ availability: entity.availability ?? null,
5644
+ mtbf: entity.mtbf ?? null,
5645
+ mttr: entity.mttr ?? null,
5646
+ equipmentType: entity.equipmentType || null,
5641
5647
  // Optional metadata passthrough (used by alarm comparisons)
5642
5648
  meta: entity.meta || entity.alarmMeta || null,
5643
5649
  alarm: entity.alarm || null
@@ -26321,7 +26327,28 @@ async function openRealTimeTelemetryModal(params) {
26321
26327
  gearBtn.addEventListener("click", openIntervalConfigModal);
26322
26328
  }
26323
26329
  if (customerId) await loadCheckDeviceInterval();
26330
+ const useCheckDeviceOnOpen = !!centralId && !sessionStorage.getItem("rtt_check_device_disabled");
26331
+ if (useCheckDeviceOnOpen) {
26332
+ startCountdown(checkDeviceWaitMs);
26333
+ try {
26334
+ await fetch(
26335
+ `https://${centralId}.y.myio.com.br/api/check_device/${deviceCheckName}`,
26336
+ { signal: AbortSignal.timeout(1e4) }
26337
+ );
26338
+ centralStatus = "ok";
26339
+ checkDeviceHistory.push({ ts: Date.now(), status: "ok" });
26340
+ } catch (e) {
26341
+ console.warn("[RTT] check_device (open) error:", e?.message ?? e);
26342
+ centralStatus = "offline";
26343
+ checkDeviceHistory.push({ ts: Date.now(), status: "offline" });
26344
+ }
26345
+ if (checkDeviceHistory.length > MAX_CHECK_DEVICE_HISTORY) checkDeviceHistory.shift();
26346
+ updateStatusBadges();
26347
+ await new Promise((r) => setTimeout(r, checkDeviceWaitMs));
26348
+ clearCountdown();
26349
+ }
26324
26350
  await refreshData();
26351
+ isFirstTick = false;
26325
26352
  scheduleCheckDeviceTick();
26326
26353
  return {
26327
26354
  destroy: closeModal2
@@ -108290,6 +108317,75 @@ var OPERATIONAL_HEADER_DEVICES_GRID_STYLES = `
108290
108317
  font-size: 18px;
108291
108318
  }
108292
108319
 
108320
+ /* ========== Hover Expand Effect ========== */
108321
+ .ohg-header-v2 .ohg-col,
108322
+ .ohg-header-v2 .ohg-sub-col {
108323
+ transition: transform 0.25s cubic-bezier(0.34, 1.56, 0.64, 1),
108324
+ box-shadow 0.22s ease,
108325
+ background 0.18s ease;
108326
+ position: relative;
108327
+ z-index: 1;
108328
+ cursor: default;
108329
+ }
108330
+
108331
+ .ohg-header-v2 .ohg-col .ohg-col-title,
108332
+ .ohg-header-v2 .ohg-col .ohg-col-value,
108333
+ .ohg-header-v2 .ohg-sub-col .ohg-sub-label,
108334
+ .ohg-header-v2 .ohg-sub-col .ohg-sub-value {
108335
+ transition: font-size 0.25s cubic-bezier(0.34, 1.56, 0.64, 1);
108336
+ }
108337
+
108338
+ .ohg-header-v2 .ohg-col:hover {
108339
+ transform: scale(1.18);
108340
+ z-index: 20;
108341
+ border-radius: 6px;
108342
+ box-shadow: 0 8px 28px rgba(0, 0, 0, 0.5), 0 0 0 1px rgba(139, 92, 246, 0.35);
108343
+ background: rgba(255, 255, 255, 0.07) !important;
108344
+ }
108345
+
108346
+ .ohg-header-v2 .ohg-col:hover .ohg-col-title {
108347
+ font-size: 10px;
108348
+ }
108349
+
108350
+ .ohg-header-v2 .ohg-col:hover .ohg-col-value {
108351
+ font-size: 22px;
108352
+ }
108353
+
108354
+ .ohg-header-v2 .ohg-col-total:hover .ohg-col-value {
108355
+ font-size: 28px;
108356
+ }
108357
+
108358
+ .ohg-header-v2 .ohg-col-availability:hover .ohg-col-value {
108359
+ font-size: 28px;
108360
+ }
108361
+
108362
+ .ohg-header-v2 .ohg-sub-col:hover {
108363
+ transform: scale(1.22);
108364
+ z-index: 20;
108365
+ border-radius: 5px;
108366
+ box-shadow: 0 6px 22px rgba(0, 0, 0, 0.45), 0 0 0 1px rgba(255, 255, 255, 0.1);
108367
+ background: rgba(255, 255, 255, 0.08) !important;
108368
+ }
108369
+
108370
+ .ohg-header-v2 .ohg-sub-col:hover .ohg-sub-label {
108371
+ font-size: 9px;
108372
+ }
108373
+
108374
+ .ohg-header-v2 .ohg-sub-col:hover .ohg-sub-value {
108375
+ font-size: 20px;
108376
+ }
108377
+
108378
+ /* Light mode hover adjustments */
108379
+ .ohg-header-v2.ohg-header--light .ohg-col:hover {
108380
+ box-shadow: 0 8px 28px rgba(0, 0, 0, 0.15), 0 0 0 1px rgba(139, 92, 246, 0.4);
108381
+ background: rgba(0, 0, 0, 0.04) !important;
108382
+ }
108383
+
108384
+ .ohg-header-v2.ohg-header--light .ohg-sub-col:hover {
108385
+ box-shadow: 0 6px 22px rgba(0, 0, 0, 0.12), 0 0 0 1px rgba(139, 92, 246, 0.3);
108386
+ background: rgba(0, 0, 0, 0.04) !important;
108387
+ }
108388
+
108293
108389
  /* Actions Column */
108294
108390
  .ohg-header-v2 .ohg-col-actions {
108295
108391
  display: flex;
package/dist/index.d.cts CHANGED
@@ -14585,7 +14585,7 @@ declare class OperationalHeaderDevicesGridView {
14585
14585
  * RFC-0152: OperationalHeaderDevicesGrid Component Styles
14586
14586
  * Premium CSS-in-JS styles for the operational stats header
14587
14587
  */
14588
- declare const OPERATIONAL_HEADER_DEVICES_GRID_STYLES = "\n /* RFC-0152: OperationalHeaderDevicesGrid - Premium Header V2 */\n .ohg-header {\n display: flex !important;\n flex-direction: row !important;\n align-items: stretch;\n gap: 0;\n padding: 0;\n background: var(--card-bg, #1e293b);\n border-radius: 8px;\n margin-bottom: 12px;\n overflow: hidden;\n min-height: 56px;\n }\n\n /* ========== V2 Layout ========== */\n .ohg-header-v2 {\n min-height: auto;\n overflow-x: auto;\n scrollbar-width: thin;\n scrollbar-color: var(--card-bd, #334155) transparent;\n }\n\n .ohg-header-v2::-webkit-scrollbar {\n height: 4px;\n }\n\n .ohg-header-v2::-webkit-scrollbar-track {\n background: transparent;\n }\n\n .ohg-header-v2::-webkit-scrollbar-thumb {\n background: var(--card-bd, #334155);\n border-radius: 2px;\n }\n\n /* Single Column (TOTAL, OFFLINE, MTBF, MTTR, DISP) */\n .ohg-header-v2 .ohg-col {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 6px 8px;\n border-right: 1px solid var(--card-bd, #334155);\n min-width: 60px;\n flex: 1 1 auto;\n }\n\n .ohg-header-v2 .ohg-col-title {\n font-size: 8px;\n font-weight: 600;\n color: var(--ink-2, #94a3b8);\n text-transform: uppercase;\n letter-spacing: 0.2px;\n white-space: nowrap;\n margin-bottom: 2px;\n }\n\n .ohg-header-v2 .ohg-col-value {\n font-size: 14px;\n font-weight: 700;\n color: var(--ink-1, #f1f5f9);\n }\n\n /* Column Groups (ONLINE, MANUTEN\u00C7\u00C3O) */\n .ohg-header-v2 .ohg-col-group {\n display: flex;\n flex-direction: column;\n border-right: 1px solid var(--card-bd, #334155);\n flex: 2 1 auto;\n }\n\n .ohg-header-v2 .ohg-group-title {\n font-size: 8px;\n font-weight: 600;\n color: var(--ink-2, #94a3b8);\n text-transform: uppercase;\n letter-spacing: 0.2px;\n text-align: center;\n padding: 4px 6px 3px;\n border-bottom: 1px solid var(--card-bd, #334155);\n background: rgba(255,255,255,0.02);\n }\n\n .ohg-header-v2 .ohg-group-items {\n display: flex;\n flex: 1;\n }\n\n .ohg-header-v2 .ohg-sub-col {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 4px 6px;\n border-right: 1px solid var(--card-bd, #334155);\n min-width: 45px;\n flex: 1 1 auto;\n }\n\n .ohg-header-v2 .ohg-sub-col:last-child {\n border-right: none;\n }\n\n .ohg-header-v2 .ohg-sub-label {\n font-size: 7px;\n color: var(--ink-2, #94a3b8);\n text-transform: uppercase;\n letter-spacing: 0.1px;\n white-space: nowrap;\n margin-bottom: 1px;\n }\n\n .ohg-header-v2 .ohg-sub-value {\n font-size: 12px;\n font-weight: 700;\n color: var(--ink-1, #f1f5f9);\n }\n\n /* TOTAL Column */\n .ohg-header-v2 .ohg-col-total {\n background: rgba(139, 92, 246, 0.1);\n min-width: 65px;\n }\n .ohg-header-v2 .ohg-col-total .ohg-col-value {\n color: #a78bfa;\n font-size: 18px;\n }\n\n /* ONLINE Group - Green tones */\n .ohg-header-v2 .ohg-col-online {\n background: rgba(34, 197, 94, 0.05);\n }\n .ohg-header-v2 .ohg-col-online .ohg-group-title {\n color: #22c55e;\n background: rgba(34, 197, 94, 0.1);\n }\n .ohg-header-v2 .ohg-sub-col.standby .ohg-sub-value { color: #94a3b8; }\n .ohg-header-v2 .ohg-sub-col.normal .ohg-sub-value { color: #22c55e; }\n .ohg-header-v2 .ohg-sub-col.alert .ohg-sub-value { color: #eab308; }\n .ohg-header-v2 .ohg-sub-col.failure .ohg-sub-value { color: #ef4444; }\n\n /* MANUTEN\u00C7\u00C3O Group - Orange tones */\n .ohg-header-v2 .ohg-col-maintenance {\n background: rgba(249, 115, 22, 0.05);\n }\n .ohg-header-v2 .ohg-col-maintenance .ohg-group-title {\n color: #f97316;\n background: rgba(249, 115, 22, 0.1);\n }\n .ohg-header-v2 .ohg-sub-col.maint-online .ohg-sub-value { color: #22c55e; }\n .ohg-header-v2 .ohg-sub-col.maint-offline .ohg-sub-value { color: #ef4444; }\n\n /* OFFLINE Column */\n .ohg-header-v2 .ohg-col-offline {\n background: rgba(239, 68, 68, 0.05);\n }\n .ohg-header-v2 .ohg-col-offline .ohg-col-value {\n color: #ef4444;\n }\n\n /* MTBF Column */\n .ohg-header-v2 .ohg-col-mtbf {\n background: rgba(59, 130, 246, 0.05);\n }\n .ohg-header-v2 .ohg-col-mtbf .ohg-col-value {\n color: #3b82f6;\n }\n\n /* MTTR Column */\n .ohg-header-v2 .ohg-col-mttr {\n background: rgba(245, 158, 11, 0.05);\n }\n .ohg-header-v2 .ohg-col-mttr .ohg-col-value {\n color: #f59e0b;\n }\n\n /* DISP. M\u00C9DIA Column */\n .ohg-header-v2 .ohg-col-availability {\n background: linear-gradient(135deg, rgba(139, 92, 246, 0.1) 0%, rgba(139, 92, 246, 0.15) 100%);\n }\n .ohg-header-v2 .ohg-col-availability .ohg-col-value {\n color: #8b5cf6;\n font-size: 18px;\n }\n\n /* Actions Column */\n .ohg-header-v2 .ohg-col-actions {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 10px;\n border-left: 1px solid var(--card-bd, #334155);\n flex: 0 0 auto;\n }\n\n /* ========== Legacy V1 Styles ========== */\n /* Title Section */\n .ohg-header .ohg-title-section {\n display: flex;\n align-items: center;\n padding: 8px 16px;\n border-right: 1px solid var(--card-bd, #334155);\n min-width: 180px;\n }\n\n .ohg-header .ohg-title {\n font-size: 13px;\n font-weight: 600;\n color: var(--ink-1, #f1f5f9);\n white-space: nowrap;\n }\n\n .ohg-header .ohg-count {\n font-size: 11px;\n color: var(--ink-2, #94a3b8);\n margin-left: 8px;\n background: var(--card-bd, #334155);\n padding: 2px 8px;\n border-radius: 10px;\n }\n\n /* Stat Items */\n .ohg-header .stat-item {\n display: flex !important;\n flex-direction: column !important;\n justify-content: center;\n gap: 2px;\n flex: 1 1 0;\n min-width: 90px;\n padding: 8px 14px;\n border-right: 1px solid var(--card-bd, #334155);\n }\n\n .ohg-header .stat-item:last-of-type {\n border-right: none;\n }\n\n .ohg-header .stat-label {\n font-size: 9px;\n color: var(--ink-2, #94a3b8);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n white-space: nowrap;\n }\n\n .ohg-header .stat-value {\n font-size: 16px;\n font-weight: 700;\n color: var(--ink-1, #f1f5f9);\n }\n\n /* Status-specific colors */\n .ohg-header .stat-item.online .stat-value {\n color: #22c55e;\n }\n\n .ohg-header .stat-item.offline .stat-value {\n color: #ef4444;\n }\n\n .ohg-header .stat-item.maintenance .stat-value {\n color: #f97316;\n }\n\n .ohg-header .stat-item.warning .stat-value {\n color: #eab308;\n }\n\n /* Availability highlight */\n .ohg-header .stat-item.availability {\n flex: 1.2 1 0;\n background: linear-gradient(135deg, rgba(139, 92, 246, 0.1) 0%, rgba(139, 92, 246, 0.2) 100%);\n border-left: 2px solid #8b5cf6;\n border-right: 2px solid #8b5cf6;\n }\n\n .ohg-header .stat-item.availability .stat-value {\n color: #8b5cf6;\n font-size: 18px;\n }\n\n /* Filter Actions Section */\n .ohg-header .filter-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border-left: 1px solid var(--card-bd, #334155);\n margin-left: auto;\n }\n\n /* Search Wrap */\n .ohg-header .search-wrap,\n .ohg-header-v2 .search-wrap {\n display: none;\n overflow: hidden;\n transition: all 0.2s ease;\n }\n\n .ohg-header .search-wrap.active,\n .ohg-header-v2 .search-wrap.active {\n display: block;\n }\n\n .ohg-header .search-wrap input,\n .ohg-header-v2 .search-wrap input {\n padding: 6px 10px;\n border: 1px solid var(--card-bd, #334155);\n border-radius: 6px;\n background: transparent;\n color: var(--ink-1, #f1f5f9);\n font-size: 11px;\n width: 140px;\n }\n\n .ohg-header .search-wrap input:focus,\n .ohg-header-v2 .search-wrap input:focus {\n outline: none;\n border-color: #8b5cf6;\n }\n\n .ohg-header .search-wrap input::placeholder,\n .ohg-header-v2 .search-wrap input::placeholder {\n color: var(--ink-2, #94a3b8);\n }\n\n /* Icon Buttons */\n .ohg-header .icon-btn,\n .ohg-header-v2 .icon-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: 1px solid var(--card-bd, #334155);\n border-radius: 6px;\n background: transparent;\n color: var(--ink-2, #94a3b8);\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .ohg-header .icon-btn.filter-btn,\n .ohg-header-v2 .icon-btn.filter-btn {\n background: #3e1a7d;\n border-color: #3e1a7d;\n color: #ffffff;\n }\n\n .ohg-header .icon-btn.filter-btn:hover,\n .ohg-header-v2 .icon-btn.filter-btn:hover {\n filter: brightness(1.1);\n background: #4b1d96;\n border-color: #4b1d96;\n }\n\n .ohg-header .icon-btn:hover,\n .ohg-header-v2 .icon-btn:hover {\n background: #8b5cf6;\n border-color: #8b5cf6;\n color: white;\n }\n\n .ohg-header .icon-btn svg,\n .ohg-header-v2 .icon-btn svg {\n width: 16px;\n height: 16px;\n fill: currentColor;\n display: block;\n }\n\n .ohg-header .icon-btn .icon-minimize,\n .ohg-header-v2 .icon-btn .icon-minimize {\n display: none;\n }\n\n .ohg-header .icon-btn .icon-maximize,\n .ohg-header-v2 .icon-btn .icon-maximize {\n display: block;\n }\n\n /* Light mode */\n .ohg-header--light {\n background: #ffffff;\n border: 1px solid #e2e8f0;\n }\n\n .ohg-header--light .ohg-title-section {\n border-color: #e2e8f0;\n }\n\n .ohg-header--light .ohg-title {\n color: #1e293b;\n }\n\n .ohg-header--light .ohg-count {\n background: #e2e8f0;\n color: #64748b;\n }\n\n .ohg-header--light .stat-item {\n border-color: #e2e8f0;\n }\n\n .ohg-header--light .stat-item.availability {\n background: linear-gradient(135deg, rgba(139, 92, 246, 0.08) 0%, rgba(139, 92, 246, 0.15) 100%);\n border-left-color: #8b5cf6;\n border-right-color: #8b5cf6;\n }\n\n .ohg-header--light .stat-label {\n color: #64748b;\n }\n\n .ohg-header--light .stat-value {\n color: #1e293b;\n }\n\n .ohg-header--light .filter-actions {\n border-color: #e2e8f0;\n }\n\n .ohg-header--light .search-wrap input {\n background: #f8fafc;\n border-color: #cbd5e1;\n color: #1e293b;\n }\n\n .ohg-header--light .icon-btn {\n border-color: #cbd5e1;\n color: #64748b;\n }\n\n .ohg-header--light .icon-btn.filter-btn {\n background: #e9d5ff;\n border-color: #e9d5ff;\n color: #5b21b6;\n }\n\n .ohg-header--light .icon-btn.filter-btn:hover {\n background: #ddd6fe;\n border-color: #ddd6fe;\n color: #4c1d95;\n }\n\n /* Light mode V2 */\n .ohg-header-v2.ohg-header--light .ohg-col {\n border-color: #e2e8f0;\n }\n\n .ohg-header-v2.ohg-header--light .ohg-col-title,\n .ohg-header-v2.ohg-header--light .ohg-sub-label {\n color: #64748b;\n }\n\n .ohg-header-v2.ohg-header--light .ohg-col-value,\n .ohg-header-v2.ohg-header--light .ohg-sub-value {\n color: #1e293b;\n }\n\n .ohg-header-v2.ohg-header--light .ohg-col-group {\n border-color: #e2e8f0;\n }\n\n .ohg-header-v2.ohg-header--light .ohg-group-title {\n border-color: #e2e8f0;\n }\n\n .ohg-header-v2.ohg-header--light .ohg-sub-col {\n border-color: #e2e8f0;\n }\n\n .ohg-header-v2.ohg-header--light .ohg-col-actions {\n border-color: #e2e8f0;\n }\n\n /* Maximized state */\n .operational-grid-wrap.maximized {\n position: fixed !important;\n inset: 0 !important;\n z-index: 99999 !important;\n width: 100vw !important;\n height: 100vh !important;\n background: var(--card-bg, #0f172a) !important;\n border-radius: 0 !important;\n overflow: auto !important;\n padding: 16px !important;\n }\n\n .operational-grid-wrap.maximized .ohg-header {\n position: sticky;\n top: 0;\n z-index: 10;\n margin-bottom: 16px;\n }\n\n .operational-grid-wrap.maximized .ohg-header .icon-btn .icon-maximize {\n display: none;\n }\n\n .operational-grid-wrap.maximized .ohg-header .icon-btn .icon-minimize {\n display: block;\n }\n\n /* Responsive */\n @media (max-width: 1024px) {\n .ohg-header {\n flex-wrap: wrap;\n }\n\n .ohg-header .ohg-title-section {\n flex: 1 1 100%;\n border-right: none;\n border-bottom: 1px solid var(--card-bd, #334155);\n }\n\n .ohg-header .filter-actions {\n margin-left: 0;\n flex: 1 1 100%;\n justify-content: flex-end;\n border-left: none;\n border-top: 1px solid var(--card-bd, #334155);\n }\n }\n\n @media (max-width: 768px) {\n .ohg-header .stat-item {\n min-width: 60px;\n padding: 6px 10px;\n }\n\n .ohg-header .stat-value {\n font-size: 14px;\n }\n\n .ohg-header .stat-item.availability .stat-value {\n font-size: 16px;\n }\n\n .ohg-header .customer-select {\n min-width: 100px;\n }\n\n .ohg-header .search-wrap input {\n width: 120px;\n }\n }\n";
14588
+ declare const OPERATIONAL_HEADER_DEVICES_GRID_STYLES = "\n /* RFC-0152: OperationalHeaderDevicesGrid - Premium Header V2 */\n .ohg-header {\n display: flex !important;\n flex-direction: row !important;\n align-items: stretch;\n gap: 0;\n padding: 0;\n background: var(--card-bg, #1e293b);\n border-radius: 8px;\n margin-bottom: 12px;\n overflow: hidden;\n min-height: 56px;\n }\n\n /* ========== V2 Layout ========== */\n .ohg-header-v2 {\n min-height: auto;\n overflow-x: auto;\n scrollbar-width: thin;\n scrollbar-color: var(--card-bd, #334155) transparent;\n }\n\n .ohg-header-v2::-webkit-scrollbar {\n height: 4px;\n }\n\n .ohg-header-v2::-webkit-scrollbar-track {\n background: transparent;\n }\n\n .ohg-header-v2::-webkit-scrollbar-thumb {\n background: var(--card-bd, #334155);\n border-radius: 2px;\n }\n\n /* Single Column (TOTAL, OFFLINE, MTBF, MTTR, DISP) */\n .ohg-header-v2 .ohg-col {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 6px 8px;\n border-right: 1px solid var(--card-bd, #334155);\n min-width: 60px;\n flex: 1 1 auto;\n }\n\n .ohg-header-v2 .ohg-col-title {\n font-size: 8px;\n font-weight: 600;\n color: var(--ink-2, #94a3b8);\n text-transform: uppercase;\n letter-spacing: 0.2px;\n white-space: nowrap;\n margin-bottom: 2px;\n }\n\n .ohg-header-v2 .ohg-col-value {\n font-size: 14px;\n font-weight: 700;\n color: var(--ink-1, #f1f5f9);\n }\n\n /* Column Groups (ONLINE, MANUTEN\u00C7\u00C3O) */\n .ohg-header-v2 .ohg-col-group {\n display: flex;\n flex-direction: column;\n border-right: 1px solid var(--card-bd, #334155);\n flex: 2 1 auto;\n }\n\n .ohg-header-v2 .ohg-group-title {\n font-size: 8px;\n font-weight: 600;\n color: var(--ink-2, #94a3b8);\n text-transform: uppercase;\n letter-spacing: 0.2px;\n text-align: center;\n padding: 4px 6px 3px;\n border-bottom: 1px solid var(--card-bd, #334155);\n background: rgba(255,255,255,0.02);\n }\n\n .ohg-header-v2 .ohg-group-items {\n display: flex;\n flex: 1;\n }\n\n .ohg-header-v2 .ohg-sub-col {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 4px 6px;\n border-right: 1px solid var(--card-bd, #334155);\n min-width: 45px;\n flex: 1 1 auto;\n }\n\n .ohg-header-v2 .ohg-sub-col:last-child {\n border-right: none;\n }\n\n .ohg-header-v2 .ohg-sub-label {\n font-size: 7px;\n color: var(--ink-2, #94a3b8);\n text-transform: uppercase;\n letter-spacing: 0.1px;\n white-space: nowrap;\n margin-bottom: 1px;\n }\n\n .ohg-header-v2 .ohg-sub-value {\n font-size: 12px;\n font-weight: 700;\n color: var(--ink-1, #f1f5f9);\n }\n\n /* TOTAL Column */\n .ohg-header-v2 .ohg-col-total {\n background: rgba(139, 92, 246, 0.1);\n min-width: 65px;\n }\n .ohg-header-v2 .ohg-col-total .ohg-col-value {\n color: #a78bfa;\n font-size: 18px;\n }\n\n /* ONLINE Group - Green tones */\n .ohg-header-v2 .ohg-col-online {\n background: rgba(34, 197, 94, 0.05);\n }\n .ohg-header-v2 .ohg-col-online .ohg-group-title {\n color: #22c55e;\n background: rgba(34, 197, 94, 0.1);\n }\n .ohg-header-v2 .ohg-sub-col.standby .ohg-sub-value { color: #94a3b8; }\n .ohg-header-v2 .ohg-sub-col.normal .ohg-sub-value { color: #22c55e; }\n .ohg-header-v2 .ohg-sub-col.alert .ohg-sub-value { color: #eab308; }\n .ohg-header-v2 .ohg-sub-col.failure .ohg-sub-value { color: #ef4444; }\n\n /* MANUTEN\u00C7\u00C3O Group - Orange tones */\n .ohg-header-v2 .ohg-col-maintenance {\n background: rgba(249, 115, 22, 0.05);\n }\n .ohg-header-v2 .ohg-col-maintenance .ohg-group-title {\n color: #f97316;\n background: rgba(249, 115, 22, 0.1);\n }\n .ohg-header-v2 .ohg-sub-col.maint-online .ohg-sub-value { color: #22c55e; }\n .ohg-header-v2 .ohg-sub-col.maint-offline .ohg-sub-value { color: #ef4444; }\n\n /* OFFLINE Column */\n .ohg-header-v2 .ohg-col-offline {\n background: rgba(239, 68, 68, 0.05);\n }\n .ohg-header-v2 .ohg-col-offline .ohg-col-value {\n color: #ef4444;\n }\n\n /* MTBF Column */\n .ohg-header-v2 .ohg-col-mtbf {\n background: rgba(59, 130, 246, 0.05);\n }\n .ohg-header-v2 .ohg-col-mtbf .ohg-col-value {\n color: #3b82f6;\n }\n\n /* MTTR Column */\n .ohg-header-v2 .ohg-col-mttr {\n background: rgba(245, 158, 11, 0.05);\n }\n .ohg-header-v2 .ohg-col-mttr .ohg-col-value {\n color: #f59e0b;\n }\n\n /* DISP. M\u00C9DIA Column */\n .ohg-header-v2 .ohg-col-availability {\n background: linear-gradient(135deg, rgba(139, 92, 246, 0.1) 0%, rgba(139, 92, 246, 0.15) 100%);\n }\n .ohg-header-v2 .ohg-col-availability .ohg-col-value {\n color: #8b5cf6;\n font-size: 18px;\n }\n\n /* ========== Hover Expand Effect ========== */\n .ohg-header-v2 .ohg-col,\n .ohg-header-v2 .ohg-sub-col {\n transition: transform 0.25s cubic-bezier(0.34, 1.56, 0.64, 1),\n box-shadow 0.22s ease,\n background 0.18s ease;\n position: relative;\n z-index: 1;\n cursor: default;\n }\n\n .ohg-header-v2 .ohg-col .ohg-col-title,\n .ohg-header-v2 .ohg-col .ohg-col-value,\n .ohg-header-v2 .ohg-sub-col .ohg-sub-label,\n .ohg-header-v2 .ohg-sub-col .ohg-sub-value {\n transition: font-size 0.25s cubic-bezier(0.34, 1.56, 0.64, 1);\n }\n\n .ohg-header-v2 .ohg-col:hover {\n transform: scale(1.18);\n z-index: 20;\n border-radius: 6px;\n box-shadow: 0 8px 28px rgba(0, 0, 0, 0.5), 0 0 0 1px rgba(139, 92, 246, 0.35);\n background: rgba(255, 255, 255, 0.07) !important;\n }\n\n .ohg-header-v2 .ohg-col:hover .ohg-col-title {\n font-size: 10px;\n }\n\n .ohg-header-v2 .ohg-col:hover .ohg-col-value {\n font-size: 22px;\n }\n\n .ohg-header-v2 .ohg-col-total:hover .ohg-col-value {\n font-size: 28px;\n }\n\n .ohg-header-v2 .ohg-col-availability:hover .ohg-col-value {\n font-size: 28px;\n }\n\n .ohg-header-v2 .ohg-sub-col:hover {\n transform: scale(1.22);\n z-index: 20;\n border-radius: 5px;\n box-shadow: 0 6px 22px rgba(0, 0, 0, 0.45), 0 0 0 1px rgba(255, 255, 255, 0.1);\n background: rgba(255, 255, 255, 0.08) !important;\n }\n\n .ohg-header-v2 .ohg-sub-col:hover .ohg-sub-label {\n font-size: 9px;\n }\n\n .ohg-header-v2 .ohg-sub-col:hover .ohg-sub-value {\n font-size: 20px;\n }\n\n /* Light mode hover adjustments */\n .ohg-header-v2.ohg-header--light .ohg-col:hover {\n box-shadow: 0 8px 28px rgba(0, 0, 0, 0.15), 0 0 0 1px rgba(139, 92, 246, 0.4);\n background: rgba(0, 0, 0, 0.04) !important;\n }\n\n .ohg-header-v2.ohg-header--light .ohg-sub-col:hover {\n box-shadow: 0 6px 22px rgba(0, 0, 0, 0.12), 0 0 0 1px rgba(139, 92, 246, 0.3);\n background: rgba(0, 0, 0, 0.04) !important;\n }\n\n /* Actions Column */\n .ohg-header-v2 .ohg-col-actions {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 10px;\n border-left: 1px solid var(--card-bd, #334155);\n flex: 0 0 auto;\n }\n\n /* ========== Legacy V1 Styles ========== */\n /* Title Section */\n .ohg-header .ohg-title-section {\n display: flex;\n align-items: center;\n padding: 8px 16px;\n border-right: 1px solid var(--card-bd, #334155);\n min-width: 180px;\n }\n\n .ohg-header .ohg-title {\n font-size: 13px;\n font-weight: 600;\n color: var(--ink-1, #f1f5f9);\n white-space: nowrap;\n }\n\n .ohg-header .ohg-count {\n font-size: 11px;\n color: var(--ink-2, #94a3b8);\n margin-left: 8px;\n background: var(--card-bd, #334155);\n padding: 2px 8px;\n border-radius: 10px;\n }\n\n /* Stat Items */\n .ohg-header .stat-item {\n display: flex !important;\n flex-direction: column !important;\n justify-content: center;\n gap: 2px;\n flex: 1 1 0;\n min-width: 90px;\n padding: 8px 14px;\n border-right: 1px solid var(--card-bd, #334155);\n }\n\n .ohg-header .stat-item:last-of-type {\n border-right: none;\n }\n\n .ohg-header .stat-label {\n font-size: 9px;\n color: var(--ink-2, #94a3b8);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n white-space: nowrap;\n }\n\n .ohg-header .stat-value {\n font-size: 16px;\n font-weight: 700;\n color: var(--ink-1, #f1f5f9);\n }\n\n /* Status-specific colors */\n .ohg-header .stat-item.online .stat-value {\n color: #22c55e;\n }\n\n .ohg-header .stat-item.offline .stat-value {\n color: #ef4444;\n }\n\n .ohg-header .stat-item.maintenance .stat-value {\n color: #f97316;\n }\n\n .ohg-header .stat-item.warning .stat-value {\n color: #eab308;\n }\n\n /* Availability highlight */\n .ohg-header .stat-item.availability {\n flex: 1.2 1 0;\n background: linear-gradient(135deg, rgba(139, 92, 246, 0.1) 0%, rgba(139, 92, 246, 0.2) 100%);\n border-left: 2px solid #8b5cf6;\n border-right: 2px solid #8b5cf6;\n }\n\n .ohg-header .stat-item.availability .stat-value {\n color: #8b5cf6;\n font-size: 18px;\n }\n\n /* Filter Actions Section */\n .ohg-header .filter-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border-left: 1px solid var(--card-bd, #334155);\n margin-left: auto;\n }\n\n /* Search Wrap */\n .ohg-header .search-wrap,\n .ohg-header-v2 .search-wrap {\n display: none;\n overflow: hidden;\n transition: all 0.2s ease;\n }\n\n .ohg-header .search-wrap.active,\n .ohg-header-v2 .search-wrap.active {\n display: block;\n }\n\n .ohg-header .search-wrap input,\n .ohg-header-v2 .search-wrap input {\n padding: 6px 10px;\n border: 1px solid var(--card-bd, #334155);\n border-radius: 6px;\n background: transparent;\n color: var(--ink-1, #f1f5f9);\n font-size: 11px;\n width: 140px;\n }\n\n .ohg-header .search-wrap input:focus,\n .ohg-header-v2 .search-wrap input:focus {\n outline: none;\n border-color: #8b5cf6;\n }\n\n .ohg-header .search-wrap input::placeholder,\n .ohg-header-v2 .search-wrap input::placeholder {\n color: var(--ink-2, #94a3b8);\n }\n\n /* Icon Buttons */\n .ohg-header .icon-btn,\n .ohg-header-v2 .icon-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: 1px solid var(--card-bd, #334155);\n border-radius: 6px;\n background: transparent;\n color: var(--ink-2, #94a3b8);\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .ohg-header .icon-btn.filter-btn,\n .ohg-header-v2 .icon-btn.filter-btn {\n background: #3e1a7d;\n border-color: #3e1a7d;\n color: #ffffff;\n }\n\n .ohg-header .icon-btn.filter-btn:hover,\n .ohg-header-v2 .icon-btn.filter-btn:hover {\n filter: brightness(1.1);\n background: #4b1d96;\n border-color: #4b1d96;\n }\n\n .ohg-header .icon-btn:hover,\n .ohg-header-v2 .icon-btn:hover {\n background: #8b5cf6;\n border-color: #8b5cf6;\n color: white;\n }\n\n .ohg-header .icon-btn svg,\n .ohg-header-v2 .icon-btn svg {\n width: 16px;\n height: 16px;\n fill: currentColor;\n display: block;\n }\n\n .ohg-header .icon-btn .icon-minimize,\n .ohg-header-v2 .icon-btn .icon-minimize {\n display: none;\n }\n\n .ohg-header .icon-btn .icon-maximize,\n .ohg-header-v2 .icon-btn .icon-maximize {\n display: block;\n }\n\n /* Light mode */\n .ohg-header--light {\n background: #ffffff;\n border: 1px solid #e2e8f0;\n }\n\n .ohg-header--light .ohg-title-section {\n border-color: #e2e8f0;\n }\n\n .ohg-header--light .ohg-title {\n color: #1e293b;\n }\n\n .ohg-header--light .ohg-count {\n background: #e2e8f0;\n color: #64748b;\n }\n\n .ohg-header--light .stat-item {\n border-color: #e2e8f0;\n }\n\n .ohg-header--light .stat-item.availability {\n background: linear-gradient(135deg, rgba(139, 92, 246, 0.08) 0%, rgba(139, 92, 246, 0.15) 100%);\n border-left-color: #8b5cf6;\n border-right-color: #8b5cf6;\n }\n\n .ohg-header--light .stat-label {\n color: #64748b;\n }\n\n .ohg-header--light .stat-value {\n color: #1e293b;\n }\n\n .ohg-header--light .filter-actions {\n border-color: #e2e8f0;\n }\n\n .ohg-header--light .search-wrap input {\n background: #f8fafc;\n border-color: #cbd5e1;\n color: #1e293b;\n }\n\n .ohg-header--light .icon-btn {\n border-color: #cbd5e1;\n color: #64748b;\n }\n\n .ohg-header--light .icon-btn.filter-btn {\n background: #e9d5ff;\n border-color: #e9d5ff;\n color: #5b21b6;\n }\n\n .ohg-header--light .icon-btn.filter-btn:hover {\n background: #ddd6fe;\n border-color: #ddd6fe;\n color: #4c1d95;\n }\n\n /* Light mode V2 */\n .ohg-header-v2.ohg-header--light .ohg-col {\n border-color: #e2e8f0;\n }\n\n .ohg-header-v2.ohg-header--light .ohg-col-title,\n .ohg-header-v2.ohg-header--light .ohg-sub-label {\n color: #64748b;\n }\n\n .ohg-header-v2.ohg-header--light .ohg-col-value,\n .ohg-header-v2.ohg-header--light .ohg-sub-value {\n color: #1e293b;\n }\n\n .ohg-header-v2.ohg-header--light .ohg-col-group {\n border-color: #e2e8f0;\n }\n\n .ohg-header-v2.ohg-header--light .ohg-group-title {\n border-color: #e2e8f0;\n }\n\n .ohg-header-v2.ohg-header--light .ohg-sub-col {\n border-color: #e2e8f0;\n }\n\n .ohg-header-v2.ohg-header--light .ohg-col-actions {\n border-color: #e2e8f0;\n }\n\n /* Maximized state */\n .operational-grid-wrap.maximized {\n position: fixed !important;\n inset: 0 !important;\n z-index: 99999 !important;\n width: 100vw !important;\n height: 100vh !important;\n background: var(--card-bg, #0f172a) !important;\n border-radius: 0 !important;\n overflow: auto !important;\n padding: 16px !important;\n }\n\n .operational-grid-wrap.maximized .ohg-header {\n position: sticky;\n top: 0;\n z-index: 10;\n margin-bottom: 16px;\n }\n\n .operational-grid-wrap.maximized .ohg-header .icon-btn .icon-maximize {\n display: none;\n }\n\n .operational-grid-wrap.maximized .ohg-header .icon-btn .icon-minimize {\n display: block;\n }\n\n /* Responsive */\n @media (max-width: 1024px) {\n .ohg-header {\n flex-wrap: wrap;\n }\n\n .ohg-header .ohg-title-section {\n flex: 1 1 100%;\n border-right: none;\n border-bottom: 1px solid var(--card-bd, #334155);\n }\n\n .ohg-header .filter-actions {\n margin-left: 0;\n flex: 1 1 100%;\n justify-content: flex-end;\n border-left: none;\n border-top: 1px solid var(--card-bd, #334155);\n }\n }\n\n @media (max-width: 768px) {\n .ohg-header .stat-item {\n min-width: 60px;\n padding: 6px 10px;\n }\n\n .ohg-header .stat-value {\n font-size: 14px;\n }\n\n .ohg-header .stat-item.availability .stat-value {\n font-size: 16px;\n }\n\n .ohg-header .customer-select {\n min-width: 100px;\n }\n\n .ohg-header .search-wrap input {\n width: 120px;\n }\n }\n";
14589
14589
  declare function injectOperationalHeaderDevicesGridStyles(): void;
14590
14590
  declare function removeOperationalHeaderDevicesGridStyles(): void;
14591
14591
 
package/dist/index.js CHANGED
@@ -546,7 +546,7 @@ var init_template_card = __esm({
546
546
  // package.json
547
547
  var package_default = {
548
548
  name: "myio-js-library",
549
- version: "0.1.468",
549
+ version: "0.1.469",
550
550
  description: "A clean, standalone JS SDK for MYIO projects",
551
551
  license: "MIT",
552
552
  repository: "github:gh-myio/myio-js-library",
@@ -5045,6 +5045,12 @@ var MyIOSelectionStoreClass = class _MyIOSelectionStoreClass {
5045
5045
  ingestionId: entity.ingestionId || entityId,
5046
5046
  // ⭐ ADD: Store ingestionId for API calls
5047
5047
  customerName: entity.customerName || entity.ownerName || entity.centralName || "",
5048
+ // RFC-0157: Operational metrics for comparison modal
5049
+ domain: entity.domain || null,
5050
+ availability: entity.availability ?? null,
5051
+ mtbf: entity.mtbf ?? null,
5052
+ mttr: entity.mttr ?? null,
5053
+ equipmentType: entity.equipmentType || null,
5048
5054
  // Optional metadata passthrough (used by alarm comparisons)
5049
5055
  meta: entity.meta || entity.alarmMeta || null,
5050
5056
  alarm: entity.alarm || null
@@ -25728,7 +25734,28 @@ async function openRealTimeTelemetryModal(params) {
25728
25734
  gearBtn.addEventListener("click", openIntervalConfigModal);
25729
25735
  }
25730
25736
  if (customerId) await loadCheckDeviceInterval();
25737
+ const useCheckDeviceOnOpen = !!centralId && !sessionStorage.getItem("rtt_check_device_disabled");
25738
+ if (useCheckDeviceOnOpen) {
25739
+ startCountdown(checkDeviceWaitMs);
25740
+ try {
25741
+ await fetch(
25742
+ `https://${centralId}.y.myio.com.br/api/check_device/${deviceCheckName}`,
25743
+ { signal: AbortSignal.timeout(1e4) }
25744
+ );
25745
+ centralStatus = "ok";
25746
+ checkDeviceHistory.push({ ts: Date.now(), status: "ok" });
25747
+ } catch (e) {
25748
+ console.warn("[RTT] check_device (open) error:", e?.message ?? e);
25749
+ centralStatus = "offline";
25750
+ checkDeviceHistory.push({ ts: Date.now(), status: "offline" });
25751
+ }
25752
+ if (checkDeviceHistory.length > MAX_CHECK_DEVICE_HISTORY) checkDeviceHistory.shift();
25753
+ updateStatusBadges();
25754
+ await new Promise((r) => setTimeout(r, checkDeviceWaitMs));
25755
+ clearCountdown();
25756
+ }
25731
25757
  await refreshData();
25758
+ isFirstTick = false;
25732
25759
  scheduleCheckDeviceTick();
25733
25760
  return {
25734
25761
  destroy: closeModal2
@@ -107697,6 +107724,75 @@ var OPERATIONAL_HEADER_DEVICES_GRID_STYLES = `
107697
107724
  font-size: 18px;
107698
107725
  }
107699
107726
 
107727
+ /* ========== Hover Expand Effect ========== */
107728
+ .ohg-header-v2 .ohg-col,
107729
+ .ohg-header-v2 .ohg-sub-col {
107730
+ transition: transform 0.25s cubic-bezier(0.34, 1.56, 0.64, 1),
107731
+ box-shadow 0.22s ease,
107732
+ background 0.18s ease;
107733
+ position: relative;
107734
+ z-index: 1;
107735
+ cursor: default;
107736
+ }
107737
+
107738
+ .ohg-header-v2 .ohg-col .ohg-col-title,
107739
+ .ohg-header-v2 .ohg-col .ohg-col-value,
107740
+ .ohg-header-v2 .ohg-sub-col .ohg-sub-label,
107741
+ .ohg-header-v2 .ohg-sub-col .ohg-sub-value {
107742
+ transition: font-size 0.25s cubic-bezier(0.34, 1.56, 0.64, 1);
107743
+ }
107744
+
107745
+ .ohg-header-v2 .ohg-col:hover {
107746
+ transform: scale(1.18);
107747
+ z-index: 20;
107748
+ border-radius: 6px;
107749
+ box-shadow: 0 8px 28px rgba(0, 0, 0, 0.5), 0 0 0 1px rgba(139, 92, 246, 0.35);
107750
+ background: rgba(255, 255, 255, 0.07) !important;
107751
+ }
107752
+
107753
+ .ohg-header-v2 .ohg-col:hover .ohg-col-title {
107754
+ font-size: 10px;
107755
+ }
107756
+
107757
+ .ohg-header-v2 .ohg-col:hover .ohg-col-value {
107758
+ font-size: 22px;
107759
+ }
107760
+
107761
+ .ohg-header-v2 .ohg-col-total:hover .ohg-col-value {
107762
+ font-size: 28px;
107763
+ }
107764
+
107765
+ .ohg-header-v2 .ohg-col-availability:hover .ohg-col-value {
107766
+ font-size: 28px;
107767
+ }
107768
+
107769
+ .ohg-header-v2 .ohg-sub-col:hover {
107770
+ transform: scale(1.22);
107771
+ z-index: 20;
107772
+ border-radius: 5px;
107773
+ box-shadow: 0 6px 22px rgba(0, 0, 0, 0.45), 0 0 0 1px rgba(255, 255, 255, 0.1);
107774
+ background: rgba(255, 255, 255, 0.08) !important;
107775
+ }
107776
+
107777
+ .ohg-header-v2 .ohg-sub-col:hover .ohg-sub-label {
107778
+ font-size: 9px;
107779
+ }
107780
+
107781
+ .ohg-header-v2 .ohg-sub-col:hover .ohg-sub-value {
107782
+ font-size: 20px;
107783
+ }
107784
+
107785
+ /* Light mode hover adjustments */
107786
+ .ohg-header-v2.ohg-header--light .ohg-col:hover {
107787
+ box-shadow: 0 8px 28px rgba(0, 0, 0, 0.15), 0 0 0 1px rgba(139, 92, 246, 0.4);
107788
+ background: rgba(0, 0, 0, 0.04) !important;
107789
+ }
107790
+
107791
+ .ohg-header-v2.ohg-header--light .ohg-sub-col:hover {
107792
+ box-shadow: 0 6px 22px rgba(0, 0, 0, 0.12), 0 0 0 1px rgba(139, 92, 246, 0.3);
107793
+ background: rgba(0, 0, 0, 0.04) !important;
107794
+ }
107795
+
107700
107796
  /* Actions Column */
107701
107797
  .ohg-header-v2 .ohg-col-actions {
107702
107798
  display: flex;
@@ -4070,7 +4070,7 @@
4070
4070
 
4071
4071
  // package.json
4072
4072
  var package_default = {
4073
- version: "0.1.468"};
4073
+ version: "0.1.469"};
4074
4074
 
4075
4075
  // src/format/energy.ts
4076
4076
  function formatPower(value, decimals = 2) {
@@ -8497,6 +8497,12 @@
8497
8497
  ingestionId: entity.ingestionId || entityId,
8498
8498
  // ⭐ ADD: Store ingestionId for API calls
8499
8499
  customerName: entity.customerName || entity.ownerName || entity.centralName || "",
8500
+ // RFC-0157: Operational metrics for comparison modal
8501
+ domain: entity.domain || null,
8502
+ availability: entity.availability ?? null,
8503
+ mtbf: entity.mtbf ?? null,
8504
+ mttr: entity.mttr ?? null,
8505
+ equipmentType: entity.equipmentType || null,
8500
8506
  // Optional metadata passthrough (used by alarm comparisons)
8501
8507
  meta: entity.meta || entity.alarmMeta || null,
8502
8508
  alarm: entity.alarm || null
@@ -29115,7 +29121,28 @@
29115
29121
  gearBtn.addEventListener("click", openIntervalConfigModal);
29116
29122
  }
29117
29123
  if (customerId) await loadCheckDeviceInterval();
29124
+ const useCheckDeviceOnOpen = !!centralId && !sessionStorage.getItem("rtt_check_device_disabled");
29125
+ if (useCheckDeviceOnOpen) {
29126
+ startCountdown(checkDeviceWaitMs);
29127
+ try {
29128
+ await fetch(
29129
+ `https://${centralId}.y.myio.com.br/api/check_device/${deviceCheckName}`,
29130
+ { signal: AbortSignal.timeout(1e4) }
29131
+ );
29132
+ centralStatus = "ok";
29133
+ checkDeviceHistory.push({ ts: Date.now(), status: "ok" });
29134
+ } catch (e) {
29135
+ console.warn("[RTT] check_device (open) error:", e?.message ?? e);
29136
+ centralStatus = "offline";
29137
+ checkDeviceHistory.push({ ts: Date.now(), status: "offline" });
29138
+ }
29139
+ if (checkDeviceHistory.length > MAX_CHECK_DEVICE_HISTORY) checkDeviceHistory.shift();
29140
+ updateStatusBadges();
29141
+ await new Promise((r) => setTimeout(r, checkDeviceWaitMs));
29142
+ clearCountdown();
29143
+ }
29118
29144
  await refreshData();
29145
+ isFirstTick = false;
29119
29146
  scheduleCheckDeviceTick();
29120
29147
  return {
29121
29148
  destroy: closeModal2
@@ -110894,6 +110921,75 @@ Esta a\xE7\xE3o afeta todos os grupos que utilizam este canal.`
110894
110921
  font-size: 18px;
110895
110922
  }
110896
110923
 
110924
+ /* ========== Hover Expand Effect ========== */
110925
+ .ohg-header-v2 .ohg-col,
110926
+ .ohg-header-v2 .ohg-sub-col {
110927
+ transition: transform 0.25s cubic-bezier(0.34, 1.56, 0.64, 1),
110928
+ box-shadow 0.22s ease,
110929
+ background 0.18s ease;
110930
+ position: relative;
110931
+ z-index: 1;
110932
+ cursor: default;
110933
+ }
110934
+
110935
+ .ohg-header-v2 .ohg-col .ohg-col-title,
110936
+ .ohg-header-v2 .ohg-col .ohg-col-value,
110937
+ .ohg-header-v2 .ohg-sub-col .ohg-sub-label,
110938
+ .ohg-header-v2 .ohg-sub-col .ohg-sub-value {
110939
+ transition: font-size 0.25s cubic-bezier(0.34, 1.56, 0.64, 1);
110940
+ }
110941
+
110942
+ .ohg-header-v2 .ohg-col:hover {
110943
+ transform: scale(1.18);
110944
+ z-index: 20;
110945
+ border-radius: 6px;
110946
+ box-shadow: 0 8px 28px rgba(0, 0, 0, 0.5), 0 0 0 1px rgba(139, 92, 246, 0.35);
110947
+ background: rgba(255, 255, 255, 0.07) !important;
110948
+ }
110949
+
110950
+ .ohg-header-v2 .ohg-col:hover .ohg-col-title {
110951
+ font-size: 10px;
110952
+ }
110953
+
110954
+ .ohg-header-v2 .ohg-col:hover .ohg-col-value {
110955
+ font-size: 22px;
110956
+ }
110957
+
110958
+ .ohg-header-v2 .ohg-col-total:hover .ohg-col-value {
110959
+ font-size: 28px;
110960
+ }
110961
+
110962
+ .ohg-header-v2 .ohg-col-availability:hover .ohg-col-value {
110963
+ font-size: 28px;
110964
+ }
110965
+
110966
+ .ohg-header-v2 .ohg-sub-col:hover {
110967
+ transform: scale(1.22);
110968
+ z-index: 20;
110969
+ border-radius: 5px;
110970
+ box-shadow: 0 6px 22px rgba(0, 0, 0, 0.45), 0 0 0 1px rgba(255, 255, 255, 0.1);
110971
+ background: rgba(255, 255, 255, 0.08) !important;
110972
+ }
110973
+
110974
+ .ohg-header-v2 .ohg-sub-col:hover .ohg-sub-label {
110975
+ font-size: 9px;
110976
+ }
110977
+
110978
+ .ohg-header-v2 .ohg-sub-col:hover .ohg-sub-value {
110979
+ font-size: 20px;
110980
+ }
110981
+
110982
+ /* Light mode hover adjustments */
110983
+ .ohg-header-v2.ohg-header--light .ohg-col:hover {
110984
+ box-shadow: 0 8px 28px rgba(0, 0, 0, 0.15), 0 0 0 1px rgba(139, 92, 246, 0.4);
110985
+ background: rgba(0, 0, 0, 0.04) !important;
110986
+ }
110987
+
110988
+ .ohg-header-v2.ohg-header--light .ohg-sub-col:hover {
110989
+ box-shadow: 0 6px 22px rgba(0, 0, 0, 0.12), 0 0 0 1px rgba(139, 92, 246, 0.3);
110990
+ background: rgba(0, 0, 0, 0.04) !important;
110991
+ }
110992
+
110897
110993
  /* Actions Column */
110898
110994
  .ohg-header-v2 .ohg-col-actions {
110899
110995
  display: flex;