bricks/bricks/css/bricks.css

1356 lines
29 KiB
CSS
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

html,
body {
height: 100%;
width: 100%;
margin: 0;
color: #8a8a8a;
background-color: #fafafa;
overflow: auto;
display: flex;
}
.responsive-img {
max-width: 100%; /* 限制最大宽度为容器 */
width: 100%; /* 占满容器宽度 */
height: auto; /* 高度自动,保持比例 */
display: block; /* 避免底部留空隙 */
object-fit: contain; /* 确保完整显示,而不是裁切 */
}
pre {
overflow-x: auto; /* 允许内容超出容器显示 */
background-color: #b5e5e5;
}
* {
box-sizing: border-box!important;
}
hr {
height: 1px;
background-color: #8a8a8a;
width: 80%;
}
.flexbox {
height: 100%;
width: 100%;
display: flex;
}
.curpos {
border-radius: 30%;
background-color: #f5f5f5;
}
.tabular {
border-radius: 8px;
padding: 5px;
margin: 5px;
background-color: #f5f5f5;
border: 1px solid #888888;
}
.card {
border-radius: 8px;
padding: 5px;
margin: 5px;
background-color: #f5f5f5;
border: 1px solid #888888;
}
.card:hover {
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.6);
border: 2px solid #ff8080;
}
.subcard {
background-color: #eeeeee;
}
.clickable {
color: #40cc40;
cursor: pointer;
}
.video-in-video {
position: relative;
}
.bigvideo {
position: absolute;
width: 100%;
height: 100%;
z-index: 0;
}
.smallvideo {
position: absolute;
bottom: 10px;
right: 30px;
width: 30%;
height: 30%;
z-index: 2;
}
.griddata {
display: grid;
grid-gap: 1px;
}
.resizebox {
width: 10px;
height: 10px;
background-color: darkblue;
position: absolute;
bottom: 0;
right: 0;
z-index: 9999;
cursor: se-resize; /* 改变鼠标指针样式 */
}
.popup {
display: none;
position: absolute;
box-sizing: border-box; /* 包括边框在内计算宽度和高度 */
color: #111111;
background-color: #f1f1f1;
border: 1px solid #c1c1c1;
border-radius: 5px;
padding: 4px;
}
.titlebar {
background-color: #d8d8c8;
}
.toppopup {
box-shadow: 10px 5px 10px #000, 0 -5px 5px #fff;
}
.modal {
display:none;
position: absolute;
padding: 10px;
color: #111111;
background-color: #dddddd;
border: 1px solid #ccc;
border-radius: 5px;
margin-bottom: 10px;
}
.menuitem {
backgroud-color: #eeeeee;
align-items: center;
border: 1px solid #ccc;
cursor: pointer;
}
.modal>.title {
background-color: #a0a0a0;
}
.message {
padding: 10px;
width: 30%;
height: 30%;
background-color: #f0f0f0;
color:#222222;
border: 1px solid #ccc;
border-radius: 5px;
margin-bottom: 10px;
}
.error {
padding: 10px;
width: 30%;
height: 30%;
background-color: #f0f0f0;
border: 1px solid #ccc;
border-radius: 5px;
margin-bottom: 10px;
}
.message>.title {
background-color: #3030f0;
color: #e8e8e8;
}
.error>.title {
background-color: #f03030;
color: #e8e8e8;
}
.vscroll {
overflow-x: scroll;
}
.hscroll {
overflow-y: scroll;
}
.scroll {
overflow: auto;
}
.vcontainer {
display: flex;
flex-direction: column;
}
.vbox {
display: flex;
flex-direction: column;
}
.hcontainer {
display: flex;
flex-direction: row;
}
.hbox {
display: flex;
flex-direction: row;
}
.fixitem {
flex:none;
}
.filler, .hfiller, .vfiller {
flex: auto;
flex-grow: 1;
overflow:hidden;
}
.vfiller .vbox:last-child {
overflow-x: overlay;
}
.vline {
width:1px;
height:100%;
background-colir:#999;
}
.hline {
height:1px;
width:100%;
background-colir:#999;
}
.hfiller::-webkit-scrollbar {
display: none;
}
.flc {
width: 203px;
overflow-y: scroll;
overflow-x: visible;
}
.vtoolbar {
heigth: 100%;
background-color: #f1f1f1;
border: 1px solid #ccc;
}
.selected {
background-color: #d4d4d4;
}
.htoolbar {
width: 100%;
height: 40px;
background-color: #f1f1f1;
border: 1px solid #ccc;
}
.toolbar-button {
background-color: inherit;
float: left;
border: none;
outline: none;
cursor: pointer;
padding: 14px 16px;
transition: 0.3s;
border: 1px solid #888;
}
.toolbar-button-active {
background-color: #ddd;
}
.tabpanel {
background-color: #ededed;
border: 3px solid #888;
}
.tabpanel-content {
background-color: #f8f8f8;
border: 2px solid #888;
}
.multicolumns {
column-width: 340px;
colomn-gap: 10px;
overflow-x: none;
}
.selected_record {
border-radius: 8px;
border: 1px solid #f00;
}
.inputbox {
background-color: #f8f8f8;
color: #111111;
border: 1px solid #ccc;
padding: 10px;
margin: 0 0 1em 0;
}
.datagrid {
display:flex;
flex-direction:column;
width:100%;
height:100%;
}
.datagrid-grid {
width: 100%;
flex: 1;
overflow: auto;
display: flex;
flex-direction: row;
}
.datagrid-left {
height:100%;
display: flex;
flex-direction: column;
overflow: auto;
}
.datagrid-left>.scrollbar {
width:0px;
opacity:0;
}
.datagrid-right {
flex:1 0 ;
height:100%;
overflow: auto;
display: flex;
flex-direction: column;
}
.grid_header, .grid_footer {
height: 50px;
background-color: blue;
}
.childrensize {
display: flex;
flex-wrap: nowrap;
flex-shrink: 0;
}
.datagrid-row {
flex:0 0 150px;
display: flex;
flex-direction: row;
}
.datagrid-body {
width: 100%;
flex: 1;
overflow: auto;
display: flex;
flex-direction: column;
}
/* Flex 布局 */
.accordion {
display: flex;
flex-direction: column;
}
.accordion-item {
border: 1px solid #ccc;
width: auto;
margin-bottom: 5px;
}
.accordion-item:nth-child(odd) {
background-color: #fdfdfd;
width: auto;
}
.accordion-item:nth-child(even) {
background-color: #f9f9f9;
width: auto;
}
.accordion-item-selected {
background-color: #efefef;
}
.accordion-item-header {
padding: 10px;
background-color: #f0f0f0;
}
.accordion-item-info {
padding: 10px;
background-color: #fbfbfb;
cursor: pointer;
width: auto;
height: 50px;
}
.test_box {
height: 100px;
background-color: #e6e6e6;
border-radius: 5px;
flex-shrink:0;
border: 1px solid #c00;
}
.accordion-item-info-selected {
background-color: #e6e6e6;
}
.scrollpanel,
.tabular-table {
width: 100%;
height: 100%;
overflow: auto;
}
.tabular-header-row {
display: flex;
top: 0;
position: sticky;
background-color: #dddddd;
min-width: 0;
min-width: fit-content;
flex-wrap: nowrap;
flex-shrink: 0;
}
.tabular-row {
display: flex;
margin-bottom: 5px;
min-width: 0;
min-width: fit-content;
flex-wrap: nowrap;
flex-shrink: 0;
}
.tabular-row:nth-child(odd) {
background-color: #efefef;
}
.tabular-row:nth-child(even) {
background-color: #f9f9f9;
}
.tabular-row-selected {
background-color: #fee2e2 !important;
color: #ef0000;
}
.tabular-row-content {
padding: 2;
}
.tabular-cell {
border: 1px solid #ccc;
overflow: hidden;
text-overflow: ellipsis;
}
.llm_msg {
margin-left: 5px;
margin-right: auto;
margin-bottom: 10px;
padding: 3px;
background-color:#fefedd;
border-top-left-radius: 10px;
border-top-right-radius: 0;
border-bottom-right-radius: 10px;
border-bottom-left-radius: 0;
box-shadow: 5px 5px 10px rgba(0, 0, 0.2, 0.5);
}
.user_msg {
margin-left: auto;
margin-right: 5px;
margin-bottom: 10px;
background-color:#ddfefe;
border-top-right-radius: 10px;
border-top-left-radius: 0;
border-bottom-left-radius: 10px;
border-bottom-right-radius: 0;
box-shadow: 5px 5px 10px rgba(0.2, 0, 0, 0.5);
}
.llm_title {
background-color:#eeeeee;
}
.progress-container {
width: 80%;
background-color: #ddd;
border-radius: 5px;
overflow: hidden;
margin-top: 20px;
}
.progress-bar {
height: 30px;
width: 0%;
background-color: #4CAF50;
text-align: center;
color: white;
line-height: 30px;
}
.left {
justify-content: flex-start;
}
/* 居右 */
.right {
justify-content: flex-end;
}
/* 居中 */
.hcenter {
justify-content: center;
}
/* 居上 */
.top {
align-self: flex-start;
}
/* 居下 */
.bottom {
align-self: flex-end;
}
/* 居中 */
.vcenter {
align-self: center;
}
.video-container {
position: relative;
width: 100%;
height: 100%;
overflow: hidden;
border-radius: 12px;
background: #000;
}
.video-element {
width: 100%;
height: 100%;
border-radius: 12px;
display: block;
}
.controls {
position: absolute;
bottom: 0;
left: 0;
right: 0;
background: linear-gradient(to top, rgba(0,0,0,0.8), transparent);
color: white;
font-size: 14px;
padding: 10px 15px;
transition: opacity 0.3s;
opacity: 0.9;
}
.controls:hover {
opacity: 1;
}
.progress-container {
margin-bottom: 10px;
}
.progress-bar {
width: 100%;
accent-color: #ff0000;
}
.controls-bottom {
display: flex;
align-items: center;
gap: 10px;
flex-wrap: wrap;
}
.play-pause, .mute, .fullscreen {
background: none;
border: none;
color: white;
font-size: 18px;
cursor: pointer;
}
.volume, .playback-speed, .audio-track-select {
font-size: 14px;
padding: 2px;
}
.time {
font-family: monospace;
}
.fullscreen {
margin-left: auto;
}
.thinking-content {
background-color: #fdfcf5;
}
.resp-error {
background-color: #f04444;
background-color: #f0f4f4;
}
.resp-content {
background-color: #f0eed8;
}
.droparea {
border: 2px dashed #666;
border-radius: 10px;
color: #666;
}
.droparea:hover {
border-color: #00aaff;
color: #00aaff;
background: #f0faff;
}
.mini-window {
width: 50px;
height: 50px;
}
.auto-textarea {
/* 1. 确保计算模型一致 */
box-sizing: border-box;
/* 2. 允许元素内部处理滚动事件,不传递给父层 */
touch-action: pan-y;
/* 3. 极其重要:有些 H5 框架会禁用默认滚动,这里强制开启 */
pointer-events: auto !important;
display: block;
width: 100%;
min-height: 40px; /* 初始高度 */
max-height: 350px; /* 最大高度:超过此高度将滚动 */
line-height: 1.5;
padding: 10px;
resize: none; /* 禁用右下角手动拉伸 */
overflow-y: hidden; /* 初始隐藏滚动条 */
overflow-x: hidden;
-webkit-appearance: none; /* 移除 iOS 默认内阴影 */
border: 1px solid #ccc;
border-radius: 4px;
outline: none;
transition: none;
}
/* 针对 Chrome/Edge/Safari 的滚动条美化(解决滚动条突然出现导致内容抖动) */
.auto-textarea::-webkit-scrollbar {
width: 5px;
}
.auto-textarea::-webkit-scrollbar-thumb {
background: rgba(0,0,0,0.2);
border-radius: 10px;
}
.inputbox:focus {
border-color: #007bff;
}
.inputbox.field-error {
border-color: #e74c3c;
}
.bricks-text.field-error-msg {
color: #e74c3c !important;
}
/* ========== Dark Theme (Sage Shell) ========== */
/* 主题感知文字色变量2026-09-17 暗色对比度治理):.ui/.dspy 里禁止硬编码字体色,
用 var(--ink-N) 跟随双主题。亮色=slate 深阶,暗色=slate 浅阶(与 body/card 规则同族)。 */
:root, html:not([data-theme="dark"]) {
--ink-0: #0f172a; /* 最强正文/标题 */
--ink-1: #1e293b; /* 主正文 */
--ink-2: #334155; /* 次正文 */
--ink-3: #475569; /* 弱化说明 */
--bg-side: #f8fafc; /* 侧栏容器底(菜单项未覆盖区) */
--bg-page: #f1f5f9; /* 页面/内容区底 */
--surface-card: #ffffff; /* 卡片表面 */
--line: #e2e8f0; /* 分隔线/边框 */
}
html[data-theme="dark"] {
--ink-0: #f1f5f9;
--ink-1: #e2e8f0;
--ink-2: #cbd5e1;
--ink-3: #94a3b8;
--bg-side: #0F172A;
--bg-page: #0F172A;
--surface-card: #1E293B;
--line: #334155;
}
/* 菜单分组展开指示箭头2026-09-18 用户要求分风格):颜色跟 --ink-3 双主题,
展开态旋转 90°。menu.js 给分组项加 .menu-group / 展开时加 .menu-group-open */
.menu-group::after {
content: "▸";
color: var(--ink-3);
margin-left: 6px;
transition: transform .15s ease;
display: inline-block;
}
.menu-group.menu-group-open::after {
transform: rotate(90deg);
}
[data-theme="dark"] body,
[data-theme="dark"] {
color: #CBD5E1;
background-color: #0F172A;
}
[data-theme="dark"] .card {
background-color: #1E293B;
border: 1px solid #334155;
color: #E2E8F0;
}
[data-theme="dark"] .card:hover {
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
border: 2px solid #60A5FA;
}
[data-theme="dark"] .subcard {
background-color: #1a2436;
}
[data-theme="dark"] .tabular {
background-color: #1E293B;
border: 1px solid #334155;
color: #CBD5E1;
}
[data-theme="dark"] .tabular-header-row {
background-color: #334155;
color: #F1F5F9;
}
[data-theme="dark"] .tabular-row:nth-child(odd) {
background-color: #1E293B;
}
[data-theme="dark"] .tabular-row:nth-child(even) {
background-color: #172033;
}
[data-theme="dark"] .tabular-row-selected {
background-color: #451a1a !important;
color: #F87171;
}
[data-theme="dark"] .tabular-cell {
border: 1px solid #334155;
color: #CBD5E1;
}
[data-theme="dark"] .curpos {
background-color: #1E293B;
}
[data-theme="dark"] .inputbox {
background-color: #0F172A;
color: #E2E8F0;
border: 1px solid #475569;
}
[data-theme="dark"] .inputbox:focus {
border-color: #3B82F6;
}
[data-theme="dark"] .popup {
background-color: #1E293B;
color: #E2E8F0;
border: 1px solid #475569;
}
[data-theme="dark"] .modal {
background-color: #1E293B;
color: #E2E8F0;
border: 1px solid #475569;
}
[data-theme="dark"] .modal>.title {
background-color: #334155;
color: #F1F5F9;
}
[data-theme="dark"] .message {
background-color: #1E293B;
color: #E2E8F0;
border: 1px solid #475569;
}
[data-theme="dark"] .vtoolbar,
[data-theme="dark"] .htoolbar {
background-color: #1E293B;
border: 1px solid #334155;
}
[data-theme="dark"] .toolbar-button {
border: 1px solid #475569;
color: #CBD5E1;
}
[data-theme="dark"] .toolbar-button-active {
background-color: #334155;
}
/* TabPanel 的 tab 按钮Toolbar prefix=scrollpanel2026-09-18 暗色治理):
浏览器默认按钮底色在暗主题下是亮块,必须显式跟主题表面。
未选中按钮无基类Toolbar 只给 active 加 prefix-button-active
故用 .tabpanel 作用域内的 button 兜底 */
[data-theme="dark"] .tabpanel button {
background-color: var(--surface-card);
color: #CBD5E1;
border: 1px solid #334155;
}
[data-theme="dark"] .tabpanel button.selected,
[data-theme="dark"] .tabpanel button.scrollpanel-button-active {
background-color: #334155;
color: #F1F5F9;
}
[data-theme="dark"] .tabpanel {
background-color: #1E293B;
border: 3px solid #475569;
}
[data-theme="dark"] .tabpanel-content {
background-color: #172033;
border: 2px solid #475569;
}
[data-theme="dark"] .selected {
background-color: #334155;
}
[data-theme="dark"] .accordion-item {
border: 1px solid #334155;
}
[data-theme="dark"] .accordion-item:nth-child(odd) {
background-color: #1E293B;
}
[data-theme="dark"] .accordion-item:nth-child(even) {
background-color: #172033;
}
[data-theme="dark"] .accordion-item-header {
background-color: #334155;
}
[data-theme="dark"] .accordion-item-info {
background-color: #1E293B;
}
[data-theme="dark"] .accordion-item-info-selected {
background-color: #334155;
}
[data-theme="dark"] .titlebar {
background-color: #334155;
}
[data-theme="dark"] .droparea {
border: 2px dashed #475569;
color: #94A3B8;
}
[data-theme="dark"] .droparea:hover {
border-color: #60A5FA;
color: #60A5FA;
background: #172033;
}
[data-theme="dark"] pre {
background-color: #1E293B;
color: #E2E8F0;
}
[data-theme="dark"] hr {
background-color: #475569;
}
[data-theme="dark"] .auto-textarea {
background-color: #1E293B;
color: #E2E8F0;
border: 1px solid #475569;
}
[data-theme="dark"] .thinking-content {
background-color: #1a2436;
}
[data-theme="dark"] .resp-content {
background-color: #1a2436;
}
[data-theme="dark"] .resp-error {
background-color: #7F1D1D;
}
[data-theme="dark"] .llm_msg {
background-color: #334155;
color: #E2E8F0;
}
[data-theme="dark"] .user_msg {
background-color: #1E3A5F;
color: #E2E8F0;
}
[data-theme="dark"] .llm_title {
background-color: #1E293B;
}
/* ---- Menu widget (language switcher, context menus) ---- */
[data-theme="dark"] .menuitem {
background-color: #334155 !important;
color: #E2E8F0 !important;
border: 1px solid #475569;
}
[data-theme="dark"] .menuitem:hover {
background-color: #475569 !important;
}
[data-theme="dark"] .menuitem img {
filter: invert(1);
}
/* ---- Sidebar Menu collapse ---- */
.menu-collapsed {
width: 48px !important;
min-width: 48px !important;
overflow: hidden;
}
.menu-collapsed .menuitem {
justify-content: center;
padding: 8px 0;
}
.menu-collapsed .menuitem .bricks-text,
.menu-collapsed .menuitem .text {
display: none;
}
.menu-collapsed .menuitem img {
margin: 0 auto;
}
/* Override Menu widget's inline backgroundColor:"white" */
[data-theme="dark"] .popup .vbox,
[data-theme="dark"] .popup .vcontainer,
[data-theme="dark"] .popup .vscroll {
background-color: #1E293B !important;
color: #E2E8F0;
}
/* ---- Popup content text visibility ---- */
[data-theme="dark"] .popup h1,
[data-theme="dark"] .popup h2,
[data-theme="dark"] .popup h3,
[data-theme="dark"] .popup h4,
[data-theme="dark"] .popup h5,
[data-theme="dark"] .popup h6 {
color: #F1F5F9;
}
[data-theme="dark"] .popup .clickable {
color: #60A5FA;
}
/* ---- WindowsPanel (minimized windows dock) ---- */
[data-theme="dark"] .mini-window {
background-color: #1E293B;
border: 1px solid #475569;
}
[data-theme="dark"] .mini-window:hover {
border-color: #60A5FA;
}
/* ---- DynamicColumn ---- */
[data-theme="dark"] .griddata {
background-color: transparent;
}
/* ---- Top popup shadow (dark variant) ---- */
[data-theme="dark"] .toppopup {
box-shadow: 10px 5px 10px rgba(0,0,0,0.5), 0 -5px 5px rgba(255,255,255,0.05);
}
/* ---- InlineForm ---- */
.inline-form-field {
flex-shrink: 0;
white-space: nowrap;
}
.inline-form-field input,
.inline-form-field select {
height: auto;
margin: 0;
}
/* === FlipCard widget === */
.bricks-flipcard {
perspective: 1000px;
cursor: pointer;
}
.bricks-flipcard-inner {
position: relative;
width: 100%;
height: 100%;
transition: transform 0.6s cubic-bezier(0.4, 0, 0.2, 1);
transform-style: preserve-3d;
}
.bricks-flipcard:hover .bricks-flipcard-inner {
transform: rotateY(180deg);
}
.bricks-flipcard-front,
.bricks-flipcard-back {
position: absolute;
width: 100%;
height: 100%;
backface-visibility: hidden;
-webkit-backface-visibility: hidden;
top: 0;
left: 0;
border-radius: 16px;
overflow: hidden;
}
.bricks-flipcard-back {
transform: rotateY(180deg);
}
.bricks-flipcard-front {
background: #fff;
box-shadow: 0 18px 54px rgba(90, 60, 160, 0.1), 0 4px 16px rgba(90, 60, 160, 0.05);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 24px;
gap: 12px;
}
.bricks-flipcard-back {
background: #3b82f6;
box-shadow: 0 18px 54px rgba(59, 130, 246, 0.2);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 24px;
gap: 12px;
}
/* === Carousel widget === */
.bricks-carousel {
position: relative;
overflow: hidden;
display: flex;
align-items: center;
justify-content: center;
}
/* DimensionFilter active state */
.dimension-btn-active {
background-color: var(--sage-brand, #6366f1) !important;
color: #fff !important;
}
[data-theme="dark"] .dimension-btn-active {
background-color: var(--sage-brand, #818cf8) !important;
}
/* DimensionFilter base */
.dimension-filter {
background: var(--sage-bg, #fff);
color: var(--sage-text, #333);
}
[data-theme="dark"] .dimension-filter {
background: var(--sage-bg-dark, #1e1e2e);
color: var(--sage-text-dark, #e0e0e0);
}
/* ══════════ 移动端适配2026-09-07mobile.js 配套样式) ══════════ */
/* 底部 TabBarTabPanel mobile_bar 模式) */
.tabbar {
position: fixed;
left: 0;
right: 0;
bottom: 0;
z-index: 9000;
display: flex;
align-items: stretch;
background: var(--sage-bg, #ffffff);
border-top: 1px solid #e2e8f0;
padding-bottom: env(safe-area-inset-bottom, 0px);
box-shadow: 0 -2px 12px rgba(15, 23, 42, 0.06);
}
[data-theme="dark"] .tabbar {
background: #0f172a;
border-top-color: #334155;
box-shadow: 0 -2px 12px rgba(0, 0, 0, 0.4);
}
.tabbar-item {
position: relative;
min-height: 52px; /* 触控目标 >= 44px */
padding: 5px 0 4px;
cursor: pointer;
user-select: none;
-webkit-tap-highlight-color: transparent;
color: #64748b;
transition: color 0.15s ease;
}
.tabbar-item-active { color: #2563eb; }
.tabbar-item-press { background: rgba(37, 99, 235, 0.06); }
[data-theme="dark"] .tabbar-item { color: #94a3b8; }
[data-theme="dark"] .tabbar-item-active { color: #60a5fa; }
.tabbar-icon {
font-size: 20px;
line-height: 1.15;
text-align: center;
width: 100%;
}
.tabbar-item-active .tabbar-icon { transform: scale(1.06); }
.tabbar-label {
font-size: 11px;
line-height: 1.2;
text-align: center;
width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.tabbar-item-active .tabbar-label { font-weight: 600; }
.tabbar-badge {
position: absolute;
top: 2px;
left: 58%;
min-width: 16px;
height: 16px;
padding: 0 4px;
border-radius: 8px;
background: #ef4444;
color: #fff !important;
font-size: 10px;
font-weight: 700;
line-height: 16px;
text-align: center;
box-sizing: border-box;
}
/* 手机视口下 TabPanel 内容区为底部 TabBar 让位 */
.tabpanel-mobilebar {
padding-bottom: calc(56px + env(safe-area-inset-bottom, 0px)) !important;
box-sizing: border-box;
}
/* ══════════ MobileSheet 底部上滑竖向菜单2026-09-08 ══════════
「更多」溢出 tab / 手机端功能按钮收缩共用。
蒙层盖全屏(含底部 TabBar 上方z-index 高于 TabBar(9000)。 */
.tabbar-more { flex: 0 0 auto; }
.sheet-mask {
position: fixed;
left: 0;
right: 0;
top: 0;
bottom: 0;
/* 高于 TabBar(9000),低于 PopupWindow(app.new_zindex 从 10000 起)——
sheet 里选「功能」项弹出的窗口必须盖在蒙层之上可交互 */
z-index: 9500;
background: rgba(15, 23, 42, 0.45);
display: flex;
/* VBox 基底是 flex column主轴垂直面板贴底用 justify-content
align-items:flex-end 在 column 下会把面板挤到右侧,实测会翻车) */
justify-content: flex-end;
opacity: 0;
transition: opacity 0.2s ease;
}
.sheet-mask-open { opacity: 1; }
.sheet-panel {
width: 100%;
flex: 0 0 auto;
max-height: 70vh;
overflow-y: auto;
-webkit-overflow-scrolling: touch;
background: var(--sage-bg, #ffffff);
border-radius: 16px 16px 0 0;
padding: 8px 0 calc(12px + env(safe-area-inset-bottom, 0px));
box-shadow: 0 -4px 24px rgba(15, 23, 42, 0.18);
transform: translateY(100%);
transition: transform 0.22s ease;
box-sizing: border-box;
}
.sheet-panel-open { transform: translateY(0); }
[data-theme="dark"] .sheet-panel {
background: #0f172a;
box-shadow: 0 -4px 24px rgba(0, 0, 0, 0.5);
}
.sheet-handle {
flex: 0 0 auto;
align-self: center;
height: 4px;
border-radius: 2px;
background: #cbd5e1;
margin: 4px auto 8px;
}
[data-theme="dark"] .sheet-handle { background: #475569; }
.sheet-title {
font-size: 12px;
color: #94a3b8;
padding: 0 20px 6px;
width: 100%;
box-sizing: border-box;
}
.sheet-empty {
font-size: 13px;
color: #94a3b8;
padding: 18px 20px;
text-align: center;
width: 100%;
box-sizing: border-box;
}
.sheet-item {
min-height: 48px; /* 触控目标 >= 44px */
padding: 10px 20px !important;
box-sizing: border-box;
cursor: pointer;
user-select: none;
-webkit-tap-highlight-color: transparent;
transition: background 0.12s ease;
}
.sheet-item:active { background: rgba(37, 99, 235, 0.06); }
.sheet-item-active { background: rgba(37, 99, 235, 0.08); }
.sheet-item-active .sheet-item-label { color: #2563eb !important; font-weight: 600; }
[data-theme="dark"] .sheet-item:active { background: rgba(96, 165, 250, 0.10); }
[data-theme="dark"] .sheet-item-active { background: rgba(96, 165, 250, 0.12); }
[data-theme="dark"] .sheet-item-active .sheet-item-label { color: #60a5fa !important; }
.sheet-item-icon { font-size: 18px; flex: 0 0 auto; width: 26px; text-align: center; }
.sheet-item-label { font-size: 15px; color: #1e293b !important; line-height: 1.4; }
[data-theme="dark"] .sheet-item-label { color: #e2e8f0 !important; }
.sheet-item-desc { font-size: 12px; color: #94a3b8 !important; line-height: 1.3; }
/* 胶囊切换条ChipBar */
.chipbar {
gap: 8px;
padding: 8px 12px;
overflow-x: auto;
-webkit-overflow-scrolling: touch;
scrollbar-width: none;
align-items: center;
}
.chipbar::-webkit-scrollbar { display: none; }
.chip {
flex: 0 0 auto;
padding: 7px 16px !important;
border-radius: 999px !important;
border: 1px solid #cbd5e1;
background: #ffffff;
color: #334155 !important;
font-size: 13px !important;
cursor: pointer;
user-select: none;
-webkit-tap-highlight-color: transparent;
white-space: nowrap;
transition: all 0.15s ease;
}
.chip-active {
background: #2563eb !important;
border-color: #2563eb;
color: #ffffff !important;
box-shadow: 0 2px 8px rgba(37, 99, 235, 0.35);
}
[data-theme="dark"] .chip {
background: #1e293b;
border-color: #475569;
color: #e2e8f0 !important;
}
[data-theme="dark"] .chip-active {
background: #2563eb !important;
border-color: #2563eb;
color: #ffffff !important;
}
/* ══════════ 手机视口全局规则(<=768px平板按桌面处理 ══════════ */
@media (max-width: 768px) {
/* PopupWindow 全屏化bricks 弹窗行内 width/height/left/top用 !important 覆盖。
* 只针对 .popupwindow —— 普通 .popup下拉菜单/小提示)保持锚定小窗,
* 但同样钳制 max-height 不许超出可视屏2026-09-08 用户报障:
* 弹出窗口/控件高度超出屏幕,要求高度=屏幕高)。
* 100vh 在手机浏览器是 large viewport含地址栏遮挡区可能大于可视高
* 支持 dvh 的内核用 dvhdynamic viewport随地址栏收缩
* 不支持的(老微信 X5 等)由 popup.js _mobile_clamp 以 window.innerHeight
* 实测内联 important 覆盖兜底JS 权威CSS 只是首帧静态兜底)。
* 底部让出 TabBar 高度全屏弹窗不盖住底部标签栏2026-09-08 用户要求),
* 用户随时可点 Tab 离开弹窗页 */
.popupwindow {
width: 100vw !important;
max-width: 100vw !important;
height: calc(100vh - 56px - env(safe-area-inset-bottom, 0px)) !important;
max-height: calc(100vh - 56px - env(safe-area-inset-bottom, 0px)) !important;
left: 0 !important;
top: 0 !important;
border-radius: 0 !important;
box-sizing: border-box;
/* 2026-09-16 用户报障「手机待办详情点输入域弹窗即关」根因修复:
* .popup 基类是 position:absolute——软键盘弹出收缩视口后文档可滚
* 浏览器 focus 自动滚动把 absolute 弹窗整块滚出可视区(视觉=弹窗没了),
* 部分内嵌浏览器 resize/clamp 补偿不来。fixed 钉死视口,文档怎么滚都不动。 */
position: fixed !important;
}
/* 普通弹出控件(.popup下拉/提示/锚定小窗)不许高出可视屏。
* :not(.popupwindow) —— PopupWindow 同时带两个类,它的高度由上面
* .popupwindow 规则钳制(要让出 TabBar别被这里覆盖 */
.popup:not(.popupwindow) {
max-width: 100vw !important;
max-height: calc(100vh - env(safe-area-inset-bottom, 0px)) !important;
overflow-y: auto;
-webkit-overflow-scrolling: touch;
}
@supports (height: 100dvh) {
.popupwindow {
height: calc(100dvh - 56px - env(safe-area-inset-bottom, 0px)) !important;
max-height: calc(100dvh - 56px - env(safe-area-inset-bottom, 0px)) !important;
}
.popup:not(.popupwindow) {
max-height: calc(100dvh - env(safe-area-inset-bottom, 0px)) !important;
}
}
/* 输入控件 16pxiOS Safari 对 <16px 输入框聚焦时自动放大页面 */
.inputbox, .auto-textarea, textarea,
input[type="text"], input[type="password"], input[type="number"], select {
font-size: 16px !important;
}
/* 表格横向滚动不挤压 */
.tabular {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
/* 弹窗/工具栏按钮触控目标 */
.toolbar-button, .popup button, .message button {
min-height: 40px;
}
}
.chip-empty {
color: #94a3b8 !important;
font-size: 13px !important;
padding: 8px 12px !important;
white-space: normal !important;
line-height: 1.5;
}
/* 门禁遮罩定位工具类2026-09-08 未购产线引导层用):
* 根容器 relative + 遮罩 absolute 铺满内容区(不盖顶栏/底部 TabBar */
.pl-gate-root { position: relative; }
.pl-gate {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
}
/* ══════════ 敏感信息选择窗2026-09-17AgentIO 钥匙图标) ══════════
* 样式走全局 classbricks 的内联嵌套 style 对象无效,只能用平铺 options 或 css 类)*/
.secret-picker-tip {
font-size: 0.75rem;
opacity: 0.72;
padding: 2px 4px 8px 4px;
line-height: 1.4;
}
.secret-picker-row {
cursor: pointer;
padding: 5px 6px;
border-radius: 4px;
transition: background-color 0.12s ease;
}
.secret-picker-row:hover {
background-color: rgba(127, 127, 127, 0.16);
}
.secret-picker-meta {
font-size: 0.7rem;
opacity: 0.6;
padding: 0 6px 6px 6px;
}
.secret-type-tag {
font-size: 0.68rem;
opacity: 0.7;
padding: 1px 6px;
border: 1px solid rgba(127, 127, 127, 0.35);
border-radius: 8px;
white-space: nowrap;
}