/* Kole UI Mobile · Form 样式 — 对齐移动端规格 §32 表单:每个字段由「标签 + 必填星号 + 控件 + 错误提示」四段组成。 移动端与桌面端的关键差别是**标签位置**:窄屏放不下定宽左标签时用置顶标签(默认), 需要纵向对齐的一组字段才用 labelPosition=left。 错误提示在控件下方(不在标签旁),错误态用 is-error 与 aria-invalid 双写。 */ .kole-m-form { /* 组件级变量:业务侧可在容器上覆盖 */ --kole-m-form-label-width: 72px; /* labelPosition=left 时的标签列宽 */ --kole-m-form-gap: var(--kole-space-8); /* 标签与控件之间的间距 */ box-sizing: border-box; width: 100%; background: var(--kole-color-card-bg); color: var(--kole-color-text-body); font-family: inherit; font-size: var(--kole-m-font-size-body); line-height: 1.4; } /* 字段:一列一个字段,字段之间用 1px 分隔线划分(变体 borderless=false,默认) */ .kole-m-form__item { box-sizing: border-box; display: flex; flex-direction: column; gap: var(--kole-m-form-gap); padding: var(--kole-space-12) var(--kole-m-gutter); } .kole-m-form:not(.kole-m-form--borderless) .kole-m-form__item + .kole-m-form__item { border-top: 1px solid var(--kole-color-border); } /* 变体 borderless=true:不画分隔线,靠留白分组(贴在卡片里时用) */ .kole-m-form--borderless .kole-m-form__item + .kole-m-form__item { border-top: 0; } /* 变体 labelPosition=left:标签与控件同一行,标签列定宽、控件自适应 */ .kole-m-form--left .kole-m-form__item { flex-direction: row; align-items: flex-start; } .kole-m-form--left .kole-m-form__label { flex: 0 0 auto; width: var(--kole-m-form-label-width); /* 标签首行与控件首行文字对齐(控件自身有 8px 内边距与 1px 边框) */ padding-top: calc(var(--kole-space-8) + 1px); } .kole-m-form__label { display: flex; align-items: center; gap: var(--kole-space-4); color: var(--kole-color-text-title); font-size: var(--kole-m-font-size-label); } /* 必填星号:语义由控件的 aria-required 承担,星号本身对读屏隐藏 */ .kole-m-form__star { flex: 0 0 auto; color: var(--kole-color-error); font-size: var(--kole-m-font-size-label); line-height: 1; } /* 控件列:控件 + 下方错误提示(错误提示跟着控件走,不跨到标签列) */ .kole-m-form__main { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: var(--kole-space-4); } .kole-m-form__control { box-sizing: border-box; display: block; width: 100%; min-height: var(--kole-m-touch-target); padding: var(--kole-space-8) var(--kole-space-12); border: 1px solid var(--kole-color-border); border-radius: var(--kole-radius-base); background: var(--kole-color-card-bg); color: var(--kole-color-text-body); font-family: inherit; font-size: var(--kole-m-font-size-body); line-height: 1.4; } .kole-m-form__control::placeholder { color: var(--kole-color-text-placeholder); } /* 多行字段:控件高度由宿主决定(min-height 仍是 44px 触控下限) */ .kole-m-form__control--multiline { min-height: calc(var(--kole-m-touch-target) * 2); resize: none; } .kole-m-form__control:focus-visible { outline: 2px solid var(--kole-color-focus-ring); outline-offset: -2px; } /* 非输入型控件(选择器一类)包一层可点区域:整行热区,按下有反馈 */ .kole-m-form__hit { box-sizing: border-box; display: flex; align-items: center; justify-content: space-between; gap: var(--kole-space-8); width: 100%; min-height: var(--kole-m-touch-target); padding: var(--kole-space-8) var(--kole-space-12); border: 1px solid var(--kole-color-border); border-radius: var(--kole-radius-base); background: var(--kole-color-card-bg); color: var(--kole-color-text-body); font-family: inherit; font-size: var(--kole-m-font-size-body); line-height: 1.4; text-align: start; } .kole-m-form__hit:active { background: var(--kole-color-table-header-bg); } /* 状态 error:字段级 —— 边框、标签与星号一起变错误色(不只靠一处提示) */ .kole-m-form__item.is-error .kole-m-form__control, .kole-m-form__item.is-error .kole-m-form__hit { border-color: var(--kole-color-error); } .kole-m-form__item.is-error .kole-m-form__label { color: var(--kole-color-error); } .kole-m-form__error { display: block; color: var(--kole-color-error); font-size: var(--kole-m-font-size-label); line-height: 1.4; } /* 提示行:未出错时是辅助说明(如「用于接收发货通知」),出错时换成错误文案 */ .kole-m-form__hint { display: block; color: var(--kole-color-text-secondary); font-size: var(--kole-m-font-size-label); line-height: 1.4; } /* 状态 disabled:整表置灰且不可聚焦(子控件是原生 disabled,这里补视觉) */ .kole-m-form.is-disabled { background: var(--kole-color-disabled-bg); } .kole-m-form.is-disabled .kole-m-form__label, .kole-m-form.is-disabled .kole-m-form__hint { color: var(--kole-color-text-disabled); } .kole-m-form.is-disabled .kole-m-form__control, .kole-m-form.is-disabled .kole-m-form__hit { background: var(--kole-color-disabled-bg); color: var(--kole-color-text-disabled); cursor: not-allowed; } /* 提交行:整行一个主操作按钮(高度 ≥ 44px 触控边长;禁用时置灰) */ .kole-m-form__submit { box-sizing: border-box; display: flex; align-items: center; justify-content: center; width: 100%; min-height: var(--kole-m-touch-target); padding: 0 var(--kole-space-16); border: 0; border-radius: var(--kole-radius-base); background: var(--kole-color-brand); color: var(--kole-color-text-inverse); font-family: inherit; font-size: var(--kole-m-font-size-body); line-height: 1; cursor: pointer; touch-action: manipulation; } .kole-m-form__submit:active { background: var(--kole-color-brand-active); } .kole-m-form__submit:disabled, .kole-m-form.is-disabled .kole-m-form__submit { background: var(--kole-color-disabled-bg); color: var(--kole-color-text-disabled); cursor: not-allowed; } .kole-m-form__submit:focus-visible { outline: 2px solid var(--kole-color-focus-ring); outline-offset: 2px; }