@ihabdevteam/core 0.258.0 → 0.260.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/CHANGELOG.md +61 -0
- package/dist/components.cjs.js +180 -180
- package/dist/components.esm.css +1 -1
- package/dist/hooks.cjs.js +3 -3
- package/dist/i18n.cjs.js +3 -3
- package/dist/ihabdevteam-core.cjs.js +186 -186
- package/dist/ihabdevteam-core.d.ts +20 -1
- package/dist/packages/core/src/components/Training/TrainingCard.css +12 -0
- package/dist/packages/core/src/components/Training/TrainingPagePopup.js +52 -2
- package/dist/packages/core/src/components/Training/trainingPopupUtils.d.ts +18 -0
- package/dist/packages/core/src/components/Training/trainingPopupUtils.js +28 -0
- package/dist/packages/core/src/components/Word/WordTableButton.js +3 -1
- package/dist/packages/core/src/components.d.ts +1 -1
- package/dist/packages/core/src/components.js +1 -1
- package/dist/packages/core/src/i18n/locales/en.json +1 -0
- package/dist/packages/core/src/i18n/locales/ko.json +1 -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
|
@@ -1651,7 +1651,7 @@ export declare function copyText(text: string): Promise<boolean>;
|
|
|
1651
1651
|
*
|
|
1652
1652
|
* 값은 손으로 적고 `test/coreVersion.test.ts` 가 package.json 과 어긋나면 운다.
|
|
1653
1653
|
*/
|
|
1654
|
-
export declare const CORE_VERSION = "0.
|
|
1654
|
+
export declare const CORE_VERSION = "0.260.0";
|
|
1655
1655
|
|
|
1656
1656
|
/** @public */
|
|
1657
1657
|
declare const coreDefault: Record<string, unknown>;
|
|
@@ -10200,6 +10200,25 @@ export declare function withEuRo(text: string): string;
|
|
|
10200
10200
|
/** text 뒤에 문맥에 맞는 이/가를 붙여 반환한다. */
|
|
10201
10201
|
export declare function withIga(text: string): string;
|
|
10202
10202
|
|
|
10203
|
+
/**
|
|
10204
|
+
* @public 스텝 payload 에 **때 둘을 얹는다** — 보인 때 · 답한 때(말귀 요청 (68) 후속, 2026-10-02).
|
|
10205
|
+
*
|
|
10206
|
+
* `TrainingPagePopup` 의 저장 길목(`setScenarioAnswer`)이 부른다. **셈을 조각 밖으로 뺀 것은
|
|
10207
|
+
* 실제 값으로 잴 수 있게 하려는 것이다** — 조각 안에 두면 "소스에 그 글자가 있나" 로밖에
|
|
10208
|
+
* 못 묻는데, 그런 시험은 셈이 틀려도 초록이다.
|
|
10209
|
+
*
|
|
10210
|
+
* - `answeredAt` 은 `__ts`(스텝이 고른 **바로 그 순간**)를 쓴다. 저장이 끝난 뒤 다시 재면
|
|
10211
|
+
* 답이 state 에 앉는 데 걸린 시간이 섞인다 — 말귀가 잰 0.049초가 그런 값이었다.
|
|
10212
|
+
* - `shownAt` 은 부르는 쪽이 적어 둔 것을 받는다. 답이 놓이는 순간에는 이미 사람이 다
|
|
10213
|
+
* 고른 뒤라 보인 때를 알 수 없다.
|
|
10214
|
+
* - **이미 들어 있는 때는 안 덮는다.** 스텝이 제 때를 찍어 보냈으면 그쪽이 더 정확하다.
|
|
10215
|
+
* - **객체가 아닌 payload 는 그대로 둔다** — 없던 칸을 지어 붙이지 않는다.
|
|
10216
|
+
*
|
|
10217
|
+
* 글자꼴은 `Z` 다. 여기서 짓는 때는 **epoch 하나**라 지킬 지역 시계가 없다 — 앱이 *글자로*
|
|
10218
|
+
* 보낸 때를 안 고치는 것(`utils/trainingItemResults` 의 `때`)과는 다른 자리다.
|
|
10219
|
+
*/
|
|
10220
|
+
export declare function withStepTimes(payload: unknown, shownAt?: string, answeredTs?: number): unknown;
|
|
10221
|
+
|
|
10203
10222
|
/** text 뒤에 와/과를 붙여 반환한다. */
|
|
10204
10223
|
export declare function withWaGwa(text: string): string;
|
|
10205
10224
|
|
|
@@ -179,3 +179,15 @@
|
|
|
179
179
|
align-items: center;
|
|
180
180
|
gap: 4px;
|
|
181
181
|
}
|
|
182
|
+
|
|
183
|
+
/* 누를 일이 없을 때의 게시자 이름 — 글자다((69), 2026-10-02).
|
|
184
|
+
생김새(색·크기·말줄임)는 그대로 두고 **누를 수 있다는 거짓 신호만** 거둔다.
|
|
185
|
+
`cursor: pointer` 는 iOS 가 "누를 수 있는 것" 을 가리는 데도 쓰므로 함께 거둔다
|
|
186
|
+
(`test/touchInteractions0915.test.tsx` 머리글 참고). */
|
|
187
|
+
.training-card__publisher--static {
|
|
188
|
+
cursor: default;
|
|
189
|
+
}
|
|
190
|
+
.training-card__publisher--static:hover {
|
|
191
|
+
color: var(--color-gray);
|
|
192
|
+
text-decoration: none;
|
|
193
|
+
}
|
|
@@ -16,7 +16,7 @@ import TrainingStepConfirm from './TrainingStepConfirm';
|
|
|
16
16
|
import TrainingStepConfirmWithText from './TrainingStepConfirmWithText';
|
|
17
17
|
import TrainingStepListen from './TrainingStepListen';
|
|
18
18
|
import TrainingStepOrderList from './TrainingStepOrderList';
|
|
19
|
-
import { getPayloadTimestamp } from './trainingPopupUtils';
|
|
19
|
+
import { getPayloadTimestamp, withStepTimes } from './trainingPopupUtils';
|
|
20
20
|
import { TrainingPagePopupContext } from './TrainingPagePopupContext';
|
|
21
21
|
import { NoisePlayerContext, DEFAULT_NOISE_SETTINGS, mergeNoiseSettings } from './NoisePlayerContext';
|
|
22
22
|
import { lockBodyScrollWithPadding } from '../../hooks/bodyScrollLock';
|
|
@@ -393,6 +393,37 @@ function TrainingPagePopupInner(props) {
|
|
|
393
393
|
: isChildrenMode
|
|
394
394
|
? effectiveChildrenPageCount
|
|
395
395
|
: (typeof pageCount === 'number' ? pageCount : 0);
|
|
396
|
+
/**
|
|
397
|
+
* **지금 선 스텝이 처음 보인 때를 적어 둔다**(말귀 요청 (68) 후속, 2026-10-02).
|
|
398
|
+
*
|
|
399
|
+
* 답이 놓이는 자리(`setScenarioAnswer`)는 **답한 때**만 알고 **보인 때**는 모른다 —
|
|
400
|
+
* 그때는 이미 사람이 다 고른 뒤다. 그래서 스텝이 설 때 미리 적어 둔다.
|
|
401
|
+
*
|
|
402
|
+
* **`0 ~ 지금` 을 다 적는다**: 한 쪽에 스텝이 여럿 서는 꼴(듣기 → 고르기)에서는 앞 스텝도
|
|
403
|
+
* 이미 보였는데, 지금 것만 적으면 그 스텝의 `shownAt` 이 영영 빈다. 이미 적힌 것은 안 고친다 —
|
|
404
|
+
* 다시 듣기로 되돌아와도 **처음 보인 때**로 둔다.
|
|
405
|
+
*
|
|
406
|
+
* 쪽이 바뀌면 열쇠(`쪽\0스텝`)가 달라지므로 쪽마다 따로 쌓인다.
|
|
407
|
+
*/
|
|
408
|
+
useEffect(() => {
|
|
409
|
+
if (!hasScenario && !isChildrenMode)
|
|
410
|
+
return;
|
|
411
|
+
const pageId = hasScenario
|
|
412
|
+
? getScenarioPageId(currentScenarioPage, effectivePageIndex)
|
|
413
|
+
: (currentChildrenPage?.id || `children-page-${effectivePageIndex ?? 0}`);
|
|
414
|
+
const 지금 = new Date().toISOString();
|
|
415
|
+
for (let i = 0; i <= effectiveStepIndex; i += 1) {
|
|
416
|
+
const stepKey = hasScenario
|
|
417
|
+
? getScenarioStepKey(currentScenarioSteps[i], i)
|
|
418
|
+
: `step-${i}`;
|
|
419
|
+
const k = 보인때열쇠(pageId, stepKey);
|
|
420
|
+
if (!스텝보인때.current.has(k))
|
|
421
|
+
스텝보인때.current.set(k, 지금);
|
|
422
|
+
}
|
|
423
|
+
/* `currentScenarioSteps` 는 그릴 때마다 새 배열이라 의존성에 넣으면 매번 돈다 —
|
|
424
|
+
쪽·스텝 번호가 바뀔 때만 돌면 되고, 그 둘이 바뀌면 스텝 목록도 함께 바뀐다. */
|
|
425
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
426
|
+
}, [hasScenario, isChildrenMode, effectivePageIndex, effectiveStepIndex, currentChildrenPage?.id]);
|
|
396
427
|
// 페이지가 앞으로 진행되면 안내 메시지를 띄우는 의도된 동기화다
|
|
397
428
|
/* eslint-disable react-hooks/set-state-in-effect */
|
|
398
429
|
useLayoutEffect(() => {
|
|
@@ -486,6 +517,16 @@ function TrainingPagePopupInner(props) {
|
|
|
486
517
|
if (panelRef.current)
|
|
487
518
|
panelRef.current._childOnResult = fn;
|
|
488
519
|
}, []);
|
|
520
|
+
/**
|
|
521
|
+
* **스텝이 처음 보인 때** — `쪽\0스텝` 하나당 한 번만 적고 **다시 와도 안 고친다**
|
|
522
|
+
* (말귀 요청 (68) 후속, 2026-10-02). 다시 듣기를 눌러도 처음 보인 때로 둔다 —
|
|
523
|
+
* 반응 시간에 다시 듣기 노력이 들어가는 쪽이 실제에 가깝다.
|
|
524
|
+
*
|
|
525
|
+
* `state` 가 아니라 `ref` 다: 이 값은 **그릴 것을 바꾸지 않는다.** state 로 두면 스텝이
|
|
526
|
+
* 바뀔 때마다 한 번씩 더 그린다.
|
|
527
|
+
*/
|
|
528
|
+
const 스텝보인때 = useRef(new Map());
|
|
529
|
+
const 보인때열쇠 = (pageId, stepKey) => `${pageId}\u0000${stepKey}`;
|
|
489
530
|
const setScenarioAnswer = useCallback((pageId, stepKey, payload) => {
|
|
490
531
|
setFlowState((prev) => {
|
|
491
532
|
const pageAnswers = prev.answersByPage[pageId] || {};
|
|
@@ -494,13 +535,22 @@ function TrainingPagePopupInner(props) {
|
|
|
494
535
|
const existingTs = getPayloadTimestamp(existing);
|
|
495
536
|
if (existing && existingTs > incomingTs)
|
|
496
537
|
return prev;
|
|
538
|
+
/* **때를 여기서 얹는다**(말귀 요청 (68) 후속). 스텝 답은 모두 이 한 길목을 지나므로,
|
|
539
|
+
화면마다 따로 찍을 까닭이 없다.
|
|
540
|
+
- `answeredAt` 은 payload 의 `__ts` 를 쓴다 — **스텝이 고른 바로 그 순간**이라
|
|
541
|
+
여기서 다시 재는 것보다 정확하다(state 가 앉는 데 걸린 시간이 안 섞인다).
|
|
542
|
+
`__ts` 가 없는 payload 는 지금 잰다.
|
|
543
|
+
- `shownAt` 은 위 `스텝보인때` 에 적어 둔 것을 꺼낸다.
|
|
544
|
+
글자꼴은 `Z` 다 — **여기서 짓는 때는 epoch 하나**라 지킬 지역 시계가 없다
|
|
545
|
+
(앱이 글자로 보낸 때를 안 고치는 것과 다른 자리다, `trainingItemResults` 머리글). */
|
|
546
|
+
const 얹은payload = withStepTimes(payload, 스텝보인때.current.get(보인때열쇠(pageId, stepKey)), incomingTs);
|
|
497
547
|
return {
|
|
498
548
|
...prev,
|
|
499
549
|
answersByPage: {
|
|
500
550
|
...prev.answersByPage,
|
|
501
551
|
[pageId]: {
|
|
502
552
|
...pageAnswers,
|
|
503
|
-
[stepKey]: payload,
|
|
553
|
+
[stepKey]: 얹은payload,
|
|
504
554
|
},
|
|
505
555
|
},
|
|
506
556
|
};
|
|
@@ -26,6 +26,24 @@ export declare function resolveTrainingPopupMeta(trainingData: Record<string, un
|
|
|
26
26
|
};
|
|
27
27
|
/** @public */
|
|
28
28
|
export declare function getPayloadTimestamp(payload: unknown): number;
|
|
29
|
+
/**
|
|
30
|
+
* @public 스텝 payload 에 **때 둘을 얹는다** — 보인 때 · 답한 때(말귀 요청 (68) 후속, 2026-10-02).
|
|
31
|
+
*
|
|
32
|
+
* `TrainingPagePopup` 의 저장 길목(`setScenarioAnswer`)이 부른다. **셈을 조각 밖으로 뺀 것은
|
|
33
|
+
* 실제 값으로 잴 수 있게 하려는 것이다** — 조각 안에 두면 "소스에 그 글자가 있나" 로밖에
|
|
34
|
+
* 못 묻는데, 그런 시험은 셈이 틀려도 초록이다.
|
|
35
|
+
*
|
|
36
|
+
* - `answeredAt` 은 `__ts`(스텝이 고른 **바로 그 순간**)를 쓴다. 저장이 끝난 뒤 다시 재면
|
|
37
|
+
* 답이 state 에 앉는 데 걸린 시간이 섞인다 — 말귀가 잰 0.049초가 그런 값이었다.
|
|
38
|
+
* - `shownAt` 은 부르는 쪽이 적어 둔 것을 받는다. 답이 놓이는 순간에는 이미 사람이 다
|
|
39
|
+
* 고른 뒤라 보인 때를 알 수 없다.
|
|
40
|
+
* - **이미 들어 있는 때는 안 덮는다.** 스텝이 제 때를 찍어 보냈으면 그쪽이 더 정확하다.
|
|
41
|
+
* - **객체가 아닌 payload 는 그대로 둔다** — 없던 칸을 지어 붙이지 않는다.
|
|
42
|
+
*
|
|
43
|
+
* 글자꼴은 `Z` 다. 여기서 짓는 때는 **epoch 하나**라 지킬 지역 시계가 없다 — 앱이 *글자로*
|
|
44
|
+
* 보낸 때를 안 고치는 것(`utils/trainingItemResults` 의 `때`)과는 다른 자리다.
|
|
45
|
+
*/
|
|
46
|
+
export declare function withStepTimes(payload: unknown, shownAt?: string, answeredTs?: number): unknown;
|
|
29
47
|
/** @public */
|
|
30
48
|
export declare function resolveTrainingItems(trainingData: unknown): unknown[];
|
|
31
49
|
interface CreateTrainingScenarioParams {
|
|
@@ -83,6 +83,34 @@ export function getPayloadTimestamp(payload) {
|
|
|
83
83
|
}
|
|
84
84
|
return 0;
|
|
85
85
|
}
|
|
86
|
+
/**
|
|
87
|
+
* @public 스텝 payload 에 **때 둘을 얹는다** — 보인 때 · 답한 때(말귀 요청 (68) 후속, 2026-10-02).
|
|
88
|
+
*
|
|
89
|
+
* `TrainingPagePopup` 의 저장 길목(`setScenarioAnswer`)이 부른다. **셈을 조각 밖으로 뺀 것은
|
|
90
|
+
* 실제 값으로 잴 수 있게 하려는 것이다** — 조각 안에 두면 "소스에 그 글자가 있나" 로밖에
|
|
91
|
+
* 못 묻는데, 그런 시험은 셈이 틀려도 초록이다.
|
|
92
|
+
*
|
|
93
|
+
* - `answeredAt` 은 `__ts`(스텝이 고른 **바로 그 순간**)를 쓴다. 저장이 끝난 뒤 다시 재면
|
|
94
|
+
* 답이 state 에 앉는 데 걸린 시간이 섞인다 — 말귀가 잰 0.049초가 그런 값이었다.
|
|
95
|
+
* - `shownAt` 은 부르는 쪽이 적어 둔 것을 받는다. 답이 놓이는 순간에는 이미 사람이 다
|
|
96
|
+
* 고른 뒤라 보인 때를 알 수 없다.
|
|
97
|
+
* - **이미 들어 있는 때는 안 덮는다.** 스텝이 제 때를 찍어 보냈으면 그쪽이 더 정확하다.
|
|
98
|
+
* - **객체가 아닌 payload 는 그대로 둔다** — 없던 칸을 지어 붙이지 않는다.
|
|
99
|
+
*
|
|
100
|
+
* 글자꼴은 `Z` 다. 여기서 짓는 때는 **epoch 하나**라 지킬 지역 시계가 없다 — 앱이 *글자로*
|
|
101
|
+
* 보낸 때를 안 고치는 것(`utils/trainingItemResults` 의 `때`)과는 다른 자리다.
|
|
102
|
+
*/
|
|
103
|
+
export function withStepTimes(payload, shownAt, answeredTs) {
|
|
104
|
+
if (!payload || typeof payload !== 'object' || Array.isArray(payload))
|
|
105
|
+
return payload;
|
|
106
|
+
const p = payload;
|
|
107
|
+
const ts = typeof answeredTs === 'number' && answeredTs > 0 ? answeredTs : Date.now();
|
|
108
|
+
return {
|
|
109
|
+
...p,
|
|
110
|
+
...(p.shownAt === undefined && shownAt ? { shownAt } : {}),
|
|
111
|
+
...(p.answeredAt === undefined ? { answeredAt: new Date(ts).toISOString() } : {}),
|
|
112
|
+
};
|
|
113
|
+
}
|
|
86
114
|
/** @public */
|
|
87
115
|
export function resolveTrainingItems(trainingData) {
|
|
88
116
|
const td = trainingData;
|
|
@@ -27,5 +27,7 @@ export default function WordTableButton({ items, name, description, createdAt, c
|
|
|
27
27
|
return (_jsxs("div", { className: cx('word-table-button', selected ? 'word-table-button--selected' : '', !hasStoreFooter ? 'word-table-button--no-footer' : '', className), role: "button", tabIndex: 0, "aria-label": code ? `${name} (${code})` : name, onClick: renaming ? undefined : onClick, onKeyDown: handleKey, children: [isNew && _jsx("span", { className: "word-table-button__new-dot", "aria-label": t('myWordTable.newBadge', '새로 만든 표') }), _jsx(WordTableThumbnail, { items: items, className: "word-table-button__thumb" }), _jsxs("div", { className: "word-table-button__info", children: [_jsxs("div", { className: "word-table-button__info-text", children: [titleNode ?? _jsx("div", { className: "word-table-button__title h4", children: name }), description && _jsx("div", { className: "word-table-button__desc body-3", children: description })] }), onMore && !renaming && (_jsx(Button, { htmlType: "button", className: "word-table-button__more", size: 32, type: "dot", variant: "transparent-gray", useBorder: false, icon: "ellipsis",
|
|
28
28
|
/* 하드코딩 '더보기'였다(영어 화면에서도 한국어로 남았다). 목록에 표가
|
|
29
29
|
여러 개면 이름이 같은 버튼이 여러 개이기도 해서 이름을 함께 넣는다. */
|
|
30
|
-
ariaLabel: t('common.moreFor', { name }), onClick: (e) => { e.stopPropagation(); onMore(e); } }))] }), (code || createdAt || published || shared) && (_jsxs("div", { className: "word-table-button__meta-row", children: [_jsx("span", { className: "word-table-button__meta-left", children: _jsx("span", { className: "word-table-button__meta caption-1", children: createdAt ? formatRelativeTime(createdAt, t) : '' }) }), _jsxs("span", { className: "word-table-button__meta-right", children: [(published || shared) && (_jsxs("span", { className: "word-table-button__badges", children: [published && (_jsx(Badge, { className: "word-table-button__badge", size: "small", variant: "main", fill: "soft", iconLeft: "book-marked", label: publishedLabel ?? t('myWordTable.publishedBadge', '발행됨') })), shared && (_jsx(Badge, { className: "word-table-button__badge", size: "small", fill: "soft", iconLeft: "link", label: sharedLabel ?? t('myWordTable.sharedBadge', '공유 중') }))] })), code && _jsx("span", { className: "word-table-button__code caption-1", children: code })] })] })), hasStoreFooter && (_jsxs("div", { className: "word-table-button__footer", children: [_jsxs("span", { className: "word-table-button__store-by", children: [publisherName && (
|
|
30
|
+
ariaLabel: t('common.moreFor', { name }), onClick: (e) => { e.stopPropagation(); onMore(e); } }))] }), (code || createdAt || published || shared) && (_jsxs("div", { className: "word-table-button__meta-row", children: [_jsx("span", { className: "word-table-button__meta-left", children: _jsx("span", { className: "word-table-button__meta caption-1", children: createdAt ? formatRelativeTime(createdAt, t) : '' }) }), _jsxs("span", { className: "word-table-button__meta-right", children: [(published || shared) && (_jsxs("span", { className: "word-table-button__badges", children: [published && (_jsx(Badge, { className: "word-table-button__badge", size: "small", variant: "main", fill: "soft", iconLeft: "book-marked", label: publishedLabel ?? t('myWordTable.publishedBadge', '발행됨') })), shared && (_jsx(Badge, { className: "word-table-button__badge", size: "small", fill: "soft", iconLeft: "link", label: sharedLabel ?? t('myWordTable.sharedBadge', '공유 중') }))] })), code && _jsx("span", { className: "word-table-button__code caption-1", children: code })] })] })), hasStoreFooter && (_jsxs("div", { className: "word-table-button__footer", children: [_jsxs("span", { className: "word-table-button__store-by", children: [publisherName && (onPublisherClick
|
|
31
|
+
? (_jsx("button", { className: "training-card__publisher body-4", type: "button", "aria-label": t('wordTable.publisherFilter', { name: publisherName, defaultValue: '{{name}} 게시한 것만 보기' }), onClick: (e) => { e.stopPropagation(); onPublisherClick(); }, children: publisherName }))
|
|
32
|
+
: _jsx("span", { className: "training-card__publisher training-card__publisher--static body-4", children: publisherName })), publishedAt && _jsx("span", { className: "training-card__date body-4", children: formatRelativeTime(publishedAt, t) })] }), _jsxs("span", { className: "word-table-button__store-stats", children: [likeCount != null && (_jsx(Badge, { size: "small", fill: "soft", variant: "like", iconLeft: "heart", label: String(likeCount), "aria-label": t('common.likeCount', { count: likeCount, defaultValue: `좋아요 ${likeCount}` }) })), downloadCount != null && (_jsx(Badge, { size: "small", fill: "soft", variant: "main", iconLeft: "download", label: String(downloadCount), "aria-label": t('common.downloadCount', { count: downloadCount, defaultValue: `가져간 수 ${downloadCount}` }) }))] })] }))] }));
|
|
31
33
|
}
|
|
@@ -288,7 +288,7 @@ export * from './components/Training/TrainingStepConfirmWithText';
|
|
|
288
288
|
export * from './components/Training/TrainingStepListen';
|
|
289
289
|
export * from './components/Training/TrainingStepOrderList';
|
|
290
290
|
export * from './components/Training/TrainingStepCard';
|
|
291
|
-
export { closeTrainingPopup, deriveNoiseContexts, getSteppedPayload, getSelectedFromPayload, getStepPayload, getSelectedText, splitTrainingVariants, resolveTrainingPopupMeta, createTrainingScenario, toTrainingText, isSelectionCorrect, getPayloadTimestamp, resolveTrainingItems, } from './components/Training/trainingPopupUtils';
|
|
291
|
+
export { closeTrainingPopup, deriveNoiseContexts, getSteppedPayload, getSelectedFromPayload, getStepPayload, getSelectedText, splitTrainingVariants, resolveTrainingPopupMeta, createTrainingScenario, toTrainingText, isSelectionCorrect, getPayloadTimestamp, withStepTimes, resolveTrainingItems, } from './components/Training/trainingPopupUtils';
|
|
292
292
|
export type { AccordionProps, AccordionItem } from './components/Accordion';
|
|
293
293
|
export type { NoticeBoxProps } from './components/NoticeBox';
|
|
294
294
|
export type { ProgressBarProps } from './components/ProgressBar';
|
|
@@ -228,7 +228,7 @@ export * from './components/Training/TrainingStepConfirmWithText';
|
|
|
228
228
|
export * from './components/Training/TrainingStepListen';
|
|
229
229
|
export * from './components/Training/TrainingStepOrderList';
|
|
230
230
|
export * from './components/Training/TrainingStepCard';
|
|
231
|
-
export { closeTrainingPopup, deriveNoiseContexts, getSteppedPayload, getSelectedFromPayload, getStepPayload, getSelectedText, splitTrainingVariants, resolveTrainingPopupMeta, createTrainingScenario, toTrainingText, isSelectionCorrect, getPayloadTimestamp, resolveTrainingItems, } from './components/Training/trainingPopupUtils';
|
|
231
|
+
export { closeTrainingPopup, deriveNoiseContexts, getSteppedPayload, getSelectedFromPayload, getStepPayload, getSelectedText, splitTrainingVariants, resolveTrainingPopupMeta, createTrainingScenario, toTrainingText, isSelectionCorrect, getPayloadTimestamp, withStepTimes, resolveTrainingItems, } from './components/Training/trainingPopupUtils';
|
|
232
232
|
export { default as PageTitle } from './components/PageTitle';
|
|
233
233
|
export { companyTypeLabel } from './utils/companyTypes';
|
|
234
234
|
export { cx } from './utils/cx';
|