Spaces:
Sleeping
Sleeping
Commit History
-
補齊「使用手冊」→「使用說明」更名的實際內容改動
上一個 commit(8eccc5a)只有檔案改名本身進去了,實際的文字內容 改動(app_agent.py 的按鈕標籤/檔案路徑/註解、assets/app.css 註解、 docs/ 底下三份文件、使用說明.md 內文與版本日期、重新產生的 使用說明.docx)因為 git add 指令裡一個路徑打錯導致整批加入失敗, 沒有真的進到上一個 commit,這裡補上。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>9615d53 -
統計技術報告:標題改「統計結果技術報告」,修正分組方式顯示
業主回報下載檔的標題要改名,順手發現「分組方式」那行是真的 bug: 原本直接印 GROUP_COL,這個變數永遠是字面上的 "Type1"(內部欄位 名稱),不管實際是用檔名字首分組還是「個體間比較」都印一樣沒 意義的「分組方式:Type1」。改成依 individual_grouping 是否非空, 動態印出真正描述本次採用哪種分組依據的文字。 同步把下載檔名從 TransPrism_stats_{時間戳}.docx 改成 統計結果技術報告_{時間戳}.docx,跟文件內標題一致;時間戳保留 避免多次下載互相覆蓋。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>330c845
-
統計穩定性警示、system prompt 補強、關於面板、多項 bug 修正
統計正確性: - cohens_d()/eta_squared() 分母趨近於零時回傳 None 而非失真數值 (新增 EFFECT_UNSTABLE_LABEL),修掉效果量算出天文數字的 bug - 新增 ZERO_VARIANCE_WARNING:任一組標準差趨近於 0 但檢定仍算出 p 值的退化情況,加註「統計穩定性有限」警示,不隱藏顯著性判斷 - 新增 ZERO_PROPORTION_WARNING(門檻 50%):任一組半數以上樣本值 為 0、SD 未趨近於零但平均數可能被離群值主導的情況,獨立於上面 的 SD 判準另外偵測,兩者可疊加、不重複描述同一組資料 - 修正 docx 差異性分析表格欄位定位改用欄名查表(原本 len(vals)-4 位置推算已對錯欄) - None/NaN 判斷全面改用 pd.isna(),修掉 docx 表格出現 "nan" 文字 - 群組標籤(如「人工翻譯」)修正為會實際套用到送給 LLM 的 difference_analysis 資料,不再只停留在畫面/圖表 - 差異性分析箱形圖:達顯著指標全部畫出(取消前 12 項上限),排序 改為先依組別、組內再依效果量絕對值 - 兩群比較用詞「較高/較低」、三群以上用詞「最高/最低」 System prompt(LLM1): - 補上角色邊界、11 條嚴格禁令(原 5 條)、指標代碼對照表、 metadata 一致性檢查指示 - 新增 INDICATOR_REFERENCE_TABLE:從 INDEX_CATEGORIES 動態產生, 取代手動謄寫,避免與實際指標定義漂移 - 每次分析新增 06_system_prompt.txt 可重現性附件,保留當次實際 送出的完整 system prompt 原文 介面: - 新增「關於」面板(系統版本、免責聲明、姊妹工具、開發紀錄;版權 /聯絡方式/引用格式因論文尚未發表,暫不公開真實姓名或 email) - 情境 1、4 卡片標題拿掉「同一原文的」;情境選擇小標改為 「請選擇最符合您針對同一原文的重譯研究設計的比較情境」 - 「語料 Metadata 說明」全面改稱「語料說明」(含隱形橋接按鈕文字 同步) - 隱私提醒文案調整(移除「先與計畫主持人確認」,改為「先行確認」) Co…f1c47a3
-
資料完整性檢查與可重複性技術設定
【資料完整性檢查】 差異性檢定(t 檢定/ANOVA)在任一組樣本數 N<2 時,scipy 會算出 p=NaN, 但原邏輯的 `NaN < 0.05` 比較恆為 False,會 fallthrough 到「ns」,讓 「資料不足、根本無法檢定」跟「已檢定、無顯著差異」變成同一個值,讀者與 LLM 都無法分辨。「個體間比較」功能允許分組粒度細到每檔案一組,N=1 是 實際會發生的情境,不是假設案例。 - 新增 INSUFFICIENT_DATA_LABEL 常數,p=NaN 時明確標成獨立類別,不計算 效果量(不用 cohens_d()/eta_squared() 對 N<2 的 0.0 保底值),不計入 顯著/不顯著的統計比例 - 同步修正 sig_df 篩選、docx 報告表格(紅字改灰字斜體、None 值防呆)、 送給 LLM 的 JSON(新增 untestable_indicators/資料完整性提醒欄位)、 畫面即時說明文字,四處都要排除新標籤,避免被誤算進「顯著指標」 - system prompt 補規則:看到「資料完整性提醒」的指標只能寫「資料不足, 無法檢定」,不能寫成「無顯著差異」 【可重複性技術設定】 - temperature 預設從 0.5 改成 0 - LLM1_MODEL/LLM2_MODEL 從環境變數可覆寫改成寫死常數,執行期無法覆寫 (對應 docs/開發優化建議.md 3.3/3.4 節記錄過的真實案例:測試環境曾 被覆寫成 openrouter/free 自動路由別名,同代號兩次呼叫導向不同模型) - 新增 PROMPT_VERSION 常數,隨 system prompt 異動手動遞增,印在 docx/ txt/畫面三處報告輸出的標頭,讓每份報告可回溯當時用的模型與提示詞版本 - .env.example/使用手冊.md/.docx 同步移除已失效的 LLM_MODEL 覆寫說明 以上均以隔離測試腳本驗證(N=1/N=3/混合案例、LLM 資料層輸出、docx 實際 產出內容),未觸及既有正常流程之行為。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>b6322f6
-
部署前整備:對話氣泡真人感、隱私告知、Space 存取控管與 Session 自動清理
對話流程/文案: - AI 對話補上使用者動作氣泡(上傳檔案、送出或略過語料 Metadata),避免 兩則 AI 訊息中間看起來像自問自答 - 使用者訊息泡泡改用獨立底色/邊框(淡綠),跟 AI 泡泡的中性藍灰區隔 - 對話中的 [WARNING] 純文字標籤改成 ⚠️ emoji,跟技術執行紀錄面板一致 - 使用者訊息裡殘留的舊工具名稱「ckip_segmentation_sumin」全面改為 「語料淬鍊(CorpusRefinery)」,含格式驗證訊息與失敗回退訊息 - 文本上傳卡片新增隱私提醒:告知使用者上傳內容會送第三方 AI 服務分析 部署與維運(對應 docs/開發優化建議.md 第一、四、六節): - app.py 新增 APP_AUTH_USERS 環境變數驅動的登入畫面(Gradio 內建 auth), 讓 Space 可保持 Public 但只有知道帳密的特定使用者能進入內容 - app_agent.py 新增 SESSIONS_DIR 自動清理:啟動時清一次、之後每 24 小時 重跑,依資料夾 mtime 判斷是否超過保留天數(預設 7 天,可用 SESSION_RETENTION_DAYS 覆寫),避免使用者研究語料無限期留在磁碟上 - app_agent.py 本機開發用的 share=True 改成看 GRADIO_SHARE 環境變數, 預設關閉,避免地端執行時意外對外開公開分享連結 使用手冊同步更新為目前實際流程(四步驟、CorpusRefinery 改名、群組層 改文字欄位、個體間比較消歧義邏輯、62/75 指標顯示範圍、下載捷徑精簡等)。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>e02ce54
-
AI 頭像:兩顆星改實心並放大
業主:對話列的 AI 頭像圖案兩顆都要實心,而且現在視覺上有點小。 - assets/icons/ai-avatar.svg 改 fill 實心、不再描邊,path 一併撐大: 大星 x3.9–17.1/y2.2–17.2、小星 x15.3–21.5/y13.6–20.7,幾乎填滿 24 的 viewBox(原本大星只有 x6.6–17.4/y3.4–16.6,小星更小一圈)。 - CSS:img 內距 5px→3px,圖案在 28px 圓內的可用範圍 18px→22px。 兩件事要一起做才有感——只縮內距是把細線稿放大,只放大 path 又會被內距框住。 - _ICON_PATHS 的行內版 path 同步更新,維持「檔案版與行內版一致」的既有慣例。 驗證:實測頭像容器仍 28px、內距 3px、圖案可用範圍 22px;截圖確認兩顆星 都是實心白、在漸層圓內明顯放大。(這次沒有用像素統計當佐證——頁面底色 本身就接近白,用亮度門檻數白點會把背景一起算進去,改以 DOM 量測+截圖 目視為準。) Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MQuAXWC1hCsiT48TXftPc71b38599 -
運算中途按「回首頁」:中止還在跑的分析,並把結果導覽閘門關回去
業主回報:分析運算跑到一半按「回首頁」再重新進來,畫面又冒出上一輪的 分析運算面板,步驟列停在舊狀態、對話也還是舊訊息。 查證分兩段:分析**跑完後**再重置是乾淨的(實測面板/對話/下載捷徑全清), **跑到一半**重置才會重現。所以問題不是重置漏清,而是重置沒有中止那條還在 跑的 generator——_run_computation 每個子階段都會 yield 一次畫面,重置把畫面 清乾淨之後,它後續的 yield 又一格一格把舊內容畫回去,看起來就像重置沒生效。 修法用 Gradio 原生 cancels:按「確定回首頁」時直接中止「確認並開始分析」與 「略過」那兩條事件鏈(兩者都會進同一支 _run_computation),generator 停在 原地,不再有遲到的 yield。為了拿得到那兩個事件物件,reset_confirm_btn 的 接線從原位置搬到 create_app 結尾(Gradio 接線順序不影響行為,只有 cancels 需要引用先前建立的事件)。 順帶修掉查證時發現的另一個殘留:結果導覽的 A2 閘門(語言指標分析/統計四項/ LLM輔助分析)在 _populate_tabs 產出結果時被打開,但重置從來沒關回去——重置 後回到全新首頁,那些項目仍可點,點進去是空白結果頁。已在 on_reset_clear_workspace 一併設回 interactive=False。 驗證(本機 .venv + Playwright): - 中途重置:運算啟動 3.5 秒後按回首頁→確定,再等 12 秒讓遲到的 yield 有機會 出現——首頁正確顯示、工作區隱藏、無分析面板、對話 0 則、步驟列清空; 重新進入工作區後:研究選擇卡片正常、無面板殘留、步驟列回到未完成狀態、 對話只有歡迎詞、下載捷徑不在、語言指標分析與敘述統計皆不可點、 技術執行紀錄只剩「已重新開始分析」。 - 正常流程不受影響:重跑一次完整分析,指標計算/統計分析完成、導覽閘門 正確開啟、下載捷徑出現、步驟列正確(報告階段因本機 429 額度用盡標紅, 屬既有的誠實失敗行為)。 - console 僅 3 筆既有外部資源錯誤。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> C…676c5bb -
使用手冊圖示放大到與其他導覽圖示同量體、radio 欄位標籤對齊文字欄位
1. 使用手冊圖示比其他導覽項目小一圈。用截圖逐一量「非背景像素」的實際 上色範圍才確認:book-open 只有 16×15,folder/chat-bubble/table-cells 都是 18×16(viewBox 全部是 24×24,光看檔案看不出差別)。把 path 撐到 x 3.2–20.8、y 4.5–20,重量後為 18×16,與其他項目一致。 assets/icons/book-open.svg 與 _ICON_PATHS 的行內版同步改,並在註解留下 「新增導覽圖示要量上色像素」這條檢查。 2. 「群組數量/比較方式」欄位標籤原本是一般大小的深色字,跟同一張表單裡 「原文標題/作者」的小灰字粗體不同調——radio 的 fieldset 標籤走的是 Gradio 另一條規則。補上 #metadata_zone fieldset.block > span 對齊成 .7rem/700/--c-text-muted,實測兩者現在都是 11.2px/700/#475569。 .7rem 不是新發明的字級,是對齊 Gradio 既有的欄位標籤值,因此不套 --font-size-base(那是內文用的,標籤本來就小一階)。 驗證:情境 3 實測兩處標籤數值完全相同;十個導覽圖示重新量過上色範圍, 使用手冊已與 folder/chat-bubble/table-cells 同為 18×16。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MQuAXWC1hCsiT48TXftPc7502ffd8 -
淺色再調:線條改用次要按鈕邊框色、底色轉淺、白氣泡、語料表單去卡片
千卉四項指定: 1. 導覽列/對話列/內容列的邊線與水平線「改成跟『重新選擇研究情境』按鈕 的邊框色一樣」→ --c-border-strong 淺色改 rgba(2,132,199,.30),就是 button.secondary 用的那個值(實測 nav 分隔線與按鈕邊框已完全同色)。 對底 1.46:1。這是連續第三輪往柔和調,明確離開 WCAG 1.4.11 的 3:1, 屬業主拍板的視覺取捨;文字對比不受影響,仍全數通過 AA。 2. 淺色背景再淺一點 → --c-bg #e8f1fa → #f3f8fd。 3. 對話氣泡改白 → --c-bubble-bg 淺色 #ffffff(深色 #172136 不動)。 氣泡與欄底填色差剩 1.07:1,邊界改由 --c-bubble-border 撐(淺 1.69:1、 深 1.61:1,兩邊同一級)。 4. 語料說明表單去卡片: - 原文標題/作者/語言/出版年/版本:移除 Gradio 自動包的白色卡片。 這層卡片是兩件事疊起來的——.form 出框線、內層 .block 出白底與內距—— 兩層都要清才會消失。內距清掉後欄位左緣自然對齊小標題與下方表格, 達成業主要的「參考群組層資訊、水平橫列、靠左對齊」。 - 比較結構:gr.Group 改 gr.Column,Gradio 那條藍色標題橫幅與外框跟著 消失,標題自動變成跟「原文資訊」同款的藍色小標題。順帶符合本專案 既有定論——這版 Gradio 的 gr.Group 設 visible=False 只清空內容、 容器仍是 display:flex 會留空色塊,可切換的容器一律用 gr.Column。 已實測情境 1(不需要比較結構)該區塊 display:none、高度 0,無殘留。 - 群組數量/比較方式:同批去掉白底與內距。 順帶修掉一個既有 bug(業主截圖裡就已存在,不是這批造成):那兩組 radio 的選項被裁掉一半。真因是 .form 的 align-items:stretch 把每個欄位的高度 鎖成整列高度,而那個列高只算到選項區(61px)、沒算欄位標籤(20+8px), 多出來的 28px 被 fieldset…b1b0036 -
淡藍底色體系:降低純白/純黑面積,深淺共用三層結構
千卉回報「純黑或純白背景面積很大,整個視覺壓力也變大」,並指定淺色走 「氣泡淡藍+對話欄底稍深淡藍」(她的方案 2)、深色邏輯相同。量過之後 確認抱怨來源不只對話欄:淺色頁面底 #f8fafc 幾乎等於白,真正的大面積 純白是 --c-surface(表格資料列+所有 Gradio 區塊);深色則是 #020617 近乎純黑。 底色改成三層,淺深共用同一套邏輯: 底(--c-bg) 淺 #f8fafc→#e8f1fa 深 #020617→#0b1424 浮起物(--c-bubble-bg)淺 #eef2f7→#f5faff 深 #0d1526→#172136 資料紙張(--c-surface)淺 #ffffff 維持 深 #0d1526→#172136 淺色的表格/卡片刻意維持純白:75 項指標表格是資料密集區,可讀性優先於 「消滅所有純白」;染藍的是它下面那層底,白表格因此變成浮在淡藍上的紙張。 連帶 --c-surface2/--c-thead-bg/--background-fill-secondary 同批換成 同色相的值,避免藍底配灰塊。 線條改走 sky 相(千卉:淺色邊框不要太深,要維持亮麗的淺藍): --c-border-strong #a3aebd→#6ba3d6(結構線,約 2.3:1) --c-divider #b6c0cd→#a9cbe8(表格資料列細線) --c-input-border #a3aebd→#7fb0d9(約 2.0:1) 亮度級距不動,只換色相,手感與上一輪柔化後相同。 順帶修掉一個自己上一輪引入的深淺不一致:氣泡邊框原本共用 --c-divider, 淺色值卻是對著「深色結構線那一級(alpha .28)」挑的,而深色 --c-divider 是更淡的 .18,實測深色 1.37:1/淺色 1.61:1,兩個主題看起來不一樣。改成 獨立 token --c-bubble-border(淺 #a9cbe8、深 rgba(148,163,184,.26)), 兩邊實測都是 1.61:1,--c-divider 也回歸單一用途。 docs/design.md 同步:新增「底色體系:三層」章節(含淺色表格為何維持白底 的準則)、線條表換新值並補「淺色一…3dc69f8 -
業主第四輪修改:淺色對比度、AI 頭像、下載位置、使用手冊
1. 淺色模式對比度(深色維持原樣) 新增兩級線條 token:--c-border-strong(結構線,淺色 #7c8798,對白 3.64:1、對近白底 3.2-3.5:1)與 --c-divider(表格資料列細線)。深色值 沿用原本散在 .app-header/欄邊框/標題底線各處的 rgba(148,163,184,.28) 硬寫值,那批個別覆寫規則一併刪除。三個 token 宣告點(app.css :root/ .dark、app_agent.py _DARK_MODE_HEAD_CSS)同步。 對話氣泡:淺色底改 --c-bubble-bg #eef2f7(原本白底疊欄底只有 1.07:1) 並加 1px 結構線邊框。表格表頭底改 --c-thead-bg #e2e8f0、表頭分界線改 結構線。輸入框邊框(淺色)從 1.3:1 改 3.6:1。 2. AI 對話氣泡加頭像 gr.Chatbot(avatar_images=(None, ai-avatar.svg)),28px 圓形。漸層畫在 CSS 的 .avatar-container(吃 accent token、隨主題切換),SVG 檔只放 白色四角星——avatar_images 是 Python 端參數,同一個檔沒辦法隨主題換色。 3. 語言指標分析的下載區塊移到表格下方,與其他五個結果頁順序一致 (純宣告順序調整,_TAB_IDX 位置對應不動)。 4. 左側導覽列最後加「使用手冊」下載項目 放在 result_nav_col 外、nav-items-scroll 最末,全程可見;接專案根目錄 既有的 使用手冊.docx(實測下載 41783 bytes 一致,不用改 allowed_paths)。 它是下載動作不是頁面,不進 _ALL_NAV_IDS,不搶導覽 active 狀態。 #nav_guide_btn 比照 #reset_btn 加進導覽列樣式與收合狀態的選擇器清單。 順帶讓 result_nav_col 只佔內容高度(Gradio 預設 flex:1 1 auto 會把它 撐滿、把使用手冊推到欄底)。 docs/design.md 同步:兩級線條準則、對話氣泡…f5990cb
-
修進工作區後左側導覽列消失、技術執行紀錄空白缺標題、下載捷徑提早缺件三個 bug
- result_nav_col/canvas_exec_col 第一次從 visible=False 翻 True 時, Gradio 前端只認觸發它的 generator 第一個 yield 才會真的掛進 DOM; on_start_analysis_show 原本延到第二個 yield 才設,導致「開始研究 分析」後左側導覽列只剩「回首頁」、硬點技術執行紀錄也是空白。搬到 第一個 yield,比照 on_scenario_pick 已驗證可行的寫法。 - 技術執行紀錄頁補上獨立的靜態標題,不再依賴逐行累加的 log 內容。 - 下載研究報告/下載完整分析資料兩顆導覽列捷徑,改成等 LLM 報告階段 真正跑到終態(done/failed)才生成與顯示,避免報告還在寫的時候就 把缺件的 zip 遞出去。b9619ff -
修正空狀態提示的過時頁名,統一六顆結果頁下載鈕的命名
兩處都是改版過程中因為導覽項目改名、而文案沒有同步造成的殘留,各改 一行字串,不動任何邏輯。 _EMPTY_HINT(app_agent.py:1837):結果頁在資料尚未產出時提示「請先於 「主頁」完成分析流程」,但左側導覽列上沒有任何叫「主頁」的項目,對應 的是「AI對話」,使用者照著找不到入口。文案改為「請先於「AI對話」完成 分析流程」,與導覽項目名稱一致。 結果頁下載鈕命名(app_agent.py:3042、3111):四個統計子頁用「下載+ 該頁名稱」(下載敘述統計/下載差異性分析/下載監督式學習/下載非監督 式學習),但語言指標分析那顆是「下載檔案」、LLM 輔助分析那顆是「下載 報告」,使用者切換頁面時無法從按鈕文字判斷拿到的是哪一份。依專案既有 的主流命名規則(六顆中四顆已是此形式)統一為「下載語言指標分析」與 「下載LLM輔助分析」。 文件同步:兩項從「已知待修正」升格為第二章的修復項目,第二章由 13 項 增為 15 項(2.2 三項增為四項、2.3 四項增為五項),總覽表數字一併更新。 驗證:AST 解析通過;grep 確認三處字串已改、六顆下載鈕標籤全部一致。 瀏覽器實地渲染尚未驗證,見 commit 說明外的回報。29017e5
-
分析運算面板加上「請保持前景、電腦勿休眠」提醒文字
低風險緩解措施,對應開發優化建議.md第一節提到的連線中斷問題:系統 目前沒有連線中斷後恢復進度的機制,先用文案提醒使用者在看到「分析 完成」前不要把分頁切到背景或讓電腦休眠。只在任一子階段status為 running時顯示,全部done/failed後自動隱藏,不干擾完成後的畫面。 Playwright 驗證:情境1(略過Metadata路徑)跑一次完整分析,提醒文字 在運算期間正確顯示、分析完成後正確消失,無 console/server error。686c7cd -
修回首頁重置後語料 Metadata 表單欄位殘留上一輪內容的既有 bug
Phase 11 回歸測試(情境3→情境4)時發現:原文標題等自由文字欄位、 群組數量/比較方式單選,重置後從未被清空過——這幾個 Gradio 元件值 獨立於 state 之外,on_reset_confirm 只重建 session_state,沒有任何 地方碰過它們。群組層/個體層表格不受影響(_show_metadata_form 每次 依當下上傳結果整份覆蓋)。 修法:這些欄位的清空動作併入 on_reset_clear_workspace(而非 on_reset_confirm),理由與該函式其餘欄位一致——workspace_row 這時 還可見、子元件仍掛載,update 才會生效。 Playwright 重現:情境3填「原文標題」+選「三群」後回首頁、換情境4 上傳2個檔案,修復前 Metadata 表單顯示殘留的舊標題文字與「三群」, 修復後正確清空、群組數量正確落在對應「二群」。a924456 -
E5:_TAB_OUTPUTS 拆成具名子清單(零行為改變)
原本 37 元素的單一扁平清單改拆成 11 個具名子清單(語言指標分析/敘述 統計/差異性分析/監督式學習/非監督式學習/研究報告/Canvas可見性/ 補的下載按鈕/技術執行紀錄/導覽列下載捷徑/結果導覽閘門)再串接, 方便肉眼對照 index 屬於哪個功能區塊。最終串接後的順序與內容跟原本 逐一相同,13 處呼叫端的 positional tuple 完全不受影響。 Playwright 端到端驗證(情境3,三群比較,含從未測過的 on_metadata_confirm 真實送出路徑,非略過):指標計算/統計分析/報告撰寫全部完成,語言指標 分析/敘述統計/差異性分析/監督式學習/非監督式學習/LLM輔助分析 六個結果頁與下載檔案全部正確顯示,server log 無 error/traceback。83c2682 -
E4:_CUSTOM_CSS 抽成獨立 assets/app.css
原本內嵌在 app_agent.py 裡約 2165 行的 CSS 字串常數,抽成獨立檔案, 改用 app.launch(css_paths=...)(Gradio 6 原生支援,語意與原本 gr.Blocks(css=...) 相同)。app_agent.py 從 6380 行降到 4185 行。 Playwright 驗證:淺色/深色模式畫面與抽出前逐像素一致,console 僅有 既有的 Gradio CDN 預載警告(非本次改動引入)。0a5d32e -
E3:清除 scenario_btn_col 死碼 wiring
Phase 8 留下的空 Column(純為既有可見性 wiring 保留,selection buttons 早已搬到 homepage_col/scenario_select_row),整段移除: - 宣告本身與對應 CSS(.scenario-buttons 相關規則,含收合狀態覆寫) - on_scenario_pick 四個 yield/outputs 清單移除該 output slot - on_reset_confirm 移除該 output slot,回傳 tuple 9→8 個元素 Playwright 驗證:情境選擇(1/3)、格式要求文案、重新選擇研究情境、 回首頁重置後再選情境,皆正常無 console/server error。6ac48e6 -
研究選擇搬回工作區成正式第1步+首頁改版+導覽列/對話區視覺打磨(Batch A-G)
- 3-A:情境選擇從首頁搬回工作區,成為步驟列正式第1步「研究選擇」(_STEPS 3→4步) - 2-B:nav-col 三段式改版、對話圖示改對話氣泡樣式 - 2-C:對話輸入框改常駐隱藏、對話氣泡字級調整為14px - 首頁置中、品牌字標2行1.1rem、頂部列去標題、捲軸懸停才顯示 - 4-B/4-C 導覽列消失、重置殘留等回歸問題修復 - 新增「重新選擇研究情境」返回鈕 - .gitignore 補 .gradio/(Gradio本機憑證快取,比照 .venv/ 排除)698954d
-
LLM 輔助分析頁排版一致化 + 首頁產品名稱重新設計
- 補齊 LLM 報告頁(#canvas_report)markdown 的 h1/h2/h5/h6/表格/水平線/ 引言區塊樣式,原本只有 h3/h4 有樣式,字級與其他頁面不一致、表格吃瀏覽器 預設白框 - 修 .txt 報告開頭 "="*60 分隔線被 Markdown 誤判成 Setext 標題底線、把 研究情境/時間吃成巨大無樣式標題的 bug,改用正規 --- 分隔線 - 加強報告 LLM prompt 格式規範,明確要求用 ##/#### 標題語法而非粗體字充當 標題 - 補齊 .nav-col/.chat-col 右邊框、報告頁標題底線在深色模式下太淡的問題 (沿用 .app-header 之前的修法),並修正 Gradio 對 ".dark A, .dark B" 逗號並列選擇器加容器前綴時的既有 bug(拆成各自獨立規則) - 首頁產品名稱重新設計:「譯彩紛呈:重譯文本分析系統」(系列名稱)降級為 副標,「II 分析引擎 SpectraEngine」(子產品名稱)升級為大標題+漸層字, 頂部工作區標題同步更新 - 「讀取進度」連結視覺上改為 enabled 樣式(功能仍未開發,點擊無作用) Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JpXMpgHnw5YkEfyeUYt4dy2d56ccb
-
語料說明表單:欄位標籤對比度過低、兩張表格未撐滿容器
千卉截圖指出兩點,實測數據: - 「原文標題/作者/語言/出版年/版本」等欄位標籤在深色模式吃到 Gradio 自己 的樣式,實測 #475569、對比僅 2.40:1(AA 標準 4.5),跟旁邊表格表頭「群組 標籤」(#94a3b8、6.92:1)落差明顯。統一成 --c-text-muted,實測 7.11:1 - 群組層/個體層兩張表格沒撐滿:容器內寬 1069,表格只有 1051,右側空 18px (已排除捲軸因素——實測無垂直捲軸)。Gradio dataframe 的 table 寬度依內容 計算,補 width:100%,實測缺口降到 2px(僅剩邊框) 兩條規則都限縮在 #metadata_zone,不影響結果頁那些需要水平捲動的寬表格。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>0b886cd -
修明暗切換在使用者自己的 Chrome 沒作用(Gradio 容器 class 蓋過我的切換)
千卉回報「你開的 Chrome 可以,我自己開的不行,已 Ctrl+Shift+R」。這個差異 正是關鍵線索——追出兩個真因: 1. 切換只作用在 <html>,蓋不過 Gradio 自己的 class Gradio 會依自己的主題設定/系統偵測,在 .gradio-container 上掛 dark class。 CSS 自訂屬性是「離內容最近的祖先勝出」,html.light 蓋不過 .gradio-container.dark,所以點了畫面完全沒變化。我的 Playwright Chrome 是淺色系統、Gradio 不會加那個 class,因此自動測試一直測不出來。 修法:偏好同時套到 html/body/.gradio-container 三處,並在既有 400ms 輪詢 裡持續自我修正(Gradio 重繪會把自己的 class 加回來),沿用本檔既有的 「輪詢自我修正」解法。 2. _effectiveDark() 判斷的是「系統設定」而非「畫面實際狀態」 沒有存過偏好時原本直接問 matchMedia(prefers-color-scheme)。但畫面可能已經 因為 Gradio 而是深色,matchMedia 卻回報淺色 → 第一次點擊算成「要轉深」→ 使用者看到「按了沒變化」。改成先看畫面上真的有沒有 dark class,再退回問系統。 順帶把圖示切換改成結構上不可能壞的做法:兩個 SVG 都常駐 DOM,只用 CSS 依 data-theme-icon 切換顯示,JS 不再改寫 innerHTML(改寫會銷毀重建 <svg>,真人 點擊的 mousedown/mouseup 一旦跨到重建就不會產生 click)。移除已無用的 _MOON/_SUN JS 常數。 驗證方式:手動在 .gradio-container 加 dark class 重現「Gradio 深色」情境(我的 系統是淺色,無法直接複現),實測點擊可正確移除/加回該 class、chat-col 與氣泡 底色雙向切換、輪詢 1.6 秒後不會被搶回去。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>5282a9f -
修對話留白量錯層、明暗鈕真人點擊失效、收合時重置鈕文字未隱藏
對話留白(千卉多次回報「遠超過 16px」,我一直量錯層): - 我先前量的是 .message 這層「看不見的外框」(左16),但真正畫出氣泡底色與 圓角的是內層 .md——.message 的 padding:12px 16px 又把可見氣泡往內推 16px, 疊上 bubble-wrap 的 16px 後,可見氣泡實際落在 32px(使用者氣泡右 33px) - .message 水平內距歸零,可見氣泡才真的落在 16px。實測:AI 氣泡左 16、 使用者氣泡右 17、輸入框白面板左 16 右 17,全部對齊導覽列基準(左16 右17) - 專案筆記早就記過「.md 才是實際視覺邊界」,這次沒照著查,是我的疏失 明暗切換鈕真人點擊沒反應: - _applyThemeIcon() 掛在 400ms 輪詢裡,原本每個 tick 都無條件重寫 innerHTML, 等於每 0.4 秒把裡面的 <svg> 銷毀重建。真人點擊是 mousedown→mouseup 兩個 事件,中間只要跨到一次重建,瀏覽器就不會產生 click——按鈕看起來完全沒反應。 程式化 .click() 不經過 mousedown/mouseup,所以自動測試一直測不出來 - 修法:狀態沒變就不動 DOM(dataset.themeIcon 記住目前圖示) - 已用真人點擊驗證 dark→light 正常切換並寫入 localStorage 收合時「開始新分析」文字沒隱藏、撐破 60px 窄欄: - 前一個 commit 為了統一字級加了 #reset_btn(1,0,0),把收合用的 .nav-col.collapsed .reset-btn(0,3,0)壓掉,font-size:0 失效 - 改成 .nav-col.collapsed #reset_btn(1,2,0)贏回來。實測收合後欄寬 60px、 字級 0、按鈕 43px、無橫向溢出 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>fbf28e3 -
移除上傳區「取消」按鈕(按了會把整個上傳入口鎖掉)
千卉回報兩件事,追出來是同一個根因: - 「點擊上傳檔案似乎沒有作用」 - 「取消按鈕點了整個內容都會消失,沒什麼意義」 取消鈕的行為是 gr.update(visible=False) 把整個 upload_row 隱藏、同時清空 file_input。使用者以為它是「取消這次選檔」,實際是把自己鎖在流程外——畫面 上再也沒有任何上傳入口,看起來就像「點上傳沒反應」。 移除 cancel_btn(宣告、_lock_upload/_unlock_upload 的輸出、click 接線), 確認上傳改 scale=1 獨佔一列。要換檔案在檔案清單逐一按 ×,要重來走 「開始新分析」。 附帶:這次才第一次真正走「點擊上傳」的完整路徑驗證(先前所有自動測試都用 JS 直接塞 input.files 繞過檔案選擇器,等於從沒測過真實點擊)。實測:點虛線框 → 檔案選擇器開啟 → 檔案正確列出 → 確認上傳 → 格式驗證通過 → 語料說明表單 出現,步驟列正確推進。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>e4284d7 -
三欄留白對齊:對話列比照導覽列 16px、Canvas 內容左右等寬
千卉指出各區塊留白不一致(導覽列不動,當基準)。量出來: 導覽列 16/17、對話氣泡 8/-、輸入框 16/17/16、Canvas 標題與結果頁 20/20、 Canvas 上傳卡片等 0/0 對話列(比照導覽列 16px): - .bubble-wrap 水平內距 .5rem(8px) → 16px,AI 氣泡左緣、使用者氣泡右緣 現在都跟導覽列項目對齊(實測 AI 左16、使用者右17) - 輸入框原本就已是 16/17/16,不動 Canvas 內容左右等寬: - 水平內距統一收到 .canvas-scroll(20px,跟 .app-header 的左右 20px 一致), 底下所有內容區塊吃同一份。原本只有 .canvas-result 自己加 20px,而 upload_zone/metadata_zone/分析面板是 canvas-scroll 直屬子項、左右各 0, 同一欄內兩種留白 - .canvas-result 水平 padding 歸零,避免與 canvas-scroll 疊成 40px - 實測上傳卡片由 0/0 改為 20/20,與標題列一致 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>a7a4aa5 -
基礎內文字級一律走 --font-size-base(14px),不再硬寫 rem
千卉指正:全站基礎文字的規範是 14px(0.875rem)且要走 --font-size-base 共用 變數(2026-07-20 決策),但上一個 commit 我硬寫成 .88rem(14.08px),既不是 14px 也繞過了變數。 改回走變數的位置: - 導覽列三處(#result_nav_col .result-nav-btn / --muted / #reset_btn) - 分析面板結論行 .analysis-row-body(.84rem) - 首頁情境卡說明 .sc-desc(.85rem)、讀取進度連結 .placeholder-link(.88rem) - 主要操作按鈕(.92rem) - textarea/input 全域(0.875rem 雖然數值相同但硬寫,改成變數才是單一來源) - 空狀態說明文字(_EMPTY_HINT 內聯 0.82rem) 實測所有基礎內文皆為 14px:導覽列四項、對話氣泡、輸入框、確認上傳按鈕、 情境卡說明、讀取進度連結。 保留硬寫的都是刻意的層級差異、非基礎內文:標題(1.02–2.1rem)、步驟列 pill (0.62–0.72rem)、小徽章(0.78rem)、程式碼與表格輔助字(0.70–0.75rem)。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>fff3334 -
導覽列字級統一、輸入框四邊留白一致(附 WCAG 對比度稽核結果)
千卉指出兩項: - 導覽列字級不一致:技術執行紀錄 13.12px(.82rem)、開始新分析 14px,其餘 14.08px。全部統一成 .88rem/14.08px(以「AI對話」為基準)。技術執行紀錄的 低優先度改只靠顏色與分隔線表達,不再縮小字級;開始新分析要用 #reset_btn 的 id 選擇器才蓋得過 Gradio 的 button.svelte-xxx.secondary(純 class 輸) - 輸入框左/下留白要跟右邊一致:原本 textarea 距欄 左14/右15/下17。統一 full-container 四邊 14px、內層歸零;另修 textarea 只有 67px 但 input-row 是 72px(拿掉送出鈕後留下的槽位高度)造成下緣多 5px —— 讓 textarea align-items:stretch + height:100% 撐滿。實測改為 16/17/17/16(1px 內) WCAG AA 對比度稽核(ui-ux-pro-max skill;對執行中實機量測,非套通則): 淺色與深色兩個主題、9 個關鍵文字元素全部通過 AA - 淺色 7.24–14.63:1、深色 7.87–14.78:1(導覽項目、對話氣泡、輸入框 placeholder、分析面板、步驟列、exec log) - 唯一紅字「品牌字標 1.00:1」是量測假象:漸層文字用 -webkit-text-fill-color:transparent,computed color 讀到透明。改用截圖 取樣實際筆畫像素,實測 6.17:1,通過 AA - disabled 導覽項目刻意維持低對比(opacity .38),符合 skill 的 disabled 狀態指引,WCAG 亦豁免 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>d244f31 -
修收合圖示被擠成8px、輸入框留白與可輸入、exec對齊標題、深色分界線
收合導覽圖示看不見(真因是尺寸不是顏色):實測圖示在收合狀態只渲染成 8px。 60px 欄寬扣 nav 的 16px 左右內距剩 28px,再扣按鈕 .6rem 內距(19.2px), 留給圖示僅 ~9px,而 img 是 flex 子項預設可壓縮,就一路縮到 8px。修法三件: 收合時欄內距縮 8px(展開仍 16px)、按鈕內距 .6→.45rem、圖示 flex:none 不可壓縮;尺寸 20→22px、opacity .82→1。實測四類圖示皆 22px、清晰可辨。 對話輸入框(#15): - 下方 61px 空縫:輸入框原本 flex:1 佔 1/7 欄高(153px)但內容只佔一小塊。 改 flex:0 0 auto 縮到內容高度、對話視窗改 flex:1 1 auto 吃掉剩餘,縫隙歸零 - 左右不對稱(左14/右18):Gradio 內層 full-container 12px + input-wrapper 右 4px。統一 full-container 對稱 10px 12px、input-wrapper 歸零 → 左右各 14 - 改 interactive=True:可打字(雖然目前不接任何作用),實測輸入正常 技術執行紀錄對齊標題(#16):.exec-log 水平 padding 歸零——canvas-result 已提供 1.25rem 讓內容與標題齊平,這裡再加 .75rem 會把文字推遠 12px。實測標題與 log 文字皆 256px 對齊 深色模式分界線看不清(#17):.app-header 底線在深色是 --c-border rgba(14,165,233,.11),疊在深色底幾乎不可見。深色改 rgba(148,163,184,.28), .dark class 與系統深色媒體查詢兩條路都覆蓋 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>bccc625 -
對話欄仿 Claude 重做 + 收合 icon 提亮 + 結果頁左留白統一 + 報告失敗文案
對話欄(仿 Claude,千卉逐項標註): - 對話視窗貼齊欄邊:.main-chat 拿掉外框、圓角、白底(改透明吃欄底), .bubble-wrap 底色透明 - 對話氣泡改白:.md 底色 --c-surface2→--c-surface(淺色=白、深色=#0d1526 比欄底 #020617 淺一階浮出) - chat-col 給底色 --c-bg 當氣泡背板,gap 1rem→0(消對話視窗與輸入框間隙), 右側分隔線保留 - 輸入框貼齊:.upload-zone-plain 去邊框/圓角/內距/上方 margin;textarea 底色 同氣泡、去框去圓角;頂端 1px 細線跟對話視窗分界 - 移除送出鈕:gr.MultimodalTextbox(submit_btn=False) 收合 icon 提亮(item 13):收合成 icon bar 時只剩圖示,img.button-icon 預設 opacity:.82 偏淡(回報「看不見」),收合狀態拉到 1;disabled 項目的淡化來自 按鈕本身 opacity:.38 不受影響 結果頁左留白統一:水平內距集中到 .canvas-result(1.25rem)、.tabitem 水平歸零, 「語言指標分析」頁(無 tabitem、原本貼左緣)與統計頁對齊(實測 top/left 皆 42/20px 一致) 報告失敗文案(千卉:加人話但保留原文):分析面板報告失敗那行改「報告產出 失敗,請稍後再試或聯繫管理員。(技術訊息:...)」 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>4475e9e -
導覽/標題一致性與明暗切換:名稱統一、時間戳、填色選取、字標、主題鈕
item 1:三結果頁標題上方留白統一(實測 idx 42px、統計子頁 66px→歸零 .tabitem 上 padding 對齊 42px) item 2:頁面標題統一用導覽名,方法名降副標——「指標計算結果」→語言指標 分析、「隨機森林分類結果」→監督式學習(隨機森林分類)、「集群分析結果」 →非監督式學習(集群分析)、「LLM 輔助研究報告」→LLM 輔助分析 item 3:技術執行紀錄行首從像按鈕的 `›` 方框改成時間戳 [HH:MM:SS](台北時間), 明顯不可點、兼具「每步幾點跑」的診斷資訊 item 4:分析面板「統計分析」段的入口從單一「查看統計比較分析」(導覽列已無 此傘狀項、會跳到敘述統計造成混淆)改成四個查看連結,對應四個平列子頁 5-A:導覽列上下左右統一 16px 留白;頂端列原本被 gr.HTML wrapper 的 12px 預設 padding 多縮(收合鈕右緣距框 29px),歸零後全部對齊 16/17px 5-B:導覽項目改 ChatGPT 式填色互動——hover 淡主色底、按下更深、選取淡主色 底+主色文字+圓角(取代原本 Bootstrap nav-underline 左緣線);disabled 項目灰階不反應 5-C:nav-col 頂端加漸層「SpectraEngine」純英文字標(仿 Claude 側欄),canvas 頂部維持中英文完整版 5-D:「開始新分析」與頂端列間距拉近——真因是 scenario_btn_col 空 Column 的 flex gap 撐開,直接 display:none 消掉(也順手做掉部分 E3 視覺債) 5-F:新增明暗切換鈕(收合鈕左邊)。點了在 <html> 加 .dark/.light 覆蓋系統 預設並記進 localStorage,首頁也吃得到;sun/moon 圖示隨當前主題切換。 收合成 icon bar 時字標與切換鈕隱藏(60px 塞不下),展開才出現 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>029b44b -
運算階段重構:步驟列收斂3步、分析運算內容區塊、誠實失敗、導覽閘門、多項修正
步驟列 6→3 步(C2/C3):文本上傳/語料說明/分析運算 - 移除「格式驗證」:它在任何靜止狀態都不停留(通過時同 generator 內連續 完成、失敗時退回文本上傳要求重傳),逐行細節仍在技術執行紀錄 - 合併「指標計算/統計分析/報告產出」成單一「分析運算」:三段是同一個 generator 依序跑完、中間無使用者操作關卡 分析運算內容區塊(_build_analysis_html,取代 computing_html 的單行提示) - 運算中顯示三子階段進度+轉圈動畫,運算後變分段摘要(標題+狀態+一句 結論+查看入口);報告失敗時該段顯示 ! 並說明其他結果不受影響 - 每段「查看…」入口純 JS 橋接,點了等同點左側對應導覽項目 - state 新增 analysis 子階段追蹤,由 pipeline 邊跑邊寫 A1 誠實失敗:報告撰寫失敗不再標「全部完成」+✓ - pipeline 明確標記各子階段 done/failed;任一失敗 → 分析運算步驟標紅、 總結文案改為「分析完成(研究報告未產出)…指標與統計結果均已完成」 - WARNING 進對話區(原本只進技術執行紀錄,使用者看不到) A2 結果導覽閘門:語言指標分析/統計四項/LLM輔助分析預設 disabled,由 _populate_tabs 依各結果是否真的產出逐一啟用(報告失敗時 LLM輔助分析維持 灰的,是失敗的第二道確認);AI對話與技術執行紀錄不在此列 C4:完成後步驟列不再隱藏(改互斥頁面模型後,隱藏會讓 AI對話頁整片空白, 分析運算內容區塊現在填滿 Canvas) C1:統計比較分析 Canvas 內的分頁列隱藏(與左欄四項重複)。踩坑兩種隱藏法 都失敗——display:none 讓 .click() 不觸發切換;clip/縮 1px 觸發 Gradio 溢出 邏輯把分頁全塞進 overflow dropdown。正解:保留 width:100% 只用 height:0+ opacity:0 視覺隱藏 B1 修 loading 圓圈:border 簡寫在這版 Gradio 不生效,拆長寫法 B2 關掉 Gradio .generating 呼吸藍框(頂部列與內容區塊各一個,礙眼) B3 下載捷徑分隔線+四顆按鈕包進 n…f2c94db -
確認框改置中 modal、移除統計比較分析手風琴、整包下載按鈕改名
「開始新分析」確認框(千卉指定): - 從 nav-col 內嵌卡片改成全螢幕半透明深灰遮罩 + 水平垂直置中的橫式對話框 - 元件搬到 workspace_row 外層是必要的,不是順手:nav-col 在手機寬度是 position:fixed + transform 的抽屜,被 transform 的祖先會讓子孫的 position:fixed 改以該祖先為定位基準,對話框會被關在抽屜裡 - overlay 刻意不設 display:Gradio 的 visible=False 就是靠 display:none 生效,寫 display:flex !important 會把隱藏本身蓋掉。改用「維持 Gradio 給的 flex 排版 + 面板 margin:auto」達成置中 - 深色模式另給 rgba(0,0,0,.62):頁面本身已是深色,同一階深灰疊上去看不出 被壓暗,遮罩形同不存在 - 補上點遮罩關閉與 Esc 關閉(沿用手機抽屜既有的互動慣例) - 移除 8-E 的「收合狀態下點重置先自動展開 nav-col」變通,該變通存在的理由 (彈窗會擠在 60px 窄欄)已隨 modal 消失 移除「統計比較分析」手風琴(千卉指定:標題文字與收合效果都不要): - 四個子頁改成跟其他導覽項目平列的一般項目 - 原本那一列兼任 stat 頁的 active 指示器,拿掉後改由使用者實際點的子項目 自己標 active:applyActivePage() 多收 navId 參數,結果記在 data-nav, 讓每 400ms 的 _reapplyActivePage()(不帶 navId)不會把 active 清掉 - 連帶移除 #nav_stat_accordion 與 .result-nav-accordion 整組死 CSS 整包下載按鈕改名「下載完整報告」→「下載完整分析資料」(zip 檔名同步), 原名與「下載研究報告」字面過於接近,分不出哪個才是報告本文。 修掉一個自己剛引入的 bug:Esc 關閉對話框原本用 offsetParent !== null 判斷 可見性,但 position:fixed 元素的 offsetParent 永遠是 null,會判成「沒開」, Esc 永遠關不到。改讀 computed…89ca669 -
新增整包下載:導覽列四顆下載捷徑 + beforeunload 防手滑 + 修復重置後情境卡片失效
整包下載(需求文件缺口 1,原訂只做假按鈕,改為直接實作完整後端): - 新增 _ZIP_GROUPS/_make_result_zips(),把產出分成指標數據/統計圖表/ 研究報告/完整分析結果四包 zip - 呼叫點放在 _populate_tabs 而非運算流程:結果頁提供下載的是改過名的 複本(TransPrism_LLM Report_*.docx)且刻意排除原始 .txt,重新命名就 發生在 _populate_tabs 裡,在那裡打包才能保證 zip 內容與使用者在頁面上 看到的檔案一致,也不用把「哪些檔案是給使用者的」寫兩遍 - 內容為空的那包不產生,對應按鈕就不出現(LLM 報告失敗時「下載研究報告」 不會亮出來);只有一組有內容時不另外產生整包,避免兩顆按鈕內容一樣 - nav-col 底部新增四顆 gr.DownloadButton,接在 _TAB_OUTPUTS 尾端 26-29 - _populate_tabs 開頭明確把這四顆設回隱藏:其他結果元件都住在 canvas_*_col 裡,重置時整個 Column 被藏起來看不到殘值;這四顆住在 result_nav_col, 而它會在下次選定情境時重新顯示,不歸零的話上一輪的 zip 會跟著冒出來 - state 的 zip_path(從專案第一天就只被初始化成 None)改成 zip_paths 字典 - 新增 download.svg(照既有規格:24x24、stroke #475569、stroke-width 1.75) 防手滑: - 工作區顯示期間掛上 beforeunload,回到首頁自動解除 - 兩個瀏覽器層面的限制寫進註解:需先與頁面互動確認框才會出現、提示文字 無法自訂 順帶修復測試中發現的既有 bug(已用 git stash 在原版程式碼上重現確認,非本次 改動造成):按「開始新分析」回到首頁後,情境卡片點了完全沒反應,必須重新 整理頁面才能再選,等於 Bug1「選錯情境無法變更」的修復只有一半。根因是 homepage_col 設成 visible=False 時 Svelte 會銷毀整個子樹而非加 display:none, 重新顯示時是全新節點,原本掛在 #homepage_scenario_grid 上的 listener …ab5ce10 -
步驟列收斂 8 步 → 6 步 + 導覽列與頁殼視覺調整
步驟列: - _STEPS 改為 文本上傳/格式驗證/語料說明/指標計算/統計分析/報告產出 - 移除的 4 步都不帶資訊:情境選擇已搬到首頁、上傳引導與文本上傳在同一個 generator 內連續完成、報告撰寫與下載成果本來就寫在同一行一起標記 - 新增「語料說明」步驟,修正填表期間步驟列誤亮「指標計算 進行中」 - failed_step 5,6 → 4,5;_COMPUTING_STEP_LABELS key 5,6,7 → 4,5,6 - 格式驗證失敗退回重傳時,一併把該步從 done_steps 移除(原本只設 current_step,_build_header_html 判斷順序 done > current,步驟列會停在 「✓ 文本上傳」與畫面要求補傳自相矛盾) - 全部完成後步驟列整條隱藏,只留產品名 視覺: - 頂部列扁平化(去框線/漸層/圓角,只留 1px 下邊框,產品名與步驟列改上下兩行) - .upload-zone/.metadata-zone 去框線/陰影/底色 - .nav-col/.chat-col 各加 border-right - 導覽列改 Bootstrap 5.3 nav-underline 垂直版(選取項左緣 2px 主色線) - 統計比較分析 4 個子頁改一般項目+各配圖示、左緣齊平,手風琴預設展開 - 主項目 .result-nav-btn 改用 #result_nav_col 祖先提高 specificity,蓋掉 Gradio 的 button.svelte-xxx.secondary 預設框線(子項目先前已修,主項目漏了) - 新增 table-cells/scale/academic-cap/squares-2x2 四個 Heroicons 圖示 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>5033f69
-
移除底部「透過API使用/設定」連結列
千卉確認頂部/底部貼齊後決定整個 footer 區塊不需要,footer_links 清空並加 display:none,避免 Gradio 產生空 footer 佔用 flex 高度。26358d8 -
排版重構:徹底清除頂部列/底部連結周圍殘留留白
上一個 commit(9b8d839)只解決了「捲動時被拖走」的問題,千卉重新整理 後回報「上下還是有空白」並附截圖標出頂部/底部兩塊實際留白區域,這次 才是真正把空白清零。 逐層用 devtools 量 computed style 揪出三層獨立成因,缺一個都還會留下 可見空白: 1. `.app`/`.gradio-container` 本身還有上下 padding(16px/24px): 之前為了「左右貼齊邊界」只清過左右方向,這次一併清掉上下方向; `.app-header` 自己的 margin-top(1rem) 也拿掉。 2. 手機漢堡選單的兩個橋接元件(mobile_nav_toggle_html/ nav_backdrop_html):內層內容雖然 display:none,但 Gradio 自動包的 wrapper(帶 "padded" class)本身有約 20px 的空氣行高,即使內容是 display:none 也不會消失,兩個相加 40px。第一輪嘗試用 elem_classes+display:contents 處理,結果沒用——排查後發現這版 Gradio 的 elem_classes 會同時蓋在外層 .block 跟內層 .prose 兩層 div 上(本檔 8-B 就記過這個坑,這次加新元件時忘了套用),兩層 display:contents 疊加沒有真的清零。改用 elem_id 直接鎖定 wrapper、 寫死 display:none,JS 對應方式也從切內層元素改成切 wrapper 本身。 3. 光 display:none 還不夠:wrapper 被 JS 切成 display:block 讓手機 斷點能用時,即使自己 height:0,只要還是「排版流程內」的 flex 子項, 外層 column 的 gap:16px 照樣在它前後插入間距(CSS flexbox 的 gap 只認 display:none/不算 box 高度)——這是全新踩坑類別,跟先前任何 一次 flex-wrap/min-width 的坑都不同源。用 devtools 逐一 display:none 排查(不是用 display:contents …ceffa8f -
排版重構:修正頂部列/底部連結沒有真正置頂置底
千卉實機在 localhost 玩過之後回報:頂部列(D)沒有真正固定在頂端、 底部「透過API使用/設定」連結也沒有固定在底部。 實測用 devtools 沿著 <footer> 往上逐層量 computed style 找到真因: Gradio 原生把 gradio-app/.gradio-container/.app/.wrap 這四層全部 設成 display:flex; flex-direction:column,.wrap 底下正好是「主內容 (.contain)+footer」兩個 flex 子項——結構本來就對,問題是這條鏈 的高度全部是 auto(依內容撐高),不是鎖定 100vh。內容只要比視窗高 一點點,整個外層文件就會跟著捲動,把「該固定」的頂部列/底部連結一起 拖走。 修法:把這條 Gradio 原生就是 flex column 的鏈路鎖死在 100vh, .contain(真正裝 gr.Blocks 內容那層)變成唯一會捲動的區域,footer 用 flex-shrink:0 釘住。完全不用 position:sticky/fixed——8-B 已經踩過 sticky 在 Gradio 自動包的 wrapper 裡貼不住的坑,這次延續「結構性 分離,不依賴 sticky」的既有原則,只是這次分離的是整個頁面殼,不只 單一元件。連帶讓 nav-col 也比照 chat-col/canvas-col 鎖定高度+自己 捲動,避免手風琴展開等情況把 nav-col 撐高、間接逼 .contain 整層捲動。 已用 Playwright 驗證:桌面/短視窗(550px,手風琴展開強制觸發溢出)/ 手機375px 三種情境下 document.documentElement.scrollHeight 都精確 等於視窗高度,完全無外層捲動;nav-col 在短視窗下正確改成自己內部 捲動;首頁/設定面板/reset流程皆不受影響;console 0 error。75fea30 -
排版重構 Phase 3:nav-col 子選單縮排(借 Bootstrap Sidebars 結構)
核心訴求:nav-col 看起來像一排平級按鈕,沒有手風琴/選單的層級感, 尤其「統計比較分析」展開後的4個子項目,只靠 padding-left 撐出縮排、 外觀跟平級按鈕沒有明顯差異。 按千卉要求「用別人做好的、不要自己構想」,這次直接抓 getbootstrap.com/docs/5.0/examples/sidebars/ 官方 Sidebars 範例的實際 原始碼(HTML + sidebars.css)來源,port 其中 .btn-toggle-nav a 這個 子選單樣式的結構規則(margin-left 縮排+margin-top 行距節奏),色彩 字體維持這個專案原本的 token 不換: - 子項目改用 margin-left 真的把整個按鈕往右推(露出縮排空隙、寬度也 跟著縮小到 calc(100% - 1.1rem)),取代原本「滿版矩形只是文字內縮」 的 padding-left 做法,數值比例參照 Bootstrap 原案(margin-left 1.25rem/margin-top .125rem/padding .1875rem .5rem)換算成這個 專案 0.875rem 的字級基準 - 手風琴展開/收合的箭頭旋轉動畫確認是 Gradio Accordion 原生就有 (`.label-wrap.open` + icon 的 inline transform:rotate()),不用 額外實作,省了一部分工 新踩坑:縮窄子按鈕寬度後,Gradio 自己的 secondary 按鈕邊框冒出來蓋掉 `.result-nav-subbtn` 共用規則的 `border:none`——Svelte 編譯出的 scoped 選擇器實測是 `button.svelte-xxx.secondary` 這種 type+class 組合, specificity 比純 class 選擇器高,兩邊都加 `!important` 也贏不了。 改用 `#result_nav_col` 當祖先提高 specificity 才蓋得過去。 已用 Playwright 驗證:子項目正確縮排、無邊框、間距緊湊,讀出巢狀層級 感;子項目點擊功能不受影響(頁面切換正常);桌面收合窄欄模式不受影響 (收合時子選單本來就整組隱藏);「開始…f34eea0 -
排版重構 Phase 2:nav-col 真正的頁面切換模型
千卉確認的核心行為:情境選擇→上傳→格式驗證→Metadata→運算中這段流程 進行中,對話欄常駐顯示;點導覽列任何一個結果類項目(語言指標分析/ 統計比較分析/LLM輔助分析/技術執行紀錄)互斥顯示、收起對話欄、 Canvas 佔滿寬度;點「AI對話」(原「回到上傳/表單」改名)對話欄彈回。 這是全新邏輯,取代 8-C/8-D「有資料就全部堆疊、使用者自己往下捲」的 舊行為(8-C 程式碼註解本來就把這個標成「8-D 待辦」,8-D 當時只做了 捲動+子分頁切換,沒真的做互斥頁面,這次補完)。 - 技術執行紀錄從手風琴(exec_log_accordion)轉正成獨立頁面 (canvas_exec_col),跟其他三個結果頁同一種 visible=True/False 語意, 不再需要 open/label 收合狀態邏輯,_accordion_update/_accordion_label 兩個函式跟著移除;nav-col 新增「技術執行紀錄」項目,跟主要三項用 分隔線+降低視覺權重區隔 - 純 JS 實作(applyActivePage(),_APP_HEAD_SCRIPT):在 .main-layout-row 設 data-page 屬性+chat-collapsed class,canvas-scroll 底下 7 個直屬 區塊按頁面歸屬只清除或強制 inline display:none,絕不強制顯示—— Python 的 visible=False(資料是否存在)永遠優先,沿用 8-E 驗證過的 inline style 優先權技巧。延續這批 nav 按鈕「刻意不接 Python .click()」 的既有設計原則,不新增 Gradio queue 往返 - 「開始新分析」reset 流程新增把頁面狀態重置回 chat(.main-layout-row 這個 DOM 節點在 Gradio 重置時不會銷毀重建,data-page 不會自動清空) 兩個新踩坑: 1. Gradio 的 Svelte reactivity 在元件 visible prop 改變時會整個重寫 inline style(不是疊加,是覆蓋),把 JS 手動加的 !important 覆寫 一併洗掉——運算完成那一刻 canva…b234dbb -
排版重構 Phase 1:四邊留白/三欄比例/輸入框多行/頂部列精簡
千卉用參考圖比對現況後逐項定案的版面調整(大範圍改動的第一階段, 先做低風險、互相獨立的項目): - 四邊留白:真因不是原本猜測的 .contain wrapper padding(devtools 逐層 量測後排除,那層 padding 早就是 0),是 Gradio 的 .app 元素被設了 max-width:1280px + auto 置中 margin,改成 max-width:100% + margin 歸零 - 三欄比例 nav:chat:canvas 從 2:4:7 改成 2:3:7 - 對話輸入框 lines=3 變成真正多行 textarea;對話視窗跟輸入框改用 flex-grow(6:1)依可用高度動態分配,不寫死 px,實測比例約 5.4:1 - 頂部列(app-header)從三行大標題+額外進度條精簡成單行產品名+步驟列, 拿掉進度條(跟步驟列的已完成/進行中/失敗三態是重複資訊) A/B/D 三欄頂端對齊問題:實測 devtools 確認三欄 DOM 頂端本來就是像素級 對齊(皆 top:73px),不是 CSS bug,是 nav-col 第一個項目沒有卡片邊框 (收合按鈕裸露),視覺上比相鄰有邊框卡片的欄位「感覺」低,留給下一階段 nav-col 視覺重做時一併處理。 已用 Playwright 驗證:三欄邊界貼齊、輸入框可打多行且高度比例正確、 頂部列精簡且無進度條、reset 流程正常回首頁無殘留,首頁本身不受 .app 這個全域選擇器改動影響。6f0ed7a -
Phase 8-E:nav-col 桌面收合 icon bar + 手機漢堡抽屜
nav-col 收合成窄 icon bar(桌面,60px,localStorage 記住狀態)與 off-canvas 抽屜(手機 ≤900px,漢堡鈕開/X、背景遮罩、Esc 都能關)。 提前補上 Heroicons 風格圖示(plus/home/trending-up/document,assets/ icons/*.svg + gr.Button(icon=);統計比較分析用 CSS ::before 掛 chart-bar,Accordion 沒有 icon 參數)——因為收合後純文字按鈕沒有圖示 會看不懂,跟千卉確認後決定把原訂「下一輪視覺打磨」的圖示需求提前 到這次一起做,範圍限縮在 nav-col 這批新按鈕。 gr.Button(icon=) 這版 Gradio 是渲染成 <img>,不是行內 svg,深色模式 用 filter 反相+去彩處理(img 不吃 currentColor)。收合狀態下重置 按鈕若被點擊,JS 會先自動展開 nav-col 再顯示確認彈窗,避免彈窗擠在 窄欄裡;nav-col 原本 gr.Column(min_width=200) 的 inline min-width 需要 額外用 !important 覆寫才能真正收窄(min-width 優先於 max-width)。 已用 Playwright 驗證 375/768/900/1024/1440 五個斷點無跑版無橫向捲動、 淺色/深色模式圖示皆正常、桌面收合展開/手機抽屜開關四種關閉路徑 (X、背景、Esc、點導覽項目自動關)、重置流程收合狀態下正確自動展開。3ced5f9
-
Phase 8-D:左側結果導覽 + 運算中提示
- 新增 result_nav_col(回到上傳/表單、語言指標分析、統計比較分析+4個 子按鈕、LLM輔助分析),情境選定後顯示。這幾顆按鈕不掛 Python .click(),純粹是捲動到 Canvas 對應區塊+切換巢狀子分頁的畫面操作, 改用跟首頁情境卡片同一套 _APP_HEAD_SCRIPT JS 注入手法處理,不用走 Gradio queue 來回 - 新增運算中提示:單一 gr.HTML(elem_id="computing_zone") 元件,空字串 即不顯示,判斷邏輯比照既有 _accordion_update(current_step 在 5/6/7 之間),接在 _run_computation/on_metadata_confirm/ on_metadata_skip 既有呼叫點旁邊 - 圖示(Heroicons SVG)與 nav-col 下載捷徑延後到下一輪視覺打磨,這次 先用純文字標籤把功能做對 修復兩個真實 bug: 1. JS 綁定時機:result_nav_col 建構時 visible=False,不能像 bindScenarioCards() 用 setTimeout 固定時間點抓按鈕(同 8-A 的 sc_btn_1..4 踩過的坑),改用 document 事件代理,不管元件何時掛載 都能正確處理 2. 全站沿用的 .tabs > .tab-nav 選擇器在目前這版 Gradio 完全不會命中 (實際 DOM 是 .tabs > .tab-wrapper > .tab-container:not(.visually-hidden), 用 devtools 逐層排查後才發現),導致巢狀子分頁的 JS 切換與字級 CSS 都失效。已修 #canvas_stat 相關的巢狀分頁部分;全站分頁列的 sticky/ 背景/hover/選中底色那組(可能從寫下來就是死規則)留給下一輪視覺 打磨處理,已加註解標記 已用 Playwright 驗證:情境1完整跑一次分析,運算中提示 3 階段文字依序 顯示並在完成後清空;點擊監督式學習子按鈕同時完成捲動+切換巢狀分頁; 開始新分析 reset 後正確清空無殘留。 Co-Authored-By: Clau…ac51b6c -
工作區改滿版貼齊左右邊界
三欄式工作區(nav-col/chat-col/canvas-col)原本因為 .gradio-container 的 max-width:1680px + margin:0 auto 而在寬螢幕上兩側留白置中,千卉 希望左側導覽列貼左邊界、右側 canvas 貼右邊界。 改法:.gradio-container 拿掉 max-width 上限與 margin:0 auto,改 width:100%、左右 padding 歸零;另外用 devtools 逐層排查發現 Gradio 自己內建的 .app wrapper(class="main fillable app")固定帶 32px 左右 padding,不是我們設定的,一併歸零才能真正貼到邊界。 首頁 .homepage-col 有獨立的 max-width:50rem + margin auto 置中,不受 影響,寬螢幕上仍維持舒適閱讀寬度。已用瀏覽器截圖確認兩種畫面(首頁/ 三欄工作區)皆符合預期。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>5acbd5a -
修復標題漸層文字消失 bug(background 簡寫解析失敗)
「譯彩紛呈:重譯文本分析系統」標題(首頁 .homepage-hero h1 與 Canvas .app-header h1/.subtitle/.subtitle-3)用 background-clip:text 做漸層 文字效果,實機測試發現偶爾整個消失、要反白選取才看得到。 真正根因:這幾條規則原本用 background 簡寫(shorthand)搭配多個裸 var() 當漸層色標+!important,瀏覽器把簡寫展開成子屬性時 background-image 解析成空值(用 devtools 直接讀 CSSStyleDeclaration 證實),導致沒有底色可畫、文字又是 transparent,視覺上等於標題消失。 不是 Gradio css= 管線問題(head 注入的版本一樣會踩到),也不是 repaint/合成層問題(試過 transform:translateZ(0) 無效)。 修法:不用 background 簡寫,直接寫 background-image 這個子屬性本身, 跳過簡寫展開的解析路徑。已用瀏覽器 devtools 即時修改驗證、再改寫進 原始碼後乾淨重啟伺服器複測,首頁與 Canvas 標題皆穩定顯示漸層。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>0a09171 -
Phase 8-C:結果內容從 tab2/tab3/tab6 遷移進 Canvas
- 外層 gr.Tabs() 與 tab2/tab3/tab6(gr.Tab)拿掉分頁包裝,改成 canvas_idx_col/canvas_stat_col/canvas_report_col 三個 gr.Column, 搬進 canvas-scroll(upload_row/metadata_row 之後、 exec_log_accordion 之前);canvas_stat_col 內部維持原本巢狀 gr.Tabs()(敘述統計/差異性分析/監督式學習/非監督式學習 4 子頁不變) - 首頁 gr.Tab("主頁") 包裝一併拿掉,改用純 with 區塊,首頁不再顯示 「主頁」分頁標籤 - _TAB_OUTPUTS/on_reset_confirm/reset_confirm_btn.click 的 tab2/tab3/tab6 引用改指向新 Column - 修復兩個真實 CSS bug: 1. 巢狀子分頁字級規則原本靠 .tabitem 祖先跟全頁分頁列區分,外層 gr.Tabs() 拿掉後祖先消失、選擇器失效,改用 #canvas_stat 的 elem_id 精準定位 2. exec_log_accordion 搬進 canvas-scroll(flex column)後被壓縮成 只剩標題列高度:flexbox 規範規定 flex 子項只有 overflow:visible 時才用內容高度當自動最小高度下限,Gradio 幫 Accordion wrapper 加的 inline overflow:auto 觸發下限歸零。修法: .canvas-scroll > * { flex-shrink:0 !important; } 已用 Playwright 完整驗證:情境1 上傳→格式驗證→Metadata 略過→運算 完成,語言指標分析/統計比較分析 4 子頁(含監督式/非監督式學習下載 按鈕)皆在 Canvas 正確顯示+下載;LLM輔助分析區塊因本機無 API key 正確維持隱藏(非本次迴歸);開始新分析重置正確回到全新首頁。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>f063fb7 -
Phase 8-B:nav-col/chat-col/canvas-col 三欄式工作區
workspace_row 從原本 chat-col(scale6)+action-col(scale4) 兩欄改成 nav-col(scale2,固定窄寬)+chat-col(scale4)+canvas-col(scale7)三欄: - nav-col:開始新分析/確認彈窗、scenario_btn_col(空,留給wiring相容);結果 導覽留給 Phase 8-D - chat-col:chatbot+chat_upload(常駐輸入框),exec_log_accordion 搬出 - canvas-col:頂部步驟列(app_header_html,原本在全頁最上方、首頁也會看到, 現在只在 workspace_row 顯示後才出現)+canvas-scroll(新增的捲動子容器, 裝 upload_row/metadata_row/exec_log_accordion) 過程中排查並修好三個真實 CSS bug(皆已寫入程式碼註解,供之後參考): 1. canvas-col 內容一度水平位移一整欄寬度——根因是 Gradio 的 .column 預設 帶 flex-wrap:wrap,一旦父層設固定 height,排不下的子元件會往右開新欄 而非垂直捲動;修法:flex-wrap:nowrap。 2. 連帶補上 overflow-x:hidden + min-width:0(flex 子項防撐爆,見程式工作 守則13.1)。 3. 步驟列想用 position:sticky 貼在 Canvas 頂端,但 Gradio 自動包的 wrapper 高度只比步驟列本身高一點點,sticky 的可移動範圍被那層 wrapper 框住, 捲動超過那一點高度就整個跟著捲走。改用結構性分離:步驟列留在 canvas-col 本身(不捲動),另外包一層 canvas-scroll 才是真正捲動區。 已用 Playwright 完整驗證:三欄正確渲染、對話/Canvas 各自獨立捲動不互相 干擾、步驟列全程固定可見、上傳→格式驗證→Metadata 表單全流程正常、開始 新分析可正確返回首頁。b1088c8 -
修復格式要求文字與拖放上傳框間距過遠
同一個根因的第二次踩坑:Gradio 把 elem_classes 同時蓋在外層 wrapper (.block.upload-hint)跟內層 markdown 內容(.prose.upload-hint)兩個 div 上,裸的 .upload-hint 選取器設 padding/margin 會在兩層各套一次、疊加成 雙倍間距。改成只在 .block.upload-hint 設定版面間距,.prose.upload-hint 明確歸零,字級類不影響版面的規則維持用裸 .upload-hint。 已用 Playwright 截圖確認間距恢復正常。9280581 -
移除對話視窗左上角「對話視窗」標籤
千卉截圖回饋:chatbot 元件的 label 拿掉,改用 show_label=False。34fbe4b -
上傳卡片文案與版面微調(千卉截圖回饋)
1. 修掉 .upload-hint 雙重水平線 bug:Gradio 把 elem_classes 同時蓋在外層 wrapper 跟內層 .prose 兩個 div 上,CSS border-bottom 因此疊出兩條線; 拿掉 border-bottom,只留 margin 當間距。 2. 四個情境的格式要求(SCENARIOS[n]["upload_prompt"])新增明確的「檔案格式: 僅接受 .txt 純文字檔」條目(原本只在檔名規範的範例裡隱含),其餘項目 跟著重新編號。 3. file_input(拖曳上傳卡片)拿掉 label,改用 show_label=False,跟卡片本身 的「📂 上傳已斷詞文本」標題重複。 已用 Playwright 截圖確認:格式要求下方無多餘線條、新增的 .txt 說明正確 顯示、拖放框不再有多餘標籤文字。7804110 -
上傳機制改回拖曳/點擊上傳卡片,對話輸入框回歸純展示
千卉實測 Phase 8-A 後回頭調整:業主原本設計是拖曳上傳卡片,且對話輸入框 目前沒有其他打字用途,決定上傳正式入口改回 upload_row(Phase 7 保留的舊 元件,處理邏輯完全沒動,只是把可見性開關從 chat_upload_col 換回這裡)。 upload_hint_md(格式要求文字)跟著搬進 upload_row。 chat_upload(MultimodalTextbox)改成永久可見的純展示輸入框,拿掉 sources=["upload"]避免顯示沒有作用的附加檔案按鈕,placeholder 改為 「對話輸入框(功能開發中)」;chat_upload.submit() 的 wiring 停用(函式 定義保留,之後對話框有真正用途時可直接接回去)。 新增 .upload-zone-plain CSS class,刻意用低視覺重量的樣式跟 .upload-zone 的醒目卡片拉開差異,避免使用者誤以為對話框也是可操作的上傳入口。 已用 Playwright 驗證完整流程:拖曳卡片上傳 A_01.txt+B_01.txt →格式驗證 通過→Metadata表單正確顯示 A/B 兩組;開始新分析可正確清空 upload_row/ file_input 並返回首頁。8521076