1<!doctype html> 2<html lang="zh-Hans"> 3 <head> 4
4<script>window.__XXD_LOCALE__="zh-Hans";</script>
4 5 <meta name="xxd-traditional-module" content="/traditional-display.087a176bf9.js"> 6 <meta charset="utf-8"> 7 <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> 8 <meta name="robots" content="noindex, nofollow"> 9 <link rel="icon" href="/favicon.svg?v=grumpy-bear-tile" type="image/svg+xml"> 10 <!-- Warm the image origin early: the LCP element is a catalog thumbnail 11 served from img.xiaoxiaodong.ai, so a cold DNS+TCP+TLS handshake to that 12 third origin otherwise sits on the LCP path. --> 13 <link rel="preconnect" href="https://img.xiaoxiaodong.ai" crossorigin> 14 <link rel="dns-prefetch" href="https://img.xiaoxiaodong.ai"> 15
15<script src="/device-session.5edf265750.js"></script>
15 16
16<script src="/conversion-analytics.4699856b43.js"></script>
16 17 <!-- Boot prefetch: fire /api/me + public stats + first-grid data and navigation preferences during HTML parse on grid 18 routes so they overlap the deferred app.js download instead of starting 19 only after it executes. app.js reuses window.__XXD_SEED and these 20 in-flight promises (see __XXD_BOOT consumption in app.js), so there is 21 no double fetch; any failure resolves to null and app.js falls back to 22 its own request. size must match STYLE_BATCH_SIZE (36). --> 23
23<script> 24 (() => { 25 // Mark the document as JS-capable before the body is parsed. Public 26 // open-source pages carry a server-rendered SEO snapshot for crawlers 27 // and no-JS users; the runtime hides that snapshot during hydration so 28 // it cannot flash a second, differently styled grid before the shared 29 // interactive waterfall is ready. 30 document.documentElement.classList.add("has-js-runtime"); 31 document.documentElement.classList.add("is-site-footer-pending"); 32 try { 33 const a = new Uint32Array(1); 34 if (self.crypto && self.crypto.getRandomValues) self.crypto.getRandomValues(a); 35 const seed = a[0] || (Date.now() % 2147483647); 36 const opt = { credentials: "same-origin", headers: { accept: "application/json" } }; 37 const locale = String(window.__XXD_LOCALE__ || (String(location.pathname || "/") === "/en" || String(location.pathname || "/").startsWith("/en/") ? "en" : "zh-CN")); 38 const localizedApiUrl = (value) => { 39 const url = new URL(String(value || ""), location.origin); 40 if (locale === "en" && !url.searchParams.has("locale")) url.searchParams.set("locale", "en"); 41 return `${url.pathname}${url.search}${url.hash}`; 42 }; 43 const logicalPathname = String(location.pathname || "/").replace(/^\/en(?=\/|$)/, "") || "/"; 44 const grab = (u, timeoutMs = 10000) => { 45 const controller = typeof AbortController === "function" ? new AbortController() : null; 46 let timer = 0; 47 const request = fetch(localizedApiUrl(u), { ...opt, ...(controller ? { signal: controller.signal } : {}) }) 48 .then((r) => (r.ok ? r.json() : null)) 49 .catch(() => null); 50 const timeout = new Promise((resolve) => { 51 timer = setTimeout(() => { 52 resolve(null); 53 controller?.abort(); 54 }, timeoutMs); 55 }); 56 return Promise.race([request, timeout]).finally(() => clearTimeout(timer)); 57 }; 58 const firstPath = logicalPathname.split("/").filter(Boolean)[0] || ""; 59 const hashRoute = String(location.hash || "").replace(/^#/, ""); 60 // Select the initial placeholder before the body paints, including English and legacy links. 61 const isCreateEntry = /^\/image-generator\/?$/.test(logicalPathname) 62 || /^image-generator\/?$/.test(hashRoute); 63 if (isCreateEntry) document.documentElement.classList.add("is-image-create-boot"); 64 // Pick the boot skeleton that previews this route's final layout, so 65 // the first paint shows structure instead of a lone status line. 66 const bootLayoutPath = /^(favorites|articles|article\/|settings|image-generator|notifications)(\/|$)/.test(hashRoute) 67 ? hashRoute.split("/")[0] : firstPath; 68 document.documentElement.dataset.bootLayout = isCreateEntry ? "composer" 69 : (!bootLayoutPath || ["prompts", "favorites", "open-source", "image-generator", "media-library"].includes(bootLayoutPath)) ? "waterfall" 70 : ["skills"].includes(bootLayoutPath) || /^\/tools\/github\/?$/.test(logicalPathname) ? "content" 71 : ["articles", "article", "tools", "notifications"].includes(bootLayoutPath) ? "articles" 72 : bootLayoutPath === "settings" ? "settings" : "generic"; 73 // Only a boot that is genuinely slow earns visible copy. 74 setTimeout(() => { 75 if (document.body && document.body.classList.contains("is-app-booting")) document.documentElement.classList.add("is-boot-slow"); 76 }, 8000); 77 const hashIsStandalone = /^(favorites|articles|article\/|settings|image-generator|notifications)(\/|$)/.test(hashRoute); 78 const shouldBootCatalog = !hashIsStandalone && (!firstPath || firstPath === "prompts"); 79 const hashIsFavorites = /^favorites(\/|$)/.test(hashRoute); 80 const favoriteSearch = new URLSearchParams(location.search || ""); 81 const isPagedLatestFavorites = /^\/favorites\/prompts\/?$/.test(logicalPathname) 82 && favoriteSearch.get("sort") === "latest" 83 && !favoriteSearch.get("q") && !favoriteSearch.get("color"); 84 const shouldBootFavorites = (shouldBootCatalog || firstPath === "favorites" || firstPath === "open-source" || hashIsFavorites) 85 && !isPagedLatestFavorites; 86 const me = window.XxdDeviceSession ? window.XxdDeviceSession.guard(() => grab("/api/me")) : grab("/api/me"); 87 const authenticatedRead = (read) => me.then((session) => session?.authenticated ? read(session) : null); 88 const memberCatalogSort = () => "recommended"; 89 // Visitor decks of the recommended feeds (src/app/feed-rotation.js): 90 // continue where the previous visit stopped.
91 const feedDeck = (surface) => { 92 const key = surface + ":" + (locale === "en" ? "en" : "zh"); 93 let store = {}; 94 try { store = JSON.parse(localStorage.getItem("xxdFeedDeck.v1") || "{}") || {}; } catch (e) {} 95 let deck = store[key]; 96 if (!deck || !(Math.trunc(Number(deck.seed)) >= 1 && Math.trunc(Number(deck.seed)) <= 256)) { 97 deck = { seed: 1 + Math.floor(Math.random() * 256), from: null }; 98 store[key] = deck; 99 try { localStorage.setItem("xxdFeedDeck.v1", JSON.stringify(store)); } catch (e) {} 100 } 101 return { seed: Math.trunc(Number(deck.seed)), from: deck.from ?? null }; 102 }; 103 const feedDecks = window.__XXD_FEED_DECKS = { member: feedDeck("member"), open: feedDeck("open") }; 104 const memberDeckParams = "&seed=" + feedDecks.member.seed + (feedDecks.member.from ? "&from=" + encodeURIComponent(feedDecks.member.from) : ""); 105 window.__XXD_SEED = seed; 106 window.__XXD_BOOT = { 107 seed: seed, 108 me, 109 stats: grab("/api/public-stats"), 110 catalogSort: shouldBootCatalog ? me.then(memberCatalogSort) : null, 111 catalog: shouldBootCatalog 112 ? authenticatedRead((session) => grab(`/api/catalog?page=1&size=36&sort=${memberCatalogSort(session)}${session?.is_admin ? "" : "&topics=none"}${memberDeckParams}`)) 113 : null, 114 topicNavDefaults: shouldBootCatalog ? authenticatedRead(() => grab("/api/topic-nav/defaults")) : null, 115 topicNavPreferences: shouldBootCatalog ? authenticatedRead(() => grab("/api/topic-nav/preferences")) : null, 116 favorites: shouldBootFavorites ? authenticatedRead(() => grab("/api/favorites")) : null, 117 openSource: null, 118 openSourceParams: "" 119 }; 120 if (firstPath === "open-source") { 121 const segments = logicalPathname.split("/").filter(Boolean).map((part) => { try { return decodeURIComponent(part); } catch (err) { return part; } }); 122 const search = new URLSearchParams(location.search || ""); 123 const params = new URLSearchParams({ page: "1", size: "36", sort: ["popular", "latest"].includes(search.get("sort")) ? search.get("sort") : "recommended" }); 124 const q = String(search.get("q") || "").trim(); 125 const objectRoute = segments[1] === "style" || segments[1] === "image"; 126 if (search.get("kind") === "media" || (segments[1] === "image" && String(segments[2]).startsWith("media~"))) params.set("kind", "media"); 127 if (q && !objectRoute) params.set("q", q); 128 if (segments[1] && !objectRoute) params.set("channel", segments[1]); 129 if (params.get("sort") === "recommended" && !params.has("kind")) { 130 params.set("seed", String(feedDecks.open.seed)); 131 if (!params.has("q") && !params.has("channel") && feedDecks.open.from) params.set("from", String(feedDecks.open.from)); 132 } 133 window.__XXD_BOOT.openSourceParams = params.toString(); 134 // An uncached projection can take longer than 10 s. Aborting it would 135 // discard the server work and make the app start the same slow 136 // request again, so this prefetch waits for the real answer. 137 window.__XXD_BOOT.openSource = grab("/api/open-source/images?" + params.toString(), 45000); 138 } 139 } catch (e) {} 140 })(); 141 </script>
141 142
142<script> 143 (() => { 144 try { 145 const t = localStorage.getItem("xxdMemberTheme"); 146 if (t === "dark" || t === "light") document.documentElement.dataset.theme = t; 147 if (localStorage.getItem("xxdMemberMono") === "on") document.documentElement.dataset.mono = "on"; 148 if (localStorage.getItem("xxdQuietImageMode") === "true") document.documentElement.dataset.bootQuietImages = "on"; 149 } catch (e) {} 150 })(); 151 </script>
151 152 <link rel="preconnect" href="https://fonts.googleapis.com"> 153 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 154 <!-- Load the font CSS non-render-blocking: fetch as a low-priority "print" 155 sheet, then flip to "all" once it arrives. Text paints immediately in 156 the system fallback (the URL carries display=swap) and swaps in the 157 web fonts with no first-paint stall. <noscript> keeps it working with 158 JS disabled. --> 159 <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=M+PLUS+Rounded+1c:wght@400;500;700&family=Noto+Serif+SC:wght@600;700;900&display=swap" media="print" onload="this.media='all'"> 160 <noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=M+PLUS+Rounded+1c:wght@400;500;700&family=Noto+Serif+SC:wght@600;700;900&display=swap"></noscript> 161 <link rel="stylesheet" href="/styles.f221c28aa9.css"> 162 <link rel="stylesheet" href="/admin-user-data.ec6286ca6d.css"> 163 <!-- Self-hosted on the Cloudflare origin (reachable in mainland China). The 164 jsdelivr CDN is frequently blocked/throttled there, which left every nav 165 and action icon blank for the core audience. --> 166
166<script src="/lucide-core.c2c43654fa.js" defer></script>
166 167 <meta property="og:type" content="website"> 168 <meta property="og:site_name" content="Xiaoxiaodong"> 169 <meta property="og:description" content="å°å°ä¸ç²¾éç AI å¾çæç¤ºè¯ãè§è§é£æ ¼ãç宿å¾ä¸ä¼ååä½å·¥å ·ã"> 170 <meta property="og:url" content="https://vip.xiaoxiaodong.ai/favorites"> 171 <meta property="og:image" content="https://vip.xiaoxiaodong.ai/social/default-zh-v1.png"> 172 <meta property="og:image:secure_url" content="https://vip.xiaoxiaodong.ai/social/default-zh-v1.png"> 173 <meta property="og:image:type" content="image/png"> 174 <meta property="og:image:width" content="1200"> 175 <meta property="og:image:height" content="630"> 176 <meta property="og:image:alt" content="å°å°ä¸ AI æç¤ºè¯ä¼åç«åçå°é¢ï¼é æç头å"> 177 <meta name="twitter:card" content="summary_large_image"> 178 <meta name="twitter:description" content="å°å°ä¸ç²¾éç AI å¾çæç¤ºè¯ãè§è§é£æ ¼ãç宿å¾ä¸ä¼ååä½å·¥å ·ã"> 179 <meta name="twitter:image" content="https://vip.xiaoxiaodong.ai/social/default-zh-v1.png"> 180 <meta name="twitter:image:alt" content="å°å°ä¸ AI æç¤ºè¯ä¼åç«åçå°é¢ï¼é æç头å"> 181 <link rel="canonical" href="https://vip.xiaoxiaodong.ai/favorites"> 182 <link rel="alternate" hreflang="zh-Hans" href="https://vip.xiaoxiaodong.ai/favorites"> 183 <link rel="alternate" hreflang="zh-Hant" href="https://vip.xiaoxiaodong.ai/zh-hant/favorites"> 184 <link rel="alternate" hreflang="en" href="https://vip.xiaoxiaodong.ai/en/favorites"> 185 <title>å¿å¨æ ·å¼ ï½æ¶èï½å°å°ä¸</title><meta property="og:title" content="å¿å¨æ ·å¼ ï½æ¶èï½å°å°ä¸"><meta name="twitter:title" content="å¿å¨æ ·å¼ ï½æ¶èï½å°å°ä¸"></head> 186 <body class="is-app-booting is-topic-nav-booting" data-locale="zh-Hans"> 187 <aside class="app-rail" id="appRail" aria-label="主èå"> 188 <nav class="rail-nav"> 189 <span id="railActiveIndicator" class="rail-active-indicator" aria-hidden="true"></span> 190 <span class="rail-boot-skeleton" aria-hidden="true"><i></i><i></i><i></i><i></i><i></i></span> 191 <a href="/" data-app-view="public-home" aria-current="false" aria-label="é¦é¡µ" data-rail-tooltip="é¦é¡µ"> 192 <span class="rail-symbol" aria-hidden="true"> 193 <svg class="lucide rail-home-icon" xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="miter" aria-hidden="true" focusable="false"> 194 <path pathLength="100" d="m4 10 8-6.5 8 6.5"></path> 195 <path pathLength="100" d="M6 8.5V20h4v-6h4v6h4V8.5"></path> 196 </svg> 197 </span> 198 <em>é¦é¡µ</em> 199 </a> 200 <a href="/" data-app-view="archive" aria-current="page" aria-label="æç¤ºè¯" data-rail-tooltip="æç¤ºè¯"> 201 <span class="rail-symbol" aria-hidden="true"> 202 <svg class="lucide rail-prompt-icon" xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="miter" aria-hidden="true" focusable="false"> 203 <path pathLength="100" d="m4 10 8-6.5 8 6.5"></path> 204 <path pathLength="100" d="M6 8.5V20h4v-6h4v6h4V8.5"></path> 205 </svg> 206 </span> 207 <em>æç¤ºè¯</em> 208 </a> 209 <a href="/favorites" data-app-view="favorites" aria-label="æ¶è" aria-current="false" data-rail-tooltip="æ¶è"> 210 <span class="rail-symbol" aria-hidden="true"> 211 <svg class="lucide rail-bookmark-icon" xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="miter" aria-hidden="true" focusable="false"> 212 <path pathLength="100" d="M6 3.5h12v17l-6-4-6 4Z"></path> 213 </svg> 214 </span> 215 <em>æ¶è</em> 216 </a> 217 <a href="/open-source" data-app-view="open-source" aria-label="弿º" aria-current="false" data-rail-tooltip="弿º">
218 <span class="rail-symbol" aria-hidden="true"> 219 <svg class="lucide rail-code-icon" xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="miter" aria-hidden="true" focusable="false"> 220 <path class="rail-code-left" d="m8 6-5 6 5 6"></path> 221 <path class="rail-code-right" d="m16 6 5 6-5 6"></path> 222 <path class="rail-code-slash" pathLength="100" d="m14 4-4 16"></path> 223 </svg> 224 </span> 225 <em>弿º</em> 226 </a> 227 <a href="/skills" data-app-view="skills" aria-label="Skills" aria-current="false" data-rail-tooltip="Skills"> 228 <span class="rail-symbol" aria-hidden="true"> 229 <svg class="lucide rail-skills-icon" xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="miter" aria-hidden="true" focusable="false"> 230 <rect x="4.5" y="4.5" width="6" height="6"></rect> 231 <rect x="13.5" y="4.5" width="6" height="6"></rect> 232 <rect x="4.5" y="13.5" width="6" height="6"></rect> 233 <path class="rail-skills-add" pathLength="100" d="M16.5 13.5v6m-3-3h6"></path> 234 </svg> 235 </span> 236 <em>Skills</em> 237 </a> 238 <a href="/tools" data-app-view="articles" aria-label="å·¥å ·ç®±" aria-current="false" data-rail-tooltip="å·¥å ·ç®±"> 239 <span class="rail-symbol" aria-hidden="true"> 240 <svg class="lucide rail-toolbox-icon" xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="miter" aria-hidden="true" focusable="false"> 241 <path class="rail-toolbox-handle" d="M8.5 8V4.5h7V8"></path> 242 <path class="rail-toolbox-body" pathLength="100" d="M3.5 8h17v12h-17Z"></path> 243 <path class="rail-toolbox-lid" pathLength="100" d="M3.5 12.5H10V15h4v-2.5h6.5"></path> 244 </svg> 245 </span> 246 <em>å·¥å ·ç®±</em> 247 </a> 248 <button id="articleNotificationButton" class="rail-nav-button article-notification-button" type="button" data-app-view="notifications" aria-label="æ¥çéç¥æç« " aria-pressed="false" aria-current="false" data-rail-tooltip="éç¥"> 249 <span class="rail-symbol" aria-hidden="true"> 250 <i data-lucide="bell"></i> 251 <span id="notificationUnreadBadge" class="rail-notify-badge" hidden>0</span> 252 </span> 253 <em>éç¥</em> 254 </button> 255 <a href="/media-library" data-app-view="admin-media-library" aria-label="å ±ç¨ç´ æ" aria-current="false" data-rail-tooltip="å ±ç¨ç´ æ"> 256 <span class="rail-symbol" aria-hidden="true"> 257 <svg class="lucide lucide-folder-open rail-folder-icon" xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="miter" aria-hidden="true" focusable="false"> 258 <path class="rail-folder-back" d="M3.5 9.5v-5h6l2.5 2.5h8.5v2.5"></path> 259 <path class="rail-folder-front" d="M3.5 9.5h17v10h-17Z"></path> 260 </svg> 261 </span> 262 <em>å ±ç¨ç´ æ</em> 263 </a> 264 <a href="/image-generator" data-app-view="image-generator" aria-label="ä½å¾å§" aria-current="false" data-rail-tooltip="ä½å¾å§"> 265 <span class="rail-symbol" aria-hidden="true"> 266 <svg class="lucide rail-image-icon" xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="miter" aria-hidden="true" focusable="false"> 267 <rect x="3.5" y="3.5" width="17" height="17" pathLength="100"></rect> 268 <circle cx="16.5" cy="7.5" r="1.5"></circle> 269 <path d="m3.5 16.5 6-6 11 10"></path> 270 </svg>
271 <span id="imageGeneratorNotify" class="rail-notify-badge" hidden>0</span> 272 </span> 273 <em>ä½å¾å§</em> 274 </a> 275 <button id="openAdminControlPanelButton" class="rail-nav-button admin-control-button" data-rail-action="admin-control" data-rail-tooltip="管çååè½" type="button" aria-label="管çååè½" aria-haspopup="dialog" aria-controls="adminControlPanel" aria-expanded="false" aria-pressed="false" hidden> 276 <span class="rail-symbol admin-control-button-symbol" aria-hidden="true"> 277 <i data-lucide="shield"></i> 278 <svg class="admin-control-check ui-icon" viewBox="0 0 24 24" fill="none" aria-hidden="true"> 279 <path d="m9.4 12.4 1.8 1.8 3.5-4.1"></path> 280 </svg> 281 </span> 282 <em>管çååè½</em> 283 </button> 284 <button id="railMoreButton" class="rail-nav-button rail-more-button" type="button" aria-label="æ´å¤å¯¼èª" data-rail-tooltip="æ´å¤å¯¼èª" aria-haspopup="dialog" aria-expanded="false" aria-controls="railMoreMenu" popovertarget="railMoreMenu" hidden> 285 <span class="rail-symbol" aria-hidden="true"><i data-lucide="ellipsis"></i></span> 286 <em>æ´å¤</em> 287 </button> 288 </nav> 289 <button id="railMember" class="rail-account" type="button" data-rail-tooltip="è´¦å·" aria-haspopup="dialog" aria-expanded="false"> 290 <span class="rail-symbol rail-account-icon" aria-hidden="true"> 291 <i data-lucide="user-round"></i> 292 </span> 293 <em id="railMemberLabel">è´¦å·</em> 294 </button> 295 </aside> 296 <div id="railTooltip" class="rail-tooltip" role="tooltip" aria-hidden="true"></div> 297 <div id="railMoreMenu" class="rail-more-menu" popover="auto" role="dialog" aria-label="æ´å¤å¯¼èª"> 298 <div id="railMoreItems" class="rail-more-items"></div> 299 </div> 300 301 <div id="catalogMoreMenu" class="media-library-context-menu media-library-more-menu catalog-more-menu" popover="auto" role="menu" aria-label="æ´å¤æä½" hidden> 302 <div data-catalog-menu-global> 303 <div class="media-library-menu-divider" data-catalog-context-divider role="separator"></div> 304 <button id="localeSwitch" class="media-library-context-menu-item" type="button" role="menuitem" aria-haspopup="menu" aria-expanded="false" data-catalog-language-menu tabindex="-1"> 305 <i data-lucide="languages" aria-hidden="true"></i><span>è¯è¨å好</span><span data-current-language class="media-library-sort-current" translate="no"></span><i data-lucide="chevron-right" aria-hidden="true"></i> 306 </button> 307 <button id="openAdminControlPanelMenuButton" class="media-library-context-menu-item" type="button" role="menuitem" aria-haspopup="dialog" aria-expanded="false" aria-controls="adminControlPanel" tabindex="-1" hidden> 308 <i data-lucide="shield" aria-hidden="true"></i><span>管çå颿¿</span> 309 </button> 310 <button id="themeToggle" class="media-library-context-menu-item theme-toggle-button" type="button" role="menuitem" aria-label="忢æè²æ¨¡å¼" tabindex="-1"> 311 <i data-lucide="moon" aria-hidden="true"></i><span>æè²æ¨¡å¼</span> 312 </button> 313 </div> 314 </div> 315 316 <div id="accountMenu" class="account-menu ui-popover" hidden> 317 <div class="account-menu-head"> 318 <span class="account-avatar" aria-hidden="true"> 319 <img id="accountMenuAvatar" alt="" hidden> 320 <span id="accountMenuAvatarFallback" class="account-avatar-fallback">ä¸</span> 321 </span> 322 <div> 323 <strong id="accountMenuTitle">æªç»å½</strong> 324 <p id="accountMenuMeta">ä¼åä¸å¿</p> 325 </div> 326 </div> 327 <button id="accountSettingsButton" type="button" hidden> 328 <i data-lucide="settings-2" aria-hidden="true"></i> 329 <span>设置ä¸å¿</span> 330 </button> 331 <button id="accountShortcutSettingsButton" type="button" hidden> 332 <i data-lucide="keyboard" aria-hidden="true"></i> 333 <span>å¿«æ·é®è®¾ç½®</span> 334 </button> 335 <button id="accountProfileButton" type="button" hidden> 336 <i data-lucide="user-round-pen" aria-hidden="true"></i>
337 <span>ç¼è¾èµæ</span> 338 </button> 339 <button id="accountLoginButton" type="button">ç»å½</button> 340 <button id="accountLogoutButton" type="button" hidden>éåºç»å½</button> 341 </div> 342 343 <a id="wechatSupportButton" class="wechat-support-button" href="https://work.weixin.qq.com/kfid/kfcccac384193047e7e" target="_blank" rel="noopener noreferrer" aria-label="éè¿å¾®ä¿¡å®¢æå¨è¯¢" hidden> 344 <i data-lucide="message-circle" aria-hidden="true"></i> 345 <span>微信客æ</span> 346 </a> 347 348 <header class="site-header"> 349 <span id="topicNavActiveIndicator" class="topic-nav-active-indicator" aria-hidden="true"></span> 350 <nav id="topicNav" class="topic-nav section-subnav" aria-label="æç¤ºè¯åç±»" aria-busy="true"> 351 <span class="topic-nav-skeleton" role="status"><span class="sr-only">æ£å¨è·åæ ç®â¦</span><i aria-hidden="true"></i><i aria-hidden="true"></i><i aria-hidden="true"></i><i aria-hidden="true"></i><i aria-hidden="true"></i><i aria-hidden="true"></i><i aria-hidden="true"></i></span> 352 </nav> 353 <div class="header-tools"> 354 <a id="headerGithubLink" class="header-icon-button header-github-link" href="https://github.com/nevertoday" target="_blank" rel="noopener noreferrer" aria-label="æå¼ GitHub 主页" hidden> 355 <svg viewBox="0 0 24 24" aria-hidden="true"> 356 <path d="M15 22v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 19 4.77 5.07 5.07 0 0 0 18.91 1S17.73.65 15 2.48a13.38 13.38 0 0 0-7 0C5.27.65 4.09 1 4.09 1A5.07 5.07 0 0 0 4 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 8 18.13V22"></path> 357 <path d="M8 19c-3 .9-5.5 0-7-2"></path> 358 </svg> 359 </a> 360 <span id="headerMoreAnchor" hidden></span> 361 <button id="headerStartButton" class="header-start-button" type="button" aria-haspopup="dialog" aria-controls="authDialog" hidden>å¼å§ä½¿ç¨</button> 362 <button id="headerAccountButton" class="header-icon-button header-account-button" type="button" aria-label="è´¦å·" aria-haspopup="dialog" aria-expanded="false"> 363 <i data-lucide="user-round" aria-hidden="true"></i> 364 </button> 365 </div> 366 </header> 367 368 <main> 369 <!-- Boot curtain stand-in. `is-app-booting` hides every real section until 370 auth + routing settle, and member.html gets no `has-server-*` escape 371 hatch when a member session cookie is present (worker.js only injects 372 those for logged-out visitors) â so without this the whole shell is a 373 blank page for as long as /api/me takes, and D1 single-row reads have 374 been tailing past 10s. Decorative: the real grid replaces it. --> 375 <div id="bootSkeleton" class="boot-skeleton" role="status"> 376 <span class="boot-skeleton-status boot-skeleton-status-zh sr-only">æ£å¨å è½½ä¼åå 容â¦</span> 377 <span class="boot-skeleton-status boot-skeleton-status-en sr-only">Loading your libraryâ¦</span> 378 <p class="boot-skeleton-slow boot-skeleton-slow-zh">ç½ç»è¾æ ¢ï¼ä»å¨å è½½â¦</p> 379 <p class="boot-skeleton-slow boot-skeleton-slow-en">The network is slow â still loadingâ¦</p> 380 <div class="boot-skeleton-composer" aria-hidden="true"><span></span><div><i></i><i></i><i></i></div></div> 381 <div class="boot-skeleton-toolbar" aria-hidden="true"><i></i><i></i><i></i><i></i></div> 382 <div class="ui-loading-skeleton waterfall-skeleton" aria-hidden="true"><span><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span><span><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span><span><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span><span><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span><span><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span><span><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span><span><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span><span><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span><span><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span><span><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span><span><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span><span><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span><span><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span><span><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span></div> 383 <div class="boot-skeleton-content" aria-hidden="true"><span><i></i><b></b><b></b></span><span><i></i><b></b><b></b></span><span><i></i><b></b><b></b></span><span><i></i><b></b><b></b></span><span><i></i><b></b><b></b></span><span><i></i><b></b><b></b></span><span><i></i><b></b><b></b></span><span><i></i><b></b><b></b></span><span><i></i><b></b><b></b></span></div> 384 <div class="boot-skeleton-settings" aria-hidden="true"><span><i></i><i></i><i></i><i></i><i></i><i></i></span><div><b></b><b></b><b></b><b></b><b></b><b></b><b></b></div></div> 385 <div class="boot-skeleton-generic" aria-hidden="true"><i></i><b></b><b></b><b></b></div> 386 </div> 387 <dialog id="authDialog" class="auth-dialog ui-dialog" aria-labelledby="authDialogTitle"> 388 <div class="auth-dialog-head ui-dialog-head"> 389 <div> 390 <p id="authDialogEyebrow" class="eyebrow" hidden></p> 391 <h2 id="authDialogTitle">æ¬¢è¿æ¥å°å°å°ä¸</h2><p class="auth-dialog-subtitle">ç»å½æå建账å·</p> 392 </div> 393 <button id="closeAuthButton" class="icon-button" type="button" aria-label="å ³é"><svg class="ui-icon" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="miter" aria-hidden="true" focusable="false">
393<path d="m6 6 12 12M18 6 6 18"/></svg></button> 394 </div> 395 <div class="login-actions ui-dialog-card" aria-label="ç»å½ä¸ä¼åæ¿æ´»"> 396 <form id="loginForm" class="auth-panel" data-auth-step="email"> 397 <div id="authMethodOptions" class="auth-method-options"> 398 <button id="googleLoginButton" class="auth-google-button" type="button"> 399 <svg class="google-brand-mark" viewBox="0 0 24 24" aria-hidden="true"> 400 <path fill="#4285F4" d="M21.6 12.2c0-.7-.1-1.4-.2-2.1H12v4h5.4a4.6 4.6 0 0 1-2 3v2.6h3.3c1.9-1.8 2.9-4.4 2.9-7.5Z"/> 401 <path fill="#34A853" d="M12 22c2.7 0 5-.9 6.7-2.3l-3.3-2.6c-.9.6-2.1 1-3.4 1-2.6 0-4.8-1.8-5.6-4.1H3v2.7A10 10 0 0 0 12 22Z"/> 402 <path fill="#FBBC05" d="M6.4 14a6 6 0 0 1 0-3.9V7.3H3a10 10 0 0 0 0 9.4L6.4 14Z"/> 403 <path fill="#EA4335" d="M12 5.9c1.5 0 2.8.5 3.9 1.5l2.9-2.9A9.8 9.8 0 0 0 3 7.3l3.4 2.8C7.2 7.7 9.4 5.9 12 5.9Z"/> 404 </svg> 405 <span id="googleLoginLabel">ä½¿ç¨ Google ç»§ç»</span> 406 </button> 407 <p id="googleMethodDescription" class="auth-google-note" hidden></p> 408 <div class="auth-method-divider" aria-hidden="true"><span>æä½¿ç¨é®ç®±</span></div> 409 </div> 410 <div class="auth-email-fields"> 411 <label class="ui-field"> 412 <span class="sr-only">é®ç®±å°å</span> 413 <input id="emailInput" type="email" autocomplete="username" inputmode="email" autocapitalize="none" spellcheck="false" placeholder="è¾å ¥é®ç®±å°å" required> 414 </label> 415 <div id="authPasswordStep" class="auth-password-step" hidden> 416 <label class="ui-field"> 417 <span class="sr-only">å¯ç </span> 418 <input id="passwordInput" type="password" autocomplete="current-password" minlength="1" maxlength="1024" aria-describedby="passwordRequirements" placeholder="è¾å ¥æè®¾ç½®å¯ç " required disabled> 419 </label> 420 <p id="passwordRequirements" class="auth-password-requirements">å·²æè´¦å·è¯·è¾å ¥å¯ç ï¼é¦æ¬¡ä½¿ç¨è¯·è®¾ç½®è³å° 8 ä½å¯ç ã</p> 421 </div> 422 </div> 423 <p id="loginStatus" class="login-status auth-form-status" role="status" aria-live="polite" aria-atomic="true"></p> 424 <div class="auth-submit-actions"> 425 <button id="primaryAuthButton" class="auth-primary-button" type="submit" data-auth-action="continue" disabled>ç»§ç»</button> 426 <button id="authBackButton" class="ui-dialog-cancel" type="button" hidden>è¿å</button> 427 </div> 428 <button id="forgotPasswordButton" class="forgot-password-button" type="button" hidden>å¿è®°å¯ç ï¼</button> 429 <div class="auth-footer"> 430 <p class="auth-legal-notice"><span>ç»§ç»å³è¡¨ç¤ºåæ</span> <a href="/terms" target="_blank" rel="noopener">æå¡æ¡æ¬¾</a> <span>å</span> <a href="/privacy" target="_blank" rel="noopener">éç§æ¿ç</a></p> 431 </div> 432 </form> 433 <div id="activationPanel" class="activation-panel" data-stage="choose" data-activation-method="pay" data-qrcode-src="/qrcode.min.8ddd0858f9.js" hidden> 434 <div class="activation-decision-layout"> 435 <section class="activation-plan-card" aria-labelledby="activationTitle"> 436 <div class="activation-plan-head"> 437 <div> 438 <p id="activationPlanEyebrow" class="activation-plan-eyebrow">年度ä¼å</p> 439 <p id="activationTitle" class="activation-title">å ¨éæç¤ºè¯ä¼å</p> 440 </div> 441 <p class="activation-price" data-price-currency="CNY" aria-label="å¹´è´¹ 699 å "> 442 <span class="activation-price-original" aria-hidden="true">ï¿¥1,398</span> 443 <strong id="activationPriceAmount">ï¿¥699</strong> 444 <span id="activationPriceCycle">/ å¹´</span> 445 <span class="activation-price-badge">äºæä¼æ </span> 446 </p> 447 </div> 448 <p id="activationNote" class="activation-note">æ¯ä»æååç«å³å¼éå½åè´¦å·ï¼æææå¢å 1 å¹´ã</p> 449 <p id="activationRenewalDisclosure" class="activation-renewal-disclosure" hidden>Waffo å½é æ¹æ¡ä¸º US$99 / å¹´ï¼æå¹´èªå¨ç»è´¹ï¼å¯å¨è´¦å·è®¾ç½®ä¸åæ¶åç»ç»
449è´¹ã</p> 450 </section> 451 452 <div class="activation-purchase-flow"> 453 <section class="activation-method-stage" aria-label="å¼éæ¹å¼"> 454 <div id="activationMethodChoices" class="activation-method-choices" role="tablist" aria-label="å¼éæ¹å¼"> 455 <button id="activationPayMethodButton" class="activation-method-button" type="button" role="tab" data-activation-method="pay" aria-selected="true" aria-controls="activationPayMethodPanel"> 456 <span><strong>å¨çº¿è´ä¹°</strong><small id="activationPayMethodSummary">微信 / æ¯ä»å® / Waffo</small></span> 457 </button> 458 <button id="activationRedeemMethodButton" class="activation-method-button" type="button" role="tab" data-activation-method="redeem" aria-selected="false" aria-controls="activationRedeemDetails" tabindex="-1"> 459 <span><strong>å æ¢ç å¼é</strong><small>å·²æå æ¢ç </small></span> 460 </button> 461 </div> 462 </section> 463 464 <section id="activationPayMethodPanel" class="activation-method-panel activation-pay-method-panel" role="tabpanel" aria-labelledby="activationPayMethodButton"> 465 <p id="activationPaymentNote" class="activation-method-note">é¦éçå¯ç¨æ¹å¼å·²æå¨æåï¼æä¸å¯ç¨çæ¹å¼ä¼æç¡®æ 注ã</p> 466 <div id="payMethodChoices" class="pay-method-choices" role="group" aria-label="éæ©æ¯ä»æ¹å¼"> 467 <button id="openPayButton" class="activation-pay-link pay-method-button" type="button" data-pay-provider="wechat" aria-pressed="false" aria-disabled="true" disabled> 468 <span class="pay-method-mark pay-method-mark-wechat" aria-hidden="true">å¾®</span> 469 <span class="pay-method-copy"><strong>微信æ¯ä»</strong><small class="pay-method-detail" data-pay-description="æ«ç æ¯ä»">æ«ç æ¯ä»</small></span> 470 <span class="pay-method-arrow" aria-hidden="true"><svg class="ui-icon" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="miter" aria-hidden="true" focusable="false"><path d="M4 12h16m-6-6 6 6-6 6"/></svg></span> 471 </button> 472 <button id="alipayPayButton" class="activation-pay-link pay-method-button" type="button" data-pay-provider="alipay" aria-pressed="false" aria-disabled="true" disabled> 473 <span class="pay-method-mark pay-method-mark-alipay" aria-hidden="true">æ¯</span> 474 <span class="pay-method-copy"><strong>æ¯ä»å®</strong><small class="pay-method-detail" data-pay-description="æ°æ ç¾é¡µæ¯ä»">æ°æ ç¾é¡µæ¯ä»</small></span> 475 <span class="pay-method-arrow" aria-hidden="true"><svg class="ui-icon" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="miter" aria-hidden="true" focusable="false"><path d="M4 12h16m-6-6 6 6-6 6"/></svg></span> 476 </button> 477 </div> 478 <p id="payChoiceStatus" class="activation-choice-status" role="status" aria-live="polite"></p> 479 </section> 480 481 <section id="activationRedeemDetails" class="activation-method-panel activation-redeem-method-panel" role="tabpanel" aria-labelledby="activationRedeemMethodButton" hidden> 482 <p class="activation-method-note">å æ¢æååï¼ä¼åæ¶é¿ç«å³è®¡å ¥å½åè´¦å·</p> 483 <form id="activationRedeemForm" class="activation-redeem-form" novalidate> 484 <label> 485 <span>å æ¢ç </span> 486 <input id="redeemInput" type="text" autocomplete="off" placeholder="请è¾å ¥å æ¢ç " aria-describedby="redeemStatus"> 487 </label> 488 <button id="redeemButton" type="submit">ç¡®è®¤å æ¢</button> 489 </form> 490 <p id="redeemStatus" class="activation-redeem-status" role="status" aria-l
490ive="polite"></p> 491 </section> 492 </div> 493 494 <aside class="activation-benefit-panel" aria-labelledby="activationBenefitHeading"> 495 <div class="activation-benefit-head"> 496 <p>ä¼åæå¡</p> 497 <h3 id="activationBenefitHeading">å å ¥ä¼åï¼ä½ å¯ä»¥</h3> 498 </div> 499 <ul class="activation-benefit-list"> 500 <li> 501 <span class="activation-benefit-icon" aria-hidden="true"><i data-lucide="layout-grid"></i></span> 502 <span class="activation-benefit-copy"><strong>æç»æ°å¢çå®åºæ¯æç¤ºè¯</strong><small>ä¼åæç¤ºè¯åºæç»æ©å ï¼å½åæ°é以页é¢å®æ¶ç»è®¡ä¸ºåã</small></span> 503 </li> 504 <li> 505 <span class="activation-benefit-icon" aria-hidden="true"><i data-lucide="message-circle"></i></span> 506 <span class="activation-benefit-copy"><strong>ä½è æ¬äººåæ¶çç</strong><small>使ç¨ä¸æä»»ä½é®é¢é½å¯ä»¥ç´æ¥é®æï¼çå°æ¶æ¯ï¼æä¼ç¬¬ä¸æ¶é´åå¤ã</small></span> 507 </li> 508 <li> 509 <span class="activation-benefit-icon" aria-hidden="true"><i data-lucide="sparkles"></i></span> 510 <span class="activation-benefit-copy"><strong>éè¦ä»ä¹ï¼ææ¥å¼å</strong><small>åè¯æä½ éè¦çæç¤ºè¯å使ç¨åºæ¯ï¼æä¼ç´æ¥çæå¼åå¹¶è¡¥å è¿åºã</small></span> 511 </li> 512 </ul> 513 </aside> 514 </div> 515 516 <section id="payPanel" class="pay-panel" data-checkout-kind="" hidden aria-labelledby="payProviderTitle"> 517 <div class="pay-checkout-head"> 518 <div> 519 <h3 id="payProviderTitle" tabindex="-1">宿æ¯ä»</h3> 520 <p id="payProviderNote">仿¬¾åï¼æ¬é¡µä¼èªå¨ç¡®è®¤å¹¶å¼éä¼åã</p> 521 </div> 522 </div> 523 <div class="pay-checkout-body"> 524 <div id="payQr" class="pay-qr" aria-label="æ¯ä»å ¥å£"></div> 525 <div class="pay-checkout-status"> 526 <p class="pay-status-label"><span aria-hidden="true"></span>订åç¶æ</p> 527 <p id="payStatus" class="login-status" role="status" aria-live="polite"></p> 528 <p class="pay-auto-note">æ éå·æ°é¡µé¢ï¼æ¯ä»æååä¼èªå¨çæã</p> 529 <button id="payCancelButton" class="activation-back-button ui-dialog-cancel" type="button">åæ¶è®¢åå¹¶è¿å</button> 530 </div> 531 </div> 532 </section> 533 534 <div class="activation-secondary-actions"> 535 <button id="activationLogoutButton" class="activation-logout" type="button">䏿¯å½åè´¦å·ï¼åæ¢è´¦å·</button> 536 </div> 537 <p class="auth-legal-notice">è´ä¹°æå æ¢å³è¡¨ç¤ºä½ åæ<a href="/terms" target="_blank" rel="noopener">ãæå¡æ¡æ¬¾ã</a>ï¼ä¸ªäººä¿¡æ¯å¤çè§<a href="/privacy" target="_blank" rel="noopener">ãéç§æ¿çã</a>ã</p> 538 <p id="activationStatus" class="login-status auth-form-status" role="status" aria-live="polite"></p> 539 </div> 540 </div> 541 </dialog> 542 543 <section id="publicWelcome" class="public-welcome" aria-label="å°å°ä¸ä¼åæç¤ºè¯é¦é¡µ" hidden> 544 <section id="public-prompt-library" class="public-site-section public-site-prompt-library" data-public-home-section="prompt-library" aria-labelledby="publicHomeTitle"> 545 <div class="public-site-intro"> 546 <p class="public-site-eyebrow">prompt library</p> 547 <h1 id="publicHomeTitle">æåæç¤ºè¯åº</h1> 548 </div> 549 <div class="public-site-prompt-entry" aria-label="æåæç¤ºè¯åºå ¥å£"> 550 <div class="public-site-count" aria-label="æç¤ºè¯é£æ ¼æ°é"> 551 <strong id="publicStyleCount" data-public-style-count>-</strong> 552 <span>å¥æç¤ºè¯é£æ ¼</span> 553 </div> 554 <p id="gateNote" class="gate-note" hidden></p> 555 <div class="public-site-auth-cluster"> 556 <p id="publicMembershipPriceNote" class="public-site-price-note" hidden>æ£å¨ç¡®è®¤å½åå¯ç¨çå¹´åº¦æ¹æ¡â¦</p> 557 <div class="public-site-auth-actions" aria-label="è´¦å·å ¥å£"> 558 <button id="openLoginButton" class="public-site-primary public-entry-primary" type="button" aria-haspopup="dialog" aria-controls="authDialog"><span>è¿å ¥æç¤ºè¯åº</span><span aria-hidden="true"><svg class="ui-icon" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="miter" aria-hidden="true" focusable="false">
558<path d="M4 12h16m-6-6 6 6-6 6"/></svg></span></button> 559 <a id="publicBrowseLink" class="public-entry-link" href="/open-source">æµè§å ¬å¼æç¤ºè¯</a> 560 <button id="openRegisterButton" class="public-membership-link" type="button">æ¥çä¼åæ¹æ¡</button> 561 <button id="gatePayButton" class="public-site-primary gate-pay-button" type="button" hidden><span>ç«å³å å ¥</span><strong>ï¿¥699 / å¹´</strong><span class="gate-price-original" aria-hidden="true">ï¿¥1,398</span><span class="gate-price-badge">äºæ</span></button> 562 <button id="openActivateButton" class="public-site-secondary gate-redeem-button" type="button" hidden>ææå æ¢ç </button> 563 <button id="gateLogoutButton" class="gate-logout-link" type="button" hidden>éåºç»å½ / æ¢è´¦å·</button> 564 </div> 565 </div> 566 <section class="membership-preview" aria-label="年度ä¼åæç"> 567 <ul class="membership-preview-benefits"> 568 <li><span class="membership-benefit-icon" aria-hidden="true"><i data-lucide="key-round"></i></span><strong>å ¨éè§£é</strong><span>æç¤ºè¯ã忰䏿¡ä¾</span></li> 569 <li><span class="membership-benefit-icon" aria-hidden="true"><i data-lucide="sparkles"></i></span><strong>æç»ä¸æ°</strong><span>æ°æç¤ºè¯ä¸å®ç¨åºæ¯</span></li> 570 <li><span class="membership-benefit-icon" aria-hidden="true"><i data-lucide="message-circle"></i></span><strong>ä½è çç</strong><span>使ç¨é®é¢ç´æ¥æ²é</span></li> 571 </ul> 572 </section> 573 </div> 574 </section> 575 576 <section id="public-community" class="public-site-section public-site-community" data-public-home-section="community" aria-labelledby="publicCommunityTitle"> 577 <div class="public-site-intro"> 578 <p class="public-site-eyebrow">zhishixingqiu</p> 579 <h2 id="publicCommunityTitle">ç¥è¯æç</h2> 580 <p>æ«ç å å ¥æçï¼æç»è·åæç¤ºè¯æ´æ°ãæä»¶èµæå项ç®ççï¼æçä¼åä¹å¯ä»¥è§£éæåæç¤ºè¯åºã</p> 581 </div> 582 <a class="public-site-community-qr" href="https://wx.zsxq.com/group/15554814142882" target="_blank" rel="noopener noreferrer"> 583 <img src="/site-assets/zsxq-qr.svg" alt="ç¥è¯æçäºç»´ç " width="132" height="132" loading="lazy" decoding="async"> 584 <span>æ«ç æç¹å»å å ¥ç¥è¯æç</span> 585 </a> 586 </section> 587 588 <section id="public-contact" class="public-site-section public-site-contact" data-public-home-section="contact" aria-labelledby="publicContactTitle"> 589 <div class="public-site-intro"> 590 <p class="public-site-eyebrow">wechat</p> 591 <h2 id="publicContactTitle">认è¯å°å°ä¸</h2> 592 <p>æ·»å 微信ï¼è·åæç¤ºè¯ãæä»¶ãSkills ä¸ AI åºå¾æ¯æ</p> 593 </div> 594 <img class="public-site-wechat-qr" src="/site-assets/wechat-qr.png" alt="å°å°ä¸å¾®ä¿¡äºç»´ç " width="519" height="534" loading="lazy" decoding="async"> 595 <p class="public-site-contact-note">æ«æï¼æ·»å å°å°ä¸ä¸ªäººå¾®ä¿¡</p> 596 </section> 597 598 <section id="public-projects" class="public-site-section public-site-projects" aria-labelledby="publicProjectsTitle"> 599 <div class="public-site-intro public-site-projects-intro"> 600 <p class="public-site-eyebrow">built by xiaoxiaodong</p> 601 <h2 id="publicProjectsTitle">æå¼åç项ç®</h2> 602 <p>è°·ææä»¶å GitHub 项ç®åå¼å±ç¤º</p> 603 <strong>16 个å¯ç¨é¡¹ç®</strong> 604 </div> 605 <div class="public-site-project-archive"> 606 <section id="public-chrome-extensions" class="public-site-project-category" data-public-home-section="chrome-extensions" aria-labelledby="publicChromeTitle"> 607 <header class="public-site-category-head"> 608 <div><p class="public-site-eyebrow">chrome web store</p><h3 id="publicChromeTitle">è°·ææä»¶</h3></div> 609 <strong>
60913 个谷ææä»¶</strong> 610 </header> 611 <div class="public-site-project-grid" data-public-chrome-grid aria-live="polite" aria-label="è°·æ Chrome æä»¶"></div> 612 </section> 613 <section id="public-github-projects" class="public-site-project-category" data-public-home-section="projects" aria-labelledby="publicGithubProjectsTitle"> 614 <header class="public-site-category-head"> 615 <div><p class="public-site-eyebrow">github</p><h3 id="publicGithubProjectsTitle">GitHub 项ç®</h3></div> 616 <strong>3 个 GitHub 项ç®</strong> 617 </header> 618 <div class="public-site-project-grid" data-public-github-grid aria-live="polite" aria-label="GitHub 项ç®"></div> 619 </section> 620 </div> 621 </section> 622 623 <section id="public-skills" class="public-site-section public-site-skills" data-public-home-section="skills" aria-labelledby="publicSkillsTitle"> 624 <div class="public-site-intro public-site-skills-intro"> 625 <p class="public-site-eyebrow">open skills</p> 626 <h2 id="publicSkillsTitle">弿º Skills</h2> 627 <p>æéå¤ä»»å¡äº¤ç» Agentï¼å°å说æï¼å¤åºç»æ</p> 628 <a class="public-site-section-link" href="/skills">æ¥çå ¨é¨ Skills <i data-lucide="arrow-up-right" aria-hidden="true"></i></a> 629 </div> 630 <div class="public-site-skills-grid" data-public-skills-grid aria-label="å°å°ä¸å¼æº Skills"></div> 631 </section> 632 633 </section> 634 635 <section class="toolbar" data-notice-toolbar aria-label="çé" hidden> 636 <div class="search"> 637 <span class="search-field"> 638 <input id="searchInput" type="search" aria-label="æç´¢æç¤ºè¯" placeholder="飿 ¼ã主é¢ãæä»¶å" autocomplete="off"> 639 <span id="searchStyleCount" class="search-count" aria-hidden="true">æ£å¨å è½½</span> 640 </span> 641 <button id="adminHiddenStylesButton" class="admin-hidden-filter-button" type="button" aria-pressed="false" data-tooltip="æ¥ç䏿¶ç飿 ¼" hidden> 642 <i data-lucide="eye-off" aria-hidden="true"></i> 643 <span>䏿¶ç</span> 644 <strong id="adminHiddenStylesCount">0</strong> 645 </button> 646 <button id="adminRestoreAllHiddenStylesButton" class="admin-restore-all-hidden-button" type="button" hidden> 647 <i data-lucide="rotate-ccw" aria-hidden="true"></i> 648 <span>æ¢å¤å ¨é¨ä¸æ¶</span> 649 </button> 650 </div> 651 <div class="generated-image-range-field" hidden> 652 <select id="generatedImageRangeSelect" aria-label="çéçå¾ä»»å¡åè®°å½"> 653 <option value="all">ææ</option> 654 <option value="backfill" data-admin-only hidden disabled>è¡¥å¾</option> 655 <option value="today">ä»å¤©</option> 656 <option value="yesterday">æ¨å¤©</option> 657 <option value="week">æè¿ä¸å¨</option> 658 </select> 659 </div> 660 <span id="promptColorFilterAnchor" hidden></span> 661 <div class="color-filter" aria-label="é¢è²è¿æ»¤"> 662 <button id="colorFilterMenuButton" class="color-filter-trigger" type="button" aria-label="æå¼é¢è²çé" aria-expanded="false" aria-pressed="false" aria-controls="colorFilterPanel" data-tooltip="é¢è²çé"> 663 <span class="color-filter-swatch" aria-hidden="true"></span> 664 </button> 665 <span id="colorFilterLiveStatus" class="sr-only" role="status" aria-live="polite"></span> 666 <div id="colorFilterPanel" class="color-filter-panel" role="dialog" aria-label="é¢è²çé颿¿" hidden> 667 <div class="color-filter-panel-head"> 668 <div class="color-filter-heading"><strong>é¢è²çé</strong><span id="colorFilterPanelValue" class="color-filter-panel-value">éæ©é¢è²ï¼èªå¨çé</span></div> 669 <button class="color-filter-close" type="button" data-color-picker-close aria-label="宿éè²"><svg class="ui-icon" viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="1.5" aria-hidden="true"><path d="m6 6 12 12M18 6 6 18" /></svg></button> 670 </div> 671 <div class="color-filter-picker" aria-label="èªå®ä¹é¢è²"> 672 <div id="colorFilterPlane" class="color-filter-plane" role="slider" tabindex="0" aria-label="è°æ´é¢è²æåº¦å饱å度" aria-valuemin="0" aria-valuemax="100" aria-valuenow="100" aria-describedby="colorFilterHelp"><span class="color-filter-plane-thumb" aria-hidden="true"></span></div> 673 <div id="colorFilterHue" class="color-filter-hue" role="slider" tabindex="0" aria-label="è°æ´è²ç¸" aria-orientation="horizontal" aria-valuemin="0" aria-valuemax="360" aria-valuenow="0"><span class="color-filter-hue-thumb" aria-hidden="true"></span></div>
674 <span id="colorFilterHelp" class="sr-only">å·¦å³è°æ´é¥±å度ï¼ä¸ä¸è°æ´æåº¦ï¼æä½ Shift å å¿«è°æ´ã</span> 675 </div> 676 <div class="color-filter-preset-grid" role="group" aria-label="æ´å¤é¢è²"> 677 <button class="color-filter-preset" type="button" data-color-filter-value="#ef4444" aria-label="红è²" aria-pressed="false" style="--preset-color: #ef4444; --preset-check: #fff"><span aria-hidden="true"></span></button> 678 <button class="color-filter-preset" type="button" data-color-filter-value="#f59e0b" aria-label="æ©è²" aria-pressed="false" style="--preset-color: #f59e0b; --preset-check: #172019"><span aria-hidden="true"></span></button> 679 <button class="color-filter-preset" type="button" data-color-filter-value="#eab308" aria-label="é»è²" aria-pressed="false" style="--preset-color: #eab308; --preset-check: #172019"><span aria-hidden="true"></span></button> 680 <button class="color-filter-preset" type="button" data-color-filter-value="#10b981" aria-label="绿è²" aria-pressed="false" style="--preset-color: #10b981; --preset-check: #172019"><span aria-hidden="true"></span></button> 681 <button class="color-filter-preset" type="button" data-color-filter-value="#06b6d4" aria-label="éè²" aria-pressed="false" style="--preset-color: #06b6d4; --preset-check: #172019"><span aria-hidden="true"></span></button> 682 <button class="color-filter-preset" type="button" data-color-filter-value="#2563eb" aria-label="èè²" aria-pressed="false" style="--preset-color: #2563eb; --preset-check: #fff"><span aria-hidden="true"></span></button> 683 <button class="color-filter-preset" type="button" data-color-filter-value="#7c3aed" aria-label="ç´«è²" aria-pressed="false" style="--preset-color: #7c3aed; --preset-check: #fff"><span aria-hidden="true"></span></button> 684 <button class="color-filter-preset" type="button" data-color-filter-value="#db2777" aria-label="ç²è²" aria-pressed="false" style="--preset-color: #db2777; --preset-check: #fff"><span aria-hidden="true"></span></button> 685 <button class="color-filter-preset" type="button" data-color-filter-value="#a16207" aria-label="æ£è²" aria-pressed="false" style="--preset-color: #a16207; --preset-check: #fff"><span aria-hidden="true"></span></button> 686 <button class="color-filter-preset" type="button" data-color-filter-value="#111827" aria-label="é»è²" aria-pressed="false" style="--preset-color: #111827; --preset-check: #fff"><span aria-hidden="true"></span></button> 687 <button class="color-filter-preset" type="button" data-color-filter-value="#3f3f46" aria-label="æ·±ç°" aria-pressed="false" style="--preset-color: #3f3f46; --preset-check: #fff"><span aria-hidden="true"></span></button> 688 <button class="color-filter-preset" type="button" data-color-filter-value="#e5e7eb" aria-label="ç½è²" aria-pressed="false" style="--preset-color: #e5e7eb; --preset-check: #172019"><span aria-hidden="true"></span></button> 689 <button class="color-filter-preset" type="button" data-color-filter-value="#f97316" aria-label="æ©çº¢" aria-pressed="false" style="--preset-color: #f97316; --preset-check: #fff"><span aria-hidden="true"></span></button> 690 <button class="color-filter-preset" type="button" data-color-filter-value="#84cc16" aria-label="é»ç»¿è²" aria-pressed="false" style="--preset-color: #84cc16; --preset-check: #172019"><span aria-hidden="true"></span></button> 691 <button class="color-filter-preset" type="button" data-color-filter-value="#22c55e" aria-label="亮绿" aria-pressed="false" style="--preset-color: #22c55e; --preset-check: #172019"><span aria-hidden="true"></span></button> 692 <button class="color-filter-preset" type="button" data-color-filter-value="#14b8a6" aria-label="é绿è²" aria-pressed="false" style="--preset-color: #14b8a6; --preset-check: #172019"><span aria-hidden="true"></span></button> 693 <button class="color-filter-preset" type="button" data-color-filter-value="#0ea5e9" aria-label="天è" aria-pressed="false" style="--preset-color: #0ea5e9; --preset-check: #fff"><span aria-hidden="true"></span></button> 694 <button class="color-filter-preset" type="button" data-color-filter-value="#3b82f6" aria-label="亮è" aria-pressed="false" style="--preset-color: #3b82f6; --preset-check: #fff"><span aria-hidden="true"></span></button> 695 <button class="color-filter-preset" type="button" data-color-filter-value="#4f46e5" aria-label="éè" aria-pressed="false" style="--preset-color: #4f46e5; --preset-check: #fff"><span aria-hidden="true"></span></button> 696 <button class="color-filter-preset" type="button" data-color-filter-value="#a855f7" aria-label="ç´«ç½å °" aria-pressed="false" style="--preset-color: #a855f7; --preset-check: #fff"><span aria-hidden="true"></span></button> 697 <button class="color-filter-preset" type="button" data-color-filter-value="#d946ef" aria-label="æ´çº¢" aria-pressed="false" style="--preset-color: #d946ef; --preset-check: #fff"><span aria-hidden="true"></span></button> 698 <button class="color-filter-preset" type="button" data-color-filter-value="#e11d48" aria-label="ç«çº¢" aria-pressed="false" style="--preset-color: #e11d48; --preset-check: #fff"><span aria-hidden="true"></span></button> 699 <button class="color-filter-preset" type="button" data-color-filter-value="#92400e" aria-label="æ·±æ£" aria-pressed="false" style="--preset-color: #92400e; --preset-check: #fff"><span aria-hidden="true"></span></button> 700 <button class="color-filter-preset" type="button" data-color-filter-value="#94a3b8" aria-label="ç°è²" aria-pressed="false" style="--preset-color: #94a3b8; --preset-check: #172019"><span aria-hidden="true"></span></button> 701 </div> 702 <div class="color-filter-panel-foot"> 703 <label class="color-filter-custom"><span class="color-filter-current" aria-hidden="true"></span><span class="color-filter-hex-label">HEX</span><input id="colorFilterHexInput" class="color-filter-hex-input" type="text" inputmode="text" autocomplete="off" autocapitalize="off" spellcheck="false" maxlength="7" placeholder="#FF4D4D" aria-label="è¾å ¥åå è¿å¶é¢è²" aria-describedby="colorFilterError" /></label> 704 <button id="clearColorFilterButton" class="clear-color-filter" type="button" aria-label="éç½®é¢è²çé" disabled>æ¸ é¤çé</button> 705 </div> 706 <p id="colorFilterError" class="color-filter-error" data-color-picker-error role="status" hidden>请è¾å ¥ 3 使 6 ä½ HEX è²å¼ï¼å¦ #2563EB</p> 707 </div> 708 </div> 709 <div class="generated-image-date-field" hidden> 710 <button id="generatedImageDateButton" class="generated-image-date-trigger" type="button" aria-label="ææ¥æçéä½å¾è®°å½" aria-haspopup="dialog" aria-expanded="false" aria-controls="generatedImageDateCalendar" title="ææ¥æçéä½å¾è®°å½"><span data-date-icon aria-hidden="true"><svg class="ui-icon" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="miter" aria-hidden="true" focusable="false">
710<path d="M4 5h16v15.5H4Z M4 10h16M8 3v4m8-4v4"/></svg></span><span data-date-value>éæ©æ¥æ</span></button> 711 <input id="generatedImageDateInput" type="hidden" aria-hidden="true" /> 712 <div id="generatedImageDateCalendar" class="generated-history-calendar" role="dialog" aria-label="ææ¥æçéä½å¾è®°å½" hidden> 713 <div class="generated-history-calendar-head"><button type="button" data-calendar-prev aria-label="ä¸ä¸ªæ"><svg class="ui-icon" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="miter" aria-hidden="true" focusable="false"><path d="m15 6-6 6 6 6"/></svg></button><strong data-calendar-title></strong><button type="button" data-calendar-next aria-label="ä¸ä¸ªæ"><svg class="ui-icon" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="miter" aria-hidden="true" focusable="false"><path d="m9 6 6 6-6 6"/></svg></button></div> 714 <div class="generated-history-calendar-weekdays" aria-hidden="true"><span>卿¥</span><span>å¨ä¸</span><span>å¨äº</span><span>å¨ä¸</span><span>å¨å</span><span>å¨äº</span><span>å¨å </span></div> 715 <div class="generated-history-calendar-grid" data-calendar-grid></div> 716 <p class="generated-history-calendar-status" data-calendar-status role="status" aria-live="polite">æ°å表示å½å¤©å¾çæ»æ° · åç¹å·²éæ¥ææ¸ é¤</p> 717 </div> 718 </div> 719 <button id="adminBatchModeButton" class="style-grid-layout-mode-button admin-batch-mode-button" type="button" aria-pressed="false" aria-label="æ¹ééä¸å¡çå¹¶æ§è¡æ¹éæä½" title="æ¹é管ç" data-tooltip="æ¹ééä¸å¡çå¹¶æ§è¡æ¹éæä½" hidden> 720 <i data-lucide="mouse-pointer-2" aria-hidden="true"></i> 721 </button> 722 <div class="sort-segment" role="group" aria-label="æåºæ¹å¼"> 723 <div class="sort-segment-options"> 724 <button class="sort-segment-button" type="button" data-sort-value="recommended" aria-pressed="true">æ¨è</button> 725 <button class="sort-segment-button" type="button" data-sort-value="popular" aria-pressed="false">æ¶èé</button> 726 <button class="sort-segment-button" type="button" data-sort-value="latest" aria-pressed="false" aria-label="ææ°å¨å">ææ°å¨å</button> 727 </div> 728 </div> 729 <div class="toolbar-meta"></div> 730 <span id="imageGeneratorDock" class="image-generator-history-tools" hidden> 731 <button id="toggleGeneratedSelectionButton" class="style-grid-layout-mode-button" type="button" aria-pressed="false" aria-label="éæ©è®°å½" title="éæ©è®°å½" data-tooltip="éæ©è®°å½" disabled> 732 <i data-lucide="mouse-pointer-2" aria-hidden="true"></i> 733 </button> 734 </span> 735 <span id="promptViewModeAnchor" hidden></span> 736 <span id="quietImageModeControl" class="quiet-image-mode-control view-mode-controls" role="group" aria-label="æµè§è§å¾æ§å¶" hidden> 737 <button id="catalogMoreButton" class="style-grid-layout-mode-button" type="button" aria-label="æ´å¤æä½" aria-haspopup="menu" aria-expanded="false" aria-controls="catalogMoreMenu" popovertarget="catalogMoreMenu" data-tooltip="æ´å¤æä½" hidden> 738 <i data-lucide="ellipsis" aria-hidden="true"></i> 739 </button> 740 <button id="styleGridLayoutModeButton" class="style-grid-layout-mode-button" type="button" aria-pressed="true" aria-label="å½åï¼æ¼è´´ç叿µï¼ç¹å»åæ¢å°è¡å¼åå" title="æ¼è´´ç叿µ · ä¸ä¸ä¸ªï¼è¡å¼åå"> 741 <i data-lucide="layout-grid" aria-hidden="true"></i> 742 </button> 743 <button id="quietImageModeButton" class="quiet-image-mode-button" type="button" aria-label="å¼å¯æç®ç徿¨¡å¼" aria-pressed="false" title="æç®ç徿¨¡å¼" hidden> 744 <i data-lucide="eye" aria-hidden="true"></i> 745 <span id="quietImageModeProgress" class="quiet-image-mode-progress" aria-hidden="true" hidden>
746 <span id="quietImageModeProgressNumerator" class="quiet-image-mode-progress-value quiet-image-mode-progress-numerator">0%</span> 747 <span class="quiet-image-mode-progress-rule"></span> 748 <span id="quietImageModeProgressDenominator" class="quiet-image-mode-progress-value quiet-image-mode-progress-denominator"></span> 749 </span> 750 </button> 751 </span> 752 </section> 753 754 <div class="color-filter-context" data-color-filter-status hidden> 755 <button class="color-filter-active-chip" type="button" data-color-filter-action="clear" aria-label="æ¸ é¤é¢è²çé"> 756 <span class="color-filter-active-dot" aria-hidden="true"></span> 757 <span>é¢è²</span> 758 <strong data-color-filter-value></strong> 759 <i data-lucide="x" aria-hidden="true"></i> 760 </button> 761 <p data-color-filter-summary role="status" aria-live="polite">æ£å¨è®¡ç®ç¬¦åå½åé¢è²çå 容â¦</p> 762 <button class="color-filter-context-clear" type="button" data-color-filter-action="clear">æ¥çå ¨é¨å 容</button> 763 </div> 764 765 <div id="tagChipRail" class="tag-chip-rail" role="group" aria-label="å·²éæ ç¾" hidden></div> 766 767 <section id="topics" class="content-grid" hidden> 768 <section class="results"> 769 <div id="styleGrid" class="style-grid"></div> 770 <div id="favoriteContentList" class="favorite-content-list" hidden></div> 771 <section id="vipCatalogGate" class="vip-catalog-gate" hidden aria-labelledby="vipCatalogGateTitle"> 772 <span class="vip-catalog-gate-mark" aria-hidden="true">VIP</span> 773 <h2 id="vipCatalogGateTitle">ä½ å·²çå® 10 页å è´¹å 容</h2> 774 <p>å¼é VIPï¼è§£é宿´æç¤ºè¯åºã</p> 775 <button id="vipCatalogGateButton" class="activation-pay-link" type="button">å¼éå¹´è´¹ä¼å · ï¿¥699 / å¹´</button> 776 </section> 777 <div id="gridSentinel" class="grid-sentinel" aria-hidden="true"></div> 778 <button id="loadMoreButton" class="load-more" type="button" hidden>ç»§ç»å è½½</button> 779 <section class="color-filter-end-prompt" data-color-filter-end hidden aria-live="polite"> 780 <strong data-color-filter-end-title>符åå½åé¢è²çå 容已ç»çå®</strong> 781 <span data-color-filter-end-note>ä½ çå°çæ¯é¢è²çéç»æï¼ä¸æ¯å ¨é¨å 容ã</span> 782 <div class="color-filter-end-actions"> 783 <button type="button" data-color-filter-action="adjust">è°æ´é¢è²</button> 784 <button type="button" data-color-filter-action="clear">æ¥çå ¨é¨å 容</button> 785 </div> 786 </section> 787 </section> 788 </section> 789 790 <section id="navigationSettingsView" class="navigation-settings-view settings-ui" hidden aria-label="æ ç®ç®¡ç"> 791 </section> 792 793 <section id="memberCenter" class="member-center settings-ui" hidden aria-label="设置ä¸å¿"> 794 <div id="memberSettingsHost" class="member-settings-stage"></div> 795 </section> 796 797 <section id="articlesView" class="articles-view tools-view" hidden aria-label="å·¥å ·ç®±"> 798 <div id="articleToolbar" class="article-toolbar" data-notice-toolbar aria-label="æç« å·¥å ·"> 799 <label class="search article-search"> 800 <span class="search-field"> 801 <input id="articleSearchInput" type="search" aria-label="æç´¢æç« " placeholder="æç´¢æç« " autocomplete="off"> 802 <span id="articleSearchCount" class="search-count" aria-hidden="true">0 ç¯</span> 803 </span> 804 </label> 805 <div class="article-sort-segment sort-segment" role="group" aria-label="æç« æåº"> 806 <div class="sort-segment-options"> 807 <button class="sort-segment-button" type="button" data-article-sort-value="default" aria-pressed="true">é»è®¤</button> 808 <button class="sort-segment-button" type="button" data-article-sort-value="popular" aria-pressed="false">æ¶èé</button> 809 <button class="sort-segment-button" type="button" data-article-sort-value="latest" aria-pressed="false">ææ°</button> 810 </div> 811 </div> 812 <button id="articleLayoutModeButton" class="style-grid-layout-mode-button article-layout-mode-button" type="button" aria-pressed="false" aria-label="å½åï¼ç½æ ¼ï¼ç¹å»åæ¢å°å表" title="ç½æ ¼ · ä¸ä¸ä¸ªï¼å表"> 813 <i data-lucide="layout-grid" aria-hidden="true"></i> 814 </button> 815 <button id="articleAdminCreateButton" class="article-admin-create-inline" type="button" hidden> 816 <i data-lucide="plus" aria-hidden="true"></i>
817 <span>æ·»å æç« </span> 818 </button> 819 </div> 820 <div id="toolModulePanel" class="tool-module-panel" hidden></div> 821 <div id="articlesList" class="articles-list"><div class="ui-loading-skeleton content-skeleton content-skeleton--cards" aria-hidden="true"><span class="content-skeleton-item"><i></i><b></b><b></b></span><span class="content-skeleton-item"><i></i><b></b><b></b></span><span class="content-skeleton-item"><i></i><b></b><b></b></span><span class="content-skeleton-item"><i></i><b></b><b></b></span><span class="content-skeleton-item"><i></i><b></b><b></b></span><span class="content-skeleton-item"><i></i><b></b><b></b></span></div></div> 822 <article id="articleDetail" class="article-detail panel-shell" hidden></article> 823 </section> 824 825 <section id="skillsView" class="skills-view articles-view tools-view" hidden aria-label="Skills"> 826 <div class="article-toolbar skills-content-toolbar" data-notice-toolbar aria-label="Skills å·¥å ·"> 827 <div class="search article-search skills-search"> 828 <div id="skillsModeSwitch" class="media-library-mode-switch" data-mode="image"> 829 <button id="skillsModeButton" class="media-library-mode-button" type="button" aria-label="Skill ç±»åï¼å¾ç" aria-haspopup="menu" aria-expanded="false" aria-controls="skillsModeMenu" data-tooltip="忢 Skill ç±»å"> 830 <span class="media-library-mode-icon" data-media-mode-icon="image"><i data-lucide="image" aria-hidden="true"></i></span> 831 <span class="media-library-mode-icon" data-media-mode-icon="text"><i data-lucide="file-text" aria-hidden="true"></i></span> 832 <span class="media-library-mode-icon" data-media-mode-icon="site"><i data-lucide="globe" aria-hidden="true"></i></span> 833 <svg class="media-library-mode-caret ui-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" aria-hidden="true"><path d="m6 9 6 6 6-6" /></svg> 834 </button> 835 <div id="skillsModeMenu" class="media-library-mode-menu" role="menu" aria-label="Skill ç±»å" hidden> 836 <button type="button" role="menuitemradio" data-skills-mode="image" aria-checked="true"><i data-lucide="image" aria-hidden="true"></i><span>å¾ç</span></button> 837 <button type="button" role="menuitemradio" data-skills-mode="text" aria-checked="false"><i data-lucide="file-text" aria-hidden="true"></i><span>ææ¬</span></button> 838 <button type="button" role="menuitemradio" data-skills-mode="site" aria-checked="false"><i data-lucide="globe" aria-hidden="true"></i><span>åè½ç«</span></button> 839 </div> 840 </div> 841 <label class="search-field"><input id="skillsSearchInput" type="search" aria-label="æç´¢ Skills" placeholder="æç´¢ Skill åç§°æç¨é" autocomplete="off"><span id="skillsCount" class="search-count" aria-hidden="true">0 个</span></label> 842 </div> 843 <div id="skillsBrowseTabs" class="article-sort-segment sort-segment" role="group" aria-label="Skills æµè§æ¹å¼"> 844 <div class="sort-segment-options"> 845 <button class="sort-segment-button" type="button" data-skills-browse="recommended" aria-pressed="true">ç¼è¾æ¨è</button> 846 <button class="sort-segment-button" type="button" data-skills-browse="favorites" aria-pressed="false">æ¶è</button> 847 <button class="sort-segment-button" type="button" data-skills-browse="latest" aria-pressed="false">ææ°</button> 848 </div> 849 </div> 850 <div id="skillsSortControls" hidden class="article-sort-segment sort-segment" role="group" aria-label="Skills æåº"> 851 <div class="sort-segment-options"> 852 <button class="sort-segment-button" type="button" data-skills-sort="default" aria-pressed="true">é»è®¤</button> 853 <button class="sort-segment-button" type="button" data-skills-sort="stars" aria-pressed="false" title="æ GitHub ä»åºææ æ°éä»å¤å°å°">ææ æå¤</button> 854 <button class="sort-segment-button" type="button" data-skills-sort="updated" aria-pressed="false" title="æ GitHub ä»åºæå å®¹çæ´æ°æ¶é´ä»æ°å°æ§">æè¿æ´æ°</button> 855 </div> 856 </div> 857 <button id="skillsLayoutModeButton" class="style-grid-layout-mode-button article-layout-mode-button" type="button" aria-pressed="false" aria-label="忢 Skills å¸å±"><i data-lucide="layout-grid" aria-hidden="true"></i></button> 858 <div id="skillsAdminActions" class="skills-admin-actions" hidden data-admin-only> 859 <button id="skillsAdminCreateButton" class="style-grid-layout-mode-button article-layout-mode-button" type="button" aria-label="管ç Skills" title="管ç Skills" hidden data-admin-only><i data-lucide="sliders-horizontal" aria-hidden="true"></i></button> 860 </div> 861 </div> 862 <p id="skillsStatus" class="skills-status sr-only" role="status">æ£å¨å è½½ Skillsâ¦</p> 863 <div id="skillsGrid" class="skills-grid content-browser-list" data-layout-mode="uniform"><div class="ui-loading-skeleton content-skeleton content-skeleton--cards" style="--content-skeleton-ratio: 16 / 9" aria-hidden="true"><span class="content-skeleton-item"><i></i><b></b><b></b></span><span class="content-skeleton-item"><i></i><b></b><b></b></span><span class="content-skeleton-item"><i></i><b></b><b></b></span><span class="content-skeleton-item"><i></i><b></b><b></b></span><span class="content-skeleton-item"><i></i><b></b><b></b></span><span class="content-skeleton-item"><i></i><b></b><b></b></span></div></div> 864 <p id="skillsEmpty" class="skills-empty" hidden>æ²¡ææ¾å°å¹é ç Skillã</p> 865 </section> 866 867 <aside id="publicSkillPanel" class="article-detail public-skill-panel panel-shell" hidden aria-labelledby="publicSkillPanelTitle"> 868 <div class="article-detail-actions panel-shell-head"> 869 <p id="publicSkillPanelMeta" class="eyebrow"></p> 870 <div class="article-detail-actions-right panel-shell-actions"> 871 <button id="closePublicSkillPanel" class="header-icon-button panel-shell-navigation right-panel-close-button" type="button" data-public-skill-panel-close aria-label="å ³é Skill 详æ "> 872 <i data-lucide="x" aria-hidden="true"></i> 873 </button> 874 </div> 875 </div> 876 <div id="publicSkillPanelScroll" class="article-detail-scroll panel-shell-body" tabindex="-1"> 877 <header class="article-detail-head"> 878 <h1 id="publicSkillPanelTitle"></h1> 879 <p id="publicSkillPanelExcerpt" class="article-detail-excerpt"></p> 880 </header>
881 <article id="publicSkillPanelContent" class="article-content public-skill-article-content"></article> 882 </div> 883 </aside> 884 885 <section id="openSourceView" class="open-source-view" hidden aria-label="弿ºå¾ç"> 886 <div class="toolbar open-source-toolbar" data-notice-toolbar aria-label="弿ºå¾çå·¥å ·"> 887 <div class="sort-segment open-source-kind" role="group" aria-label="弿ºå 容类å"> 888 <div class="sort-segment-options"> 889 <button class="sort-segment-button" type="button" data-open-source-kind="style" aria-pressed="true">飿 ¼å¼æº</button> 890 <button class="sort-segment-button" type="button" data-open-source-kind="media" aria-pressed="false">ç´ æå¼æº</button> 891 </div> 892 </div> 893 <div class="search open-source-search"> 894 <span class="search-field"> 895 <input id="openSourceSearchInput" type="search" aria-label="æç´¢å ¨é¨å¼æºå¾ç" placeholder="æç´¢å ¨é¨å¼æºå¾ç" autocomplete="off"> 896 <span id="openSourceSearchCount" class="search-count" aria-hidden="true">0 å¼ </span> 897 </span> 898 </div> 899 <button id="openSourceChannelSettingsButton" class="ghost-button open-source-channel-settings-button" type="button" aria-label="é¢é设置" aria-controls="openSourceChannelSettingsPanel" aria-expanded="false" aria-pressed="false" hidden> 900 <i data-lucide="settings-2" aria-hidden="true"></i> 901 <span>é¢é设置</span> 902 </button> 903 <span id="openSourceColorFilterSlot" class="toolbar-color-filter-slot"></span> 904 <div class="sort-segment" role="group" aria-label="弿ºå¾çæåº"> 905 <div class="sort-segment-options"> 906 <button class="sort-segment-button" type="button" data-open-source-sort="recommended" aria-pressed="true" aria-label="æ¨è">æ¨è</button> 907 <button class="sort-segment-button" type="button" data-open-source-sort="popular" aria-pressed="false">æ¶èé</button> 908 <button class="sort-segment-button" type="button" data-open-source-sort="latest" aria-pressed="false">ææ°</button> 909 </div> 910 </div> 911 <span id="openSourceViewModeSlot" class="toolbar-view-mode-slot"></span> 912 </div> 913 <div class="color-filter-context" data-color-filter-status hidden> 914 <button class="color-filter-active-chip" type="button" data-color-filter-action="clear" aria-label="æ¸ é¤é¢è²çé"> 915 <span class="color-filter-active-dot" aria-hidden="true"></span> 916 <span>é¢è²</span> 917 <strong data-color-filter-value></strong> 918 <i data-lucide="x" aria-hidden="true"></i> 919 </button> 920 <p data-color-filter-summary role="status" aria-live="polite">æ£å¨è®¡ç®ç¬¦åå½åé¢è²çå 容â¦</p> 921 <button class="color-filter-context-clear" type="button" data-color-filter-action="clear">æ¥çå ¨é¨å 容</button> 922 </div> 923 <span id="openSourceStatus" class="sr-only" role="status">æ£å¨å è½½â¦</span> 924 <div id="openSourceSkeleton" class="open-source-skeleton" aria-hidden="true"> 925 <p class="ui-loading-slow" hidden>æ£å¨è·åå 容ï¼è¯·ç¨åâ¦</p> 926 <div class="boot-skeleton-toolbar"><i></i><i></i><i></i><i></i></div> 927 <div class="ui-loading-skeleton waterfall-skeleton" aria-hidden="true"><span><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span><span><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span><span><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span><span><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span><span><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span><span><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span><span><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span><span><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span><span><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span><span><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span><span><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span><span><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span><span><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span><span><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span></div> 928 </div> 929 <div id="openSourceGrid" class="open-source-grid style-grid"></div> 930 <section id="openSourceEmpty" class="open-source-empty grid-empty" role="status" aria-atomic="true" data-state="empty" hidden> 931 <i data-lucide="sprout" aria-hidden="true"></i> 932 <strong>è¿æ²¡æå¼æºå¾ç</strong>
933 <span>已弿ºçå¾ç伿¾ç¤ºå¨è¿éã</span> 934 <button class="grid-empty-clear-color" type="button" data-color-filter-action="clear" hidden>æ¥çå ¨é¨å 容</button> 935 <div class="open-source-empty-actions"> 936 <button type="button" data-open-source-empty-action="retry" hidden>éæ°å è½½</button> 937 <button type="button" data-open-source-empty-action="clear-search" hidden>æ¸ é¤æç´¢</button> 938 </div> 939 </section> 940 <div id="openSourceMoreSkeleton" class="open-source-more-skeleton" aria-hidden="true" hidden><i></i><i></i><i></i><i></i></div> 941 <button id="openSourceLoadMore" class="load-more" type="button" hidden>ç»§ç»å è½½</button> 942 <section class="color-filter-end-prompt" data-color-filter-end hidden aria-live="polite"> 943 <strong data-color-filter-end-title>符åå½åé¢è²çå 容已ç»çå®</strong> 944 <span data-color-filter-end-note>ä½ çå°çæ¯é¢è²çéç»æï¼ä¸æ¯å ¨é¨å 容ã</span> 945 <div class="color-filter-end-actions"> 946 <button type="button" data-color-filter-action="adjust">è°æ´é¢è²</button> 947 <button type="button" data-color-filter-action="clear">æ¥çå ¨é¨å 容</button> 948 </div> 949 </section> 950 <section id="openSourceUnlock" class="open-source-unlock" aria-labelledby="openSourceUnlockTitle" data-unlock-context="feed-end" hidden> 951 <div class="open-source-unlock-intro"> 952 <p class="open-source-unlock-eyebrow">Members library</p> 953 <h2 id="openSourceUnlockTitle">ä½ çå°çï¼åªæ¯ä¸å°é¨å</h2> 954 <p class="open-source-unlock-lede"><span data-unlock-count-line hidden>ä¼ååºæ¶å½ <strong id="openSourceUnlockCount"></strong> å¥æç¤ºè¯é£æ ¼ï¼</span><span>è¿é弿¾çåªæ¯ç²¾éæ ·å¼ ï¼æ¯å¨æç»ä¸æ°ã</span></p> 955 </div> 956 <ul class="open-source-unlock-benefits" aria-label="ä¼åæç"> 957 <li><span class="open-source-unlock-icon" aria-hidden="true"><i data-lucide="key-round"></i></span><strong>å ¨éè§£é</strong><span>æ¯ä¸ªé£æ ¼ç宿´æç¤ºè¯ãåæ°åå ¨é¨æ¡ä¾</span></li> 958 <li><span class="open-source-unlock-icon" aria-hidden="true"><i data-lucide="sparkles"></i></span><strong>æç»ä¸æ°</strong><span>æ¯å¨æ°å¢é£æ ¼ï¼è·ä¸ææ°ç模ååç©æ³</span></li> 959 <li><span class="open-source-unlock-icon" aria-hidden="true"><i data-lucide="image"></i></span><strong>髿¸ åå¾</strong><span>æ¥çåä¸è½½åå¾ï¼ä¸ååªæ¯é¢è§</span></li> 960 <li><span class="open-source-unlock-icon" aria-hidden="true"><i data-lucide="message-circle"></i></span><strong>ä½è çç</strong><span>æç¤ºè¯ãæä»¶ãSkills ç¨ä¸å¥½ç´æ¥é®</span></li> 961 </ul> 962 <div class="open-source-unlock-offer"> 963 <div class="open-source-unlock-pricing"> 964 <p class="open-source-unlock-price"><strong data-open-source-unlock-price>ï¿¥699 / å¹´</strong><span class="open-source-unlock-price-original" data-open-source-unlock-cny>ï¿¥1,398</span><span class="open-source-unlock-price-badge" data-open-source-unlock-cny>äºæ</span></p> 965 <p class="open-source-unlock-price-note" data-open-source-unlock-price-note>æ¯ä»åç«å³å¼é · æææä¸å¹´</p> 966 </div> 967 <div class="open-source-unlock-actions"> 968 <button id="openSourceUnlockSecondary" class="open-source-unlock-secondary" type="button" data-open-source-unlock-action="login">ç»å½</button> 969 <button id="openSourceUnlockPrimary" class="open-source-unlock-primary" type="button" data-open-source-unlock-action="activate">æ¥çä¼åæ¹æ¡</button> 970 </div> 971 </div> 972 <p class="open-source-unlock-community" data-open-source-unlock-community>è¿æ³å èèï¼<a href="https://wx.zsxq.com/group/15554814142882" target="_blank" rel="noopener noreferrer">å å ¥ç¥è¯æç</a><span aria-hidden="true">·</span><a href="https://work.weixin.qq.com/kfid/kfcccac384193047e7e" target="_blank" rel="noopener noreferrer">微信å¨è¯¢å°å°ä¸</a></p> 973 </section> 974 <div id="openSourceUpgradeDock" class="app-bottom-dock open-source-upgrade-
974dock" role="region" aria-label="å¼éä¼åæ¥çå ¨é¨é£æ ¼" hidden> 975 <p class="open-source-upgrade-dock-copy"> 976 <strong id="openSourceUpgradeDockCount">VIP æ¶å½å ¨é¨é£æ ¼</strong> 977 <span>æ¯å¨æç»æ°å¢ï¼å¼æºçåªæ¯å ¶ä¸ä¸å°é¨åã</span> 978 </p> 979 <button id="openSourceUpgradeDockButton" class="app-bottom-dock-button" type="button">æ¥çä¼åæ¹æ¡</button> 980 </div> 981 </section> 982 983 <section id="notificationHistoryView" class="notification-history-view" hidden aria-label="éç¥åå²"> 984 <div id="notificationToolbar" class="notification-toolbar" data-notice-toolbar aria-label="éç¥ä¸å¿å·¥å ·"> 985 <div class="notification-search-group"> 986 <label class="search notification-search"> 987 <span class="search-field"> 988 <input id="notificationSearchInput" type="search" aria-label="æç´¢éç¥" placeholder="æç´¢éç¥" autocomplete="off"> 989 <span id="notificationSearchCount" class="search-count" aria-hidden="true">0 æ¡</span> 990 </span> 991 </label> 992 <button id="newsletterMemberViewButton" class="quiet-image-mode-button newsletter-member-view-button" type="button" aria-pressed="true" aria-label="è¿å管çåè§è§" title="å½åï¼æ®éç¨æ·è§è§ · ç¹å»è¿å管çåè§è§" hidden> 993 <i data-lucide="eye-off" aria-hidden="true"></i> 994 </button> 995 </div> 996 <div class="notification-toolbar-actions"> 997 <button id="notificationLayoutModeButton" class="style-grid-layout-mode-button notification-layout-mode-button" type="button" aria-pressed="false" aria-label="å½åï¼ååå¤åï¼ç¹å»åæ¢å°è¡å¼åå" title="éç¥å¸å±ï¼ååå¤å · ä¸ä¸ä¸ªï¼è¡å¼åå"> 998 <i data-lucide="columns-3" aria-hidden="true"></i> 999 </button> 1000 <button id="notificationUnreadOnlyButton" class="notification-filter-button" type="button" aria-pressed="false"> 1001 <i data-lucide="circle-dot" aria-hidden="true"></i> 1002 <span>æªè¯»</span> 1003 </button> 1004 <button id="markNotificationReadButton" class="notification-filter-button" type="button"> 1005 <i data-lucide="check-check" aria-hidden="true"></i> 1006 <span>æ 记已读</span> 1007 </button> 1008 <button id="newNotificationButton" class="notification-new-button" type="button" data-admin-only> 1009 <i data-lucide="plus" aria-hidden="true"></i> 1010 <span>åå¸éç¥</span> 1011 </button> 1012 </div> 1013 </div> 1014 <section id="notificationRecordsPanel" class="notification-records-panel" aria-label="éç¥è®°å½"> 1015 <div id="notificationHistoryList" class="notification-history-list"></div> 1016 <div id="notificationHistoryEmpty" class="notification-history-empty" role="status" hidden> 1017 <strong>è¿æ²¡æéç¥</strong> 1018 <span>ææ°éç¥æ¶ä¼åºç°å¨è¿éã</span> 1019 </div> 1020 </section> 1021 <section id="notificationNewsletterPanel" class="notification-newsletter-view" aria-label="åæåå²" hidden> 1022 <div id="newsletterCoverUploadQueue" class="newsletter-cover-upload-queue" role="status" aria-live="polite" aria-atomic="true" hidden data-admin-only> 1023 <div class="newsletter-cover-upload-queue-head"> 1024 <strong id="newsletterCoverUploadQueueTitle">å°é¢ä¸ä¼ éå</strong> 1025 <span id="newsletterCoverUploadQueueCount">0 / 0</span> 1026 </div> 1027 <progress id="newsletterCoverUploadQueueProgress" value="0" max="1">0%</progress> 1028 <p id="newsletterCoverUploadQueueDetail">çå¾ éæ©å°é¢</p> 1029 <div class="newsletter-cover-upload-queue-actions"> 1030 <button id="retryNewsletterCoverUploads" class="ui-button-secondary" type="button" hidden> 1031 <i data-lucide="rotate-ccw" aria-hidden="true"></i> 1032 <span>éè¯å¤±è´¥é¡¹</span> 1033 </button> 1034 <button id="dismissNewsletterCoverUploads" class="ghost-button" type="button" hidden> 1035 <i data-lucide="x" aria-hidden="true"></i>
1036 <span>æ¶èµ·ç»æ</span> 1037 </button> 1038 </div> 1039 </div> 1040 <div id="newsletterIssueList" class="newsletter-issue-list" role="list"></div> 1041 <div id="newsletterIssueEmpty" class="notification-history-empty" role="status" hidden> 1042 <strong>è¿æ²¡æåæåå²</strong> 1043 <span>ææ°åææ¶ä¼åºç°å¨è¿éã</span> 1044 </div> 1045 </section> 1046 </section> 1047 1048 <section id="newsletterAdminView" class="newsletter-admin-view" hidden aria-label="Newsletter 群å设置"> 1049 <section id="newsletterAdminPanel" class="newsletter-admin-panel" aria-label="Newsletter 群å设置"> 1050 <div class="newsletter-workbench"> 1051 <section class="newsletter-candidates-panel" aria-label="åé飿 ¼"> 1052 <input id="newsletterDateInput" type="hidden"> 1053 <div class="newsletter-candidate-toolbar" aria-label="çéåé飿 ¼"> 1054 <div class="search"> 1055 <span class="search-field"> 1056 <input id="newsletterCandidateSearchInput" type="search" aria-label="æç´¢åé飿 ¼" placeholder="æç´¢é£æ ¼ã主é¢ãæä»¶å" autocomplete="off"> 1057 <span id="newsletterCandidateCount" class="search-count" aria-hidden="true">0 个</span> 1058 </span> 1059 <button id="newsletterCandidateViewButton" class="quiet-image-mode-button newsletter-candidate-view-button" type="button" aria-pressed="false" aria-label="忢尿®éç¨æ·è§è§" title="å½åï¼ç®¡çåè§è§ · ç¹å»åæ¢å°æ®éç¨æ·è§è§"> 1060 <i data-lucide="eye" aria-hidden="true"></i> 1061 </button> 1062 </div> 1063 <label class="newsletter-locale-field" for="newsletterLocaleInput"> 1064 <span>é®ä»¶è¯è¨</span> 1065 <select id="newsletterLocaleInput" aria-label="Newsletter é®ä»¶è¯è¨"> 1066 <option value="zh-CN">䏿</option> 1067 <option value="en">English</option> 1068 </select> 1069 </label> 1070 <div class="newsletter-range-segment sort-segment" role="group" aria-label="åéèå´"> 1071 <div class="sort-segment-options"> 1072 <button class="sort-segment-button" type="button" data-newsletter-range="today" aria-pressed="false">ä»å¤©</button> 1073 <button class="sort-segment-button" type="button" data-newsletter-range="all" aria-pressed="false">å ¨é¨</button> 1074 <button class="sort-segment-button" type="button" data-newsletter-range="unused" aria-pressed="true">æªä½¿ç¨</button> 1075 </div> 1076 </div> 1077 <span class="newsletter-candidate-view-controls quiet-image-mode-control view-mode-controls" role="group" aria-label="åéè§å¾æ§å¶"> 1078 <button id="newsletterCandidateLayoutModeButton" class="style-grid-layout-mode-button newsletter-candidate-layout-mode-button" type="button" aria-pressed="false" aria-label="å½åï¼ååç叿µï¼ç¹å»åæ¢å°æ¼è´´ç叿µ" title="ååç叿µ · ä¸ä¸ä¸ªï¼æ¼è´´ç叿µ"> 1079 <i data-lucide="columns-3" aria-hidden="true"></i> 1080 </button> 1081 <button id="newsletterCandidateQuietModeButton" class="quiet-image-mode-button newsletter-candidate-quiet-mode-button" type="button" aria-label="å¼å¯æç®ç徿¨¡å¼" aria-pressed="false" title="æç®ç徿¨¡å¼"> 1082 <i data-lucide="eye" aria-hidden="true"></i> 1083 </button> 1084 </span> 1085 </div> 1086 <div id="newsletterCandidateList" class="newsletter-candidate-list style-grid" role="list"></div> 1087 </section> 1088 </div> 1089 </section> 1090 </section> 1091 1092 <div id="newsletterSelectionDock" class="newsletter-selection-dock app-bottom-dock is-idle" role="region" aria-label="Newsletter æ¬æ¬¡ç¾¤åæä½" hidden data-admin-only> 1093 <div id="newsletterDeliveryProgress" class="newsletter-dock-progress" role="status" aria-l
1093ive="polite" hidden> 1094 <span class="newsletter-dock-progress-track" role="progressbar" aria-label="Newsletter åéè¿åº¦" aria-valuemin="0" aria-valuemax="100" aria-valuenow="0"> 1095 <span id="newsletterDeliveryProgressBar"></span> 1096 </span> 1097 <span id="newsletterDeliveryProgressState" class="newsletter-dock-progress-state" aria-hidden="true"></span> 1098 <span class="newsletter-dock-progress-copy"> 1099 <strong id="newsletterDeliveryProgressTitle">æ£å¨å建åéä»»å¡</strong> 1100 <span id="newsletterDeliveryProgressCounts" class="newsletter-dock-progress-counts">å·²åé 0 · å¾ åé 0</span> 1101 <span id="newsletterDeliveryProgressDetail" class="newsletter-dock-progress-detail">馿¹é®ä»¶æ£å¨åéã</span> 1102 </span> 1103 <button id="dismissNewsletterDeliveryProgress" class="newsletter-dock-progress-dismiss" type="button" aria-label="å ³éåéç»æ" title="å ³éåéç»æ" hidden> 1104 <i data-lucide="x" aria-hidden="true"></i> 1105 </button> 1106 </div> 1107 <div class="newsletter-dock-summary"> 1108 <span class="newsletter-dock-kicker">æ¬æ¬¡ç¾¤å</span> 1109 <span id="newsletterSelectedCount" class="newsletter-selected-count app-bottom-dock-meta" aria-live="polite">å·²é 0 ç» Â· 0 人</span> 1110 </div> 1111 <div class="newsletter-dock-actions"> 1112 <div class="newsletter-dock-selection-actions" aria-label="éæ©æä½"> 1113 <button id="previewNewsletterButton" class="ui-button-secondary app-bottom-dock-button-secondary" type="button" aria-pressed="false"> 1114 <i data-lucide="mail-search" aria-hidden="true"></i> 1115 <span>é¢è§é®ä»¶</span> 1116 </button> 1117 <button id="selectAllNewsletterStylesButton" class="ui-button-secondary app-bottom-dock-button-secondary" type="button"> 1118 <i data-lucide="check-square" aria-hidden="true"></i> 1119 <span>å ¨é</span> 1120 </button> 1121 <button id="clearNewsletterSelectionButton" class="ui-button-secondary app-bottom-dock-button-secondary" type="button"> 1122 <i data-lucide="x" aria-hidden="true"></i> 1123 <span>æ¸ é¤</span> 1124 </button> 1125 </div> 1126 <div class="newsletter-dock-send-actions" aria-label="åéæä½"> 1127 <button id="testNewsletterButton" class="ui-button-secondary app-bottom-dock-button-secondary" type="button"> 1128 <i data-lucide="send" aria-hidden="true"></i> 1129 <span>æµè¯åé</span> 1130 </button> 1131 <button id="sendNewsletterButton" class="app-bottom-dock-button" type="button"> 1132 <i data-lucide="mail" aria-hidden="true"></i> 1133 <span>åéç»æ³¨åç¨æ·</span> 1134 </button> 1135 </div> 1136 </div> 1137 </div> 1138 1139 <div id="adminBatchDock" class="admin-batch-dock app-bottom-dock is-idle" role="region" aria-label="飿 ¼æ¹é管çæä½" hidden> 1140 <div class="admin-batch-dock-summary"> 1141 <span class="admin-batch-dock-kicker">æ¹é管ç</span> 1142 <span id="adminBatchSelectedCount" class="admin-batch-selected-count app-bottom-dock-meta" aria-live="polite">å·²é 0 ç»</span> 1143 </div> 1144 <div class="admin-batch-dock-actions"> 1145 <div class="admin-batch-dock-selection-actions" aria-label="éæ©æä½"> 1146 <button id="adminBatchSelectAllButton" class="ui-button-secondary app-bottom-dock-button-secondary" type="button" aria-pressed="false"> 1147 <i data-lucide="list-checks" aria-hidden="true"></i> 1148 <span>å ¨é</span> 1149 </button> 1150 <button id="adminBatchClearButton" class="ui-button-secondary app-bottom-dock-button-secondary" type="button"> 1151 <i data-lucide="x" aria-hidden="true"></i> 1152 <span>æ¸ é¤</span> 1153 </button> 1154 <button id="adminBatchExitButton" class="ui-button-secondary app-bottom-dock-button-secondary" type="button"> 1155 <i data-lucide="log-out" aria-hidden="true"></i>
1156 <span>éåº</span> 1157 </button> 1158 </div> 1159 <div class="admin-batch-dock-primary-actions" aria-label="æ¹éæä½"> 1160 <button id="adminBatchReplaceButton" class="app-bottom-dock-button" type="button" aria-label="为æéå¾çåçæä¸å¼ æ°å¾å¹¶æ¿æ¢" hidden> 1161 <i data-lucide="refresh-cw" aria-hidden="true"></i> 1162 <span>æ¿æ¢æé</span> 1163 </button> 1164 <button id="adminBatchFillButton" class="app-bottom-dock-button" type="button" aria-label="为æé飿 ¼è¡¥å ¨ææç¼ºå¾" hidden> 1165 <i data-lucide="image-plus" aria-hidden="true"></i> 1166 <span>è¡¥å ¨ç¼ºå¾</span> 1167 </button> 1168 <button id="adminBatchOpenSourceButton" class="app-bottom-dock-button" type="button" aria-label="弿ºæéæ ·å¼ "> 1169 <i data-lucide="globe-2" aria-hidden="true"></i> 1170 <span>弿º</span> 1171 </button> 1172 <button id="adminBatchUnpublishButton" class="app-bottom-dock-button" type="button" aria-label="åæ¶æéæ ·å¼ ç弿º"> 1173 <i data-lucide="eye-off" aria-hidden="true"></i> 1174 <span>忶弿º</span> 1175 </button> 1176 <button id="adminBatchSampleButton" class="app-bottom-dock-button" type="button" aria-label="为æé飿 ¼æ¹éè¡¥å æ ·å¼ "> 1177 <i data-lucide="images" aria-hidden="true"></i> 1178 <span>è¡¥å æ ·å¼ </span> 1179 </button> 1180 <button id="adminBatchLibraryButton" class="app-bottom-dock-button" type="button" aria-label="å°æéå½åé¢è§å¾å å ¥å¾çåº"> 1181 <i data-lucide="folder-plus" aria-hidden="true"></i> 1182 <span>å å ¥å¾çåº</span> 1183 </button> 1184 <button id="adminBatchMoveButton" class="app-bottom-dock-button" type="button" aria-label="ç§»å¨å°å ¶ä»æ ç®"> 1185 <i data-lucide="folder-input" aria-hidden="true"></i> 1186 <span>ç§»å¨æ ç®</span> 1187 </button> 1188 <button id="adminBatchTagButton" class="ui-button-secondary app-bottom-dock-button-secondary" type="button" aria-label="ç»ä¸æ·»å æ ·å¼ ç±»ç®"> 1189 <i data-lucide="tags" aria-hidden="true"></i> 1190 <span>å æ ç¾</span> 1191 </button> 1192 </div> 1193 </div> 1194 </div> 1195 1196 <section id="imageGeneratorView" class="image-generator-view" hidden aria-label="çæå¾ç"> 1197 <aside id="imageHubColumn" class="image-hub-column" aria-label="ä½å¾ä¸å¿" hidden> 1198 <nav class="image-hub-tabs" aria-label="ä½å¾ä¸å¿"> 1199 <a id="imageHubMakeTab" class="image-hub-tab" href="/image-generator">åå¾</a> 1200 <a id="imageHubRecordsTab" class="image-hub-tab" href="/image-generator/general">è®°å½</a> 1201 <button id="imageHubNewButton" class="image-hub-new" type="button" aria-label="å¼å§æ°çä½å¾">æ°ä½å¾</button> 1202 </nav> 1203 <div id="imageHubRecords" class="image-hub-records" hidden></div> 1204 </aside> 1205 <!-- The empty canvas (canvas-stage.js): result outlines, reference links and the member's latest images. --> 1206 <section id="imageCreateSkillsShelf" class="image-create-skills-shelf" hidden aria-label="å¼å§åå¾"></section> 1207 <div class="image-generator-board"> 1208 <section class="generated-images-panel" aria-label="çæç»æ"> 1209 <p id="imageGenerationSummary" class="image-generation-summary" role="status" aria-live="polite" hidden></p> 1210 <div id="generatedImageResult" class="generated-image-result generated-image-grid style-grid"></div> 1211 <div id="imageGeneratorModeSurface" class="image-generator-mode-surface" hidden></div> 1212 <div id="imageGeneratorWip" class="image-generator-wip" role="status" hidden> 1213 <strong>æ£å¨å»ºè®¾ä¸ï¼é¢è®¡ä¸å¨åå ä¸çº¿ã</strong> 1214 </div> 1215 </section> 1216 </div> 1217 </section> 1218 1219 <div id="generatedSelectionDock" class="generated-selection-dock image-generator-dock app-bottom-dock is-idle" role="region" aria-label="åå¾è®°å½æ¹éæä½" hidden> 1220 <div class="image-generator-dock-copy"> 1221 <strong id="generatedSelectionCount" aria-live="polite">å·²é 0 ç»</strong>
1222 <span>ç¹å»å¡çéæ©æåæ¶ï¼å é¤åæ æ³æ¢å¤</span> 1223 </div> 1224 <div class="image-generator-dock-actions"> 1225 <button id="selectAllGeneratedButton" class="app-bottom-dock-button-secondary" type="button"> 1226 <i data-lucide="copy-check" aria-hidden="true"></i> 1227 <span>å ¨é</span> 1228 </button> 1229 <button id="transferSelectedGeneratedButton" class="app-bottom-dock-button-secondary" type="button" disabled hidden> 1230 <i data-lucide="folder-input" aria-hidden="true"></i> 1231 <span>å å ¥å¾çåº</span> 1232 </button> 1233 <button id="deleteSelectedGeneratedButton" class="app-bottom-dock-button generated-selection-delete" type="button" disabled> 1234 <i data-lucide="trash-2" aria-hidden="true"></i> 1235 <span>å é¤éä¸</span> 1236 </button> 1237 <button id="clearImageGeneratorHistoryButton" class="app-bottom-dock-button-secondary" type="button" disabled>æ¸ ç©ºè®°å½</button> 1238 <button id="exitGeneratedSelectionButton" class="app-bottom-dock-icon-button" type="button" aria-label="éåºéæ©" data-tooltip="éåºéæ©"> 1239 <i data-lucide="x" aria-hidden="true"></i> 1240 </button> 1241 </div> 1242 </div> 1243 1244 <section id="notFoundView" class="not-found-view" hidden aria-label="页颿ªæ¾å°"> 1245 <div class="not-found-panel"> 1246 <p class="eyebrow">Not found</p> 1247 <h2>æ²¡ææ¾å°è¿ä¸ªé¡µé¢</h2> 1248 <p id="notFoundPath">è¿ä¸ªé¾æ¥ææ¶æ²¡æå¯¹åºå 容ã</p> 1249 <a class="ghost-button" href="/" data-app-view="archive">åå°æç¤ºè¯åº</a> 1250 </div> 1251 </section> 1252 1253 <section id="styleShareView" class="style-share-view" hidden aria-label="飿 ¼è¯¦æ "> 1254 <p id="styleShareStatus" class="style-share-status" role="status">æ£å¨å è½½é£æ ¼è¯¦æ â¦</p> 1255 <div id="styleShareSkeleton" class="detail-loading-skeleton style-share-skeleton" aria-hidden="true" hidden> 1256 <div class="detail-loading-prompt"><span><i></i><i></i><i></i></span><b></b><b></b><b></b><b></b></div> 1257 <div class="detail-loading-gallery-bar"><i></i><i></i></div> 1258 <div class="detail-loading-gallery"><span class="detail-loading-preview"></span><span></span><span></span><span></span><span></span></div> 1259 </div> 1260 <div id="styleShareHost"></div> 1261 </section> 1262 1263 <section id="styleUploadView" class="style-upload-view settings-ui" hidden aria-labelledby="styleUploadTitle" data-admin-only> 1264 <h1 id="styleUploadTitle" class="sr-only">飿 ¼ç®¡ç</h1> 1265 <p id="styleUploadReady" class="form-status" role="status">æ£å¨å è½½ä¸ä¼ å·¥å ·â¦</p> 1266 <div id="styleBatchUpload" class="style-batch-upload" hidden></div> 1267 </section> 1268 1269 <section id="sampleClassificationView" hidden aria-label="æ ç¾ç®¡ç" data-admin-only></section> 1270 <section id="skillsManagementView" class="skills-management" hidden aria-label="Skills 管ç" data-admin-only></section> 1271 <section id="obsidianManagementView" class="obsidian-management settings-ui" hidden aria-labelledby="obsidianManagementTitle" data-admin-only></section> 1272 <section id="operationsDashboardView" class="operations-dashboard style-upload-view settings-ui" hidden aria-labelledby="operationsDashboardTitle" data-admin-only> 1273 <header class="operations-page-head"><div><h1 id="operationsDashboardTitle">è¿è¥æ°æ®</h1><p>å京æ¶é´ · æ¯åéèªå¨æ´æ°</p></div><div class="operations-page-actions"> 1274 <label class="operations-admin-toggle"><input type="checkbox" data-dashboard-admins><span>å å«ç®¡çå</span></label> 1275 <button type="button" class="settings-button" data-dashboard-refresh><i data-lucide="refresh-cw" aria-hidden="true"></i><span>å·æ°æ°æ®</span></button> 1276 </div></header> 1277 <p class="style-upload-task-note" data-dashboard-status role="status" aria-live="polite"></p> 1278 <div data-dashboard-alerts></div> 1279 <div class="operations-section-head"><h2>è®¿é®æ¦åµ</h2><label class="operations-select" data-dashboard-daily-control hidden><span>æ¯æ¥è¶å¿èå´</span><select data-dashboard-trend><option value="7">è¿ 7 天</option><option value="30">è¿ 30 天</option></select></label></div> 1280 <div data-dashboard-overview></div> 1281 <div class="operations-section-head operations-business-head"><h2>ä¸å¡è¡¨ç°</h2><label class="operations-select"><span>ç»è®¡æ¶æ®µ</span><select data-dashboard-period><option value="today">仿¥</option><option value="yesterday">æ¨æ¥</option><option value="7d">è¿ 7 天</option><option value="30d">è¿ 30 天</option></select></label></div> 1282 <div data-dashboard-content></div> 1283 </section> 1284 <section id="accessReviewView" class="access-review-view style-upload-view settings-ui" hidden aria-labelledby="accessReviewTitle" data-admin-only> 1285 <header class="operations-page-head"><div>
1285<h1 id="accessReviewTitle">访é®å¤æ ¸</h1><p>åå¤ç¢°å°è®¿é®ä¸éçä¼å · ç³»ç»å 夿并ç»åºå»ºè®®ï¼æç»ç±ä½ å³å®</p></div><div class="operations-page-actions"> 1286 <button type="button" class="settings-button" data-access-review-refresh><i data-lucide="refresh-cw" aria-hidden="true"></i><span>å·æ°</span></button> 1287 </div></header> 1288 <p class="style-upload-task-note" data-access-review-status role="status" aria-live="polite"></p> 1289 <div class="access-review-content" data-access-review-content></div> 1290 </section> 1291 <section id="openSourceManageView" class="open-source-manage-view settings-ui" hidden aria-labelledby="openSourceManageTitle" data-admin-only> 1292 <h1 id="openSourceManageTitle" class="sr-only">弿ºç®¡ç</h1> 1293 <div class="open-source-manage-content" data-open-source-manage-content></div> 1294 </section> 1295 <section id="inviteLetterView" class="invite-letter-view settings-ui" hidden aria-labelledby="inviteLetterTitle" data-admin-only> 1296 <h1 id="inviteLetterTitle" class="sr-only">é请信</h1> 1297 <div class="invite-letter-content" data-invite-letter-content></div> 1298 </section> 1299 <section id="styleStatisticsView" class="style-statistics-view style-upload-view settings-ui" hidden aria-labelledby="styleStatisticsTitle" data-admin-only> 1300 <h1 id="styleStatisticsTitle" class="sr-only">飿 ¼ç»è®¡ä»ªè¡¨ç</h1> 1301 <div class="style-upload-stats-toolbar"> 1302 <label class="style-upload-topic"><span>ç»è®¡èå´</span><select id="styleStatsTopic"><option value="">å ¨é¨åç±»</option></select></label> 1303 <button id="styleStatsRefresh" class="settings-button" type="button">å·æ°æ°æ®</button> 1304 </div> 1305 <p id="styleStatsStatus" class="style-upload-task-note" role="status"></p> 1306 <div id="styleStatsContent" class="style-dashboard"></div> 1307 </section> 1308 1309 <footer class="public-site-footer site-compliance-footer"> 1310 <div class="public-site-footer-meta"><span>© 2026 xiaoxiaodong.ai</span><span><span id="publicFooterStyleCount" data-public-style-count>-</span> å¥æç¤ºè¯é£æ ¼</span></div> 1311 <nav aria-label="ç½ç«é¡µè导èª"><a href="/terms">æå¡æ¡æ¬¾</a><a href="/privacy">éç§æ¿ç</a><a href="/acceptable-use">AIGC 坿¥åä½¿ç¨æ¿ç</a><a href="/en/terms" lang="en">English policies</a><a href="mailto:[email protected]">客æé®ç®±</a><a href="https://work.weixin.qq.com/kfid/kfcccac384193047e7e" target="_blank" rel="noopener noreferrer">微信客æ</a></nav> 1312 </footer> 1313 </main> 1314 1315 <section id="imageCreatePanel" class="image-workspace-composer" aria-label="çæå¾ç" hidden> 1316 <div class="image-workspace-context" hidden> 1317 <div> 1318 <p id="imageCreatePanelEyebrow" class="eyebrow">Image generator</p> 1319 <h2 id="imageCreatePanelTitle">çæå¾ç</h2> 1320 </div> 1321 <button id="closeImageCreatePanel" class="header-icon-button" type="button" aria-label="ç»ææ¬æ¬¡å¼ç¨"> 1322 <i data-lucide="x" aria-hidden="true"></i> 1323 </button> 1324 </div> 1325 <div class="image-workspace-body"> 1326 1327 <div id="imageApiSetupNotice" class="image-api-setup-notice" role="status" aria-live="polite" hidden> 1328 <div> 1329 <strong>请å 设置å¾ççæ API</strong> 1330 <p>åªéè®¾ç½®ä¸æ¬¡ï¼ä¿ååä¼èªå¨åå°è¿éï¼å½åæç¤ºè¯ååèå¾é½ä¼ä¿çã</p> 1331 </div> 1332 <button id="imageApiSetupNoticeButton" type="button"> 1333 <i data-lucide="settings-2" aria-hidden="true"></i> 1334 <span>设置 API</span> 1335 </button> 1336 </div> 1337 <div class="image-reference-section" aria-labelledby="imageReferenceTitle"> 1338 <div class="image-reference-heading"> 1339 <div> 1340 <span id="imageReferenceTitle">åèå¾</span> 1341 <small>å¯é · æå¤ 20 å¼ </small> 1342 </div> 1343 <span id="imageReferenceMeta" class="image-reference-meta">å«å¾ + æç¤ºè¯</span> 1344 </div> 1345 <input id="imageReferenceInput" type="file" accept="image/png,image/jpeg,image/webp" multiple hidden> 1346 <div id="imageReferenceList" class="image-reference-list" aria-label="已鿩çåèå¾" hidden></div> 1347 <p id="imageReferenceHelp" class="image-reference-help">ä¸ä¼ åï¼å¨æç¤ºè¯é忏 è¦ä¿ççæå¾ã飿 ¼æè§è²ï¼ä»¥åéè¦æ¹åçå 容ã</p> 1348 </div> 1349 <div class="image-prompt-field">
1350 <span class="image-prompt-label"><strong>æç¤ºè¯</strong><small>æè¿°æç»ç»é¢</small></span> 1351 <div class="image-prompt-composer"> 1352 <div 1353 id="imagePromptEditor" 1354 class="image-prompt-editor" 1355 contenteditable="true" 1356 role="textbox" 1357 aria-label="æç¤ºè¯" 1358 aria-multiline="true" 1359 aria-autocomplete="list" 1360 aria-controls="imagePromptMentionMenu" 1361 aria-expanded="false" 1362 data-placeholder="æè¿°ä½ æ³åä½çç»é¢â¦" 1363 ></div> 1364 <textarea id="imagePromptInput" rows="4" aria-hidden="true" tabindex="-1" hidden></textarea> 1365 <div id="imagePromptMentionMenu" class="image-prompt-mention-menu" role="dialog" aria-label="è°ç¨æç¤ºè¯" hidden></div> 1366 </div> 1367 </div> 1368 <p id="imageGenerateStatus" class="form-status" role="status"></p> 1369 </div> 1370 <div class="image-workspace-actions"> 1371 <div class="image-create-primary-actions"> 1372 <button id="generateImageButton" class="dock-button app-bottom-dock-button" type="button" aria-label="çæå¾ç"> 1373 <i data-lucide="send" aria-hidden="true"></i> 1374 <span>çæ</span> 1375 </button> 1376 </div> 1377 <div class="image-workspace-tools"> 1378 <div id="imageReferenceActions" class="image-reference-actions" hidden> 1379 <button id="imageReferenceMenuButton" class="image-reference-menu-trigger" type="button" aria-label="åèå¾" aria-haspopup="dialog" aria-controls="imageReferenceMenu" aria-expanded="false"> 1380 <i data-lucide="images" aria-hidden="true"></i> 1381 <span id="imageReferenceCount" aria-live="polite" aria-atomic="true"></span> 1382 </button> 1383 <div id="imageReferenceMenu" class="image-reference-menu" role="dialog" aria-label="åèå¾" hidden> 1384 <button id="addImageReferenceButton" type="button"><i data-lucide="plus" aria-hidden="true"></i><span>ç»§ç»æ·»å åèå¾</span></button> 1385 <button id="clearImageReferenceButton" type="button"><i data-lucide="trash-2" aria-hidden="true"></i><span>æ¸ ç©ºææåèå¾</span></button> 1386 </div> 1387 </div> 1388 <button id="imageReferenceDrop" class="image-reference-drop" type="button" aria-label="æ·»å åèå¾" aria-describedby="imageReferenceHelp"> 1389 <span class="image-reference-drop-icon" aria-hidden="true"><i data-lucide="image-plus"></i></span> 1390 <span class="image-reference-drop-copy"> 1391 <strong>æ·»å åèå¾</strong> 1392 <small>ç¹å»ãæå ¥ï¼æç´æ¥ç²è´´å¾ç</small> 1393 </span> 1394 <span class="image-reference-drop-action" aria-hidden="true">éæ©</span> 1395 </button> 1396 <button id="imagePromptExpandButton" class="image-prompt-expand-button" type="button" aria-controls="imagePromptEditor" aria-expanded="false" aria-label="å±å¼æç¤ºè¯" title="å±å¼æç¤ºè¯"> 1397 <i data-lucide="chevrons-up-down" aria-hidden="true"></i> 1398 </button> 1399 <select id="imageRatioSelect" aria-label="ç»é¢æ¯ä¾"> 1400 <option value="auto">èªå¨æ¯ä¾</option> 1401 <option value="1024x1024">æ¹å¾ 1:1</option> 1402 <option value="1024x1536">ç«å¾ 2:3</option> 1403 <option value="1536x1024">æ¨ªå¾ 3:2</option> 1404 <option value="864x1536">ç«å± 9:16</option> 1405 <option value="1536x864">å®½å± 16:9</option> 1406 <option value="custom" hidden>èªå®å°ºå¯¸</option> 1407 </select> 1408 <div class="image-count-field"> 1409 <select id="imageCountSelect" aria-label="è¾åºå¼ æ°"> 1410 <option value="1">1 å¼ </option> 1411 <option value="2">2 å¼ </option> 1412 <option value="3">3 å¼ </option> 1413 <option value="4">4 å¼ </option> 1414 <option value="5">5 å¼ </option> 1415 <option value="6">6 å¼ </option> 1416 <option value="7">7 å¼ </option> 1417 <option value="8">8 å¼ </option> 1418 <option value="9">9 å¼ </option> 1419 <option value="10">10 å¼ </option> 1420 </select> 1421 </div>
1422 <details class="image-workspace-settings"> 1423 <summary aria-label="ä½å¾è®¾ç½®">设置<span id="imageSettingsSummary"></span></summary> 1424 <div class="image-create-toolbar"> 1425 <div class="image-api-mode-field"> 1426 <div class="image-api-picker-row"> 1427 <select id="imageApiModeSelect" aria-label="çææ¹å¼"> 1428 <option value="__obsidian__">积å</option> 1429 </select> 1430 <button id="testSelectedImageApiButton" class="image-api-trigger image-api-quick-test" type="button" aria-label="æµè¯è¿æ¥" hidden> 1431 <i data-lucide="plug-zap" aria-hidden="true"></i> 1432 <span>æµè¯</span> 1433 </button> 1434 </div> 1435 </div> 1436 <button id="openImageApiSettings" class="image-api-trigger" type="button" aria-label="API 设置" hidden> 1437 <i data-lucide="settings-2" aria-hidden="true"></i> 1438 <span>API</span> 1439 </button> 1440 </div> 1441 <div class="image-output-controls" aria-label="è¾åºè®¾ç½®"> 1442 <div class="image-size-field"> 1443 <select id="imageSizeSelect" aria-label="å¾ç尺寸"> 1444 <option value="auto">èªå¨å°ºå¯¸</option> 1445 <option value="1024x1024">1:1 · 1024</option> 1446 <option value="2048x2048">1:1 · 2K</option> 1447 <option value="1536x1024">3:2 · 1536</option> 1448 <option value="2048x1360">3:2 · 2K</option> 1449 <option value="1024x1536">2:3 · 1536</option> 1450 <option value="1360x2048">2:3 · 2K</option> 1451 <option value="1536x864">16:9 · 1536</option> 1452 <option value="2048x1152">16:9 · 2K</option> 1453 <option value="3840x2160">16:9 · 4K</option> 1454 <option value="864x1536">9:16 · 1536</option> 1455 <option value="1152x2048">9:16 · 2K</option> 1456 <option value="2160x3840">9:16 · 4K</option> 1457 <option value="1536x1152">4:3 · 1536</option> 1458 <option value="1152x1536">3:4 · 1536</option> 1459 <option value="1280x1024">5:4 · 1280</option> 1460 <option value="1024x1280">4:5 · 1280</option> 1461 <option value="1600x640">5:2 · 1600</option> 1462 <option value="1792x768">21:9 · 1792</option> 1463 <option value="1536x768">2:1 · 1536</option> 1464 <option value="768x1536">1:2 · 1536</option> 1465 <option value="1536x512">3:1 · 1536</option> 1466 <option value="512x1536">1:3 · 1536</option> 1467 </select> 1468 </div> 1469 <div class="image-quality-field"> 1470 <select id="imageQualitySelect" aria-label="å¾çç»è´¨"> 1471 <option value="auto">èªå¨ç»è´¨</option> 1472 <option value="high">é«ç»è´¨</option> 1473 <option value="medium">æ å</option> 1474 <option value="low">å¿«é</option> 1475 </select> 1476 </div> 1477 </div> 1478 </details> 1479 </div> 1480 </div> 1481 </section> 1482 1483 <dialog id="passwordResetDialog" class="member-dialog ui-dialog" aria-labelledby="passwordResetDialogTitle"> 1484 <form id="passwordResetForm" class="password-reset-dialog-card member-dialog-card ui-dialog-card"> 1485 <div class="member-dialog-head ui-dialog-head"> 1486 <h3 id="passwordResetDialogTitle">æ¾åå¯ç </h3> 1487 <button id="closePasswordResetButton" class="icon-button" type="button" aria-label="å ³é"><svg class="ui-icon" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="miter" aria-hidden="true" focusable="false"><path d="m6 6 12 12M18 6 6 18"/></svg></button> 1488 </div> 1489 <p id="passwordResetIntro" class="password-reset-intro">è¾å ¥æ³¨åé®ç®±ï¼æä»¬ä¼åéä¸å°éç½®é®ä»¶ã</p> 1490 <label id="passwordResetEmailField" class="member-field ui-field"> 1491 <span>é®ç®±</span> 1492 <input id="passwordResetEmailInput" type="email" autocomplete="email" placeholder="[email protected]"> 1493 </label> 1494 <input id="passwordResetTokenInput" type="hidden"> 1495 <label id="passwordResetNewPasswordField" class="member-field ui-field" hidden>
1496 <span>æ°å¯ç </span> 1497 <input id="passwordResetNewPasswordInput" type="password" autocomplete="new-password" placeholder="è³å° 8 ä½"> 1498 </label> 1499 <div class="member-actions ui-dialog-actions"> 1500 <button id="requestPasswordResetButton" type="submit">åééç½®é®ä»¶</button> 1501 <button id="confirmPasswordResetButton" type="submit" hidden>ä¿åæ°å¯ç </button> 1502 </div> 1503 <p id="passwordResetStatus" class="form-status" role="status" aria-live="polite"></p> 1504 </form> 1505 </dialog> 1506 1507 <dialog id="deleteConfirmDialog" class="member-dialog ui-dialog delete-confirm-dialog" aria-labelledby="deleteConfirmTitle" aria-describedby="deleteConfirmBody"> 1508 <form method="dialog" class="member-dialog-card ui-dialog-card"> 1509 <div class="member-dialog-head ui-dialog-head"> 1510 <h3 id="deleteConfirmTitle">确认å é¤</h3> 1511 <button class="icon-button" value="cancel" type="submit" aria-label="å ³é"><svg class="ui-icon" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="miter" aria-hidden="true" focusable="false"><path d="m6 6 12 12M18 6 6 18"/></svg></button> 1512 </div> 1513 <p id="deleteConfirmBody" class="delete-confirm-body">å é¤åå°ä»ç½ç«ä¸ç§»é¤ã</p> 1514 <ul id="deleteConfirmList" class="delete-confirm-list" hidden></ul> 1515 <div class="member-actions ui-dialog-actions delete-confirm-actions"> 1516 <div class="delete-confirm-import-actions"> 1517 <button id="cancelDeleteButton" class="ghost-button ui-dialog-cancel" type="button">åæ¶</button> 1518 <button id="confirmDeleteButton" class="delete-confirm-danger delete-confirm-primary" type="button"> 1519 <i data-lucide="trash-2" aria-hidden="true"></i> 1520 <span>å é¤</span> 1521 </button> 1522 </div> 1523 <div id="deleteConfirmExtraActions" class="delete-confirm-extra-actions" hidden> 1524 <p>æ¸ çå¨ä½ä¼ç§»å ¥åæ¶ç«ï¼å·²ææ ãæ¶èæè¯åçå¾çä¼ä¿çã</p> 1525 <button id="extraDeleteButton" class="ghost-button delete-confirm-extra" type="button" hidden> 1526 <i data-lucide="trash-2" aria-hidden="true"></i> 1527 <span></span> 1528 </button> 1529 </div> 1530 </div> 1531 </form> 1532 </dialog> 1533 1534 1535 <div id="detailResizer" class="detail-resizer" role="separator" aria-orientation="vertical" aria-label="æå¨è°æ´é¢æ¿å®½åº¦" aria-valuemin="24" aria-valuemax="70" aria-valuenow="44" tabindex="0"></div> 1536 1537 1538 <aside id="articleEditorPanel" class="detail-panel article-editor-panel ui-sheet panel-shell" hidden aria-labelledby="articleEditorTitle" data-admin-only> 1539 <div class="dialog-head ui-dialog-head panel-shell-head"> 1540 <div> 1541 <h2 id="articleEditorTitle">æ°å»ºæç« </h2> 1542 </div> 1543 <button id="closeArticleEditorPanel" class="icon-button panel-shell-navigation right-panel-close-button" type="button" aria-label="å ³é"> 1544 <i data-lucide="x" aria-hidden="true"></i> 1545 </button> 1546 </div> 1547 <div class="article-editor-scroll panel-shell-body"> 1548 <section id="articleEditorForm" class="article-editor-form" aria-label="æç« ç¼è¾"> 1549 <section id="articleTranslationWorkspace" class="article-translation-workspace" aria-label="English companion workflow" hidden> 1550 <div class="article-translation-summary"> 1551 <span id="articleTranslationStatusBadge" class="article-translation-status" data-status="missing">EN æªå建</span> 1552 <p id="articleTranslationStatusHint">è±æè稿ä¸ä¼å¨è±æç«æ¾ç¤ºï¼åªææç¡®åå¸åæä¼ä¸çº¿ã</p> 1553 </div> 1554 <details id="articleTranslationSourceReference" class="article-translation-source"> 1555 <summary>å¯¹ç §ä¸ææºç¨¿</summary> 1556 <h3 id="articleTranslationSourceTitle"></h3> 1557 <p id="articleTranslationSourceExcerpt"></p> 1558 <pre id="articleTranslationSourceMarkdown"></pre> 1559 </details> 1560 <div id="articleTranslationQa" class="article-translation-qa" role="status" hidden></div> 1561 </section> 1562 <label id="articleTranslationCoverModeField" class="member-field ui-field article-translation-cover-mode" hidden>
1563 <span>è±æå°é¢æ¹æ¡</span> 1564 <select id="articleTranslationCoverModeInput"> 1565 <option value="reuse">å¤ç¨ä¸æå°é¢ï¼éåæ æåå¾ï¼</option> 1566 <option value="independent">使ç¨ç¬ç«è±æå°é¢</option> 1567 <option value="none">䏿¾ç¤ºå°é¢</option> 1568 </select> 1569 </label> 1570 <label id="articleTitleField" class="member-field ui-field"> 1571 <span>æ é¢ <em aria-hidden="true">*</em></span> 1572 <input id="articleTitleInput" type="text" maxlength="180" placeholder="ä¸å¥è¯è¯´æ¸ è¿ç¯æç« " autocomplete="off" required aria-required="true"> 1573 </label> 1574 <label id="articleMarkdownField" class="member-field ui-field article-markdown-field"> 1575 <span>æ£æ <em aria-hidden="true">*</em></span> 1576 <textarea id="articleMarkdownInput" rows="16" maxlength="80000" placeholder="æ¯æ Markdownï¼å¯ç´æ¥ç²è´´å®æ´æç« " required aria-required="true"></textarea> 1577 </label> 1578 <section class="article-publishing-settings" aria-labelledby="articlePublishingSettingsTitle"> 1579 <div class="article-publishing-settings-head"> 1580 <h3 id="articlePublishingSettingsTitle">åå¸è®¾ç½®</h3> 1581 <p>åå¸å请确认访é®èå´ï¼åç±»åæ¥æå·²èªå¨é¢å¡«ã</p> 1582 </div> 1583 <label id="articleMemberOnlyField" class="member-field ui-field article-member-only-field" data-access="public"> 1584 <span>访é®èå´ <span id="articleMemberOnlyState" class="article-member-only-state" data-access="public" aria-live="polite">å½åï¼å ¬å¼å¯è§</span></span> 1585 <span class="ui-checkbox-row"> 1586 <input id="articleMemberOnlyInput" type="checkbox" role="switch" aria-describedby="articleMemberOnlyHelp articleMemberOnlyState"> 1587 <span class="article-member-only-copy"><strong>ä» ä¼åå¯è§</strong><small id="articleMemberOnlyHelp">å¼å¯ååªæå·²æ¿æ´»ä¼åå管çåå¯é 读ï¼å ³éæ¶ææè®¿å®¢åå¯é 读ã</small></span> 1588 </span> 1589 </label> 1590 <div class="article-editor-grid"> 1591 <label class="member-field ui-field"> 1592 <span>åç±»</span> 1593 <select id="articleCategoryInput"> 1594 <option value="articles">æç« </option> 1595 <option value="skills">skills</option> 1596 <option value="chrome-plugins">Chrome æä»¶</option> 1597 <option value="other">å ¶ä»</option> 1598 </select> 1599 </label> 1600 <label class="member-field ui-field"> 1601 <span>æ¥æ</span> 1602 <input id="articleDateInput" type="date"> 1603 </label> 1604 </div> 1605 <label class="member-field ui-field"> 1606 <span>æ ç¾</span> 1607 <input id="articleTagInput" type="text" maxlength="80" placeholder="æ ç¾"> 1608 </label> 1609 <label class="member-field ui-field"> 1610 <span>æè¦</span> 1611 <textarea id="articleExcerptInput" rows="3" maxlength="500" placeholder="å¯éï¼çç©ºå°æ ¹æ®æ£æèªå¨çæ"></textarea> 1612 </label> 1613 <details id="articleEditorOptions" class="article-editor-options"> 1614 <summary><span>å°é¢ä¸é«çº§è®¾ç½®</span><small>å¯é</small></summary> 1615 <div class="article-editor-options-body"> 1616 <div id="articleEditorCoverControls" class="article-editor-cover-controls"> 1617 <label id="articleEditorCoverDrop" class="article-editor-cover-drop" tabindex="0"> 1618 <img id="articleEditorCoverPreview" alt="" hidden> 1619 <span id="articleEditorCoverPlaceholder">ææ½å°é¢å°è¿é</span> 1620 <input id="articleEditorCoverInput" type="file" accept="image/png,image/jpeg,image/webp"> 1621 </label> 1622 <button id="articleEditorCoverLibraryButton" class="editor-cover-library-button cover-library-button ui-button-secondary" type="button"> 1623 <i data-lucide="images" aria-hidden="true"></i>
1624 <span>ä»å¾çåºéæ©å°é¢</span> 1625 </button> 1626 <button id="articleEditorRemoveCoverButton" class="ui-button-secondary" type="button" hidden>ç§»é¤å°é¢</button> 1627 </div> 1628 <div class="article-editor-grid"> 1629 <label class="member-field ui-field"> 1630 <span>å°é¢è¯´æ</span> 1631 <input id="articleCoverAltInput" type="text" maxlength="500" placeholder="ç¨äºæ éç¢é 读"> 1632 </label> 1633 <label class="member-field ui-field"> 1634 <span>å°é¢æç¤ºè¯</span> 1635 <input id="articleCoverPromptInput" type="text" maxlength="4000" placeholder="ä¿ççæå°é¢çæç¤ºè¯"> 1636 </label> 1637 </div> 1638 </div> 1639 </details> 1640 </section> 1641 </section> 1642 <section id="articleTranslationPreview" class="article-translation-preview" aria-label="English article preview" hidden> 1643 <div class="article-translation-preview-head"> 1644 <span id="articleEditorPreviewLabel">æç« é¢è§</span> 1645 <button id="closeArticleTranslationPreviewButton" class="ui-button-secondary" type="button">è¿åç¼è¾</button> 1646 </div> 1647 <figure id="articleTranslationPreviewCover" class="article-translation-preview-cover" hidden> 1648 <img id="articleTranslationPreviewCoverImage" alt=""> 1649 </figure> 1650 <h2 id="articleTranslationPreviewTitle"></h2> 1651 <p id="articleTranslationPreviewExcerpt"></p> 1652 <div id="articleTranslationPreviewContent" class="article-content"></div> 1653 </section> 1654 </div> 1655 <div class="article-editor-dock panel-shell-dock app-bottom-dock app-bottom-panel-dock"> 1656 <p id="articleEditorStatus" class="form-status article-editor-dock-status" role="status" aria-live="polite"></p> 1657 <button id="rebaseArticleTranslationButton" class="ui-button-secondary app-bottom-dock-button-secondary" type="button" hidden>ä¿çè±æå¹¶åæ¥æºç¨¿</button> 1658 <button id="resetArticleTranslationButton" class="ui-button-secondary app-bottom-dock-button-secondary" type="button" hidden>ä»¥æ°æºç¨¿éç½®</button> 1659 <button id="withdrawArticleTranslationButton" class="ui-button-secondary app-bottom-dock-button-secondary article-translation-withdraw" type="button" hidden>æ¤åè±æç</button> 1660 <button id="previewArticleTranslationButton" class="ui-button-secondary app-bottom-dock-button-secondary" type="button" hidden>é¢è§</button> 1661 <button id="cancelArticleEditorButton" class="ui-button-secondary app-bottom-dock-button-secondary" type="button">åæ¶</button> 1662 <button id="saveArticleEditorButton" class="dock-button app-bottom-dock-button" type="button"> 1663 <i data-lucide="save" aria-hidden="true"></i> 1664 <span>ä¿å</span> 1665 </button> 1666 <button id="publishArticleTranslationButton" class="dock-button app-bottom-dock-button" type="button" hidden> 1667 <i data-lucide="languages" aria-hidden="true"></i> 1668 <span>åå¸è±æç</span> 1669 </button> 1670 </div> 1671 </aside> 1672 1673 <aside id="notificationCenterPanel" class="detail-panel notification-center-panel ui-sheet panel-shell" hidden aria-labelledby="notificationCenterTitle" data-admin-only> 1674 <div class="dialog-head ui-dialog-head panel-shell-head"> 1675 <div class="notification-detail-head-title"> 1676 <h2 id="notificationCenterTitle">åé设置</h2> 1677 </div> 1678 <div class="notification-detail-head-actions panel-shell-actions"> 1679 <button id="deleteCurrentNotificationButton" class="notification-admin-icon-button notification-admin-delete-button panel-shell-danger-action" type="button" aria-label="å é¤è¿æ¡éç¥" title="å é¤éç¥" hidden> 1680 <i data-lucide="trash-2" aria-hidden="true"></i> 1681 </button> 1682 <button id="editCurrentNotificationButton" class="notification-admin-icon-button" type="button" aria-label="ç¼è¾å½åéç¥" title="ç¼è¾éç¥" hidden> 1683 <i data-lucide="square-pen" aria-hidden="true"></i> 1684 </button> 1685 <button id="closeNotificationCenterPanel" class="icon-button panel-shell-navigation right-panel-close-button" type="button" aria-label="å ³é"> 1686 <i data-lucide="x" aria-hidden="true"></i> 1687 </button> 1688 </div> 1689 </div> 1690 <div class="notification-center-body panel-shell-body"> 1691 <section id="notificationCurrent" class="notification-current" aria-label="å½åéç¥" hidden> 1692 <figure id="notificationCenterCover" class="notification-current-cover" hidden> 1693 <img id="notificationCenterCoverImage" alt=""> 1694 </figure> 1695 <p id="notificationCenterMeta" class="notification-meta" hidden></p> 1696 <h3 id="notificationCenterMessageTitle" hidden></h3>
1697 <div id="notificationCenterContent" class="notification-markdown" hidden></div> 1698 <div class="notification-current-actions"> 1699 <button id="openArticleNotificationButton" class="ghost-button notification-article-link" type="button" hidden> 1700 <i data-lucide="book-open-text" aria-hidden="true"></i> 1701 <span>æç« </span> 1702 </button> 1703 </div> 1704 </section> 1705 <section id="notificationCurrentEmpty" class="notification-empty" role="status" hidden> 1706 <strong>è¿æ²¡æéç¥</strong> 1707 <span>ææ°æ¶æ¯æ¶ä¼æ¾ç¤ºå¨è¿éã</span> 1708 </section> 1709 <section id="notificationAdminEditor" class="notification-admin-editor article-editor-form" aria-label="åå¸éç¥" hidden> 1710 <section id="notificationImportSection" class="article-import-section notification-import-section" aria-labelledby="notificationImportTitle"> 1711 <div class="article-import-head"> 1712 <div> 1713 <span class="article-import-eyebrow">å¿«éå¯¼å ¥</span> 1714 <h3 id="notificationImportTitle">å¯¼å ¥æç« æ Markdown</h3> 1715 </div> 1716 <p>ç²è´´å ¬å¼ç X æç« 龿¥ï¼æéæ© Markdown æä»¶ï¼å 容ä¼å¡«å ¥ä¸é¢çéç¥ç¼è¾å¨ã</p> 1717 </div> 1718 <div class="article-import-form notification-import-form"> 1719 <div class="notification-import-option notification-import-url-option"> 1720 <div class="notification-import-option-head"> 1721 <strong>X æç« 龿¥</strong> 1722 <span>忥æ é¢ãå°é¢åæ£æ</span> 1723 </div> 1724 <label class="member-field ui-field notification-import-url-field"> 1725 <span>æç« 龿¥</span> 1726 <input id="notificationImportUrlInput" type="url" inputmode="url" placeholder="https://x.com/.../status/..." autocomplete="off"> 1727 </label> 1728 <button id="importNotificationArticleButton" class="ui-button-secondary article-import-button" type="button"> 1729 <i data-lucide="download" aria-hidden="true"></i> 1730 <span>读å X æç« </span> 1731 </button> 1732 </div> 1733 <div class="notification-import-option notification-import-file-option"> 1734 <div class="notification-import-option-head"> 1735 <strong>Markdown æä»¶</strong> 1736 <span>éåå¯¼å ¥å·²ææç¨¿</span> 1737 </div> 1738 <input id="notificationMarkdownFileInput" type="file" accept=".md,.markdown,text/markdown,text/plain" hidden> 1739 <button id="importNotificationMarkdownButton" class="ui-button-secondary article-import-button" type="button"> 1740 <i data-lucide="file-up" aria-hidden="true"></i> 1741 <span>å¯¼å ¥ Markdown æä»¶</span> 1742 </button> 1743 <p class="notification-import-file-help">æ¯æ .mdã.markdown å .txtï¼å¯¼å ¥åä»å¯å¨ä¸æ¹ç¼è¾ã</p> 1744 </div> 1745 </div> 1746 <div id="notificationImportPreview" class="article-import-preview" hidden> 1747 <img id="notificationImportPreviewCover" alt="" hidden> 1748 <div class="article-import-preview-copy"> 1749 <strong id="notificationImportPreviewTitle"></strong> 1750 <p id="notificationImportPreviewMeta"></p> 1751 <p id="notificationImportPreviewExcerpt"></p> 1752 </div> 1753 </div> 1754 <p id="notificationImportStatus" class="form-status" role="status" aria-live="polite"></p> 1755 </section> 1756 <div class="notification-editor-cover-field"> 1757 <label id="notificationCoverDrop" class="article-editor-cover-drop notification-editor-cover-drop" tabindex="0"> 1758 <img id="notificationCoverPreview" alt="" hidden> 1759 <span id="notificationCoverPlaceholder">ææ½å°é¢å°è¿é</span> 1760 <input id="notificationCoverInput" type="file" accept="image/png,image/jpeg,image/webp"> 1761 </label> 1762 <button id="notificationCoverLibraryButton" class="editor-cover-library-button cover-library-button ui-button-secondary" type="button"> 1763 <i data-lucide="images" aria-hidden="true"></i>
1764 <span>ä»å¾çåºéæ©å°é¢</span> 1765 </button> 1766 <button id="removeNotificationCoverButton" class="notification-editor-cover-remove ui-button-secondary" type="button" hidden> 1767 <i data-lucide="x" aria-hidden="true"></i> 1768 <span>ç§»é¤å°é¢</span> 1769 </button> 1770 </div> 1771 <label class="member-field ui-field"> 1772 <span>æ é¢</span> 1773 <input id="notificationTitleInput" type="text" maxlength="120" placeholder="æ é¢"> 1774 </label> 1775 <label class="member-field ui-field"> 1776 <span>æ£æ</span> 1777 <textarea id="notificationMarkdownInput" rows="10" maxlength="12000" placeholder="æ£æ"></textarea> 1778 </label> 1779 <p id="notificationCenterStatus" class="form-status" role="status"></p> 1780 </section> 1781 <section id="newsletterSendPanel" class="newsletter-send-panel" aria-label="Newsletter åé设置" hidden> 1782 <div class="newsletter-admin-head"> 1783 <div> 1784 <strong>åé设置</strong> 1785 <span>å å¨ç叿µéé飿 ¼ï¼å确认注åç¨æ·é®ç®±ã</span> 1786 </div> 1787 </div> 1788 <label class="member-field ui-field"> 1789 <span>æ é¢</span> 1790 <input id="newsletterSubjectInput" type="text" maxlength="120" placeholder="å°å°ä¸-仿¥é£æ ¼æ¨è-2026-06-27-第1æ"> 1791 </label> 1792 <label class="member-field ui-field"> 1793 <span>å¼åº</span> 1794 <textarea id="newsletterIntroInput" rows="2" maxlength="1000" placeholder="ä»å¤©æå ç»è½ç´æ¥å¼å·¥ç飿 ¼ã"></textarea> 1795 </label> 1796 <div class="newsletter-recipient-head"> 1797 <span>注åç¨æ·é®ç®±</span> 1798 <button id="toggleNewsletterRecipientsButton" class="ghost-button" type="button"> 1799 <i data-lucide="check-check" aria-hidden="true"></i> 1800 <span>å ¨é</span> 1801 </button> 1802 </div> 1803 <div id="newsletterRecipientList" class="newsletter-recipient-list" role="list"></div> 1804 <p id="newsletterStatus" class="form-status" role="status"></p> 1805 </section> 1806 <section id="newsletterPreviewPanel" class="newsletter-preview-panel" aria-label="Newsletter é¢è§" hidden> 1807 <div class="newsletter-preview-head"> 1808 <span>é®ä»¶é¢è§</span> 1809 <h3 id="newsletterPreviewSubject"></h3> 1810 <p id="newsletterPreviewIntro"></p> 1811 </div> 1812 <div id="newsletterPreviewStyles" class="newsletter-preview-styles" role="list"></div> 1813 <p id="newsletterPreviewEmpty" class="newsletter-preview-empty" role="status" hidden>è¿æ²¡æéæ©é£æ ¼ã</p> 1814 </section> 1815 </div> 1816 <div id="notificationAdminDock" class="notification-admin-dock panel-shell-dock app-bottom-dock app-bottom-panel-dock" hidden> 1817 <nav id="notificationIssueNavigation" class="newsletter-issue-navigation" aria-label="åæåå²å¯¼èª" hidden></nav> 1818 <button id="cancelNotificationEditorButton" class="ui-button-secondary app-bottom-dock-button-secondary" type="button" hidden>åæ¶</button> 1819 <button id="saveNotificationButton" class="dock-button app-bottom-dock-button notification-admin-save-button" type="button" hidden> 1820 <i data-lucide="save" aria-hidden="true"></i> 1821 <span>ä¿å</span> 1822 </button> 1823 </div> 1824 </aside> 1825 1826 <aside id="detailPanel" class="detail-panel ui-sheet panel-shell" hidden aria-label="飿 ¼è¯¦æ 颿¿"> 1827 <div class="dialog-head ui-dialog-head panel-shell-head"> 1828 <div> 1829 <p id="detailMeta" class="eyebrow"></p> 1830 <h2 id="detailTitle"></h2> 1831 <button id="detailTitleToggle" class="detail-title-toggle" type="button" aria-expanded="false" aria-controls="detailTitle" hidden>å±å¼åç§°</button> 1832 </div> 1833 <div class="dialog-head-actions panel-shell-actions"> 1834 <details id="detailAdminActions" class="detail-admin-actions" hidden> 1835 <summary class="header-icon-button" aria-label="æ´å¤æä½" aria-controls="detailMoreMenu"><i data-lucide="ellipsis" aria-hidden="true"></i></summary> 1836 <div id="detailMoreMenu" class="detail-admin-menu"> 1837 <button id="detailDeliverButton" class="detail-admin-icon-button" type="button" aria-label="åå¸å°å°ç¨åº" title="åå¸å°å°ç¨åº"> 1838 <i data-lucide="smartphone" aria-hidden="true"></i> 1839 </button> 1840 <button id="detailResyncButton" class="detail-admin-icon-button" type="button" aria-label="强å¶éæ°åæ¥å°å°ç¨åº" title="强å¶éæ°åæ¥å°å°ç¨åº" hidden> 1841 <i data-lucide="refresh-cw" aria-hidden="true"></i> 1842 </button> 1843 <button id="detailShareButton" class="detail-admin-icon-button detail-share-button" type="button" aria-label="è·ååäº«é¾æ¥" data-tooltip="å¤å¶é£æ ¼ä¸»é¡µé¾æ¥" data-member-facing-locale hidden> 1844 <i data-lucide="share-2" aria-hidden="true"></i> 1845 </button> 1846 <button id="detailRedoButton" class="detail-admin-icon-button" type="button" aria-label="æ´ç»éåæ ·å¼ " hidden> 1847 <i data-lucide="refresh-cw" aria-hidden="true"></i> 1848 </button> 1849 <button id="detailDeleteButton" class="detail-admin-icon-button detail-admin-delete-button" type="button" aria-label="å é¤é£æ ¼"> 1850 <i data-lucide="trash-2" aria-hidden="true"></i> 1851 </button> 1852 </div> 1853 </details> 1854 <button id="closeDetailButton" class="header-icon-button panel-shell-navigation right-panel-close-button" type="button" aria-label="å ³é"> 1855 <i data-lucide="x" aria-hidden="true"></i> 1856 </button> 1857 </div> 1858 </div> 1859 <div class="detail-body panel-shell-body">
1860 <div id="detailLoadingSkeleton" class="detail-loading-skeleton" role="status" hidden> 1861 <span class="sr-only">æ£å¨å è½½é£æ ¼è¯¦æ â¦</span> 1862 </div> 1863 <div id="detailTagRail" class="detail-tag-rail" role="group" aria-label="飿 ¼æ ç¾" hidden></div> 1864 <aside class="prompt-panel" aria-label="æç¤ºè¯æä½"> 1865 <section class="copy-panel prompt-code-block" aria-labelledby="basePromptHeading"> 1866 <div id="basePromptViewer" class="prompt-code-viewer" tabindex="0" aria-label="åå§æç¤ºè¯"> 1867 <div class="prompt-code-toolbar"> 1868 <button id="basePromptToggle" class="prompt-code-title-button" type="button" aria-expanded="false" aria-controls="basePromptContent" aria-label="å±å¼åå§æç¤ºè¯" title="å±å¼åå§æç¤ºè¯" disabled> 1869 <span id="basePromptHeading" class="prompt-code-label">åå§æç¤ºè¯</span> 1870 <span id="basePromptMeta" class="prompt-code-meta"></span> 1871 <span id="basePromptExpandIcon" class="prompt-expand-icon" aria-hidden="true" hidden><i data-lucide="chevron-down"></i></span> 1872 </button> 1873 <div class="prompt-code-actions"> 1874 <button id="copyBaseButton" class="prompt-code-action" type="button" aria-label="å¤å¶åå§æç¤ºè¯" data-tooltip="å¤å¶åå§æç¤ºè¯"> 1875 <i data-lucide="copy" aria-hidden="true"></i> 1876 </button> 1877 </div> 1878 </div> 1879 <div id="basePromptContent" class="prompt-code-scroll-body"> 1880 <div class="prompt-code-loading-lines" aria-hidden="true"><b></b><b></b><b></b><b></b></div> 1881 <pre><code id="basePromptCode"></code></pre> 1882 </div> 1883 </div> 1884 <div class="prompt-input-shell" aria-hidden="true"> 1885 <textarea id="basePrompt" class="prompt-code-source" readonly tabindex="-1"></textarea> 1886 </div> 1887 </section> 1888 <section id="detailStyleRating" class="style-rating" role="group" aria-label="ç»è¿ä¸ªé£æ ¼æå" hidden></section> 1889 </aside> 1890 <section id="detailTaskInfo" class="detail-task-info" aria-label="çæä»»å¡è¯¦æ " hidden></section> 1891 <section id="detailGallerySection" class="detail-gallery" aria-label="å ¨é¨æ ·å¼ " hidden> 1892 <div class="detail-gallery-bar"> 1893 <span id="detailGalleryLabel" class="detail-gallery-label">å ¨é¨æ ·å¼ </span> 1894 <button id="detailFillMissingButton" class="detail-fill-missing-button" type="button" hidden>è¡¥å ¨ç¼ºå¾</button> 1895 <button id="detailSampleConflictButton" class="detail-sample-conflict-button" type="button" hidden>éè¦å¤ç</button> 1896 <div class="view-toggle" role="group" aria-label="æ ·å¼ æä½"> 1897 <button id="galleryLayoutToggle" class="view-toggle-btn" type="button" aria-pressed="false" title="å½åï¼ç叿µï¼ç¹å»åæ¢ä¸ºååç«æ" aria-label="å½åï¼ç叿µï¼ç¹å»åæ¢ä¸ºååç«æ"> 1898 <i data-lucide="layout-grid" aria-hidden="true"></i> 1899 </button> 1900 <button id="manualSampleEntryButton" class="view-toggle-btn detail-add-sample-button" type="button" aria-label="æ·»å æ ·å¼ " title="æ·»å æ ·å¼ " hidden> 1901 <i data-lucide="plus" aria-hidden="true"></i> 1902 </button> 1903 </div> 1904 </div> 1905 <div id="detailGallery" class="detail-gallery-grid"></div> 1906 </section> 1907 <section id="detailLabelSection" class="detail-label-section" aria-label="æ ç¾" hidden></section> 1908 <section id="detailSimilarSection" class="detail-similar" aria-label="ç±»ä¼¼é£æ ¼æ¨è" hidden> 1909 <div class="detail-similar-head"> 1910 <span class="detail-similar-label">ç±»ä¼¼é£æ ¼</span> 1911 <div class="detail-similar-tabs" role="group" aria-label="ç±»ä¼¼é£æ ¼æåº"> 1912 <button class="detail-similar-tab" type="button" data-detail-similar-mode="color" aria-pressed="true">è²å½©ç¸ä¼¼</button> 1913 <button class="detail-similar-tab" type="button" data-detail-similar-mode="prompt" aria-pressed="false">æç¤ºè¯ç¸ä¼¼</button> 1914 </div> 1915 </div> 1916 <div id="detailSimilarColorRail" class="detail-similar-color-rail" role="group" aria-label="éæ©ç¸ä¼¼è²" hidden></div> 1917 <div id="detailSimilarGrid" class="detail-similar-grid"></div> 1918 <div id="detailSimilarSentinel" class="detail-similar-sentinel" aria-hidden="true"></div> 1919 <button id="loadMoreSimilarButton" class="text-link-button detail-similar-more" type="button">åç 8 个</button> 1920 </section> 1921 <button id="detailPublicId" class="detail-public-id" type="button" hidden></button> 1922 </div> 1923 <div class="detail-dock panel-shell-dock app-bottom-dock app-bottom-panel-dock" hidden> 1924 <div id="detailLabelEditBar" class="detail-label-edit-bar" role="group" aria-label="éå¼ è°æ´æ ç¾" hidden></div> 1925 <div id="detailTaskActions" class="detail-task-actions" hidden></div> 1926 <button id="makeSimilarButton" class="dock-button app-bottom-dock-button" type="button"> 1927 <i data-lucide="wand-sparkles" aria-hidden="true"></i>
1928 <span id="makeSimilarLabel">ç¨åå§æç¤ºè¯ä½å¾</span> 1929 </button> 1930 <div id="detailDownloadControl" class="dock-download" data-download-mode="markdown"> 1931 <button id="downloadDetailMenuButton" class="dock-icon-button app-bottom-dock-icon-button dock-download-menu-button" type="button" aria-label="å¯¼åºæç¤ºè¯ææ ·å¼ " aria-haspopup="menu" aria-expanded="false" data-tooltip="å¯¼åºæç¤ºè¯ææ ·å¼ "> 1932 <i data-lucide="download" aria-hidden="true"></i> 1933 </button> 1934 <div id="downloadDetailMenu" class="dock-download-menu" role="menu" hidden> 1935 <button type="button" role="menuitemradio" data-detail-download-mode="markdown" aria-checked="true"> 1936 <i data-lucide="file-down" aria-hidden="true"></i> 1937 <span>ä¸è½½æç¤ºè¯ Markdown</span> 1938 </button> 1939 <button type="button" role="menuitemradio" data-detail-download-mode="zip" aria-checked="false"> 1940 <i data-lucide="archive" aria-hidden="true"></i> 1941 <span>ä¸è½½æ ·å¼ ZIP</span> 1942 </button> 1943 </div> 1944 </div> 1945 </div> 1946 </aside> 1947 1948 <aside id="imageSkillLibraryPanel" class="detail-panel image-skill-library-panel ui-sheet panel-shell" hidden aria-label="管çä½å¾ Skills"></aside> 1949 1950 <aside id="manualSamplePanel" class="detail-panel manual-sample-panel ui-sheet panel-shell" hidden aria-label="æ·»å æ ·å¼ 颿¿" data-admin-only> 1951 <div class="dialog-head ui-dialog-head panel-shell-head"> 1952 <div> 1953 <p class="eyebrow">æ ·å¼ ç®¡ç</p> 1954 <h2 id="manualSamplePanelTitle">æ·»å æ ·å¼ </h2> 1955 </div> 1956 <button id="manualSampleBackButton" class="header-icon-button panel-shell-navigation right-panel-close-button" type="button" aria-label="å ³é"> 1957 <i data-lucide="x" aria-hidden="true"></i> 1958 </button> 1959 </div> 1960 <div id="manualSampleWorkbench" class="manual-sample-workbench manual-sample-panel-body panel-shell-body"> 1961 <div class="manual-sample-tabs" role="tablist" aria-label="æ·»å æ ·å¼ æ¹å¼"> 1962 <button id="manualSampleGenerateTab" type="button" role="tab" data-manual-sample-tab="generate" aria-selected="true" aria-controls="manualSampleGeneratePanel">AI çæ</button> 1963 <button id="manualSampleManualTab" type="button" role="tab" data-manual-sample-tab="manual" aria-selected="false" aria-controls="manualSampleManualPanel">ä¸ä¼ å¾ç</button> 1964 <button id="manualSampleJsonTab" type="button" role="tab" data-manual-sample-tab="json" aria-selected="false" aria-controls="manualSampleJsonPanel">å¯¼å ¥ JSON</button> 1965 </div> 1966 <div id="manualSampleManualPanel" class="manual-sample-source-panel" role="tabpanel" aria-labelledby="manualSampleManualTab" hidden> 1967 <label class="manual-sample-upload"> 1968 <i data-lucide="image-up" aria-hidden="true"></i> 1969 <span>éæ©å¤å¼ å¾ç</span> 1970 <input id="manualSampleFileInput" type="file" accept="image/png,image/jpeg,image/webp" multiple> 1971 </label> 1972 <p>éæ©å¤å¼ å¾çåï¼ä¸ºæ¯å¼ å¾çå¡«åå¯¹åºæç¤ºè¯ã</p> 1973 </div> 1974 <div id="manualSampleJsonPanel" class="manual-sample-source-panel" role="tabpanel" aria-labelledby="manualSampleJsonTab" hidden> 1975 <div class="manual-sample-json-head"> 1976 <div> 1977 <h3>JSON æ°æ®</h3> 1978 <p>ç²è´´å¾çå°ååæç¤ºè¯ï¼ä¸æ¬¡æ·»å å¤å¼ æ ·å¼ ã</p> 1979 </div> 1980 </div> 1981 <textarea id="manualSampleJson" rows="12" spellcheck="false" aria-label="å¯¼å ¥ JSON å 容" aria-describedby="manualSampleJsonHint manualSampleStatus" placeholder="å¨è¿éç²è´´ JSON"></textarea> 1982 <p id="manualSampleJsonHint" class="manual-sample-json-hint">æ¯å¼ å¾éæ sourceIdãpromptï¼ä»¥å imageUrl æ imageDataUrlã</p> 1983 <div class="manual-sample-json-actions"> 1984 <button id="copyManualSampleJsonTemplateButton" class="manual-sample-json-copy" type="button" aria-label="å¤å¶ JSON 示ä¾" title="å¤å¶ JSON 示ä¾"> 1985 <i data-lucide="copy" aria-hidden="true"></i>
1986 <span>å¤å¶ç¤ºä¾</span> 1987 </button> 1988 <button id="parseManualSampleJsonButton" class="manual-sample-parse" type="button">æ£æ¥å¹¶é¢è§</button> 1989 </div> 1990 </div> 1991 <div id="manualSampleGeneratePanel" class="manual-sample-source-panel manual-sample-generate-panel" role="tabpanel" aria-labelledby="manualSampleGenerateTab"> 1992 <div class="manual-sample-generate-intro"> 1993 <strong>åªåæ¯å¼ å¾è¦æ¹ä»ä¹</strong> 1994 <p>å½å飿 ¼çæç¤ºè¯ä¼èªå¨å¸¦ä¸ï¼ä¸ç¨éå¤ç²è´´ã</p> 1995 </div> 1996 <div class="manual-sample-current-prompt"> 1997 <span>èªå¨ä½¿ç¨</span> 1998 <strong id="manualSampleCurrentPromptLabel">å½å飿 ¼åå§æç¤ºè¯</strong> 1999 </div> 2000 <label class="manual-sample-generate-field"> 2001 <span>è¿æ¹å¾çåå«è¦æ¹ä»ä¹</span> 2002 <textarea id="manualSampleAdditionalRequirements" rows="10" aria-describedby="manualSampleGenerateHint manualSampleGenerateMeta manualSampleGenerateResultHint manualSampleStatus" placeholder="ä¾
2002å¦ï¼ç«çæå¾ï¼æè²çº¸å¼ è´¨æ --- ä¾å¦ï¼æ¨ªçæå¾ï¼é»çº¢é«å¯¹æ¯æ é¢"></textarea> 2003 </label> 2004 <div class="manual-sample-generate-summary"> 2005 <p id="manualSampleGenerateHint">æ¯ç»è¦æ±çæ 1 å¼ ï¼å¤å¼ ä¹é´ç¨åç¬ä¸è¡ç <code>---</code> åéï¼æå¤ 10 å¼ ã</p> 2006 <strong id="manualSampleGenerateMeta" role="status">å°æªå¡«å</strong> 2007 </div> 2008 <p id="manualSampleGenerateResultHint" class="manual-sample-generate-result-hint"><i data-lucide="images" aria-hidden="true"></i><span>çæåèªå¨åå°âå ¨é¨æ ·å¼ âï¼è¿åº¦å¡ä¼åä½åææ£å¼æ ·å¼ ã</span></p> 2009 </div> 2010 <p id="manualSampleStatus" class="manual-sample-status" role="status"></p> 2011 <div id="manualSamplePreviewHead" class="manual-sample-preview-head" hidden> 2012 <span>é¢è§</span> 2013 <strong id="manualSamplePreviewCount">0 å¼ </strong> 2014 </div> 2015 <div id="manualSamplePreviewList" class="manual-sample-preview-list" aria-live="polite"></div> 2016 </div> 2017 <div class="manual-sample-panel-dock panel-shell-dock app-bottom-dock app-bottom-panel-dock"> 2018 <button id="saveManualSamplesButton" class="manual-sample-save dock-button app-bottom-dock-button" type="button" disabled> 2019 <span>å å¡«åå¾çè¦æ±</span> 2020 </button> 2021 </div> 2022 </aside> 2023 2024 <aside id="adminControlPanel" class="detail-panel admin-control-panel ui-sheet panel-shell" hidden aria-label="管çååè½é¢æ¿"> 2025 <div class="dialog-head ui-dialog-head panel-shell-head"> 2026 <div> 2027 <p class="eyebrow">Admin</p> 2028 <h2>管çååè½</h2> 2029 </div> 2030 <button id="closeAdminControlPanel" class="icon-button panel-shell-navigation right-panel-close-button" type="button" aria-label="å ³é管çååè½"> 2031 <i data-lucide="x" aria-hidden="true"></i> 2032 </button> 2033 </div> 2034 <div class="admin-control-panel-body panel-shell-body settings-ui"> 2035 <section class="admin-control-section" aria-label="å ¨é¨ç®¡çååè½"> 2036 <div class="admin-workspace-toolbar"> 2037 <input id="adminControlFunctionSearch" class="settings-input" type="search" aria-label="æç´¢ç®¡çååè½" placeholder="æç´¢å ¨é¨ç®¡çåè½"> 2038 <button id="adminControlManageFunctions" class="settings-button" type="button">ç®¡çæ ç®</button> 2039 </div> 2040 <div id="adminControlFunctionList" class="admin-control-entry-list"> 2041 <button id="adminControlDashboardEntry" class="admin-control-entry" type="button"><i data-lucide="chart-no-axes-combined" aria-hidden="true"></i><span><strong>è¿è¥æ°æ®</strong><em>æ¥çç¨æ·å¢é¿ãæ¶å ¥ãAI 使ç¨ä¸å¾ å¤çäºé¡¹ã</em></span></button> 2042 <button id="adminControlUserDataEntry" class="admin-control-entry" type="button"><i data-lucide="users" aria-hidden="true"></i><span><strong>ç¨æ·æ°æ®</strong><em>æ¥çä¼åè´¦å·ä¸ä½¿ç¨æ°æ®ã</em></span></button> 2043 <button id="adminControlDailyReportsEntry" class="admin-control-entry" type="button"><i data-lucide="notebook-tabs" aria-hidden="true"></i><span><strong>è¿è¥æ¥æ¥</strong><em>é¢è§åæ¥ä¸ææ¥ï¼æ¥çåéåå²åæ¶ä»¶è®¾ç½®ã</em></span></button> 2044 <button id="adminControlActivationCodesEntry" class="admin-control-entry" type="button"><i data-lucide="ticket" aria-hidden="true"></i><span><strong>æ¿æ´»ç 管ç</strong><em>æ¹éçææ¿æ´»ç ï¼æ¥çåºåä¸å æ¢è®°å½ã</em></span></button> 2045 <button id="adminControlObsidianSettingsEntry" class="admin-control-entry" type="button"><i data-lucide="gem" aria-hidden="true"></i><span><strong>积å设置</strong><em>设置ä¼åä»·ãéä¼åä»·ï¼ç®¡ç积åå æ¢ç ã</em></span></button> 2046 <button id="adminControlImageSkillsEntry" class="admin-control-entry" type="button"><i data-lucide="blocks" aria-hidden="true"></i><span><strong>ä½å¾ Skills</strong><em>æ°å»ºãæµè¯å¹¶åå¸ä¼åå¯ç¨çä½å¾å·¥ä½æµã</em></span></button> 2047 <button id="adminControlStyleStatisticsEntry" class="admin-control-entry" type="button"><i data-lucide="chart-column" aria-hidden="true"></i><span><strong>飿 ¼ç»è®¡</strong><em>æ¥ç飿 ¼åºåãåç±»åä½¿ç¨æ åµã</em></span></button> 2048 <button id="adminControlMediaLibraryEntry" class="admin-control-entry" type="button"><i data-lucide="images" aria-hidden="true"></i><span><strong>ç´ æåº</strong><em>æåç±»æ´çåå¤ç¨å¸¸ç¨å¾çã</em></span></button> 2049 <button id="adminControlStyleUploadEntry" class="admin-control-entry" type="button"><i data-lucide="upload-cloud" aria-hidden="true"></i><span><strong>å¯¼å ¥é£æ ¼</strong><em>è¿å ¥ç¬ç«ä¸ä¼ 页é¢ï¼æ´çæä»¶å¤¹ãæ£æ¥å类并ä¸ä¼ åæ¡£ã</em></span></button> 2050 <button id="adminControlClassificationEntry" class="admin-control-entry" type="button"><i data-lucide="sparkles" aria-hidden="true"></i><span><strong>æºè½æ´ç</strong><em>æ´çå 容åç±»ï¼æ¥çå类任å¡åå¤çè¿åº¦ã</em></span></button> 2051 <button id="adminControlBackfillEntry" class="admin-control-entry" type="button"><i data-lucide="wand-sparkles" aria-hidden="true"></i><span><strong>æ ·å¼ ä»»å¡</strong><em>è¡¥å¾ä¸æ¿æ¢çè¿åº¦ãéè¦å¤ççæ°å¾åå¾ è¡¥å¾ç飿 ¼ã</em></span></button> 2052 <button id="adminControlHiddenStylesEntry" class="admin-control-entry" type="button"><i data-lucide="eye-off" aria-hidden="true"></i><span><strong>䏿¶é£æ ¼</strong><em>æ¥ç已䏿¶å 容ï¼å¿ è¦æ¶æ¢å¤å±ç¤ºã</em></span></button> 2053 <button id="adminControlStyleStudiosEntry" class="admin-control-entry" type="button"><i data-lucide="panels-top-left" aria-hidden="true"></i><span><strong>飿 ¼ä¸é¢</strong><em>é ç½®ä¸é¢å¯è§èå´ãå忬¾å·¥ä½æµãæ¡ä¾å®¡æ ¸å次æ°å¸ã</em></span></button> 2054 <button id="adminControlOpenSourceContentEntry" class="admin-control-entry" type="button"><i data-lucide="sprout" aria-hidden="true"></i><span><strong>弿ºå 容</strong><em>è¿å ¥å¼æºé¡µï¼æ£æ¥å ¬å¼å¾çä¸é¢éå±ç¤ºã</em></span></button> 2055 <button id="adminControlOpenSourceChannelsEntry" class="admin-control-entry" type="button"><i data-lucide="tags" aria-hidden="true"></i><span><strong>弿ºç´ æé¢é</strong><em>管çç´ æé¢éï¼å¼æºæ ·å¾è·éä¼ååºå ±äº«æ ç¾ã</em></span></button> 2056 <button id="adminControlArticleEntry" class="admin-control-entry" type="button"><i data-lucide="file-plus-2" aria-hidden="true"></i><span><strong>åæç« </strong><em>æå¼æç« ç¼è¾å¨ï¼åå¸å·¥å ·ç®±å 容ã</em></span></button> 2057 <button id="adminControlNotificationEntry" class="admin-control-entry" type="button"><i data-lucide="bell-plus" aria-hidden="true"></i><span><strong>éç¥ä¸å¿</strong><em>å叿ç¼è¾ä¼åéç¥ã</em></span></button> 2058 <button id="adminControlNewsletterEntry" class="admin-control-entry" type="button"><i data-lucide="send" aria-hidden="true"></i><span><strong>Newsletter</strong><em>è¿å ¥ç¾¤åå·¥ä½å°ï¼éæ©é£æ ¼åæ¶ä»¶äººã</em></span></button> 2059 <button id="adminControlTipsEntry" class="admin-control-entry" type="button"><i data-lucide="lightbulb" aria-hidden="true"></i><span><strong>å° Tips ä¸å¿</strong><em>
2059ç¨ç叿µç®¡çä½¿ç¨æå·§ï¼å¹¶è®¾ç½®é´æè§¦è¾¾èå¥ã</em></span></button> 2060 <button id="adminControlMiniprogramDeliveriesEntry" class="admin-control-entry" type="button"><i data-lucide="smartphone" aria-hidden="true"></i><span><strong>å°ç¨åºæé</strong><em>æ¥çæ¨è¿åªäºé£æ ¼ãæåä¸å¦ï¼æéæ¥å¿ï¼é宿¶ç¶æï¼ã</em></span></button> 2061 <button id="adminControlPaymentSuccessEmailEntry" class="admin-control-entry" type="button"><i data-lucide="mail-check" aria-hidden="true"></i><span><strong>è´ä¹°æåæé</strong><em>æ¥çéç¥ç®¡çåå¹¶åéæµè¯é®ä»¶ã</em></span></button> 2062 <button id="adminControlImageApiEntry" class="admin-control-entry" type="button"><i data-lucide="plug-zap" aria-hidden="true"></i><span><strong>æç API</strong><em>管çä» èªå·±ä½¿ç¨çå¾çä¸ææ¬æ¥å£ã</em></span></button> 2063 <button id="adminControlObsidianEntry" class="admin-control-entry" type="button"><i data-lucide="gem" aria-hidden="true"></i><span><strong>å¹³å° API</strong><em>管çå ¨ç«è¿æ¥ä¸ç§¯åæå¡è§åã</em></span></button> 2064 <button id="adminControlTopicNavigationEntry" class="admin-control-entry" type="button"><i data-lucide="list-filter" aria-hidden="true"></i><span><strong>ç®¡çæ ç®</strong><em>è°æ´å½å管çåè´¦å·çå°çæ ç®å顺åºã</em></span></button> 2065 <button id="adminControlTopicDefaultsEntry" class="admin-control-entry" type="button"><i data-lucide="list-tree" aria-hidden="true"></i><span><strong>设置é»è®¤å¯¼èª</strong><em>è®¾ç½®å°æªå建个人导èªç¨æ·çå°çåç±»å顺åºã</em></span></button> 2066 <button id="adminControlAdministratorsEntry" class="admin-control-entry" type="button"><i data-lucide="shield-check" aria-hidden="true"></i><span><strong>管ç忥æ¥è®¾ç½®</strong><em>æ¥ç管çå并设置æ¯ä½ç®¡çåçæ¥æ¥æ¥æ¶å¼å ³ã</em></span></button> 2067 <button id="adminControlSoftwareEntry" class="admin-control-entry" type="button"><i data-lucide="package-check" aria-hidden="true"></i><span><strong>ä¼å软件</strong><em>æ¥çå¹¶è°æ´ä¼å软件çååç¶æã</em></span></button> 2068 </div> 2069 <p id="adminControlFunctionEmpty" class="style-upload-task-note" role="status" hidden>没æå¹é ç管çåè½</p> 2070 </section> 2071 <section class="admin-control-summary" aria-label="管çç¶æ"> 2072 <span> 2073 <strong id="adminControlBackfillCount">0</strong> 2074 <em>å¾ è¡¥å¾</em> 2075 </span> 2076 <span> 2077 <strong id="adminControlHiddenStylesCount">0</strong> 2078 <em>䏿¶</em> 2079 </span> 2080 </section> 2081 <section class="admin-control-section admin-control-administrators" aria-labelledby="adminControlAdministratorsTitle"> 2082 <div class="admin-control-section-head admin-control-administrators-head"> 2083 <div> 2084 <p class="eyebrow">Administrators</p> 2085 <h3 id="adminControlAdministratorsTitle" tabindex="-1">管çå</h3> 2086 </div> 2087 <span id="adminControlAdministratorCount" aria-live="polite">--</span> 2088 </div> 2089 <div id="adminControlAdministratorList" class="admin-control-administrator-list" aria-live="polite"> 2090 <div class="admin-control-administrator-state" data-tone="loading"> 2091 <i data-lucide="loader-circle" aria-hidden="true"></i> 2092 <span>æ£å¨è¯»å管çå...</span> 2093 </div> 2094 </div> 2095 <p id="adminControlAdministratorStatus" class="admin-control-administrator-status" role="status" aria-live="polite"></p> 2096 </section> 2097 <section class="admin-control-section admin-control-software" aria-labelledby="adminControlSoftwareTitle"> 2098 <div class="admin-control-section-head admin-control-software-head"> 2099 <div> 2100 <p class="eyebrow">Software</p> 2101 <h3 id="adminControlSoftwareTitle" tabindex="-1">ä¼å软件</h3> 2102 </div> 2103 <span id="adminControlSoftwareCount" aria-live="polite">--</span> 2104 </div> 2105 <div id="adminControlSoftwareList" class="admin-control-software-list" aria-live="polite"> 2106 <div class="admin-control-administrator-state" data-tone="loading"> 2107 <i data-lucide="loader-circle" aria-hidden="true"></i>
2108 <span>æ£å¨è¯»åååç¶æ...</span> 2109 </div> 2110 </div> 2111 <p id="adminControlSoftwareStatus" class="admin-control-administrator-status" role="status" aria-live="polite"></p> 2112 </section> 2113 </div> 2114 </aside> 2115 2116 <aside id="openSourceChannelSettingsPanel" class="detail-panel open-source-channel-settings-panel ui-sheet panel-shell" hidden aria-labelledby="openSourceChannelSettingsTitle" data-admin-only> 2117 <div class="dialog-head ui-dialog-head panel-shell-head"> 2118 <div> 2119 <p class="eyebrow">Open source · Channels</p> 2120 <h2 id="openSourceChannelSettingsTitle">弿ºç´ æé¢é设置</h2> 2121 </div> 2122 <button id="closeOpenSourceChannelSettingsPanel" class="icon-button panel-shell-navigation right-panel-close-button" type="button" aria-label="å ³é弿ºé¢é设置"> 2123 <i data-lucide="x" aria-hidden="true"></i> 2124 </button> 2125 </div> 2126 <div id="openSourceChannelSettingsBody" class="open-source-channel-settings-body panel-shell-body"> 2127 <p class="open-source-channel-settings-loading">æ£å¨å è½½é¢é设置â¦</p> 2128 </div> 2129 <div class="open-source-channel-settings-dock panel-shell-dock app-bottom-dock app-bottom-panel-dock" hidden> 2130 <p id="openSourceChannelSettingsHint" class="open-source-channel-settings-hint" role="status" aria-live="polite"></p> 2131 <button id="discardOpenSourceChannelSettingsButton" class="app-bottom-dock-button-secondary" type="button" disabled>æ¤éç¼è¾</button> 2132 <button id="saveOpenSourceChannelSettingsButton" class="open-source-channel-settings-save dock-button app-bottom-dock-button" type="button" disabled>ä¿åç¼è¾</button> 2133 </div> 2134 </aside> 2135 2136 <aside id="imageSkillsAdminPanel" class="detail-panel image-skills-admin-panel ui-sheet panel-shell" hidden aria-labelledby="imageSkillsAdminTitle"> 2137 <div class="dialog-head ui-dialog-head panel-shell-head"> 2138 <div> 2139 <p class="eyebrow">Image skills</p> 2140 <h2 id="imageSkillsAdminTitle">Skills</h2> 2141 </div> 2142 <button id="closeImageSkillsAdminPanel" class="icon-button panel-shell-navigation right-panel-close-button" type="button" aria-label="å ³éä½å¾ Skills"> 2143 <i data-lucide="x" aria-hidden="true"></i> 2144 </button> 2145 </div> 2146 <div id="imageSkillsAdminBody" class="image-skills-admin-body panel-shell-body"> 2147 <section id="imageSkillsAdminEditor" class="image-skills-admin-editor" aria-label="ç¼è¾ä½å¾ Skill" hidden> 2148 <div class="skill-editor-tabs" role="tablist" aria-label="Skill ç¼è¾æ¥éª¤"> 2149 <button type="button" role="tab" id="skillEditorBasicsTab" aria-controls="skillEditorBasics" data-editor-tab="basics">åºç¡ä¿¡æ¯</button> 2150 <button type="button" role="tab" id="skillEditorConfigTab" aria-controls="skillEditorConfig" data-editor-tab="config">é ç½®</button> 2151 <button type="button" role="tab" id="skillEditorPreviewTab" aria-controls="skillEditorPreview" data-editor-tab="preview">é¢è§ä¸åå¸</button> 2152 </div> 2153 <form id="imageSkillsAdminForm" class="image-skills-admin-form" novalidate> 2154 <div id="skillEditorBasics" role="tabpanel" aria-labelledby="skillEditorBasicsTab" data-editor-tabpanel="basics"> 2155 <section class="image-skills-admin-section" aria-labelledby="imageSkillsBasicsTitle"> 2156 <div class="image-skills-admin-section-head"> 2157 <p class="eyebrow">Basics</p> 2158 <h3 id="imageSkillsBasicsTitle">åºç¡ä¿¡æ¯</h3> 2159 </div> 2160 <div class="image-skills-admin-basics-grid"> 2161 <label class="image-skills-admin-field"><span>åç§° *</span><input id="imageSkillNameInput" name="name" type="text" autocomplete="off" maxlength="80" required></label> 2162 <label class="image-skills-admin-field image-skills-admin-field-wide" hidden><span>åè½ç«ç½å</span><input id="siteSkillUrlInput" name="siteUrl" type="url" maxlength="2000" placeholder="https://" autocomplete="off"><small>æªä¸çº¿å¯ç空ä¿åè稿ï¼åå¸å填忣å¼ç½åã</small></label> 2163 <label class="image-skills-admin-field image-skills-admin-field-wide"><span>ç®ä»</span><textarea id="imageSkillSummaryInput" name="summary" rows="3" maxlength="240" placeholder="åè¯ä¼åè¿ä¸ª Skill éå宿ä»ä¹"></textarea></label> 2164 <div class="image-skills-admin-field image-skills-admin-field-wide"><span>Skill å°é¢</span> 2165 <img id="imageSkillCoverPreview" class="image-skills-admin-cover-preview" alt="Skill å°é¢é¢è§" hidden> 2166 <div class="image-skills-admin-cover-row"><button id="imageSkillChooseCoverButton" class="image-skills-admin-secondary-button" type="button"><i data-lucide="image-plus" aria-hidden="true"></i><span>
2166éæ©æä¸ä¼ å°é¢</span></button><button id="imageSkillRemoveCoverButton" class="image-skills-admin-secondary-button" type="button" hidden>ç§»é¤å°é¢</button><input id="imageSkillCoverUrlInput" name="coverUrl" type="url" placeholder="éæ©åèªå¨å¡«å å°é¢å°å" readonly></div> 2167 <div class="image-skills-admin-cover-meta"><input id="imageSkillCoverWidthInput" name="coverWidth" type="number" min="1" placeholder="宽度" aria-label="å°é¢å®½åº¦" readonly><span>Ã</span><input id="imageSkillCoverHeightInput" name="coverHeight" type="number" min="1" placeholder="é«åº¦" aria-label="å°é¢é«åº¦" readonly><small>éæ©ä¸å¼ 代表ä½åï¼æå徿¯ä¾å±ç¤º</small></div> 2168 </div> 2169 <div class="image-skills-admin-field-wide"><div id="skillGalleryManager"></div><details class="image-skills-admin-advanced"><summary>é«çº§ï¼å¾çå°å</summary><label class="image-skills-admin-field image-skills-admin-field-wide"><span>ä½åé¢è§å¾ç</span><textarea id="imageSkillGalleryInput" name="gallery" rows="4" placeholder="æ¯è¡ä¸ä¸ª HTTPS å¾çå°åï¼æå¤ 8 å¼ ï¼å°é¢ä¼èªå¨ä½ä¸ºç¬¬ä¸å¼ "></textarea></label></details></div> 2170 <details class="image-skills-admin-advanced image-skills-admin-field-wide"><summary>é«çº§è®¾ç½®ï¼URL æ è¯ã徿 åç»æç±»å</summary> <label class="image-skills-admin-field"><span>URL æ è¯ *</span><input id="imageSkillSlugInput" name="slug" type="text" autocomplete="off" inputmode="url" pattern="[a-z0-9]+(?:-[a-z0-9]+)*" placeholder="ä¾
2170å¦ xiaohongshu-card" required></label> 2171 <label class="image-skills-admin-field"><span>Lucide 徿 </span><input id="imageSkillIconInput" name="icon" type="text" autocomplete="off" placeholder="ä¾å¦ notebook-tabs"></label> 2172 <label class="image-skills-admin-field"><span>ç»æç±»å</span><select id="imageSkillResultKindSelect" name="resultKind"><option value="image-set">å¾çç»</option><option value="card-set">å¡çç»</option><option value="slide-deck">PPT 页ç»</option><option value="comic-strip">漫ç»ç»</option></select></label> 2173</details> 2174 </div> 2175 </section> 2176 2177 </div><div id="skillEditorConfig" role="tabpanel" aria-labelledby="skillEditorConfigTab" data-editor-tabpanel="config" hidden> 2178 <section class="image-skills-admin-section" aria-labelledby="imageSkillsFieldsTitle"> 2179 <div class="image-skills-admin-section-head image-skills-admin-section-head-action"> 2180 <div><p class="eyebrow">Inputs</p><h3 id="imageSkillsFieldsTitle">ç¨æ·è¾å ¥</h3></div> 2181 <button id="addImageSkillFieldButton" class="image-skills-admin-secondary-button" type="button" data-image-skills-action="add-field"><i data-lucide="plus" aria-hidden="true"></i><span>æ·»å åæ®µ</span></button> 2182 </div> 2183 <p class="image-skills-admin-help">åæ®µä¼æé¡ºåºçæä¼å表åï¼é项æ¯è¡å¡«åâå¼ | æ¾ç¤ºåç§°âã</p> 2184 <div id="imageSkillFieldsList" class="image-skills-admin-builder-list"></div> 2185 </section> 2186 2187 <section class="image-skills-admin-section" aria-labelledby="imageSkillsWorkflowTitle"> 2188 <div class="image-skills-admin-section-head"><p class="eyebrow">Workflow</p><h3 id="imageSkillsWorkflowTitle">工使µ</h3></div> 2189 <label class="image-skills-admin-field"><span>æ§è¡æä»¤ *</span><textarea id="imageSkillInstructionsInput" name="instructions" rows="8" required placeholder="æè¿° Skill å¦ä½çè§£è¾å ¥ãç»ç»ç»é¢å¹¶çæç»æ"></textarea></label> 2190 <label class="image-skills-admin-field" hidden><span>æåå¡ç示ä¾</span><textarea id="textSkillExampleInput" rows="6" maxlength="4000" placeholder="å¡«åè¿ä¸ª Skill çä»£è¡¨æ§æåä½åï¼ç¨äºå¡çé¢è§"></textarea></label> 2191 <label class="image-skills-admin-field"><span>è®°å½æ 颿¨¡æ¿</span><input id="imageSkillTitleTemplateInput" name="titleTemplate" type="text" autocomplete="off" placeholder="ä¾
2191å¦ {{topic}} · å°çº¢ä¹¦å¡ç"></label> 2192 <div class="image-skills-admin-template-tools"> 2193 <p class="image-skills-admin-help">å èç¦æä»¤ãæ é¢æä»»å¡æç¤ºè¯ï¼åç¹å»åéæå ¥ãå¯éå å®¹ä½¿ç¨ <code>{{#field}}â¦{{/field}}</code>ï¼é¿æ é¢å¯ç¨ <code>{{field|truncate:16}}</code>ã</p> 2194 <div id="imageSkillTemplateVariables" class="image-skills-admin-variable-list" aria-label="å¯æå ¥çæ¨¡æ¿åé"></div> 2195 <p id="imageSkillPlanLimitSummary" class="image-skills-admin-plan-limit" role="status" aria-live="polite"></p> 2196 </div> 2197 <div class="image-skills-admin-section-head image-skills-admin-section-head-action image-skills-admin-jobs-head"> 2198 <div><p class="eyebrow">Jobs</p><h3>åºå¾ä»»å¡</h3></div> 2199 <button id="addImageSkillJobButton" class="image-skills-admin-secondary-button" type="button" data-image-skills-action="add-job"><i data-lucide="plus" aria-hidden="true"></i><span>æ·»å ä»»å¡</span></button> 2200 </div> 2201 <div id="imageSkillJobsList" class="image-skills-admin-builder-list"></div> 2202 <p class="image-skills-admin-tool-note"><i data-lucide="shield-check" aria-hidden="true"></i><span>å½åä» å 许è°ç¨ <code>image.generate</code>ã</span></p> 2203 </section> 2204 2205 </div><div id="skillEditorPreview" role="tabpanel" aria-labelledby="skillEditorPreviewTab" data-editor-tabpanel="preview" hidden> 2206 <section class="image-skills-admin-section" aria-labelledby="imageSkillsTestTitle"> 2207 <div class="image-skills-admin-section-head"><p class="eyebrow">Validate</p><h3 id="imageSkillsTestTitle">æ ¡éªé¢è§</h3></div> 2208 <p class="image-skills-admin-help">å¡«å䏿¹é¢è§è¡¨ååæ ¡éªï¼åªæ£æ¥é ç½®åä»»å¡åæ°ï¼ä¸ä¼è°ç¨æ¨¡åãæ£è´¹æä¿åè稿ã</p> 2209 <details class="image-skills-admin-advanced"><summary>é«çº§è°è¯ï¼JSON è¾å ¥ï¼å¯éï¼</summary><label class="image-skills-admin-field"><span>示ä¾è¾å ¥ JSON</span><textarea id="imageSkillSampleInput" name="sampleInput" rows="6" spellcheck="false" placeholder='ä¾å¦ {"topic":"夿¥æ è¡"}'></textarea><button id="imageSkillFillSampleButton" class="image-skills-admin-secondary-button" type="button">èªå¨çæ JSON 示ä¾</button></label></details> 2210 <div id="skillValidationErrors" role="status"></div><details class="image-skills-admin-advanced"><summary>æ ¡éªè¯¦æ JSON</summary><pre id="imageSkillValidationPreview" class="image-skills-admin-preview" tabindex="0" hidden></pre></details> 2211 </section> 2212 <section class="image-skills-admin-section" aria-labelledby="imageSkillsMemberPreviewTitle"> 2213 <div class="image-skills-admin-section-head"><p class="eyebrow">Member view</p><h3 id="imageSkillsMemberPreviewTitle">ä¼å端é¢è§</h3></div> 2214 <div id="imageSkillMemberPreview" class="image-skills-admin-member-preview" aria-live="polite"></div> 2215 <button id="imageSkillUsePreviewButton" class="image-skills-admin-secondary-button" type="button">使ç¨è¡¨åä½ä¸ºæµè¯è¾å ¥</button> 2216 </section> 2217 2218 <section id="imageSkillLifecycleSection" class="image-skills-admin-section image-skills-admin-lifecycle" aria-labelledby="imageSkillLifecycleTitle" hidden> 2219 <div class="image-skills-admin-section-head"><p class="eyebrow">Versions</p><h3 id="imageSkillLifecycleTitle">çæ¬ä¸å½æ¡£</h3></div> 2220 <div class="image-skills-admin-lifecycle-controls"> 2221 <label class="image-skills-admin-field"><span>åéå°å·²åå¸çæ¬</span><select id="imageSkillRollbackVersionSelect" aria-describedby="imageSkillLifecycleStatus"><option value="">ææ å¯åéçæ¬</option></select></label> 2222 <button id="rollbackImageSkillButton" class="image-skills-admin-secondary-button" type="button" disabled><i data-lucide="history" aria-hidden="true"></i><span>åæ¢çæ¬</span></button> 2223 </div> 2224 <p id="imageSkillLifecycleStatus" class="image-skills-admin-help"></p> 2225 <button id="skillEditorLiveButton" class="image-skills-admin-secondary-button" type="button" hidden>䏿¶</button> 2226 <button id="archiveImageSkillButton" class="image-skills-admin-secondary-button image-skills-admin-danger-button" type="button"><i data-lucide="archive" aria-hidden="true"></i><span>彿¡£ Skill</span></button> 2227 </section> 2228 </div> 2229 <p id="imageSkillsAdminEditorStatus" class="image-skills-admin-status" role="status" aria-l
2229ive="polite"></p> 2230 </form> 2231 </section> 2232 </div> 2233 <div id="imageSkillsAdminEditorDock" class="image-skills-admin-dock image-skills-admin-editor-dock panel-shell-dock app-bottom-dock app-bottom-panel-dock" hidden> 2234 <button id="validateImageSkillButton" class="app-bottom-dock-button-secondary" type="button" data-image-skills-action="validate"><i data-lucide="flask-conical" aria-hidden="true"></i><span>æ ¡éªé¢è§</span></button> 2235 <button id="saveImageSkillDraftButton" class="app-bottom-dock-button-secondary" type="button" data-image-skills-action="save"><i data-lucide="save" aria-hidden="true"></i><span>ä¿åè稿</span></button> 2236 <button id="publishImageSkillButton" class="dock-button app-bottom-dock-button" type="button" data-image-skills-action="publish"><i data-lucide="send" aria-hidden="true"></i><span>åå¸</span></button> 2237 </div> 2238 </aside> 2239 2240 2241 <aside id="imageApiPanel" class="detail-panel image-api-panel ui-sheet panel-shell" hidden aria-label="ä½å¾ API é ç½®é¢æ¿"> 2242 <div class="dialog-head ui-dialog-head panel-shell-head"> 2243 <div> 2244 <p id="imageApiMeta" class="eyebrow">API</p> 2245 <h2 id="imageApiTitle">API 管ç</h2> 2246 </div> 2247 <button id="closeImageApiPanel" class="icon-button panel-shell-navigation right-panel-close-button" type="button" aria-label="å ³é"> 2248 <i data-lucide="x" aria-hidden="true"></i> 2249 </button> 2250 </div> 2251 <div class="image-api-manager panel-shell-body"> 2252 <section class="image-api-library" aria-labelledby="imageApiLibraryTitle"> 2253 <div class="image-api-section-head"> 2254 <p id="imageApiLibraryTitle" class="image-api-library-count"><span id="imageApiCount">0 个æ¥å£</span></p> 2255 <div class="image-api-library-actions"> 2256 <button id="addImageApiButton" class="image-api-add-button" type="button" aria-label="æ°å¢æ¥å£"> 2257 <i data-lucide="plus" aria-hidden="true"></i> 2258 <span>æ°å¢æ¥å£</span> 2259 </button> 2260 <button id="imageApiLibraryMore" class="image-api-tool-button" type="button" aria-label="æ´å¤æä½" title="æ´å¤æä½"> 2261 <i data-lucide="ellipsis" aria-hidden="true"></i> 2262 </button> 2263 <div id="imageApiLibraryMenu" class="image-api-menu" hidden> 2264 <button id="importImageApiButton" class="image-api-card-action" type="button" aria-label="å¯¼å ¥ API é ç½®"> 2265 <i data-lucide="file-up" aria-hidden="true"></i><span>å¯¼å ¥é ç½®</span> 2266 </button> 2267 <button id="exportImageApiButton" class="image-api-card-action" type="button" aria-label="å¯¼åº API é ç½®"> 2268 <i data-lucide="file-down" aria-hidden="true"></i><span>导åºå¤ä»½</span> 2269 </button> 2270 </div> 2271 <input id="imageApiImportInput" type="file" accept="application/json,.json" hidden> 2272 </div> 2273 </div> 2274 <p id="imageApiManagerStatus" class="form-status image-api-manager-status" role="status" aria-live="polite"></p> 2275 <div id="imageApiGrid" class="image-api-grid" aria-label="å·²ä¿åçä½å¾ API"></div> 2276 </section> 2277 </div> 2278 </aside> 2279 2280 <form id="imageApiForm" class="detail-panel image-api-editor-dialog image-api-form ui-sheet panel-shell settings-ui" role="dialog" aria-modal="true" aria-labelledby="imageApiEditorTitle" autocomplete="off" data-lpignore="true" data-1p-ignore="true" data-bwignore="true" data-form-type="other" hidden> 2281 <div class="dialog-head ui-dialog-head image-api-editor-head panel-shell-head"> 2282 <div> 2283 <p id="imageApiEditorMeta" class="eyebrow" hidden></p> 2284 <h2 id="imageApiEditorTitle">ç¼è¾æ¥å£</h2> 2285 </div> 2286 <button id="closeImageApiEditorDialog" class="header-icon-button panel-shell-navigation right-panel-close-button" type="button" aria-label="å ³éæ¥å£ç¼è¾" title="å ³é"> 2287 <i data-lucide="x" aria-hidden="true"></i> 2288 </button> 2289 </div> 2290 <div class="image-api-editor-body panel-shell-body"> 2291 <div class="image-api-fields"> 2292 <fieldset id="imageApiScopeField" class="image-api-scope-field" hidden> 2293 <legend>éç¨èå´</legend> 2294 <div class="image-api-scope-options"> 2295 <label><input id="imageApiPersonalScope" type="checkbox" checked disabled><span>个人</span></label> 2296 <label><input id="imageApiPlatformScope" type="checkbox"><span>å¹³å°</span></label> 2297 </div> 2298 <small>å¯åæ¶ç¨äºä¸ªäººè°ç¨åå¹³å°ç§¯åæå¡ã</small> 2299 </fieldset> 2300 <label>
2301 <span>æå¡å</span> 2302 <select id="imageApiProviderKind" autocomplete="off"> 2303 <option value="openai">OpenAI</option> 2304 <option value="google_gemini">Google Gemini</option> 2305 <option value="xai_grok">xAI / Grok</option> 2306 <option value="openai_compatible">OpenAI å ¼å®¹æ¥å£</option> 2307 </select> 2308 </label> 2309 <label> 2310 <span>æ¥å£åç§°</span> 2311 <input id="imageApiName" type="text" autocomplete="off" placeholder="ä¾å¦ï¼OpenAI 宿¹"> 2312 </label> 2313 <label id="imageApiEndpointField"> 2314 <span>æ¥å£å°å</span> 2315 <input id="imageApiEndpoint" type="url" autocomplete="off" inputmode="url" placeholder="https://api.openai.com/v1 æ http://host:port/v1"> 2316 <small id="imageApiProviderHint" class="image-api-field-hint"></small> 2317 </label> 2318 <label> 2319 <span>API Key</span> 2320 <span class="image-api-secret-control"> 2321 <input id="imageApiKey" class="image-api-secret-input" type="password" autocomplete="off" autocapitalize="off" spellcheck="false" data-lpignore="true" data-1p-ignore="true" data-bwignore="true" data-form-type="other" placeholder="è¾å ¥ API Key"> 2322 <span class="image-api-secret-actions"> 2323 <button id="copyImageApiKeyButton" class="image-api-secret-toggle" type="button" aria-label="å¤å¶ API Key" title="å¤å¶ API Key"> 2324 <i data-lucide="copy" aria-hidden="true"></i> 2325 </button> 2326 <button id="toggleImageApiKeyVisibility" class="image-api-secret-toggle" type="button" aria-label="æ¾ç¤º API Key" aria-pressed="false"> 2327 <i data-lucide="eye" aria-hidden="true"></i> 2328 </button> 2329 </span> 2330 </span> 2331 </label> 2332 <label> 2333 <span>å¾ç模åï¼å¯éï¼</span> 2334 <select id="imageApiModelPreset" autocomplete="off" aria-label="éæ©å¾ç模å"></select> 2335 <input id="imageApiModel" type="text" autocomplete="off" maxlength="160" placeholder="è¾å ¥èªå®ä¹å¾ç模å ID" hidden> 2336 <small class="image-api-field-hint">éæ©å½åæå¡åçé¢è®¾ï¼åè¡¨ä¸æ²¡ææ¶å¯éæ©âèªå®ä¹æ¨¡åâ¦âã</small> 2337 </label> 2338 <label> 2339 <span>ææ¬æ¨¡åï¼å¯éï¼</span> 2340 <select id="imageApiTextModelPreset" autocomplete="off" aria-label="éæ©ææ¬æ¨¡å"></select> 2341 <input id="imageApiTextModel" type="text" autocomplete="off" maxlength="160" placeholder="è¾å ¥èªå®ä¹ææ¬æ¨¡å ID" hidden> 2342 <small class="image-api-field-hint">éæ©å½åæå¡åçé¢è®¾ï¼åè¡¨ä¸æ²¡ææ¶å¯éæ©âèªå®ä¹æ¨¡åâ¦âã</small> 2343 </label> 2344 <p class="image-api-note">å¾ç模ååææ¬æ¨¡åè³å°å¡«åä¸ä¸ªã</p> 2345 <div class="image-api-inline-actions"> 2346 <button id="testImageApiButton" class="ghost-button image-api-inline-test" type="button" hidden> 2347 <i data-lucide="plug-zap" aria-hidden="true"></i> 2348 <span>æµè¯è¿æ¥ï¼å¯éï¼</span> 2349 </button> 2350 </div> 2351 </div> 2352 <p class="image-api-note">ä¸åæå¡åä¼ä½¿ç¨åèªçé´æãè¯·æ±æ ¼å¼å模åç®å½ãKey å å¯ä¿åï¼æ¯æ HTTP å HTTPSï¼HTTP 伿æä¼ è¾ Keyã</p> 2353 </div> 2354 <div class="image-api-editor-dock panel-shell-dock app-bottom-dock app-bottom-panel-dock"> 2355 <p id="imageApiStatus" class="form-status" role="status" aria-live="polite"></p> 2356 <div class="image-api-actions"> 2357 <button id="saveImageApiButton" class="dock-button app-bottom-dock-button" type="submit"> 2358 <i data-lucide="save" aria-hidden="true"></i> 2359 <span>ä¿åé ç½®</span> 2360 </button> 2361 </div> 2362 </div> 2363 </form> 2364 2365 <dialog id="imageApiTransferDialog" class="member-dialog ui-dialog image-api-transfer-dialog" aria-labelledby="imageApiTransferTitle"> 2366 <form method="dialog" class="member-dialog-card ui-dialog-card image-api-transfer-card"> 2367 <div class="member-dialog-head ui-dialog-head"> 2368 <div> 2369 <p class="image-api-section-kicker">API è¿ç§»</p> 2370 <h3 id="imageApiTransferTitle">å¯¼å ¥ API é ç½®</h3> 2371 </div> 2372 <button id="closeImageApiTransferDialog" class="icon-button" type="button" aria-label="å ³é"> 2373 <i data-lucide="x" aria-hidden="true"></i> 2374 </button> 2375 </div> 2376 <p id="imageApiTransferMessage" class="image-api-transfer-message"></p> 2377 <div id="imageApiTransferWarning" class="image-api-transfer-warning" role="note" hidden> 2378 <i data-lucide="triangle-alert" aria-hidden="true"></i>
2379 <span>å¯¼åºæä»¶å å«å®æ´ API Keyãè¯·åæ¾å¨å®å ¨ä½ç½®ï¼ä¸è¦ä¸ä¼ å°å ¬å¼ç½çæä»£ç ä»åºã</span> 2380 </div> 2381 <div id="imageApiImportPreview" class="image-api-import-preview" hidden> 2382 <div class="image-api-import-preview-head"> 2383 <span>å¾ å¯¼å ¥æ¥å£</span> 2384 <small id="imageApiImportSummary"></small> 2385 </div> 2386 <div id="imageApiImportList" class="image-api-import-list"></div> 2387 <label class="image-api-import-policy"> 2388 <input id="imageApiImportPolicy" type="checkbox" checked> 2389 <span>åæ¶æ¢å¤ä¸»æ¥å£åè½®æ¢æ¹å¼</span> 2390 </label> 2391 </div> 2392 <p id="imageApiTransferStatus" class="form-status" role="status"></p> 2393 <div class="member-actions ui-dialog-actions image-api-transfer-actions"> 2394 <button id="cancelImageApiTransferButton" class="ghost-button ui-dialog-cancel" type="button">åæ¶</button> 2395 <button id="confirmImageApiTransferButton" type="button"> 2396 <i data-lucide="download" aria-hidden="true"></i> 2397 <span>确认导åº</span> 2398 </button> 2399 </div> 2400 </form> 2401 </dialog> 2402 2403 <div id="imageLightbox" class="lightbox ui-lightbox" hidden aria-modal="true" role="dialog" aria-label="大å¾é¢è§"> 2404 <button id="lightboxClose" class="lightbox-close" type="button" aria-label="å ³é大徿¥çå¨ (Esc)" title="å ³é大徿¥çå¨"><svg class="ui-icon" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="miter" aria-hidden="true" focusable="false"><path d="m6 6 12 12M18 6 6 18"/></svg></button> 2405 <div class="lightbox-head" id="lightboxHead"> 2406 <output id="lightboxPanelCount" class="lightbox-panel-count" hidden></output> 2407 <button id="lightboxLocate" class="lightbox-tray-toggle" type="button" hidden>å®ä½å½åå¾</button> 2408 <button id="lightboxThumbToggle" class="lightbox-tray-toggle" type="button" aria-controls="lightboxThumbs" aria-expanded="false" hidden>缩ç¥å¾</button> 2409 <button id="lightboxPanelToggle" class="lightbox-tray-toggle lightbox-panel-toggle" type="button" aria-controls="lightboxDetailSlot" aria-expanded="false" aria-label="å±å¼å³ä¾§è¯¦æ " title="å±å¼å³ä¾§è¯¦æ " hidden><svg class="ui-icon" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="miter" aria-hidden="true" focusable="false"><path d="m15 6-6 6 6 6"/></svg></button> 2410 </div> 2411 <div class="lightbox-stage" id="lightboxStage" tabindex="0" aria-describedby="lightboxHint"> 2412 <div id="lightboxPlaceholder" class="lightbox-placeholder" aria-hidden="true"></div> 2413 <img id="lightboxPreview" class="lightbox-preview" alt="" aria-hidden="true"> 2414 <img id="lightboxImage" class="lightbox-image" alt=""> 2415 <div id="lightboxImageStatus" class="lightbox-image-status" role="status" aria-live="polite" hidden> 2416 <span id="lightboxImageStatusText"></span> 2417 <button id="lightboxRetry" type="button">éè¯</button> 2418 </div> 2419 </div> 2420 <div id="lightboxDetailSlot" class="lightbox-detail-slot" hidden></div> 2421 <div id="lightboxTray" class="lightbox-tray" hidden> 2422 <div id="lightboxThumbs" class="lightbox-thumbs" role="listbox" aria-label="åç»å¾ç缩ç¥å¾" tabindex="0" hidden></div> 2423 <div id="lightboxMeta" class="lightbox-meta" hidden> 2424 <p id="lightboxTagsHeading" class="lightbox-meta-heading" hidden>å½åæ ·å¼ æ ç¾</p> 2425 <div id="lightboxTags" class="lightbox-tags" role="list" hidden></div> 2426 <p id="lightboxTopicsHeading" class="lightbox-meta-heading" hidden>å¾çæå±æ ç®</p> 2427 <nav id="lightboxTopics" class="lightbox-topics" aria-label="å¾çæå±æ ç®" hidden></nav> 2428 </div> 2429 </div> 2430 <div class="lightbox-dock"> 2431 <div class="lightbox-toolbar"> 2432 <div id="lightboxNavigation" class="lightbox-navigation" role="group" aria-label="å¾ç翻页"> 2433 <button id="lightboxPrev" class="lightbox-nav lightbox-prev" t
2433ype="button" aria-label="ä¸ä¸å¼ "><svg class="ui-icon" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="miter" aria-hidden="true" focusable="false"><path d="m15 6-6 6 6 6"/></svg></button> 2434 <output id="lightboxCount" class="lightbox-count" aria-live="polite"></output> 2435 <button id="lightboxNext" class="lightbox-nav lightbox-next" type="button" aria-label="ä¸ä¸å¼ "><svg class="ui-icon" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="miter" aria-hidden="true" focusable="false"><path d="m9 6 6 6-6 6"/></svg></button> 2436 </div> 2437 <div class="lightbox-tools"> 2438 <div id="lightboxZoomControls" class="lightbox-zoom-controls" role="group" aria-label="å¾ç缩æ¾"> 2439 <button id="lightboxZoomOut" type="button" aria-label="ç¼©å° (â)" title="ç¼©å° (â)"><svg class="ui-icon" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="miter" aria-hidden="true" focusable="false"><path d="M5 12h14"/></svg></button> 2440 <button id="lightboxFit" class="lightbox-fit" type="button" aria-label="éåå±å¹ (0)" title="éåå±å¹ (0)">éåå±å¹</button> 2441 <button id="lightboxZoomIn" type="button" aria-label="æ¾å¤§ (+)" title="æ¾å¤§ (+)"><svg class="ui-icon" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="miter" aria-hidden="true" focusable="false"><path d="M12 5v14M5 12h14"/></svg></button> 2442 </div> 2443 <button id="lightboxTopicsToggle" class="lightbox-tray-toggle" type="button" aria-controls="lightboxMeta" aria-expanded="false" hidden></button> 2444 </div> 2445 </div> 2446 </div> 2447 <span class="sr-only" id="lightboxHint"></span> 2448 </div> 2449 2450 <template id="styleCardTemplate"> 2451 <article class="style-card"> 2452 <div class="style-card-open ui-card-surface"> 2453 <button type="button" class="style-card-hit"></button> 2454 <div class="thumb"></div> 2455 <div class="card-copy"> 2456 <h3></h3> 2457 <p class="card-meta-line"> 2458 <span class="card-topic"></span> 2459 <span class="thumb-count"></span> 2460 </p> 2461 </div> 2462 </div> 2463 </article> 2464 </template> 2465 2466
2466<script src="/store.b3a89920b3.js" defer></script>
2466 2467
2467<script src="/api-client.91a2d55ae3.js" defer></script>
2467 2468
2468<script src="/catalog-identity.452a3b566b.js" defer></script>
2468 2469
2469<script src="/favorites-view.fa3f53f784.js" defer></script>
2469 2470
2470<script src="/style-sort.21ebe772cb.js" defer></script>
2470 2471
2471<script src="/catalog-pagination.8e8b27c980.js" defer></script>
2471 2472
2472<script src="/page-switcher.31c30766dd.js" defer></script>
2472 2473
2473<script src="/button-loading.d454953540.js" defer></script>
2473 2474
2474<script src="/global-error-guard.87d1ac31a5.js" defer></script>
2474 2475
2475<script src="/image-size.d6355dd45a.js" defer></script>
2475 2476
2476<script src="/image-api-config.ac25cc3d62.js" defer></script>
2476 2477
2477<script src="/color-utils.2b1f35206d.js" defer></script>
2477 2478
2478<script src="/style-similarity.238e996ad0.js" defer></script>
2478 2479
2479<script src="/avatar-kernel.078c93204a.js" defer></script>
2479 2480
2480<script src="/backfill-kernel.c053bce5b1.js" defer></script>
2480 2481
2481<script src="/generated-image-kernel.28e349638e.js" defer></script>
2481 2482
2482<script> 2483 window.XxdLazyAssets = { 2484 sampleClassification: "/sample-classification.4834e83dd9.js", 2485 mediaZip: "/admin-media-zip.98508af349.js", 2486 mediaLibrary: "/admin-media-library.9ada1f2b69.js", 2487 adminRoutePages: "/admin-route-pages.9f584eac57.js", 2488 obsidianManagement: "/admin-obsidian-management.53f765705d.js", 2489 obsidianGeneration: "/admin-obsidian-generation.de15d46438.js", 2490 memberObsidianSettings: "/member-obsidian-settings.a85a0253b6.js", 2491 editorialCovers: "/editorial-covers.846556c03f.js", 2492 adminStyleControls: "/admin-style-controls.bd680e70a0.js", 2493 textSkillChat: "/text-skill-chat.8dd98434ef.js", 2494 skillReadme: "/skill-readme.7ae0d21999.js", 2495 openSource: "/open-source-page.f094add646.js", 2496 openSourceChannelSettings: "/admin-open-source-channels.2c21fe5c39.js", 2497 adminDialogs: "/admin-dialogs.a4920a96bc.js", 2498 adminBatchSelection: "/admin-batch-selection.c9d9968937.js", 2499 communications: "/communications.01efe08dae.js", 2500 memberTips: "/member-tips.72256742ad.js", 2501 articles: "/articles-page.d49fade780.js", 2502 skillsPage: "/skills-page.ce6b8cd00a.js", 2503 conversationDirectory: "/image-conversation-directory.7903bb96a0.js", 2504 lightbox: "/lightbox-page.50f761f34e.js", 2505 styleUpload: "/admin-style-upload.d759467fdd.js", 2506 manualSamples: "/admin-manual-samples.f02141e44d.js", 2507 imageSkills: "/admin-image-skills.f3476b3fea.js", 2508 }; 2509 </script>
2509 2510
2510<script id="appLocaleBundles" type="application/json">{"zh-Hans":"/app-zh-hans.08eaee8bbd.js","zh-Hant":"/app-zh-hant.ee1566b43d.js","en":"/app-en.c90288914b.js"}</script>
2510 2511
2511<script src="/app-zh-hans.08eaee8bbd.js" defer></script>
2511 2512
2512<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"461458c6e2d34e0ea33d169145b8e0ed","r":1,"spa":2}' crossorigin="anonymous"></script>
vendor: 1 bytes, line 2512
2512
2513<script>(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a44facd87c500ef9',t:'MTc5MTA2OTYwMg=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>
2513</body> 2514</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.