Download webui/styles.css from shivam413/Hohoho: direct link, hf CLI and curl.
- Browser
- Download file 15.2 kB
-
https://huggingface.co/spaces/shivam413/Hohoho/resolve/main/webui/styles.css
- Command line
-
hf download hf://spaces/shivam413/Hohoho/webui/styles.css
-
curl -L -o styles.css https://huggingface.co/spaces/shivam413/Hohoho/resolve/main/webui/styles.css
15.2 kB
| header[data-testid="stHeader"], | |
| div[data-testid="stToolbar"], | |
| div[data-testid="stDecoration"], | |
| div[data-testid="stStatusWidget"], | |
| div[data-testid="stSkillsNudgeAnchor"], | |
| div[data-testid="stSkillsNudge"] { | |
| display: none ; | |
| } | |
| div[data-testid="stMainBlockContainer"] { | |
| padding-top: 0.5rem ; | |
| } | |
| h1 { | |
| padding-top: 0 ; | |
| margin-top: 0 ; | |
| } | |
| /* Streamlit 默认让标签中的帮助区域占据剩余宽度,导致问号按钮贴到控件最右侧。 | |
| 帮助提示在语义上从属于标签文字,因此取消该区域的伸展,并用固定小间距让 | |
| 问号紧跟标签;没有 help 参数的标签不存在这个 div,不会受到影响。 */ | |
| label[data-testid="stWidgetLabel"] > div { | |
| flex: 0 0 auto ; | |
| width: auto ; | |
| margin-left: 0.35rem ; | |
| } | |
| /* 视频主题与大模型存在直接依赖,把配置入口放在字段标签旁。这里将 tertiary | |
| button 收敛为普通文字链接,避免它与下方“生成文案”主操作争夺视觉层级; | |
| text_area 仍保留折叠 label,因此屏幕阅读器可以继续读取字段名称。 */ | |
| div[class*="st-key-video_subject_label_row"] { | |
| align-items: baseline ; | |
| gap: 0.45rem ; | |
| } | |
| /* 自定义标签行和 text_area 是同一字段的两个子元素。覆盖 Streamlit 容器默认 | |
| 的纵向大间距,使它与原生“标签 + 输入框”控件保持相同的视觉节奏。 */ | |
| div[class*="st-key-video_subject_field"] { | |
| gap: 0.35rem ; | |
| } | |
| div[class*="st-key-video_subject_label_row"] | |
| [data-testid="stMarkdownContainer"] p { | |
| margin: 0 ; | |
| font-size: 0.875rem ; | |
| line-height: 1.25rem ; | |
| } | |
| div[class*="st-key-video_subject_label_row"] button { | |
| min-height: 0 ; | |
| height: auto ; | |
| padding: 0 ; | |
| border: 0 ; | |
| background: transparent ; | |
| color: var(--st-link-color, #0068c9) ; | |
| font-size: 0.8rem ; | |
| line-height: 1.25rem ; | |
| } | |
| div[class*="st-key-video_subject_label_row"] button p { | |
| margin: 0 ; | |
| color: var(--st-link-color, #0068c9) ; | |
| font-size: 0.8rem ; | |
| line-height: 1.25rem ; | |
| } | |
| div[class*="st-key-video_subject_label_row"] button:hover { | |
| background: transparent ; | |
| text-decoration: underline ; | |
| text-underline-offset: 0.15rem; | |
| } | |
| /* 配音方式位于四列布局中的窄面板。Streamlit 的 stretch 模式默认让单个分段 | |
| 按钮接近半行宽,三个选项会换成两行;这里仅对该控件改为三等分,并压缩 | |
| 水平内边距,保持其它 segmented control 的原生尺寸不变。 */ | |
| div[class*="st-key-voice_mode_control"] [role="radiogroup"] { | |
| flex-wrap: nowrap ; | |
| } | |
| div[class*="st-key-voice_mode_control"] [role="radiogroup"] > button { | |
| flex: 1 1 0 ; | |
| width: auto ; | |
| min-width: 0 ; | |
| padding: 0.25rem ; | |
| } | |
| div[class*="st-key-voice_mode_control"] [role="radiogroup"] > button p { | |
| overflow: hidden ; | |
| font-size: 0.8rem ; | |
| text-overflow: ellipsis ; | |
| white-space: nowrap ; | |
| } | |
| /* 顶部品牌区将项目名和弱化版本号放在同一基线。项目名称仍是页面唯一的 h1; | |
| 版本号本身作为项目链接,避免增加独立图标而干扰标题的视觉层级。 */ | |
| .mpt-brand { | |
| min-width: 0; | |
| margin: 0; | |
| padding: 0; | |
| color: inherit; | |
| line-height: 1.15; | |
| } | |
| /* Streamlit 会在自定义 h1 内增加一层文本容器,实际的行内布局需要作用在 | |
| 这层容器上,才能稳定控制项目名和版本号的间距。 */ | |
| .mpt-brand > span:first-child { | |
| display: flex; | |
| align-items: baseline; | |
| gap: 0.65rem; | |
| min-width: 0; | |
| } | |
| .mpt-brand__name { | |
| min-width: 0; | |
| font-size: 2.75rem; | |
| font-weight: 700; | |
| letter-spacing: 0; | |
| white-space: nowrap; | |
| } | |
| .mpt-brand__version { | |
| flex: 0 0 auto; | |
| font-size: 1rem; | |
| font-weight: 600; | |
| color: inherit ; | |
| opacity: 0.72; | |
| text-decoration: none ; | |
| white-space: nowrap; | |
| } | |
| .mpt-brand__version:hover { | |
| color: inherit ; | |
| opacity: 1; | |
| text-decoration: underline ; | |
| text-underline-offset: 0.18em; | |
| } | |
| .mpt-brand__version:focus-visible { | |
| outline: 2px solid rgba(255, 75, 75, 0.48); | |
| outline-offset: 2px; | |
| } | |
| /* 新版本提醒只在确有正式版本更新时出现。使用文字链接而不是按钮或横幅, | |
| 让它保持可发现性,同时不抢占项目标题和主要操作入口的视觉层级。 */ | |
| .mpt-brand__update { | |
| flex: 0 0 auto; | |
| font-size: 0.875rem; | |
| font-weight: 600; | |
| color: #d94848 ; | |
| text-decoration: none ; | |
| white-space: nowrap; | |
| } | |
| .mpt-brand__update:hover { | |
| text-decoration: underline ; | |
| text-underline-offset: 0.18em; | |
| } | |
| .mpt-brand__update:focus-visible { | |
| outline: 2px solid rgba(255, 75, 75, 0.48); | |
| outline-offset: 2px; | |
| } | |
| @media (prefers-color-scheme: dark) { | |
| .mpt-brand__update { | |
| color: #ff6b6b ; | |
| } | |
| } | |
| /* Streamlit 会自动给 h1 追加一个标题锚点。品牌区已有版本号项目链接,额外的 | |
| 标题锚点没有实际价值,因此只在这个标题内隐藏,避免窄屏出现多余图标。 */ | |
| .mpt-brand > [data-testid="stHeaderActionElements"] { | |
| display: none ; | |
| } | |
| /* 顶部任务入口由 st.fragment 定时刷新,Streamlit 会为 Fragment 自动生成一个 | |
| 占满整行的 LayoutWrapper。这里只收缩该包装层,保证右侧操作区按内容紧凑排列。 */ | |
| .st-key-top_bar_actions | |
| > div[data-testid="stLayoutWrapper"]:first-child { | |
| flex: 0 0 auto ; | |
| width: fit-content ; | |
| } | |
| @media (max-width: 700px) { | |
| .mpt-brand > span:first-child { | |
| gap: 0.45rem; | |
| } | |
| .mpt-brand__name { | |
| font-size: 1.875rem; | |
| } | |
| .mpt-brand__version { | |
| font-size: 0.875rem; | |
| } | |
| .mpt-brand__update { | |
| font-size: 0.75rem; | |
| } | |
| } | |
| @media (max-width: 480px) { | |
| .mpt-brand > span:first-child { | |
| gap: 0.35rem; | |
| } | |
| .mpt-brand__name { | |
| font-size: 1.5rem; | |
| } | |
| .mpt-brand__version { | |
| font-size: 0.75rem; | |
| } | |
| .mpt-brand__update { | |
| font-size: 0.6875rem; | |
| } | |
| } | |
| /* 高级设置属于内容展开入口,不是执行操作。保留 Streamlit 原生 expander 的 | |
| 语义和键盘交互,只在带 advanced_settings_ key 的局部容器内移除卡片边框, | |
| 避免与紧邻的 AI 生成按钮形成两个连续大按钮的视觉干扰。 */ | |
| div[class*="st-key-advanced_settings_"] details { | |
| border: 0 ; | |
| border-radius: 4px ; | |
| background: transparent ; | |
| } | |
| div[class*="st-key-advanced_settings_"] details > summary { | |
| min-height: 2.25rem ; | |
| padding: 0.35rem 0.25rem ; | |
| color: inherit ; | |
| opacity: 0.78; | |
| } | |
| div[class*="st-key-advanced_settings_"] details > summary:hover { | |
| opacity: 1; | |
| background: color-mix( | |
| in srgb, | |
| currentColor 6%, | |
| transparent | |
| ) ; | |
| } | |
| /* 展开后让标题和内容共享同一背景,视觉上形成连续区域;折叠状态仍保持原有的 | |
| 透明轻量入口,不额外占用页面层级。 */ | |
| div[class*="st-key-advanced_settings_"] details[open] > summary { | |
| border-radius: 4px 4px 0 0 ; | |
| opacity: 1; | |
| background: color-mix( | |
| in srgb, | |
| currentColor 5%, | |
| transparent | |
| ) ; | |
| } | |
| div[class*="st-key-advanced_settings_"] details > summary:focus { | |
| background: color-mix( | |
| in srgb, | |
| currentColor 5%, | |
| transparent | |
| ) ; | |
| box-shadow: none ; | |
| outline: none ; | |
| } | |
| /* 键盘操作使用标题下划线作为焦点反馈,不再绘制任何外框,确保展开区域在视觉 | |
| 上完全无边框,同时仍能让键盘用户识别当前焦点。 */ | |
| div[class*="st-key-advanced_settings_"] details > summary:focus-visible { | |
| box-shadow: none ; | |
| } | |
| div[class*="st-key-advanced_settings_"] details > summary:focus-visible p { | |
| text-decoration: underline ; | |
| text-underline-offset: 0.18em; | |
| } | |
| div[class*="st-key-advanced_settings_"] details > summary p { | |
| font-size: 0.9rem ; | |
| font-weight: 500 ; | |
| } | |
| /* 内容区与展开标题无缝衔接,不使用任何边框,仅通过统一背景和内边距表达 | |
| 控件从属于高级设置,避免出现嵌套卡片或割裂的两段式结构。 */ | |
| div[class*="st-key-advanced_settings_"] div[data-testid="stExpanderDetails"] { | |
| margin-top: 0 ; | |
| padding: 0.75rem 0.75rem 0.85rem 1rem ; | |
| border: 0 ; | |
| border-radius: 0 0 4px 4px ; | |
| background: color-mix( | |
| in srgb, | |
| currentColor 5%, | |
| transparent | |
| ) ; | |
| } | |
| /* 任务管理 popover 需要固定宽度,避免内容从空状态、列表状态切换时 | |
| 反复改变宽度造成页面抖动。宽度仍保留视口约束,兼容窄屏。 */ | |
| div[data-testid="stPopoverBody"] { | |
| width: min(860px, calc(100vw - 48px)) ; | |
| max-width: min(860px, calc(100vw - 48px)) ; | |
| } | |
| div[data-testid="stPopoverBody"] div[data-testid="stVerticalBlock"] { | |
| width: 100% ; | |
| } | |
| /* 任务管理列表保留 Streamlit 原生布局,只做轻量压缩,避免每一行过高。 | |
| 通过 task_row_ key 限定作用范围,避免影响其它配置面板的 container。 */ | |
| div[class*="st-key-task_row_"] { | |
| margin-bottom: 0.18rem ; | |
| } | |
| div[class*="st-key-task_row_"] div[data-testid="stVerticalBlockBorderWrapper"] { | |
| padding: 0.18rem 0.6rem ; | |
| } | |
| div[class*="st-key-task_row_"] div[data-testid="stElementContainer"], | |
| div[class*="st-key-task_row_"] div[data-testid="stMarkdown"] { | |
| margin-bottom: 0 ; | |
| } | |
| div[class*="st-key-task_row_"] div[data-testid="stMarkdown"] { | |
| display: flex ; | |
| align-items: center ; | |
| min-height: 1.75rem ; | |
| } | |
| div[class*="st-key-task_row_"] div[data-testid="stMarkdownContainer"] { | |
| display: flex ; | |
| align-items: center ; | |
| margin-bottom: 0 ; | |
| } | |
| div[class*="st-key-task_row_"] p { | |
| margin-bottom: 0 ; | |
| line-height: 1.25 ; | |
| } | |
| div[class*="st-key-task_row_"] button[kind="secondary"] { | |
| position: relative ; | |
| min-height: 1.75rem ; | |
| height: 1.75rem ; | |
| padding: 0.1rem 0.3rem ; | |
| } | |
| /* 按钮文字视觉隐藏后,Streamlit 仍会保留图标与文字之间的默认间距,导致 | |
| 单独图标向左偏移。清除该间距并让内容层占满按钮,确保操作图标严格居中。 */ | |
| div[class*="st-key-task_row_"] | |
| button[kind="secondary"] | |
| span[data-has-shortcut] { | |
| width: 100% ; | |
| gap: 0 ; | |
| justify-content: center ; | |
| } | |
| /* 行内操作保留可访问的按钮名称,但视觉上只显示图标。使用屏幕阅读器可见的 | |
| 隐藏方式,而不是 display:none,确保每个操作仍能被正确朗读。 */ | |
| div[class*="st-key-task_row_"] button[kind="secondary"] p { | |
| position: absolute ; | |
| width: 1px ; | |
| height: 1px ; | |
| padding: 0 ; | |
| margin: -1px ; | |
| overflow: hidden ; | |
| clip: rect(0, 0, 0, 0) ; | |
| clip-path: inset(50%) ; | |
| white-space: nowrap ; | |
| } | |
| /* 中等宽度下将四个设置面板调整为 2×2。主内容区还会扣除页面边距,因此 | |
| 1200~1440px 的常见视口不足以稳定容纳四列英文标签;断点覆盖到 1500px, | |
| 避免下拉内容和标题被裁切,真正的宽屏才恢复四列。 */ | |
| @media (min-width: 701px) and (max-width: 1500px) { | |
| .mpt-brand__name { | |
| font-size: 2.25rem; | |
| } | |
| .mpt-brand__version { | |
| font-size: 0.875rem; | |
| } | |
| div[class*="st-key-main_settings_grid"] | |
| > div[data-testid="stLayoutWrapper"] | |
| > div[data-testid="stHorizontalBlock"] { | |
| flex-wrap: wrap ; | |
| gap: 1rem ; | |
| } | |
| div[class*="st-key-main_settings_grid"] | |
| > div[data-testid="stLayoutWrapper"] | |
| > div[data-testid="stHorizontalBlock"] | |
| > div[data-testid="stColumn"] { | |
| flex: 1 1 calc(50% - 0.5rem) ; | |
| width: calc(50% - 0.5rem) ; | |
| min-width: calc(50% - 0.5rem) ; | |
| } | |
| } | |
| /* 移动端隐藏桌面表头,并将任务行重排为“主题 + 元信息 + 操作”紧凑结构。 */ | |
| @media (max-width: 700px) { | |
| div[class*="st-key-task_table_header_"] { | |
| display: none ; | |
| } | |
| div[class*="st-key-task_row_"] | |
| > div[data-testid="stLayoutWrapper"] | |
| > div[data-testid="stHorizontalBlock"] { | |
| display: grid ; | |
| grid-template-columns: auto minmax(0, 1fr) auto auto; | |
| gap: 0.2rem 0.5rem ; | |
| align-items: center ; | |
| } | |
| div[class*="st-key-task_row_"] | |
| > div[data-testid="stLayoutWrapper"] | |
| > div[data-testid="stHorizontalBlock"] | |
| > div[data-testid="stColumn"] { | |
| width: auto ; | |
| min-width: 0 ; | |
| } | |
| div[class*="st-key-task_row_"] | |
| > div[data-testid="stLayoutWrapper"] | |
| > div[data-testid="stHorizontalBlock"] | |
| > div[data-testid="stColumn"]:nth-child(1) { | |
| grid-column: 1; | |
| grid-row: 2; | |
| } | |
| div[class*="st-key-task_row_"] | |
| > div[data-testid="stLayoutWrapper"] | |
| > div[data-testid="stHorizontalBlock"] | |
| > div[data-testid="stColumn"]:nth-child(2) { | |
| grid-column: 2; | |
| grid-row: 2; | |
| } | |
| div[class*="st-key-task_row_"] | |
| > div[data-testid="stLayoutWrapper"] | |
| > div[data-testid="stHorizontalBlock"] | |
| > div[data-testid="stColumn"]:nth-child(3) { | |
| grid-column: 1 / 4; | |
| grid-row: 1; | |
| font-weight: 600; | |
| } | |
| div[class*="st-key-task_row_"] | |
| > div[data-testid="stLayoutWrapper"] | |
| > div[data-testid="stHorizontalBlock"] | |
| > div[data-testid="stColumn"]:nth-child(4) { | |
| grid-column: 3; | |
| grid-row: 2; | |
| } | |
| div[class*="st-key-task_row_"] | |
| > div[data-testid="stLayoutWrapper"] | |
| > div[data-testid="stHorizontalBlock"] | |
| > div[data-testid="stColumn"]:nth-child(5) { | |
| grid-column: 4; | |
| grid-row: 1 / 3; | |
| } | |
| div[class*="st-key-task_row_"] | |
| > div[data-testid="stLayoutWrapper"] | |
| > div[data-testid="stHorizontalBlock"] | |
| > div[data-testid="stColumn"]:nth-child(5) | |
| div[data-testid="stHorizontalBlock"] { | |
| display: flex ; | |
| flex-direction: row ; | |
| gap: 0.15rem ; | |
| } | |
| div[class*="st-key-task_row_"] | |
| > div[data-testid="stLayoutWrapper"] | |
| > div[data-testid="stHorizontalBlock"] | |
| > div[data-testid="stColumn"]:nth-child(5) | |
| div[data-testid="stColumn"] { | |
| flex: 1 1 0 ; | |
| width: auto ; | |
| min-width: 1.75rem ; | |
| } | |
| } | |