@ihabdevteam/core 0.42.0 → 0.44.0
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/dist/components.cjs.js +178 -178
- package/dist/components.esm.css +5 -5
- package/dist/hooks.cjs.js +1 -1
- package/dist/ihabdevteam-core.cjs.js +184 -184
- package/dist/ihabdevteam-core.d.ts +1 -1
- package/dist/packages/core/src/components/Calendar.js +2 -1
- package/dist/packages/core/src/components/Dropdown.css +0 -11
- package/dist/packages/core/src/components/FilterPanel.css +0 -5
- package/dist/packages/core/src/components/Footer.css +0 -6
- package/dist/packages/core/src/components/Header.css +0 -17
- package/dist/packages/core/src/components/LandingBottomSticky.js +2 -1
- package/dist/packages/core/src/components/Loader.css +0 -32
- package/dist/packages/core/src/components/Panel.css +2 -16
- package/dist/packages/core/src/components/PaymentPlan.css +0 -61
- package/dist/packages/core/src/components/Popup/DeviceListPopup.css +0 -55
- package/dist/packages/core/src/components/Popup/LoadTablePopup.js +2 -1
- package/dist/packages/core/src/components/Popup/Popup.css +0 -6
- package/dist/packages/core/src/components/Popup/SaveTablePopup.css +0 -9
- package/dist/packages/core/src/components/Popup/TrainingResultPopup.css +0 -34
- package/dist/packages/core/src/components/SoundCompass.css +0 -8
- package/dist/packages/core/src/components/Table.css +0 -21
- package/dist/packages/core/src/components/Toolbar.css +0 -8
- package/dist/packages/core/src/components/Tooltip/MenuTooltip.css +0 -19
- package/dist/packages/core/src/components/Tooltip/Tooltip.css +0 -17
- package/dist/packages/core/src/components/Training/CategoryIcon.css +0 -22
- package/dist/packages/core/src/components/Training/TrainingBlock.css +0 -7
- package/dist/packages/core/src/components/Training/TrainingCard.css +0 -42
- package/dist/packages/core/src/components/Training/TrainingStep.css +0 -118
- package/dist/packages/core/src/components/Training/TrainingStepTitle.css +0 -6
- package/dist/packages/core/src/utils/pressable.d.ts +23 -0
- package/dist/packages/core/src/utils/pressable.js +32 -0
- package/dist/packages/core/src/version.d.ts +1 -1
- package/dist/packages/core/src/version.js +1 -1
- package/dist/utils.cjs.js +1 -1
- package/package.json +1 -1
|
@@ -1295,7 +1295,7 @@ export declare function copyText(text: string): Promise<boolean>;
|
|
|
1295
1295
|
*
|
|
1296
1296
|
* 값은 손으로 적고 `test/coreVersion.test.ts` 가 package.json 과 어긋나면 운다.
|
|
1297
1297
|
*/
|
|
1298
|
-
export declare const CORE_VERSION = "0.
|
|
1298
|
+
export declare const CORE_VERSION = "0.44.0";
|
|
1299
1299
|
|
|
1300
1300
|
/** @public */
|
|
1301
1301
|
declare const coreDefault: Record<string, unknown>;
|
|
@@ -5,6 +5,7 @@ import { useTranslation } from 'react-i18next';
|
|
|
5
5
|
import Icon from './Icon';
|
|
6
6
|
import { formatTimeHM } from '../utils/format';
|
|
7
7
|
import './Calendar.css';
|
|
8
|
+
import { pressable } from '../utils/pressable';
|
|
8
9
|
function daysInMonth(year, month) { return new Date(year, month + 1, 0).getDate(); }
|
|
9
10
|
function firstDayOfMonth(year, month) { return new Date(year, month, 1).getDay(); }
|
|
10
11
|
/** @public */
|
|
@@ -81,7 +82,7 @@ export default function Calendar({ visits = [], onVisitClick, onVisitMove, onDay
|
|
|
81
82
|
} : undefined, onDragEnd: onVisitMove ? () => {
|
|
82
83
|
dragVisitId.current = null;
|
|
83
84
|
setDragOverDate(null);
|
|
84
|
-
} : undefined, onClick: onVisitClick ? (e) => { e.stopPropagation(); onVisitClick(v); } : undefined, "aria-label": [
|
|
85
|
+
} : undefined, onClick: onVisitClick ? (e) => { e.stopPropagation(); onVisitClick(v); } : undefined, ...pressable(onVisitClick ? () => onVisitClick(v) : undefined), "aria-label": [
|
|
85
86
|
v.time ? formatTimeHM(v.time, t) : null,
|
|
86
87
|
v.customer,
|
|
87
88
|
t(v.status === 'noVisit' ? 'calendar.legend.noVisit'
|
|
@@ -109,11 +109,6 @@
|
|
|
109
109
|
overscroll-behavior-y: contain;
|
|
110
110
|
}
|
|
111
111
|
|
|
112
|
-
.dropdown__menu--up {
|
|
113
|
-
top: auto;
|
|
114
|
-
bottom: calc(100% + 6px);
|
|
115
|
-
}
|
|
116
|
-
|
|
117
112
|
@keyframes dropdown-appear {
|
|
118
113
|
from { opacity: 0; transform: translateY(-6px); }
|
|
119
114
|
to { opacity: 1; transform: translateY(0); }
|
|
@@ -167,9 +162,3 @@
|
|
|
167
162
|
width: 14px;
|
|
168
163
|
height: 14px;
|
|
169
164
|
}
|
|
170
|
-
|
|
171
|
-
.dropdown__divider {
|
|
172
|
-
height: 1px;
|
|
173
|
-
background: var(--color-darkWhite);
|
|
174
|
-
margin: 4px 0;
|
|
175
|
-
}
|
|
@@ -78,10 +78,6 @@
|
|
|
78
78
|
margin: 0;
|
|
79
79
|
}
|
|
80
80
|
|
|
81
|
-
.filter-panel__section-multiple {
|
|
82
|
-
color: var(--color-lightGray);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
81
|
.filter-panel__sections {
|
|
86
82
|
display: flex;
|
|
87
83
|
flex-direction: column;
|
|
@@ -135,7 +131,6 @@
|
|
|
135
131
|
flex-basis: 100%;
|
|
136
132
|
}
|
|
137
133
|
|
|
138
|
-
|
|
139
134
|
.filter-panel__items {
|
|
140
135
|
display: flex;
|
|
141
136
|
flex-wrap: wrap;
|
|
@@ -17,7 +17,6 @@
|
|
|
17
17
|
isolation: isolate;
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
|
|
21
20
|
.header__menu-button {
|
|
22
21
|
display: none;
|
|
23
22
|
background: transparent;
|
|
@@ -112,22 +111,6 @@
|
|
|
112
111
|
color: rgba(255,255,255,0.55);
|
|
113
112
|
}
|
|
114
113
|
|
|
115
|
-
/* 전환 버튼 */
|
|
116
|
-
.header--manager .side-nav__mode-switch {
|
|
117
|
-
border-color: rgba(255,255,255,0.2);
|
|
118
|
-
background: transparent;
|
|
119
|
-
}
|
|
120
|
-
.header--manager .side-nav__mode-switch:hover {
|
|
121
|
-
background: rgba(255,255,255,0.12);
|
|
122
|
-
border-color: rgba(255,255,255,0.35);
|
|
123
|
-
}
|
|
124
|
-
.header--manager .side-nav__mode-switch-label {
|
|
125
|
-
color: rgba(255,255,255,0.7);
|
|
126
|
-
}
|
|
127
|
-
.header--manager .side-nav__mode-switch-arrow {
|
|
128
|
-
color: rgba(255,255,255,0.35);
|
|
129
|
-
}
|
|
130
|
-
|
|
131
114
|
/* Desktop: width 220px */
|
|
132
115
|
@media (min-width: 1024px) {
|
|
133
116
|
.header {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import './LandingBottomSticky.css';
|
|
3
|
+
import { pressable } from '../utils/pressable';
|
|
3
4
|
/**
|
|
4
5
|
* 화면 하단에 떠 있는 고정 CTA 바 — 셸(고정 카드 + 좌우 배치 + hover)만 담당한다.
|
|
5
6
|
*
|
|
@@ -16,5 +17,5 @@ export default function LandingBottomSticky({ children, action, onClick, classNa
|
|
|
16
17
|
const innerClass = onClick
|
|
17
18
|
? 'bottom-sticky__inner bottom-sticky__inner--clickable'
|
|
18
19
|
: 'bottom-sticky__inner';
|
|
19
|
-
return (_jsx("div", { className: className ? `bottom-sticky ${className}` : 'bottom-sticky', children: _jsxs("div", { className: innerClass, onClick: onClick, children: [_jsx("div", { className: "bottom-sticky__content", children: children }), action] }) }));
|
|
20
|
+
return (_jsx("div", { className: className ? `bottom-sticky ${className}` : 'bottom-sticky', children: _jsxs("div", { className: innerClass, onClick: onClick, ...pressable(onClick), children: [_jsx("div", { className: "bottom-sticky__content", children: children }), action] }) }));
|
|
20
21
|
}
|
|
@@ -39,24 +39,6 @@
|
|
|
39
39
|
width: 0%;
|
|
40
40
|
transition: width 220ms cubic-bezier(.2,.8,.2,1);
|
|
41
41
|
}
|
|
42
|
-
.core-loader-spinner {
|
|
43
|
-
display: inline-flex;
|
|
44
|
-
align-items: center;
|
|
45
|
-
justify-content: center;
|
|
46
|
-
}
|
|
47
|
-
.core-loader-spinner__svg {
|
|
48
|
-
transform-origin: center;
|
|
49
|
-
animation: core-loader-rotate 1s linear infinite;
|
|
50
|
-
}
|
|
51
|
-
.core-loader-spinner__bg {
|
|
52
|
-
stroke: rgba(0,0,0,0.08);
|
|
53
|
-
}
|
|
54
|
-
.core-loader-spinner__fg {
|
|
55
|
-
stroke: var(--color-main);
|
|
56
|
-
stroke-dasharray: 125;
|
|
57
|
-
stroke-dashoffset: 80;
|
|
58
|
-
animation: core-loader-dash 1.2s ease-in-out infinite;
|
|
59
|
-
}
|
|
60
42
|
|
|
61
43
|
@keyframes core-loader-rotate {
|
|
62
44
|
100% { transform: rotate(360deg); }
|
|
@@ -67,20 +49,6 @@
|
|
|
67
49
|
100% { stroke-dashoffset: 125; }
|
|
68
50
|
}
|
|
69
51
|
|
|
70
|
-
.core-loader-bar {
|
|
71
|
-
width: 100%;
|
|
72
|
-
height: 8px;
|
|
73
|
-
background: rgba(0,0,0,0.06);
|
|
74
|
-
border-radius: 999px;
|
|
75
|
-
overflow: hidden;
|
|
76
|
-
}
|
|
77
|
-
.core-loader-bar__inner {
|
|
78
|
-
height: 100%;
|
|
79
|
-
background: var(--color-main);
|
|
80
|
-
width: 0%;
|
|
81
|
-
transition: width 220ms cubic-bezier(.2,.8,.2,1);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
52
|
.page-loading-center {
|
|
85
53
|
display: flex;
|
|
86
54
|
justify-content: center;
|
|
@@ -164,21 +164,8 @@
|
|
|
164
164
|
padding: 16px;
|
|
165
165
|
min-height: 0;
|
|
166
166
|
}
|
|
167
|
-
|
|
168
|
-
.panel-row--
|
|
169
|
-
display: flex;
|
|
170
|
-
flex-direction: column;
|
|
171
|
-
padding: 16px 16px 20px;
|
|
172
|
-
min-height: 0;
|
|
173
|
-
flex: 1;
|
|
174
|
-
overflow-y: auto;
|
|
175
|
-
overscroll-behavior-y: contain;
|
|
176
|
-
}
|
|
177
|
-
/* 베리언트 row는 기본 구분선 규칙 비적용 */
|
|
178
|
-
.panel-row--content + .panel-row--content,
|
|
179
|
-
.panel-row--scroll + .panel-row--scroll,
|
|
180
|
-
.panel-row--content + .panel-row--scroll,
|
|
181
|
-
.panel-row--scroll + .panel-row--content {
|
|
167
|
+
|
|
168
|
+
.panel-row--content + .panel-row--content{
|
|
182
169
|
border-top: none;
|
|
183
170
|
}
|
|
184
171
|
|
|
@@ -368,7 +355,6 @@
|
|
|
368
355
|
.panel-row__device-kind { display: flex; flex-direction: column; align-items: flex-start; gap: 3px; }
|
|
369
356
|
.panel-row__device-name { color: var(--color-darkGray); }
|
|
370
357
|
.panel-row__device-detail { color: var(--color-gray); }
|
|
371
|
-
.panel-row__device-product { color: var(--color-darkGray); }
|
|
372
358
|
.panel-row__device-date { color: var(--color-lightGray); margin-top: 2px; }
|
|
373
359
|
.panel-row__device-empty { flex: 1; display: flex; align-items: center; justify-content: center; text-align: center; color: var(--color-lightGray); }
|
|
374
360
|
|
|
@@ -79,15 +79,6 @@
|
|
|
79
79
|
display: block;
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
-
.payment-plan__box-list {
|
|
83
|
-
padding-left: 18px;
|
|
84
|
-
color: var(--color-lightGray);
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
.payment-plan__box-list li {
|
|
88
|
-
margin-bottom: 4px;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
82
|
.payment-plan__contact-button {
|
|
92
83
|
width: 100%;
|
|
93
84
|
}
|
|
@@ -169,14 +160,6 @@
|
|
|
169
160
|
color: var(--plan-color, var(--color-main));
|
|
170
161
|
}
|
|
171
162
|
|
|
172
|
-
.payment-plan__pricing-row--highlight .payment-plan__pricing-original {
|
|
173
|
-
color: var(--color-lightGray);
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
.payment-plan__pricing-row--highlight .payment-plan__pricing-badge {
|
|
177
|
-
color: var(--plan-color, var(--color-main));
|
|
178
|
-
}
|
|
179
|
-
|
|
180
163
|
.payment-plan__pricing-row:hover {
|
|
181
164
|
filter: brightness(1.04);
|
|
182
165
|
transform: translateY(-2px);
|
|
@@ -199,15 +182,6 @@
|
|
|
199
182
|
text-overflow: ellipsis;
|
|
200
183
|
}
|
|
201
184
|
|
|
202
|
-
.payment-plan__pricing-badge {
|
|
203
|
-
grid-column: 2;
|
|
204
|
-
grid-row: 1;
|
|
205
|
-
text-align: right;
|
|
206
|
-
white-space: nowrap;
|
|
207
|
-
margin: 0;
|
|
208
|
-
color: rgba(255, 255, 255, 0.9);
|
|
209
|
-
}
|
|
210
|
-
|
|
211
185
|
.payment-plan__pricing-row-price {
|
|
212
186
|
grid-column: 1 / -1;
|
|
213
187
|
grid-row: 2;
|
|
@@ -220,13 +194,6 @@
|
|
|
220
194
|
margin: 0;
|
|
221
195
|
}
|
|
222
196
|
|
|
223
|
-
.payment-plan__pricing-original {
|
|
224
|
-
color: var(--color-white-a80);
|
|
225
|
-
text-decoration: line-through;
|
|
226
|
-
white-space: nowrap;
|
|
227
|
-
margin: 0;
|
|
228
|
-
}
|
|
229
|
-
|
|
230
197
|
.payment-plan__pricing-current {
|
|
231
198
|
color: #ffffff;
|
|
232
199
|
white-space: nowrap;
|
|
@@ -263,44 +230,16 @@
|
|
|
263
230
|
align-self: stretch;
|
|
264
231
|
}
|
|
265
232
|
|
|
266
|
-
/* Allow inner flex items to shrink (prevents children from forcing taller heights) */
|
|
267
|
-
.payment-plan__card-inner,
|
|
268
|
-
.payment-plan__card-content {
|
|
269
|
-
min-height: 0;
|
|
270
|
-
}
|
|
271
|
-
|
|
272
233
|
/* Legacy card variant (recommended badge style) */
|
|
273
234
|
.payment-plan__card.recommended {
|
|
274
235
|
border-color: var(--color-main);
|
|
275
236
|
box-shadow: var(--shadow-dropdown);
|
|
276
237
|
}
|
|
277
|
-
|
|
278
|
-
.payment-plan__recommended-badge {
|
|
279
|
-
position: absolute; top: -12px; left: 50%; transform: translateX(-50%);
|
|
280
|
-
padding: 4px 14px; border-radius: var(--radius-m);
|
|
281
|
-
background: var(--color-main); color: #ffffff;
|
|
282
|
-
font-weight: 700; white-space: nowrap;
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
.payment-plan__name { font-weight: 800; margin: 0 0 8px; }
|
|
286
|
-
.payment-plan__price { font-weight: 800; margin: 0 0 4px; }
|
|
287
|
-
.payment-plan__period { color: var(--color-gray); display: inline; }
|
|
288
|
-
.payment-plan__features { list-style: none; padding: 0; margin: 20px 0; display: flex; flex-direction: column; gap: var(--spacing-xs); }
|
|
289
238
|
.payment-plan__feature {
|
|
290
239
|
display: flex; align-items: center; gap: var(--spacing-xs);
|
|
291
240
|
color: var(--color-darkGray);
|
|
292
241
|
}
|
|
293
242
|
.payment-plan__feature::before { content: '✓'; font-weight: 700; color: var(--color-success); }
|
|
294
|
-
.payment-plan__button {
|
|
295
|
-
width: 100%; padding: 14px;
|
|
296
|
-
border-radius: var(--radius-card); border: none; cursor: pointer;
|
|
297
|
-
font-weight: 700;
|
|
298
|
-
transition: all 0.12s;
|
|
299
|
-
}
|
|
300
|
-
.payment-plan__button--primary { background: var(--color-main); color: #ffffff; }
|
|
301
|
-
.payment-plan__button--primary:hover { background: var(--color-infoLink); }
|
|
302
|
-
.payment-plan__button--outline { background: var(--color-deepWhite); color: var(--color-darkGray); border: 1px solid var(--color-whiteLine); }
|
|
303
|
-
.payment-plan__button--outline:hover { border-color: var(--color-main); color: var(--color-main); }
|
|
304
243
|
|
|
305
244
|
@media (max-width: 767px) {
|
|
306
245
|
.payment-plan__list {
|
|
@@ -1,29 +1,5 @@
|
|
|
1
1
|
.dlp-popup .popup-panel { max-width: 600px; }
|
|
2
2
|
|
|
3
|
-
.dlp-empty {
|
|
4
|
-
padding: 32px 20px;
|
|
5
|
-
text-align: center;
|
|
6
|
-
color: var(--color-gray);
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
.dlp-table {
|
|
10
|
-
width: 100%;
|
|
11
|
-
border-collapse: collapse;
|
|
12
|
-
font-size: 13px;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
.dlp-table thead tr {
|
|
16
|
-
border-bottom: 1px solid var(--color-darkWhite);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
.dlp-table th {
|
|
20
|
-
padding: 8px 12px;
|
|
21
|
-
text-align: left;
|
|
22
|
-
color: var(--color-lightGray);
|
|
23
|
-
font-weight: 500;
|
|
24
|
-
white-space: nowrap;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
3
|
.dlp-row {
|
|
28
4
|
cursor: pointer;
|
|
29
5
|
border-bottom: 1px solid var(--color-darkWhite);
|
|
@@ -33,46 +9,15 @@
|
|
|
33
9
|
.dlp-row:hover { background: var(--color-hoverBg, #f5f5f5); }
|
|
34
10
|
.dlp-row:last-child { border-bottom: none; }
|
|
35
11
|
|
|
36
|
-
.dlp-table td {
|
|
37
|
-
padding: 10px 12px;
|
|
38
|
-
vertical-align: middle;
|
|
39
|
-
color: var(--color-darkGray);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
|
|
43
12
|
.dlp-date {
|
|
44
13
|
white-space: nowrap;
|
|
45
14
|
color: var(--color-lightGray);
|
|
46
15
|
}
|
|
47
16
|
|
|
48
|
-
.dlp-delete {
|
|
49
|
-
background: none;
|
|
50
|
-
border: none;
|
|
51
|
-
cursor: pointer;
|
|
52
|
-
color: var(--color-lightGray);
|
|
53
|
-
font-size: 12px;
|
|
54
|
-
padding: 4px 8px;
|
|
55
|
-
border-radius: 4px;
|
|
56
|
-
transition: color 0.1s, background 0.1s;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
.dlp-delete:hover {
|
|
60
|
-
color: var(--color-error, #e53935);
|
|
61
|
-
background: var(--color-errorBg, #fdecea);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
17
|
/* 팝업 밖(고객 상세의 기기 탭)에서도 쓰는 표 — 좌/우 고르개가 표 위에 얹힌다. */
|
|
65
18
|
.dlp-side-table { margin-top: 0; }
|
|
66
|
-
.dlp-side-pick {
|
|
67
|
-
display: flex;
|
|
68
|
-
justify-content: flex-start;
|
|
69
|
-
margin-bottom: 8px;
|
|
70
|
-
}
|
|
71
19
|
|
|
72
20
|
/* 줄 오른쪽의 착용·제거 — 붙어 보이지 않게만 벌린다 */
|
|
73
21
|
.dlp-worn-check { display: inline-flex; align-items: center; }
|
|
74
22
|
/* 줄 끝의 삭제 — 삭제를 넘겨준 화면(기기 이력 팝업)에서만 선다 */
|
|
75
23
|
.dlp-row-actions { display: flex; align-items: center; justify-content: flex-end; }
|
|
76
|
-
|
|
77
|
-
/* 맨 왼쪽 '착용중' 열 — 값이 있는 줄만 눈에 띄게 */
|
|
78
|
-
.dlp-worn-side { font-weight: 600; color: var(--color-main, #3b82f6); }
|
|
@@ -8,6 +8,7 @@ import Dropdown from '../Dropdown';
|
|
|
8
8
|
import { getSavedTables, deleteTable as localDeleteTable } from '../../utils/savedWordTables';
|
|
9
9
|
import { formatYmd } from '../../utils/date';
|
|
10
10
|
import './LoadTablePopup.css';
|
|
11
|
+
import { pressable } from '../../utils/pressable';
|
|
11
12
|
function formatDate(iso) { return formatYmd(iso, { sep: '. ', pad: false, trailingDot: true }); }
|
|
12
13
|
// value 는 정렬·보기 키(로직용)라 그대로 두고, 화면에 보이는 label 만 번역한다.
|
|
13
14
|
// 예전엔 label 도 여기 박아 둬서 영어 로케일에서 이 드롭다운만 한국어로 남았다.
|
|
@@ -80,7 +81,7 @@ export default function LoadTablePopup({ onLoad, onCancel, tables: tablesProp, o
|
|
|
80
81
|
animateThen(() => onLoad(table));
|
|
81
82
|
}, [tables, selected, onLoad]);
|
|
82
83
|
const headerActions = useMemo(() => tables.length > 0 ? (_jsxs(_Fragment, { children: [_jsx(Dropdown, { options: VIEW_OPTIONS, value: viewMode, onChange: handleSetViewMode }), _jsx(Dropdown, { options: SORT_OPTIONS, value: sortKey, onChange: handleSetSortKey })] })) : undefined, [tables.length, viewMode, sortKey, handleSetViewMode, handleSetSortKey, VIEW_OPTIONS, SORT_OPTIONS]);
|
|
83
|
-
return (_jsx(Popup, { className: "popup--load-table", title: t('wordTable.loadTable.title', '저장된 단어 표 불러오기'), headerActions: headerActions, onClose: onCancel, footer: ({ animateThen, closeWithAnimation }) => (_jsxs("div", { className: "load-table-popup__footer-actions", children: [_jsx(Button, { size: 48, type: "bar", label: t('common.cancel', '취소'), onClick: closeWithAnimation, width: "fit-content" }), _jsx(Button, { size: 48, type: "bar", variant: "main", label: t('wordTable.loadTable.loadButton', '불러오기'), width: "fit-content", disabled: !selected, onClick: () => handleLoadSelected(animateThen) })] })), children: _jsx("div", { className: "load-table-popup__body", children: tables.length === 0 ? (_jsx("p", { className: "load-table-popup__empty body-2", children: t('wordTable.loadTable.empty', '저장된 단어 표가 없습니다.') })) : (_jsxs(_Fragment, { children: [viewMode === 'grid' && (_jsx("ul", { className: "load-table-popup__grid", children: sorted.map(table => (_jsxs("li", { className: `load-table-popup__card${selected === table.id ? ' load-table-popup__card--selected' : ''}`, onClick: () => setSelected(table.id), children: [_jsx(DeleteButton, { onClick: e => handleDelete(table.id, e), ariaLabel: t('wordTable.loadTable.deleteAriaLabel', '삭제') }), _jsx(TableThumbnail, { table: table }), _jsxs("div", { className: "load-table-popup__card-info", children: [_jsx("span", { className: "load-table-popup__card-name body-2", children: table.name }), _jsxs("span", { className: "load-table-popup__card-meta caption-1", children: [formatDate(table.savedAt), " \u00B7 ", table.items.length, "\uAC1C"] })] })] }, table.id))) })), viewMode === 'list' && (_jsx("ul", { className: "load-table-popup__list", children: sorted.map(table => (_jsxs("li", { className: `load-table-popup__row${selected === table.id ? ' load-table-popup__row--selected' : ''}`, onClick: () => setSelected(table.id), children: [_jsx("span", { className: "load-table-popup__row-check", children: selected === table.id && (_jsx("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", children: _jsx("polyline", { points: "4 13 9 18 20 6", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round" }) })) }), _jsxs("div", { className: "load-table-popup__row-main", children: [_jsx("span", { className: "load-table-popup__row-name body-2", children: table.name }), _jsx("div", { className: "load-table-popup__row-words", children: table.items.map((item, i) => (_jsx("span", { className: "load-table-popup__row-word caption-1", children: item.words.length >= 2
|
|
84
|
+
return (_jsx(Popup, { className: "popup--load-table", title: t('wordTable.loadTable.title', '저장된 단어 표 불러오기'), headerActions: headerActions, onClose: onCancel, footer: ({ animateThen, closeWithAnimation }) => (_jsxs("div", { className: "load-table-popup__footer-actions", children: [_jsx(Button, { size: 48, type: "bar", label: t('common.cancel', '취소'), onClick: closeWithAnimation, width: "fit-content" }), _jsx(Button, { size: 48, type: "bar", variant: "main", label: t('wordTable.loadTable.loadButton', '불러오기'), width: "fit-content", disabled: !selected, onClick: () => handleLoadSelected(animateThen) })] })), children: _jsx("div", { className: "load-table-popup__body", children: tables.length === 0 ? (_jsx("p", { className: "load-table-popup__empty body-2", children: t('wordTable.loadTable.empty', '저장된 단어 표가 없습니다.') })) : (_jsxs(_Fragment, { children: [viewMode === 'grid' && (_jsx("ul", { className: "load-table-popup__grid", children: sorted.map(table => (_jsxs("li", { className: `load-table-popup__card${selected === table.id ? ' load-table-popup__card--selected' : ''}`, onClick: () => setSelected(table.id), ...pressable(() => setSelected(table.id)), children: [_jsx(DeleteButton, { onClick: e => handleDelete(table.id, e), ariaLabel: t('wordTable.loadTable.deleteAriaLabel', '삭제') }), _jsx(TableThumbnail, { table: table }), _jsxs("div", { className: "load-table-popup__card-info", children: [_jsx("span", { className: "load-table-popup__card-name body-2", children: table.name }), _jsxs("span", { className: "load-table-popup__card-meta caption-1", children: [formatDate(table.savedAt), " \u00B7 ", table.items.length, "\uAC1C"] })] })] }, table.id))) })), viewMode === 'list' && (_jsx("ul", { className: "load-table-popup__list", children: sorted.map(table => (_jsxs("li", { className: `load-table-popup__row${selected === table.id ? ' load-table-popup__row--selected' : ''}`, onClick: () => setSelected(table.id), ...pressable(() => setSelected(table.id)), children: [_jsx("span", { className: "load-table-popup__row-check", children: selected === table.id && (_jsx("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", children: _jsx("polyline", { points: "4 13 9 18 20 6", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round" }) })) }), _jsxs("div", { className: "load-table-popup__row-main", children: [_jsx("span", { className: "load-table-popup__row-name body-2", children: table.name }), _jsx("div", { className: "load-table-popup__row-words", children: table.items.map((item, i) => (_jsx("span", { className: "load-table-popup__row-word caption-1", children: item.words.length >= 2
|
|
84
85
|
? `${item.words[0].label} · ${item.words[1].label}`
|
|
85
86
|
: item.words[0]?.label ?? item.id }, i))) })] }), _jsxs("span", { className: "load-table-popup__row-count caption-1", children: [table.items.length, "\uAC1C"] }), _jsx("span", { className: "load-table-popup__row-date caption-1", children: formatDate(table.savedAt) }), _jsx(DeleteButton, { onClick: e => handleDelete(table.id, e), ariaLabel: t('wordTable.loadTable.deleteAriaLabel', '삭제') })] }, table.id))) }))] })) }) }));
|
|
86
87
|
}
|
|
@@ -8,15 +8,6 @@
|
|
|
8
8
|
padding: 4px 20px;
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
.save-table-popup__duplicate {
|
|
12
|
-
margin: 0;
|
|
13
|
-
color: var(--color-main);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
.save-table-popup__duplicate strong {
|
|
17
|
-
font-weight: 600;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
11
|
/* ── 미리보기 ── */
|
|
21
12
|
.save-table-popup__preview-wrap {
|
|
22
13
|
position: relative;
|
|
@@ -87,30 +87,6 @@
|
|
|
87
87
|
background-clip: text;
|
|
88
88
|
color: transparent;
|
|
89
89
|
}
|
|
90
|
-
/* ── Accuracy bar ── */
|
|
91
|
-
.trp-accuracy {
|
|
92
|
-
margin: 28px auto 0;
|
|
93
|
-
max-width: 620px;
|
|
94
|
-
display: flex;
|
|
95
|
-
gap: 6px;
|
|
96
|
-
align-items: center;
|
|
97
|
-
justify-content: center;
|
|
98
|
-
}
|
|
99
|
-
.trp-accuracy__seg {
|
|
100
|
-
flex: 1;
|
|
101
|
-
height: 6px;
|
|
102
|
-
border-radius: 999px;
|
|
103
|
-
background: var(--color-darkWhite, var(--color-darkWhite));
|
|
104
|
-
}
|
|
105
|
-
.trp-accuracy__seg.is-on {
|
|
106
|
-
background: linear-gradient(90deg, var(--color-main), var(--color-sub));
|
|
107
|
-
}
|
|
108
|
-
.trp-accuracy__label {
|
|
109
|
-
color: var(--color-gray);
|
|
110
|
-
margin-left: var(--spacing-xs);
|
|
111
|
-
white-space: nowrap;
|
|
112
|
-
font-variant-numeric: tabular-nums;
|
|
113
|
-
}
|
|
114
90
|
|
|
115
91
|
/* ── Table ── */
|
|
116
92
|
/* 결과 표는 좌우 72px 들여쓰기를 걷어내 넓게 쓴다 —
|
|
@@ -190,7 +166,6 @@
|
|
|
190
166
|
.trp-row__answer-value.is-correct { color: var(--color-main); }
|
|
191
167
|
.trp-row__answer-value.is-wrong { color: var(--color-error); }
|
|
192
168
|
|
|
193
|
-
|
|
194
169
|
/* ── Footer ── (Popup의 .popup-footer 래퍼에 붙는다 — 스크롤과 무관하게 하단 고정) */
|
|
195
170
|
.popup-footer.trp-result__foot {
|
|
196
171
|
padding: var(--spacing-l);
|
|
@@ -201,14 +176,6 @@
|
|
|
201
176
|
flex-shrink: 0;
|
|
202
177
|
background: var(--color-white);
|
|
203
178
|
}
|
|
204
|
-
.trp-foot__note {
|
|
205
|
-
display: flex;
|
|
206
|
-
align-items: center;
|
|
207
|
-
gap: var(--spacing-xs);
|
|
208
|
-
color: var(--color-gray);
|
|
209
|
-
font-size: 13px;
|
|
210
|
-
}
|
|
211
|
-
.trp-foot__note svg { color: var(--color-main); flex-shrink: 0; }
|
|
212
179
|
.trp-actions { display: flex; gap: var(--spacing-s); }
|
|
213
180
|
|
|
214
181
|
/* ── Animations ── */
|
|
@@ -246,7 +213,6 @@
|
|
|
246
213
|
.trp-score__big { font-size: 72px; letter-spacing: -3px; }
|
|
247
214
|
.trp-score__sep, .trp-score__total { font-size: 28px; padding-bottom: 10px; }
|
|
248
215
|
|
|
249
|
-
|
|
250
216
|
/* 일반 테이블 */
|
|
251
217
|
.result-table__head { display: none; }
|
|
252
218
|
.result-table__head,
|
|
@@ -49,13 +49,6 @@
|
|
|
49
49
|
--scc-disabled-fg: var(--color-whiteLine);
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
-
.sound-compass__status {
|
|
53
|
-
font-size: 13px;
|
|
54
|
-
color: var(--color-lightGray);
|
|
55
|
-
margin-bottom: 12px;
|
|
56
|
-
letter-spacing: -0.01em;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
52
|
/* ── SVG 오버레이 ───────────────────────────────── */
|
|
60
53
|
.sound-compass__svg {
|
|
61
54
|
position: absolute;
|
|
@@ -122,7 +115,6 @@
|
|
|
122
115
|
overflow: visible;
|
|
123
116
|
}
|
|
124
117
|
|
|
125
|
-
|
|
126
118
|
/* 중앙 사람 아이콘 */
|
|
127
119
|
.sound-compass__center {
|
|
128
120
|
position: absolute;
|
|
@@ -59,27 +59,6 @@
|
|
|
59
59
|
flex-shrink: 0;
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
-
.table-header__action-button {
|
|
63
|
-
background: none;
|
|
64
|
-
border: none;
|
|
65
|
-
cursor: pointer;
|
|
66
|
-
color: var(--color-gray);
|
|
67
|
-
padding: 2px 6px;
|
|
68
|
-
border-radius: 4px;
|
|
69
|
-
line-height: 1;
|
|
70
|
-
transition: background 0.12s, color 0.12s;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
.table-header__action-button:hover {
|
|
74
|
-
background: var(--color-darkWhite);
|
|
75
|
-
color: var(--color-main);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
.table-header__action-button--delete:hover {
|
|
79
|
-
background: var(--color-error-bg, #ffeef0);
|
|
80
|
-
color: var(--color-error, #e03131);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
62
|
/* 접힌 상태 — 헤더 border-bottom이 wrap 테두리와 겹쳐 두꺼워 보이는 것 방지 */
|
|
84
63
|
.table-wrap--collapsed .table-header {
|
|
85
64
|
border-bottom: none;
|
|
@@ -74,13 +74,5 @@
|
|
|
74
74
|
|
|
75
75
|
.toolbar__count-highlight { color: var(--color-main); }
|
|
76
76
|
|
|
77
|
-
/* 세그먼트/필터/페이지네이션/액션처럼 성격이 다른 그룹 사이를 구분하는 세로선 */
|
|
78
|
-
.toolbar__divider {
|
|
79
|
-
align-self: stretch;
|
|
80
|
-
height: auto;
|
|
81
|
-
margin: 8px 0;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
77
|
@media (max-width: 767px) {
|
|
85
|
-
.toolbar__divider { display: none; }
|
|
86
78
|
}
|
|
@@ -67,25 +67,6 @@
|
|
|
67
67
|
width: 100%;
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
-
.tooltip-menu__item-icon {
|
|
71
|
-
width: 24px;
|
|
72
|
-
height: 24px;
|
|
73
|
-
display: inline-flex;
|
|
74
|
-
align-items: center;
|
|
75
|
-
justify-content: center;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
.tooltip-menu__label {
|
|
79
|
-
flex: 1;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
.tooltip-menu__chev {
|
|
83
|
-
width: 20px;
|
|
84
|
-
display: inline-flex;
|
|
85
|
-
align-items: center;
|
|
86
|
-
justify-content: center;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
70
|
@media (max-width: 600px) {
|
|
90
71
|
.tooltip-menu__columns {
|
|
91
72
|
flex-direction: column;
|
|
@@ -38,7 +38,6 @@
|
|
|
38
38
|
padding: 0 2px 10px;
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
-
|
|
42
41
|
.tooltip-content.is-closing {
|
|
43
42
|
opacity: 0;
|
|
44
43
|
transition: opacity 200ms ease, transform 200ms ease;
|
|
@@ -56,8 +55,6 @@
|
|
|
56
55
|
.tooltip-content.is-closing[data-placement='left'] { transform: translateX(-6px) scale(0.98); }
|
|
57
56
|
.tooltip-content.is-closing[data-placement='right'] { transform: translateX(6px) scale(0.98); }
|
|
58
57
|
|
|
59
|
-
.tooltip--hidden { display: none; }
|
|
60
|
-
|
|
61
58
|
@keyframes tooltip-pop {
|
|
62
59
|
from {
|
|
63
60
|
opacity: 0;
|
|
@@ -104,17 +101,3 @@
|
|
|
104
101
|
visibility: visible !important;
|
|
105
102
|
z-index: var(--z-tooltip) !important;
|
|
106
103
|
}
|
|
107
|
-
|
|
108
|
-
/* Close button positioned at the tooltip's top-right corner */
|
|
109
|
-
.tooltip-content .tooltip-close {
|
|
110
|
-
position: absolute;
|
|
111
|
-
top: 6px;
|
|
112
|
-
right: 6px;
|
|
113
|
-
z-index: 2;
|
|
114
|
-
display: inline-flex;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
/* Slightly reduce visual impact of the close button so it reads as control */
|
|
118
|
-
.tooltip-content .tooltip-close .button {
|
|
119
|
-
box-shadow: none;
|
|
120
|
-
}
|
|
@@ -55,31 +55,9 @@
|
|
|
55
55
|
cursor: default;
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
-
/* When used inside a training card, position the wrapper at the
|
|
59
|
-
card's top-left and render the inner icon without a second offset. */
|
|
60
|
-
.training-list__item .category-icon__wrap {
|
|
61
|
-
position: absolute;
|
|
62
|
-
top: 18px;
|
|
63
|
-
left: 18px;
|
|
64
|
-
}
|
|
65
|
-
.training-list__item .category-icon {
|
|
66
|
-
position: static; /* 크기는 iconSize prop(CategoryIcon --small/기본)이 결정 */
|
|
67
|
-
}
|
|
68
|
-
|
|
69
58
|
/* ── Hover tooltip ────────────────────────────────────── */
|
|
70
59
|
.category-icon__tooltip {
|
|
71
60
|
white-space: nowrap;
|
|
72
61
|
pointer-events: none;
|
|
73
62
|
|
|
74
63
|
}
|
|
75
|
-
|
|
76
|
-
.category-icon__tooltip-text {
|
|
77
|
-
display: block;
|
|
78
|
-
padding: 6px 12px;
|
|
79
|
-
font-size: 13px;
|
|
80
|
-
line-height: 1.4;
|
|
81
|
-
color: #ffffff;
|
|
82
|
-
background: var(--color-darkGray);
|
|
83
|
-
border-radius: var(--radius-sm);
|
|
84
|
-
box-shadow: var(--shadow-tooltip);
|
|
85
|
-
}
|