" + (TrainNumberOverride ? TrainNumberOverride : TrainNumber) + "
" + (isWanman ? "ワンマン " : "") + "
" + viaData + "
" + optionalText + "
" + trainName + "
" + (ToData ? ToData + "行" : ToData) + "
" + trainType + "
" + (hasProblem ? "‼️停止中‼️" : "") + "
" + (TrainNumberOverride ? TrainNumberOverride : TrainNumber) + "
" + (isWanman ? "ワンマン " : "") + "
" + viaData + "
" + optionalText + "
" + trainName + "
" + (ToData ? ToData + "行" : ToData) + "
" + trainType + "
" + (hasProblem ? "‼️停止中‼️" : "") + "
" + returnText1 + "
"); - 行き先情報.insertAdjacentHTML('beforebegin', "" + (ToData ? ToData + "行 " : ToData) + "
" + (TrainNumberOverride ? TrainNumberOverride : TrainNumber) + "
" + (hasProblem ? "‼️停止中‼️" : "") + "
"); + 行き先情報.insertAdjacentHTML('beforebegin', "" + returnText1 + "
"); + 行き先情報.insertAdjacentHTML('beforebegin', "" + (ToData ? ToData + "行 " : ToData) + "
" + (TrainNumberOverride ? TrainNumberOverride : TrainNumber) + "
" + (hasProblem ? "‼️停止中‼️" : "") + "
"); `} } `; @@ -816,24 +881,36 @@ const setNewTrainItem = (element,hasProblem,type)=>{ const data = trainDataList.find(e => e.train_id === 列番データ); const _bc = TRAIN_TYPE_CFG[data.type]; element.style.borderColor = _bc ? _bc.borderColor : 'black'; - element.style.backgroundColor = _bc ? _bc.bgColor : '#ffffffcc'; + if (_bc) { + if (_isDark) { + if (_bc.bgColor === '#ffffffcc') { element.style.backgroundColor = _t.cardBg; } + else if (_bc.bgColor === '#ffd0a9ff') { element.style.backgroundColor = '#5c3a1acc'; } + else if (_bc.bgColor === '#c7c7c7cc') { element.style.backgroundColor = '#555b62cc'; } + else { element.style.backgroundColor = _bc.bgColor; } + } else { + element.style.backgroundColor = _bc.bgColor; + } + } else { + element.style.backgroundColor = _t.cardBg; + } }else{ + element.style.backgroundColor = _t.cardBg; if(element.getAttribute('offclick').includes("express")){ element.style.borderColor = '#ff0000ff'; }else if(element.getAttribute('offclick').includes("rapid")){ element.style.borderColor = '#008cffff'; }else{ - element.style.borderColor = 'black'; + element.style.borderColor = _isDark ? '#30363d' : 'black'; } } - element.style.borderWidth = '2px'; + element.style.borderWidth = _isDark ? '1px' : '2px'; element.style.borderStyle = 'solid'; element.style.borderRadius = '10%'; if(hasProblem){ element.style.boxShadow = ''; element.style.animation = '_jrs_glow 3s linear infinite'; }else{ - element.style.boxShadow = '0 0 4px rgba(0, 0, 0, 0.2)'; + element.style.boxShadow = _isDark ? '0 2px 8px rgba(0,0,0,0.6)' : '0 0 4px rgba(0,0,0,0.2)'; element.style.animation = ''; } element.style.margin = '2px'; @@ -1099,6 +1176,13 @@ const setStrings = () =>{ if(i.style.backgroundColor != 'rgb(247, 247, 247)'){ i.childNodes.forEach(m=> m.style.width = '20vw') } + if (_isDark && i.nodeType === 1) { + var _cbg = getComputedStyle(i).backgroundColor; + var _cm = _cbg && _cbg.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/); + if (_cm && (+_cm[1] + +_cm[2] + +_cm[3]) > 500) { + i.style.backgroundColor = '#161b22'; + } + } }) } @@ -1112,10 +1196,12 @@ const setStrings = () =>{ document.querySelector('#pMENU_2').style.borderColor='#00d3e8'; document.querySelector('#pMENU_2').style.borderWidth='2px'; document.querySelector('#pMENU_2').style.borderRadius='10%'; + document.querySelector('#pMENU_2').style.backgroundColor=_t.bgSec; document.querySelector('#pMENU_3').style.borderStyle='solid'; document.querySelector('#pMENU_3').style.borderColor='#00d3e8'; document.querySelector('#pMENU_3').style.borderWidth='2px'; document.querySelector('#pMENU_3').style.borderRadius='10%'; + document.querySelector('#pMENU_3').style.backgroundColor=_t.bgSec; document.querySelectorAll('#pMENU_2 div').forEach((d)=>d.style.padding = '10px'); document.querySelectorAll('#pMENU_3 div').forEach((d)=>d.style.padding = '10px'); document.querySelectorAll('#topHeader div').forEach((d)=>d.style.width = '100vw'); @@ -1123,6 +1209,22 @@ const setStrings = () =>{ document.getElementById('disp').style.width = '100vw'; document.getElementById('disp').style.overflowX = 'hidden'; + // ダークモード: 左右ゾーンの縦グラデーション + if (_isDark) { + document.querySelectorAll('[id^="stationBlock"]').forEach(function(block) { + // 左右ゾーン:元の縦グラデーションを継承する微妙な明暗 + if (block.children[0]) block.children[0].style.backgroundImage = 'linear-gradient(to bottom, rgba(200,210,230,0.04), transparent 30%, transparent 70%, rgba(200,210,230,0.04))'; + if (block.children[2]) block.children[2].style.backgroundImage = 'linear-gradient(to bottom, rgba(200,210,230,0.04), transparent 30%, transparent 70%, rgba(200,210,230,0.04))'; + }); + // ~区間の左右にもグラデーション + document.querySelectorAll('#disp > [id*="~"]').forEach(function(row) { + var up = row.querySelector(':scope > [id^="Up"]'); + var down = row.querySelector(':scope > [id^="Down"]'); + if (up) up.style.backgroundImage = 'linear-gradient(to bottom, rgba(200,210,230,0.04), transparent 30%, transparent 70%, rgba(200,210,230,0.04))'; + if (down) down.style.backgroundImage = 'linear-gradient(to bottom, rgba(200,210,230,0.04), transparent 30%, transparent 70%, rgba(200,210,230,0.04))'; + }); + } + }catch(e){ alert("本家サーバーからのデータ取得に失敗しました。"); window.ReactNativeWebView.postMessage(JSON.stringify({type:"LoadError"})); diff --git a/stateBox/useTrainMenu.tsx b/stateBox/useTrainMenu.tsx index 9179a9b..249b630 100644 --- a/stateBox/useTrainMenu.tsx +++ b/stateBox/useTrainMenu.tsx @@ -6,6 +6,7 @@ import React, { FC, } from "react"; +import { useColorScheme } from "react-native"; import { ASCore } from "../storageControl"; import { getStationList2 } from "../lib/getStationList"; @@ -118,6 +119,7 @@ export const TrainMenuProvider: FC