@beehexa/design-rules 2611.3.3 → 2611.4.1
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.
- package/README.md +1 -1
- package/dist/AGENTS.md +1 -7
- package/dist/catalog.json +153 -125
- package/dist/docs/scripts/color-pairs.mjs +5 -1
- package/dist/docs/scripts/token-utils.mjs +16 -1
- package/dist/docs/src/components/ColorDemo.astro +5 -5
- package/dist/docs/src/components/ElevationDemo.astro +196 -0
- package/dist/docs/src/components/LayoutDemo.astro +1 -1
- package/dist/docs/src/components/OpacityDemo.astro +95 -0
- package/dist/docs/src/components/ShapeDemo.astro +11 -10
- package/dist/docs/src/components/ShapePin.astro +5 -3
- package/dist/docs/src/components/ZIndexDemo.astro +102 -0
- package/dist/docs/src/content/foundations/styles/border.mdx +3 -3
- package/dist/docs/src/content/foundations/styles/color/usage.mdx +11 -4
- package/dist/docs/src/content/foundations/styles/data-visualization.mdx +74 -6
- package/dist/docs/src/content/foundations/styles/elevation.mdx +66 -3
- package/dist/docs/src/content/foundations/styles/icons/usage.mdx +9 -6
- package/dist/docs/src/content/foundations/styles/layout/app-frame.mdx +10 -0
- package/dist/docs/src/content/foundations/styles/opacity.mdx +43 -5
- package/dist/docs/src/content/foundations/styles/size-and-density.mdx +7 -0
- package/dist/docs/src/content/foundations/styles/typography/code.mdx +1 -1
- package/dist/docs/src/content/foundations/styles/z-index.mdx +63 -5
- package/dist/docs/src/content/tools/ant-design-vue-theme.mdx +125 -18
- package/dist/docs/src/content/tools/application-content.mdx +42 -0
- package/dist/docs/src/content/tools/editors.mdx +27 -0
- package/dist/docs/src/content/tools/mermaid.mdx +95 -0
- package/dist/docs/src/content/tools/vueflow.mdx +121 -0
- package/dist/docs/src/content-vi/foundations/styles/border.mdx +3 -3
- package/dist/docs/src/content-vi/foundations/styles/color/usage.mdx +11 -4
- package/dist/docs/src/content-vi/foundations/styles/data-visualization.mdx +75 -6
- package/dist/docs/src/content-vi/foundations/styles/elevation.mdx +75 -0
- package/dist/docs/src/content-vi/foundations/styles/icons/usage.mdx +9 -6
- package/dist/docs/src/content-vi/foundations/styles/layout/app-frame.mdx +10 -0
- package/dist/docs/src/content-vi/foundations/styles/opacity.mdx +43 -5
- package/dist/docs/src/content-vi/foundations/styles/size-and-density.mdx +7 -0
- package/dist/docs/src/content-vi/foundations/styles/typography/code.mdx +1 -1
- package/dist/docs/src/content-vi/foundations/styles/z-index.mdx +63 -5
- package/dist/docs/src/lib/token-descriptions-vi.ts +21 -5
- package/dist/docs/src/styles/chrome.css +14 -14
- package/dist/docs/src/styles/color.css +19 -32
- package/dist/docs/src/styles/docs.css +18 -34
- package/dist/docs/src/styles/elevation.css +83 -0
- package/dist/docs/src/styles/global.css +1 -10
- package/dist/docs/src/styles/icons.css +11 -15
- package/dist/docs/src/styles/kit.css +112 -0
- package/dist/docs/src/styles/layout.css +1 -6
- package/dist/docs/src/styles/opacity.css +43 -0
- package/dist/docs/src/styles/shapes.css +15 -19
- package/dist/docs/src/styles/tokens.css +1282 -3
- package/dist/docs/src/styles/tokens.js +358 -3
- package/dist/docs/src/styles/typography.css +4 -7
- package/dist/docs/src/styles/zindex.css +56 -0
- package/dist/docs/tokens/border.json +1 -1
- package/dist/docs/tokens/color.json +57 -3
- package/dist/docs/tokens/content.json +19 -0
- package/dist/docs/tokens/diagram.json +48 -0
- package/dist/docs/tokens/editor.json +129 -0
- package/dist/docs/tokens/elevation.json +15 -5
- package/dist/docs/tokens/flow.json +497 -0
- package/dist/docs/tokens/opacity.json +9 -0
- package/dist/docs/tokens/resize.json +67 -0
- package/dist/docs/tokens/size.json +6 -0
- package/dist/docs/tokens/spacing.json +4 -4
- package/dist/docs/tokens/typography.json +5 -0
- package/dist/docs/tokens/visualization.json +123 -0
- package/dist/docs/tokens/z-index.json +49 -0
- package/dist/index.js +153 -125
- package/package.json +1 -1
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Đổ bóng
|
|
3
|
+
description: "Một bề mặt trông như nằm cao bao nhiêu so với trang. Đổ bóng tách các mục khỏi trang, cho biết thứ gì chỉ hiện tạm thời và hướng sự chú ý vào điều quan trọng lúc này."
|
|
4
|
+
order: 8
|
|
5
|
+
---
|
|
6
|
+
import ElevationDemo from '../../../components/ElevationDemo.astro';
|
|
7
|
+
import TokenTable from '../../../components/TokenTable.astro';
|
|
8
|
+
|
|
9
|
+
Elevation là khoảng cách mà một bề mặt trông như có so với trang, thể hiện bằng bóng đổ và ở dark mode thì thêm nền sáng hơn. Nó cho người dùng biết phần nào tách khỏi trang, phần nào chỉ hiện tạm thời, và phần nào cần chú ý trước.
|
|
10
|
+
|
|
11
|
+
<ElevationDemo kind="hero" />
|
|
12
|
+
|
|
13
|
+
## Cách hoạt động
|
|
14
|
+
|
|
15
|
+
- **Mỗi mức là một cặp: một màu nền và một bóng.** Luôn dùng hai token của cùng một mức đi với nhau.
|
|
16
|
+
- **Càng xa trang, bóng càng lớn và mềm.** Card có bóng rất nhẹ, dialog có bóng đậm.
|
|
17
|
+
- **Chỉ có ba mức.** Khi thứ gì cũng nổi thì không còn gì nổi bật.
|
|
18
|
+
|
|
19
|
+
Đổ bóng cho thấy bề mặt trông cao bao nhiêu. [Z-index](/vi/foundations/styles/z-index/) quyết định bề mặt nào được vẽ lên trên.
|
|
20
|
+
|
|
21
|
+
| Mức | Nền | Bóng | Dùng cho |
|
|
22
|
+
|---|---|---|---|
|
|
23
|
+
| Page | `color.surface.page`, `color.surface.subtle` | không có | Trang, panel, bảng, menu bên trái, header |
|
|
24
|
+
| Raised | `color.surface` | `elevation.shadow.raised` | Card |
|
|
25
|
+
| Overlay | `color.surface.overlay` | `elevation.shadow.overlay` | Menu, danh sách của select, popover, bộ chọn ngày, toast |
|
|
26
|
+
| Modal | `color.surface.overlay` | `elevation.shadow.modal` | Dialog, drawer, sheet toàn màn hình |
|
|
27
|
+
|
|
28
|
+
## Page
|
|
29
|
+
|
|
30
|
+
Phần lớn màn hình nằm ngay trên trang, không có bóng. Tách panel và bảng bằng đường viền `color.border`. Menu bên trái và header của bảng dùng nền `color.surface.subtle`.
|
|
31
|
+
|
|
32
|
+
<ElevationDemo kind="level" item="page" />
|
|
33
|
+
|
|
34
|
+
## Raised
|
|
35
|
+
|
|
36
|
+
Dành cho một mục mà người dùng xem như một khối: một sync job, một kết nối, một widget trên dashboard. Card giữ đường viền, vì bóng nhẹ có thể mất hẳn trên màn hình quá sáng hoặc ở chế độ tương phản cao.
|
|
37
|
+
|
|
38
|
+
<ElevationDemo kind="level" item="raised" />
|
|
39
|
+
|
|
40
|
+
## Overlay
|
|
41
|
+
|
|
42
|
+
Dành cho những thứ mở ra từ một control rồi đóng lại: menu, danh sách của select, popover. Toast cũng dùng nền và bóng này.
|
|
43
|
+
|
|
44
|
+
<ElevationDemo kind="level" item="overlay" />
|
|
45
|
+
|
|
46
|
+
## Modal
|
|
47
|
+
|
|
48
|
+
Dành cho dialog và drawer chặn trang cho tới khi người dùng làm xong hoặc huỷ. Modal luôn nằm trên lớp phủ mờ `color.surface.scrim`, lớp này làm tối trang và cho thấy trang đang tạm khoá.
|
|
49
|
+
|
|
50
|
+
<ElevationDemo kind="level" item="modal" />
|
|
51
|
+
|
|
52
|
+
## Dark mode
|
|
53
|
+
|
|
54
|
+
**Bề mặt càng cao thì nền càng sáng.** Bóng tối gần như không thấy trên nền tối, nên mỗi mức có thêm nền sáng hơn: trang graphite 1, card graphite 2, menu và dialog graphite 3. Tên token giống nhau ở cả hai theme.
|
|
55
|
+
|
|
56
|
+
<ElevationDemo kind="dark" />
|
|
57
|
+
|
|
58
|
+
## Bên trong menu và dialog
|
|
59
|
+
|
|
60
|
+
Các dòng bên trong lớp nổi dùng màu trạng thái của overlay, ví dụ `color.surface.overlay.hover`. Màu hover của trang sẽ trùng với nền menu ở dark mode và biến mất. Dòng đang chọn cần có dấu check, không chỉ dựa vào màu.
|
|
61
|
+
|
|
62
|
+
<ElevationDemo kind="states" />
|
|
63
|
+
|
|
64
|
+
## Nên và không nên
|
|
65
|
+
|
|
66
|
+
<ElevationDemo kind="dodont" item="pair" />
|
|
67
|
+
<ElevationDemo kind="dodont" item="flat" />
|
|
68
|
+
<ElevationDemo kind="dodont" item="own" />
|
|
69
|
+
<ElevationDemo kind="dodont" item="border" />
|
|
70
|
+
|
|
71
|
+
## Token
|
|
72
|
+
|
|
73
|
+
<TokenTable prefix="elevation" />
|
|
74
|
+
|
|
75
|
+
<TokenTable prefix="color.surface.overlay" />
|
|
@@ -12,15 +12,18 @@ import ColorDemo from '../../../../components/ColorDemo.astro';
|
|
|
12
12
|
|
|
13
13
|
**Chọn cỡ theo chữ đứng cạnh icon.**
|
|
14
14
|
|
|
15
|
-
| Cỡ | Dùng cho |
|
|
16
|
-
|
|
17
|
-
| 16 px | Mặc định. Nút, menu, bảng, ô nhập, cạnh chữ 14 px. |
|
|
18
|
-
| 20 px | Cạnh chữ 16 px, trong thanh công cụ và page header. |
|
|
19
|
-
| 24 px | Icon đứng riêng, như trạng thái trong card hoặc trạng thái trống nhỏ. |
|
|
20
|
-
| 32 px | Chỉ cho trạng thái trống. |
|
|
15
|
+
| Cỡ | Token | Dùng cho |
|
|
16
|
+
|---|---|---|
|
|
17
|
+
| 16 px | `size.icon.default` | Mặc định. Nút, menu, bảng, ô nhập, cạnh chữ 14 px. |
|
|
18
|
+
| 20 px | `size.icon.medium` | Cạnh chữ 16 px, trong thanh công cụ và page header. |
|
|
19
|
+
| 24 px | `size.icon.large` | Icon đứng riêng, như trạng thái trong card hoặc trạng thái trống nhỏ. |
|
|
20
|
+
| 32 px | `size.icon.empty` | Chỉ cho trạng thái trống. |
|
|
21
21
|
|
|
22
22
|
Không dùng cỡ khác. Không phóng to thu nhỏ icon cho vừa khung: hãy đổi khung.
|
|
23
23
|
|
|
24
|
+
Bind các role này bằng CSS variable hoặc chuyển đổi tại API icon nhận số;
|
|
25
|
+
kích thước pixel trong bảng không phải hằng số riêng để chép vào ứng dụng.
|
|
26
|
+
|
|
24
27
|
<IconDemo kind="dodont" item="size" />
|
|
25
28
|
|
|
26
29
|
## Nét
|
|
@@ -7,6 +7,16 @@ import LayoutDemo from '../../../../components/LayoutDemo.astro';
|
|
|
7
7
|
|
|
8
8
|
**Header, menu bên và page header lặp lại trên mọi trang, ở cùng vị trí và cùng kích thước.**
|
|
9
9
|
|
|
10
|
+
Header toàn cục và menu bên là một bề mặt khung ứng dụng liên tục: cả hai dùng
|
|
11
|
+
`surface.subtle` (`--bh-color-surface-subtle`) ở giao diện sáng và tối. Drawer menu
|
|
12
|
+
trên mobile, gồm cả hàng logo, cũng dùng bề mặt này. Không dùng `surface` cho header
|
|
13
|
+
trong khi menu bên dùng `surface.subtle`. Page header thuộc bề mặt nội dung, không
|
|
14
|
+
phải bề mặt khung ứng dụng toàn cục này.
|
|
15
|
+
|
|
16
|
+
Trong drawer điều hướng mobile, hàng logo không bị co lại. Menu chiếm chiều cao
|
|
17
|
+
còn lại và chỉ cuộn khi nội dung không vừa. Không đặt `min-height: 100%` cho menu
|
|
18
|
+
bên dưới hàng logo: cách đó cộng chiều cao logo vào một menu đã cao bằng drawer.
|
|
19
|
+
|
|
10
20
|
## Header
|
|
11
21
|
|
|
12
22
|
**Cao 48 px, trải hết chiều ngang. Chứa những gì thuộc về cả sản phẩm.**
|
|
@@ -1,9 +1,47 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: "Độ mờ"
|
|
3
|
-
description: "
|
|
3
|
+
description: "Một thành phần trong suốt tới mức nào. Chỉ dùng cho hình ảnh của thứ đã bị tắt và lớp phủ mờ phía sau dialog. Control thể hiện trạng thái bằng màu."
|
|
4
4
|
order: 10.5
|
|
5
|
-
planned:
|
|
6
|
-
- "Chỗ được dùng độ trong suốt: lớp phủ sau dialog, lớp phủ trên ảnh"
|
|
7
|
-
- "Vì sao hover, pressed và disabled dùng bậc màu, không dùng độ mờ"
|
|
8
|
-
- "Token độ mờ, nếu cần"
|
|
9
5
|
---
|
|
6
|
+
import OpacityDemo from '../../../components/OpacityDemo.astro';
|
|
7
|
+
import TokenTable from '../../../components/TokenTable.astro';
|
|
8
|
+
|
|
9
|
+
Độ mờ (opacity) quyết định một thành phần trong suốt tới mức nào. Thành phần bị làm mờ sẽ để lộ nền phía sau, nên màu của nó thay đổi theo từng màn hình. Beehexa chỉ dùng độ mờ ở hai chỗ: hình ảnh của thứ đã bị tắt, và lớp phủ mờ phía sau dialog.
|
|
10
|
+
|
|
11
|
+
## Vì sao control dùng màu
|
|
12
|
+
|
|
13
|
+
- **Nền phía sau lộ ra.** Cùng một nút bị làm mờ nhưng trên card trắng, banner vàng hay dòng đang chọn thì trông mỗi chỗ một khác.
|
|
14
|
+
- **Không còn kiểm tra được tương phản.** Màu bị làm mờ là một màu mới, chữ trên đó có thể không đọc được.
|
|
15
|
+
- **Độ mờ nhân lên.** Một mục mờ 40% nằm trong card mờ 40% thì chỉ còn 16%.
|
|
16
|
+
|
|
17
|
+
Các token màu disabled như `color.text.disabled` trông giống nhau trên mọi nền. Xem [Trạng thái tương tác](/vi/foundations/styles/interaction-states/).
|
|
18
|
+
|
|
19
|
+
| Tôi cần | Dùng |
|
|
20
|
+
|---|---|
|
|
21
|
+
| Làm mờ logo, avatar hay hình minh hoạ của thứ đã bị tắt | `opacity.disabled` (0.4) trên hình ảnh |
|
|
22
|
+
| Tắt một nút, ô nhập, chữ hay icon | Các token màu disabled |
|
|
23
|
+
| Làm tối trang phía sau dialog hoặc drawer | `color.surface.scrim` |
|
|
24
|
+
| Làm một thứ hiện dần hoặc mờ dần | Độ mờ 0 và 1 trong hiệu ứng chuyển động |
|
|
25
|
+
|
|
26
|
+
## Hình ảnh của thứ đã bị tắt
|
|
27
|
+
|
|
28
|
+
Hình ảnh có màu riêng nên không token màu nào đổi được. Làm mờ hình ảnh; chữ dùng `color.text.disabled`; card giữ nguyên viền. Luôn ghi thêm bằng chữ, ví dụ "Đã tắt".
|
|
29
|
+
|
|
30
|
+
<OpacityDemo kind="tile" />
|
|
31
|
+
|
|
32
|
+
<OpacityDemo kind="screen" />
|
|
33
|
+
|
|
34
|
+
## Lớp phủ mờ
|
|
35
|
+
|
|
36
|
+
Lớp phủ mờ làm tối trang phía sau dialog hoặc drawer, để dialog là thứ được chú ý và người dùng thấy trang đang tạm khoá. Đây là một màu có sẵn độ trong suốt: graphite 40% ở light mode, đen 60% ở dark mode, vì trang tối cần làm tối mạnh hơn mới thấy rõ. Dùng nguyên như vậy.
|
|
37
|
+
|
|
38
|
+
<OpacityDemo kind="scrim" />
|
|
39
|
+
|
|
40
|
+
## Nên và không nên
|
|
41
|
+
|
|
42
|
+
<OpacityDemo kind="dodont" item="container" />
|
|
43
|
+
<OpacityDemo kind="dodont" item="controls" />
|
|
44
|
+
|
|
45
|
+
## Token
|
|
46
|
+
|
|
47
|
+
<TokenTable prefix="opacity" />
|
|
@@ -21,6 +21,13 @@ Control là những thứ người dùng bấm vào hoặc gõ vào: nút, ô nh
|
|
|
21
21
|
- Giữ các control cùng chiều cao trên cùng một hàng. Nút 24 px cạnh ô nhập 32 px trông bị lệch.
|
|
22
22
|
- Đặt chiều cao bằng token kích thước, không dùng padding. Chữ nằm giữa chiều cao.
|
|
23
23
|
|
|
24
|
+
Hai thành phần khác có kích thước cố định:
|
|
25
|
+
|
|
26
|
+
| Thành phần | Kích thước |
|
|
27
|
+
|---|---|
|
|
28
|
+
| Switch | Cao 20 px, rộng 36 px; núm 16 px |
|
|
29
|
+
| Avatar | 32 px; 24 px trong bảng và danh sách dày |
|
|
30
|
+
|
|
24
31
|
## Vùng bấm
|
|
25
32
|
|
|
26
33
|
**Mọi control đều bấm được trong vùng ít nhất 24 × 24 px, và chạm được trong vùng 44 × 44 px trên màn hình cảm ứng.**
|
|
@@ -37,7 +37,7 @@ Noto Sans là font dự phòng vì có đủ chữ tiếng Việt và ký hiệu
|
|
|
37
37
|
|
|
38
38
|
<TypeDemo kind="features" />
|
|
39
39
|
|
|
40
|
-
Mọi text style
|
|
40
|
+
Mọi text style dùng thuộc tính rút gọn `font`, vốn đặt lại `font-feature-settings`. Token nguồn `font.features` sở hữu `"cv05", "cv08"`; CSS token sinh tự động áp dụng `--bh-font-features` trên mọi phần tử với `!important`. Ứng dụng import CSS này, không sao chép quy tắc cơ sở bên dưới. Thêm tính năng bằng biến, không bằng thuộc tính cạnh tranh. Giữ root 16px và vai trò `font.body.default` 14px cho body.
|
|
41
41
|
|
|
42
42
|
```css
|
|
43
43
|
/* Base: on every element */
|
|
@@ -1,9 +1,67 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: "Z-index"
|
|
3
|
-
description: "
|
|
3
|
+
description: "Khi hai thành phần chồng lên nhau, cái nào được vẽ lên trên. Bảy lớp cơ sở và vai trò toàn màn hình/chờ chặn giữ thứ tự thống nhất."
|
|
4
4
|
order: 8.5
|
|
5
|
-
planned:
|
|
6
|
-
- "Tên các lớp và thứ tự"
|
|
7
|
-
- "Mỗi lớp phủ dùng lớp nào: dropdown, popover, tooltip, dialog, drawer, toast"
|
|
8
|
-
- "Lớp và đổ bóng đi cùng nhau thế nào"
|
|
9
5
|
---
|
|
6
|
+
import ZIndexDemo from '../../../components/ZIndexDemo.astro';
|
|
7
|
+
import TokenTable from '../../../components/TokenTable.astro';
|
|
8
|
+
|
|
9
|
+
Z-index quyết định thành phần nào được vẽ lên trên khi hai thành phần chồng lên nhau. Beehexa dùng bảy lớp cơ sở có tên thay vì tự đặt số, để menu không bao giờ mở ra sau dialog và toast không bao giờ bị lớp phủ mờ che mất.
|
|
10
|
+
|
|
11
|
+
<ZIndexDemo kind="stack" />
|
|
12
|
+
|
|
13
|
+
## Cách hoạt động
|
|
14
|
+
|
|
15
|
+
- **Lớp cao hơn che lớp thấp hơn.** Giá trị cơ sở từ 100 tới 700, mỗi bậc cách nhau 100, chừa chỗ cho vai trò toàn màn hình và chờ chặn rõ ràng.
|
|
16
|
+
- **Chọn lớp theo việc thành phần làm**, không theo con số cần cao bao nhiêu.
|
|
17
|
+
- **Một lớp chỉ so với các thành phần bên cạnh.** Thành phần có z-index riêng, transform, filter hoặc opacity nhỏ hơn 1 sẽ tạo ra một ngữ cảnh chồng lớp mới; không thứ gì bên trong vượt lên trên nó được. Vì vậy danh sách trong dialog được đặt luôn bên trong dialog.
|
|
18
|
+
|
|
19
|
+
[Đổ bóng](/vi/foundations/styles/elevation/) cho thấy bề mặt trông cao bao nhiêu; z-index bảo đảm nó được vẽ lên trên. Một menu cần cả hai.
|
|
20
|
+
|
|
21
|
+
| Lớp | Token | Giá trị | Mức đổ bóng | Dùng cho |
|
|
22
|
+
|---|---|---|---|---|
|
|
23
|
+
| Sticky | `z-index.sticky` | 100 | Page | Header của bảng và thanh công cụ dính khi cuộn |
|
|
24
|
+
| Navigation | `z-index.navigation` | 200 | Page | Header của app, menu bên trái |
|
|
25
|
+
| Overlay | `z-index.overlay` | 300 | Overlay | Menu, danh sách của select, popover |
|
|
26
|
+
| Modal | `z-index.modal` | 400 | Modal | Dialog, drawer và lớp phủ mờ phía sau |
|
|
27
|
+
| Spotlight | `z-index.spotlight` | 500 | Modal | Tour hướng dẫn, vùng làm nổi bật khi onboarding |
|
|
28
|
+
| Tooltip | `z-index.tooltip` | 600 | không có | Tooltip |
|
|
29
|
+
| Toast | `z-index.toast` | 700 | Overlay | Toast, skip link |
|
|
30
|
+
|
|
31
|
+
## Vì sao theo thứ tự này
|
|
32
|
+
|
|
33
|
+
- Menu đè lên thanh điều hướng mà nó mở ra từ đó.
|
|
34
|
+
- Modal chặn cả trang, kể cả menu.
|
|
35
|
+
- Tour cần chỉ được vào thứ nằm trong dialog.
|
|
36
|
+
- Tooltip giải thích một control, dù control đó nằm ở đâu.
|
|
37
|
+
- Toast báo về cả ứng dụng, nên không gì được che nó.
|
|
38
|
+
|
|
39
|
+
## Ví dụ trên một màn hình
|
|
40
|
+
|
|
41
|
+
<ZIndexDemo kind="screen" />
|
|
42
|
+
|
|
43
|
+
Bên trong một component, số từ 1 tới 9 không cần token, ví dụ để nút đang focus trong nhóm nút nằm trên các nút bên cạnh.
|
|
44
|
+
|
|
45
|
+
## Nên và không nên
|
|
46
|
+
|
|
47
|
+
<ZIndexDemo kind="dodont" item="toast" />
|
|
48
|
+
<ZIndexDemo kind="dodont" item="inside" />
|
|
49
|
+
<ZIndexDemo kind="dodont" item="scrim" />
|
|
50
|
+
|
|
51
|
+
## Token
|
|
52
|
+
|
|
53
|
+
<TokenTable prefix="z-index" />
|
|
54
|
+
|
|
55
|
+
## Toàn màn hình và tích hợp framework
|
|
56
|
+
|
|
57
|
+
Hai vai trò mở rộng `z-index.fullscreen` (450) và `z-index.loading` (650) dành cho trình sửa mã/xem mã/ảnh toàn màn hình và màn hình chờ chặn ứng dụng. Toàn màn hình vẫn nằm dưới spotlight, tooltip và toast; màn hình chờ che thành phần tương tác và tooltip, còn toast và skip link luôn trên cùng ở mức 700.
|
|
58
|
+
|
|
59
|
+
Đồ thị vận hành toàn màn hình dùng `z-index.modal` trong stacking context cục bộ có `isolation`, không dùng lớp trình sửa mã. Chrome con chỉ dùng thứ tự cục bộ để inspector toàn cục vẫn xuất hiện phía trên.
|
|
60
|
+
|
|
61
|
+
Adapter Ant Design Vue sở hữu thứ tự lớp native: menu và select dùng overlay, dialog và drawer dùng modal, tooltip dùng tooltip, thông báo dùng toast. Gắn `getPopupContainer` theo ngữ cảnh từ adapter vào ConfigProvider gốc để popup trong dialog, drawer hoặc màn hình toàn màn hình nằm trong chủ sở hữu, phía trên scrim. Không nâng mọi popup toàn cục để bù container sai. Đánh dấu bề mặt toàn màn hình tùy chỉnh bằng `data-bh-overlay-owner`.
|
|
62
|
+
|
|
63
|
+
Modal/Drawer native gốc vẫn đặt trong document body để giữ hình học viewport. Đặt zIndex mặc định của modal bằng `getAntDesignVueModalZIndex()` tại thời điểm gọi (giữ giá trị tường minh của bên gọi), và truyền lớp cha đang hoạt động vào `getAntDesignVueOverlayZIndex(fullscreen, ownerZIndex)` cho drawer lồng nhau. Lớp con dùng giới hạn chủ sở hữu cao nhất cộng một, không cộng dồn z-index của tổ tiên; nhờ vậy xác nhận native nằm trên trình sửa mã toàn màn hình nhưng dưới spotlight và thông báo.
|
|
64
|
+
|
|
65
|
+
Hover, completion và parameter hint tách rời của Monaco dùng `z-index.tooltip`. Cô lập trình sửa mã toàn màn hình để chrome con không che thông báo toàn cục. Chỉ dùng một `color.surface.scrim` sau modal hoặc trình xem ảnh, không chồng nhiều lớp bán trong suốt.
|
|
66
|
+
|
|
67
|
+
Giữ focus containment, trả focus, Escape và khóa cuộn. Kiểm tra trực tiếp đồ thị, gợi ý trình sửa mã, menu lồng nhau, inspector và màn hình chờ; con số không tự chứng minh hiển thị hay khả năng truy cập.
|
|
@@ -12,13 +12,13 @@ export const tokenDescriptionsVi: Record<string, string> = {
|
|
|
12
12
|
'size.target.touch': '44 px. Vùng phản hồi khi chạm trên màn hình cảm ứng. Mở rộng vùng bấm quanh control nhỏ hơn; chiều cao nhìn thấy giữ nguyên.',
|
|
13
13
|
'space.0': '0. Các phần tử dính liền, như các nút trong một segmented group.',
|
|
14
14
|
'space.025': '2 px. Badge trên icon, chấm trạng thái cạnh chữ. Không dùng giữa các control hay làm padding.',
|
|
15
|
-
'space.050': '4 px. Giữa icon và chữ 14 px; giữa tiêu đề và mô t
|
|
15
|
+
'space.050': '4 px. Giữa icon và chữ 14 px; giữa tiêu đề và mô tả; trên và dưới chữ của tooltip và của ô bảng gọn.',
|
|
16
16
|
'space.075': '6 px. Chỉ dùng bên trong component: trên và dưới nhãn của control 32 px, và hai bên tooltip. Không dùng cho bố cục, khoảng cách giữa các phần hay padding của card.',
|
|
17
|
-
'space.100': '8 px. Giữa icon và chữ 16 px; giữa các nút; giữa nhãn và ô nhập; padding ngang của control 24 px.',
|
|
18
|
-
'space.150': '12 px. Padding ngang của control 32 px, như ô nhập và nút.',
|
|
17
|
+
'space.100': '8 px. Giữa icon và chữ 16 px; giữa các nút; giữa nhãn và ô nhập; padding ngang của control 24 px; trên và dưới chữ trong ô bảng.',
|
|
18
|
+
'space.150': '12 px. Padding ngang của control 32 px, như ô nhập và nút, và của ô bảng.',
|
|
19
19
|
'space.200': '16 px. Giữa các phần tử liên quan: ô nhập, mục danh sách, card. Lề trang và gutter lưới dưới 768 px.',
|
|
20
20
|
'space.250': '20 px. Giữa tiêu đề phần và nội dung của nó. Mép của logo và icon menu bên.',
|
|
21
|
-
'space.300': '24 px. Bên trong card, panel và dialog. Lề trang và gutter lưới từ 768 px.',
|
|
21
|
+
'space.300': '24 px. Bên trong card, panel và dialog. Giữa các tab. Lề trang và gutter lưới từ 768 px.',
|
|
22
22
|
'space.400': '32 px. Giữa các nhóm, như các phần của form. Lề trang từ 1440 px.',
|
|
23
23
|
'space.500': '40 px. Quanh trạng thái trống.',
|
|
24
24
|
'space.600': '48 px. Giữa các phần của trang.',
|
|
@@ -32,9 +32,25 @@ export const tokenDescriptionsVi: Record<string, string> = {
|
|
|
32
32
|
'radius.150': '12 px. Card, và nhóm control có padding 4 px.',
|
|
33
33
|
'radius.200': '16 px. Dialog, drawer, và nhóm control có padding 8 px.',
|
|
34
34
|
'radius.full': 'Viên thuốc và hình tròn. Avatar, switch và chip dạng viên thuốc.',
|
|
35
|
+
'elevation.shadow.raised': 'Card, kể cả card chỉ để xem nội dung, và card đang được kéo thả. Ở dark mode bóng đậm hơn.',
|
|
36
|
+
'elevation.shadow.overlay': 'Dropdown, menu, popover, danh sách xổ xuống của select và toast. Dùng kèm nền color.surface.overlay.',
|
|
37
|
+
'elevation.shadow.modal': 'Dialog, drawer và sheet toàn màn hình nằm trên lớp phủ mờ. Dùng kèm nền color.surface.overlay.',
|
|
38
|
+
'color.surface.overlay': 'Nền của menu, popover, danh sách xổ xuống, toast, dialog và drawer. Ở dark mode sáng hơn nền card (color.surface) một bậc, để người dùng thấy chúng nằm trên card.',
|
|
39
|
+
'color.surface.overlay.hover': 'Mục trong menu hoặc danh sách khi rê chuột qua.',
|
|
40
|
+
'color.surface.overlay.pressed': 'Mục trong menu hoặc danh sách khi đang nhấn.',
|
|
41
|
+
'color.surface.overlay.selected': 'Mục đang được chọn trong menu hoặc danh sách. Luôn kèm thêm một dấu hiệu khác như dấu check hoặc chữ đậm.',
|
|
42
|
+
'color.surface.overlay.selected.hover': 'Mục đang được chọn khi rê chuột qua. Ở dark mode giữ graphite 5 (bằng màu đang chọn), vì graphite 6 làm chữ phụ và viền không đủ tương phản; dấu check cho biết mục đang được chọn.',
|
|
43
|
+
'z-index.sticky': 'Header của bảng và thanh công cụ dính lại khi cuộn trang.',
|
|
44
|
+
'z-index.navigation': 'Header của app và menu bên trái.',
|
|
45
|
+
'z-index.overlay': 'Dropdown, menu, popover và danh sách xổ xuống của select.',
|
|
46
|
+
'z-index.modal': 'Dialog, drawer và lớp phủ mờ phía sau chúng.',
|
|
47
|
+
'z-index.spotlight': 'Tour hướng dẫn và vùng làm nổi bật khi onboarding, nằm trên dialog.',
|
|
48
|
+
'z-index.tooltip': 'Tooltip, nằm trên mọi thành phần người dùng thao tác được.',
|
|
49
|
+
'z-index.toast': 'Toast và skip link: luôn nằm trên cùng.',
|
|
50
|
+
'opacity.disabled': 'Ảnh, logo, avatar và hình minh hoạ nằm trong thứ đang bị tắt. Không dùng cho button, ô nhập, chữ hay icon: chúng dùng token màu disabled.',
|
|
35
51
|
'border.width.default': '1 px. Ô nhập, button phụ, card, bảng và đường phân cách.',
|
|
36
52
|
'border.width.selected': '2 px. Thanh dưới tab đang chọn hoặc cạnh mục side nav đang chọn, và viền card đang chọn. Đi cùng color.border.selected.',
|
|
37
53
|
'border.width.focused': '2 px. Focus ring. Đi cùng color.border.focus và state.focus.offset.',
|
|
38
|
-
'border.width.accent': '4 px. Thanh trạng thái hoặc nhấn mạnh ở một cạnh:
|
|
54
|
+
'border.width.accent': '4 px. Thanh trạng thái hoặc nhấn mạnh ở một cạnh: dòng bị lỗi, callout và trích dẫn. Đi cùng màu viền trạng thái hoặc màu brand.',
|
|
39
55
|
'state.focus.offset': '2 px. Khoảng giữa control và focus ring. Ring vẽ ra ngoài; trong khung cắt mất ring (mục menu, ô bảng, tab trong vùng cuộn) thì dùng giá trị âm.',
|
|
40
56
|
};
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
:root[data-theme="dark"] { background: var(--c-bg); }
|
|
38
38
|
body.docs { color: var(--c-ink); background: var(--c-bg); }
|
|
39
39
|
|
|
40
|
-
.site-header { position: sticky; z-index:
|
|
40
|
+
.site-header { position: sticky; z-index: var(--bh-z-index-navigation); top: 0; container-type: inline-size; box-sizing: content-box; height: var(--header-h); border-bottom: 1px solid var(--c-line); background: var(--c-bg); }
|
|
41
41
|
/* The logo sits 20 px from the window edge, in line with the side navigation icons and labels
|
|
42
42
|
(8 px inset + 12 px item padding); the tools end at the page margin. */
|
|
43
43
|
.header-inner { position: relative; display: flex; align-items: center; gap: var(--bh-space-150); height: 100%; padding: 0 var(--page-margin) 0 var(--bh-space-250); }
|
|
@@ -59,39 +59,39 @@ body.docs { color: var(--c-ink); background: var(--c-bg); }
|
|
|
59
59
|
.header-nav a { position: relative; display: flex; align-items: center; color: var(--c-muted); text-decoration: none; white-space: nowrap; font: var(--bh-font-label-default); }
|
|
60
60
|
.header-nav a:hover { color: var(--c-ink); }
|
|
61
61
|
.header-nav a[aria-current='page'] { color: var(--c-ink); }
|
|
62
|
-
.header-nav a[aria-current='page']::after { content: ''; position: absolute; inset: auto 0 -1px; height:
|
|
62
|
+
.header-nav a[aria-current='page']::after { content: ''; position: absolute; inset: auto 0 -1px; height: var(--bh-border-width-selected); background: var(--c-gold); }
|
|
63
63
|
|
|
64
64
|
.header-tools { display: flex; align-items: center; gap: var(--bh-space-100); margin-left: auto; }
|
|
65
65
|
|
|
66
|
-
.icon-button {
|
|
66
|
+
.icon-button { list-style: none; }
|
|
67
67
|
.icon-button:hover { background: var(--c-hover); }
|
|
68
68
|
.icon-button::-webkit-details-marker { display: none; }
|
|
69
69
|
.theme-sun { display: none; }
|
|
70
70
|
:root[data-theme='dark'] .theme-sun { display: block; }
|
|
71
71
|
:root[data-theme='dark'] .theme-moon { display: none; }
|
|
72
72
|
|
|
73
|
-
.search { position: relative; display: none; align-items: center; width: 240px; height:
|
|
74
|
-
.search:focus-within { border-color: var(--
|
|
75
|
-
.search-icon { flex: none; margin-left: calc(var(--bh-space-150) -
|
|
73
|
+
.search { position: relative; display: none; align-items: center; width: 240px; height: var(--bh-size-control-default); border: var(--bh-border-width-default) solid var(--bh-color-border-bold); border-radius: var(--bh-radius-100); background: var(--bh-color-surface); }
|
|
74
|
+
.search:focus-within { border-color: var(--bh-color-border-focus); }
|
|
75
|
+
.search-icon { flex: none; margin-left: calc(var(--bh-space-150) - var(--bh-border-width-default)); color: var(--bh-color-icon-subtle); } /* 12 px from the outer edge, border included */
|
|
76
76
|
.search input { flex: 1; min-width: 0; height: 100%; padding: 0 var(--bh-space-100) 0 var(--bh-space-050); border: 0; outline: 0; color: var(--c-ink); background: transparent; font: var(--bh-font-body-default); }
|
|
77
|
-
.search input::placeholder { color: var(--
|
|
77
|
+
.search input::placeholder { color: var(--bh-color-text-subtlest); }
|
|
78
78
|
.search input::-webkit-search-cancel-button { display: none; }
|
|
79
|
-
.search-hint { margin-right: calc(var(--bh-space-100) -
|
|
79
|
+
.search-hint { margin-right: calc(var(--bh-space-100) - var(--bh-border-width-default)); padding: 0 var(--bh-space-050); border: 1px solid var(--c-line); border-radius: var(--bh-radius-050); color: var(--c-muted); background: var(--c-bg); white-space: nowrap; font: var(--bh-font-label-small); }
|
|
80
80
|
.search:focus-within .search-hint { display: none; }
|
|
81
|
-
.search-results { position: absolute; z-index:
|
|
81
|
+
.search-results { position: absolute; z-index: var(--bh-z-index-overlay); top: calc(100% + var(--bh-space-050)); right: 0; width: 360px; max-width: calc(100vw - 2 * var(--page-margin)); margin: 0; padding: var(--bh-space-050); border-radius: var(--bh-radius-100); background: var(--bh-color-surface-overlay); box-shadow: var(--c-shadow); list-style: none; }
|
|
82
82
|
.search-results a { display: grid; gap: var(--bh-space-050); padding: var(--bh-space-100) var(--bh-space-150); border-radius: var(--bh-radius-050); color: var(--c-ink); text-decoration: none; }
|
|
83
83
|
.search-results b { font: var(--bh-font-label-default); }
|
|
84
84
|
.search-results span { color: var(--c-muted); font: var(--bh-font-body-small); }
|
|
85
|
-
.search-results [aria-selected='true'] a, .search-results a:hover { background: var(--
|
|
85
|
+
.search-results [aria-selected='true'] a, .search-results a:hover { background: var(--bh-color-surface-overlay-hover); }
|
|
86
86
|
.search-empty { padding: var(--bh-space-100) var(--bh-space-150); color: var(--c-muted); font: var(--bh-font-body-default); }
|
|
87
87
|
.search-open { display: inline-grid; }
|
|
88
88
|
|
|
89
89
|
.header-menu { position: relative; display: block; }
|
|
90
|
-
.header-menu nav { position: absolute; top: calc(100% + var(--bh-space-050)); right: 0; display: grid; gap: var(--bh-space-050); width: 220px; padding: var(--bh-space-
|
|
90
|
+
.header-menu nav { position: absolute; top: calc(100% + var(--bh-space-050)); right: 0; display: grid; gap: var(--bh-space-050); width: 220px; padding: var(--bh-space-050); border-radius: var(--bh-radius-100); background: var(--bh-color-surface-overlay); box-shadow: var(--c-shadow); }
|
|
91
91
|
.header-menu nav a { display: flex; align-items: center; min-height: var(--bh-size-control-default); padding: 0 var(--bh-space-150); border-radius: var(--bh-radius-050); color: var(--c-ink); text-decoration: none; font: var(--bh-font-label-default); }
|
|
92
|
-
.header-menu nav a:hover { background: var(--
|
|
93
|
-
.header-menu nav a[aria-current='page'] { background:
|
|
94
|
-
.header-menu nav a[aria-current='page']:hover { background: var(--
|
|
92
|
+
.header-menu nav a:hover { background: var(--bh-color-surface-overlay-hover); }
|
|
93
|
+
.header-menu nav a[aria-current='page'] { background: var(--bh-color-surface-overlay-selected); box-shadow: inset var(--bh-border-width-selected) 0 0 var(--c-gold); }
|
|
94
|
+
.header-menu nav a[aria-current='page']:hover { background: var(--bh-color-surface-overlay-selected-hover); }
|
|
95
95
|
|
|
96
96
|
/* Footer: one 48 px line, on the same edges as the header. Muted until hover, so it never
|
|
97
97
|
competes with the page. */
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
.prose .c-scale-table { width: 100%; min-width: 640px; table-layout: fixed; margin: 0; }
|
|
23
23
|
.prose .c-scale-table th, .prose .c-scale-table td { padding: var(--bh-space-050) var(--bh-space-025); border: 0; text-align: center; vertical-align: top; }
|
|
24
24
|
.prose .c-scale-table th[scope='row'] { width: 48px; text-align: left; }
|
|
25
|
-
.c-chip { display: block; height:
|
|
25
|
+
.c-chip { display: block; height: var(--bh-space-500); margin-bottom: var(--bh-space-050); border-radius: var(--bh-radius-050); box-shadow: inset 0 0 0 var(--bh-border-width-default) var(--bh-color-border); }
|
|
26
26
|
.c-scale-table .c-num { color: var(--c-muted); font: var(--bh-font-body-small); font-variant-numeric: tabular-nums; }
|
|
27
27
|
.prose .c-steps { display: flex; flex-wrap: wrap; gap: var(--bh-space-050) var(--bh-space-250); margin: 0; padding: 0; list-style: none; color: var(--c-muted); font: var(--bh-font-body-small); }
|
|
28
28
|
.prose .c-steps li { margin: 0; }
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
/* Role and status tables */
|
|
32
32
|
.c-cell { display: inline-flex; align-items: center; gap: var(--bh-space-100); white-space: nowrap; }
|
|
33
33
|
.c-cell > .c-num { align-self: baseline; font: var(--bh-font-code-default); }
|
|
34
|
-
.c-dot { flex: none; width: 16px; height: 16px; border-radius: var(--bh-radius-050); box-shadow: inset 0 0 0
|
|
34
|
+
.c-dot { flex: none; width: 16px; height: 16px; border-radius: var(--bh-radius-050); box-shadow: inset 0 0 0 var(--bh-border-width-default) var(--bh-color-border); }
|
|
35
35
|
.c-check { display: block; color: var(--c-muted); font: var(--bh-font-body-small); font-variant-numeric: tabular-nums; }
|
|
36
36
|
.c-from { color: var(--c-muted); font: var(--bh-font-body-small); }
|
|
37
37
|
.prose .c-status td.c-num { font: var(--bh-font-body-small); font-variant-numeric: tabular-nums; }
|
|
@@ -42,9 +42,6 @@
|
|
|
42
42
|
.c-action-stage { display: grid; place-items: center; height: 96px; background: var(--bh-color-surface-subtle); }
|
|
43
43
|
.c-action figcaption { display: grid; gap: var(--bh-space-050); padding: var(--bh-space-200); color: var(--c-muted); font: var(--bh-font-body-default); }
|
|
44
44
|
.c-action figcaption code { color: var(--c-ink); }
|
|
45
|
-
.c-button { display: inline-flex; align-items: center; height: 32px; padding: 0 var(--bh-space-150); border-radius: var(--bh-radius-100); font: var(--bh-font-label-default); }
|
|
46
|
-
.c-button.is-primary { color: var(--bh-color-text-inverse); background: var(--bh-color-background-neutral-bold); }
|
|
47
|
-
.c-button.is-danger { color: var(--bh-color-text-on-bold); background: var(--bh-color-background-danger-bold); }
|
|
48
45
|
@container prose (min-width: 640px) { .c-actions { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
|
|
49
46
|
|
|
50
47
|
/* Labels */
|
|
@@ -80,9 +77,9 @@
|
|
|
80
77
|
.c-dd-panel p { margin: 0; padding: var(--bh-space-150) var(--bh-space-200); color: var(--c-muted); font: var(--bh-font-body-default); }
|
|
81
78
|
.c-dd-row { display: inline-flex; flex-wrap: wrap; gap: var(--bh-space-100); }
|
|
82
79
|
.c-dd-code { font: var(--bh-font-code-default); }
|
|
83
|
-
.c-dd-tabs { display: flex; gap: var(--bh-space-
|
|
80
|
+
.c-dd-tabs { display: flex; gap: var(--bh-space-300); border-bottom: var(--bh-border-width-default) solid var(--bh-color-border); }
|
|
84
81
|
.c-dd-tab { padding: var(--bh-space-100) 0; color: var(--bh-color-text-subtle); font: var(--bh-font-label-default); }
|
|
85
|
-
.c-dd-tab.is-current { color: var(--bh-color-text); box-shadow: inset 0 -
|
|
82
|
+
.c-dd-tab.is-current { color: var(--bh-color-text); box-shadow: inset 0 calc(-1 * var(--bh-border-width-selected)) 0 var(--bh-color-border-selected); }
|
|
86
83
|
/* The Don't examples show colours used wrongly on purpose, so they read the scale directly. */
|
|
87
84
|
.c-dd-yellow-text { color: var(--bh-color-brand-yellow); font: var(--bh-font-label-default); text-decoration: underline; }
|
|
88
85
|
.c-dd-yellow-button { display: inline-flex; align-items: center; padding: var(--bh-space-100) var(--bh-space-200); border-radius: var(--bh-radius-100); color: var(--bh-color-brand-white); background: var(--bh-color-brand-yellow); font: var(--bh-font-label-default); }
|
|
@@ -113,7 +110,7 @@
|
|
|
113
110
|
|
|
114
111
|
/* Balance bar */
|
|
115
112
|
.c-balance { margin: 0 0 var(--bh-space-300); }
|
|
116
|
-
.c-balance-bar { display: flex; height:
|
|
113
|
+
.c-balance-bar { display: flex; height: var(--bh-space-500); overflow: hidden; border: 1px solid var(--c-line); border-radius: var(--bh-radius-100); }
|
|
117
114
|
.c-balance figcaption { margin-top: var(--bh-space-100); color: var(--c-muted); font: var(--bh-font-body-default); }
|
|
118
115
|
|
|
119
116
|
/* Token name anatomy */
|
|
@@ -137,14 +134,13 @@
|
|
|
137
134
|
.c-surf-page { position: relative; display: grid; grid-template-columns: 42% 1fr; gap: var(--bh-space-150); min-height: 180px; padding: var(--bh-space-300) var(--bh-space-150) var(--bh-space-150); border: 1px solid var(--c-line); border-radius: var(--bh-radius-150); background: var(--bh-color-surface-page); }
|
|
138
135
|
.c-surf-page > .c-tag { position: absolute; top: 6px; left: 12px; }
|
|
139
136
|
.c-surf-side { padding: var(--bh-space-100); border-radius: var(--bh-radius-100); background: var(--bh-color-surface-subtle); }
|
|
140
|
-
.c-surf-card { position: relative; display: flex; flex-wrap: wrap; align-content: flex-start; gap: var(--bh-space-050);
|
|
137
|
+
.c-surf-card { position: relative; display: flex; flex-wrap: wrap; align-content: flex-start; gap: var(--bh-space-050); }
|
|
141
138
|
.c-surf-tip { position: absolute; right: 8px; bottom: 8px; padding: var(--bh-space-050) var(--bh-space-100); border-radius: var(--bh-radius-100); color: var(--bh-color-text-inverse); background: var(--bh-color-surface-inverse); font: var(--bh-font-body-small); }
|
|
142
|
-
.c-tag { display: inline-block; padding:
|
|
139
|
+
.c-tag { display: inline-block; padding: 0 var(--bh-space-075); border-radius: var(--bh-radius-050); color: var(--bh-color-text-subtle); background: var(--bh-color-background-neutral); font: var(--bh-font-code-default); }
|
|
143
140
|
.c-tag.is-on-dark { color: var(--bh-color-text-inverse); background: var(--bh-color-surface-inverse); }
|
|
144
141
|
.c-surf-page.is-dimmed { display: grid; place-items: center; grid-template-columns: 1fr; padding: var(--bh-space-500) var(--bh-space-150) var(--bh-space-200); overflow: hidden; }
|
|
145
142
|
.c-surf-scrim { position: absolute; inset: 0; padding: var(--bh-space-075) var(--bh-space-150); background: var(--bh-color-surface-scrim); }
|
|
146
|
-
.c-surf-dialog { position: relative;
|
|
147
|
-
.c-surf-dialog b { color: var(--bh-color-text); font: var(--bh-font-heading-xsmall); }
|
|
143
|
+
.c-surf-dialog { position: relative; max-width: 20rem; }
|
|
148
144
|
@container prose (min-width: 640px) { .c-surf { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
|
|
149
145
|
|
|
150
146
|
/* States */
|
|
@@ -154,20 +150,11 @@
|
|
|
154
150
|
.c-focus { outline: var(--bh-border-width-focused) solid var(--bh-color-border-focus); outline-offset: var(--bh-state-focus-offset); }
|
|
155
151
|
.c-disabled { border-color: var(--bh-color-border-disabled) !important; color: var(--bh-color-text-disabled) !important; background: var(--bh-color-background-disabled) !important; }
|
|
156
152
|
.c-state-row { display: block; min-width: 88px; padding: var(--bh-space-100) var(--bh-space-150); border-radius: var(--bh-radius-100); color: var(--bh-color-text); text-align: left; white-space: nowrap; font: var(--bh-font-body-default); }
|
|
157
|
-
.c-state-row.is-selected { background:
|
|
153
|
+
.c-state-row.is-selected { background: var(--bh-color-background-selected); box-shadow: inset var(--bh-border-width-selected) 0 0 var(--bh-color-border-selected); }
|
|
158
154
|
|
|
159
155
|
/* Banners */
|
|
160
156
|
.c-banners { display: grid; gap: var(--bh-space-100); margin: 0 0 var(--bh-space-300); }
|
|
161
|
-
.c-banner { display: flex; align-items: center; gap: var(--bh-space-100); padding: calc(var(--bh-space-100) - 1px) calc(var(--bh-space-150) - 1px); border: 1px solid; border-radius: var(--bh-radius-100); color: var(--bh-color-text); font: var(--bh-font-body-default); }
|
|
162
157
|
.c-banner-icon { display: inline-flex; }
|
|
163
|
-
.c-banner.is-info { border-color: var(--bh-color-border-info-subtle); background: var(--bh-color-background-info-subtle); }
|
|
164
|
-
.c-banner.is-info .c-banner-icon { color: var(--bh-color-icon-info); }
|
|
165
|
-
.c-banner.is-success { border-color: var(--bh-color-border-success-subtle); background: var(--bh-color-background-success-subtle); }
|
|
166
|
-
.c-banner.is-success .c-banner-icon { color: var(--bh-color-icon-success); }
|
|
167
|
-
.c-banner.is-warning { border-color: var(--bh-color-border-warning-subtle); background: var(--bh-color-background-warning-subtle); }
|
|
168
|
-
.c-banner.is-warning .c-banner-icon { color: var(--bh-color-icon-warning); }
|
|
169
|
-
.c-banner.is-danger { border-color: var(--bh-color-border-danger-subtle); background: var(--bh-color-background-danger-subtle); }
|
|
170
|
-
.c-banner.is-danger .c-banner-icon { color: var(--bh-color-icon-danger); }
|
|
171
158
|
|
|
172
159
|
/* Step jobs */
|
|
173
160
|
.c-steps-ill { display: grid; gap: var(--bh-space-150); margin: 0 0 var(--bh-space-300); padding: var(--bh-space-200); border: 1px solid var(--c-line); border-radius: var(--bh-radius-150); }
|
|
@@ -178,11 +165,11 @@
|
|
|
178
165
|
.c-steps-row > b { align-self: center; font: var(--bh-font-label-default); }
|
|
179
166
|
.c-step-cell { display: grid; justify-items: center; gap: var(--bh-space-050); }
|
|
180
167
|
.c-step-cell small { color: var(--c-muted); font: var(--bh-font-body-small); }
|
|
181
|
-
.c-step-bg { width: 100%; height:
|
|
182
|
-
.c-step-pill, .c-step-fill { display: grid; place-items: center; overflow: hidden; width: 100%; height:
|
|
168
|
+
.c-step-bg { width: 100%; height: var(--bh-size-control-default); border: 1px solid var(--c-line); border-radius: var(--bh-radius-050); }
|
|
169
|
+
.c-step-pill, .c-step-fill { display: grid; place-items: center; overflow: hidden; width: 100%; height: var(--bh-size-control-default); border-radius: var(--bh-radius-100); color: var(--bh-color-text); font: var(--bh-font-label-small); }
|
|
183
170
|
.c-step-fill { color: var(--bh-color-text-on-bold); }
|
|
184
|
-
.c-step-line { width: 100%; height:
|
|
185
|
-
.c-step-text { display: grid; place-items: center; height:
|
|
171
|
+
.c-step-line { width: 100%; height: var(--bh-size-control-default); border: 2px solid; border-radius: var(--bh-radius-100); }
|
|
172
|
+
.c-step-text { display: grid; place-items: center; height: var(--bh-size-control-default); font: var(--bh-font-heading-small); }
|
|
186
173
|
.c-steps-ill figcaption { color: var(--c-muted); font: var(--bh-font-body-small); }
|
|
187
174
|
|
|
188
175
|
/* Themes */
|
|
@@ -219,7 +206,7 @@
|
|
|
219
206
|
.c-pal-sw:last-of-type { border-radius: var(--bh-radius-050) var(--bh-radius-050) var(--bh-radius-100) var(--bh-radius-100); }
|
|
220
207
|
.c-pal-sw .c-num { font: var(--bh-font-label-small); font-family: var(--bh-font-family-mono); opacity: .9; }
|
|
221
208
|
.c-pal-sw em { margin-left: var(--bh-space-050); font-style: normal; font-weight: var(--bh-font-weight-semibold); text-transform: lowercase; }
|
|
222
|
-
.c-pal.is-light .c-pal-sw:is(:nth-of-type(1), :nth-of-type(2)) { box-shadow: inset 0 0 0
|
|
209
|
+
.c-pal.is-light .c-pal-sw:is(:nth-of-type(1), :nth-of-type(2)) { box-shadow: inset 0 0 0 var(--bh-border-width-default) var(--bh-color-border); }
|
|
223
210
|
@container prose (width < 640px) { .c-pal-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); row-gap: var(--bh-space-200); } }
|
|
224
211
|
|
|
225
212
|
/* Ramps on the overview */
|
|
@@ -237,7 +224,7 @@
|
|
|
237
224
|
.c-roles td { vertical-align: top; overflow-wrap: anywhere; }
|
|
238
225
|
.c-roles .c-check { margin-top: var(--bh-space-050); }
|
|
239
226
|
@container prose (width < 560px) { .c-roles { table-layout: auto; } .c-roles .c-spec { display: inline-grid; margin: 0 var(--bh-space-100) 0 0; vertical-align: middle; } .c-roles .c-num { display: inline; } }
|
|
240
|
-
.c-spec { display: grid; place-items: center; width: 72px; height: 44px; margin-bottom: var(--bh-space-075); border-radius: var(--bh-radius-050); box-shadow: inset 0 0 0
|
|
227
|
+
.c-spec { display: grid; place-items: center; width: 72px; height: 44px; margin-bottom: var(--bh-space-075); border-radius: var(--bh-radius-050); box-shadow: inset 0 0 0 var(--bh-border-width-default) var(--bh-color-border); font: var(--bh-font-heading-small); }
|
|
241
228
|
.c-spec.is-border { box-shadow: none; }
|
|
242
229
|
.c-spec-fill { width: 52px; height: 28px; border-radius: var(--bh-radius-050); background: var(--fill); box-shadow: inset 0 0 0 1px var(--edge); }
|
|
243
230
|
.c-roles .c-num { display: block; font: var(--bh-font-code-default); }
|
|
@@ -248,7 +235,7 @@
|
|
|
248
235
|
.c-pair-stage { display: flex; flex-wrap: wrap; align-content: flex-start; gap: var(--bh-space-050) var(--bh-space-150); min-height: 96px; padding: var(--bh-space-200); font: var(--bh-font-body-default); }
|
|
249
236
|
.c-pair-text { font: var(--bh-font-code-default); }
|
|
250
237
|
.c-pair-marks { display: flex; flex-basis: 100%; gap: var(--bh-space-100); margin-top: var(--bh-space-050); }
|
|
251
|
-
.c-pair-mark { display: grid; place-items: center; width:
|
|
238
|
+
.c-pair-mark { display: grid; place-items: center; width: var(--bh-space-300); height: var(--bh-space-300); border-radius: var(--bh-radius-050); }
|
|
252
239
|
.c-pair figcaption { padding: var(--bh-space-150) var(--bh-space-200); border-top: 1px solid var(--c-line); font: var(--bh-font-body-small); }
|
|
253
240
|
.c-pair figcaption b { margin-right: var(--bh-space-050); }
|
|
254
241
|
.c-pair figcaption .c-from { display: block; margin-top: var(--bh-space-050); }
|
|
@@ -262,9 +249,9 @@
|
|
|
262
249
|
/* Emphasis */
|
|
263
250
|
.c-emph { margin: 0 0 var(--bh-space-300); padding: var(--bh-space-200); border: 1px solid var(--c-line); border-radius: var(--bh-radius-150); }
|
|
264
251
|
.c-emph-grid { display: grid; grid-template-columns: 80px repeat(3, minmax(0, 1fr)); gap: var(--bh-space-100); align-items: center; font: var(--bh-font-body-small); }
|
|
265
|
-
.c-emph-fill { display: flex; align-items: center; min-height:
|
|
252
|
+
.c-emph-fill { display: flex; align-items: center; min-height: var(--bh-space-500); padding: 0 var(--bh-space-150); border-radius: var(--bh-radius-100); font: var(--bh-font-body-default); overflow-wrap: anywhere; }
|
|
266
253
|
.c-emph-none { color: var(--c-muted); text-align: center; }
|
|
267
254
|
.c-emph figcaption { margin-top: var(--bh-space-150); color: var(--c-muted); font: var(--bh-font-body-default); }
|
|
268
|
-
.c-emph-fill { box-shadow: inset 0 0 0
|
|
269
|
-
.c-status .c-dot { width:
|
|
255
|
+
.c-emph-fill { box-shadow: inset 0 0 0 var(--bh-border-width-default) var(--bh-color-border); }
|
|
256
|
+
.c-status .c-dot { width: var(--bh-space-400); height: var(--bh-space-400); border-radius: var(--bh-radius-050); }
|
|
270
257
|
.c-pair-warn { margin-left: var(--bh-space-025); color: var(--c-ink); font-family: var(--bh-font-family-sans); }
|