yonge před 4 dny
rodič
revize
ca29cecffb

+ 1 - 1
dist/assets/index-CVNp4jiL.js → dist/assets/index-B1gUsGV_.js

@@ -1,4 +1,4 @@
-import{cH as vw,cI as pw,aG as gw,cJ as mw,cK as yw,cL as Sw,cM as bw,ah as Yt,cN as xw,cO as Cw,cP as ww,cQ as Tw,aM as Iw,aF as _w,cR as Aw,aB as f1,bg as Ew,cS as Pw,cT as Mw,cU as Rw,cV as Dw,cW as Lw,cX as kw,cY as Ow,aE as Bw,cZ as Nw,s as Te,bl as Fw,al as je,ag as $e,af as he,ak as Z,c_ as $w,c$ as zw,d0 as Uw,d1 as Hw,bk as Vw,cy as ul,aS as wv,aq as Ye,d2 as Gw,d3 as Ww,a5 as ze,d4 as jw,d5 as Kw,d6 as Xw,d7 as Yw,d8 as Zw,d9 as Qw,da as Jw,db as qw,dc as eT,dd as tT,de as rT,v as nT,df as iT,dg as aT,dh as oT,aW as sT,di as lT,dj as uT,dk as cT,dl as fT,dm as dT,ay as lr,dn as hT,dp as vT,dq as pT,dr as gT,A as mT,ds as yT,dt as ST,bq as bT,du as xT,dv as CT,dw as wT,ap as TT,ac as d1,ai as dt,dx as IT,au as Ce,dy as _T,X as h1,y as AT,dz as ET,aP as PT,dA as MT,w as _r,dB as RT,dC as DT,H as LT,dD as kT,bA as hn,aD as OT,ae as ie,bP as ea,$ as wc,dE as BT,bO as ta,dF as NT,aC as FT,aO as $T,R as fe,dG as zT,br as nh,b3 as Lr,aj as Hs,b1 as lt,b2 as Ua,an as Tv,dH as UT,dI as HT,dJ as VT,dK as GT,dL as WT,dM as jT,dN as KT,Q as XT,dO as YT,dP as ZT,dQ as QT,at as Mt,dR as JT,aR as qT,aY as eI,ad as cl,aZ as tI,dS as rI,dT as nI,dU as iI,P as le,a6 as aI,dV as oI,dW as sI,dX as lI,dY as uI,a7 as cI,dZ as fI,bL as dI,d_ as hI,d$ as vI,bK as pI,b4 as gI,aA as Iv,e0 as mI,e1 as yI,E as sr,x as SI,e2 as bI,e3 as xI,e4 as CI,am as _n,e5 as wI,az as vr,aU as ih,e6 as TI,as as jr,e7 as II,e8 as _v,cG as mr,by as ah,cv as oh,bI as _I,bH as Ve,bu as sh,bv as Av,bx as Wt,bB as Tc,bN as di,e9 as wu,bE as hi,ea as AI,bJ as ra,bC as EI,bw as Lt,eb as PI,ec as ui,cw as MI,ed as RI,ee as DI,ef as LI,eg as kI,bM as Qp,eh as OI,bF as Jp,cD as Ic,cC as BI,ei as Hu,ej as Il}from"./index-CBwkUkeK.js";/**
+import{cH as vw,cI as pw,aG as gw,cJ as mw,cK as yw,cL as Sw,cM as bw,ah as Yt,cN as xw,cO as Cw,cP as ww,cQ as Tw,aM as Iw,aF as _w,cR as Aw,aB as f1,bg as Ew,cS as Pw,cT as Mw,cU as Rw,cV as Dw,cW as Lw,cX as kw,cY as Ow,aE as Bw,cZ as Nw,s as Te,bl as Fw,al as je,ag as $e,af as he,ak as Z,c_ as $w,c$ as zw,d0 as Uw,d1 as Hw,bk as Vw,cy as ul,aS as wv,aq as Ye,d2 as Gw,d3 as Ww,a5 as ze,d4 as jw,d5 as Kw,d6 as Xw,d7 as Yw,d8 as Zw,d9 as Qw,da as Jw,db as qw,dc as eT,dd as tT,de as rT,v as nT,df as iT,dg as aT,dh as oT,aW as sT,di as lT,dj as uT,dk as cT,dl as fT,dm as dT,ay as lr,dn as hT,dp as vT,dq as pT,dr as gT,A as mT,ds as yT,dt as ST,bq as bT,du as xT,dv as CT,dw as wT,ap as TT,ac as d1,ai as dt,dx as IT,au as Ce,dy as _T,X as h1,y as AT,dz as ET,aP as PT,dA as MT,w as _r,dB as RT,dC as DT,H as LT,dD as kT,bA as hn,aD as OT,ae as ie,bP as ea,$ as wc,dE as BT,bO as ta,dF as NT,aC as FT,aO as $T,R as fe,dG as zT,br as nh,b3 as Lr,aj as Hs,b1 as lt,b2 as Ua,an as Tv,dH as UT,dI as HT,dJ as VT,dK as GT,dL as WT,dM as jT,dN as KT,Q as XT,dO as YT,dP as ZT,dQ as QT,at as Mt,dR as JT,aR as qT,aY as eI,ad as cl,aZ as tI,dS as rI,dT as nI,dU as iI,P as le,a6 as aI,dV as oI,dW as sI,dX as lI,dY as uI,a7 as cI,dZ as fI,bL as dI,d_ as hI,d$ as vI,bK as pI,b4 as gI,aA as Iv,e0 as mI,e1 as yI,E as sr,x as SI,e2 as bI,e3 as xI,e4 as CI,am as _n,e5 as wI,az as vr,aU as ih,e6 as TI,as as jr,e7 as II,e8 as _v,cG as mr,by as ah,cv as oh,bI as _I,bH as Ve,bu as sh,bv as Av,bx as Wt,bB as Tc,bN as di,e9 as wu,bE as hi,ea as AI,bJ as ra,bC as EI,bw as Lt,eb as PI,ec as ui,cw as MI,ed as RI,ee as DI,ef as LI,eg as kI,bM as Qp,eh as OI,bF as Jp,cD as Ic,cC as BI,ei as Hu,ej as Il}from"./index-Dm5vyDrL.js";/**
 * vue v3.4.34
 * (c) 2018-present Yuxi (Evan) You and Vue contributors
 * @license MIT

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
dist/assets/index-B9iNxUWT.js


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
dist/assets/index-BDLNE8S0.css


+ 1 - 1
dist/assets/index-CLw40505.js → dist/assets/index-BDP32FYt.js

@@ -1 +1 @@
-import{u as s,ah as r}from"./index-CVNp4jiL.js";import{a5 as c,cD as n,R as p,ae as t,af as _,al as u,ag as i,bH as l}from"./index-CBwkUkeK.js";const m={class:"pptScreen"},d=c({__name:"pptScreen",setup(f){const a=n(),e=p(!0),o=s();return a.setScreenMode("pptScreen"),o.initPPTData().then(()=>{e.value=!1}),(S,k)=>(t(),_("div",m,[e.value?i("",!0):(t(),u(r,{key:0}))]))}}),P=l(d,[["__scopeId","data-v-678905e9"]]);export{P as default};
+import{u as s,ah as r}from"./index-B1gUsGV_.js";import{a5 as c,cD as n,R as p,ae as t,af as _,al as u,ag as i,bH as l}from"./index-Dm5vyDrL.js";const m={class:"pptScreen"},d=c({__name:"pptScreen",setup(f){const a=n(),e=p(!0),o=s();return a.setScreenMode("pptScreen"),o.initPPTData().then(()=>{e.value=!1}),(S,k)=>(t(),_("div",m,[e.value?i("",!0):(t(),u(r,{key:0}))]))}}),P=l(d,[["__scopeId","data-v-678905e9"]]);export{P as default};

+ 1 - 1
dist/assets/index-B649_9g_.js → dist/assets/index-BitbgHQf.js

@@ -1 +1 @@
-import{_ as a}from"./404-R0y5dkvZ.js";import{a5 as o,en as t,ae as r,af as c,bO as _,bP as d,ak as s,bH as p}from"./index-CBwkUkeK.js";const i=e=>(_("data-v-dda25179"),e=e(),d(),e),n={class:"errorPage"},m=i(()=>s("div",{class:"error"},[s("img",{src:a,class:"img",alt:""}),s("div",{class:"tit"},"页面找不到了~")],-1)),l=[m],f=o({__name:"errorPage",setup(e){return t(),(u,h)=>(r(),c("div",n,l))}}),I=p(f,[["__scopeId","data-v-dda25179"]]);export{I as default};
+import{_ as a}from"./404-R0y5dkvZ.js";import{a5 as o,en as t,ae as r,af as c,bO as _,bP as d,ak as s,bH as p}from"./index-Dm5vyDrL.js";const i=e=>(_("data-v-dda25179"),e=e(),d(),e),n={class:"errorPage"},m=i(()=>s("div",{class:"error"},[s("img",{src:a,class:"img",alt:""}),s("div",{class:"tit"},"页面找不到了~")],-1)),l=[m],f=o({__name:"errorPage",setup(e){return t(),(u,h)=>(r(),c("div",n,l))}}),I=p(f,[["__scopeId","data-v-dda25179"]]);export{I as default};

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
dist/assets/index-C8UX5GFB.css


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
dist/assets/index-D68LOXlg.js


+ 1 - 1
dist/assets/index-BMUOVq-x.js → dist/assets/index-DCu7Qthk.js

@@ -1 +1 @@
-import{u as c,ah as l}from"./index-CVNp4jiL.js";import{w as p,bA as d,a5 as g,cD as m,R as t,ae as r,af as u,al as f,ag as w,bH as k}from"./index-CBwkUkeK.js";import"./shapes-BiL_Idk1.js";const S=()=>{function o(a){if(window.parent===window)return;const{api:e,playState:n}=a.data||{};e==="headerTogge"?window.parent.postMessage({api:"headerTogge",playState:n},"*"):e==="changeTogge"?window.parent.postMessage({api:"changeTogge"},"*"):["clickTempo","clickViewFigner"].includes(e)&&window.parent.postMessage({api:e},"*")}p(()=>{window.addEventListener("message",o)}),d(()=>{window.removeEventListener("message",o)})},_=g({__name:"mobileScreen",setup(o){S();const a=m(),e=t(!0),n=t(!1),i=c();return a.setScreenMode("mobileScreen"),i.initPPTData().then(()=>{e.value=!1}),(v,s)=>(r(),u("div",{class:"mobileScreen",onClick:s[0]||(s[0]=b=>n.value=!1)},[e.value?w("",!0):(r(),f(l,{key:0}))]))}}),P=k(_,[["__scopeId","data-v-90b2692a"]]);export{P as default};
+import{u as c,ah as l}from"./index-B1gUsGV_.js";import{w as p,bA as d,a5 as g,cD as m,R as t,ae as r,af as u,al as f,ag as w,bH as k}from"./index-Dm5vyDrL.js";import"./shapes-DpCC2j3E.js";const S=()=>{function o(a){if(window.parent===window)return;const{api:e,playState:n}=a.data||{};e==="headerTogge"?window.parent.postMessage({api:"headerTogge",playState:n},"*"):e==="changeTogge"?window.parent.postMessage({api:"changeTogge"},"*"):["clickTempo","clickViewFigner"].includes(e)&&window.parent.postMessage({api:e},"*")}p(()=>{window.addEventListener("message",o)}),d(()=>{window.removeEventListener("message",o)})},_=g({__name:"mobileScreen",setup(o){S();const a=m(),e=t(!0),n=t(!1),i=c();return a.setScreenMode("mobileScreen"),i.initPPTData().then(()=>{e.value=!1}),(v,s)=>(r(),u("div",{class:"mobileScreen",onClick:s[0]||(s[0]=b=>n.value=!1)},[e.value?w("",!0):(r(),f(l,{key:0}))]))}}),P=k(_,[["__scopeId","data-v-90b2692a"]]);export{P as default};

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 1 - 1
dist/assets/index-Dm5vyDrL.js


+ 1 - 1
dist/assets/index-rc4192rB.js → dist/assets/index-TsOUuXNc.js

@@ -1 +1 @@
-import{_ as t}from"./404-R0y5dkvZ.js";import{E as c}from"./index-Bl97WSgm.js";import{a5 as n,ae as i,af as r,ak as o,aq as _,am as d,P as l,aS as p,bO as m,bP as f,bH as u}from"./index-CBwkUkeK.js";const s=a=>(m("data-v-340bbdaa"),a=a(),f(),a),h={class:"login"},b={class:"error"},g=s(()=>o("img",{src:t,class:"img",alt:""},null,-1)),k=s(()=>o("div",{class:"tit"},"登录已过期或服务器错误!",-1)),v=n({__name:"login",setup(a){function e(){window.close()}return(x,B)=>(i(),r("div",h,[o("div",b,[g,k,_(l(c),{class:"backBtn",type:"primary",plain:"",onClick:e},{default:d(()=>[p("关闭页面")]),_:1})])]))}}),C=u(v,[["__scopeId","data-v-340bbdaa"]]);export{C as default};
+import{_ as t}from"./404-R0y5dkvZ.js";import{E as c}from"./index-B9iNxUWT.js";import{a5 as n,ae as i,af as r,ak as o,aq as _,am as d,P as l,aS as p,bO as m,bP as f,bH as u}from"./index-Dm5vyDrL.js";const s=a=>(m("data-v-340bbdaa"),a=a(),f(),a),h={class:"login"},b={class:"error"},g=s(()=>o("img",{src:t,class:"img",alt:""},null,-1)),k=s(()=>o("div",{class:"tit"},"登录已过期或服务器错误!",-1)),v=n({__name:"login",setup(a){function e(){window.close()}return(x,B)=>(i(),r("div",h,[o("div",b,[g,k,_(l(c),{class:"backBtn",type:"primary",plain:"",onClick:e},{default:d(()=>[p("关闭页面")]),_:1})])]))}}),C=u(v,[["__scopeId","data-v-340bbdaa"]]);export{C as default};

+ 1 - 1
dist/assets/shapes-BiL_Idk1.js → dist/assets/shapes-DpCC2j3E.js

@@ -1,4 +1,4 @@
-import{cG as k,bB as $1}from"./index-CBwkUkeK.js";import{ai as Z,aj as H1,ak as U,al as n0,am as c0,an as i0,ao as j1,ap as K1,aq as Y1,ar as R}from"./index-CVNp4jiL.js";var z1={exports:{}};/*!
+import{cG as k,bB as $1}from"./index-Dm5vyDrL.js";import{ai as Z,aj as H1,ak as U,al as n0,am as c0,an as i0,ao as j1,ap as K1,aq as Y1,ar as R}from"./index-B1gUsGV_.js";var z1={exports:{}};/*!
  * clipboard.js v2.0.11
  * https://clipboardjs.com/
  *

+ 1 - 1
dist/index.html

@@ -10,7 +10,7 @@
     <meta name="description" content="ppt编辑器" />
     <meta name="keywords" content="ppt,powerpoint,office powerpoint,在线ppt,幻灯片,演示文稿,ppt在线制作,Vue3,TypeScript" />
     <title>PPT</title>
-    <script type="module" crossorigin src="./assets/index-CBwkUkeK.js"></script>
+    <script type="module" crossorigin src="./assets/index-Dm5vyDrL.js"></script>
     <link rel="stylesheet" crossorigin href="./assets/index-AavUEaYy.css">
   </head>
   <body>

+ 237 - 155
src/views/Editor/EditorHeader/AiCoursewareDialog.vue

@@ -144,9 +144,10 @@
 
       <div v-else-if="workflowStep === 2 && outline" class="outline">
         <div class="sample-stage-head">
-          <div>
-            <strong>选择喜欢的课件样式</strong>
-            <span>已推荐“{{ selectedTemplate.name }}”,可以逐页查看效果后再生成完整课件。</span>
+          <div class="sample-template-current">
+            <span>当前样式</span>
+            <strong>{{ selectedTemplate.name }}</strong>
+            <small v-if="selectedTemplate.id === recommendedTemplate.id">系统推荐</small>
           </div>
           <button type="button" :disabled="working" @click="templatePickerExpanded = !templatePickerExpanded">
             {{ templatePickerExpanded ? "收起模板" : "更换模板" }}
@@ -173,7 +174,7 @@
               :title="outline.pages[index]?.title || `第${index + 1}页`"
               @click="selectSamplePage(outline.pages[index]?.pageNo || index + 1, index)"
             >
-              <ThumbnailSlide :slide="slide" :size="132" />
+              <ThumbnailSlide :slide="slide" :size="116" />
               <span>{{ outline.pages[index]?.title || `第${index + 1}页` }}</span>
             </button>
           </div>
@@ -212,81 +213,80 @@
           </div>
         </div>
 
-        <div v-if="sampleSlide && selectedPage" class="sample-detail-layout">
-          <div class="sample-outline-panel">
-            <div class="sample-panel-heading">
-              <span>当前页大纲</span>
-              <strong>第{{ samplePageNo }}页</strong>
-            </div>
-            <div class="page-editor simplified-page-editor">
-              <div class="editor-head">
-                <div class="title-editor">
-                  <label class="outline-field-label">页面主题</label>
-                  <input v-model="selectedPage.title" class="page-title" :disabled="working" />
-                </div>
-            </div>
-
-            <div class="field-card">
-              <div class="field-title">学生看到的内容</div>
-              <input
-                :value="studentHeadline"
-                :disabled="working"
-                class="headline-input"
-                placeholder="这一页给学生看的核心标题"
-                @input="event => updateStudentHeadline(selectedPage!, event)"
-              />
-              <textarea
-                :value="studentPoints.join('\n')"
-                :disabled="working"
-                class="page-bullets"
-                placeholder="每行一条学生可见要点,避免写老师操作步骤"
-                @input="event => updateStudentPoints(selectedPage!, event)"
-              ></textarea>
+        <div v-if="sampleSlide && selectedPage" class="sample-detail-section">
+          <div class="sample-detail-heading">
+            <div>
+              <span>第{{ samplePageNo }}页</span>
+              <strong>{{ samplePageTitle }}</strong>
             </div>
-          </div>
+            <small>{{ samplePageReason }}</small>
           </div>
 
-          <div class="sample-preview-column">
-            <div class="sample-preview-heading">
-              <div>
-                <span>页面预览</span>
-                <strong>{{ samplePageTitle }}</strong>
+          <div class="sample-detail-layout">
+            <section class="sample-outline-panel" aria-label="页面内容编辑">
+              <div class="page-editor simplified-page-editor">
+                <div class="editor-head">
+                  <div class="title-editor">
+                    <label class="outline-field-label">页面主题</label>
+                    <input v-model="selectedPage.title" class="page-title" :disabled="working" />
+                  </div>
+                </div>
+
+                <div class="field-card">
+                  <div class="field-title">学生看到的内容</div>
+                  <input
+                    :value="studentHeadline"
+                    :disabled="working"
+                    class="headline-input"
+                    placeholder="这一页给学生看的核心标题"
+                    @input="event => updateStudentHeadline(selectedPage!, event)"
+                  />
+                  <textarea
+                    :value="studentPoints.join('\n')"
+                    :disabled="working"
+                    class="page-bullets"
+                    placeholder="每行一条学生可见要点,避免写老师操作步骤"
+                    @input="event => updateStudentPoints(selectedPage!, event)"
+                  ></textarea>
+                </div>
               </div>
-              <small>{{ samplePageReason }}</small>
-            </div>
-            <div class="sample-canvas">
-              <ThumbnailSlide
-                :slide="sampleSlide"
-                :size="600"
-                :show-background-error="true"
-                @background-load-state="handleSampleBackgroundLoadState"
-              />
-            </div>
-            <div v-if="sampleBackgroundState.status === 'error'" class="template-load-error">模板背景加载失败,请更换模板或稍后重试</div>
-            <div class="sample-feedback">
-              <div class="feedback-label">调整当前页面</div>
-              <div class="feedback-chips">
-                <button
-                  v-for="item in sampleFeedbackOptions"
-                  :key="item"
-                  type="button"
-                  :class="{ active: sampleFeedbackTags.includes(item) }"
-                  :disabled="working"
-                  @click="toggleSampleFeedback(item)"
-                >
-                  {{ item }}
-                </button>
+            </section>
+
+            <section class="sample-preview-column" aria-label="页面预览及调整">
+              <div class="sample-canvas">
+                <ThumbnailSlide
+                  :slide="sampleSlide"
+                  :size="600"
+                  :show-background-error="true"
+                  @background-load-state="handleSampleBackgroundLoadState"
+                />
               </div>
-              <div class="sample-feedback-action">
-                <textarea
-                  v-model="sampleFeedbackText"
-                  :disabled="working"
-                  placeholder="也可以直接说明你希望怎么调整"
-                  @input="invalidateVisualApproval"
-                ></textarea>
-                <Button @click="regenerateSamplePage" :disabled="working">调整当前页面</Button>
+              <div v-if="sampleBackgroundState.status === 'error'" class="template-load-error">模板背景加载失败,请更换模板或稍后重试</div>
+              <div class="sample-feedback">
+                <div class="feedback-label">调整当前页面</div>
+                <div class="feedback-chips">
+                  <button
+                    v-for="item in sampleFeedbackOptions"
+                    :key="item"
+                    type="button"
+                    :class="{ active: sampleFeedbackTags.includes(item) }"
+                    :disabled="working"
+                    @click="toggleSampleFeedback(item)"
+                  >
+                    {{ item }}
+                  </button>
+                </div>
+                <div class="sample-feedback-action">
+                  <textarea
+                    v-model="sampleFeedbackText"
+                    :disabled="working"
+                    placeholder="也可以直接说明你希望怎么调整"
+                    @input="invalidateVisualApproval"
+                  ></textarea>
+                  <Button @click="regenerateSamplePage" :disabled="working">调整当前页面</Button>
+                </div>
               </div>
-            </div>
+            </section>
           </div>
         </div>
       </div>
@@ -839,11 +839,7 @@ async function confirmSamplesAndGenerate() {
   }
 
   const backgroundUrls = Array.from(
-    new Set(
-      slides
-        .map(slide => (slide.background?.type === "image" ? resolveTemplateAssetUrl(slide.background.image) : ""))
-        .filter(Boolean)
-    )
+    new Set(slides.map(slide => (slide.background?.type === "image" ? resolveTemplateAssetUrl(slide.background.image) : "")).filter(Boolean))
   )
 
   try {
@@ -1039,12 +1035,16 @@ function normalizeDraftLocally() {
 }
 
 function cleanDraftText(value?: string, limit?: number) {
-  const cleaned = String(value || "").replace(/\s+/g, " ").trim()
+  const cleaned = String(value || "")
+    .replace(/\s+/g, " ")
+    .trim()
   return limit ? cleaned.slice(0, limit) : cleaned
 }
 
 function normalizeDraftText(value?: string) {
-  return cleanDraftText(value).replace(/[,。!?、;:,.!?;:\s]+/g, "").toLowerCase()
+  return cleanDraftText(value)
+    .replace(/[,。!?、;:,.!?;:\s]+/g, "")
+    .toLowerCase()
 }
 
 function uniqueDraftTexts(values: string[]) {
@@ -1133,6 +1133,16 @@ function shortProgressLabel(message?: string) {
 .ai-dialog.review-mode {
   height: 82vh;
 }
+.ai-dialog.review-mode .header {
+  .title {
+    font-size: 22px;
+    line-height: 1.25;
+  }
+  .sub {
+    margin-top: 3px;
+    font-size: 13px;
+  }
+}
 .header,
 .footer {
   display: flex;
@@ -1157,7 +1167,7 @@ function shortProgressLabel(message?: string) {
 .workflow-steps {
   display: grid;
   grid-template-columns: repeat(3, 1fr);
-  margin-top: 16px;
+  margin-top: 12px;
   padding: 4px;
   border-radius: 8px;
   background: #f4f7fa;
@@ -1168,7 +1178,7 @@ function shortProgressLabel(message?: string) {
   align-items: center;
   justify-content: center;
   gap: 8px;
-  height: 38px;
+  height: 34px;
   color: #7b8794;
   font-size: 13px;
   font-weight: 600;
@@ -1538,7 +1548,7 @@ function shortProgressLabel(message?: string) {
   color: #52616b;
 }
 .outline {
-  margin-top: 14px;
+  margin-top: 10px;
   min-height: 0;
   flex: 1;
   display: block;
@@ -1550,39 +1560,58 @@ function shortProgressLabel(message?: string) {
   align-items: center;
   justify-content: space-between;
   gap: 12px;
-  div span {
-    display: block;
-    margin-top: 3px;
-    color: #7b8794;
-    font-size: 12px;
-  }
   button {
-    height: 32px;
-    padding: 0 11px;
-    border: 1px solid $themeColor;
+    height: 30px;
+    padding: 0 10px;
+    border: 1px solid #cbd9e8;
     border-radius: 6px;
     background: #fff;
     color: $themeColor;
+    font-size: 12px;
     cursor: pointer;
   }
 }
+.sample-template-current {
+  display: flex;
+  align-items: center;
+  min-width: 0;
+  gap: 7px;
+  color: #657381;
+  font-size: 12px;
+  strong {
+    overflow: hidden;
+    color: #1f2933;
+    font-size: 14px;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+  }
+  small {
+    flex-shrink: 0;
+    padding: 2px 6px;
+    border-radius: 999px;
+    background: #eaf7f4;
+    color: #168f86;
+    font-size: 10px;
+    font-weight: 600;
+  }
+}
 .sample-carousel-shell {
   display: grid;
-  grid-template-columns: 34px minmax(0, 1fr) 34px;
+  grid-template-columns: 30px minmax(0, 1fr) 30px;
   align-items: center;
-  gap: 8px;
-  margin-top: 12px;
+  gap: 6px;
+  margin-top: 8px;
 }
 .sample-carousel-arrow {
-  width: 34px;
-  height: 34px;
+  width: 30px;
+  height: 30px;
   padding: 0;
   border: 1px solid #d8e1eb;
   border-radius: 50%;
   background: #fff;
   color: #52616b;
-  font-size: 24px;
-  line-height: 30px;
+  font-size: 21px;
+  line-height: 26px;
   cursor: pointer;
   box-shadow: 0 3px 10px rgba(31, 41, 51, 0.08);
   &:hover:not(:disabled) {
@@ -1596,10 +1625,10 @@ function shortProgressLabel(message?: string) {
 }
 .sample-thumbnail-track {
   display: flex;
-  gap: 10px;
+  gap: 8px;
   min-width: 0;
   overflow-x: auto;
-  padding: 3px;
+  padding: 2px;
   scroll-behavior: smooth;
   scroll-snap-type: x proximity;
   scrollbar-width: none;
@@ -1608,26 +1637,28 @@ function shortProgressLabel(message?: string) {
   }
 }
 .sample-thumbnail-item {
-  width: 136px;
-  flex: 0 0 136px;
+  width: 120px;
+  flex: 0 0 120px;
   padding: 0;
   overflow: hidden;
   border: 2px solid transparent;
-  border-radius: 7px;
+  border-radius: 6px;
   background: #fff;
   color: #52616b;
   text-align: left;
   cursor: pointer;
   scroll-snap-align: start;
-  box-shadow: 0 3px 10px rgba(31, 41, 51, 0.08);
-  transition: border-color 0.16s ease, box-shadow 0.16s ease;
+  box-shadow: 0 2px 7px rgba(31, 41, 51, 0.07);
+  transition:
+    border-color 0.16s ease,
+    box-shadow 0.16s ease;
   &.active {
     border-color: $themeColor;
     box-shadow: 0 0 0 2px rgba($themeColor, 0.1);
   }
   > span {
     display: block;
-    padding: 6px 7px 7px;
+    padding: 5px 6px 6px;
     overflow: hidden;
     font-size: 11px;
     font-weight: 600;
@@ -1636,7 +1667,7 @@ function shortProgressLabel(message?: string) {
   }
 }
 .compact-template-panel {
-  margin-top: 12px;
+  margin-top: 8px;
   padding: 10px;
   border: 1px solid #e5eaf0;
   border-radius: 8px;
@@ -1650,57 +1681,90 @@ function shortProgressLabel(message?: string) {
     margin: 0;
   }
 }
-.sample-detail-layout {
-  display: grid;
-  grid-template-columns: minmax(280px, 0.72fr) minmax(0, 1.45fr);
-  align-items: start;
-  gap: 16px;
-  margin-top: 14px;
-}
-.sample-outline-panel,
-.sample-preview-column {
-  min-width: 0;
-  padding: 14px;
-  border: 1px solid #e5eaf0;
-  border-radius: 10px;
-  background: #fafcff;
+.sample-detail-section {
+  margin-top: 10px;
 }
-.sample-panel-heading,
-.sample-preview-heading {
+.sample-detail-heading {
   display: flex;
-  align-items: flex-start;
+  align-items: center;
   justify-content: space-between;
-  gap: 12px;
-  margin-bottom: 10px;
-  span,
-  strong {
-    display: block;
+  min-height: 26px;
+  gap: 16px;
+  margin-bottom: 6px;
+  > div {
+    display: flex;
+    align-items: baseline;
+    min-width: 0;
+    gap: 8px;
   }
   span {
+    flex-shrink: 0;
     color: $themeColor;
     font-size: 12px;
     font-weight: 700;
   }
   strong {
-    margin-top: 3px;
+    overflow: hidden;
     color: #1f2933;
     font-size: 15px;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+  }
+  small {
+    overflow: hidden;
+    max-width: 48%;
+    color: #8a96a3;
+    font-size: 11px;
+    text-align: right;
+    text-overflow: ellipsis;
+    white-space: nowrap;
   }
 }
-.sample-panel-heading > strong {
-  margin-top: 0;
-  color: #7b8794;
-  font-size: 12px;
+.sample-detail-layout {
+  display: grid;
+  grid-template-columns: minmax(260px, 0.68fr) minmax(0, 1.48fr);
+  align-items: stretch;
+  gap: 12px;
 }
-.sample-preview-heading small {
-  max-width: 52%;
-  color: #7b8794;
-  font-size: 11px;
-  line-height: 1.5;
-  text-align: right;
+.sample-outline-panel,
+.sample-preview-column {
+  min-width: 0;
+  padding: 12px;
+  border: 1px solid #dfe6ee;
+  border-radius: 8px;
+  background: #fff;
+}
+.sample-outline-panel {
+  display: flex;
+}
+.sample-preview-column {
+  display: flex;
+  flex-direction: column;
+}
+.simplified-page-editor {
+  display: flex;
+  width: 100%;
+  flex-direction: column;
+  padding: 0;
+  overflow: visible;
+  border: 0;
+  border-radius: 0;
+  background: transparent;
+  .title-editor {
+    max-width: none;
+  }
 }
 .simplified-page-editor .field-card {
-  margin-top: 12px;
+  margin-top: 11px;
+  padding: 11px 0 0;
+  border: 0;
+  border-top: 1px solid #edf1f5;
+  border-radius: 0;
+  background: transparent;
+}
+.simplified-page-editor .page-bullets {
+  min-height: 124px;
+  height: 124px;
 }
 .representative-samples {
   display: grid;
@@ -1975,8 +2039,8 @@ function shortProgressLabel(message?: string) {
   }
 }
 .sample-feedback {
-  margin-top: 12px;
-  padding-top: 12px;
+  margin-top: auto;
+  padding-top: 10px;
   border-top: 1px solid #e5eaf0;
 }
 .feedback-label {
@@ -1988,10 +2052,10 @@ function shortProgressLabel(message?: string) {
   display: flex;
   flex-wrap: wrap;
   gap: 6px;
-  margin-top: 7px;
+  margin-top: 6px;
   button {
-    height: 28px;
-    padding: 0 10px;
+    height: 26px;
+    padding: 0 9px;
     border: 1px solid #dfe5ec;
     border-radius: 999px;
     background: #fff;
@@ -2008,7 +2072,7 @@ function shortProgressLabel(message?: string) {
 }
 .sample-feedback textarea {
   width: 100%;
-  height: 58px;
+  height: 48px;
   margin: 0;
   padding: 8px 10px;
   border: 1px solid #dfe5ec;
@@ -2024,7 +2088,7 @@ function shortProgressLabel(message?: string) {
   grid-template-columns: minmax(0, 1fr) auto;
   align-items: end;
   gap: 8px;
-  margin-top: 8px;
+  margin-top: 6px;
   :deep(.button) {
     height: 34px;
     line-height: 34px;
@@ -2037,10 +2101,12 @@ function shortProgressLabel(message?: string) {
   align-items: center;
   justify-content: center;
   overflow: auto;
-  padding: 12px;
-  border: 1px solid #e0e7ef;
-  border-radius: 8px;
-  background: #eef2f7;
+  min-height: 0;
+  flex: 1 1 auto;
+  padding: 10px;
+  border: 0;
+  border-radius: 6px;
+  background: #f1f4f8;
   :deep(.thumbnail-slide) {
     flex-shrink: 0;
     border-radius: 6px;
@@ -2130,7 +2196,9 @@ function shortProgressLabel(message?: string) {
   color: #52616b;
   text-align: left;
   cursor: pointer;
-  transition: border-color 0.16s ease, background 0.16s ease;
+  transition:
+    border-color 0.16s ease,
+    background 0.16s ease;
   + .draft-page-item {
     margin-top: 7px;
   }
@@ -2496,6 +2564,14 @@ function shortProgressLabel(message?: string) {
   font-weight: 600;
   text-align: center;
 }
+.ai-dialog.review-mode .footer {
+  margin-top: 10px;
+  padding-top: 10px;
+  :deep(.button.primary) {
+    height: 36px;
+    line-height: 36px;
+  }
+}
 
 @media (max-width: 900px) {
   .ai-dialog.review-mode {
@@ -2509,6 +2585,9 @@ function shortProgressLabel(message?: string) {
     justify-self: center;
     max-width: 100%;
   }
+  .sample-preview-column {
+    order: -1;
+  }
   .compact-template-panel .sample-template-picker {
     grid-template-columns: repeat(2, minmax(0, 1fr));
   }
@@ -2551,11 +2630,14 @@ function shortProgressLabel(message?: string) {
   .sample-feedback-action {
     grid-template-columns: 1fr;
   }
-  .sample-preview-heading {
+  .sample-detail-heading {
+    align-items: flex-start;
     flex-direction: column;
+    gap: 3px;
     small {
       max-width: none;
       text-align: left;
+      white-space: normal;
     }
   }
   .compact-template-panel .sample-template-picker {

Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů