/* yam付費中心 — 圖示系統（Remix Icon font）
   ⚠️ 本檔由 tools/build-icons.mjs 產生，不要手改。
      新增圖示：在 HTML/JS 寫上 class，然後執行
        node frontend/consumer/tools/build-icons.mjs

   ===== 為什麼是 icon font =====
   2026-08-03 之前全站圖示是逐個內嵌的 Phosphor SVG path，同一顆圖示（例如「關閉」）
   在 HTML 與 app.js 裡各有多份 path 複本，改一顆要全域搜尋 path 字串。
   改成 icon font 後，圖示只剩一個 class 名稱，語意寫在 class 上、不寫在 path 裡。

   ===== 用法 =====
   <i class="ico ri-xxx-line" aria-hidden="true"></i>
   - `.ico` 只負責「盒子」（尺寸／對齊），尺寸一律由各處的 font-size 決定，
     不要再寫 width/height —— 字型圖示的 1em 盒子就是它的視覺尺寸。
   - `ri-*` 只負責「字符」。
   - ⚠️ aria-hidden 必須保留：字符落在 Unicode 私有區，螢幕閱讀器會念出亂碼。
     圖示按鈕的可及名稱一律由 aria-label／同層文字提供。

   ===== 為什麼字型是內嵌的 base64 而不是外連檔案 =====
   Chrome 把每個 file:// 檔案視為獨立的 opaque origin，而 @font-face 是 CORS 請求，
   所以外連的 .woff2 在「雙擊開檔」時一定載不到，圖示會全部變成 .notdef 方框。
   本專案的頁面本來就支援 file://（app.js 的 demo 模式看 protocol === 'file:'），
   data: URI 不受 CORS 限制，內嵌後 file:// 與 http:// 都正常。
   2026-08-03 曾因為外連而讓六個頁面在 file:// 下全部顯示方框，不要改回外連。

   內嵌的是**子集**：完整字型 185KB／3229 顆，裁成本站實際用到的 25 顆後只有 1.8KB。
   子集來源與字符對照表在 tools/ 底下，隨版本一起進版控，離線可重現。

   ===== 授權 =====
   Remix Icon v4.9.1 — Remix Icon License v1.0
   Copyright (c) 2017-2026 Remix Design
   https://remixicon.com ／ 授權全文：https://github.com/Remix-Design/RemixIcon/blob/master/License
   我們的用法（產品 UI 的功能性圖示）落在 §2.1「商業與非商業使用」與 §2.3「作為較大作品
   的一部分散布」。§2.4 明訂標註為選擇性；§5 規定散布完整圖示庫或其實質部分時要保留
   來源聲明並附授權連結，故本區塊保留 copyright 與連結。
   ⚠️ §3.3 禁止把任一顆圖示當作 logo、app icon 或品牌識別使用。
      本站的品牌資產在 assets/brand/ 與 favicon，全是自有素材，不要從這裡取。 */

@font-face{
  font-family:'remixicon';
  src:url(data:font/woff2;base64,d09GMgABAAAAAAcEAAsAAAAADVQAAAa2AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHCoGYACBdAqSaI9oATYCJAM4CzYABCAFgSQHIBvbCqOidjBKdhB/tUA3sVZ44jcoOixSjp+iuSO8iOWiC8YTKoGwIkCHBt9A2Ob3P/d5Z968ZB8toaW2+lezAg6UKD9FXqTje1a4Ail21VtHFlDYqvyAZ/4r9pGCGZiDs+tZyVE5MK+YpExU/uD20wd2MOLg9scJeM5VoHwDEJj9p5hc26WJcorv/7dfqzO4Z7G4IW4mlnvmIfMx09kFTyYhQhNNPyLmpRDaNmg0SoLHaEZcuRQB7e3j90AALAZ5k25ls4pAfbFu9FDoTg4A1WeIZ4u8zHJdAP4vDQAP1Qi8EaKyfmFoBfy5PWMQrr2h45AP7TA4G5wGIMREDlxp7Wc8nZ5yfMutoc6/8vY3NLg01DYMbRjeML5hZaNX46TG9U3lTdub7E2tzV4t/VqWt9xp+aE1rnV829N27/hQgYr/I2QL+Tu5kxTINeRScozxd+NS4wjDccMgQ4Shn/4/XbuOLksXqXVoN2sYdeud2iEgQXTq5VAjN6ADv3RVn21XGwkCusOwVtbsGYHjtYupaEUR3yoTMRGrzXKRbrmPvOOIHlIuvfKo/atYRGw2bwWlrevukSGm9vW4f9JuUtWutnJDu3IcoGSrPA3fW9nUv5poXniAJrtN2nh2YM143cBKB0I5EGUT1EVSL9MbWV6cyYbPZKWnJrE3kqwskuGWRfvxxcS++tvGkwfvaaU6maQZzPtmhqEiB0WZUufoWgg3loBOQhxBHkRZpjfr+Y08TQTLWF6at4A2g51RCu0uLZU4vsiAydJvvwYsF9s/B0wUvfiUmy0qdaZOluSnLhU9UieKH/H5yI9ne4EmD7qm5f2QT+yzFmlt49IB0v6tUgn6VGCn/b2jyuGQfFn2aIfpL16UwPT9y0+IkrhRjDbueIASCU3p3sQB9uqQpfQgO3X4SlD1MxyUK2ZoKT3pZV27qMO8GybNu7bwHEpOPK+uM5x82OawA6fJ5JFi4spYKpkwNukQiEZiB2kGlhqjJnIT2vcQeQqUDreAFpIv1Cw893Ti2dvl9y8mn79rso28znBxkq0mL2xXYkuzo//5rgaflKzpom5R5v0Nn7T+SULccQk6bWIEUXcuWNvHRh+Z/PaQjkO+ONa32ycp2GKRRB8llX7JUQ/lFIWKmuW6UpmHSh+gkDgQ/nvYaaTlNcA7uKzP88jle3vuUZ8jHxrV5Y5nrpjY40zPk7Ryzo5AJSLewHcIc+11WKdUsOzsBxQTWLzz1SuGjUWgAkF6zyNHWPZQJqGnJ0Lpd9lOLAMyha95y2zyAUlRtFoSNmI59TjaKVJip5+IIvR2W4c04nOYkrWkiAs6z9wFF4UzT0AsdyVolt+/z7A6fWwcw0Bpw6tXLJsMe24Ba+jZOLtzrsnE2t4IgnG0CaE011LpyXksXOjBeVY+kNBgwQPv+A/ClmZ+SGVYWUhIWVjlDxIaLHjG/iEcH/UWEZ1II1Q9FsgHJJfwSyMEe8ufjIE85+T8+OVOVPeF6Nq8Sz4pXl4pPlTxEk4UfTzwHlH+FskHvg9IvLuG4lqsBjJwwXIU7N1WkLjTgkFvx+6n9weDINzP/83x2BIWBNM3qzTY6SZN47Kq9VNUPfyXhX3v+j2l+feoPNzytl3WWU1XX/ejpIvG1SCy/g+Wbfs/oVdqTb4pp3//HFP+lQc0WPAkXQlb1uDEGFu02Rxti3FKaLDgSXKGvhMrC1zzXOFIbm+0GGaIHMUhCnM610+oxmrh7V34mg+ZjbPfJbvA27jXD4fDDv8Qdo7abhtNUCD8t9t2O8tS2yNM9/QeORNH4RFljoWEVmOOssU6ESjGZfmJOT3SuzOryNbNW9mamcTObaka9u33n76o36zmxUsif/GS8xLctQ35Dmw5BPO9Ga/kZC/Ge4eEBguehny/6wUpV0rKLikKgMfeFZR8PqwiNLRiMENLHhx0IDloS5AzSBgEPVR+AZ0yMilp5HwJbZcUGqlLVOBduvo7JAsI9AofUUAh3LR3DQDq1UiByt5A2ThX/j8+qnef9Kf3bJ96PKg1sPq9bBk/xtZVA0JF+J9B39RTNs6yCMF8xfYo/4PXGx/XS3avyZGWLFRJDG4aroSa6iBtWLfat0WybVwv+M9x+qhFZgUJAALCx/+zRhPz8iuFvATA72vfQrIYLrMz82EaGsBAJfqnKRfkZQH2brgnkaApFh0Izb1+oWvK08LaV4YxDpGBxLD2aDOE0MoYwmjE4EiVNVIwRKNTSHyEjytgNsQA41HS8YYZaqQbSA8q2NpqjMHqCmglJxQ5iujYgxLCXyQZYuQeAAA=) format('woff2');
  font-weight:normal;
  font-style:normal;
  /* 內嵌字型不需要 block 期間等待網路，但保留 block 語意：
     字型圖示沒有可用的 fallback 字符，一旦 fallback 就是一格 .notdef 方框。 */
  font-display:block;
}

/* 字符：套在任何帶 ri- class 的元素上。 */
[class^="ri-"],
[class*=" ri-"]{
  font-family:'remixicon'!important;
  font-style:normal;
  font-weight:normal;
  font-variant:normal;
  text-transform:none;
  line-height:1;
  -webkit-font-smoothing:antialiased;
  -moz-osx-font-smoothing:grayscale;
}


.ico,
.ext,
.lempty-ico,
.dempty-ico{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  width:1em;
  height:1em;
  flex:none;
  /* 未被更具體規則覆寫時的預設字級。 */
  font-size:16px;
}

.ri-add-line:before{content:"\ea13"}
.ri-alert-line:before{content:"\ea21"}
.ri-arrow-left-line:before{content:"\ea60"}
.ri-arrow-right-s-line:before{content:"\ea6e"}
.ri-arrow-right-up-line:before{content:"\ea70"}
.ri-arrow-up-s-line:before{content:"\ea78"}
.ri-bank-card-line:before{content:"\ea92"}
.ri-calendar-line:before{content:"\eb27"}
.ri-check-line:before{content:"\eb7b"}
.ri-close-line:before{content:"\eb99"}
.ri-download-line:before{content:"\ec5a"}
.ri-error-warning-line:before{content:"\eca1"}
.ri-file-copy-line:before{content:"\ecd5"}
.ri-file-list-3-line:before{content:"\ecef"}
.ri-filter-line:before{content:"\ed27"}
.ri-home-5-line:before{content:"\ee1f"}
.ri-layout-grid-line:before{content:"\ee90"}
.ri-loader-4-line:before{content:"\eec6"}
.ri-logout-box-r-line:before{content:"\eeda"}
.ri-menu-line:before{content:"\ef3e"}
.ri-more-fill:before{content:"\ef78"}
.ri-search-line:before{content:"\f0d1"}
.ri-side-bar-line:before{content:"\f128"}
.ri-user-line:before{content:"\f264"}
.ri-wallet-3-line:before{content:"\f2ac"}
