myio-js-library 0.1.468 → 0.1.470

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.470",
1143
1143
  description: "A clean, standalone JS SDK for MYIO projects",
1144
1144
  license: "MIT",
1145
1145
  repository: "github:gh-myio/myio-js-library",
@@ -3256,7 +3256,19 @@ function createDefaultActionHandlers(config, entityObject, item) {
3256
3256
  const MyIOAuth = MyIOUtils?.MyIOAuth;
3257
3257
  const CLIENT_ID = MyIOUtils?.CLIENT_ID;
3258
3258
  const CLIENT_SECRET = MyIOUtils?.CLIENT_SECRET;
3259
- const getDataApiHost = MyIOUtils?.getDataApiHost || (() => "https://api.data.apps.myio-bas.com");
3259
+ const getDataApiHost = () => {
3260
+ const host = MyIOUtils?.getDataApiHost?.() || MyIOUtils?.DATA_API_HOST || "";
3261
+ if (!host) {
3262
+ const msg = "DATA_API_HOST n\xE3o configurado. Verifique as configura\xE7\xF5es do widget.";
3263
+ LogHelper2.warn(`[${config.widgetName}]`, msg);
3264
+ if (MyIOLibrary2?.MyIOToast?.error) {
3265
+ MyIOLibrary2.MyIOToast.error(msg);
3266
+ } else {
3267
+ window.alert(msg);
3268
+ }
3269
+ }
3270
+ return host;
3271
+ };
3260
3272
  return {
3261
3273
  handleActionDashboard: async () => {
3262
3274
  LogHelper2.log(`[${config.widgetName}] Opening dashboard for:`, entityObject.entityId);
@@ -3306,6 +3318,8 @@ function createDefaultActionHandlers(config, entityObject, item) {
3306
3318
  window.alert("Autentica\xE7\xE3o n\xE3o dispon\xEDvel. Recarregue a p\xE1gina.");
3307
3319
  return;
3308
3320
  }
3321
+ const dataApiBaseUrl = getDataApiHost();
3322
+ if (!dataApiBaseUrl) return;
3309
3323
  const ingestionToken2 = await MyIOAuth.getToken();
3310
3324
  await MyIOLibrary2?.openDashboardPopupReport?.({
3311
3325
  ingestionId: item.ingestionId,
@@ -3313,7 +3327,7 @@ function createDefaultActionHandlers(config, entityObject, item) {
3313
3327
  label: item.label,
3314
3328
  domain: config.domain,
3315
3329
  api: {
3316
- dataApiBaseUrl: getDataApiHost(),
3330
+ dataApiBaseUrl,
3317
3331
  clientId: CLIENT_ID,
3318
3332
  clientSecret: CLIENT_SECRET,
3319
3333
  ingestionToken: ingestionToken2
@@ -3936,7 +3950,7 @@ function buildMyioIngestionAuth(config) {
3936
3950
  if (!dataApiHost || !clientId || !clientSecret) {
3937
3951
  throw new Error("dataApiHost, clientId, and clientSecret are required");
3938
3952
  }
3939
- const authUrl = new URL(`${dataApiHost}/api/v1/auth`);
3953
+ const authUrl = new URL(`${dataApiHost}/auth`);
3940
3954
  const cacheKey = generateCacheKey(config);
3941
3955
  if (!globalCache.has(cacheKey)) {
3942
3956
  globalCache.set(cacheKey, {
@@ -5638,6 +5652,12 @@ var MyIOSelectionStoreClass = class _MyIOSelectionStoreClass {
5638
5652
  ingestionId: entity.ingestionId || entityId,
5639
5653
  // ⭐ ADD: Store ingestionId for API calls
5640
5654
  customerName: entity.customerName || entity.ownerName || entity.centralName || "",
5655
+ // RFC-0157: Operational metrics for comparison modal
5656
+ domain: entity.domain || null,
5657
+ availability: entity.availability ?? null,
5658
+ mtbf: entity.mtbf ?? null,
5659
+ mttr: entity.mttr ?? null,
5660
+ equipmentType: entity.equipmentType || null,
5641
5661
  // Optional metadata passthrough (used by alarm comparisons)
5642
5662
  meta: entity.meta || entity.alarmMeta || null,
5643
5663
  alarm: entity.alarm || null
@@ -23649,7 +23669,11 @@ function createDateRangePicker($2, input, opts) {
23649
23669
  ranges = {
23650
23670
  "Hoje": [moment().startOf("day"), moment().endOf("day")],
23651
23671
  "\xDAltimos 7 dias": [moment().subtract(6, "days").startOf("day"), moment().endOf("day")],
23672
+ "\xDAltimos 15 dias": [moment().subtract(14, "days").startOf("day"), moment().endOf("day")],
23652
23673
  "\xDAltimos 30 dias": [moment().subtract(29, "days").startOf("day"), moment().endOf("day")],
23674
+ "\xDAltimos 60 dias": [moment().subtract(59, "days").startOf("day"), moment().endOf("day")],
23675
+ "\xDAltimos 90 dias": [moment().subtract(89, "days").startOf("day"), moment().endOf("day")],
23676
+ "M\xEAs Atual": [moment().startOf("month"), moment().endOf("day")],
23653
23677
  "M\xEAs Anterior": [moment().subtract(1, "month").startOf("month"), moment().subtract(1, "month").endOf("month")]
23654
23678
  };
23655
23679
  }
@@ -26321,7 +26345,28 @@ async function openRealTimeTelemetryModal(params) {
26321
26345
  gearBtn.addEventListener("click", openIntervalConfigModal);
26322
26346
  }
26323
26347
  if (customerId) await loadCheckDeviceInterval();
26348
+ const useCheckDeviceOnOpen = !!centralId && !sessionStorage.getItem("rtt_check_device_disabled");
26349
+ if (useCheckDeviceOnOpen) {
26350
+ startCountdown(checkDeviceWaitMs);
26351
+ try {
26352
+ await fetch(
26353
+ `https://${centralId}.y.myio.com.br/api/check_device/${deviceCheckName}`,
26354
+ { signal: AbortSignal.timeout(1e4) }
26355
+ );
26356
+ centralStatus = "ok";
26357
+ checkDeviceHistory.push({ ts: Date.now(), status: "ok" });
26358
+ } catch (e) {
26359
+ console.warn("[RTT] check_device (open) error:", e?.message ?? e);
26360
+ centralStatus = "offline";
26361
+ checkDeviceHistory.push({ ts: Date.now(), status: "offline" });
26362
+ }
26363
+ if (checkDeviceHistory.length > MAX_CHECK_DEVICE_HISTORY) checkDeviceHistory.shift();
26364
+ updateStatusBadges();
26365
+ await new Promise((r) => setTimeout(r, checkDeviceWaitMs));
26366
+ clearCountdown();
26367
+ }
26324
26368
  await refreshData();
26369
+ isFirstTick = false;
26325
26370
  scheduleCheckDeviceTick();
26326
26371
  return {
26327
26372
  destroy: closeModal2
@@ -53727,16 +53772,41 @@ var ALARMS_NOTIFICATIONS_PANEL_STYLES = `
53727
53772
  background: rgba(139, 92, 246, 0.2);
53728
53773
  }
53729
53774
 
53775
+ /* \u2500\u2500 alarm-text-btn: base style (mirrors ALARM widget .alarm-text-btn) \u2500\u2500 */
53776
+ .myio-alarms-panel .alarm-text-btn {
53777
+ display: inline-flex;
53778
+ align-items: center;
53779
+ gap: 5px;
53780
+ padding: 4px 10px;
53781
+ border: 1px solid var(--alarms-primary);
53782
+ border-radius: 6px;
53783
+ background: var(--alarms-primary-light);
53784
+ color: var(--alarms-primary);
53785
+ font-size: 10px;
53786
+ font-weight: 600;
53787
+ line-height: 1;
53788
+ letter-spacing: 0.06em;
53789
+ text-transform: uppercase;
53790
+ cursor: pointer;
53791
+ white-space: nowrap;
53792
+ transition: background 0.15s, color 0.15s;
53793
+ }
53794
+
53795
+ .myio-alarms-panel .alarm-text-btn svg {
53796
+ fill: currentColor;
53797
+ flex-shrink: 0;
53798
+ }
53799
+
53800
+ .myio-alarms-panel .alarm-text-btn:hover {
53801
+ background: var(--alarms-primary);
53802
+ color: #fff;
53803
+ }
53804
+
53730
53805
  /* Bundle map button \u2014 logo ap\xF3s as tabs, margem fixa \xE0 esquerda */
53731
53806
  .myio-alarms-tabs .alarms-tab-map-btn {
53732
53807
  margin-left: 16px;
53733
53808
  flex-shrink: 0;
53734
53809
  align-self: center;
53735
- padding: 4px 8px;
53736
- font-size: 10px;
53737
- font-weight: 600;
53738
- letter-spacing: 0.04em;
53739
- white-space: nowrap;
53740
53810
  }
53741
53811
 
53742
53812
  /* Alarm count badge \u2014 hidden (kept for JS compatibility) */
@@ -58147,17 +58217,11 @@ var ALARMS_NOTIFICATIONS_PANEL_STYLES = `
58147
58217
  border-radius: var(--alarms-radius-lg);
58148
58218
  }
58149
58219
 
58150
- /* History button \u2014 same base as alarms-tab-map-btn */
58220
+ /* History button \u2014 modifier only (base comes from .alarm-text-btn) */
58151
58221
  .myio-alarms-tabs .alarms-tab-history-btn {
58152
58222
  margin-left: 8px;
58153
58223
  flex-shrink: 0;
58154
58224
  align-self: center;
58155
- padding: 4px 8px;
58156
- font-size: 10px;
58157
- font-weight: 600;
58158
- letter-spacing: 0.04em;
58159
- white-space: nowrap;
58160
- transition: background 0.15s, color 0.15s, border-color 0.15s;
58161
58225
  }
58162
58226
 
58163
58227
  .myio-alarms-tabs .alarms-tab-history-btn.is-active {
@@ -88722,7 +88786,9 @@ var PoliciesTab = class {
88722
88786
  <div class="gm-accordion-panel" style="display:${this.expandedId === p.id ? "" : "none"}">
88723
88787
  <div class="gm-panel-section">
88724
88788
  <div class="gm-panel-section-header"><span class="gm-panel-section-title">\u2705 Permitidas</span></div>
88725
- ${p.allow?.length ? p.allow.map((a) => `<code style="display:block;font-size:11px;color:var(--um-badge-user-text);padding:2px 0;">${this.esc(a)}</code>`).join("") : '<span class="gm-empty-inline">Nenhuma.</span>'}
88789
+ ${p.allow?.length ? p.allow.map(
88790
+ (a) => `<code style="display:block;font-size:11px;color:var(--um-badge-user-text);padding:2px 0;">${this.esc(a)}</code>`
88791
+ ).join("") : '<span class="gm-empty-inline">Nenhuma.</span>'}
88726
88792
  </div>
88727
88793
  ${p.deny?.length ? `<div class="gm-panel-section">
88728
88794
  <div class="gm-panel-section-header"><span class="gm-panel-section-title">\u{1F6AB} Negadas</span></div>
@@ -88753,11 +88819,13 @@ var PoliciesTab = class {
88753
88819
  showPolicyForm(existing) {
88754
88820
  const isEdit = existing !== null;
88755
88821
  const overlay = document.createElement("div");
88756
- overlay.style.cssText = "position:fixed;inset:0;background:rgba(0,0,0,0.55);display:flex;align-items:center;justify-content:center;z-index:100001;";
88822
+ overlay.className = "um-backdrop";
88823
+ overlay.setAttribute("data-theme", this.config.theme || "light");
88757
88824
  const modal = document.createElement("div");
88758
- modal.style.cssText = "background:var(--um-modal-bg,#131929);border:1px solid var(--um-border,#2a3352);border-radius:12px;padding:24px;width:min(520px,92vw);max-height:80vh;overflow-y:auto;box-shadow:0 24px 64px rgba(0,0,0,0.5);";
88825
+ modal.className = "um-modal";
88826
+ modal.style.cssText = "padding: 24px; width: min(520px, 92vw); max-height: 80vh; height: auto; aspect-ratio: unset; overflow-y: auto; display: block;";
88759
88827
  modal.innerHTML = `
88760
- <h4 style="margin:0 0 16px;font-size:15px;font-weight:600;color:var(--um-text-primary,#e2e8f0);">${isEdit ? "Editar" : "Nova"} Pol\xEDtica</h4>
88828
+ <h4 style="margin:0 0 16px;font-size:15px;font-weight:600;color:var(--um-text-primary); font-family: inherit;">${isEdit ? "Editar" : "Nova"} Pol\xEDtica</h4>
88761
88829
  <div class="um-form" style="max-width:100%;">
88762
88830
  <div class="um-form-group">
88763
88831
  <label class="um-label">Nome <span class="um-req">*</span></label>
@@ -88814,7 +88882,11 @@ var PoliciesTab = class {
88814
88882
  try {
88815
88883
  const body = { name, description: description || void 0, riskLevel, allow, deny };
88816
88884
  const url = isEdit ? `${this.gcdrBase()}/policies/${existing.id}` : `${this.gcdrBase()}/policies`;
88817
- const res = await fetch(url, { method: isEdit ? "PUT" : "POST", headers: this.gcdrHeaders(), body: JSON.stringify(body) });
88885
+ const res = await fetch(url, {
88886
+ method: isEdit ? "PUT" : "POST",
88887
+ headers: this.gcdrHeaders(),
88888
+ body: JSON.stringify(body)
88889
+ });
88818
88890
  if (!res.ok) throw new Error(`HTTP ${res.status}`);
88819
88891
  this.callbacks.showToast(isEdit ? "Pol\xEDtica atualizada!" : "Pol\xEDtica criada!", "success");
88820
88892
  close();
@@ -88830,7 +88902,10 @@ var PoliciesTab = class {
88830
88902
  async deletePolicy(p) {
88831
88903
  if (!confirm(`Excluir a pol\xEDtica "${p.displayName}"? Esta a\xE7\xE3o n\xE3o pode ser desfeita.`)) return;
88832
88904
  try {
88833
- const res = await fetch(`${this.gcdrBase()}/policies/${p.id}`, { method: "DELETE", headers: this.gcdrHeaders() });
88905
+ const res = await fetch(`${this.gcdrBase()}/policies/${p.id}`, {
88906
+ method: "DELETE",
88907
+ headers: this.gcdrHeaders()
88908
+ });
88834
88909
  if (!res.ok) throw new Error(`HTTP ${res.status}`);
88835
88910
  this.callbacks.showToast("Pol\xEDtica exclu\xEDda.", "success");
88836
88911
  await this.loadPolicies();
@@ -88984,7 +89059,8 @@ var RolesTab = class {
88984
89059
  const policyMap = new Map(this.policies.map((p) => [p.id, p]));
88985
89060
  const items = r.policyIds.map((pid) => {
88986
89061
  const p = policyMap.get(pid);
88987
- if (!p) return `<div style="font-size:12px;color:var(--um-text-faint);padding:3px 0;">ID: ${this.esc(pid)}</div>`;
89062
+ if (!p)
89063
+ return `<div style="font-size:12px;color:var(--um-text-faint);padding:3px 0;">ID: ${this.esc(pid)}</div>`;
88988
89064
  const allowStr = p.allow?.join(", ") || "\u2014";
88989
89065
  return `<div style="padding:6px 0;border-bottom:1px solid var(--um-border-sub);">
88990
89066
  <div style="font-size:12px;font-weight:600;color:var(--um-text-secondary);">${this.esc(p.displayName)}</div>
@@ -89000,9 +89076,11 @@ var RolesTab = class {
89000
89076
  showRoleForm(existing) {
89001
89077
  const isEdit = existing !== null;
89002
89078
  const overlay = document.createElement("div");
89003
- overlay.style.cssText = "position:fixed;inset:0;background:rgba(0,0,0,0.55);display:flex;align-items:center;justify-content:center;z-index:100001;";
89079
+ overlay.className = "um-backdrop";
89080
+ overlay.setAttribute("data-theme", this.config.theme || "light");
89004
89081
  const modal = document.createElement("div");
89005
- modal.style.cssText = "background:var(--um-modal-bg,#131929);border:1px solid var(--um-border,#2a3352);border-radius:12px;padding:24px;width:min(520px,92vw);max-height:80vh;overflow-y:auto;box-shadow:0 24px 64px rgba(0,0,0,0.5);";
89082
+ modal.className = "um-modal";
89083
+ modal.style.cssText = "padding: 24px; width: min(520px, 92vw); max-height: 80vh; height: auto; aspect-ratio: unset; overflow-y: auto; display: block;";
89006
89084
  const policiesCheckboxes = this.policies.map((p) => {
89007
89085
  const checked = existing?.policyIds?.includes(p.id) ? " checked" : "";
89008
89086
  return `<label style="display:flex;align-items:center;gap:8px;padding:4px 0;font-size:12px;color:var(--um-text-secondary);cursor:pointer;">
@@ -89011,7 +89089,7 @@ var RolesTab = class {
89011
89089
  </label>`;
89012
89090
  }).join("");
89013
89091
  modal.innerHTML = `
89014
- <h4 style="margin:0 0 16px;font-size:15px;font-weight:600;color:var(--um-text-primary,#e2e8f0);">${isEdit ? "Editar" : "Nova"} Fun\xE7\xE3o</h4>
89092
+ <h4 style="margin:0 0 16px;font-size:15px;font-weight:600;color:var(--um-text-primary); font-family: inherit;">${isEdit ? "Editar" : "Nova"} Fun\xE7\xE3o</h4>
89015
89093
  <div class="um-form" style="max-width:100%;">
89016
89094
  <div class="um-form-group">
89017
89095
  <label class="um-label">Nome <span class="um-req">*</span></label>
@@ -89050,14 +89128,20 @@ var RolesTab = class {
89050
89128
  }
89051
89129
  errEl.textContent = "";
89052
89130
  const description = modal.querySelector("[name=description]").value.trim();
89053
- const policyIds = Array.from(modal.querySelectorAll(".um-role-policy-chk:checked")).map((c) => c.value);
89131
+ const policyIds = Array.from(
89132
+ modal.querySelectorAll(".um-role-policy-chk:checked")
89133
+ ).map((c) => c.value);
89054
89134
  const btn = modal.querySelector(".role-save");
89055
89135
  btn.disabled = true;
89056
89136
  btn.textContent = "...";
89057
89137
  try {
89058
89138
  const body = { name, description: description || void 0, policyIds };
89059
89139
  const url = isEdit ? `${this.gcdrBase()}/roles/${existing.id}` : `${this.gcdrBase()}/roles`;
89060
- const res = await fetch(url, { method: isEdit ? "PUT" : "POST", headers: this.gcdrHeaders(), body: JSON.stringify(body) });
89140
+ const res = await fetch(url, {
89141
+ method: isEdit ? "PUT" : "POST",
89142
+ headers: this.gcdrHeaders(),
89143
+ body: JSON.stringify(body)
89144
+ });
89061
89145
  if (!res.ok) throw new Error(`HTTP ${res.status}`);
89062
89146
  this.callbacks.showToast(isEdit ? "Fun\xE7\xE3o atualizada!" : "Fun\xE7\xE3o criada!", "success");
89063
89147
  close();
@@ -89073,7 +89157,10 @@ var RolesTab = class {
89073
89157
  async deleteRole(r) {
89074
89158
  if (!confirm(`Excluir a fun\xE7\xE3o "${r.displayName}"? Esta a\xE7\xE3o n\xE3o pode ser desfeita.`)) return;
89075
89159
  try {
89076
- const res = await fetch(`${this.gcdrBase()}/roles/${r.id}`, { method: "DELETE", headers: this.gcdrHeaders() });
89160
+ const res = await fetch(`${this.gcdrBase()}/roles/${r.id}`, {
89161
+ method: "DELETE",
89162
+ headers: this.gcdrHeaders()
89163
+ });
89077
89164
  if (!res.ok) throw new Error(`HTTP ${res.status}`);
89078
89165
  this.callbacks.showToast("Fun\xE7\xE3o exclu\xEDda.", "success");
89079
89166
  await this.loadAll();
@@ -101943,7 +102030,17 @@ function createHeaderShoppingComponent(params) {
101943
102030
  const lib = getLib();
101944
102031
  if (!lib?.buildMyioIngestionAuth) return;
101945
102032
  const utils = getUtils();
101946
- const dataApiHost = config.dataApiHost || utils?.DATA_API_HOST || "https://api.data.apps.myio-bas.com";
102033
+ const dataApiHost = config.dataApiHost || utils?.DATA_API_HOST;
102034
+ if (!dataApiHost) {
102035
+ const msg = "DATA_API_HOST n\xE3o configurado. Verifique as configura\xE7\xF5es do widget.";
102036
+ LogHelper3.warn("[HeaderShopping] initAuth:", msg);
102037
+ if (lib?.MyIOToast?.error) {
102038
+ lib?.MyIOToast.error(msg);
102039
+ } else {
102040
+ window.alert(msg);
102041
+ }
102042
+ return;
102043
+ }
101947
102044
  const clientId = params.credentials?.clientId || "";
101948
102045
  const clientSecret = params.credentials?.clientSecret || "";
101949
102046
  if (!clientId || !clientSecret) {
@@ -108290,6 +108387,75 @@ var OPERATIONAL_HEADER_DEVICES_GRID_STYLES = `
108290
108387
  font-size: 18px;
108291
108388
  }
108292
108389
 
108390
+ /* ========== Hover Expand Effect ========== */
108391
+ .ohg-header-v2 .ohg-col,
108392
+ .ohg-header-v2 .ohg-sub-col {
108393
+ transition: transform 0.25s cubic-bezier(0.34, 1.56, 0.64, 1),
108394
+ box-shadow 0.22s ease,
108395
+ background 0.18s ease;
108396
+ position: relative;
108397
+ z-index: 1;
108398
+ cursor: default;
108399
+ }
108400
+
108401
+ .ohg-header-v2 .ohg-col .ohg-col-title,
108402
+ .ohg-header-v2 .ohg-col .ohg-col-value,
108403
+ .ohg-header-v2 .ohg-sub-col .ohg-sub-label,
108404
+ .ohg-header-v2 .ohg-sub-col .ohg-sub-value {
108405
+ transition: font-size 0.25s cubic-bezier(0.34, 1.56, 0.64, 1);
108406
+ }
108407
+
108408
+ .ohg-header-v2 .ohg-col:hover {
108409
+ transform: scale(1.18);
108410
+ z-index: 20;
108411
+ border-radius: 6px;
108412
+ box-shadow: 0 8px 28px rgba(0, 0, 0, 0.5), 0 0 0 1px rgba(139, 92, 246, 0.35);
108413
+ background: rgba(255, 255, 255, 0.07) !important;
108414
+ }
108415
+
108416
+ .ohg-header-v2 .ohg-col:hover .ohg-col-title {
108417
+ font-size: 10px;
108418
+ }
108419
+
108420
+ .ohg-header-v2 .ohg-col:hover .ohg-col-value {
108421
+ font-size: 22px;
108422
+ }
108423
+
108424
+ .ohg-header-v2 .ohg-col-total:hover .ohg-col-value {
108425
+ font-size: 28px;
108426
+ }
108427
+
108428
+ .ohg-header-v2 .ohg-col-availability:hover .ohg-col-value {
108429
+ font-size: 28px;
108430
+ }
108431
+
108432
+ .ohg-header-v2 .ohg-sub-col:hover {
108433
+ transform: scale(1.22);
108434
+ z-index: 20;
108435
+ border-radius: 5px;
108436
+ box-shadow: 0 6px 22px rgba(0, 0, 0, 0.45), 0 0 0 1px rgba(255, 255, 255, 0.1);
108437
+ background: rgba(255, 255, 255, 0.08) !important;
108438
+ }
108439
+
108440
+ .ohg-header-v2 .ohg-sub-col:hover .ohg-sub-label {
108441
+ font-size: 9px;
108442
+ }
108443
+
108444
+ .ohg-header-v2 .ohg-sub-col:hover .ohg-sub-value {
108445
+ font-size: 20px;
108446
+ }
108447
+
108448
+ /* Light mode hover adjustments */
108449
+ .ohg-header-v2.ohg-header--light .ohg-col:hover {
108450
+ box-shadow: 0 8px 28px rgba(0, 0, 0, 0.15), 0 0 0 1px rgba(139, 92, 246, 0.4);
108451
+ background: rgba(0, 0, 0, 0.04) !important;
108452
+ }
108453
+
108454
+ .ohg-header-v2.ohg-header--light .ohg-sub-col:hover {
108455
+ box-shadow: 0 6px 22px rgba(0, 0, 0, 0.12), 0 0 0 1px rgba(139, 92, 246, 0.3);
108456
+ background: rgba(0, 0, 0, 0.04) !important;
108457
+ }
108458
+
108293
108459
  /* Actions Column */
108294
108460
  .ohg-header-v2 .ohg-col-actions {
108295
108461
  display: flex;