@q1travel/design-system 0.15.1 → 0.15.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -75,3 +75,4 @@ q1travel 的界面图标**目标是**一套自建的线性图标系统:几何
75
75
  - **颜色**:不为图标单独设色,依赖 `currentColor` 跟随文本。
76
76
  - **间距**:图标与文本之间保留一致间距,并与文本基线对齐。
77
77
  - **一致性**:同一控件组内不混用不同描边或尺寸。
78
+ - **光学位移**:16px 线性图标贴文字标签时,图标框几何居中不等于看起来居中。位移统一消费 `--q1-optical-icon-shift-cjk-label`,通过独立的 `translate` 属性施加,不改 `transform`,因此不会冲掉 chevron 的旋转。取值按字体栈校准:包默认 `--q1-font-sans` 为 `0px`;拉丁首选字体决定行盒、中文回退 PingFang SC 的字体栈(web 当前字体栈)为 `-1px`,由消费方在自己的根上覆盖。纯英文标签会因此偏高约 1–2px,这是 x-height 的物理位置,不再按脚本细分。已接入:Navigation 分组图标、分组 chevron、链接项图标;ContextSwitcher 单行条目图标与动作图标。Button 前后缀默认不位移,消费方在已知全是中文的场景把 `--q1-button-affix-optical-y` 设为该 token。数值由 `check:browser` 的光学 fixture 锁定,见 `contracts/token-naming.md` 的 Optical Tokens。
@@ -17,6 +17,7 @@ README owns the repository inventory and generated-file boundary. This file owns
17
17
  | Component preview tile | Control density sample | Custom preview composition using component token mappings | Surface, border, action, focus, radius tokens | Button and segment visual states | Flex wrap preserves compact layout | Decorative in intro, real controls documented on component pages |
18
18
  | Color rods preview | Color scale summary | Custom preview composition using color scale aliases | `--q1-color-scale-*` aliases | None | Rods distribute across available width | Semantic labels identify the represented scale |
19
19
  | Color page reference and semantic tokens | Token reference and theme value copy | `ColorSwatch`, `SemanticColorListItem`, and `SemanticColorDemo` inside `ColorsPage` | `--q1-color-*`, semantic color tokens, and semantic action tokens | Left click copies token, context menu copies resolved value. The focus shadow token shows as an applied focus ring, not a flat color swatch | Ten-step grid and semantic rows adapt to available width | Button labels, semantic rows, live copy feedback |
20
+ | Optical alignment | Aligned-looking media, icons, labels, and column edges | `ContextSwitcher` two-line rows, `Navigation` icons and chevron, `Table` edge columns and actions column, `Badge` label wrapper, `Button` affix | Optical tokens: `--q1-optical-icon-shift-cjk-label`, `--q1-optical-media-first-line-offset`, `--q1-surface-inset-inline`, `--q1-table-edge-padding-inline`, `--q1-button-hang-inline`, `--q1-badge-optical-shift`, `--q1-button-affix-optical-y` | Shifts use standalone `translate`; rotations and layout stay intact | Integer-pixel values only; locked by the `check:browser` optical fixture | Wrapper and class changes add no accessible names or roles |
20
21
  | Page footer navigation | Sequential documentation reading | `PageNavigation` | Surface, border, text, spacing tokens | Hover, focus, feedback buttons | Three-column footer collapses with content | Links are named and feedback controls are buttons |
21
22
 
22
23
  ## Implementation Rules
@@ -51,6 +51,25 @@ The scale stops at 300ms on purpose. Past that, an interface reads as something
51
51
 
52
52
  An `infinite` loop's period is not on this scale. A spinner at 1.2s and a skeleton sweep at 1.6s are component rhythms, not responses to input; forcing them into the response scale either breaks them or manufactures single-use tokens.
53
53
 
54
+ ### Optical Tokens
55
+
56
+ Optical tokens carry the integer-pixel compensations that make an interface look aligned rather than merely measure aligned. They were introduced in 0.15.2 from the 2026-09-17 optical alignment audit.
57
+
58
+ Their values hold only for the font stack they were measured with. The package default is calibrated for `--q1-font-sans`; a consumer that overrides the body font stack re-measures and overrides the value on its own root. `check:browser` locks both the package default font stack and the current web font stack with the optical fixture (`/__browser-fixtures__/optical-alignment`): Chinese and mixed samples stay within 1px (plus half a device pixel of quantization), across light and dark themes at DPR 1 and 2.
59
+
60
+ - `--q1-optical-icon-shift-cjk-label` (`0px`) — vertical shift for a 16px line icon beside a Chinese label. `--q1-font-sans` needs none. The current web stack, whose Latin primary font (Avenir Next) sets the line box while Chinese falls back to PingFang SC, needs `-1px`.
61
+ - `--q1-media-size` (`var(--q1-space-6)`), `--q1-media-first-line-box` (`var(--q1-line-height-label-13)`), and `--q1-optical-media-first-line-offset` (`calc((first-line-box - media-size) / 2)`, `-3px`) — a two-line media row aligns its avatar to the first line's optical center, not to the geometric center of the whole block. The offset resolves once on `:root`, so a surface that changes the media size or first-line box redeclares the offset in the same rule.
62
+ - `--q1-surface-inset-inline` (`var(--q1-space-4)`) — the single content inset that page headers, card content, and table edge columns share as one reference line.
63
+ - `--q1-table-edge-padding-inline` (`var(--q1-surface-inset-inline)`) — outer padding of a table's first and last columns. Inner columns keep `--q1-space-2`.
64
+ - `--q1-button-hang-inline` (`calc(var(--q1-space-3) + 1px)`) — distance from a small button's border edge to its label. Ghost buttons in a table actions column hang by this amount so the label starts on the column line.
65
+ - `--q1-badge-optical-shift` (`0px`) and `--q1-button-affix-optical-y` (`0px`) — opt-in switches for the Badge label and Button affixes. They default to zero because Chinese and Latin labels move in opposite directions; a consumer sets them only where the label script is known.
66
+
67
+ Rules:
68
+
69
+ - Values are whole pixels. A compensation never uses a fractional pixel such as `0.5px`.
70
+ - Components apply a shift through the standalone `translate` property, never through `transform`, so an existing `transform: rotate()` keeps working.
71
+ - Where the compensation must change occupied space, use `margin-block-start` with an integer token instead of `translate`.
72
+
54
73
  ### Semantic Tokens
55
74
 
56
75
  Semantic tokens describe product meaning. Product surfaces should consume these before reaching for reference tokens.
@@ -1634,7 +1634,7 @@ function ei({
1634
1634
  }
1635
1635
  const _r = /* @__PURE__ */ new Set(["ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown", "Home", "End"]);
1636
1636
  function yr(e, n) {
1637
- return e.find((r) => r.value === n && !r.disabled)?.value ?? e.find((r) => !r.disabled)?.value ?? "";
1637
+ return e.find((r) => r.value === n)?.value ?? e.find((r) => !r.disabled)?.value ?? "";
1638
1638
  }
1639
1639
  function ti({
1640
1640
  options: e,
@@ -1671,7 +1671,7 @@ function ti({
1671
1671
  }
1672
1672
  const p = Y("switch-control", `switch-control--${o}`, c ? "switch-control--full" : "");
1673
1673
  return /* @__PURE__ */ t("div", { className: p, role: "radiogroup", "aria-label": n, children: e.map((k, T) => {
1674
- const E = k.value === N && !k.disabled;
1674
+ const E = k.value === N;
1675
1675
  return /* @__PURE__ */ l(
1676
1676
  "button",
1677
1677
  {
@@ -3143,10 +3143,13 @@ function Ci({
3143
3143
  i === "md" ? "" : `badge--${i}`,
3144
3144
  o ? "badge--count" : "",
3145
3145
  d
3146
- ), m = s != null && (b == null || b === "") ? { role: "img", "aria-label": c } : {};
3147
- return /* @__PURE__ */ l("span", { className: f, title: c, ...m, ...u, children: [
3146
+ ), _ = s != null && (b == null || b === "");
3147
+ return /* @__PURE__ */ l("span", { className: f, title: c, ..._ ? { role: "img", "aria-label": c } : {}, ...u, children: [
3148
3148
  s ? /* @__PURE__ */ t("span", { className: "badge__icon", "aria-hidden": "true", children: s }) : null,
3149
- b
3149
+ _ || b === void 0 || b === null || b === "" ? null : (
3150
+ // 文字包裹层:光学补偿开关 --q1-badge-optical-shift 的作用点(0.15.2 起的 DOM 结构)。
3151
+ /* @__PURE__ */ t("span", { className: "badge__label", children: b })
3152
+ )
3150
3153
  ] });
3151
3154
  }
3152
3155
  function qi({ href: e, size: n = "md", icon: r, title: a, className: i, children: s, ...o }) {
@@ -5492,7 +5495,7 @@ function Ji({
5492
5495
  ] });
5493
5496
  return /* @__PURE__ */ t("th", { scope: "col", "aria-sort": K, className: Lt(C.align), children: se }, C.key);
5494
5497
  }),
5495
- x ? /* @__PURE__ */ t("th", { scope: "col", children: x.header }) : null
5498
+ x ? /* @__PURE__ */ t("th", { scope: "col", className: "table__cell--actions", children: x.header }) : null
5496
5499
  ] }) }),
5497
5500
  /* @__PURE__ */ t("tbody", { children: S.map((C) => {
5498
5501
  const K = {
@@ -5513,7 +5516,7 @@ function Ji({
5513
5516
  }
5514
5517
  ) }) }) : null,
5515
5518
  n.map((U) => /* @__PURE__ */ t("td", { className: Lt(U.align), children: U.render(C.row, C.rowIndex) }, U.key)),
5516
- x ? /* @__PURE__ */ t("td", { children: x.render(C.row, C.rowIndex) }) : null
5519
+ x ? /* @__PURE__ */ t("td", { className: "table__cell--actions", children: x.render(C.row, C.rowIndex) }) : null
5517
5520
  ] });
5518
5521
  return b ? /* @__PURE__ */ t(He, { children: b(C.row, {
5519
5522
  row: C.row,
@@ -184,6 +184,18 @@
184
184
  --q1-space-16: 64px;
185
185
  --q1-space-24: 96px;
186
186
  --q1-control-height-default: 40px;
187
+ /* 光学对齐 Token(contracts/token-naming.md · Optical Tokens):数值只对 --q1-font-sans 与当前 web
188
+ 字体栈成立,由 check:browser 光学 fixture 锁定。一律整数 px,位移走独立 translate,不覆盖 transform。
189
+ 媒体偏移在 :root 解析一次;消费方改了媒体尺寸或首行行盒,须在同一规则里重算偏移。 */
190
+ --q1-optical-icon-shift-cjk-label: 0px;
191
+ --q1-media-size: var(--q1-space-6);
192
+ --q1-media-first-line-box: var(--q1-line-height-label-13);
193
+ --q1-optical-media-first-line-offset: calc((var(--q1-media-first-line-box) - var(--q1-media-size)) / 2);
194
+ --q1-surface-inset-inline: var(--q1-space-4);
195
+ --q1-table-edge-padding-inline: var(--q1-surface-inset-inline);
196
+ --q1-button-hang-inline: calc(var(--q1-space-3) + 1px);
197
+ --q1-badge-optical-shift: 0px;
198
+ --q1-button-affix-optical-y: 0px;
187
199
  --q1-doc-frame-gutter: 60px;
188
200
  --q1-doc-frame-max-width: 1220px;
189
201
  --q1-doc-sidebar-width: 260px;
@@ -519,10 +531,13 @@
519
531
  }
520
532
  }
521
533
 
534
+ /* 不做全局光学位移:中文与英文标签方向相反。已知全是中文的场景由消费方把
535
+ --q1-button-affix-optical-y 设为 var(--q1-optical-icon-shift-cjk-label)。 */
522
536
  .button__affix {
523
537
  display: inline-flex;
524
538
  flex: none;
525
539
  align-items: center;
540
+ translate: 0 var(--q1-button-affix-optical-y);
526
541
  }
527
542
 
528
543
  .button--sm {
@@ -1430,6 +1445,27 @@
1430
1445
 
1431
1446
  /* 列对齐取逻辑值(start/center/end)而非 left/right:RTL 下自动翻转,不必另写一套。
1432
1447
  表头与单元格用同一个类,因为表头和数据错开对齐时,一列会读成两栏。 */
1448
+ /* 首末列外侧内缩到表面参考线(--q1-surface-inset-inline),中间列仍用 space-2:
1449
+ 卡片里的表格与卡片正文、页头共用同一条左参考线,不再各自散写内边距。 */
1450
+ .table th:first-child,
1451
+ .table td:first-child {
1452
+ padding-inline-start: var(--q1-table-edge-padding-inline);
1453
+ }
1454
+
1455
+ .table th:last-child,
1456
+ .table td:last-child {
1457
+ padding-inline-end: var(--q1-table-edge-padding-inline);
1458
+ }
1459
+
1460
+ /* 操作列悬挂:ghost 按钮的文字首字落在列线上,底色向外悬挂,与表头「操作」对齐。 */
1461
+ .table td.table__cell--actions .button--ghost:first-child {
1462
+ margin-inline-start: calc(-1 * var(--q1-button-hang-inline));
1463
+ }
1464
+
1465
+ .table td.table__cell--actions .button--ghost:not(.button--sm):first-child {
1466
+ margin-inline-start: calc(-1 * (var(--q1-space-4) + 1px));
1467
+ }
1468
+
1433
1469
  .table th.table__cell--align-center,
1434
1470
  .table td.table__cell--align-center {
1435
1471
  text-align: center;
@@ -1724,18 +1760,25 @@
1724
1760
  align-items: center;
1725
1761
  }
1726
1762
 
1763
+ /* 文字包裹层只作光学补偿开关:默认 0,不改行高(line-height 1 下中文与混排已居中)。 */
1764
+ .badge__label {
1765
+ translate: 0 var(--q1-badge-optical-shift);
1766
+ }
1767
+
1727
1768
  .badge--neutral {
1728
1769
  background: oklch(from var(--q1-color-gray-700) 0.43 0 0);
1729
1770
  color: var(--q1-color-action-on-primary);
1730
1771
  }
1731
1772
 
1773
+ /* 实底档白字须 ≥4.5:1(明暗两主题,issue 250):info 0.58 在暗色只有 4.27,success 两主题均不足 4;
1774
+ 由 check:browser 光学 fixture 按实际渲染色逐档钉住。 */
1732
1775
  .badge--info {
1733
- background: oklch(from var(--q1-color-status-info) 0.58 c h);
1776
+ background: oklch(from var(--q1-color-status-info) 0.54 c h);
1734
1777
  color: var(--q1-color-action-on-primary);
1735
1778
  }
1736
1779
 
1737
1780
  .badge--success {
1738
- background: oklch(from var(--q1-color-status-success) 0.58 c h);
1781
+ background: oklch(from var(--q1-color-status-success) 0.52 c h);
1739
1782
  color: var(--q1-color-action-on-primary);
1740
1783
  }
1741
1784
 
@@ -2777,6 +2820,12 @@ a.breadcrumb__link:hover {
2777
2820
  opacity: 0.5;
2778
2821
  }
2779
2822
 
2823
+ /* 禁用只收交互,不收选中(issue 249):选中项保留底色与描边、文字降为 secondary,与半透明的未选中项仍可分辨。 */
2824
+ .switch-control__option[aria-checked='true']:disabled {
2825
+ color: var(--q1-color-text-secondary);
2826
+ opacity: 1;
2827
+ }
2828
+
2780
2829
  .switch-control--sm .switch-control__option {
2781
2830
  min-height: 26px;
2782
2831
  padding: 0 var(--q1-space-2);
@@ -4779,7 +4828,7 @@ a.breadcrumb__link:hover {
4779
4828
 
4780
4829
  /* 横向铺开(direction="row"):段横向排布;等分占位,窄屏也不挤成一条缝。
4781
4830
  特异性用 .q1-card.q1-card--row(0,2,0) 压过可点卡片的 a.q1-card(0,1,1),否则 <a> 卡片的 display:block 会把 flex 打回竖排。 */
4782
- .q1-card.q1-card--row {
4831
+ .q1-card.q1-card--row:not([hidden]) {
4783
4832
  display: flex;
4784
4833
  /* 横排指标块并列需要空间,解除默认 400px 限宽,充满容器(对齐横排充满 demo 框)。 */
4785
4834
  max-width: none;
@@ -5553,7 +5602,7 @@ a.q1-card:focus-visible {
5553
5602
  border-color: var(--q1-color-text-primary);
5554
5603
  background: color-mix(in srgb, var(--q1-color-text-primary) 5%, var(--q1-color-bg-panel));
5555
5604
  }
5556
- .choicebox:has(.choicebox__input:checked) .choicebox__extra {
5605
+ .choicebox:has(.choicebox__input:checked) .choicebox__extra:not([hidden]) {
5557
5606
  display: block;
5558
5607
  }
5559
5608
  .choicebox--radio:has(.choicebox__input:checked) .choicebox__indicator {
@@ -5899,7 +5948,7 @@ a.q1-card:focus-visible {
5899
5948
  box-shadow: var(--q1-shadow-focus);
5900
5949
  }
5901
5950
  /* 纵向:上下边缘渐隐 */
5902
- .scroller--vertical .scroller__viewport {
5951
+ .scroller--vertical .scroller__viewport:not([hidden]) {
5903
5952
  display: flex;
5904
5953
  flex-direction: column;
5905
5954
  gap: var(--q1-space-2);
@@ -5915,7 +5964,7 @@ a.q1-card:focus-visible {
5915
5964
  );
5916
5965
  }
5917
5966
  /* 横向:左右边缘渐隐 + 吸附 + 禁止横向 overscroll 触发返回手势 */
5918
- .scroller--horizontal .scroller__viewport {
5967
+ .scroller--horizontal .scroller__viewport:not([hidden]) {
5919
5968
  display: flex;
5920
5969
  gap: var(--q1-space-2);
5921
5970
  overflow-x: auto;
@@ -8127,6 +8176,7 @@ a.q1-navigation__item[aria-disabled='true'] {
8127
8176
  height: 16px;
8128
8177
  stroke: currentColor;
8129
8178
  stroke-width: 1.8;
8179
+ translate: 0 var(--q1-optical-icon-shift-cjk-label);
8130
8180
  }
8131
8181
 
8132
8182
  .q1-navigation__item-content {
@@ -8186,8 +8236,10 @@ a.q1-navigation__item[aria-disabled='true'] {
8186
8236
  white-space: nowrap;
8187
8237
  }
8188
8238
 
8239
+ /* 独立 translate 与展开时的 transform: rotate 叠加,互不覆盖。 */
8189
8240
  .q1-navigation__group-chevron {
8190
8241
  flex: none;
8242
+ translate: 0 var(--q1-optical-icon-shift-cjk-label);
8191
8243
  }
8192
8244
 
8193
8245
  .q1-navigation__group-trigger[aria-expanded='true'] .q1-navigation__group-chevron {
@@ -8202,11 +8254,11 @@ a.q1-navigation__item[aria-disabled='true'] {
8202
8254
  .q1-navigation__group:has(
8203
8255
  > .q1-navigation__group-trigger > .q1-navigation__group-icon,
8204
8256
  > .q1-navigation__group-content > .q1-navigation__item-row > .q1-navigation__item > .q1-navigation__item-icon
8205
- ) > .q1-navigation__group-trigger,
8257
+ ) > .q1-navigation__group-trigger:not([hidden]),
8206
8258
  .q1-navigation__group:has(
8207
8259
  > .q1-navigation__group-trigger > .q1-navigation__group-icon,
8208
8260
  > .q1-navigation__group-content > .q1-navigation__item-row > .q1-navigation__item > .q1-navigation__item-icon
8209
- ) > .q1-navigation__group-content > .q1-navigation__item-row > .q1-navigation__item {
8261
+ ) > .q1-navigation__group-content > .q1-navigation__item-row > .q1-navigation__item:not([hidden]) {
8210
8262
  display: grid;
8211
8263
  grid-template-columns: var(--q1-space-4) minmax(0, 1fr) auto;
8212
8264
  }
@@ -8403,9 +8455,29 @@ a.q1-navigation__item[aria-disabled='true'] {
8403
8455
  font-weight: var(--q1-font-weight-semibold);
8404
8456
  }
8405
8457
 
8406
- .q1-context-switcher__trigger .q1-context-switcher__avatar {
8407
- width: 28px;
8408
- height: 28px;
8458
+ /* 双行图文:媒体对齐首行光学中心,而不是整块几何中心。行内容顶对齐,媒体按
8459
+ (首行行盒 − 媒体尺寸) / 2 上移;尾部 chevron / check / pending 属于控件本身,保持几何居中。 */
8460
+ .q1-context-switcher__trigger:has(.q1-context-switcher__description),
8461
+ .q1-context-switcher__stacked-header:has(.q1-context-switcher__description),
8462
+ .q1-context-switcher__item:has(.q1-context-switcher__description) {
8463
+ align-items: flex-start;
8464
+ }
8465
+
8466
+ .q1-context-switcher__trigger:has(.q1-context-switcher__description) > .q1-context-switcher__avatar,
8467
+ .q1-context-switcher__stacked-header:has(.q1-context-switcher__description) > .q1-context-switcher__avatar,
8468
+ .q1-context-switcher__item:has(.q1-context-switcher__description) > .q1-context-switcher__avatar {
8469
+ translate: 0 var(--q1-optical-media-first-line-offset);
8470
+ }
8471
+
8472
+ .q1-context-switcher__trigger:has(.q1-context-switcher__description) > .q1-context-switcher__chevron,
8473
+ .q1-context-switcher__item:has(.q1-context-switcher__description) > :is(.q1-context-switcher__chevron, .q1-context-switcher__check, .q1-context-switcher__pending) {
8474
+ align-self: center;
8475
+ }
8476
+
8477
+ /* 单行条目的线性图标贴中文标签:与 Navigation 同一口径上移 1px。 */
8478
+ .q1-context-switcher__item:not(:has(.q1-context-switcher__description)) > .q1-context-switcher__avatar > svg,
8479
+ .q1-context-switcher__action-icon > svg {
8480
+ translate: 0 var(--q1-optical-icon-shift-cjk-label);
8409
8481
  }
8410
8482
 
8411
8483
  .q1-context-switcher__chevron {
@@ -8489,7 +8561,7 @@ a.q1-navigation__item[aria-disabled='true'] {
8489
8561
  padding: var(--q1-space-1);
8490
8562
  }
8491
8563
 
8492
- .q1-context-switcher__popup[role='dialog'] .q1-context-switcher__groups {
8564
+ .q1-context-switcher__popup[role='dialog'] .q1-context-switcher__groups:not([hidden]) {
8493
8565
  display: grid;
8494
8566
  overflow-y: hidden;
8495
8567
  }
@@ -8738,7 +8810,7 @@ a.q1-navigation__item[aria-disabled='true'] {
8738
8810
  margin: 0;
8739
8811
  }
8740
8812
 
8741
- .q1-context-switcher__popup.q1-context-switcher__popup--stacked .q1-context-switcher__groups {
8813
+ .q1-context-switcher__popup.q1-context-switcher__popup--stacked .q1-context-switcher__groups:not([hidden]) {
8742
8814
  display: block;
8743
8815
  overflow-y: auto;
8744
8816
  padding-block: 0;
@@ -9357,3 +9429,14 @@ a.q1-navigation__item[aria-disabled='true'] {
9357
9429
  color: HighlightText;
9358
9430
  }
9359
9431
  }
9432
+
9433
+ /* 原生 hidden 属性守卫(必须留在本文件末尾)。组件规则给容器写 display 时会盖掉 UA 的
9434
+ `[hidden] { display: none }`——两者同为 (0,1,0),而组件规则后到就赢。这条规则恢复语义:
9435
+ 同特异度且位于全部组件规则之后,因此赢下所有单类组件规则;特异度更高的组件规则改为在自身
9436
+ 主语上写 :not([hidden]),不靠这条兜底。
9437
+ 取舍:本包不发 reset(reset.css 不进包,见 scripts/build-style.mjs),不能用 `!important`
9438
+ 强压消费方,因此选"零外部副作用 + 可被消费方覆盖"的写法——它只把 UA 默认行为还原,对本包不写
9439
+ display 的元素是 no-op。`until-found` 由 :where() 零特异度排除,保持 UA 的可搜索折叠语义。 */
9440
+ [hidden]:where(:not([hidden='until-found'])) {
9441
+ display: none;
9442
+ }
@@ -180,6 +180,15 @@
180
180
  --q1-space-16: 64px;
181
181
  --q1-space-24: 96px;
182
182
  --q1-control-height-default: 40px;
183
+ --q1-optical-icon-shift-cjk-label: 0px;
184
+ --q1-media-size: var(--q1-space-6);
185
+ --q1-media-first-line-box: var(--q1-line-height-label-13);
186
+ --q1-optical-media-first-line-offset: calc((var(--q1-media-first-line-box) - var(--q1-media-size)) / 2);
187
+ --q1-surface-inset-inline: var(--q1-space-4);
188
+ --q1-table-edge-padding-inline: var(--q1-surface-inset-inline);
189
+ --q1-button-hang-inline: calc(var(--q1-space-3) + 1px);
190
+ --q1-badge-optical-shift: 0px;
191
+ --q1-button-affix-optical-y: 0px;
183
192
  --q1-doc-frame-gutter: 60px;
184
193
  --q1-doc-frame-max-width: 1220px;
185
194
  --q1-doc-sidebar-width: 260px;
@@ -396,6 +405,15 @@
396
405
  --q1-space-16: 64px;
397
406
  --q1-space-24: 96px;
398
407
  --q1-control-height-default: 40px;
408
+ --q1-optical-icon-shift-cjk-label: 0px;
409
+ --q1-media-size: var(--q1-space-6);
410
+ --q1-media-first-line-box: var(--q1-line-height-label-13);
411
+ --q1-optical-media-first-line-offset: calc((var(--q1-media-first-line-box) - var(--q1-media-size)) / 2);
412
+ --q1-surface-inset-inline: var(--q1-space-4);
413
+ --q1-table-edge-padding-inline: var(--q1-surface-inset-inline);
414
+ --q1-button-hang-inline: calc(var(--q1-space-3) + 1px);
415
+ --q1-badge-optical-shift: 0px;
416
+ --q1-button-affix-optical-y: 0px;
399
417
  --q1-doc-frame-gutter: 60px;
400
418
  --q1-doc-frame-max-width: 1220px;
401
419
  --q1-doc-sidebar-width: 260px;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@q1travel/design-system",
3
- "version": "0.15.1",
3
+ "version": "0.15.2",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./dist-pkg/design-system.js",
@@ -37,7 +37,7 @@
37
37
  "check:shell": "npm run sync:contracts && node scripts/check-shell.mjs && node scripts/check-token-package.mjs && npm run check:release-provenance",
38
38
  "check:browser:strictmode": "node scripts/check-browser.mjs --strictmode-ref",
39
39
  "check:browser": "npm run check:browser:strictmode && node scripts/check-browser.mjs",
40
- "check:package-api": "node scripts/check-package-api.mjs && node --test scripts/check-q1-design-lint.test.mjs && node --test scripts/check-json-view-contract.test.mjs && node --test scripts/check-verification-code-input.test.mjs && node --test scripts/check-controls-contract.test.mjs && node --test scripts/check-pagination-contract.test.mjs && node --test scripts/check-table-core.test.mjs scripts/check-table-interaction.test.mjs scripts/check-table-layout.test.mjs && node --test scripts/check-contrast-contract.test.mjs && node --test scripts/check-overlay-coordination.test.mjs scripts/check-sheet-contract.test.mjs",
40
+ "check:package-api": "node scripts/check-package-api.mjs && node --test scripts/check-q1-design-lint.test.mjs && node --test scripts/check-json-view-contract.test.mjs && node --test scripts/check-verification-code-input.test.mjs && node --test scripts/check-controls-contract.test.mjs && node --test scripts/check-pagination-contract.test.mjs && node --test scripts/check-table-core.test.mjs scripts/check-table-interaction.test.mjs scripts/check-table-layout.test.mjs && node --test scripts/check-contrast-contract.test.mjs && node --test scripts/check-optical-alignment-contract.test.mjs && node --test scripts/check-overlay-coordination.test.mjs scripts/check-sheet-contract.test.mjs",
41
41
  "check:release-provenance": "node --test scripts/check-release-provenance.test.mjs && node scripts/check-release-provenance.mjs",
42
42
  "check:release-sync": "node --test scripts/release-npm.test.mjs",
43
43
  "release:npm": "node scripts/release-npm.mjs",