From 76f1099f7a1bb9b6e39eb4b4d4335524712d0b24 Mon Sep 17 00:00:00 2001 From: Luka Huang Date: Tue, 16 Dec 2025 14:30:09 +0800 Subject: [PATCH 01/17] feat: rebrand to promptbear.ai domain and fix initialization issues MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update API endpoints from linxly-nextjs.vercel.app to promptbear.ai, change localhost port to 3003, refresh extension icons, and fix context menu duplicate creation and shadow root re-initialization errors. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .claude/CLAUDE.md | 2 +- README.md | 4 ++-- README.zh-TW.md | 4 ++-- chrome-extension/manifest.js | 8 ++++---- chrome-extension/public/icon-128-blue.png | Bin 0 -> 4861 bytes chrome-extension/public/icon-128.png | Bin 10354 -> 4861 bytes chrome-extension/public/icon-16.png | Bin 820 -> 469 bytes chrome-extension/public/icon-32.png | Bin 1938 -> 1028 bytes chrome-extension/public/icon-34-gray.png | Bin 2215 -> 1120 bytes chrome-extension/public/icon-34.png | Bin 2131 -> 1117 bytes chrome-extension/public/icon-48.png | Bin 3070 -> 1571 bytes chrome-extension/src/background/config/api.ts | 4 ++-- .../src/background/core/eventManager.ts | 12 +++++++----- manifest.json | 4 ++-- pages/content-ui/src/constants/sidePanel.ts | 2 +- pages/content-ui/src/index.tsx | 7 ++++++- 16 files changed, 27 insertions(+), 20 deletions(-) create mode 100644 chrome-extension/public/icon-128-blue.png diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md index 1bec53f..0b92446 100644 --- a/.claude/CLAUDE.md +++ b/.claude/CLAUDE.md @@ -76,7 +76,7 @@ This is a Chrome/Firefox extension built with React, TypeScript, and Vite using ### Extension Structure - Uses Manifest V3 with service worker background script - Content scripts inject on all websites (`*://*/*`) -- Communicates with remote API at `https://linxly-nextjs.vercel.app` +- Communicates with remote API at `https://promptbear.ai` - Supports both Chrome and Firefox with conditional builds ### Authentication Flow diff --git a/README.md b/README.md index 067c4f5..78e9c37 100755 --- a/README.md +++ b/README.md @@ -190,7 +190,7 @@ pnpm clean:install # Reinstall dependencies ## API Integration -This extension integrates with the PromptBear platform (`https://linxly-nextjs.vercel.app`): +This extension integrates with the PromptBear platform (`https://promptbear.ai`): ### Main API Endpoints - **User Authentication**: `/api/auth/*` @@ -201,7 +201,7 @@ This extension integrates with the PromptBear platform (`https://linxly-nextjs.v ### Environment Configuration Create a `.env` file to set environment variables: ```bash -VITE_API_DOMAIN=https://linxly-nextjs.vercel.app +VITE_API_DOMAIN=https://promptbear.ai VITE_VERCEL_PREVIEW_BYPASS=your_bypass_token ``` diff --git a/README.zh-TW.md b/README.zh-TW.md index 94864e4..ea837b9 100644 --- a/README.zh-TW.md +++ b/README.zh-TW.md @@ -190,7 +190,7 @@ pnpm clean:install # 重新安裝依賴 ## API 整合 -本擴展程式與 PromptBear 平台 (`https://linxly-nextjs.vercel.app`) 整合: +本擴展程式與 PromptBear 平台 (`https://promptbear.ai`) 整合: ### 主要 API 端點 - **用戶認證**: `/api/auth/*` @@ -201,7 +201,7 @@ pnpm clean:install # 重新安裝依賴 ### 環境配置 創建 `.env` 檔案設定環境變數: ```bash -VITE_API_DOMAIN=https://linxly-nextjs.vercel.app +VITE_API_DOMAIN=https://promptbear.ai VITE_VERCEL_PREVIEW_BYPASS=your_bypass_token ``` diff --git a/chrome-extension/manifest.js b/chrome-extension/manifest.js index 3681024..825bc8a 100755 --- a/chrome-extension/manifest.js +++ b/chrome-extension/manifest.js @@ -35,8 +35,8 @@ const manifest = { host_permissions: [ // 'https://linxly-nextjs-git-feat-promptspace-v3-s-80d4ea-eva813s-projects.vercel.app/*', // 'https://linxly-nextjs-git-feat-firebase-eva813s-projects.vercel.app/*', - 'https://linxly-nextjs.vercel.app/*', - 'http://localhost:3000/*', + 'https://promptbear.ai/*', + 'http://localhost:3003/*', ], permissions: ['storage', 'windows', 'activeTab', 'contextMenus', 'tabs', 'notifications'], // optional_permissions: ['notifications', 'cookies', 'sidePanel'], @@ -76,9 +76,9 @@ const manifest = { externally_connectable: { matches: [ // 'https://linxly-nextjs-git-feat-promptspace-v3-s-80d4ea-eva813s-projects.vercel.app/*', - 'https://linxly-nextjs.vercel.app/*', + 'https://promptbear.ai/*', // 如果您在本地開發後台,也加入本地位址,例如: - 'http://localhost:3000/*', + 'http://localhost:3003/*', ], }, }; diff --git a/chrome-extension/public/icon-128-blue.png b/chrome-extension/public/icon-128-blue.png new file mode 100644 index 0000000000000000000000000000000000000000..14b18220c0d0abbb1edfe2ec7c8115b2aeaff792 GIT binary patch literal 4861 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 literal 0 HcmV?d00001 diff --git a/chrome-extension/public/icon-128.png b/chrome-extension/public/icon-128.png index f9288160066046de339fddbc515578dfa1031597..14b18220c0d0abbb1edfe2ec7c8115b2aeaff792 100644 GIT binary patch literal 4861 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 literal 10354 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 diff --git a/chrome-extension/public/icon-16.png b/chrome-extension/public/icon-16.png index d1d21011716b5da8b3ce300da76ce90736abca29..f7f01ae49746f5949b0ffd9dee648bb34b2e2249 100644 GIT binary patch delta 444 zcmV;t0Ym<@2Gs+QBYy#$Nkl2;!K)S!d6)vDH}U0Qx+Ds zR%q7z2a~;pva+yar6^@JDCDN>l(8To$ItPjxre#*y?xK^)XdIXr}v!q`@YZne4pnz z{O9O(Kbk?g9_#Q2qpbHj?@?D&b+Zbf8I;>_5Qp&u%h-WFzJJ6P9Kp+|7ghas0?-V~ zn2+Hc?%+6n;Wbt;gYCGB3iolfsOsNiN(pob3%HKk_>s59*nkor@d#&e4HJOB_>e6O z@hy8@NrwFd>?eadb9s9bz_v@>7Cu#7;!t-{a<7*8&9cZamMPk0zVPdGHlZ z-~t|GJwTflAb+fz!nBda9w2(K){{893u&coc50hqWevuitlJ(_mZ5K}CUJKCcBylTdv)@SDQ-lkV zg`aqX`J6AeN$lDf6hpLU*qg4zT;Ko}u?H9Ne$Ah$6E*A5A;9B_zQfA7)MLJ=>NYQ{ m0oEFs#IQMB`dU==#D#x?%z9*G;@A!V00006Lo40hA{nUx^ zY{CC^HLvT}Rn^@De`$XJviYnrX2U!ym&*yw#e6B1G4$WwQ=R& znT?Ly`fhmK(!6bH^9}#;{K6<+FnimQSu^?`O{ouHeXY;)W^7$Jw92RgQ2Jsj61Jk` zqA-k&f~gf4TbO9N1X@ibc0d?O1Xzk}Ett4wO)7y<^3g&DoUD|(6)QTAVYm*+SesVP zu5@JWNd@r+lz*xXQqdV%iB6z^X4Cy@=s2hX7?k>iNMp;w4jQJJ?}xmIO4kpaEhoy> zjxUkh{pyRIE*rKnNh$dJIqp>h0ounH6chnILgB9b?@eRxkmk0WlUIXap{e#)&sP6-efS5zP?8k7_$hbS$vNtpEhm!2s^6aEn_WPm|APqv2 zzkA@+y<|jW64noDSro~!X{`#vV<4qRrdXZ<*9C1B83e2tbg_E+vxLsCoeB}YFyUyY z+Y$AdFn_=Z&yx^C89}l>9Wzr?N=h|q#27&6@*61V2Y?4kFSN%xCIvTjL1K@T1_J3$(q*b8Q{ZUQ!00016B%bKhE-=upIHPu}OuR@)YYK8@ywgkL zf@pAqVewv8@*_ih(_7}r-x+A{#sRM+0(n*6sDGUb@wQZ4$EGnESj=HzZWj@^0pJL| z!Pz_M2?h9N^lMB8Za;GA+wBA16VvIsmdboPo$3>ZrE(7<%8h`GI`xMYgo1upDhWt5 z5Rl9haeKZ!)~d9h^m-p0KUeCoFTVDja3@n`U*~?Wlq{<1I{*Lx|Nnz>% diff --git a/chrome-extension/public/icon-32.png b/chrome-extension/public/icon-32.png index cc4a76dd8bfeeb42f56403fe36d326f7bd001b06..e6b92c1535b57ff4a99921337754e3f5e80e6b81 100644 GIT binary patch delta 1007 zcmV4O(t>F0DnB8b$8S-BN%l{(h z!!?ah1!e-hz%A#)NSVF1XSQzNWw%Y@$RhRyun~B}`EaIM1nN~he<-(qoAbf`+oz&A zABKR-sbTZ+Bk-ou@qpEq@ncS|sDQjG`f;pLx4#E;SAPZI#){-q<#xAd_(+z-k+Ek3 z&?<&ps0u(fN%he#9zUvC_&b$4tDlm($yM06N}G+p!$rku;}LMw`OsIqA&H|2zze`T z#u%#^72$yD;zfbzekg!s?4T7wJy^tB%jFI^=}O}0qKc|sYxBTPh5HzAO8fGn?IMX+ zceNBu5`V96YIDKz;`LSWe2b}@K3@XU^xJ6rdnyg*fC&O$H3juW+HaNn55=3<4(=`T;5871c|x^q^oPikJbY z%MyW6eOt)N+4BPaH82HO32fEeHejFLgM!t_SAW^pFjrM5*nyQ%_^btny=Cvj9F#d--1$XVbUD?)2F(r>-qkp=22 zx_?CBObtnsgydNj+fG$?iIi5dB#tKP;6oCzbZ5ug@zJ=Xm+sc4RjIgL`$4pH%tz%4A-jAjB*=8-CNOAQLU zv7}ZhY1U))67U-^7dYa4u+Eyt29OcpEMTwoeoEIS=YyrkIla6UZH d1&>AwH~ delta 1924 zcmV-~2YdL02$BzwBYy`+Nkl@uYDw0l8}(lSeO>3PQe-Lw#JyG zT^guD+K_Zug+824tk`B6B((%|Y`acTh?TYshB`V7b!r7?f$#{8RczNLAr=K0r=^96iz#k%U;^5*3;y=xbGC}GS;`XsUv zCmB)?=v!Ai+bk}8TH)F*Q--~ghR>Bfv2=dflQp+hG%i_Dv8JxMZw>~|-wZ#jh`;+x zWmDa^%U9JbxPNoiy>t0+&eu^mx1+@OyD+b{a;<;K;>N{Vs`ez25kTp8Y6?wMw*f)} zB9;KK0@A-FX>6ygYI`xuy#*CzEh0QF7(RxKH42CPBj(ax6ArCiI2|v5#LAHi7cjhs zVz!OS$^u#$i6>D;019KvDe4Xo@Mj}wE*6knEI5A)ReyCF6^xL*+YCq7bCW+TxOhlJ zB9DQ=U!`672xQsXsxVxNE=Mz7%?-1OR%PgL{POdU)LPp?rN=1~018&0q>vb(QQxy^ z_Xk}Y+D`E#)&uZG387bZI_A|KZf$>|yJc5L*T&%Qx;7sSc0Ip)wd`;$K;5X~lDM~X zbNicb|9|wrhl&gLfyrN|dY+Y3WCKuER-yr-6NDIoQOQV0_q-S!?A#DMab!c= z01X{a+b7CU;Fb8>&+k6ny*_vnkosgf&t5Q$k?^~K$iVHKZkZ;s4M0y%Zya>vEYRL_ zRlnVu=!pscsUCIbx@Aw!{Q|($Bawej&9?!d0Doa7%@zV6P}Md@6S=m1qnPU=?@F(t zh*+(VnHNod^5V%4-kX}32>{I*xM*+?O!GIczM;s}r0ab?`ir9mo922Q1q@QrBF|?$ zwynzu0D)HtAq;`IBeXq~xV#`;Hs#HAiz=FyKHzKcXI-{U`1AWg`tqvk`4!E}Hqxb) zmw$2z&6J{4>oj#V%bitHl(LTrJAeQ%a5(M)5QB^XorEjHR31I%X0jRpO?^&hkhU8~PcngDy8~HHNdxK^m|{d%xe2MCb;J}yYNGxulOxf7kl9!1ZEvQ~5@6`% zg9AmN@LvHlmnyOFN2xTRR+#*3{|Tf(Ko7C1p;wZh{`&j5XJM^KJ=v4Qd54{qKTQw{W27??W43mybQx%ev$Ob@?C8|d; zoJ;g?qd!EC&7FSB=Wc>{_}6A6z7@Fm8zvJ^Sb@34@m1yL%H5Vefl&u$)w)u5g2Pg6 z0MvXni9ow7OSw+eYz>G&n)AqEqEztjQK~x}^G)#qt5x2F>G_Zw^RXgUmpF&l=8zfc?C52B5L^mIe zeYg8(`#(t+w`5|ZKw+|c2Us;FX_C+K+W?#h29uD`-vGvD=(=!OK@+*>#ed*nmvjF2 z5+nMYMBl(7qxWAccr1E*cJxw3_ty6AiLsXMRzXEYzLRvF>+w@0Cy@<+<>iLC0}ur| zoSPS}_1mxFK!6`{H> zkDcLWYza5{t6+T}XzGJFJ@>b=!|{8?Ep@2V^AF0iiubv0o3&3X$~}M{SG#k;>_%(L zMzi7?_3JJ`kWD?=phu(IX?9{%*G5+Z09Jduf3p9Sk}#g(Nn;rp{8^gxogl<9>P(c{ zs(>ub1SZX*#XJJx27gqfH8J4NvXR712#^DS1O173+dEr2tcwUT{jLfi6)Zw8?HxY6 zY0qCe-Md=NxL9Xg2(RQKQO7ylXXv~dqRDD861$J<#tH)WcgCcLP*z?BfjK;p{L??K z3}>pGU0e&mct!xY)yAG}ZwyjrKIv`=p6j9S#m+7JPISF|@O{kTthRTI;aI&$Bo9$1 z=1^Azlcb&F1u|>b4=^{p+VFXYy) zmffq5zqEHaWxlHT)B#Lg=~~bK1^@v6|DNjedjJ3c21!IgR09Ai(D7da7mb|&0000< KMNUMnLSTXkgRUU} diff --git a/chrome-extension/public/icon-34-gray.png b/chrome-extension/public/icon-34-gray.png index 04b80f5e93d5ffe300cdc031906b1a526793c506..3136d20c27b4df15561523945cf417b862be5c87 100644 GIT binary patch delta 1100 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 x5xLG#*BAW*00960dUQ+X00006Nkl8Djtd diff --git a/chrome-extension/public/icon-48.png b/chrome-extension/public/icon-48.png index 98a22a4f65e0d947ae87cf94d8567606c009fcc7..1c983468abb6e3e69066b22c8b946206a5b9c4a2 100644 GIT binary patch delta 1555 zcmV+u2JHF%7o!Z2BYy?zNklJOnJBdGqcB3m$8peWkJivGwJO0g)gG!a|O?3h-z8eyiE-OQ=R?Tj-MKl|Re zJ>Prx&6}ALnlC)wy_a*(J>T=&zP|%q=t38|(1muOrqY4IJAWHH1UL~m2>2a%ANV4Q zlbr=)Yk|E1`?vR6fM#G@6eleOWA_0@0;7N?;2YqBC{8wa7=hqj1Y8SD2Koc__89mP zcmcRiq-+tV0)qjUA<(MDtpiqyxc%=7+@p8;iD(1x18^7cb|K+56VT!x5`k_-hS&!_ z1%?83nK8xYZhy`EY@s`V0VT$+(}vBD;>5-mMQzUFZ84VumuX>}fMuBlpQN2WPOt28 z6S-HT?o${!bC+Inul+L{@HMbR?~c-Z2LrbOUjl2ZA^_|s0)2r$fLnp*qBz+Wyt742 zl>2lCR*Bep;4@&gNTld1(nkS@DV7ESD}X6coUG8M9e)Dc30x)DIvaSpDi;dg4F}#4 zk=KArvH>gi8V5uo@NE<)=IdnfOp)d4f@ZV2Ah1@C%DFXbY5w^#74mkQ-S5XFgE z_+H)i0fx1QK<~^1Uqx}Uy+lr*3OoxOS;6A10Dn#Z76IdpOc4?bRm}}2l$$TF5}VjM zT-WcG7;^@2x31R)@1|N&k~LC`v}W{-ZOAlL<@-%}0>2cQcMWiisCYX9; zt_NtBP48R>%m(I~{0QES&5WCwSMrS_0Y&*Q`j*UMW&lYW=Galmpgaq-RDVb`O{W88`qk>Do&k;prUNr==Yw~{lwIb^ zok}71o0SY|%%szDi?300^C57D1#%Q8)|~&OUU*d$Ck<-$=cs1v%2;L4t0M@cfm<8A zOHv4+Qn8ySomCD;7l_KL#axQKu4u7Rr=`ZzRDTC7 zZ5ocx+*@6k9>s}ClX6H4XhXRqQd>bkU{&$};6mWlQUfg=2JdF5IUf&LZ#zVbHcNh@ zlLnK=8_35f{V%EdR6>jYNPX|=)&rLdJQcB(!Mo2@ZF{TIHfye}W%B;t2;PkV4%My6 zd8#F_StktR6m-`E59YjMM4DuJ`+rq~M?}0y7Nx2f&_dn-zSo3T1n)+x&D00ez@WDe?*R3fW*DV2igV#A(s#X?3ldoZ&ja9V%JTS1!4sEsL+( z0+m3iHf;3=$ delta 3065 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 { + chrome.contextMenus.create({ + id: 'addToPromptBear', + title: 'Add to PromptBear', + contexts: ['selection'], + }); }); } diff --git a/manifest.json b/manifest.json index fb8ce66..27a8977 100644 --- a/manifest.json +++ b/manifest.json @@ -13,7 +13,7 @@ }, "version": "1.2.5", "description": "__MSG_extensionDescription__", - "host_permissions": ["https://linxly-nextjs.vercel.app/*", "http://localhost:3000/*"], + "host_permissions": ["https://promptbear.ai/*", "http://localhost:3003/*"], "permissions": ["storage", "windows", "activeTab", "contextMenus", "tabs", "notifications"], "options_page": "options/index.html", "background": { @@ -48,6 +48,6 @@ } ], "externally_connectable": { - "matches": ["https://linxly-nextjs.vercel.app/*", "http://localhost:3000/*"] + "matches": ["https://promptbear.ai/*", "http://localhost:3003/*"] } } diff --git a/pages/content-ui/src/constants/sidePanel.ts b/pages/content-ui/src/constants/sidePanel.ts index 25b7bde..9916dae 100644 --- a/pages/content-ui/src/constants/sidePanel.ts +++ b/pages/content-ui/src/constants/sidePanel.ts @@ -61,7 +61,7 @@ export const UI_TEXT = { // External URLs export const EXTERNAL_URLS = { - DASHBOARD: 'https://linxly-nextjs.vercel.app/', + DASHBOARD: 'https://promptbear.ai/', } as const; // CSS classes diff --git a/pages/content-ui/src/index.tsx b/pages/content-ui/src/index.tsx index f4727f1..20b4319 100644 --- a/pages/content-ui/src/index.tsx +++ b/pages/content-ui/src/index.tsx @@ -51,7 +51,12 @@ const initializeContentUI = (): void => { // 安全地建立 Shadow Root let shadowRoot: ShadowRoot; try { - shadowRoot = root.attachShadow({ mode: 'open' }); + // 檢查是否已存在 shadow root(避免重複初始化時報錯) + if (root.shadowRoot) { + shadowRoot = root.shadowRoot; + } else { + shadowRoot = root.attachShadow({ mode: 'open' }); + } } catch (shadowError) { console.error('建立 Shadow DOM 失敗:', shadowError); // Fallback: 直接使用普通 DOM From 86e401f13a8b50f30e0245892abb62b1ce993164 Mon Sep 17 00:00:00 2001 From: Luka Huang Date: Tue, 16 Dec 2025 15:10:23 +0800 Subject: [PATCH 02/17] feat: make dashboard URL environment-aware MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use import.meta.env.MODE to dynamically set the dashboard URL based on the environment (localhost:3003 for development, promptbear.ai for production). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- pages/content-ui/src/constants/sidePanel.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/pages/content-ui/src/constants/sidePanel.ts b/pages/content-ui/src/constants/sidePanel.ts index 9916dae..8aac2d2 100644 --- a/pages/content-ui/src/constants/sidePanel.ts +++ b/pages/content-ui/src/constants/sidePanel.ts @@ -59,9 +59,13 @@ export const UI_TEXT = { SHARE_TYPE_PUBLIC: 'Public Share', } as const; -// External URLs +// External URLs - 根據環境動態設定 +const isDev = import.meta.env.MODE === 'development'; +const DEVELOPMENT_DOMAIN = 'http://localhost:3003'; +const PRODUCTION_DOMAIN = 'https://promptbear.ai'; + export const EXTERNAL_URLS = { - DASHBOARD: 'https://promptbear.ai/', + DASHBOARD: isDev ? `${DEVELOPMENT_DOMAIN}/` : `${PRODUCTION_DOMAIN}/`, } as const; // CSS classes From 9fe24ca1c4e1dbf9184216627537b06048f108da Mon Sep 17 00:00:00 2001 From: Luka Huang Date: Thu, 18 Dec 2025 17:50:10 +0800 Subject: [PATCH 03/17] feat: implement dark mode with gray background, white text, and yellow accents MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Enable Tailwind dark mode with class strategy - Update CSS variables for dark theme (gray-700 bg, white text, yellow-400 accents) - Add dark mode classes to all content-ui components - Update side-panel form components with dark mode styling - Toggle sidebar button: yellow background with white arrow - Search highlight uses yellow in dark mode - Insert prompt arrow uses yellow in dark mode 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- packages/tailwind-config/base.css | 44 ++++++++++++++----- packages/tailwind-config/tailwind.config.ts | 1 + pages/content-ui/src/components/Header.tsx | 4 +- .../src/components/PromptSpaceSelector.tsx | 26 ++++++----- .../content-ui/src/components/contentArea.tsx | 2 +- .../content-ui/src/components/errorState.tsx | 12 ++--- .../content-ui/src/components/folderItem.tsx | 12 ++--- .../src/components/highlightText.tsx | 4 +- .../src/components/loadingState.tsx | 2 +- .../components/sharedWithMe/promptsView.tsx | 6 +-- .../sharedWithMe/sharedFolderItem.tsx | 4 +- .../src/components/toggleSidebarButton.tsx | 2 +- pages/content-ui/src/global-styles.css | 6 +++ .../src/hooks/useContainerClassUpdater.tsx | 3 ++ pages/content-ui/src/utils/sidePanel.ts | 2 +- .../renderers/FormMenuMultiSelect.tsx | 10 ++--- .../components/renderers/types/formMenu.tsx | 2 +- .../components/renderers/types/formText.tsx | 2 +- pages/side-panel/src/formRoot.tsx | 8 ++-- 19 files changed, 96 insertions(+), 56 deletions(-) diff --git a/packages/tailwind-config/base.css b/packages/tailwind-config/base.css index 4be0857..f1e1cab 100644 --- a/packages/tailwind-config/base.css +++ b/packages/tailwind-config/base.css @@ -48,20 +48,29 @@ } .dark { - --background: #0f1210; - --foreground: #f5f5f5; - --primary: #3d7a57; - --primary-hover: #2d5a3f; - --accent: #c9a800; - --border: #f5f5f5; - --ring: #3d7a57; - --input: #1a1a1a; - --muted: #2a2a2a; - --muted-foreground: #9ca3af; - --card: #1a1a1a; - --card-foreground: #f5f5f5; + /* 灰色底、白字、黃色反白 */ + --background: #374151; /* gray-700 灰色背景 */ + --foreground: #ffffff; /* 白色文字 */ + --primary: #4ade80; /* 綠色主色(較亮以配合深色背景) */ + --primary-hover: #22c55e; + --primary-foreground: #000000; + --accent: #facc15; /* 黃色反白/強調色 */ + --accent-foreground: #000000; + --border: #6b7280; /* gray-500 邊框 */ + --ring: #facc15; /* 黃色 focus ring */ + --input: #4b5563; /* gray-600 輸入框背景 */ + --muted: #4b5563; /* gray-600 */ + --muted-foreground: #d1d5db; /* gray-300 */ + --card: #4b5563; /* gray-600 卡片背景 */ + --card-foreground: #ffffff; /* 白色文字 */ --destructive: #ef4444; --destructive-foreground: #ffffff; + --light: #6b7280; /* gray-500 */ + --third: #4b5563; /* gray-600 */ + + /* 黃色選取/反白樣式 */ + --selection-bg: #facc15; /* 黃色選取背景 */ + --selection-fg: #000000; /* 黑色選取文字 */ } * { @@ -74,6 +83,17 @@ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } + + /* 黃色選取/反白樣式 (深色模式) */ + .dark ::selection { + background-color: #facc15; + color: #000000; + } + + .dark ::-moz-selection { + background-color: #facc15; + color: #000000; + } } /* T010: 自訂實用類別 - 新野獸主義樣式 */ diff --git a/packages/tailwind-config/tailwind.config.ts b/packages/tailwind-config/tailwind.config.ts index 5217765..7b1ece5 100644 --- a/packages/tailwind-config/tailwind.config.ts +++ b/packages/tailwind-config/tailwind.config.ts @@ -1,6 +1,7 @@ import type { Config } from 'tailwindcss/types/config'; export default { + darkMode: 'class', theme: { extend: { // T006: Retro Neobrutalism 色彩標記 diff --git a/pages/content-ui/src/components/Header.tsx b/pages/content-ui/src/components/Header.tsx index b8d5faf..e11c4e9 100644 --- a/pages/content-ui/src/components/Header.tsx +++ b/pages/content-ui/src/components/Header.tsx @@ -92,9 +92,9 @@ const Header = memo( ); return ( -
+
-
+
( ); return ( -
+
@@ -89,10 +91,10 @@ const PromptSpaceSelector = memo(
+ className="absolute inset-x-0 top-full z-50 mt-1 max-h-[200px] overflow-y-auto rounded-lg border border-gray-200 bg-white shadow-lg dark:border-gray-600 dark:bg-gray-700"> {mySpaces.length > 0 && (
-
+
{SECTION_TITLES.MY_WORKSPACES}
{mySpaces.map(space => ( @@ -104,8 +106,10 @@ const PromptSpaceSelector = memo( e.preventDefault(); handleSelect(space.id); }} - className={`block w-full px-3 py-2 text-left text-sm hover:bg-gray-100 ${ - selectedSpaceId === space.id ? 'bg-light text-primary font-bold' : 'text-gray-900' + className={`block w-full px-3 py-2 text-left text-sm hover:bg-gray-100 dark:hover:bg-gray-600 ${ + selectedSpaceId === space.id + ? 'bg-light text-primary font-bold dark:bg-gray-500 dark:text-green-400' + : 'text-gray-900 dark:text-white' }`}> {space.name} @@ -114,8 +118,8 @@ const PromptSpaceSelector = memo( )} {sharedSpaces.length > 0 && ( -
0 ? 'border-t border-gray-100' : ''}> -
+
0 ? 'border-t border-gray-100 dark:border-gray-600' : ''}> +
{SECTION_TITLES.SHARED_WITH_ME}
{sharedSpaces.map(space => ( @@ -127,8 +131,10 @@ const PromptSpaceSelector = memo( e.preventDefault(); handleSelect(space.id); }} - className={`flex w-full items-center justify-between px-3 py-2 text-left text-sm hover:bg-gray-100 ${ - selectedSpaceId === space.id ? 'bg-light text-primary font-bold' : 'text-gray-900' + className={`flex w-full items-center justify-between px-3 py-2 text-left text-sm hover:bg-gray-100 dark:hover:bg-gray-600 ${ + selectedSpaceId === space.id + ? 'bg-light text-primary font-bold dark:bg-gray-500 dark:text-green-400' + : 'text-gray-900 dark:text-white' }`}> {space.name} {space.isReadOnly && {SECTION_TITLES.VIEW_ONLY}} diff --git a/pages/content-ui/src/components/contentArea.tsx b/pages/content-ui/src/components/contentArea.tsx index e2aab7c..67369e7 100644 --- a/pages/content-ui/src/components/contentArea.tsx +++ b/pages/content-ui/src/components/contentArea.tsx @@ -17,7 +17,7 @@ const ContentArea: React.FC = ({ onRetry, }) => { return ( -
+
{isLoading && folders.length === 0 ? ( ) : loadError ? ( diff --git a/pages/content-ui/src/components/errorState.tsx b/pages/content-ui/src/components/errorState.tsx index a225f7c..109c7ad 100644 --- a/pages/content-ui/src/components/errorState.tsx +++ b/pages/content-ui/src/components/errorState.tsx @@ -6,11 +6,13 @@ import { ERROR_MESSAGES, UI_TEXT } from '../constants/sidePanel'; const ErrorState: React.FC = ({ error, onRetry }) => { return (
- -
{ERROR_MESSAGES.SOMETHING_WRONG}
-
{ERROR_MESSAGES.LOADING_TROUBLE}
-
{error}
-
diff --git a/pages/content-ui/src/components/folderItem.tsx b/pages/content-ui/src/components/folderItem.tsx index 281999f..c94f7fc 100644 --- a/pages/content-ui/src/components/folderItem.tsx +++ b/pages/content-ui/src/components/folderItem.tsx @@ -33,13 +33,13 @@ export default function FolderItem({
  • @@ -47,7 +47,7 @@ export default function FolderItem({ {!isCollapsed && (
      {folder.prompts.length === 0 ? ( - No prompts in the folder + No prompts in the folder ) : ( folder.prompts.map((prompt: Prompt) => (
    • setHoveredPromptId(null)}>
  • - + diff --git a/pages/content-ui/src/components/highlightText.tsx b/pages/content-ui/src/components/highlightText.tsx index 007e84f..1d145b1 100644 --- a/pages/content-ui/src/components/highlightText.tsx +++ b/pages/content-ui/src/components/highlightText.tsx @@ -21,7 +21,9 @@ const HighlightText = memo(({ text, searchQuery, className = // Check if this part matches the search query (case insensitive) if (part.toLowerCase() === searchQuery.toLowerCase()) { return ( - + {part} ); diff --git a/pages/content-ui/src/components/loadingState.tsx b/pages/content-ui/src/components/loadingState.tsx index 0484b99..21ce47d 100644 --- a/pages/content-ui/src/components/loadingState.tsx +++ b/pages/content-ui/src/components/loadingState.tsx @@ -5,7 +5,7 @@ import { LOADING_MESSAGES } from '../constants/sidePanel'; const LoadingState: React.FC = ({ message = LOADING_MESSAGES.LOADING_PROMPTS }) => { return (
    -
    {message}
    +
    {message}
    ); }; diff --git a/pages/content-ui/src/components/sharedWithMe/promptsView.tsx b/pages/content-ui/src/components/sharedWithMe/promptsView.tsx index 6e0c593..0c674dd 100644 --- a/pages/content-ui/src/components/sharedWithMe/promptsView.tsx +++ b/pages/content-ui/src/components/sharedWithMe/promptsView.tsx @@ -95,7 +95,7 @@ const PromptsView = memo(({ promptsLoading, promptsError, sele onMouseLeave={() => setHoveredPromptId(null)}>
    {prompt.shortcut && ( - + {prompt.shortcut} )} diff --git a/pages/content-ui/src/components/sharedWithMe/sharedFolderItem.tsx b/pages/content-ui/src/components/sharedWithMe/sharedFolderItem.tsx index 90cd8d3..8d4d040 100644 --- a/pages/content-ui/src/components/sharedWithMe/sharedFolderItem.tsx +++ b/pages/content-ui/src/components/sharedWithMe/sharedFolderItem.tsx @@ -20,11 +20,11 @@ const SharedFolderItemComponent = memo(({ folder, onClick
  • @@ -95,16 +95,16 @@ const FormMenuMultiSelect: React.FC = ({ ref={dropdownRef} style={dropdownStyle} id={id} - className="max-h-60 overflow-auto rounded border bg-white p-2 shadow-md"> + className="max-h-60 overflow-auto rounded border border-gray-500 bg-gray-700 p-2 text-white shadow-md"> {options.map((opt, i) => ( diff --git a/pages/side-panel/src/components/renderers/types/formMenu.tsx b/pages/side-panel/src/components/renderers/types/formMenu.tsx index 1a6c58e..021525c 100644 --- a/pages/side-panel/src/components/renderers/types/formMenu.tsx +++ b/pages/side-panel/src/components/renderers/types/formMenu.tsx @@ -74,7 +74,7 @@ export function renderFormMenu( id={attrs.name ? `field_renderer_${attrs.name}_${key}` : `field_renderer_${key}`} defaultValue={defaultValue[0] || ''} onChange={onChange} - className="bg-light rounded border border-gray-400 px-2 py-1"> + className="rounded border border-gray-500 bg-gray-600 px-2 py-1 text-white focus:border-yellow-400 focus:outline-none focus:ring-1 focus:ring-yellow-400"> {options.map((opt, i) => (