@q1travel/design-system 0.31.0 → 0.31.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.
@@ -326,9 +326,9 @@
326
326
  /* 胶囊:半径大于任何可能的半高即可,具体数值不参与计算。 */
327
327
  --q1-radius-full: 9999px;
328
328
  --q1-shadow-focus: 0 0 0 1px color-mix(in srgb, var(--q1-color-focus) 34%, transparent), 0 0 0 4px color-mix(in srgb, var(--q1-color-focus) 16%, transparent);
329
- --q1-shadow-focus-input: var(--q1-shadow-focus);
330
- --q1-shadow-focus-input-danger: 0 0 0 1px color-mix(in srgb, var(--q1-color-status-danger) 34%, transparent), 0 0 0 4px color-mix(in srgb, var(--q1-color-status-danger) 16%, transparent);
331
- --q1-shadow-focus-danger: var(--q1-shadow-focus-input-danger);
329
+ --q1-shadow-focus-input: 0 0 0 4px color-mix(in srgb, var(--q1-color-focus) 16%, transparent);
330
+ --q1-shadow-focus-input-danger: 0 0 0 4px color-mix(in srgb, var(--q1-color-status-danger) 16%, transparent);
331
+ --q1-shadow-focus-danger: 0 0 0 1px color-mix(in srgb, var(--q1-color-status-danger) 34%, transparent), 0 0 0 4px color-mix(in srgb, var(--q1-color-status-danger) 16%, transparent);
332
332
  /* 浮层发丝边与两层淡阴影;Drawer / Sheet 共用 modal,Toast 共用 popover。 */
333
333
  --q1-shadow-popover:
334
334
  0 0 0 1px var(--q1-color-gray-alpha-200),
@@ -2133,6 +2133,16 @@
2133
2133
  .table th.table__cell--select,
2134
2134
  .table td.table__cell--select {
2135
2135
  width: var(--q1-space-10);
2136
+ text-align: center;
2137
+ }
2138
+
2139
+ .table__cell--select > .control-option--bare {
2140
+ display: grid;
2141
+ margin: calc(-1 * var(--q1-space-1)) calc(-1 * var(--q1-space-2));
2142
+ }
2143
+
2144
+ .table__cell--select .control-option__visual {
2145
+ transform: none;
2136
2146
  }
2137
2147
 
2138
2148
  .table th.table__cell--align-center,
@@ -2163,7 +2173,7 @@
2163
2173
  background: var(--table-cell-bg);
2164
2174
  }
2165
2175
 
2166
- .table tbody tr:has(.table__checkbox-control input:checked) {
2176
+ .table tbody tr:has(.table__cell--select input:checked) {
2167
2177
  --table-cell-bg: var(--q1-table-row-bg-selected, var(--q1-color-bg-selected));
2168
2178
  }
2169
2179
 
@@ -2231,27 +2241,11 @@
2231
2241
  color: var(--q1-color-text-primary);
2232
2242
  }
2233
2243
 
2234
- .table__sort:focus-visible,
2235
- .table input[type='checkbox']:focus-visible {
2244
+ .table__sort:focus-visible {
2236
2245
  outline: none;
2237
2246
  box-shadow: var(--q1-shadow-focus);
2238
2247
  }
2239
2248
 
2240
- .table__checkbox-control {
2241
- display: inline-flex;
2242
- align-items: center;
2243
- justify-content: center;
2244
- min-width: var(--q1-space-6);
2245
- min-height: var(--q1-space-6);
2246
- margin: calc(-1 * var(--q1-space-1)) calc(-1 * var(--q1-space-2));
2247
- border-radius: var(--q1-radius-1);
2248
- cursor: pointer;
2249
- }
2250
-
2251
- .table__checkbox-control:has(input:disabled) {
2252
- cursor: not-allowed;
2253
- }
2254
-
2255
2249
  /* 焦点环画在单元格上:单元格自带不透明底色,行上的阴影或 outline 会被单元格底色、
2256
2250
  以及消费方的 sticky 列盖住。每格画上下两边,首末格补外侧一边,拼成整行的一圈。 */
2257
2251
  .table tbody tr[tabindex='0']:focus-visible {
@@ -2293,7 +2287,7 @@
2293
2287
  --table-cell-bg: var(--q1-table-row-bg-hover, var(--q1-color-bg-subtle));
2294
2288
  }
2295
2289
 
2296
- .table tbody tr.table__row--interactive:hover:has(.table__checkbox-control input:checked) {
2290
+ .table tbody tr.table__row--interactive:hover:has(.table__cell--select input:checked) {
2297
2291
  --table-cell-bg: var(--q1-table-row-bg-selected-hover, var(--q1-color-bg-selected));
2298
2292
  }
2299
2293
  }
@@ -2304,7 +2298,7 @@
2304
2298
  --table-cell-bg: color-mix(in srgb, var(--q1-table-row-bg-hover, var(--q1-color-bg-subtle)), var(--q1-color-text-primary) 8%);
2305
2299
  }
2306
2300
 
2307
- .table tbody tr.table__row--interactive:active:has(.table__checkbox-control input:checked) {
2301
+ .table tbody tr.table__row--interactive:active:has(.table__cell--select input:checked) {
2308
2302
  --table-cell-bg: color-mix(
2309
2303
  in srgb,
2310
2304
  var(--q1-table-row-bg-selected-hover, var(--q1-color-bg-selected)),
@@ -2326,10 +2320,10 @@
2326
2320
  }
2327
2321
 
2328
2322
  @media (pointer: coarse), (any-pointer: coarse) {
2329
- .table__checkbox-control,
2323
+ .table__cell--select .control-option--bare,
2330
2324
  .table__sort {
2331
- min-width: 44px;
2332
- min-height: 44px;
2325
+ min-width: var(--q1-touch-target-min);
2326
+ min-height: var(--q1-touch-target-min);
2333
2327
  }
2334
2328
  }
2335
2329
 
@@ -2803,6 +2797,22 @@
2803
2797
  }
2804
2798
  }
2805
2799
 
2800
+ .banner:not(.banner--announcement) .banner__button-action:not(:focus-visible) {
2801
+ box-shadow: none;
2802
+ }
2803
+
2804
+ .banner:not(.banner--announcement) .banner__button-action:not(:disabled, [aria-disabled='true']) {
2805
+ border: calc(var(--q1-space-1) / 4) solid var(--q1-color-border);
2806
+ background: var(--q1-color-bg-panel);
2807
+ }
2808
+
2809
+ @media (hover: hover) and (pointer: fine) {
2810
+ .banner:not(.banner--announcement) .banner__button-action:hover:not(:disabled, [aria-disabled='true']) {
2811
+ background: var(--q1-color-bg-subtle);
2812
+ border-color: var(--q1-color-border-strong);
2813
+ }
2814
+ }
2815
+
2806
2816
  /* 页顶公告形态:透明底无边框、内容居中、16px 文案;
2807
2817
  与页内卡条(tone 变体)分工,两种定位见页面使用原则。 */
2808
2818
  .banner--announcement {
@@ -2980,18 +2990,21 @@
2980
2990
 
2981
2991
  .banner--with-icon .banner__content,
2982
2992
  .banner--with-icon > .banner__action,
2993
+ .banner--with-icon > .banner__button-action,
2983
2994
  .banner--with-icon > .banner__close,
2984
2995
  .banner--with-icon > .banner__actions {
2985
2996
  grid-column: 2;
2986
2997
  }
2987
2998
 
2988
2999
  .banner:not(.banner--with-icon) > .banner__action,
3000
+ .banner:not(.banner--with-icon) > .banner__button-action,
2989
3001
  .banner:not(.banner--with-icon) > .banner__close,
2990
3002
  .banner:not(.banner--with-icon) > .banner__actions {
2991
3003
  grid-column: 1;
2992
3004
  }
2993
3005
 
2994
3006
  .banner > .banner__action,
3007
+ .banner > .banner__button-action,
2995
3008
  .banner > .banner__close,
2996
3009
  .banner > .banner__actions {
2997
3010
  justify-self: start;
@@ -3026,6 +3039,7 @@
3026
3039
 
3027
3040
  @media (max-width: 48rem), (pointer: coarse), (any-pointer: coarse) {
3028
3041
  .banner__action,
3042
+ .banner__button-action,
3029
3043
  .banner__cta,
3030
3044
  .banner__close {
3031
3045
  min-height: calc(var(--q1-space-10) + var(--q1-space-1));
@@ -4231,10 +4245,14 @@ a[href]:has(> .book):focus-visible {
4231
4245
  }
4232
4246
 
4233
4247
  .tabs-control--line .tabs-control__tab:disabled {
4234
- color: var(--q1-color-text-disabled);
4248
+ color: var(--q1-color-text-muted);
4235
4249
  border-bottom-color: transparent;
4236
4250
  }
4237
4251
 
4252
+ .tabs-control--line .tabs-control__tab:disabled[aria-selected='true'] {
4253
+ border-bottom-color: currentColor;
4254
+ }
4255
+
4238
4256
  /* 面板承载任意内容:文字样式继承所在页面,自身不加内边距;与标签栏的间距由 .tabs-root 的 gap 提供,左缘与标签栏对齐。 */
4239
4257
  .tabs-control__panel {
4240
4258
  border-radius: var(--q1-radius-3);
@@ -5496,6 +5514,11 @@ a[href]:has(> .book):focus-visible {
5496
5514
  padding: var(--q1-space-8) var(--q1-space-6);
5497
5515
  }
5498
5516
 
5517
+ .empty-state--title-hidden:has(> .empty-state__title:last-child) > .empty-state__icon,
5518
+ .empty-state--title-hidden:has(> .empty-state__title:last-child) > .empty-state__illustration {
5519
+ margin-block-end: 0;
5520
+ }
5521
+
5499
5522
  .empty-state__icon {
5500
5523
  display: grid;
5501
5524
  place-items: center;
@@ -10302,6 +10325,18 @@ a.q1-navigation__item[aria-disabled='true'] {
10302
10325
  color: var(--q1-color-text-primary);
10303
10326
  }
10304
10327
 
10328
+ .q1-navigation--horizontal .q1-navigation__item--disabled {
10329
+ color: var(--q1-color-text-muted);
10330
+ }
10331
+
10332
+ .q1-navigation .q1-navigation__item--disabled :is(.q1-navigation__item-description, .q1-navigation__item-badge, .q1-navigation__item-badge *) {
10333
+ color: inherit;
10334
+ }
10335
+
10336
+ .q1-navigation .q1-navigation__item--disabled .q1-navigation__item-badge .badge {
10337
+ background: var(--q1-color-bg-subtle);
10338
+ }
10339
+
10305
10340
  @media (hover: hover) and (pointer: fine) {
10306
10341
  .q1-navigation__item:hover:not(.q1-navigation__item--active):not(:active):not([aria-disabled='true']):not(:disabled),
10307
10342
  .q1-navigation__group-trigger:hover:not(:active) {
@@ -11733,8 +11768,13 @@ a.q1-navigation__item[aria-disabled='true'] {
11733
11768
  color: var(--q1-color-text-primary);
11734
11769
  }
11735
11770
 
11736
- .q1-navigation--line .q1-navigation__item--disabled {
11771
+ .q1-navigation--horizontal.q1-navigation--line .q1-navigation__item--disabled {
11737
11772
  color: var(--q1-color-text-muted);
11773
+ border-bottom-color: currentColor;
11774
+ }
11775
+
11776
+ .q1-navigation--line .q1-navigation__item--disabled:not([aria-current]) {
11777
+ border-bottom-color: transparent;
11738
11778
  }
11739
11779
 
11740
11780
  @media (hover: hover) and (pointer: fine) {
@@ -13697,6 +13737,121 @@ a.q1-navigation__item[aria-disabled='true'] {
13697
13737
  vertical-align: baseline;
13698
13738
  }
13699
13739
 
13740
+ .stepper {
13741
+ display: flex;
13742
+ gap: var(--q1-space-1);
13743
+ margin: 0;
13744
+ padding: 0;
13745
+ min-width: 0;
13746
+ list-style: none;
13747
+ }
13748
+
13749
+ .stepper__step {
13750
+ position: relative;
13751
+ flex: 1;
13752
+ min-width: 0;
13753
+ padding-inline: var(--q1-space-2);
13754
+ text-align: center;
13755
+ overflow-wrap: anywhere;
13756
+ }
13757
+
13758
+ .stepper__step:not(:last-child)::after {
13759
+ content: '';
13760
+ position: absolute;
13761
+ inset-inline-start: calc(50% + var(--q1-space-4));
13762
+ inset-block-start: calc(var(--q1-space-3) - var(--q1-space-1) / 8);
13763
+ width: calc(100% + var(--q1-space-1) - var(--q1-space-8));
13764
+ height: calc(var(--q1-space-1) / 4);
13765
+ background: var(--q1-color-border-strong);
13766
+ }
13767
+
13768
+ .stepper__step--complete:not(:last-child)::after {
13769
+ background: var(--q1-color-text-primary);
13770
+ }
13771
+
13772
+ .stepper__indicator {
13773
+ display: flex;
13774
+ align-items: center;
13775
+ justify-content: center;
13776
+ box-sizing: border-box;
13777
+ width: var(--q1-space-6);
13778
+ height: var(--q1-space-6);
13779
+ margin: 0 auto var(--q1-space-2);
13780
+ border: calc(var(--q1-space-1) / 4) solid var(--q1-color-border-strong);
13781
+ border-radius: var(--q1-radius-full);
13782
+ color: var(--q1-color-text-muted);
13783
+ font-size: var(--q1-font-size-label-13);
13784
+ line-height: var(--q1-line-height-label-13);
13785
+ font-weight: var(--q1-font-weight-medium);
13786
+ }
13787
+
13788
+ .stepper__step--current .stepper__indicator {
13789
+ border-color: var(--q1-color-text-primary);
13790
+ background: var(--q1-color-text-primary);
13791
+ color: var(--q1-color-text-on-inverse);
13792
+ }
13793
+
13794
+ .stepper__step--complete .stepper__indicator {
13795
+ border: 0;
13796
+ }
13797
+
13798
+ .stepper__label {
13799
+ display: block;
13800
+ color: var(--q1-color-text-primary);
13801
+ font-size: var(--q1-font-size-label-14);
13802
+ line-height: var(--q1-line-height-label-14);
13803
+ font-weight: var(--q1-font-weight-medium);
13804
+ }
13805
+
13806
+ .stepper__description {
13807
+ display: block;
13808
+ margin-block-start: var(--q1-space-1);
13809
+ color: var(--q1-color-text-muted);
13810
+ font-size: var(--q1-font-size-label-13);
13811
+ line-height: var(--q1-line-height-label-13);
13812
+ }
13813
+
13814
+ .stepper__status {
13815
+ position: absolute;
13816
+ width: calc(var(--q1-space-1) / 4);
13817
+ height: calc(var(--q1-space-1) / 4);
13818
+ overflow: hidden;
13819
+ clip: rect(0 0 0 0);
13820
+ clip-path: inset(50%);
13821
+ white-space: nowrap;
13822
+ }
13823
+
13824
+ .file-input {
13825
+ display: flex;
13826
+ align-items: center;
13827
+ gap: var(--q1-space-3);
13828
+ min-width: 0;
13829
+ max-width: 100%;
13830
+ }
13831
+
13832
+ .file-input__trigger {
13833
+ flex-shrink: 0;
13834
+ }
13835
+
13836
+ .file-input__trigger[aria-invalid='true']:not(:disabled),
13837
+ .file-input__trigger.button--primary[aria-invalid='true']:not(.button--icon):not(.button--selected):not(:disabled):not([aria-disabled='true']):is(:hover, :active) {
13838
+ border-color: var(--q1-color-status-danger);
13839
+ }
13840
+
13841
+ .file-input__trigger[aria-invalid='true']:not(:disabled):focus-visible {
13842
+ box-shadow: var(--q1-shadow-focus-input-danger);
13843
+ }
13844
+
13845
+ .file-input__status {
13846
+ min-width: 0;
13847
+ overflow: hidden;
13848
+ text-overflow: ellipsis;
13849
+ white-space: nowrap;
13850
+ color: var(--q1-color-text-primary);
13851
+ font-size: var(--q1-font-size-label-14);
13852
+ line-height: var(--q1-line-height-label-14);
13853
+ }
13854
+
13700
13855
  /* Label + InfoTip:标签与说明微图标同行;常驻面板换行铺满整行。 */
13701
13856
  .label-row,
13702
13857
  .form-field__label-row {
@@ -14158,6 +14313,14 @@ a.q1-navigation__item[aria-disabled='true'] {
14158
14313
  margin-block-end: var(--q1-space-2);
14159
14314
  }
14160
14315
 
14316
+ .empty-state--inline > .empty-state__illustration {
14317
+ grid-template-columns: minmax(0, 1fr);
14318
+ flex-shrink: 0;
14319
+ inline-size: var(--q1-space-16);
14320
+ max-inline-size: var(--q1-space-16);
14321
+ margin-block-end: 0;
14322
+ }
14323
+
14161
14324
  .empty-list-illustration {
14162
14325
  position: relative;
14163
14326
  display: inline-block;
@@ -302,9 +302,9 @@
302
302
  --q1-radius-5: 16px;
303
303
  --q1-radius-full: 9999px;
304
304
  --q1-shadow-focus: 0 0 0 1px color-mix(in srgb, var(--q1-color-focus) 34%, transparent), 0 0 0 4px color-mix(in srgb, var(--q1-color-focus) 16%, transparent);
305
- --q1-shadow-focus-input: var(--q1-shadow-focus);
306
- --q1-shadow-focus-input-danger: 0 0 0 1px color-mix(in srgb, var(--q1-color-status-danger) 34%, transparent), 0 0 0 4px color-mix(in srgb, var(--q1-color-status-danger) 16%, transparent);
307
- --q1-shadow-focus-danger: var(--q1-shadow-focus-input-danger);
305
+ --q1-shadow-focus-input: 0 0 0 4px color-mix(in srgb, var(--q1-color-focus) 16%, transparent);
306
+ --q1-shadow-focus-input-danger: 0 0 0 4px color-mix(in srgb, var(--q1-color-status-danger) 16%, transparent);
307
+ --q1-shadow-focus-danger: 0 0 0 1px color-mix(in srgb, var(--q1-color-status-danger) 34%, transparent), 0 0 0 4px color-mix(in srgb, var(--q1-color-status-danger) 16%, transparent);
308
308
  --q1-shadow-popover: 0 0 0 1px var(--q1-color-gray-alpha-200),
309
309
  0 1px 1px color-mix(in srgb, var(--q1-color-shadow) 2%, transparent),
310
310
  0 4px 8px -4px color-mix(in srgb, var(--q1-color-shadow) 4%, transparent),
@@ -629,9 +629,9 @@
629
629
  --q1-radius-5: 16px;
630
630
  --q1-radius-full: 9999px;
631
631
  --q1-shadow-focus: 0 0 0 1px color-mix(in srgb, var(--q1-color-focus) 34%, transparent), 0 0 0 4px color-mix(in srgb, var(--q1-color-focus) 16%, transparent);
632
- --q1-shadow-focus-input: var(--q1-shadow-focus);
633
- --q1-shadow-focus-input-danger: 0 0 0 1px color-mix(in srgb, var(--q1-color-status-danger) 34%, transparent), 0 0 0 4px color-mix(in srgb, var(--q1-color-status-danger) 16%, transparent);
634
- --q1-shadow-focus-danger: var(--q1-shadow-focus-input-danger);
632
+ --q1-shadow-focus-input: 0 0 0 4px color-mix(in srgb, var(--q1-color-focus) 16%, transparent);
633
+ --q1-shadow-focus-input-danger: 0 0 0 4px color-mix(in srgb, var(--q1-color-status-danger) 16%, transparent);
634
+ --q1-shadow-focus-danger: 0 0 0 1px color-mix(in srgb, var(--q1-color-status-danger) 34%, transparent), 0 0 0 4px color-mix(in srgb, var(--q1-color-status-danger) 16%, transparent);
635
635
  --q1-shadow-popover: 0 0 0 1px var(--q1-color-gray-alpha-200),
636
636
  0 4px 8px -4px color-mix(in srgb, var(--q1-color-shadow) 12%, transparent),
637
637
  0 16px 24px -8px color-mix(in srgb, var(--q1-color-shadow) 18%, transparent);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@q1travel/design-system",
3
- "version": "0.31.0",
3
+ "version": "0.31.2",
4
4
  "description": "React components, design tokens, and interface contracts for q1travel products.",
5
5
  "keywords": [
6
6
  "react",
@@ -55,7 +55,7 @@
55
55
  "preview": "vite preview --host 127.0.0.1",
56
56
  "check:shell": "npm run sync:contracts && node scripts/check-shell.mjs && node scripts/check-token-package.mjs && npm run check:release-provenance",
57
57
  "check:browser:strictmode": "node scripts/check-browser.mjs --strictmode-ref",
58
- "check:browser": "node --test scripts/cascader-browser-lifecycle.test.mjs scripts/devtools-connection.test.mjs scripts/browser-exit-deadline.test.mjs scripts/chromium-teardown.test.mjs scripts/vite-server-lifecycle.test.mjs scripts/chromium-launch.test.mjs scripts/chromium-recovery.test.mjs scripts/chromium-ownership.test.mjs scripts/cdp-recovery.test.mjs scripts/load-response-timeout.test.mjs && node scripts/wait-host-idle.mjs && npm run check:browser:strictmode && node scripts/check-browser.mjs --note && node scripts/check-browser.mjs --combobox-panel && node scripts/check-browser.mjs && node scripts/check-clearable-input-browser.mjs && node scripts/check-calendar-browser.mjs && node scripts/check-banner-browser.mjs && node scripts/check-button-link-browser.mjs && node scripts/check-button-browser.mjs && node scripts/check-trailing-icon-padding-browser.mjs && node scripts/check-overlay-theme-browser.mjs && node scripts/check-browser-component-browser.mjs",
58
+ "check:browser": "node --test scripts/cascader-browser-lifecycle.test.mjs scripts/devtools-connection.test.mjs scripts/combobox-panel-readiness.test.mjs scripts/browser-exit-deadline.test.mjs scripts/chromium-teardown.test.mjs scripts/vite-server-lifecycle.test.mjs scripts/chromium-launch.test.mjs scripts/chromium-recovery.test.mjs scripts/chromium-ownership.test.mjs scripts/cdp-recovery.test.mjs scripts/load-response-timeout.test.mjs && node scripts/wait-host-idle.mjs && npm run check:browser:strictmode && node scripts/check-browser.mjs --note && node scripts/check-browser.mjs --combobox-panel && node scripts/check-browser.mjs && node scripts/check-clearable-input-browser.mjs && node scripts/check-calendar-browser.mjs && node scripts/check-banner-browser.mjs && node scripts/check-button-link-browser.mjs && node scripts/check-button-browser.mjs && node scripts/check-trailing-icon-padding-browser.mjs && node scripts/check-overlay-theme-browser.mjs && node scripts/check-browser-component-browser.mjs",
59
59
  "check:package-api": "node scripts/check-package-api.mjs && node --test scripts/check-public-type-global-augmentations.test.mjs && node --test scripts/check-combobox-required.test.mjs scripts/check-multi-combobox-contract.test.mjs && node --test scripts/check-q1-design-lint.test.mjs scripts/check-q1-design-component-enums.test.mjs scripts/check-q1-design-bin-entry.test.mjs && node --test scripts/check-json-view-contract.test.mjs && node --test scripts/check-verification-code-input.test.mjs && node --test scripts/check-bare-field-error.test.mjs scripts/check-label-hidden-contract.test.mjs scripts/check-required-indicator-contract.test.mjs scripts/check-spinner-inherit-contract.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 && node --test scripts/check-choicebox-contract.test.mjs && node --test scripts/check-radio-group-contract.test.mjs && node --test scripts/check-clearable-input-contract.test.mjs && node --test scripts/check-card-contract.test.mjs && node --test scripts/check-book-contract.test.mjs && node --test scripts/check-breadcrumbs-contract.test.mjs && node --test scripts/check-description-contract.test.mjs && node --test scripts/check-error-message-contract.test.mjs && node --test scripts/check-show-more-contract.test.mjs && node --test scripts/check-load-more-button-contract.test.mjs && node --test scripts/check-banner-contract.test.mjs && node --test scripts/check-project-banner-contract.test.mjs && node --test scripts/check-note-contract.test.mjs && node --test scripts/check-feedback-contract.test.mjs && node --test scripts/check-page-feedback-contract.test.mjs && node --test scripts/check-drawer-gesture.test.mjs && node --test scripts/check-checkbox-circle-contract.test.mjs && node --test scripts/check-chat-contract.test.mjs && node --test scripts/check-calendar-single-contract.test.mjs && node --test scripts/check-hover-card-contract.test.mjs && node --test scripts/check-bare-field-error.test.mjs && node --test scripts/check-controls-contract.test.mjs scripts/check-control-size-contract.test.mjs && node --test scripts/check-composer-dots-menu-contract.test.mjs && node --test scripts/check-filter-option-panel-contract.test.mjs && npm run check:release-diff",
60
60
  "check:release-diff": "node --test scripts/check-release-artifact-diff.test.mjs && node scripts/check-release-artifact-diff.mjs",
61
61
  "check:release-provenance": "node --test scripts/check-release-provenance.test.mjs && node scripts/check-release-provenance.mjs",