const style=document.createElement('style'); style.textContent=` /* ========================================================================== 1. 変数定義 (Design Tokens) ========================================================================== */ :root { /* カラーパレット */ --color-main: #004080; --color-accent: #50c6ff; --color-primary: #2b6cb0; --color-error: #d9534f; --color-text: #2d3748; --color-auxiliary: #8290a1; --color-link: #0056b3; /* 背景色(眩しさ防止の肝) */ --bg-card: #fcfcfc; --bg-dark: rgba(20, 25, 30, 0.9); --bg-light: rgba(230, 239, 248, 0.9); --bg-hover: rgba(255, 255, 255, 0.1); /* サイドバーのリンクホバー背景 */ --bg-input: #f8fafc; --bg-error: #fff5f5; --bc-error: #d9534f; /* タイポグラフィ */ --main-font: "Segoe UI", sans-serif; --fz-small: 0.675rem; --fz-normal: 0.75rem; --fz-medium: 0.875rem; --fz-body: 1rem; --fw-normal: 400; --fw-medium: 500; --fw-semi-bold: 600; --fw-bold: 700; --fw-extra-bold: 800; /* シャドウ */ --glow-blue: rgba(0, 120, 212, 0.3); --shadow-light: rgba(255, 255, 255, 0.8); --shadow-dark: rgba(174, 194, 224, 0.6); --box-shadow-inset: inset 2px 2px 4px rgba(80, 120, 160, 0.25), inset -2px -2px 4px rgba(255, 255, 255, 0.4); --box-shadow-focus: inset -1px -1px 3px rgba(255, 255, 255, 0.8), inset 1px 1px 3px rgba(0, 0, 0, 0.05), 0 0 8px var(--glow-blue); /* その他 */ --radius-small: 8px; --radius-normal: 1rem; --radius-large: 2rem; --nav-width: 5rem; /* サイドバーの幅 */ } /* フェードインアニメーション */ @keyframes fadeIn { 0% { opacity: 0; } 100% { opacity: 1; } } /* ========================================================================== 2. ベーススタイル / リセット ========================================================================== */ *, *::before, *::after { box-sizing: border-box; -webkit-tap-highlight-color: transparent; /* スマホのデフォルト機能である「タップした時に出る半透明の青い四角」を消しています */ } body { /* 1. 配置・レイアウト(要素をどこに置くか) */ display: flex; flex-direction: column; justify-content: center; align-items: stretch; min-height: 100vh; margin: 0; padding: 1rem; /* 2. 背景・外観(箱の見た目) */ /* background: linear-gradient(to bottom right, #dfefff, #f5fbff); */ background: linear-gradient(135deg, rgba(220, 238, 255, 1) 0%, rgba(220, 238, 255, 0.85) 100%); background-attachment: fixed; /* 3. タイポグラフィ(中身の文字のルール) */ color: var(--color-text); font-family: var(--main-font); line-height: 1.6; letter-spacing: 0.16px; word-break: break-all; } a { opacity: 0.8; cursor: pointer; font-weight: var(--fw-bold); color: var(--color-link); text-decoration: none; transition: all 0.2s ease-out; } a:hover, a:focus { outline: none; opacity: 1; } menu, ol, ul { list-style: none; margin: 0; padding: 0; } /* ========================================================================== 3. レイアウト・共通コンテナ ========================================================================== */ #SMP_STYLE .body_tbl { width: 100%; max-width: 800px; margin: 0 auto; padding: 3rem 2rem; border: 1px solid rgba(255, 255, 255, 0.6); border-radius: var(--radius-small); background: var(--bg-card); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08); animation: fadeIn 0.2s ease; } /* 汎用クリアフィックス */ .cf:after { content: ""; display: block; clear: both; } @media screen and (max-width: 960px) { #SMP_STYLE .body_tbl { width: 100%; padding: 2rem 1rem; } } /* ========================================================================== 4. 見出し・テキスト装飾 ========================================================================== */ h1 { font-size: 1.625rem; line-height: 1.5; text-align: center; margin-bottom: 1.5rem; color: var(--color-main); font-weight: var(--fw-bold); } h2.title { margin-top: 2rem; padding-left: 0.75rem; font-size: 1.25rem; color: var(--color-primary); font-weight: var(--fw-bold); } h2.title::before { content: "◆ "; color: var(--color-accent); } /* メッセージボックス(通知・エラー) */ p.header_text, p.header_rmesg, p.header_emesg { margin-bottom: 1.5rem; padding: 1rem; border-radius: var(--radius-small); font-size: 0.9rem; } p.header_text { border: 1px solid #b3d7f5; border-left: 4px solid var(--color-accent); color: var(--color-main); } p.header_rmesg { background: #e7f4ff; border: 1px solid #a3d1ff; color: #005fa3; } p.header_emesg { background: var(--bg-error); border: 1px solid var(--bc-error); color: var(--color-error); } @media (max-width: 768px) { h1 { font-size: 1.1rem; } } /* ========================================================================== 5. フォーム基本要素 (Input, Select, Textarea) ========================================================================== */ /* 入力フィールド共通(ネオモーフィズム風) */ .input, textarea, select, .data.file input[type="file"] { width: 100%; margin: 0; /* 必要に応じて明示 */ padding: 0.6rem; border: none; border-radius: var(--radius-large); overflow-anchor: none; background: var(--bg-light); box-shadow: var(--box-shadow-inset); color: currentColor; font-family: var(--main-font); font-size: 1rem; cursor: text; transition: background 0.2s ease, box-shadow 0.2s ease, color 0.2s ease; scrollbar-width: thin; scrollbar-color: #b1b9c4 #f0f4f7; } /* テキストエリア個別設定 */ textarea { width: 100% !important; min-height: 100px; border-radius: var(--radius-small); font-size: 0.85rem; } /* セレクトボックス個別設定 */ select { /* 1. 配置・表示(ブラウザ標準の矢印を消す) */ display: block; appearance: none; -webkit-appearance: none; /* 2. 余白(右側に矢印があるため、右パディングを少し広げる) */ padding: 0.6rem 2.5rem 0.6rem 0.6rem; /* 3. 背景(個別に指定してアイコンを守る) */ background-color: var(--bg-light); /* ここはあえて個別のまま */ background-image: url('data:image/svg+xml;charset=UTF-8,'); background-repeat: no-repeat; background-position: right 0.8rem center; background-size: 1rem; /* 4. タイポグラフィ */ text-align: center; } /* 1. ファイル入力エリア本体 */ .data.file input[type="file"] { /* 1. 配置・表示(ボックスモデルの根幹) */ display: block; /* もし未設定なら追加推奨 */ position: relative; min-height: 6rem; margin-bottom: 1rem; /* 2. 余白・枠線(箱の形を整える) */ padding: 3.5rem 2rem 0; border-radius: var(--radius-normal); /* 3. 背景・カーソル(表面のデザイン) */ background: var(--bg-light); /* 共通設定にあると思いますがここでも意識 */ cursor: pointer; /* 4. テキスト・フォント(中身の見た目) */ color: var(--color-main); font-size: smaller; font-weight: var(--fw-bold); line-height: 1.2; text-align: left; } /* 2. 「+」アイコンの演出 */ .data.file input[type="file"]::before { content: "+"; position: absolute; top: 1rem; left: 50%; transform: translateX(-50%); font-size: 2rem; font-weight: var(--fw-bold); color: var(--color-accent); line-height: 1; pointer-events: none; } /* 3. 標準ボタンの非表示(共通設定) */ .data.file input[type="file"]::file-selector-button, .data.file input[type="file"]::-webkit-file-upload-button { display: none; } /* 4. 操作時(クリック中や選択直後)に「+」を消す */ .data.file input[type="file"]:focus::before, .data.file input[type="file"]:active::before { opacity: 0; } /* フォーカス時共通 */ .input:focus, textarea:focus, select:focus, .data.file input[type="file"]:focus { outline: none; background-color: var(--bg-input); box-shadow: var(--box-shadow-focus); } /* ========================================================================== 6. ラジオボタン・チェックボックス (ボタン風スタイル) ========================================================================== */ /* ラベル全体のスタイル */ label { display: flex; align-items: center; justify-content: center; width: 100%; padding: 0.6rem; border-radius: var(--radius-large); background: var(--bg-light); box-shadow: var(--box-shadow-inset); cursor: pointer; transition: background 0.2s ease, box-shadow 0.2s ease, color 0.2s ease; position: relative; font-size: 0.9rem; margin-bottom: 0.4rem; } /* --- input本体を非表示に --- */ label input[type="radio"], label input[type="checkbox"] { position: absolute; opacity: 0; pointer-events: none; } /* チェックされた時のスタイル(has対応ブラウザ) */ label:has(input:checked) { background: var(--color-accent); color: #fff; box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1) inset; } /* inputにフォーカスが当たったら、それを含むlabelにスタイルを当てる */ label:has(input:focus-visible) { box-shadow: 0 0 8px var(--glow-blue); } /* ラジオボタン・チェックボックスのレイアウト最適化 */ @media screen and (min-width: 769px) { .data.multi2 ul.cf { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); align-items: stretch; gap: 0.2rem; text-align: center; } } .data.multi2 ul.cf li { display: flex; } .data.multi2 ul.cf label { padding: 0.6rem 1rem; min-height: 2.5rem; line-height: 1.2; } /* ========================================================================== 7. フォームの各ラベルとバリデーション ========================================================================== */ .smp_tmpl .title { margin-bottom: 0.5rem; color: var(--color-primary); font-weight: var(--fw-bold); } .need { display: inline-block; vertical-align: middle; margin-left: 0.5rem; padding: 0.2rem 0.5rem; border-radius: var(--radius-small); background: var(--color-error); color: white; font-size: 0.8rem; } span.caution { display: block; margin-top: 0.4rem; font-size: 0.8125rem; font-weight: var(--fw-normal); line-height: 1.6; letter-spacing: 0.04em; color: var(--color-text); opacity: 0.9; } span.sample { display: block; margin-bottom: 0.5rem; font-size: 0.8rem; color: var(--color-auxiliary); } .msg { display: block; margin-top: 0.5rem; padding: 0.2rem 0.5rem; color: var(--color-error); font-size: 0.85rem; font-weight: var(--fw-bold); } /* エラーメッセージが空の時は非表示にして余白を消す */ .msg:empty { display: none; } /* エラーがある項目の dl(親要素)を目立たせる */ /* SPIRALの仕様でdlに特定のクラスがつかない場合は、JSで付与するか 以下の「.msgが存在する場合のdl」という指定が有効です(モダンブラウザ対応) */ .smp_tmpl dl:has(.msg:not(:empty)) { /* 1. レイアウト・形状 */ margin-bottom: 2rem; padding: 1.2rem; border-left: 4px solid var(--color-error); border-radius: var(--radius-small); /* 2. 背景・見た目 */ background: #fffaf0; /* ほんのり警告色(薄いオレンジ) */ box-shadow: 0 0 15px rgba(217, 83, 79, 0.25); /* 3. 動き */ transition: all 0.3s ease; } /* ========================================================================== 8. 送信・操作ボタン ========================================================================== */ .submit, input[name=SMPFORM_BACK], input.clear, .login-button { width: 100%; margin-top: 1rem; padding: 0.8rem 2rem; border: none; border-radius: var(--radius-small); color: #fff; font-size: 1rem; font-weight: var(--fw-bold); cursor: pointer; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); } .submit { background: linear-gradient(135deg, #004080 0%, #0056b3 100%); box-shadow: 0 4px 10px rgba(0, 30, 60, 0.3); } input[name=SMPFORM_BACK] { background: linear-gradient(135deg, #666666 0%, #999999 100%); box-shadow: 0 4px 10px rgba(0, 0, 0, 0.15); } input.clear { padding: 0.6rem; border-radius: var(--radius-large); background: var(--bg-light); color: currentColor; box-shadow: var(--box-shadow-inset); font-size: 0.9rem; font-weight: unset; margin-bottom: 0.4rem; } /* --- ログインボタン (汎用) --- */ .login-button { display: inline-flex; justify-content: center; align-items: center; border-radius: var(--radius-large); background: linear-gradient(135deg, #2196f3 0%, #1976d2 100%); box-shadow: 0 4px 12px rgba(0, 120, 212, 0.3); } .submit:hover, .submit:focus, input[name=SMPFORM_BACK]:hover, input[name=SMPFORM_BACK]:focus, input.clear:hover, input.clear:focus, .login-button:hover, .login-button:focus { outline: none; filter: brightness(1.05); color: #fff; /* background: linear-gradient(135deg, #0056b3 0%, #50c6ff 100%); */ /* background: linear-gradient(135deg, #888888 0%, #bbbbbb 100%); */ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05); transform: translateY(1px); } input.clear:hover, input.clear:focus { background: var(--color-accent); box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1) inset; } .submit:active, input[name=SMPFORM_BACK]:active, input.clear:active, .login-button:active { filter: brightness(0.95); box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1) inset; transform: translateY(1px) scale(0.98); transition: all 0.1s linear; } /* ========================================================================== 9. 特殊レイアウト (定義リスト・インライン入力・表) ========================================================================== */ .smp_tmpl dl { display: flex; flex-wrap: wrap; text-align: left; margin-bottom: 1.5rem; } .smp_tmpl dt { width: 100%; margin-bottom: 0.3rem; color: var(--color-main); font-weight: var(--fw-bold); } .smp_tmpl dd { width: 100%; margin: 0; } /* 郵便番号・電話番号などの横並び設定 */ .zipcode ul, .phone ul, .time ul { display: flex; gap: 0.5rem; flex-wrap: wrap; } .zipcode li.code01 input { max-width: 4rem; } .zipcode li.code02 input { max-width: 5rem; } .phone li input { max-width: 4rem; } #SMP_STYLE .integer input { max-width: 6rem; } #SMP_STYLE .real input { max-width: 10rem; } #SMP_STYLE .num input { max-width: 6rem; } #SMP_STYLE .time .year { max-width: 4rem; } #SMP_STYLE .time input { max-width: 3rem; } #SMP_STYLE .price input { max-width: 10rem; } /* 表 PC・共通設定 */ .smp-card-list { width: 100%; margin: 10px auto; border-collapse: collapse; border: 1px solid #cccccc; color: var(--color-text); } .smp-card-list th, .smp-card-list td { padding: 10px; border: 1px solid #cccccc; font-size: 0.8125rem; text-align: left; } .smp-card-list th { background: #f0f0f0; } /* --- スマホ用レスポンシブ設定 --- */ @media screen and (max-width: 768px) { .smp-card-list { border: none; /* 外枠を一旦消す */ } .smp-card-list tr:nth-child(2) { display: none; } .smp-card-list tr { display: block; overflow: hidden; margin-bottom: 20px; /* カードごとの隙間 */ border: 1px solid #cccccc; /* trを外枠にする */ border-radius: 4px; /* 少し角を丸くするとカード感が出ます */ } .smp-card-list th, .smp-card-list td { display: block; width: 100% !important; border: none; /* 個別の線を一旦すべて消す */ box-sizing: border-box; } .smp-card-list th:nth-child(1) { background: #f0f0f0; border-bottom: 1px solid #cccccc; /* 見出しの下だけに線を引く */ font-weight: var(--fw-bold); } .smp-card-list th:nth-child(2) { background: transparent; } .smp-card-list td { border-bottom: 1px dotted #eeeeee; /* 項目間の区切り(任意) */ } .smp-card-list td:last-child { border-bottom: none; /* 最後の項目は線を消す */ } /* 資本金のセル(tr内の1番目のtd) */ .smp-card-list td:nth-of-type(1)::before { content: "資本金:"; font-size: 0.7rem; color: #888; font-weight: var(--fw-normal);; } /* 従業員数のセル(tr内の2番目のtd) */ .smp-card-list td:nth-of-type(2)::before { content: "従業員:"; font-size: 0.7rem; color: #888; font-weight: var(--fw-normal); } /* ラベルとデータの並びを整える */ .smp-card-list td { display: flex; /* 横並びに */ justify-content: space-between; /* ラベルと数値を両端に */ align-items: center; padding: 12px 15px; } } /* ========================================================================== 10. フッター ========================================================================== */ .spiralSeal { width: 100% !important; margin-top: 2rem; border: none !important; } /* trの中にあるtdをすべて縦並びにする */ .spiralSeal tr td { display: block; /* 横並びのセルを縦並びに変える */ } .spiralSeal td.description { color: #8290a1; /* 文字色だけ調整 */ } /* リンクも目立たないように色を調整 */ .description a { color: inherit; text-decoration: underline; opacity: 0.8; } /* ========================================================================== 11. サイドバー ========================================================================== */ .side-header { /* 1. 配置・レイアウト (一番重要な「固定」の定義) */ position: fixed; z-index: 999; top: 0; left: 0; display: flex; justify-content: center; align-items: center; /* 2. サイズ・形状 */ width: var(--nav-width); height: 100vh; /* 3. 背景・見た目 */ background: linear-gradient(135deg, var(--color-main), var(--color-accent)); box-shadow: 2px 0 8px rgba(0, 0, 0, 0.2); } .side-nav { width: 100%; } /* --- サイドメニュー(縦並びのメニュー) --- */ .side-menu { display: flex; flex-direction: column; /* 縦方向に並べる */ align-items: center; gap: 1.2rem; margin: 0; padding: 0; } .side-menu li { width: 100%; } .side-menu a { /* 1. 配置・サイズ (リンクを押しやすく広げる) */ display: block; width: 100%; padding: 0.75rem 0; text-align: center; /* 2. 形状・枠線 */ border-radius: var(--radius-normal); /* 3. タイポグラフィ */ color: white; font-size: 0.85rem; font-weight: var(--fw-normal); text-decoration: none; /* 4. 動き */ transition: all 0.2s ease; } .side-menu a:hover, .side-menu a:focus { outline: none; background: var(--bg-hover); /* 半透明の背景 */ color: var(--color-accent); /* アクセントカラーに変更 */ letter-spacing: 0.05em; /* 文字間隔を広げる */ } /* --- レスポンシブ切替ボトムバーへ --- */ @media (max-width: 768px) { .side-header { top: auto; bottom: 0; left: 0; width: 100%; height: 60px; flex-direction: row; /* 横並び用 */ } .side-menu { flex-direction: row; /* 横方向に並べる */ justify-content: space-around; /* 均等配置 */ align-items: center; /* 縦中央寄せ */ height: 100%; /* 高さを揃える */ gap: 0; } .side-menu a { font-size: 0.7rem; height: 44px; display: flex; justify-content: center; align-items: center; } } /* ========================================================================== 12. アコーディオン ========================================================================== */ :root { --icon-plus: url('data:image/svg+xml;utf8,'); --icon-minus: url('data:image/svg+xml;utf8,'); } .accordion-item.s1 { --bg-color: #e6f2ff; --text-color: #004080; } .accordion-item.s2 { --bg-color: #e9f9f0; --text-color: #006633; } .accordion-item.s3 { --bg-color: #fff4e6; --text-color: #994d00; } .accordion-item.s4 { --bg-color: #f0f0ff; --text-color: #333366; } .accordion-item.s5 { --bg-color: #ffe6f0; --text-color: #993366; } .accordion-item.s6 { --bg-color: #f0ffe6; --text-color: #336600; } .accordion-item.s7 { --bg-color: #f9f0e9; --text-color: #804000; } .accordion-item.s8 { --bg-color: #e6fff5; --text-color: #006680; } .accordion-item.s9 { --bg-color: #fef6e4; --text-color: #a65e00; } .accordion-item.s10 { --bg-color: #f3e6ff; --text-color: #4b0082; } .accordion-container { width: 100%; max-width: 800px; margin: 20px auto; /* padding: 0 16px; */ } .accordion-item { margin-bottom: 12px; border-radius: 16px; box-shadow: 4px 4px 10px rgba(163, 177, 198, 0.6), -4px -4px 10px rgba(255, 255, 255, 0.9); } .accordion-title { position: relative; margin: 0; padding: 16px 48px 16px 24px; border-radius: 16px; background: var(--bg-color); color: var(--text-color); cursor: pointer; font-size: 1rem; font-weight: var(--fw-medium); text-align: left; transition: box-shadow 0.2s ease, transform 0.2s ease; } .accordion-title:hover { box-shadow: 4px 4px 10px rgba(163, 177, 198, 0.6), -4px -4px 10px rgba(255, 255, 255, 0.9); transform: translateY(-1px); } .accordion-title.active { border-radius: 16px 16px 0px 0px; } .accordion-title::after { content: var(--icon-plus); position: absolute; top: 50%; right: 16px; width: 16px; transform: translateY(-50%); transition: transform 0.2s ease; } .accordion-title.active::after { content: var(--icon-minus); transform: translateY(-50%) rotate(180deg); } .accordion-content { visibility: hidden; overflow: hidden; max-height: 0; padding: 0 16px; border-radius: 0 0 16px 16px; background: var(--bg-color); color: var(--text-color); box-shadow: inset 2px 2px 4px rgba(163, 177, 198, 0.4), inset -2px -2px 4px #fff; transition: max-height 0.25s cubic-bezier(0.4, 0, 0.2, 1), padding 0.2s ease; } .accordion-content.active { visibility: visible; overflow-y: visible; max-height: none; padding: 16px; } /* レスポンシブ */ @media (max-width: 768px) { .accordion-title { padding: 12px 40px 12px 16px; font-size: 0.9rem; } .accordion-content.active { padding: 12px 16px; } } `; // --- 共通CSS設定のすぐ後ろに追記 --- const pageTitle = document.title; // 1. 判定条件:タイトルが「ログインページ」または「マイエリア ++ ERROR ++」を含む場合 const isLoginScreen = pageTitle.includes("ログインページ") || pageTitle.includes("マイエリア ++ ERROR ++"); if (isLoginScreen) { /* 1. Font Awesome を動的に読み込む */ if (!document.querySelector('link[href*="font-awesome"]')) { const faLink = document.createElement('link'); faLink.rel = 'stylesheet'; faLink.href = 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css'; document.head.appendChild(faLink); } /* 2. ログイン系画面専用スタイル(450px幅・アイコン付)を追加 */ style.textContent += ` /* --- ログイン専用コンテナ --- */ #SMP_STYLE .body_tbl { max-width: 450px; border-radius: 1.5rem; } /* サイドバーを非表示 */ .side-header { display: none !important; } /* --- 入力エリアのアイコン配置 --- */ #SMP_STYLE dl { position: relative; } #SMP_STYLE dl:nth-of-type(1)::before, #SMP_STYLE dl:nth-of-type(2)::before { font-family: "Font Awesome 6 Free"; font-weight: var(--fw-extra-bold); position: absolute; left: 1.2rem; top: 2.8rem; color: var(--color-main); opacity: 0.4; z-index: 10; } #SMP_STYLE dl:nth-of-type(1)::before { content: "\\f007"; } /* User icon */ #SMP_STYLE dl:nth-of-type(2)::before { content: "\\f023"; } /* Lock icon */ /* 入力欄の余白調整 */ #SMP_STYLE .input { padding: 0.8rem 1rem 0.8rem 3rem; } /* ボタンをより強調 */ .submit { border-radius: var(--radius-large); padding: 1rem; } /* エラーメッセージ(ログイン失敗時など)の微調整 */ p { font-size: 0.9rem; color: var(--color-error); } `; } // 最後に全てが合体したstyleをheadに追加する document.head.appendChild(style);