@things-factory/shell 10.0.13 → 10.0.19
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/client/themes/app-theme.css +12 -4
- package/client/themes/grist-theme.css +1 -1
- package/client/themes/layout-theme.css +94 -1
- package/client/themes/oops-theme.css +8 -1
- package/client/themes/state-color.css +52 -3
- package/client/themes/theme-base.css +37 -0
- package/client/themes/ui-tokens.css +111 -0
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
|
@@ -60,14 +60,22 @@ body {
|
|
|
60
60
|
/* material design component themes */
|
|
61
61
|
--mdc-danger-button-primary-color: var(--status-danger-color);
|
|
62
62
|
|
|
63
|
-
/*
|
|
64
|
-
|
|
63
|
+
/*
|
|
64
|
+
* button style
|
|
65
|
+
*
|
|
66
|
+
* 바탕을 회색(surface-variant)으로 채우고 있었다. 버튼이 서넛 놓이는 툴바에서 회색 덩어리가
|
|
67
|
+
* 나란히 서면 어느 것이 중요한지 보이지 않는다. 기본은 **면 색 + 테두리**로 두고, 채우는 것은
|
|
68
|
+
* 주 동작과 위험한 동작에만 남긴다(그 둘은 `[raised]`·`[danger]` 가 그린다).
|
|
69
|
+
*/
|
|
70
|
+
--button-background-color: var(--ui-panel, var(--md-sys-color-surface-container-lowest));
|
|
65
71
|
--button-background-focus-color: var(--md-sys-color-primary);
|
|
66
72
|
--button-border: var(--border-dim-color);
|
|
67
|
-
|
|
73
|
+
/* 4px 은 모서리가 둥근지 각진지 애매하다 — 다른 면(카드·표)과 같은 눈금을 쓴다. */
|
|
74
|
+
--button-border-radius: var(--ui-r-small, 6px);
|
|
68
75
|
--button-margin: var(--margin-default) var(--margin-default) var(--margin-default) 0;
|
|
69
76
|
--button-padding: calc(var(--padding-narrow) * 1.5) var(--padding-wide);
|
|
70
|
-
|
|
77
|
+
/* 글자는 본문색으로 — 강조는 아이콘과 주 동작이 맡는다. 글자까지 색을 주면 링크로 읽힌다. */
|
|
78
|
+
--button-color: var(--md-sys-color-on-surface);
|
|
71
79
|
--button-font: 600 var(--fontsize-default) var(--theme-font);
|
|
72
80
|
--button-text-transform: capitalize;
|
|
73
81
|
--button-active-box-shadow: 1px 1px 1px 0px rgba(0, 0, 0, 0.2);
|
|
@@ -27,7 +27,7 @@ body {
|
|
|
27
27
|
--grid-header-top-border: 2px solid var(--md-sys-color-primary);
|
|
28
28
|
--grid-header-bottom-border: var(--grid-container-border-color);
|
|
29
29
|
--grid-header-padding: var(--spacing-small) var(--spacing-tiny);
|
|
30
|
-
--grid-header-sorter-size:
|
|
30
|
+
--grid-header-sorter-size: 14px;
|
|
31
31
|
--grid-header-splitter-border: var(--grid-container-border-color);
|
|
32
32
|
--grid-header-splitter-border-hover: 1px solid var(--md-sys-color-inverse-primary);
|
|
33
33
|
--grid-header-color: var(--md-sys-color-primary);
|
|
@@ -35,7 +35,7 @@ body {
|
|
|
35
35
|
--group-bar-active-line-color: var(--md-sys-color-on-secondary-container);
|
|
36
36
|
--group-bar-line: solid 3px var(--md-sys-color-outline);
|
|
37
37
|
|
|
38
|
-
--button-container-margin:
|
|
38
|
+
--button-container-margin: initial;
|
|
39
39
|
--button-container-padding: 0 var(--padding-default) var(--padding-wide) var(--padding-default);
|
|
40
40
|
--button-container-background: transparent;
|
|
41
41
|
--button-container-height: initial;
|
|
@@ -46,6 +46,86 @@ body {
|
|
|
46
46
|
--button-container-button-height: initial;
|
|
47
47
|
--button-container-button-border: var(--button-border);
|
|
48
48
|
|
|
49
|
+
/* ── 동작 버튼 ──────────────────────────────────────────────────────── */
|
|
50
|
+
/*
|
|
51
|
+
* 버튼 — 페이지의 동작 버튼(발행·취소·내보내기 …).
|
|
52
|
+
*
|
|
53
|
+
* ── 무엇이 어긋나 있었나 (2026-08-31, 실측) ─────────────────────────────────
|
|
54
|
+
* 이 버튼들은 `md-assist-chip` 으로 그려진다(`ox-page-action-context-bar`). 그런데 그 부품이 읽는
|
|
55
|
+
* `--md-assist-chip-*` 토큰을 **아무도 정하지 않았다.** 그래서 머티리얼 기본값으로 떨어졌고,
|
|
56
|
+
* 브라우저에서 잰 값이 이랬다.
|
|
57
|
+
*
|
|
58
|
+
* ```
|
|
59
|
+
* 글자색 rgb(0, 0, 0) 순수 검정. 본문 글자색(on-surface)과 다르다
|
|
60
|
+
* 굵기 400 본문과 같은 굵기라 누를 것으로 안 보인다
|
|
61
|
+
* 크기 13.33px 지정한 적 없는 값(1em 의 브라우저 기본에서 나온 것)
|
|
62
|
+
* 모서리 5px 둥근 것도 각진 것도 아닌 어중간한 값
|
|
63
|
+
* 높이 32px 손가락으로 누르기에 작다(WCAG 최소 44px)
|
|
64
|
+
* ```
|
|
65
|
+
*
|
|
66
|
+
* 즉 「낡아 보인다」의 상당 부분이 취향이 아니라 **값이 비어 있어서** 생긴 것이었다.
|
|
67
|
+
*
|
|
68
|
+
* ── 무엇을 정하나 ───────────────────────────────────────────────────────────
|
|
69
|
+
* 부품은 `@operato/*` 에 있어 고칠 수 없지만, 이 토큰들은 상속되므로 문서 수준에서 정하면 모든 앱의
|
|
70
|
+
* 모든 동작 버튼에 닿는다.
|
|
71
|
+
*
|
|
72
|
+
* ── 아직 못 하는 것 ─────────────────────────────────────────────────────────
|
|
73
|
+
* 지금은 **주 동작과 보조 동작이 똑같이 보인다.** 「발행」과 「취소」가 구별되지 않는다.
|
|
74
|
+
* 부품이 그 구분을 나타내는 표식(속성)을 붙이지 않아서, 문서 수준의 토큰으로는 가를 수 없다
|
|
75
|
+
* (속성 선택자는 shadow DOM 안으로 들어가지 못한다). 부품 쪽에 `[danger]` 는 이미 있으므로,
|
|
76
|
+
* 주 동작 표식이 생기면 여기서 채운다.
|
|
77
|
+
*/
|
|
78
|
+
|
|
79
|
+
/* ── 크기 ────────────────────────────────────────────────────────────── */
|
|
80
|
+
/*
|
|
81
|
+
* 마우스로 쓰는 화면의 기본은 36px 이다. 44px(손가락 최소)을 기본으로 두었더니 관리 화면에서
|
|
82
|
+
* 버튼이 커 보였다 — 마우스는 조준이 정확해서 그만큼 필요하지 않다.
|
|
83
|
+
*
|
|
84
|
+
* 나누는 기준은 화면 폭이 아니라 **입력 장치**다. 폭으로 나누면 창을 좁힌 데스크톱에서 버튼이
|
|
85
|
+
* 커지고, 큰 태블릿에서는 작은 채로 남는다. 아래 pointer: coarse 가 그 자리를 넓힌다.
|
|
86
|
+
*/
|
|
87
|
+
--md-assist-chip-container-height: 36px;
|
|
88
|
+
--md-assist-chip-container-shape: var(--ui-r-small, 6px);
|
|
89
|
+
--md-assist-chip-leading-space: 14px;
|
|
90
|
+
--md-assist-chip-trailing-space: 16px;
|
|
91
|
+
--md-assist-chip-with-leading-icon-leading-space: 12px;
|
|
92
|
+
--md-assist-chip-icon-size: 18px;
|
|
93
|
+
--md-assist-chip-icon-label-space: 7px;
|
|
94
|
+
|
|
95
|
+
/* ── 글자 ────────────────────────────────────────────────────────────── */
|
|
96
|
+
/* 굵기 600 — 본문(400)과 같으면 문장인지 버튼인지 구별되지 않는다. */
|
|
97
|
+
--md-assist-chip-label-text-font: var(--theme-font);
|
|
98
|
+
--md-assist-chip-label-text-size: var(--ui-t-body, 13px);
|
|
99
|
+
--md-assist-chip-label-text-weight: 600;
|
|
100
|
+
--md-assist-chip-label-text-line-height: 1;
|
|
101
|
+
--md-assist-chip-label-text-color: var(--md-sys-color-on-surface);
|
|
102
|
+
|
|
103
|
+
/* ── 테두리 ──────────────────────────────────────────────────────────── */
|
|
104
|
+
--md-assist-chip-outline-width: 1px;
|
|
105
|
+
--md-assist-chip-outline-color: var(--md-sys-color-outline-variant);
|
|
106
|
+
|
|
107
|
+
/* ── 아이콘 ──────────────────────────────────────────────────────────── */
|
|
108
|
+
/* 아이콘만 강조색을 준다 — 버튼 전체를 칠하면 여러 개가 나란히 있을 때 화면이 시끄럽다. */
|
|
109
|
+
--md-assist-chip-leading-icon-color: var(--md-sys-color-primary);
|
|
110
|
+
|
|
111
|
+
/* ── 손을 올렸을 때 ──────────────────────────────────────────────────── */
|
|
112
|
+
--md-assist-chip-hover-state-layer-color: var(--md-sys-color-primary);
|
|
113
|
+
--md-assist-chip-hover-state-layer-opacity: 0.08;
|
|
114
|
+
--md-assist-chip-hover-label-text-color: var(--md-sys-color-primary);
|
|
115
|
+
--md-assist-chip-hover-leading-icon-color: var(--md-sys-color-primary);
|
|
116
|
+
|
|
117
|
+
/* ── 키보드로 왔을 때 ────────────────────────────────────────────────── */
|
|
118
|
+
/* 테두리 색이 바뀌지 않으면 키보드로 이동할 때 지금 어디인지 알 수 없다. */
|
|
119
|
+
--md-assist-chip-focus-outline-color: var(--md-sys-color-primary);
|
|
120
|
+
--md-assist-chip-focus-label-text-color: var(--md-sys-color-primary);
|
|
121
|
+
--md-assist-chip-focus-leading-icon-color: var(--md-sys-color-primary);
|
|
122
|
+
|
|
123
|
+
/* ── 누를 수 없을 때 ─────────────────────────────────────────────────── */
|
|
124
|
+
--md-assist-chip-disabled-label-text-color: var(--md-sys-color-on-surface);
|
|
125
|
+
--md-assist-chip-disabled-label-text-opacity: 0.38;
|
|
126
|
+
--md-assist-chip-disabled-outline-color: var(--md-sys-color-outline-variant);
|
|
127
|
+
--md-assist-chip-disabled-outline-opacity: 0.5;
|
|
128
|
+
|
|
49
129
|
--popup-content-background-color: var(--md-sys-color-background);
|
|
50
130
|
--popup-content-color: var(--md-sys-color-on-background);
|
|
51
131
|
--popup-content-padding: 10px 20px;
|
|
@@ -110,3 +190,16 @@ body {
|
|
|
110
190
|
--overlay-center-large-height: 80%;
|
|
111
191
|
}
|
|
112
192
|
}
|
|
193
|
+
|
|
194
|
+
/*
|
|
195
|
+
* 손가락으로 누르는 장치 — 태블릿·현장 단말. 자리를 손가락 최소치까지 넓힌다.
|
|
196
|
+
*
|
|
197
|
+
* `pointer: coarse` 는 주 입력 장치가 정밀하지 않다는 뜻이다. 마우스가 달린 데스크톱은 창을 아무리
|
|
198
|
+
* 좁혀도 여기에 걸리지 않고, 큰 태블릿은 폭이 넓어도 걸린다 — 폭으로 나눌 때와 반대다.
|
|
199
|
+
*/
|
|
200
|
+
@media (pointer: coarse) {
|
|
201
|
+
body {
|
|
202
|
+
--md-assist-chip-container-height: var(--ui-tap, 44px);
|
|
203
|
+
--md-assist-chip-icon-size: 20px;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
@@ -17,6 +17,13 @@ body {
|
|
|
17
17
|
--oops-note-icon-font: normal 18px var(--md-icon-font, 'Material Symbols Outlined');
|
|
18
18
|
--oops-note-title-font: bold 13px var(--theme-font);
|
|
19
19
|
--oops-note-title-margin: var(--margin-narrow) 0 2px 0;
|
|
20
|
-
|
|
20
|
+
/*
|
|
21
|
+
* 좁은 화면에서도 설명은 남긴다.
|
|
22
|
+
*
|
|
23
|
+
* 전에는 여기가 `normal 0px` 이었다. 글자 크기를 0 으로 만들어 설명을 지운 것이라, 460px 아래에서는
|
|
24
|
+
* 제목만 남고 무엇을 하면 되는지가 사라졌다. 홈 화면이 그 상태였다 — 「HOME DASHBOARD」한 줄만
|
|
25
|
+
* 보이고 다음에 할 일이 안 보였다. 자리가 좁으면 글자를 줄이고, 없애지 않는다.
|
|
26
|
+
*/
|
|
27
|
+
--oops-note-description-font: normal 11px var(--theme-font);
|
|
21
28
|
}
|
|
22
29
|
}
|
|
@@ -1,6 +1,55 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* 상태 의미색 — 정상·주의·정보·위험. 모든 앱이 여기서 가져다 쓴다.
|
|
3
|
+
*
|
|
4
|
+
* ── 왜 라이트·다크로 갈리나 (2026-08-30) ────────────────────────────────────
|
|
5
|
+
* 전에는 `:root` 한 벌뿐이었다. 그래서 다크 테마에서 밝은 초록·주황이 어두운 바탕에 그대로 얹혔고,
|
|
6
|
+
* 앱들이 각자 자기 값을 따로 갖게 됐다(operato-twin 이 `--twin-good`·`--twin-warn` 을 직접 들고 있었다).
|
|
7
|
+
* 두 화면을 나란히 놓으면 「정상」이 서로 다른 초록이었다.
|
|
8
|
+
*
|
|
9
|
+
* ── 값을 어떻게 잡았나 ──────────────────────────────────────────────────────
|
|
10
|
+
* 이 색들은 **글자색으로 쓰인다.** 그래서 WCAG AA(4.5:1)를 기준으로, 가장 불리한 바탕에 대고 잡았다.
|
|
11
|
+
*
|
|
12
|
+
* ```
|
|
13
|
+
* 라이트 기준 바탕 rgb(238 241 243) 앱들 중 가장 어두운 라이트 surface
|
|
14
|
+
* 다크 기준 바탕 rgb(51 52 58) 가장 밝은 다크 surface-container-highest
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* 색상(hue)과 채도는 그대로 두고 명도만 옮겼다 — 초록은 초록으로, 주황은 주황으로 남는다.
|
|
18
|
+
*
|
|
19
|
+
* ```
|
|
20
|
+
* 이전(라이트) 지금(라이트) 지금(다크)
|
|
21
|
+
* success #35a24a 2.88 #297d39 4.53 #35c46e 5.48
|
|
22
|
+
* warning #ee8d03 2.19 #9f5e02 4.54 #e0a24a 5.57
|
|
23
|
+
* info #398ace 3.25 #2b72ad 4.50 #61a2d8 4.53
|
|
24
|
+
* ```
|
|
25
|
+
*
|
|
26
|
+
* 주의(warning)는 AA 를 맞추면 갈색에 가까워진다. 주황을 살리려면 3:1(#c97703)에서 멈춰야 하는데,
|
|
27
|
+
* 그러면 글자색으로 쓸 수 없다. **읽히는 쪽을 골랐다** — 상태는 색만으로 전하지 않고 글자를 함께
|
|
28
|
+
* 보이므로, 그 글자가 읽혀야 한다.
|
|
29
|
+
*
|
|
30
|
+
* ── danger 는 여기서 값을 정하지 않는다 ─────────────────────────────────────
|
|
31
|
+
* `--md-sys-color-error` 를 그대로 쓴다. 위험은 md 역할색에 대응이 있어서 팔레트가 정하는 것이 맞다.
|
|
32
|
+
* 다만 그 값의 대비는 앱 팔레트마다 다르다(셸 라이트 #fe594e 는 2.74 로 낮다) — 팔레트 쪽에서 볼 일이다.
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
/* 테마 클래스가 붙기 전 · 붙지 않는 앱을 위한 기본값. 라이트와 같다. */
|
|
1
36
|
:root {
|
|
2
37
|
--status-danger-color: var(--md-sys-color-error, #d14946);
|
|
3
|
-
--status-warning-color: #
|
|
4
|
-
--status-info-color: #
|
|
5
|
-
--status-success-color: #
|
|
38
|
+
--status-warning-color: #9f5e02;
|
|
39
|
+
--status-info-color: #2b72ad;
|
|
40
|
+
--status-success-color: #297d39;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
.light {
|
|
44
|
+
--status-danger-color: var(--md-sys-color-error, #d14946);
|
|
45
|
+
--status-warning-color: #9f5e02;
|
|
46
|
+
--status-info-color: #2b72ad;
|
|
47
|
+
--status-success-color: #297d39;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.dark {
|
|
51
|
+
--status-danger-color: var(--md-sys-color-error, #fbafa9);
|
|
52
|
+
--status-warning-color: #e0a24a;
|
|
53
|
+
--status-info-color: #61a2d8;
|
|
54
|
+
--status-success-color: #35c46e;
|
|
6
55
|
}
|
|
@@ -28,3 +28,40 @@
|
|
|
28
28
|
.dark {
|
|
29
29
|
color-scheme: dark;
|
|
30
30
|
}
|
|
31
|
+
|
|
32
|
+
/*
|
|
33
|
+
* 앱 글꼴을 md 타이포스케일에 잇는다.
|
|
34
|
+
*
|
|
35
|
+
* [무엇이 어긋나 있었나]
|
|
36
|
+
* 셸은 `--theme-font` 를 정의하고(`app-theme.css`) 자기 파생 토큰 15개에만 썼다. md 타이포스케일이
|
|
37
|
+
* 참조하는 `--md-ref-typeface-*` 에는 아무도 값을 넣지 않았다. 그래서 md 기반 공통 위젯 — 확인
|
|
38
|
+
* 대화상자(`ox-prompt`)·버튼 라벨·토스트 — 이 앱 글꼴을 못 받고 각자의 폴백(Roboto)으로 갈렸다.
|
|
39
|
+
* 한 화면 안에서 본문과 대화상자의 글꼴이 달랐다.
|
|
40
|
+
*
|
|
41
|
+
* 부품이 스타일을 빠뜨린 것이 아니다. 부품은 토큰으로 받도록 이미 짜여 있고, 그 토큰을 정한 곳이
|
|
42
|
+
* 없었을 뿐이다. 그러므로 고칠 자리는 부품이 아니라 토큰이다.
|
|
43
|
+
*
|
|
44
|
+
* [왜 여기인가]
|
|
45
|
+
* `app-theme.css` 에 넣으면 그 파일을 override 하는 앱이 이 규칙을 통째로 잃는다(파일 단위 대체).
|
|
46
|
+
* `theme-base.css` 는 어떤 앱도 같은 이름으로 두지 않으므로 항상 번들에 들어간다.
|
|
47
|
+
*
|
|
48
|
+
* [plain 과 brand 둘 다]
|
|
49
|
+
* md 타이포스케일은 본문·라벨(plain)과 제목(brand)을 다른 토큰으로 읽는다. 하나만 걸면 같은
|
|
50
|
+
* 대화상자에서 제목과 본문의 글꼴이 갈린다(operato-twin 에서 실제로 그랬다).
|
|
51
|
+
*
|
|
52
|
+
* [body 까지 짚는 이유]
|
|
53
|
+
* 셸은 `--theme-font` 를 body 에 정한다. 상속은 가까운 조상이 이기므로 html 에만 두면 body 아래에
|
|
54
|
+
* 붙는 토스트는 여전히 셸 값을 물려받는다. `body.light`·`body.dark` 로 한 번 더 짚어, 테마 파일의
|
|
55
|
+
* 병합 순서에 기대지 않고 앱 값이 이기게 한다.
|
|
56
|
+
*
|
|
57
|
+
* `:root` 를 빼고 body 만 짚는다: `--theme-font` 는 body 에 정의되므로, html 에서는 `var()` 가
|
|
58
|
+
* 풀리지 않아 값이 비어 버린다. 대화상자·토스트를 포함해 눈에 보이는 것은 모두 body 아래에 있다.
|
|
59
|
+
*
|
|
60
|
+
* 글꼴 값 자체는 여기서 정하지 않는다 — 앱이 `--theme-font` 하나만 정하면 된다.
|
|
61
|
+
*/
|
|
62
|
+
body,
|
|
63
|
+
body.light,
|
|
64
|
+
body.dark {
|
|
65
|
+
--md-ref-typeface-plain: var(--theme-font);
|
|
66
|
+
--md-ref-typeface-brand: var(--theme-font);
|
|
67
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* 화면을 그릴 때 쓰는 토큰 — 면·글자·눈금·모서리.
|
|
3
|
+
*
|
|
4
|
+
* ── 왜 필요한가 ─────────────────────────────────────────────────────────────
|
|
5
|
+
* 지금은 페이지가 `--md-sys-color-*` 를 직접 가져다 쓴다. 그 이름은 색의 **역할**을 말할 뿐이라
|
|
6
|
+
* (surface-container 가 카드인지 배경인지 구분하지 않는다), 페이지마다 다른 것을 고른다. 그래서
|
|
7
|
+
* 같은 뜻의 자리가 앱마다·페이지마다 다른 회색이 됐다.
|
|
8
|
+
*
|
|
9
|
+
* 여기서 한 겹 위의 이름을 붙인다. 값은 전부 md 역할색에서 오므로 라이트·다크가 자동으로 따라온다.
|
|
10
|
+
* 페이지는 `--ui-panel`(카드가 놓이는 면) 처럼 **무엇인지**로 고른다.
|
|
11
|
+
*
|
|
12
|
+
* ── 글자 눈금 ───────────────────────────────────────────────────────────────
|
|
13
|
+
* 눈금을 정하지 않으면 페이지마다 0.72 / 0.78 / 0.83 / 0.88rem 같은 값이 생긴다(operato-mes 한
|
|
14
|
+
* 파일에 아홉 가지가 있었다). 크기가 아홉이면 위계가 없는 것과 같다. 다섯이면 충분하다.
|
|
15
|
+
*
|
|
16
|
+
* ── 이 파일 이름 ────────────────────────────────────────────────────────────
|
|
17
|
+
* 테마 파일은 같은 이름이면 파일 단위로 대체된다(builder 의 ThemeOverridePlugin). `ui-tokens.css`
|
|
18
|
+
* 는 앱이 같은 이름을 두지 않는 한 항상 번들에 들어간다. 앱이 값을 바꾸고 싶으면 자기 light.css /
|
|
19
|
+
* dark.css 에서 해당 토큰만 다시 정하면 된다.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
:root,
|
|
23
|
+
body {
|
|
24
|
+
/* ── 면 ──────────────────────────────────────────────────────────────── */
|
|
25
|
+
/** 페이지 바탕. */
|
|
26
|
+
--ui-bg: var(--md-sys-color-surface);
|
|
27
|
+
/** 카드·표·패널이 놓이는 면. 바탕보다 한 단계 앞이다. */
|
|
28
|
+
--ui-panel: var(--md-sys-color-surface-container-lowest);
|
|
29
|
+
/** 면의 테두리. 회색으로 채우는 대신 이 선으로 구분한다. */
|
|
30
|
+
--ui-line: var(--md-sys-color-outline-variant);
|
|
31
|
+
/** 같은 면 안에서 행을 나누는 선. 테두리보다 흐리다. */
|
|
32
|
+
--ui-line-soft: var(--md-sys-color-surface-container-high);
|
|
33
|
+
|
|
34
|
+
/* ── 글자 ────────────────────────────────────────────────────────────── */
|
|
35
|
+
/** 본문. */
|
|
36
|
+
--ui-ink: var(--md-sys-color-on-surface);
|
|
37
|
+
/** 라벨·보조 설명. */
|
|
38
|
+
--ui-muted: var(--md-sys-color-on-surface-variant);
|
|
39
|
+
/** 곁말·단위·시각처럼 있어도 그만인 글자. */
|
|
40
|
+
--ui-faint: var(--md-sys-color-outline);
|
|
41
|
+
|
|
42
|
+
/* ── 강조·상태 ───────────────────────────────────────────────────────── */
|
|
43
|
+
--ui-accent: var(--md-sys-color-primary);
|
|
44
|
+
/** 강조색을 아주 옅게 깐 면 — 마우스를 올린 행, 선택된 칩. */
|
|
45
|
+
--ui-accent-wash: color-mix(in srgb, var(--md-sys-color-primary) 8%, transparent);
|
|
46
|
+
/* 상태 의미색은 state-color.css 가 정본이다. 여기서는 짧은 이름만 잇는다. */
|
|
47
|
+
--ui-good: var(--status-success-color);
|
|
48
|
+
--ui-warn: var(--status-warning-color);
|
|
49
|
+
--ui-crit: var(--status-danger-color);
|
|
50
|
+
|
|
51
|
+
/* ── 글꼴 ────────────────────────────────────────────────────────────── */
|
|
52
|
+
/* 숫자·식별자·시각에 쓴다. 자릿수가 흔들리지 않아 값으로 읽힌다. */
|
|
53
|
+
--ui-mono: ui-monospace, 'SF Mono', 'JetBrains Mono', Menlo, Consolas, monospace;
|
|
54
|
+
|
|
55
|
+
/* ── 글자 크기 다섯 ──────────────────────────────────────────────────── */
|
|
56
|
+
/** 화면에서 가장 큰 수 하나(지표 값). */
|
|
57
|
+
--ui-t-hero: 26px;
|
|
58
|
+
/** 구역 제목. */
|
|
59
|
+
--ui-t-title: 15px;
|
|
60
|
+
/** 본문·표의 칸. */
|
|
61
|
+
--ui-t-body: 13px;
|
|
62
|
+
/** 보조 설명·범례. */
|
|
63
|
+
--ui-t-small: 11.5px;
|
|
64
|
+
/**
|
|
65
|
+
* 라벨.
|
|
66
|
+
*
|
|
67
|
+
* 처음에는 10px 로 두고 「대문자 라벨 전용」이라고 적었다. 그것은 라틴 문자의 관습이다 —
|
|
68
|
+
* 작은 대문자는 소문자와 모양이 달라서 작아도 라벨로 읽힌다.
|
|
69
|
+
*
|
|
70
|
+
* **한국어에는 대소문자가 없다.** `text-transform: uppercase` 가 아무 일도 하지 않고, 남는 것은
|
|
71
|
+
* 10px 짜리 작은 글씨뿐이다. 이 제품의 화면은 한국어가 먼저이므로 11px 로 둔다.
|
|
72
|
+
* (`work-shift` 화면에서 절 제목이 안 읽힌다고 MES 레인이 알려 왔다.)
|
|
73
|
+
*
|
|
74
|
+
* 대문자 변환은 그대로 둔다 — 한국어에 해가 없고 라틴 라벨에는 도움이 된다.
|
|
75
|
+
*/
|
|
76
|
+
--ui-t-micro: 11px;
|
|
77
|
+
|
|
78
|
+
/*
|
|
79
|
+
* 화면에서 가장 큰 수 — 서서 보는 작업대용. `--ui-t-hero` 는 앉아서 보는 관리 화면 기준이라
|
|
80
|
+
* 현장에서는 작다. 두 값을 나눠 두어야 같은 컴포넌트를 두 곳에서 쓸 수 있다.
|
|
81
|
+
*/
|
|
82
|
+
--ui-t-display: 40px;
|
|
83
|
+
|
|
84
|
+
/* ── 손으로 누르는 자리 ──────────────────────────────────────────────── */
|
|
85
|
+
/*
|
|
86
|
+
* 현장 화면은 마우스가 아니라 손가락이 누른다. 크기를 화면마다 정하면 어떤 화면은 44px 이고
|
|
87
|
+
* 어떤 화면은 96px 이 된다 — 같은 사람이 같은 장갑으로 누르는데.
|
|
88
|
+
*
|
|
89
|
+
* 세 단계면 충분하다. 값의 근거는 각각 다르다.
|
|
90
|
+
*/
|
|
91
|
+
/** 손가락 최소 — WCAG 2.2 Target Size(AAA)가 정한 44px. 마우스 화면에도 이 아래로 두지 않는다. */
|
|
92
|
+
--ui-tap: 44px;
|
|
93
|
+
/** 장갑 낀 손. 목장갑을 끼면 접촉 면적이 넓어져 44px 에서는 옆 버튼이 함께 눌린다. */
|
|
94
|
+
--ui-tap-glove: 64px;
|
|
95
|
+
/** 서서 보는 작업대. 팔을 뻗어 누르므로 조준이 거칠다. */
|
|
96
|
+
--ui-tap-station: 96px;
|
|
97
|
+
|
|
98
|
+
/* ── 모서리 ──────────────────────────────────────────────────────────── */
|
|
99
|
+
/** 카드·표. */
|
|
100
|
+
--ui-r: 10px;
|
|
101
|
+
/** 버튼·칩처럼 작은 것. */
|
|
102
|
+
--ui-r-small: 6px;
|
|
103
|
+
|
|
104
|
+
/* ── 읽기 폭 ─────────────────────────────────────────────────────────── */
|
|
105
|
+
/*
|
|
106
|
+
* 넓은 화면에서 한 줄이 너무 길어지면 눈이 다음 줄의 첫머리를 놓친다. 좁은 화면에서는 폭을 다
|
|
107
|
+
* 써야 하므로 min() 으로 잡는다. 값이 px 인 이유: 한글은 전각이라 ch(숫자 0 의 폭)로 재면 실제
|
|
108
|
+
* 글자 수와 두 배 가까이 어긋난다.
|
|
109
|
+
*/
|
|
110
|
+
--ui-measure: min(1080px, 100%);
|
|
111
|
+
}
|