31a3d326b3
Project CI / Backend tests (pull_request) Failing after 15s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 6m9s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 4m23s
Project CI / Repository checks (pull_request) Failing after 33s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 7m39s
Project CI / Frontend tests (pull_request) Successful in 3m20s
Project CI / AI game creator shell web tests (pull_request) Successful in 2m51s
Project CI / Native shell tests (pull_request) Successful in 9m1s
- packages/shared:定价字段提示句补 `id` 并挂进 `aria-describedby`(与错误行并列),恢复「最多 1000000 泥点」的程序化关联;补两条断言(有错/无误时描述里都含上限)。 - packages/shared:分组标题改用 `PlatformFieldLabel variant="field"`(12px/700/弱化色),与网页「支持设备 / 封面与截图」的 legend 同号;价格输入中和原生 number spinner(`appearance: textfield` + 隐藏 `::-webkit-inner-spin-button`),不再压住「泥点」单位,`inputMode="numeric"` 保留。 - packages/shared:非法态去掉组件级 `!important`,改由网页宿主 remap 的 `[aria-invalid='true']` 分支给出错误色(`src/index.css`,排在 `:focus` 之后),组件侧保留正常权重同名声明供 AGC 生效。 - AGC 壳 Rust(`game_distribution_publish.rs`):作者作品条目解析 `versions[]`;新增 `resolve_owner_next_version_number`(已有版本最大 `versionNumber + 1`,对齐平台 `resolve_version_number(None)`);发布状态回读下发 `nextVersionNumber`(首次发布 `1`;刷新成功的更新 `max+1`;`unavailable` 与「有绑定但没刷新成功」为 `None`);补单测两条。 - AGC 服务层(`gameDistributionPublish.ts`):`versionNumber` 改为必填,删除按清单 `versions[]` 条数的回落;回读结果类型补 `nextVersionNumber`。 - AGC 发布面板:删除本地派生的 `projectVersion`,`项目版本` 显示并提交同一个平台版本号;字段改为只读 + 禁用观感(未知时显示 `—` 占位);平台版本未知时提交按钮禁用并提示重试;「项目版本」不再可从 AGC 手填。 - AGC 样式:新增 `__version-field` / `__version-value`(与相邻字段同形 + 灰底只读观感),并更新版本标签注释为平台口径。 - 测试:AGC 面板三条新口径断言(显示值==提交值==平台下一个版本号;本地迭代计数与遗留字段不参与;平台数据不可得时显示占位/提交禁用/不调用发布)、非 Tauri 宿主用例改为断言禁用、服务层用例改为「只认调用方传入值 + 缺省失败关闭」、live 用例补显式版本号;陈旧注释同步(`game_publish_attempt.rs`、`project/manifest.rs`、`resourceProjectionModel.ts`)。
183 lines
6.2 KiB
CSS
183 lines
6.2 KiB
CSS
/*
|
||
* 买断制定价字段:网页发布页与 AGC 发布面板共用同一份表现与文案。
|
||
*
|
||
* 这里只补平台原语没覆盖的部分,不另造一套控件观感:
|
||
* - 外壳:`PlatformSubpanel`(`platform` 面 + `xs` 圆角 ≈ 网页 `.game-publish-fieldset` 的
|
||
* 0.7rem 描边卡片,AGC 侧同族容器是 `.game-distribution-publish-panel__publication`)。
|
||
* - 付费方式:原生 radio(屏外裁切保留语义 / 键盘 / `.checked`)+ 共享 chip 外观
|
||
* (`getPlatformCategoryChipClassName`:未选=浅底描边,选中=实心品牌填充反白)。
|
||
* - 买断价:`PlatformTextField`,本文件只补右对齐等宽数字、单位留位、错误态与层次。
|
||
*
|
||
* 选择器统一写成「根类 + 子类」而不是裸类:AGC 发布面板的
|
||
* `.game-distribution-publish-panel__fields label/input` 是后代选择器(0,1,1),会盖掉
|
||
* 原语里的 Tailwind 工具类(0,1,0)。提高一档特异性后,组件外观在两端都由这里唯一决定。
|
||
*/
|
||
.platform-game-pricing-field {
|
||
display: grid;
|
||
gap: 0.6rem;
|
||
min-width: 0;
|
||
font-size: 0.76rem;
|
||
color: var(--platform-text-strong, #3d1f10);
|
||
}
|
||
|
||
.platform-game-pricing-field .platform-game-pricing-field__modes {
|
||
display: flex;
|
||
flex-wrap: wrap;
|
||
align-items: center;
|
||
gap: 0.5rem;
|
||
min-width: 0;
|
||
}
|
||
|
||
.platform-game-pricing-field .platform-game-pricing-field__option {
|
||
position: relative;
|
||
display: inline-flex;
|
||
gap: 0;
|
||
min-width: 0;
|
||
margin: 0;
|
||
cursor: pointer;
|
||
}
|
||
|
||
/* 原生 radio 只做语义与键盘载体:`display: none` / `visibility: hidden` 会把可聚焦性和
|
||
读屏可见性一起拿掉,所以用「屏外裁切」隐藏,焦点仍落在它身上。 */
|
||
.platform-game-pricing-field .platform-game-pricing-field__option-input {
|
||
position: absolute;
|
||
top: 0;
|
||
left: 0;
|
||
box-sizing: border-box;
|
||
width: 1px;
|
||
height: 1px;
|
||
min-width: 0;
|
||
margin: 0;
|
||
border: 0;
|
||
padding: 0;
|
||
background: transparent;
|
||
overflow: hidden;
|
||
white-space: nowrap;
|
||
clip-path: inset(50%);
|
||
}
|
||
|
||
/* chip 自带高度 36px(窄屏还会降到 33px),这里统一抬到 44px 触控下限;
|
||
「免费 / 买断制」字数不同,按内容宽度会一宽一窄,给个共同下限让两枚等宽。 */
|
||
.platform-game-pricing-field .platform-game-pricing-field__option-chip {
|
||
min-width: 5.5rem;
|
||
min-height: 2.75rem;
|
||
}
|
||
|
||
.platform-game-pricing-field
|
||
.platform-game-pricing-field__option-input:focus-visible
|
||
+ .platform-game-pricing-field__option-chip {
|
||
outline: 2px solid var(--platform-input-focus-ring, #b6623f);
|
||
outline-offset: 2px;
|
||
}
|
||
|
||
.platform-game-pricing-field
|
||
.platform-game-pricing-field__option-input:disabled
|
||
+ .platform-game-pricing-field__option-chip {
|
||
cursor: not-allowed;
|
||
opacity: 0.55;
|
||
}
|
||
|
||
.platform-game-pricing-field .platform-game-pricing-field__price {
|
||
display: grid;
|
||
gap: 0.35rem;
|
||
min-width: 0;
|
||
}
|
||
|
||
.platform-game-pricing-field .platform-game-pricing-field__price-label {
|
||
display: block;
|
||
color: var(--platform-text-strong, #3d1f10);
|
||
font-size: 0.75rem;
|
||
font-weight: 700;
|
||
line-height: 1.35;
|
||
cursor: pointer;
|
||
}
|
||
|
||
.platform-game-pricing-field .platform-game-pricing-field__price-control {
|
||
position: relative;
|
||
display: flex;
|
||
align-items: center;
|
||
min-width: 0;
|
||
}
|
||
|
||
/* 边框 / 圆角 / 底色 / 焦点环都来自 `PlatformTextField`(AGC 宿主还会用面板自己的输入框
|
||
token 覆盖,与同面板其它输入框一致),这里只补三件事:数字右对齐且等宽、给单位留位、错误态。 */
|
||
.platform-game-pricing-field .platform-game-pricing-field__price-input {
|
||
padding-right: 2.9rem;
|
||
font-weight: 600;
|
||
font-variant-numeric: tabular-nums;
|
||
letter-spacing: 0.01em;
|
||
text-align: right;
|
||
}
|
||
|
||
/* 错误态。网页宿主对子面板内的输入框做了统一 remap(`src/index.css` 的
|
||
`.platform-theme :where(.platform-subpanel …) :where(input…)`,带 `!important`),
|
||
非法态在那边由宿主同族的 `[aria-invalid='true']` 分支给出;这里保留**正常权重**的同色声明,
|
||
AGC 侧没有那套 remap 时就靠这条生效。不改 `box-shadow`:那是宿主的输入高光与焦点环,
|
||
压掉会让非法字段失去键盘焦点提示。 */
|
||
.platform-game-pricing-field
|
||
.platform-game-pricing-field__price-input[aria-invalid='true'] {
|
||
border-color: var(--platform-button-danger-text, #a6402f);
|
||
background: var(--platform-button-danger-fill, rgba(255, 237, 229, 0.94));
|
||
}
|
||
|
||
/* 原生 number 的上下箭头会画在「泥点」单位左边(Chrome 一直画,Firefox hover 才画),
|
||
与单位挤在一起;这里隐藏箭头,保留 `type="number"` + `inputMode="numeric"`(移动端仍是数字键盘)。 */
|
||
.platform-game-pricing-field
|
||
.platform-game-pricing-field__price-input::-webkit-outer-spin-button,
|
||
.platform-game-pricing-field
|
||
.platform-game-pricing-field__price-input::-webkit-inner-spin-button {
|
||
margin: 0;
|
||
-webkit-appearance: none;
|
||
appearance: none;
|
||
}
|
||
|
||
.platform-game-pricing-field .platform-game-pricing-field__price-input {
|
||
-moz-appearance: textfield;
|
||
appearance: textfield;
|
||
}
|
||
|
||
.platform-game-pricing-field .platform-game-pricing-field__price-unit {
|
||
position: absolute;
|
||
top: 50%;
|
||
right: 0.75rem;
|
||
transform: translateY(-50%);
|
||
color: var(--platform-text-soft, #988476);
|
||
font-size: 0.72rem;
|
||
font-weight: 700;
|
||
line-height: 1;
|
||
pointer-events: none;
|
||
}
|
||
|
||
.platform-game-pricing-field
|
||
.platform-game-pricing-field__price-input[aria-invalid='true']
|
||
+ .platform-game-pricing-field__price-unit {
|
||
color: var(--platform-button-danger-text, #a6402f);
|
||
}
|
||
|
||
.platform-game-pricing-field .platform-game-pricing-field__hint {
|
||
color: var(--platform-text-soft, #988476);
|
||
font-size: 0.7rem;
|
||
font-weight: 500;
|
||
line-height: 1.5;
|
||
}
|
||
|
||
.platform-game-pricing-field .platform-game-pricing-field__error {
|
||
color: var(--platform-button-danger-text, #a6402f);
|
||
font-size: 0.72rem;
|
||
font-weight: 600;
|
||
line-height: 1.45;
|
||
}
|
||
|
||
/* 窄屏(≈390px):两枚胶囊等分整行,不靠换行兜底,也不出现横向溢出。 */
|
||
@media (max-width: 480px) {
|
||
.platform-game-pricing-field .platform-game-pricing-field__modes {
|
||
display: grid;
|
||
grid-template-columns: repeat(2, minmax(0, 1fr));
|
||
}
|
||
|
||
.platform-game-pricing-field .platform-game-pricing-field__option-chip {
|
||
width: 100%;
|
||
min-width: 0;
|
||
}
|
||
}
|