File size: 8,741 Bytes
494c9e4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c4753aa
 
 
 
 
 
 
 
 
494c9e4
c4753aa
 
 
 
 
 
494c9e4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
// 响应式样式模块
// 依赖统一的断点配置(见 _breakpoints.scss)
@use "breakpoints" as *;

// ==================== Mixins ====================

// 公共容器样式:100%宽度,border-box,可见溢出
@mixin full-width-container {
  width: 100%;
  box-sizing: border-box;
}

// 移动端滚动容器:使用 body 滚动条,禁止横向滚动
@mixin mobile-scroll-container {
  overflow: visible;  // 确保不使用自己的滚动条
  overflow-x: hidden;  // 禁止横向滚动
  overflow-y: visible;  // 允许垂直滚动,使用body的滚动条
}

// 全宽自适应容器:100%宽度,不超过父容器
@mixin full-width-adaptive {
  width: 100%;
  max-width: 100%;
  box-sizing: border-box;
}

// 窄屏布局(视口 ≤767px 与设置「强制窄屏」共用)
@mixin narrow-app-layout($root) {
  #{$root} {
    margin: 0;
    padding: 0;
    height: auto;  // 不使用固定高度,避免100vh问题
    overflow-x: hidden;
    width: 100%;
    max-width: 100vw;
    touch-action: pan-y;
  }

  #{$root} body {
    margin: 0;
    padding: 0;
    overflow-y: auto;  // 允许垂直滚动
    overflow-x: hidden;
    width: 100%;
    max-width: 100vw;
    height: auto;  // 不使用100vh,让高度自适应内容
    min-height: 0;  // 移除最小高度限制
    touch-action: pan-y;  // 允许垂直触摸滑动
    -webkit-overflow-scrolling: touch;  // iOS平滑滚动
  }

  #{$root} .main_frame {
    position: relative;  // 覆盖桌面端的固定定位
    height: auto;  // 覆盖桌面端的100vh,避免移动浏览器UI高度不一致
    min-height: 0;  // 移除最小高度限制
    flex-direction: column;
    overflow-x: hidden;  // 禁止横向滚动
    overflow-y: visible;  // 允许内容溢出,由body滚动
    overflow: visible;  // 确保完全不阻止滚动
    width: 100%;
    max-width: 100vw;
    box-sizing: border-box;
    touch-action: pan-y;  // 允许垂直触摸滑动
  }

  #{$root} .left_panel {
    flex: 0 0 auto;  // 不固定高度,根据内容自适应
    @include full-width-adaptive;
    min-width: 100%;  // 覆盖桌面端的 min-width: 10vw
    padding: 8px 15px 15px;
    border-right: none;  // 移除右边框
    border-bottom: 1px solid var(--border-color);  // 添加底部分隔线
    @include mobile-scroll-container;
    touch-action: pan-y;  // 只允许垂直方向的触摸滑动
  }

  #{$root} .resizer {
    display: none;
  }

  #{$root} .right_panel {
    flex: 1 1 auto;
    @include full-width-adaptive;
    padding: 0;
    overflow-x: hidden;
    overflow-y: hidden;  // 窄屏模式下禁用滚动条,使用body滚动
    overflow: hidden;  // 彻底禁用滚动条,防止出现多余的滚动条
    background: var(--panel-bg);
    min-height: 0;  // 移除最小高度,让内容自然展开
    height: auto;  // 高度自适应内容
    position: relative;
    touch-action: pan-y;
  }

  #{$root} #results {
    padding: 0;
    margin: 0;
    position: relative;
    @include full-width-container;
    @include mobile-scroll-container;
    min-height: 0;  // 移除100%高度限制,让内容自然展开
    height: auto;  // 高度自适应内容
  }

  #{$root} .LMF {
    position: relative;
    @include full-width-container;
    @include mobile-scroll-container;
    min-height: 350px;  // 确保至少350px高度以容纳tooltip(内容不足时生效)
    height: auto;  // 高度自适应内容
    padding: 15px 12px;  // 基础padding

    &.minimap-enabled {
      padding-right: calc(12px + var(--minimap-width));
    }
  }

  #{$root} .text-loading-overlay {
    min-height: 0;  // 移除100%高度限制
    height: auto;  // 由于使用绝对定位和top/bottom:0,会自动填充,但确保不强制最小高度
  }

  #{$root} .container {
    padding: 10px;  // 减小padding等小屏幕
    box-sizing: border-box;
  }

  #{$root} .floating_content {
    @include full-width-adaptive;
    overflow: visible;
  }

  #{$root} #stats {
    order: 2;
    padding: 0 5px;  // 增加左右padding,避免直方图被遮挡
    @include full-width-adaptive;

    svg {
      @include full-width-adaptive;
      height: auto;
      display: block;
    }
  }

  #{$root} #all_result {
    @include full-width-container;
    @include mobile-scroll-container;
    padding: 0;
  }

  #{$root} #res {
    order: 1;
  }

  #{$root} .app-page-toolbar--bleed {
    margin: 0 -15px 10px -15px;
    padding: max(10px, env(safe-area-inset-top)) 15px 10px 15px;
  }

  #{$root} button {
    padding: 8px 12px;
    font-size: 11pt;
  }

  #{$root} .textarea-wrapper textarea {
    min-height: 80px;
    font-size: 16px;  // 设置为至少 16px,防止 iOS 自动缩放
  }

  #{$root} input[type="text"],
  #{$root} input[type="url"],
  #{$root} input[type="search"],
  #{$root} input[type="email"],
  #{$root} input[type="number"],
  #{$root} input[type="tel"],
  #{$root} input[type="password"],
  #{$root} select {
    font-size: 16px;  // 所有文本类输入控件在移动端统一使用 16px
  }
}

// 平板及以上(≥768px)- 桌面端样式(强制窄屏时收紧为 html:not([data-force-narrow]))
@media (min-width: $breakpoint-tablet) {
  html:not([data-force-narrow]) {
    height: 100%;  // 确保html高度为100%

    body {
      height: 100vh;  // 使用100vh确保填满视口,消除底部空白
      min-height: 100vh;  // 同时设置min-height作为备用
    }

    .main_frame {
      position: fixed;
      top: 0px;
      left: 0;
      width: 100%;
      height: 100%;  // 使用100%而不是100vh,基于body的高度,消除底部空白
      min-height: 100vh;  // 确保至少填满视口
      display: flex;  // 保持flex布局用于左右面板
      overflow: hidden;
    }

    .left_panel {
      flex: 0 0 1200px;  // 设置一个合理的默认值,会被JS动态覆盖
      min-width: 10vw;   // 最小宽度为屏幕宽度的10%
      max-width: 90vw;    // 最大宽度为屏幕宽度的90%
      padding: 8px 20px 20px;
      overflow-y: auto;
      overflow-x: hidden;  // 防止水平滚动,确保内容不会被遮挡
      border-right: 1px solid var(--border-color);
      background-color: var(--bg-color);
      box-sizing: border-box;  // 确保padding包含在宽度计算中
      transition: background-color 0.3s ease, border-color 0.3s ease;

      > * {
        max-width: 100%;  // 确保子元素不超过容器宽度
        box-sizing: border-box;  // 确保宽度计算正确
      }
    }

    .resizer {
      width: 8px;
      background: var(--resizer-bg);
      cursor: col-resize;
      position: relative;
      flex-shrink: 0;
      transition: background-color 0.3s ease;
    }

    .resizer::before {
      content: '';
      position: absolute;
      left: 50%;
      top: 0;
      bottom: 0;
      width: 2px;
      background: var(--border-color);
      transform: translateX(-50%);
      transition: background-color 0.3s ease;
    }

    .resizer:hover::before {
      background: var(--resizer-hover);
    }

    .right_panel {
      flex: 1;  // 占据剩余空间
      display: flex;
      flex-direction: column;
      min-height: 0;
      padding: 0;  // 移除 padding,让 LMF 层填充整个区域
      overflow-y: auto;
      overflow-x: hidden;  // 禁止横向滚动,但允许内容溢出以显示发光效果
      background: var(--panel-bg);
      transition: background-color 0.3s ease;
      position: relative;  // 为绝对定位的子元素提供定位上下文

      // 直接子 #results(analysis / attribution / gen_attribute)铺满面板;
      // chat 页 #results 嵌套在 .chat-right-stack 内,不匹配此规则,由 chat.scss 自行控制。
      > #results {
        @include full-width-container;
        overflow: visible;  // 确保发光效果不被裁剪
        position: relative;  // 相对定位,让内容自然扩展
        min-height: 100%;  // 至少填充整个 right_panel
        margin: 0;  // 移除 margin-top
      }

      > #results > .LMF {
        @include full-width-container;
        min-height: 100%;  // 至少填充整个 #results 容器
        padding: 20px;  // 为发光效果留出足够空间(drop-shadow 最大约 16px)
        overflow: visible;  // 确保发光效果不被裁剪,不使用自己的滚动条
      }
    }

    .floating_content {
      @include full-width-adaptive;
    }
  }

  // 宽屏下强制窄屏:仅匹配含 .main_frame 的子页(避免改写首页 body.nav-landing-page)
  @include narrow-app-layout('html[data-force-narrow]:has(.main_frame)');
}

// 移动端响应式样式(≤767px)
@media (max-width: $breakpoint-mobile) {
  @include narrow-app-layout('html');
}