File size: 9,743 Bytes
e5d8d3a
033070f
 
e5d8d3a
9245486
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e5d8d3a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9245486
e5d8d3a
 
 
 
 
 
 
 
9245486
e5d8d3a
 
 
9245486
 
e5d8d3a
 
 
 
9245486
e5d8d3a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9245486
e5d8d3a
 
 
 
9245486
e5d8d3a
 
 
 
 
 
 
 
 
 
 
 
9245486
e5d8d3a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9245486
 
e5d8d3a
 
 
744d003
e5d8d3a
 
 
9245486
 
 
e5d8d3a
9245486
 
 
 
 
40400a1
 
 
 
 
e5d8d3a
 
 
 
 
 
 
 
 
 
 
9245486
e5d8d3a
 
 
 
9245486
 
e5d8d3a
 
 
 
 
 
9245486
e5d8d3a
 
9245486
e5d8d3a
 
 
 
 
 
 
 
9245486
 
e5d8d3a
 
 
 
 
 
 
 
b4c1b2f
 
 
 
 
 
 
e5d8d3a
 
 
 
 
 
 
b4c1b2f
e5d8d3a
 
 
 
b4c1b2f
 
 
 
 
 
 
 
 
 
 
e5d8d3a
 
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
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
// 响应式样式模块
// 依赖统一的断点配置(见 _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;
}

// 平板及以上(≥768px)- 桌面端样式
@media (min-width: $breakpoint-tablet) {
  // 桌面端:html 和 body 使用固定高度
  html {
    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: 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;  // 占据剩余空间
    padding: 0;  // 移除 padding,让 LMF 层填充整个区域
    overflow-y: auto;
    overflow-x: hidden;  // 禁止横向滚动,但允许内容溢出以显示发光效果
    background: var(--panel-bg);
    transition: background-color 0.3s ease;
    position: relative;  // 为绝对定位的子元素提供定位上下文
  }

  // 确保 #results 容器不裁剪发光效果,并填充整个 right_panel
  #results {
    @include full-width-container;
    overflow: visible;  // 确保发光效果不被裁剪
    position: relative;  // 相对定位,让内容自然扩展
    min-height: 100%;  // 至少填充整个 right_panel
    margin: 0;  // 移除 margin-top
  }

  // GLTR 文本容器桌面端布局样式
  .LMF {
    @include full-width-container;
    min-height: 100%;  // 至少填充整个 #results 容器
    // 添加 padding 为发光效果留出空间(drop-shadow 最大约 16px)
    padding: 20px;  // 为发光效果留出足够空间,略大于最大阴影范围
    // 桌面端:容器高度通常超过350px,不需要额外的底部padding
    // 只在容器高度不足时,min-height会生效保证至少350px(在基础样式中定义)
    overflow: visible;  // 确保发光效果不被裁剪,不使用自己的滚动条
  }

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

// 移动端响应式样式(≤767px)
@media (max-width: $breakpoint-mobile) {
  // 重置 html 和 body,避免默认 margin/padding 和高度问题
  html {
    margin: 0;
    padding: 0;
    height: auto;  // 不使用固定高度,避免100vh问题
    overflow-x: hidden;
    width: 100%;
    max-width: 100vw;
    touch-action: pan-y;
  }
  
  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平滑滚动
  }
  
  // 主框架移动端样式
  .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;  // 允许垂直触摸滑动
  }
  
  // 左侧面板:全宽显示,不使用自己的滚动条,使用顶层滚动条
  .left_panel {
    flex: 0 0 auto;  // 不固定高度,根据内容自适应
    @include full-width-adaptive;
    min-width: 100%;  // 覆盖桌面端的 min-width: 10vw
    padding: 15px;  // 减小内边距以适应小屏幕
    border-right: none;  // 移除右边框
    border-bottom: 1px solid var(--border-color);  // 添加底部分隔线
    @include mobile-scroll-container;
    // 移动端:限制触摸滑动只能垂直方向
    touch-action: pan-y;  // 只允许垂直方向的触摸滑动
  }
  
  // 隐藏分割线(移动端不需要)
  .resizer {
    display: none;
  }
  
  // 右侧面板,确保不使用固定高度
  .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;
  }
  
  // 右侧面板的结果容器,移除强制高度,不使用自己的滚动条
  #results {
    padding: 0;
    margin: 0;
    position: relative;
    @include full-width-container;
    @include mobile-scroll-container;
    min-height: 0;  // 移除100%高度限制,让内容自然展开
    height: auto;  // 高度自适应内容
  }

  // 文本可视化容器,移除强制高度,不使用自己的滚动条,使用顶层滚动条
  .LMF {
    position: relative;
    @include full-width-container;
    @include mobile-scroll-container;
    min-height: 350px;  // 确保至少350px高度以容纳tooltip(内容不足时生效)
    height: auto;  // 高度自适应内容
    padding: 15px 12px;  // 基础padding
    // 移除固定的大padding-bottom,min-height已保证最小高度
    font-size: 12pt;  // 比body的9pt大,使文本更易读
    word-wrap: break-word;
    overflow-wrap: break-word;
    
    // 启用 minimap 时,右侧增加 minimap 宽度
    &.minimap-enabled {
      padding-right: calc(12px + var(--minimap-width));
    }
  }
  
  // 加载遮罩层,移除强制高度
  .text-loading-overlay {
    min-height: 0;  // 移除100%高度限制
    height: auto;  // 由于使用绝对定位和top/bottom:0,会自动填充,但确保不强制最小高度
  }
  
  // 容器在移动端调整padding
  .container {
    padding: 10px;  // 减小padding以适应小屏幕
    box-sizing: border-box;  // 复用 border-box,但不需要 full-width-container(可能有特定宽度需求)
  }
  
  // 调整浮动内容宽度,不使用自己的滚动条
  .floating_content {
    @include full-width-adaptive;
    @include mobile-scroll-container;
  }
  
  // 调整统计图容器
  #stats {
    order: 2;
    padding: 0 5px;  // 增加左右padding,避免直方图被遮挡
    @include full-width-adaptive;
    
    svg {
      @include full-width-adaptive;
      height: auto;
      // 确保SVG可以按比例缩小
      display: block;
    }
  }
  
  // 确保直方图容器不会超出,不使用自己的滚动条
  #all_result {
    @include full-width-container;
    @include mobile-scroll-container;
    padding: 0;
  }
  
  // 调整结果区域顺序
  #res {
    order: 1;
  }
  
  // 移动端:调整首页标题栏的 negative margin,保留顶部间距避免被遮挡
  .dark-mode-toggle-wrapper {
    margin: 0 -15px 10px -15px;  // 移动端的 left_panel padding 是 15px,顶部不使用负margin
    // 添加安全区域支持(iOS刘海屏等)
    padding-top: max(10px, env(safe-area-inset-top));
  }
  
  
  // 调整按钮大小
  button {
    padding: 8px 12px;
    font-size: 11pt;
  }
  
  // 调整表单控件字体,防止 iOS 自动缩放
  textarea {
    min-height: 80px;
    font-size: 16px;  // 设置为至少 16px,防止 iOS 自动缩放
  }

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