@ihabdevteam/core 0.149.0 → 0.151.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 +60 -0
- package/dist/components.cjs.js +199 -186
- package/dist/components.esm.css +5 -5
- package/dist/hooks.cjs.js +5 -1
- package/dist/i18n.cjs.js +3 -3
- package/dist/ihabdevteam-core-tokens.css +1 -1
- package/dist/ihabdevteam-core.cjs.js +200 -187
- package/dist/ihabdevteam-core.css +1 -1
- package/dist/ihabdevteam-core.d.ts +407 -69
- package/dist/packages/core/src/components/Accordion.d.ts +6 -0
- package/dist/packages/core/src/components/Accordion.js +5 -2
- package/dist/packages/core/src/components/Alert.d.ts +7 -1
- package/dist/packages/core/src/components/Alert.js +12 -3
- package/dist/packages/core/src/components/BarChart.js +7 -2
- package/dist/packages/core/src/components/Board.d.ts +5 -2
- package/dist/packages/core/src/components/Board.js +9 -3
- package/dist/packages/core/src/components/BottomNav.js +5 -4
- package/dist/packages/core/src/components/Breadcrumb.css +9 -0
- package/dist/packages/core/src/components/Breadcrumb.d.ts +12 -1
- package/dist/packages/core/src/components/Breadcrumb.js +8 -2
- package/dist/packages/core/src/components/BulkBar.css +2 -0
- package/dist/packages/core/src/components/BulkBar.js +21 -2
- package/dist/packages/core/src/components/Button.d.ts +12 -2
- package/dist/packages/core/src/components/Button.js +70 -13
- package/dist/packages/core/src/components/Calendar.d.ts +6 -1
- package/dist/packages/core/src/components/Calendar.js +3 -3
- package/dist/packages/core/src/components/DatePicker.d.ts +7 -1
- package/dist/packages/core/src/components/DatePicker.js +25 -15
- package/dist/packages/core/src/components/Dropdown.d.ts +1 -0
- package/dist/packages/core/src/components/Dropdown.js +7 -5
- package/dist/packages/core/src/components/Effect/EffectPartyPopperHost.d.ts +12 -1
- package/dist/packages/core/src/components/Effect/EffectPartyPopperHost.js +25 -8
- package/dist/packages/core/src/components/EmptyState.d.ts +5 -1
- package/dist/packages/core/src/components/EmptyState.js +4 -1
- package/dist/packages/core/src/components/ErrorState.d.ts +5 -2
- package/dist/packages/core/src/components/ErrorState.js +3 -1
- package/dist/packages/core/src/components/FileUpload.d.ts +9 -1
- package/dist/packages/core/src/components/FileUpload.js +8 -2
- package/dist/packages/core/src/components/FilterSectionInfo.js +14 -2
- package/dist/packages/core/src/components/Header.js +8 -5
- package/dist/packages/core/src/components/HearingDeviceInfo.js +2 -1
- package/dist/packages/core/src/components/Icon.d.ts +2 -1
- package/dist/packages/core/src/components/Icon.js +4 -1
- package/dist/packages/core/src/components/Loader.css +28 -0
- package/dist/packages/core/src/components/Loader.d.ts +5 -1
- package/dist/packages/core/src/components/Loader.js +4 -2
- package/dist/packages/core/src/components/NoticeBox.d.ts +1 -1
- package/dist/packages/core/src/components/NoticeBox.js +15 -6
- package/dist/packages/core/src/components/PanelRow.js +2 -1
- package/dist/packages/core/src/components/PassCard/PassCard.d.ts +8 -2
- package/dist/packages/core/src/components/PassCard/PassCard.js +25 -10
- package/dist/packages/core/src/components/PassCard/passCardProduct.d.ts +1 -1
- package/dist/packages/core/src/components/PassCard/passCardProduct.js +11 -2
- package/dist/packages/core/src/components/Popup/ConfirmPopup.d.ts +11 -2
- package/dist/packages/core/src/components/Popup/ConfirmPopup.js +18 -3
- package/dist/packages/core/src/components/Popup/DeviceSideTable.js +10 -8
- package/dist/packages/core/src/components/Popup/ListPopup.js +6 -6
- package/dist/packages/core/src/components/Popup/LoadTablePopup.css +7 -0
- package/dist/packages/core/src/components/Popup/LoadTablePopup.js +27 -5
- package/dist/packages/core/src/components/Popup/Popup.d.ts +8 -0
- package/dist/packages/core/src/components/Popup/Popup.js +6 -3
- package/dist/packages/core/src/components/Popup/SaveTablePopup.d.ts +5 -1
- package/dist/packages/core/src/components/Popup/TrainingResultPopup.css +3 -0
- package/dist/packages/core/src/components/Popup/TrainingResultPopup.d.ts +5 -0
- package/dist/packages/core/src/components/Popup/TrainingResultPopup.js +10 -4
- package/dist/packages/core/src/components/Popup/WordDataUpdatePopup.css +9 -0
- package/dist/packages/core/src/components/ProgressIndicator.css +5 -0
- package/dist/packages/core/src/components/ProgressIndicator.d.ts +3 -1
- package/dist/packages/core/src/components/ProgressIndicator.js +5 -3
- package/dist/packages/core/src/components/PromoBannerBg/promoBannerBg.d.ts +4 -1
- package/dist/packages/core/src/components/PromoBannerBg/promoBannerBg.js +27 -15
- package/dist/packages/core/src/components/Rating.d.ts +8 -2
- package/dist/packages/core/src/components/Rating.js +22 -8
- package/dist/packages/core/src/components/Report/ReportDocument.d.ts +10 -7
- package/dist/packages/core/src/components/Report/ReportDocument.js +39 -13
- package/dist/packages/core/src/components/RingChart.d.ts +1 -1
- package/dist/packages/core/src/components/RingChart.js +1 -1
- package/dist/packages/core/src/components/SegmentedControl.d.ts +4 -0
- package/dist/packages/core/src/components/SegmentedControl.js +9 -1
- package/dist/packages/core/src/components/ShortcutBadge.css +16 -1
- package/dist/packages/core/src/components/ShortcutBadge.d.ts +1 -0
- package/dist/packages/core/src/components/SideNav.js +8 -2
- package/dist/packages/core/src/components/SummaryStrip.d.ts +1 -1
- package/dist/packages/core/src/components/SummaryStrip.js +2 -2
- package/dist/packages/core/src/components/Table.d.ts +1 -1
- package/dist/packages/core/src/components/Table.js +4 -1
- package/dist/packages/core/src/components/Tabs.d.ts +1 -0
- package/dist/packages/core/src/components/Tabs.js +4 -1
- package/dist/packages/core/src/components/TextField.css +5 -6
- package/dist/packages/core/src/components/TextField.js +46 -3
- package/dist/packages/core/src/components/Toast.js +16 -2
- package/dist/packages/core/src/components/Tooltip/Tooltip.css +3 -1
- package/dist/packages/core/src/components/Tooltip/Tooltip.js +5 -2
- package/dist/packages/core/src/components/Tooltip/tooltipConstants.d.ts +10 -2
- package/dist/packages/core/src/components/Tooltip/tooltipConstants.js +10 -2
- package/dist/packages/core/src/components/TopBanner.d.ts +1 -1
- package/dist/packages/core/src/components/TopBanner.js +66 -8
- package/dist/packages/core/src/components/Training/AudioPlayerWaveForm.d.ts +1 -0
- package/dist/packages/core/src/components/Training/AudioPlayerWaveForm.js +65 -15
- package/dist/packages/core/src/components/Training/NoisePlayerContext.d.ts +3 -2
- package/dist/packages/core/src/components/Training/NoisePlayerContext.js +10 -4
- package/dist/packages/core/src/components/Training/TrainingBlockButton.css +7 -0
- package/dist/packages/core/src/components/Training/TrainingBlockButton.js +3 -1
- package/dist/packages/core/src/components/Training/TrainingPagePopup.d.ts +18 -5
- package/dist/packages/core/src/components/Training/TrainingPagePopup.js +93 -28
- package/dist/packages/core/src/components/Training/TrainingPagePopupBottom.d.ts +1 -0
- package/dist/packages/core/src/components/Training/TrainingPagePopupBottom.js +16 -3
- package/dist/packages/core/src/components/Training/TrainingStepAudioPlayer.js +29 -11
- package/dist/packages/core/src/components/Training/TrainingStepCard.js +19 -3
- package/dist/packages/core/src/components/Training/TrainingStepTitle.js +15 -1
- package/dist/packages/core/src/components/Training/TrainingWordCard.css +16 -0
- package/dist/packages/core/src/components/Training/TrainingWordCard.d.ts +6 -0
- package/dist/packages/core/src/components/Training/TrainingWordCard.js +7 -2
- package/dist/packages/core/src/components/Training/trainingBlockButtonTypes.d.ts +2 -2
- package/dist/packages/core/src/components/Training/trainingMissStats.d.ts +10 -0
- package/dist/packages/core/src/components/Training/trainingMissStats.js +19 -1
- package/dist/packages/core/src/components/Training/useFloatingFocus.d.ts +13 -0
- package/dist/packages/core/src/components/Training/useFloatingFocus.js +59 -0
- package/dist/packages/core/src/components/Training/useNoiseFade.js +20 -11
- package/dist/packages/core/src/components/Training/useProgressTicker.d.ts +0 -18
- package/dist/packages/core/src/components/Training/useProgressTicker.js +59 -14
- package/dist/packages/core/src/components/Training/useTTSPlayback.d.ts +1 -1
- package/dist/packages/core/src/components/Training/useTTSPlayback.js +56 -25
- package/dist/packages/core/src/components/Training/useWaveReady.d.ts +4 -1
- package/dist/packages/core/src/components/Training/useWaveReady.js +17 -8
- package/dist/packages/core/src/components/UpdateAlert.css +4 -2
- package/dist/packages/core/src/components/UpdateAlert.d.ts +3 -1
- package/dist/packages/core/src/components/UpdateAlert.js +21 -1
- package/dist/packages/core/src/components/Word/PhonemeSelectBlock.d.ts +2 -0
- package/dist/packages/core/src/components/Word/PhonemeSelectBlock.js +12 -4
- package/dist/packages/core/src/components/Word/WordSearchResultBlock.d.ts +6 -0
- package/dist/packages/core/src/components/Word/WordSearchResultBlock.js +26 -13
- package/dist/packages/core/src/components/Word/WordTableBlock.js +24 -21
- package/dist/packages/core/src/components/Word/WordTableThumbnail.js +1 -1
- package/dist/packages/core/src/components/Word/useWordTableDisplaySettings.js +7 -10
- package/dist/packages/core/src/components/Word/useWordTablePrint.d.ts +1 -1
- package/dist/packages/core/src/components/Word/useWordTablePrint.js +9 -3
- package/dist/packages/core/src/components/Word/wordScoreStats.d.ts +14 -1
- package/dist/packages/core/src/components/Word/wordScoreStats.js +7 -3
- package/dist/packages/core/src/components/Word/wordTablePrint.js +15 -3
- package/dist/packages/core/src/components/Word/wordTableReview.d.ts +58 -1
- package/dist/packages/core/src/components/Word/wordTableReview.js +75 -17
- package/dist/packages/core/src/components/Word/wordTableSettings.d.ts +9 -0
- package/dist/packages/core/src/components/Word/wordTableSettings.js +11 -0
- package/dist/packages/core/src/components/WordTable.css +10 -0
- package/dist/packages/core/src/components/WordTable.js +39 -26
- package/dist/packages/core/src/components/barChartTypes.d.ts +2 -2
- package/dist/packages/core/src/components/buttonTypes.d.ts +8 -0
- package/dist/packages/core/src/components/updateAlertStack.d.ts +2 -0
- package/dist/packages/core/src/components/updateAlertStack.js +68 -0
- package/dist/packages/core/src/components/useCalendarMonth.d.ts +4 -1
- package/dist/packages/core/src/components/useCalendarMonth.js +6 -3
- package/dist/packages/core/src/components/useComboboxSuggestions.d.ts +7 -0
- package/dist/packages/core/src/components/useComboboxSuggestions.js +21 -2
- package/dist/packages/core/src/components/wordTableLayout.d.ts +4 -0
- package/dist/packages/core/src/components/wordTableLayout.js +6 -0
- package/dist/packages/core/src/components.d.ts +2 -1
- package/dist/packages/core/src/components.js +1 -1
- package/dist/packages/core/src/hooks/bodyScrollLock.js +8 -2
- package/dist/packages/core/src/hooks/focusReturn.d.ts +12 -0
- package/dist/packages/core/src/hooks/focusReturn.js +49 -0
- package/dist/packages/core/src/hooks/touchToggle.d.ts +22 -0
- package/dist/packages/core/src/hooks/touchToggle.js +114 -0
- package/dist/packages/core/src/hooks/useAnchoredMenu.d.ts +12 -3
- package/dist/packages/core/src/hooks/useAnchoredMenu.js +37 -3
- package/dist/packages/core/src/hooks/useDailyTrainingSelection.d.ts +4 -2
- package/dist/packages/core/src/hooks/useDailyTrainingSelection.js +23 -11
- package/dist/packages/core/src/hooks/useIcon.js +29 -5
- package/dist/packages/core/src/hooks/useLucideIcon.d.ts +4 -0
- package/dist/packages/core/src/hooks/useLucideIcon.js +4 -0
- package/dist/packages/core/src/hooks/usePendingPress.d.ts +9 -0
- package/dist/packages/core/src/hooks/usePendingPress.js +26 -0
- package/dist/packages/core/src/hooks/usePrefersReducedMotion.d.ts +15 -0
- package/dist/packages/core/src/hooks/usePrefersReducedMotion.js +26 -0
- package/dist/packages/core/src/hooks/useRelativeDay.d.ts +2 -2
- package/dist/packages/core/src/hooks/useRelativeDay.js +12 -5
- package/dist/packages/core/src/hooks/useTablePaging.d.ts +27 -2
- package/dist/packages/core/src/hooks/useTablePaging.js +37 -5
- package/dist/packages/core/src/hooks/useWordAttributeFilter.d.ts +7 -0
- package/dist/packages/core/src/hooks/useWordAttributeFilter.js +25 -0
- package/dist/packages/core/src/i18n/index.js +9 -1
- package/dist/packages/core/src/i18n/locales/en.json +24 -2
- package/dist/packages/core/src/i18n/locales/ko.json +24 -2
- package/dist/packages/core/src/tokens.css +5 -0
- package/dist/packages/core/src/types/wordSearch.d.ts +12 -0
- package/dist/packages/core/src/utils/csv.d.ts +7 -2
- package/dist/packages/core/src/utils/csv.js +12 -5
- package/dist/packages/core/src/utils/dailySelectionUtils.js +44 -14
- package/dist/packages/core/src/utils/date.d.ts +8 -0
- package/dist/packages/core/src/utils/date.js +44 -10
- package/dist/packages/core/src/utils/format.d.ts +1 -1
- package/dist/packages/core/src/utils/format.js +6 -7
- package/dist/packages/core/src/utils/noiseSettingsStore.d.ts +7 -3
- package/dist/packages/core/src/utils/phonemeConvert.d.ts +9 -0
- package/dist/packages/core/src/utils/phonemeConvert.js +11 -0
- package/dist/packages/core/src/utils/phonemePairSearch.d.ts +7 -1
- package/dist/packages/core/src/utils/phonemePairSearch.js +45 -21
- package/dist/packages/core/src/utils/safeHref.d.ts +8 -0
- package/dist/packages/core/src/utils/safeHref.js +24 -0
- package/dist/packages/core/src/utils/savedWordTables.d.ts +19 -3
- package/dist/packages/core/src/utils/savedWordTables.js +27 -19
- package/dist/packages/core/src/utils/textSort.d.ts +9 -0
- package/dist/packages/core/src/utils/textSort.js +37 -1
- package/dist/packages/core/src/utils/wordAttributeFilterCodes.d.ts +31 -0
- package/dist/packages/core/src/utils/wordAttributeFilterCodes.js +163 -0
- package/dist/packages/core/src/utils/wordContrast.d.ts +4 -2
- package/dist/packages/core/src/utils/wordContrast.js +8 -2
- package/dist/packages/core/src/utils/wordTrainingGenerators.d.ts +5 -2
- package/dist/packages/core/src/utils/wordTrainingGenerators.js +52 -2
- package/dist/packages/core/src/utils/wordTrainingPool.js +2 -2
- package/dist/packages/core/src/utils/wordTrainingRuntime.js +15 -7
- package/dist/packages/core/src/utils/wordTrainingRuntimeTypes.d.ts +1 -1
- package/dist/packages/core/src/utils/wordTrainingRuntimeTypes.js +5 -4
- package/dist/packages/core/src/utils/wornDate.d.ts +12 -0
- package/dist/packages/core/src/utils/wornDate.js +15 -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 +2 -2
- package/package.json +1 -1
|
@@ -13,6 +13,7 @@ import { KeyboardEvent as KeyboardEvent_2 } from 'react';
|
|
|
13
13
|
import { MouseEvent as MouseEvent_2 } from 'react';
|
|
14
14
|
import { default as React_2 } from 'react';
|
|
15
15
|
import * as React_3 from 'react';
|
|
16
|
+
import { ReactElement } from 'react';
|
|
16
17
|
import { ReactNode } from 'react';
|
|
17
18
|
import { ReactPortal } from 'react';
|
|
18
19
|
import { Ref } from 'react';
|
|
@@ -29,6 +30,12 @@ export declare interface AccordionItem {
|
|
|
29
30
|
title: ReactNode;
|
|
30
31
|
body: ReactNode;
|
|
31
32
|
avatar?: ReactNode;
|
|
33
|
+
/**
|
|
34
|
+
* 항목의 변하지 않는 이름. 주면 펼침 상태가 **자리 번호가 아니라 이 id 에** 묶인다 —
|
|
35
|
+
* 목록 앞에 항목이 더해지거나 빠져도(새 공지가 맨 위에 붙는 등) 펼친 항목이 그대로 펼쳐져 있다.
|
|
36
|
+
* 안 주면 지금처럼 자리 번호로 묶인다. 같은 목록 안에서 겹치지 않아야 한다.
|
|
37
|
+
*/
|
|
38
|
+
id?: string;
|
|
32
39
|
}
|
|
33
40
|
|
|
34
41
|
/** @public */
|
|
@@ -76,7 +83,7 @@ export declare interface ActionCardProps {
|
|
|
76
83
|
}
|
|
77
84
|
|
|
78
85
|
/** @public */
|
|
79
|
-
export declare function Alert({ tone, title, message, children, dismissible, onDismiss, className, }: AlertProps): JSX.Element | null;
|
|
86
|
+
export declare function Alert({ tone, title, message, children, dismissible, onDismiss, live, className, }: AlertProps): JSX.Element | null;
|
|
80
87
|
|
|
81
88
|
/** @public */
|
|
82
89
|
export declare interface AlertProps {
|
|
@@ -88,6 +95,12 @@ export declare interface AlertProps {
|
|
|
88
95
|
/** 닫기(×) 버튼 표시 여부 */
|
|
89
96
|
dismissible?: boolean;
|
|
90
97
|
onDismiss?: () => void;
|
|
98
|
+
/**
|
|
99
|
+
* 낭독기에 알리는 방식. 안 주면 톤이 정한다 — `danger`·`warning` 은 `'assertive'`(`role="alert"`, 하던 말을 끊고 읽음),
|
|
100
|
+
* `info`·`success` 는 `'polite'`(`role="status"`, 하던 말 뒤에 읽음).
|
|
101
|
+
* `'off'` 는 live 역할을 두지 않는다 — 화면에 늘 놓인 안내(설정 화면 머리의 주의 글 등)가 열 때마다 끼어들어 읽히지 않게.
|
|
102
|
+
*/
|
|
103
|
+
live?: 'assertive' | 'polite' | 'off';
|
|
91
104
|
className?: string;
|
|
92
105
|
}
|
|
93
106
|
|
|
@@ -345,7 +358,7 @@ export declare interface BarChartProps {
|
|
|
345
358
|
*
|
|
346
359
|
* 굵기만 줄이고 싶을 때 `small` 로 가면 높이·헤더 컨트롤·합계 라벨까지 같이
|
|
347
360
|
* 줄어든다(2026-09-10 말귀 실측). 이 값은 굵기만 바꾼다. 막대가 많아지면 여기
|
|
348
|
-
* 적은 값을 **위 한계**로 두고 점진 축소하는 것은 그대로다.
|
|
361
|
+
* 적은 값을 **위 한계**로 두고 점진 축소하는 것은 그대로다. 아래 한계는 2px(그보다 작은 값은 2 로).
|
|
349
362
|
*
|
|
350
363
|
* CSS 로 덮고 싶으면 `.manager-bar-chart-bar`·`-stack` 의 `--bar-width` 를 쓴다 —
|
|
351
364
|
* 굵기는 인라인이 아니라 그 변수로 박혀 있다.
|
|
@@ -361,7 +374,7 @@ export declare interface BarChartProps {
|
|
|
361
374
|
/** 계열 A/B 레이블 i18n 키. labelBKey 미지정 시 단일 계열 */
|
|
362
375
|
labelAKey: string;
|
|
363
376
|
labelBKey?: string;
|
|
364
|
-
/** 선택된 구간의 합계(a+b)를 헤더 아래 히어로로
|
|
377
|
+
/** 선택된 구간의 합계(a+b)를 헤더 아래 히어로로 표시. 월 보기는 그 달 날짜만 센다(주 막대가 달 경계를 넘어도 합계는 달력 달 — 상세 목록과 같은 범위) */
|
|
365
378
|
showTotal?: boolean;
|
|
366
379
|
/** 합계 단위 i18n 키 (예: 'trainingStatus.weekly.unit' → '회') */
|
|
367
380
|
totalUnitKey?: string;
|
|
@@ -432,7 +445,10 @@ declare type Base = {
|
|
|
432
445
|
|
|
433
446
|
/**
|
|
434
447
|
* 게시판형 목록 표. 상태를 갖지 않는 표현 컴포넌트이므로 검색·페이지네이션은
|
|
435
|
-
* `toolbar`로 주입하고 필터링된 `rows`를 넘긴다.
|
|
448
|
+
* `toolbar`로 주입하고 필터링된 `rows`를 넘긴다.
|
|
449
|
+
*
|
|
450
|
+
* 기본 빈 문구는 i18n(`board.empty`)을 따른다 — 전에는 한국어가 박혀 영어 화면에서도 한국어였다. 그래서 i18n 훅을 쓰는
|
|
451
|
+
* 클라이언트 컴포넌트('use client')다(서버 렌더링(SSR)은 그대로 된다).
|
|
436
452
|
* @public
|
|
437
453
|
*/
|
|
438
454
|
export declare function Board<T>({ columns, rows, rowKey, title, toolbar, empty, loading, caption, className, }: BoardProps<T>): JSX.Element;
|
|
@@ -461,7 +477,7 @@ export declare interface BoardProps<T> {
|
|
|
461
477
|
title?: ReactNode;
|
|
462
478
|
/** 우측 상단 영역 — 검색 입력 등. 상태는 소비자가 소유한다 */
|
|
463
479
|
toolbar?: ReactNode;
|
|
464
|
-
/** rows가 비었을 때 표시할
|
|
480
|
+
/** rows가 비었을 때 표시할 내용. 기본은 i18n `board.empty`(ko '등록된 항목이 없습니다.') */
|
|
465
481
|
empty?: ReactNode;
|
|
466
482
|
/** 로딩 중 표시할 내용 — 지정 시 rows 대신 렌더 */
|
|
467
483
|
loading?: ReactNode;
|
|
@@ -500,13 +516,24 @@ export declare function BrandIdentity({ appMode }: {
|
|
|
500
516
|
appMode?: 'malgwi' | 'manager';
|
|
501
517
|
}): JSX.Element;
|
|
502
518
|
|
|
503
|
-
/**
|
|
519
|
+
/**
|
|
520
|
+
* 이동 경로. 마지막 항목은 지금 쪽(`aria-current="page"`, 누를 수 없는 글자 — onClick·href 무시).
|
|
521
|
+
* 앞 항목은 `href` 가 있으면 링크, `onClick` 만 있으면 단추, 둘 다 없으면 글자다.
|
|
522
|
+
* @public
|
|
523
|
+
*/
|
|
504
524
|
export declare function Breadcrumb({ items, className }: BreadcrumbProps): JSX.Element;
|
|
505
525
|
|
|
506
526
|
/** @public */
|
|
507
527
|
export declare interface BreadcrumbItem {
|
|
508
528
|
label: string;
|
|
529
|
+
/** 누르면 부른다 — 주면 단추(`href` 도 주면 링크에 건다). 마지막 항목(지금 쪽)에서는 무시한다. */
|
|
509
530
|
onClick?: () => void;
|
|
531
|
+
/** 주면 링크(`<a>`)로 그린다. 마지막 항목(지금 쪽)에서는 무시한다. `onClick`·`href` 가 둘 다 없는 중간 항목은 누를 수 없는 글자다. */
|
|
532
|
+
href?: string;
|
|
533
|
+
/** 선택. 링크의 target(`href` 와 함께). */
|
|
534
|
+
target?: string;
|
|
535
|
+
/** 선택. 링크의 rel. `target="_blank"` 이고 안 주면 `noopener noreferrer`. */
|
|
536
|
+
rel?: string;
|
|
510
537
|
}
|
|
511
538
|
|
|
512
539
|
/** @public */
|
|
@@ -524,7 +551,8 @@ export declare function buildChangeWholeSyllableProblem(word: string, compFrom:
|
|
|
524
551
|
|
|
525
552
|
/**
|
|
526
553
|
* @public 합성어 부분 탈락 → [문제단어(합성어), 남는 실단어(정답), 그 단어의 대립쌍 실단어 오답 2].
|
|
527
|
-
* 합성어 근사: 앞/뒤로 나눈 두 조각이 '둘 다 실단어'(wordSet)
|
|
554
|
+
* 합성어 근사: 앞/뒤로 나눈 두 조각이 '둘 다 실단어'(wordSet)이고 **적어도 한 조각이 2음절 이상**인 조합을 채택(예: 손수건=손+수건).
|
|
555
|
+
* 1음절 조각 둘(하품=하+품)은 합성어로 보지 않는다 — 그래서 2음절 낱말은 늘 null.
|
|
528
556
|
* 정답·오답 전부 실단어라 발음이 그대로. comp(훈련음소) 지정 시 남는 단어의 그 자리를 대립, 없으면 전 음절.
|
|
529
557
|
* dropPos: 0=어두 어근(앞) 탈락, 1=어말 어근(뒤) 탈락. 결과의 `dropped` 에 뺀 조각을 담는다. 편집기·런타임 공용.
|
|
530
558
|
*/
|
|
@@ -679,8 +707,17 @@ export declare interface BulkBarProps {
|
|
|
679
707
|
*/
|
|
680
708
|
export declare function bulkSetImageExistence(entries: Record<string, boolean>): void;
|
|
681
709
|
|
|
682
|
-
|
|
683
|
-
|
|
710
|
+
export declare const Button: ButtonComponent;
|
|
711
|
+
|
|
712
|
+
/**
|
|
713
|
+
* 단추(또는 `href` 가 있으면 링크). `ref` 를 주면 그 요소(`HTMLButtonElement`, 링크면 `HTMLAnchorElement`)에 닿는다 —
|
|
714
|
+
* forwardRef 라 React 16.8~18 에서도 된다.
|
|
715
|
+
* @public
|
|
716
|
+
*/
|
|
717
|
+
declare type ButtonComponent = {
|
|
718
|
+
(props: ButtonProps & RefAttributes<HTMLButtonElement | HTMLAnchorElement>): ReactElement | null;
|
|
719
|
+
displayName?: string;
|
|
720
|
+
};
|
|
684
721
|
|
|
685
722
|
declare type ButtonItem = {
|
|
686
723
|
label: ReactNode;
|
|
@@ -749,6 +786,14 @@ export declare interface ButtonProps {
|
|
|
749
786
|
align?: 'center' | 'left' | 'right' | 'grid';
|
|
750
787
|
selected?: boolean;
|
|
751
788
|
toggleable?: boolean;
|
|
789
|
+
/**
|
|
790
|
+
* 여닫이 단추(설정 판·미리보기·유의사항 펼치기)의 열림 상태. 주면 `aria-expanded` 로 알리고 **`aria-pressed` 는 달지 않는다** —
|
|
791
|
+
* `selected={열림}` 만 주면 "눌림" 으로 읽혀 무엇이 열렸는지 알 수 없었다. 켜진 모양(`is-selected`)은 `selected` 로 따로 준다.
|
|
792
|
+
* @example <Button label="훈련 설정" selected={open} ariaExpanded={open} ariaControls={panelId} />
|
|
793
|
+
*/
|
|
794
|
+
ariaExpanded?: boolean;
|
|
795
|
+
/** 이 단추가 여닫는 영역의 id — `aria-controls` 로 단다(`ariaExpanded` 와 함께 쓴다) */
|
|
796
|
+
ariaControls?: string;
|
|
752
797
|
disabled?: boolean;
|
|
753
798
|
/** label을 숨기려면 false로 설정 */
|
|
754
799
|
useLabel?: boolean;
|
|
@@ -824,7 +869,7 @@ export declare const CACHE_GROUPS: readonly [{
|
|
|
824
869
|
export declare type CacheGroupId = typeof CACHE_GROUPS[number]['id'];
|
|
825
870
|
|
|
826
871
|
/** @public */
|
|
827
|
-
export declare function Calendar({ visits, onVisitClick, onVisitMove, onDayClick, }: {
|
|
872
|
+
export declare function Calendar({ visits, onVisitClick, onVisitMove, onDayClick, today, }: {
|
|
828
873
|
visits?: Visit[];
|
|
829
874
|
onVisitClick?: (visit: Visit) => void;
|
|
830
875
|
onVisitMove?: (visitId: string | number, newDate: string) => void;
|
|
@@ -833,6 +878,11 @@ export declare function Calendar({ visits, onVisitClick, onVisitMove, onDayClick
|
|
|
833
878
|
* 주지 않으면 칸은 눌리지 않고 손 모양도 뜨지 않는다(못 하는 일을 내밀지 않는다).
|
|
834
879
|
*/
|
|
835
880
|
onDayClick?: (date: string) => void;
|
|
881
|
+
/**
|
|
882
|
+
* 선택. '오늘' 로 쓸 날 'YYYY-MM-DD' — 처음 여는 달과 오늘 표시가 이 날을 따른다.
|
|
883
|
+
* 로컬 앱·SSR 처럼 부르는 쪽이 오늘을 정하는 자리에서 넘긴다. 없거나 꼴이 틀리면 KST 오늘(기본).
|
|
884
|
+
*/
|
|
885
|
+
today?: string;
|
|
836
886
|
}): JSX.Element;
|
|
837
887
|
|
|
838
888
|
/** 카테고리별 capability 메타 + 소속 그룹. group은 유형↔카드 스텝 계열 판정의 단일 소스. */
|
|
@@ -855,6 +905,19 @@ export declare function cardQuestionTitle(typeKey: string | undefined, item: Rec
|
|
|
855
905
|
/** @public */
|
|
856
906
|
export declare function CardStep({ _stepIndex, _totalSteps, ...rest }: StepWrapperProps): JSX.Element;
|
|
857
907
|
|
|
908
|
+
/**
|
|
909
|
+
* 한 칸의 낱말들을 **동형어 번호까지** 한 줄로 — `배#2 / 패`. 번호가 없는 낱말은 {@link cellLabel} 과 같다.
|
|
910
|
+
*
|
|
911
|
+
* 채점과 함께 저장하는 칸 낱말(`labelsForSave` 에 넘길 것)로 쓰면 `weakItems` 가 '배'(1)·'배'(2) 를 따로 센다.
|
|
912
|
+
* 글자만(`cellLabel`) 저장하면 둘의 성적이 한 줄로 합쳐진다. 화면에 보일 글자는 {@link labelOfCellKey} 로 되돌린다.
|
|
913
|
+
*
|
|
914
|
+
* @public
|
|
915
|
+
*/
|
|
916
|
+
export declare function cellKey(words: readonly {
|
|
917
|
+
label: string;
|
|
918
|
+
homonum?: number | null;
|
|
919
|
+
}[]): string;
|
|
920
|
+
|
|
858
921
|
/** 한 칸의 낱말들을 한 줄로 — 대립쌍은 `가게 / 가재`. */
|
|
859
922
|
export declare function cellLabel(words: readonly {
|
|
860
923
|
label: string;
|
|
@@ -1254,15 +1317,24 @@ export declare interface ConfirmPopupProps {
|
|
|
1254
1317
|
};
|
|
1255
1318
|
/**
|
|
1256
1319
|
* 확인 클릭 시 실행. `close`로 직접 닫을 수 있음(async 지원).
|
|
1257
|
-
* 기본은 onConfirm 완료 후 자동으로 닫힘(closeOnConfirm)
|
|
1320
|
+
* 기본은 onConfirm 완료 후 자동으로 닫힘(closeOnConfirm) — **닫히면 onClose 도 불린다**(확인으로 닫혀도).
|
|
1321
|
+
* 받은 `close()` 를 부르면 그것도 닫힘으로 센다(닫히는 동안 잠금 유지).
|
|
1258
1322
|
* 던지거나 거절되면 창이 남고 잠금이 풀린다 — 거절은 console.error 로 받는다.
|
|
1259
1323
|
* 안에서 부모가 창을 치우면 그 뒤 onClose 는 불리지 않는다.
|
|
1260
1324
|
*/
|
|
1261
1325
|
onConfirm: (close: () => void) => void | Promise<void>;
|
|
1262
1326
|
/** false면 자동으로 닫지 않음 — onConfirm이 전달받은 close로 닫힘 시점을 제어 (성공 시에만 닫기 등). 기본 true */
|
|
1263
1327
|
closeOnConfirm?: boolean;
|
|
1264
|
-
/**
|
|
1328
|
+
/**
|
|
1329
|
+
* 창이 닫힌 뒤 호출(보통 열림 상태 끄기). 취소·X·ESC·바탕으로 닫을 때뿐 아니라 **확인(또는 곁 단추)으로 닫힐 때도 불린다** —
|
|
1330
|
+
* 확인 뒤의 일은 onConfirm 에서 하고, 여기서는 "창이 사라졌다" 만 처리한다. 확인과 취소를 가르려면 onConfirm 에서 표시해 둔다.
|
|
1331
|
+
*/
|
|
1265
1332
|
onClose: () => void;
|
|
1333
|
+
/**
|
|
1334
|
+
* 선택. 열릴 때 포커스를 둘 단추 — `'close'`(머리의 X, 기본·지금 동작) · `'confirm'`(확인) · `'cancel'`(취소).
|
|
1335
|
+
* 되돌릴 수 없는 일(삭제)은 기본이나 `'cancel'` 로 두어 Enter 한 번에 실행되지 않게 한다. 그 단추가 없거나 꺼져 있으면 기본 자리.
|
|
1336
|
+
*/
|
|
1337
|
+
initialFocus?: 'close' | 'confirm' | 'cancel';
|
|
1266
1338
|
/** portal 없이 부모 컨테이너에 제자리 렌더 (목업/데모용) */
|
|
1267
1339
|
inline?: boolean;
|
|
1268
1340
|
/** 패널 최대 가로폭. 확인창 기본은 'small'(480px) */
|
|
@@ -1284,7 +1356,7 @@ export declare interface ContrastFilterOpts {
|
|
|
1284
1356
|
pronOf: (w: string) => string;
|
|
1285
1357
|
/** 표준발음 문자열 → 음절 분해(캐시 권장). sameStructureOnly일 때만 필요. */
|
|
1286
1358
|
decompOf?: (pron: string) => Decomp;
|
|
1287
|
-
/** true면 구조 대립(초성 ㅇ
|
|
1359
|
+
/** true면 구조 대립(초성 ㅇ 유무·활음 유무·종류·받침 유무)도 제외(decompOf 필요). */
|
|
1288
1360
|
sameStructureOnly?: boolean;
|
|
1289
1361
|
}
|
|
1290
1362
|
|
|
@@ -1388,7 +1460,7 @@ export declare function copyText(text: string): Promise<boolean>;
|
|
|
1388
1460
|
*
|
|
1389
1461
|
* 값은 손으로 적고 `test/coreVersion.test.ts` 가 package.json 과 어긋나면 운다.
|
|
1390
1462
|
*/
|
|
1391
|
-
export declare const CORE_VERSION = "0.
|
|
1463
|
+
export declare const CORE_VERSION = "0.151.0";
|
|
1392
1464
|
|
|
1393
1465
|
/** @public */
|
|
1394
1466
|
declare const coreDefault: Record<string, unknown>;
|
|
@@ -1590,7 +1662,7 @@ export declare function cx(...parts: (string | false | null | undefined)[]): str
|
|
|
1590
1662
|
|
|
1591
1663
|
export declare type DataLevel = 0 | 1 | 2 | 3;
|
|
1592
1664
|
|
|
1593
|
-
export declare function DatePicker({ value, onChange, size, min, max, disabled, placeholder: placeholderProp, className, }: DatePickerProps): JSX.Element;
|
|
1665
|
+
export declare function DatePicker({ value, onChange, size, min, max, disabled, placeholder: placeholderProp, className, today, }: DatePickerProps): JSX.Element;
|
|
1594
1666
|
|
|
1595
1667
|
/** @public */
|
|
1596
1668
|
export declare interface DatePickerProps {
|
|
@@ -1603,6 +1675,12 @@ export declare interface DatePickerProps {
|
|
|
1603
1675
|
/** 값이 없을 때 보이는 문구. 기본은 사전의 `datePicker.chooseDate`('날짜 선택') */
|
|
1604
1676
|
placeholder?: string;
|
|
1605
1677
|
className?: string;
|
|
1678
|
+
/**
|
|
1679
|
+
* 선택. '오늘' 로 쓸 날 'YYYY-MM-DD' — 오늘 표시, 값 없이 열 때의 달·포커스가 이 날을 따른다.
|
|
1680
|
+
* 로컬 앱·SSR 처럼 부르는 쪽이 오늘을 정하는 자리에서 넘긴다. 없거나 꼴이 틀리면 KST 오늘(기본).
|
|
1681
|
+
* (min·max 는 이 값과 따로다 — '오늘부터' 를 막으려면 min 에도 같은 날을 넘긴다.)
|
|
1682
|
+
*/
|
|
1683
|
+
today?: string;
|
|
1606
1684
|
}
|
|
1607
1685
|
|
|
1608
1686
|
/**
|
|
@@ -1800,7 +1878,8 @@ export declare const DocumentTitleSuppressContext: Context<boolean>;
|
|
|
1800
1878
|
|
|
1801
1879
|
/**
|
|
1802
1880
|
* 브라우저에서 CSV 파일을 내려받게 한다. 앞에 BOM 을 붙인다 — 없으면 엑셀이 한글을
|
|
1803
|
-
* 깨뜨린다.
|
|
1881
|
+
* 깨뜨린다. **이미 BOM 으로 시작하는 글에는 또 붙이지 않는다**(두 번 붙으면 엑셀 첫 칸 머리에 보이지 않는 글자가 낀다).
|
|
1882
|
+
* Blob 주소는 누르고 조금 뒤에 회수한다.
|
|
1804
1883
|
*/
|
|
1805
1884
|
export declare function downloadCsvText(filename: string, csv: string): void;
|
|
1806
1885
|
|
|
@@ -1860,6 +1939,7 @@ export declare interface DropdownOption {
|
|
|
1860
1939
|
export declare interface DropdownProps {
|
|
1861
1940
|
options: DropdownOption[];
|
|
1862
1941
|
value?: string;
|
|
1942
|
+
/** 고른 값으로 불린다. **값이 바뀔 때만** — 이미 고른 항목을 다시 고르면 부르지 않고 메뉴만 닫는다. */
|
|
1863
1943
|
onChange?: (value: string) => void;
|
|
1864
1944
|
placeholder?: string;
|
|
1865
1945
|
disabled?: boolean;
|
|
@@ -1902,9 +1982,20 @@ export declare function EffectPartyPopper({ active, count, duration, strength, /
|
|
|
1902
1982
|
trigger?: number;
|
|
1903
1983
|
}): JSX.Element | null;
|
|
1904
1984
|
|
|
1905
|
-
/**
|
|
1985
|
+
/**
|
|
1986
|
+
* @public 앱에 한 번 붙여 두는 폭죽 자리.
|
|
1987
|
+
*
|
|
1988
|
+
* - `active`·`trigger` 를 주면 그대로 `EffectPartyPopper` 에 넘긴다(전과 같다).
|
|
1989
|
+
* - **`window` 의 `party:trigger` 이벤트를 듣는다** — `TrainingResultPopup` 이 정답률 50% 초과일 때 보낸다.
|
|
1990
|
+
* `detail` 의 `count`·`strength`·`duration` 으로 한 번 터뜨리고, 다 사라지면 걷는다. 전에는 아무도 이 이벤트를
|
|
1991
|
+
* 안 들어 결과 창의 폭죽이 한 번도 안 났다. 움직임 최소화(prefers-reduced-motion: reduce)면
|
|
1992
|
+
* `EffectPartyPopper` 가 그리지 않는다. 보내는 쪽이 한 틱 미뤄 보내 StrictMode 에서도 한 번만 온다.
|
|
1993
|
+
* - 이 자리가 앱에 없으면 이벤트는 아무 일도 안 한다.
|
|
1994
|
+
*/
|
|
1906
1995
|
export declare function EffectPartyPopperHost({ trigger, active }: {
|
|
1996
|
+
/** 값이 바뀌면 다시 터진다 — EffectPartyPopper 에 그대로 넘긴다. */
|
|
1907
1997
|
trigger?: number;
|
|
1998
|
+
/** true 인 동안 그린다 — EffectPartyPopper 에 그대로 넘긴다. 이벤트로 터지는 폭죽과는 따로다. */
|
|
1908
1999
|
active?: boolean;
|
|
1909
2000
|
}): JSX.Element;
|
|
1910
2001
|
|
|
@@ -1921,10 +2012,14 @@ export declare interface EmptyStateProps {
|
|
|
1921
2012
|
message?: string;
|
|
1922
2013
|
/** 메시지 아래 보조 안내(선택). message와 별도 문단으로 렌더 — 문자열 접합 오용 방지. */
|
|
1923
2014
|
hint?: string;
|
|
2015
|
+
/**
|
|
2016
|
+
* 메시지 아래 단추(다시 시도 등). `onClick` 이 **약속(Promise)을 돌려주면 끝날 때까지(성공·실패 모두) 단추를 막는다** —
|
|
2017
|
+
* 두 번 눌러 요청이 두 번 나가지 않게.
|
|
2018
|
+
*/
|
|
1924
2019
|
action?: {
|
|
1925
2020
|
label: string;
|
|
1926
2021
|
icon?: string;
|
|
1927
|
-
onClick: () => void
|
|
2022
|
+
onClick: () => void | Promise<unknown>;
|
|
1928
2023
|
};
|
|
1929
2024
|
/** 표 안의 빈 행처럼 좁은 자리에 넣을 때 위아래 여백을 줄인다. */
|
|
1930
2025
|
compact?: boolean;
|
|
@@ -1948,8 +2043,11 @@ export declare interface ErrorStateProps {
|
|
|
1948
2043
|
/** 보조 안내(선택). */
|
|
1949
2044
|
hint?: string;
|
|
1950
2045
|
icon?: string;
|
|
1951
|
-
/**
|
|
1952
|
-
|
|
2046
|
+
/**
|
|
2047
|
+
* 다시 시도 콜백 — 지정 시 '다시 시도' 버튼 노출.
|
|
2048
|
+
* **약속(Promise)을 돌려주면 끝날 때까지(성공·실패 모두) 단추를 막는다** — 느린 다시 불러오기에서 두 번 눌러 요청이 두 번 나가지 않게.
|
|
2049
|
+
*/
|
|
2050
|
+
onRetry?: () => void | Promise<unknown>;
|
|
1953
2051
|
/** 재시도 버튼 라벨(미지정 시 공용 기본). */
|
|
1954
2052
|
retryLabel?: string;
|
|
1955
2053
|
className?: string;
|
|
@@ -1966,7 +2064,11 @@ export declare interface ErrorStateProps {
|
|
|
1966
2064
|
* 뒤 열이 통째로 밀린다.
|
|
1967
2065
|
* 2. **수식으로 실행되지 않게.** `=`·`+`·`-`·`@` 로 시작하는 값을 엑셀·시트가 수식으로
|
|
1968
2066
|
* 실행한다(CSV Injection). 탭이나 CR 로 시작하는 경우도 파서가 앞의 공백문자를 버리고
|
|
1969
|
-
* 그다음 글자를 첫 글자로 읽으므로 같은 결과가
|
|
2067
|
+
* 그다음 글자를 첫 글자로 읽으므로 같은 결과가 된다. 앞에 **작은따옴표 `'`** 를 세운다(OWASP 권고) —
|
|
2068
|
+
* 전에는 탭을 세웠는데, 탭도 앞 공백으로 버리는 판에서는 수식이 그대로 살아났다.
|
|
2069
|
+
*
|
|
2070
|
+
* 선행 0(`007`·`010-…`)은 건드리지 않는다(결정 2026-09-15) — 엑셀이 숫자로 읽어 0 을 떼는 것은 여는 쪽의 일이고,
|
|
2071
|
+
* 여기서 글자로 박으면 그 값을 다시 읽는 프로그램이 따옴표를 떠안는다.
|
|
1970
2072
|
*
|
|
1971
2073
|
* 이 규칙이 두 군데에 따로 적혀 있었고, 고객 목록 쪽 사본이 `\r` 둘 다를 빠뜨린 채
|
|
1972
2074
|
* "어드민과 동일한 규칙"이라고 주석까지 달고 있었다.
|
|
@@ -1996,7 +2098,15 @@ export declare function FileUpload({ onFilesSelected, accept, multiple, disabled
|
|
|
1996
2098
|
|
|
1997
2099
|
/** @public */
|
|
1998
2100
|
export declare interface FileUploadProps {
|
|
1999
|
-
/**
|
|
2101
|
+
/**
|
|
2102
|
+
* 파일 선택(드래그·드롭·클릭) 시 호출 — 업로드/네트워크는 호출부 책임. accept·multiple 로 거른 뒤 부른다.
|
|
2103
|
+
*
|
|
2104
|
+
* - **비제어(`files` 없음)**: 늘 **지금 보이는 전체 목록**을 넘긴다 — multiple 이면 앞서 고른 것 + 새로 고른 것,
|
|
2105
|
+
* 아니면 새로 고른 하나. `onRemove` 가 없으면 목록에서 뺄 때도 줄어든 전체 목록으로 부른다.
|
|
2106
|
+
* - **제어(`files` 줌)**: **새로 고른 것만** 넘긴다 — 목록에 합치는 일은 부모가 한다(뺄 때는 `onRemove`).
|
|
2107
|
+
*
|
|
2108
|
+
* 이 함수가 던져도 같은 파일을 다시 고를 수 있다(입력 값은 늘 비운다).
|
|
2109
|
+
*/
|
|
2000
2110
|
onFilesSelected?: (files: File[]) => void;
|
|
2001
2111
|
/** input accept 속성 (예: "image/*", ".pdf,.docx") */
|
|
2002
2112
|
accept?: string;
|
|
@@ -2239,6 +2349,7 @@ export declare function formatPhone(raw: string): string;
|
|
|
2239
2349
|
|
|
2240
2350
|
/**
|
|
2241
2351
|
* ISO 문자열을 'store.time.*' i18n 키 기반 상대시간 문자열로 변환.
|
|
2352
|
+
* 시간대 없는 시각 글자는 KST 벽시계 시각으로 읽는다.
|
|
2242
2353
|
* (예: 방금 전 / N분 전 / N시간 전 / N일 전 …)
|
|
2243
2354
|
* 빈/유효하지 않은 입력은 빈 문자열을 반환한다.
|
|
2244
2355
|
*/
|
|
@@ -2456,7 +2567,9 @@ export declare const hasSel: (v: string | string[] | null | undefined) => boolea
|
|
|
2456
2567
|
* 두 (표준발음) 분해배열 A·B가 '음절 구조'에서 달라지는 자리가 있는지.
|
|
2457
2568
|
* 초성 ㅇ(무음)은 '초성 없음', 종성 0은 '받침 없음'(둘 다 구조상 '비움')으로 본다.
|
|
2458
2569
|
* 어떤 자리에서 초성 ㅇ 유무 또는 받침 유무가 뒤바뀌면, 자음 '교체'가 아니라 음절 '구조' 차이이므로
|
|
2459
|
-
* 청각 변별 오답으로 부적절 → true(제외 대상).
|
|
2570
|
+
* 청각 변별 오답으로 부적절 → true(제외 대상). 자음↔자음 교체는 false.
|
|
2571
|
+
* 모음은 **활음이 갈리면**(ㅏ↔ㅘ·ㅐ↔ㅙ·ㅑ↔ㅘ) 구조 차이, 활음이 같으면(ㅏ↔ㅓ·ㅑ↔ㅕ) 모음 교체라 false —
|
|
2572
|
+
* 대립쌍 표('음소 구조 같은 단어만', phonemePairSearch)와 같은 함수(vowelGlidesDiffer)로 판정한다.
|
|
2460
2573
|
*/
|
|
2461
2574
|
export declare function hasStructureContrast(A: Decomp, B: Decomp): boolean;
|
|
2462
2575
|
|
|
@@ -2546,6 +2659,7 @@ export declare interface IconProps {
|
|
|
2546
2659
|
* 아이콘 이름(lucide 이름 또는 파일 경로), 또는 그려 넣을 노드.
|
|
2547
2660
|
*
|
|
2548
2661
|
* 이름은 `icon` 이다 — `name` 이 아니다. 주지 않으면 아무것도 그리지 않는다.
|
|
2662
|
+
* `.svg` 경로는 파일 이름이 lucide 이름이면 lucide 로 그린다(`'/images/brand/check.svg'` → lucide `check`, 의도한 동작 — useLucideIcon 참고).
|
|
2549
2663
|
*/
|
|
2550
2664
|
icon?: ReactNode | string;
|
|
2551
2665
|
label?: ReactNode;
|
|
@@ -2573,7 +2687,7 @@ export declare interface IconProps {
|
|
|
2573
2687
|
svgClassName?: string;
|
|
2574
2688
|
/** 감싸는 `<span>` 의 인라인 스타일. */
|
|
2575
2689
|
wrapperStyle?: CSSProperties;
|
|
2576
|
-
/** 한 변 픽셀. 크기는 클래스가 아니라 이것으로 정한다. */
|
|
2690
|
+
/** 한 변 픽셀. 크기는 클래스가 아니라 이것으로 정한다. lucide·마스크·이미지(파일 경로) 모두에 적용된다. */
|
|
2577
2691
|
size?: number;
|
|
2578
2692
|
}
|
|
2579
2693
|
|
|
@@ -2683,6 +2797,13 @@ export declare const JUNGSEONG: readonly ["ㅏ", "ㅐ", "ㅑ", "ㅒ", "ㅓ", "
|
|
|
2683
2797
|
*/
|
|
2684
2798
|
export declare function kstStartOfDay(year: number, month0: number, day: number): Date;
|
|
2685
2799
|
|
|
2800
|
+
/**
|
|
2801
|
+
* {@link cellKey} 로 만든 칸 낱말에서 동형어 번호를 뗀 보이는 글자 — `배#2 / 패` → `배 / 패`. 번호가 없으면 그대로.
|
|
2802
|
+
*
|
|
2803
|
+
* @public
|
|
2804
|
+
*/
|
|
2805
|
+
export declare function labelOfCellKey(key: string): string;
|
|
2806
|
+
|
|
2686
2807
|
/**
|
|
2687
2808
|
* 칸 번호 → 그때 보인 낱말. 채점과 **함께 저장한다.**
|
|
2688
2809
|
*
|
|
@@ -2829,7 +2950,11 @@ export declare interface LoaderProps {
|
|
|
2829
2950
|
variant?: 'spinner' | 'bar';
|
|
2830
2951
|
/** 스피너 크기(px 또는 CSS 값). `variant='spinner'`일 때 적용됩니다. */
|
|
2831
2952
|
size?: number | string;
|
|
2832
|
-
/**
|
|
2953
|
+
/**
|
|
2954
|
+
* 진행률(0–100). `variant='bar'`일 때 적용됩니다.
|
|
2955
|
+
* 주지 않거나 `null` 이면 **얼마나 됐는지 모르는(indeterminate)** 막대 — 짧은 채움이 오가고, 낭독기에는 값(aria-valuenow) 없이
|
|
2956
|
+
* "진행 중" 으로만 알린다('동작 줄이기' 에서는 움직이지 않는 전체 폭 막대).
|
|
2957
|
+
*/
|
|
2833
2958
|
progress?: number | null;
|
|
2834
2959
|
/** 접근성 이름(aria-label). 화면에 글자로 나오지는 않는다. 안 주면 i18n 의 `loader.loading`(기본 'Loading'). */
|
|
2835
2960
|
label?: string;
|
|
@@ -3178,8 +3303,9 @@ export declare type NoisePlayerContextValue = {
|
|
|
3178
3303
|
|
|
3179
3304
|
/**
|
|
3180
3305
|
* @public 설정의 소음 비율(배). `noiseRatio` 가 있으면 그것(0~2 로 자름), 없으면 **옛 값에서
|
|
3181
|
-
* 들리던 그대로** 옮긴다 — (level/9) ÷ mainVolume 을 0~2 로
|
|
3182
|
-
*
|
|
3306
|
+
* 들리던 그대로** 옮긴다 — (level/9) ÷ mainVolume 을 **반올림 없이** 0.1~2 로 조인다(말귀 `noiseRatioOfPct` 와 같은 범위).
|
|
3307
|
+
* 전에는 0.1 칸으로 반올림해 옛 소리와 최대 0.05배 달라졌다(2026-09-15 결정). level 0(옛날에 소음이 안 들리던 기록)은
|
|
3308
|
+
* 0 그대로 — 0.1 로 올리면 없던 소음이 생긴다. mainVolume 이 0 이면 옛 값으로는 비율을 알 수 없어 1.
|
|
3183
3309
|
*/
|
|
3184
3310
|
export declare function noiseRatioOf(settings: Pick<CoreNoiseSettings, 'level' | 'mainVolume'> & {
|
|
3185
3311
|
noiseRatio?: number;
|
|
@@ -3189,11 +3315,14 @@ export declare function noiseRatioOf(settings: Pick<CoreNoiseSettings, 'level' |
|
|
|
3189
3315
|
export declare interface NoiseSettingsStore {
|
|
3190
3316
|
/** 현재 훈련 대상(본인 또는 고객)의 저장된 소음설정. 없으면 null. */
|
|
3191
3317
|
load: () => Promise<Partial<CoreNoiseSettings> | null>;
|
|
3192
|
-
/**
|
|
3318
|
+
/**
|
|
3319
|
+
* 현재 훈련 대상의 소음설정을 저장(fire-and-forget).
|
|
3320
|
+
* 훈련 팝업은 판 중 변경(슬라이더 끌기 등)을 **멈춘 뒤 300ms 에 마지막 값만** 넘기고, 떠날 때·pagehide 에 남은 값을 즉시 넘긴다.
|
|
3321
|
+
*/
|
|
3193
3322
|
save: (settings: CoreNoiseSettings) => Promise<void> | void;
|
|
3194
3323
|
/**
|
|
3195
3324
|
* **판에 실제로 걸린 설정**이 정해지거나 바뀔 때마다 부른다 — 저장 병합 직후,
|
|
3196
|
-
* `noiseOverride` 적용 직후, 판 중
|
|
3325
|
+
* `noiseOverride` 적용 직후, 판 중 변경마다(저장과 달리 기다리지 않는다). 선택.
|
|
3197
3326
|
*
|
|
3198
3327
|
* `save` 와 따로 두는 까닭: `noiseOverride` 가 걸린 판은 저장을 건너뛴다. 앱이 결과마다
|
|
3199
3328
|
* 그 판의 소음 조건을 함께 기록한다면 `save` 로는 그 값을 못 받는다 — 저장값으로
|
|
@@ -3224,10 +3353,17 @@ export declare interface NoiseSettingsTooltipProps {
|
|
|
3224
3353
|
* 그대로 잘랐는데(`2026-08-19T16:00:00Z` → `2026.08.19`), 그건 UTC 날짜라 KST 자정~
|
|
3225
3354
|
* 아침 아홉 시 사이의 값이 전부 하루 전으로 보였다. 이 함수를 쓰는 곳이 전부 그랬다 —
|
|
3226
3355
|
* 회원의 문의 등록일, 고객 등록일. 날짜만 있는 값(YYYY-MM-DD)은 시각이 없으니
|
|
3227
|
-
* 옮길 것도 없어 그대로 둔다.
|
|
3356
|
+
* 옮길 것도 없어 그대로 둔다. 시간대 없는 시각('2026-09-30 20:00:00')은 KST 벽시계 시각으로 읽는다.
|
|
3228
3357
|
*/
|
|
3229
3358
|
export declare function normalizeDate(input: string | null | undefined): string | undefined;
|
|
3230
3359
|
|
|
3360
|
+
/**
|
|
3361
|
+
* @public filterSelected 의 속성 섹션을 **지정한 언어(기본: 지금 언어)의 라벨**로 다시 적는다 — 다른 언어·옛 라벨로 저장된 구성을
|
|
3362
|
+
* 열 때, 언어가 바뀐 뒤 상태를 맞출 때 쓴다(칩이 꺼진 채로 보이던 것). 속성 밖의 섹션은 그대로 둔다. 같은 섹션이 두 언어로
|
|
3363
|
+
* 들어 있으면 합친다.
|
|
3364
|
+
*/
|
|
3365
|
+
export declare function normalizeWordAttributeFilter<T extends Record<string, unknown>>(selected: T, lng?: string): T;
|
|
3366
|
+
|
|
3231
3367
|
/** @public */
|
|
3232
3368
|
export declare function NoticeBox({ title, lines, notices, children, variant, dismissible, className, }: NoticeBoxProps): JSX.Element | null;
|
|
3233
3369
|
|
|
@@ -3249,7 +3385,7 @@ export declare interface NoticeBoxProps {
|
|
|
3249
3385
|
children?: ReactNode;
|
|
3250
3386
|
/** 스타일 변형. `'default'` | `'dashed'` | `'important'` */
|
|
3251
3387
|
variant?: 'default' | 'dashed' | 'important' | string;
|
|
3252
|
-
/** 닫기(×) 버튼 표시 여부 */
|
|
3388
|
+
/** 닫기(×) 버튼 표시 여부 — `notices` 모드에서도 상자 전체를 닫는다 */
|
|
3253
3389
|
dismissible?: boolean;
|
|
3254
3390
|
className?: string;
|
|
3255
3391
|
}
|
|
@@ -3614,7 +3750,7 @@ export declare const PASS_CARD_BG_VARS: {
|
|
|
3614
3750
|
};
|
|
3615
3751
|
|
|
3616
3752
|
/** @public */
|
|
3617
|
-
export declare function PassCard({ product, showPrice, plan, type, endDate, remainingSeconds, state, bg, bgOnly, textColor, subColor, copyrightColor, logoSrc, label, price, originalPrice, discountLabel, onUse, onRefund, onDelete }: PassCardProps): JSX.Element;
|
|
3753
|
+
export declare function PassCard({ product, showPrice, plan, type, endDate, remainingSeconds, endInclusive, state, bg, bgOnly, textColor, subColor, copyrightColor, logoSrc, label, price, originalPrice, discountLabel, onUse, onRefund, onDelete }: PassCardProps): JSX.Element;
|
|
3618
3754
|
|
|
3619
3755
|
/** @public */
|
|
3620
3756
|
export declare function PassCardBg({ variant }: PassCardBgProps): JSX.Element;
|
|
@@ -3701,7 +3837,7 @@ export declare interface PassCardProduct {
|
|
|
3701
3837
|
name?: string;
|
|
3702
3838
|
/** 기간(일). 지정 시 code/name보다 우선. */
|
|
3703
3839
|
durationDays?: number;
|
|
3704
|
-
/** 가격. 숫자(원 단위) 또는 이미 포맷된
|
|
3840
|
+
/** 가격. 숫자(원 단위) 또는 문자열 — 숫자만 든 문자열('12000')은 '₩12,000' 으로, 이미 포맷된 글자('7,500원')는 '₩7,500' 으로. */
|
|
3705
3841
|
price?: string | number;
|
|
3706
3842
|
/** 원가(취소선). 숫자(원 단위) 또는 문자열. */
|
|
3707
3843
|
originalPrice?: string | number;
|
|
@@ -3732,11 +3868,17 @@ export declare interface PassCardProps {
|
|
|
3732
3868
|
endDate?: string;
|
|
3733
3869
|
/**
|
|
3734
3870
|
* 전환으로 일시정지되어 남은 시간(초)이 알려진 경우에만 지정.
|
|
3735
|
-
* 지정하면 우측 하단에 "사용량%·남은 시간"을 이 값 기준으로
|
|
3871
|
+
* 지정하면 우측 하단에 "사용량%·남은 시간"을 이 값 기준으로 표시하고(`product` 가 없어 전체 기간을 모르면 남은 시간만),
|
|
3736
3872
|
* 지정 없이 state==='active'면 endDate에서 카드가 스스로 계산한다(pending인데
|
|
3737
3873
|
* 이 값도 없으면 = 한 번도 안 쓴 새 이용권 → 전체 기간이 그대로 남은 것으로 표시).
|
|
3738
3874
|
*/
|
|
3739
3875
|
remainingSeconds?: number;
|
|
3876
|
+
/**
|
|
3877
|
+
* 선택. true 면 종료일 **당일(KST)까지** 쓸 수 있는 이용권으로 보고 남은 날에 그 날을 넣는다 — 마지막 날이 "0초 남음·0%" 가
|
|
3878
|
+
* 아니라 "1일 남음" 이 된다(말귀 개인 이용권: 종료일까지 이용). 기본 false(종료일 0시에 끝나는 것으로 센다 — 지금 동작).
|
|
3879
|
+
* `endDate` 로 셀 때만 쓴다(`remainingSeconds` 를 주면 그 값 그대로).
|
|
3880
|
+
*/
|
|
3881
|
+
endInclusive?: boolean;
|
|
3740
3882
|
state?: PassCardState;
|
|
3741
3883
|
/** @deprecated 읽지 않는다 — 대기 순서는 카드에 그리지 않는다. 넘겨도 화면은 같다. */
|
|
3742
3884
|
queueIndex?: number;
|
|
@@ -3952,8 +4094,10 @@ export declare interface PhonemeSelectBlockProps {
|
|
|
3952
4094
|
onSearchEmpty?: () => void;
|
|
3953
4095
|
searchDisabled?: boolean;
|
|
3954
4096
|
searchLabel?: string;
|
|
4097
|
+
/** 검색 확인 중 — 검색 단추를 그대로 두고 스피너·aria-busy 로 알린다(누름은 막되 초점은 남는다). */
|
|
3955
4098
|
searchChecking?: boolean;
|
|
3956
4099
|
pairMode?: boolean;
|
|
4100
|
+
/** 머리의 "유의사항" 단추(툴팁). **기본 true** — 늘 보이던 단추를 지킨다. false 를 주면 숨는다. */
|
|
3957
4101
|
showInfoButton?: boolean;
|
|
3958
4102
|
/** 검색 버튼 바로 위에 표시할 내용(예: 현재 검색 조건 요약 Badge) */
|
|
3959
4103
|
beforeSearchContent?: ReactNode;
|
|
@@ -4154,6 +4298,14 @@ export declare interface PopupListProps<T extends {
|
|
|
4154
4298
|
|
|
4155
4299
|
/** @public */
|
|
4156
4300
|
export declare type PopupOptions = {
|
|
4301
|
+
/**
|
|
4302
|
+
* 닫힘 애니메이션(260ms, '동작 줄이기' 면 0)을 시작하고 끝나면 `cb` 를 부른다.
|
|
4303
|
+
*
|
|
4304
|
+
* **창이 그 사이 떠나도(부모가 치워도) `cb` 는 부른다** — `cb` 가 삭제·저장 확정일 수 있어서다(결정 2026-09-15).
|
|
4305
|
+
* 떠난 뒤에 부르면 곤란한 일(상태 되돌리기 등)은 `cb` 안에서 스스로 확인한다.
|
|
4306
|
+
* 닫기(X·ESC·바탕)의 `onClose` 는 이와 달리 떠나면 부르지 않는다.
|
|
4307
|
+
* `cb` 가 던지거나 돌려준 약속이 거절되면(또는 끝난 뒤에도 창이 남아 있으면) 창을 되살린다.
|
|
4308
|
+
*/
|
|
4157
4309
|
animateThen: (cb?: () => void) => void;
|
|
4158
4310
|
closeWithAnimation: () => void;
|
|
4159
4311
|
};
|
|
@@ -4274,6 +4426,10 @@ export declare function primarySelPart(comp: CompositionFilter | null): 'cho' |
|
|
|
4274
4426
|
/**
|
|
4275
4427
|
* 화면에 렌더된 단어표(.word-table)를 인쇄한다.
|
|
4276
4428
|
* @page 방향/크기를 임시 주입한 뒤 window.print()를 호출하고, 인쇄 후 정리한다.
|
|
4429
|
+
*
|
|
4430
|
+
* @deprecated WordTablePopup 의 `renderButtons` 가 넘기는 `print`(또는 `useWordTablePrint().print`)를 쓴다.
|
|
4431
|
+
* 이 함수는 앱 화면 전체를 인쇄하며 전역 print CSS 로 `.word-table` 만 남기는데, 화면에 표가 둘이면 둘 다 찍히고
|
|
4432
|
+
* 창·팝업 스타일이 섞인다 — 그쪽은 넘긴 표만 격리 iframe 에서 인쇄한다. 동작은 그대로 두고 개발 모드에서 한 번 알린다.
|
|
4277
4433
|
* @public
|
|
4278
4434
|
*/
|
|
4279
4435
|
export declare function printWordTable(orientation?: WordTableOrientation): void;
|
|
@@ -4372,11 +4528,13 @@ export declare interface ProgressIndicatorProps {
|
|
|
4372
4528
|
*/
|
|
4373
4529
|
variant?: 'numbered' | 'dot';
|
|
4374
4530
|
/**
|
|
4375
|
-
* 단계가 바뀔 때 낭독기가 스스로 알리게 한다(`role="status"`).
|
|
4531
|
+
* 단계가 바뀔 때 낭독기가 스스로 알리게 한다(`role="status"`). **모든 variant 에서** 된다.
|
|
4376
4532
|
*
|
|
4377
4533
|
* 기본은 알리지 않는다 — 점 모드는 그림에 가까워 `role="img"` + 이름표로
|
|
4378
4534
|
* 두는 편이 조용하다. 사용자가 넘기는 것이 아니라 화면이 저절로 넘어가는
|
|
4379
4535
|
* 자리(검사 안내)에서는 켜는 편이 낫다.
|
|
4536
|
+
* 점 모드는 뿌리가 알리는 자리가 되고, 번호·모바일 모드는 목록(`role="list"`)을 그대로 두고
|
|
4537
|
+
* 곁에 눈에 안 보이는 알리는 자리를 하나 둔다(목록 안에 두면 목록의 짜임이 깨진다).
|
|
4380
4538
|
*/
|
|
4381
4539
|
announce?: boolean;
|
|
4382
4540
|
/**
|
|
@@ -4390,7 +4548,10 @@ export declare interface ProgressIndicatorProps {
|
|
|
4390
4548
|
* 텍스트 테마(PromoBannerBgTheme)를 부모에 주입하므로 props 없이 렌더하면 된다. @public */
|
|
4391
4549
|
export declare const PROMO_BANNER_BG_COMPONENTS: Record<PromoBannerBgKey, ComponentType<Record<string, never>>>;
|
|
4392
4550
|
|
|
4393
|
-
/**
|
|
4551
|
+
/**
|
|
4552
|
+
* 배경 고르개 보기 목록. `label` 은 읽는 때의 i18n 언어를 따른다(`promoBannerBg.<key>`, ko 는 한국어 이름 그대로).
|
|
4553
|
+
* @public
|
|
4554
|
+
*/
|
|
4394
4555
|
export declare const PROMO_BANNER_BG_OPTIONS: PromoBannerBgOption[];
|
|
4395
4556
|
|
|
4396
4557
|
/** CSS 커스텀 프로퍼티 키 목록 */
|
|
@@ -4698,9 +4859,15 @@ export declare function Rating({ value, onChange, max, readOnly, size, ariaLabel
|
|
|
4698
4859
|
|
|
4699
4860
|
/** @public */
|
|
4700
4861
|
export declare interface RatingProps {
|
|
4701
|
-
/**
|
|
4862
|
+
/**
|
|
4863
|
+
* 현재 별점 (0 ~ max). 읽기 전용 모드에서는 소수점(예: 4.5)을 그대로 그린다.
|
|
4864
|
+
* 고르는 모드에서는 **가장 가까운 정수로 반올림해** 그리고 키보드도 그 값에서 옮긴다(3.4 → 별 셋).
|
|
4865
|
+
*/
|
|
4702
4866
|
value: number;
|
|
4703
|
-
/**
|
|
4867
|
+
/**
|
|
4868
|
+
* 값 변경 콜백. 생략 시 읽기 전용 모드로 동작.
|
|
4869
|
+
* **값이 바뀔 때만** 부른다 — 지금 값과 같은 별을 다시 누르거나 끝에서 화살표를 눌러 머물면 부르지 않는다.
|
|
4870
|
+
*/
|
|
4704
4871
|
onChange?: (value: number) => void;
|
|
4705
4872
|
/** 별 개수. 기본값 5 */
|
|
4706
4873
|
max?: number;
|
|
@@ -4797,7 +4964,8 @@ export declare interface ReportBlock {
|
|
|
4797
4964
|
/**
|
|
4798
4965
|
* 쪽을 나눌 때 한 덩어리로 다룰 묶음. 표 머리와 그 행들처럼 갈라지면 읽을 수
|
|
4799
4966
|
* 없는 것들에 같은 값을 준다 — 남은 자리가 모자라면 통째로 다음 장으로 간다.
|
|
4800
|
-
* 묶음 하나가 한 장보다 크면 어쩔 수 없이 블록 단위로
|
|
4967
|
+
* 묶음 하나가 한 장보다 크면 어쩔 수 없이 블록 단위로 쪼갠다 — 이때는 앞 장에 남은 자리부터 이어 채운다.
|
|
4968
|
+
* `section` 이 다르면 같은 값이어도 한 묶음이 아니다.
|
|
4801
4969
|
*/
|
|
4802
4970
|
group?: string;
|
|
4803
4971
|
}
|
|
@@ -4809,12 +4977,14 @@ export declare interface ReportBlock {
|
|
|
4809
4977
|
* 순서대로 채우다 넘치면 다음 장으로 넘긴다. 장마다 머리(제목 + 로고)와
|
|
4810
4978
|
* 바닥(로고·저작권 + 쪽 번호)이 반복된다.
|
|
4811
4979
|
*
|
|
4812
|
-
* 재는
|
|
4813
|
-
*
|
|
4814
|
-
*
|
|
4815
|
-
*
|
|
4816
|
-
*
|
|
4817
|
-
*
|
|
4980
|
+
* 다시 재는 때는 블록들의 `id`·`section`·`group` 구성이나 장 규격(`pageWidth`·`pageHeight`·`margin`)이 바뀔 때,
|
|
4981
|
+
* 처음 그릴 때(숨겨져 있다 보이게 될 때 포함), 그리고 **블록의 높이가 바뀔 때**다 — 재기 사본 블록마다
|
|
4982
|
+
* ResizeObserver 를 걸어 `content` 가 바뀌어 높이가 달라지거나 글꼴·이미지가 늦게 와 커지면 다시 나눈다
|
|
4983
|
+
* (여러 번 울려도 다음 틀(rAF)에 한 번). 렌더마다 재지는 않는다(재기 → 쪽 나눔 → 렌더가 끝없이 돈다).
|
|
4984
|
+
* ResizeObserver 가 없는 환경에서는 높이만 바뀐 것은 못 알아채므로 `key` 를 바꿔 새로 붙인다.
|
|
4985
|
+
*
|
|
4986
|
+
* 쪽 나눔: 블록을 순서대로 채우다 넘치면 다음 장. `group` 이 남은 자리에 안 들어가면 통째로 다음 장으로 가는데,
|
|
4987
|
+
* 묶음이 **한 장보다 크면** 어차피 쪼개야 하므로 앞 장에 남은 자리부터 이어 채운다.
|
|
4818
4988
|
*
|
|
4819
4989
|
* 화면에 그린 쪽 수는 다른 도구로 만든 PDF 와 다를 수 있다. 같은 내용을 그리는
|
|
4820
4990
|
* 높이가 서로 달라서인데, 쪽 수까지 맞춰야 하면 양쪽 본문 높이를 견줘야 한다.
|
|
@@ -4971,6 +5141,19 @@ export declare function resumeAudioMeter(): void;
|
|
|
4971
5141
|
*/
|
|
4972
5142
|
export declare function reviewCells<T>(items: readonly T[], marks: Record<string, ScoreMark | null | undefined>): T[];
|
|
4973
5143
|
|
|
5144
|
+
/**
|
|
5145
|
+
* 새로 만들 복습표에 **함께 저장할 메타** — 맨 처음 원본 표 id 와 이번이 몇 번째 복습인지.
|
|
5146
|
+
*
|
|
5147
|
+
* `reviewOf` 는 원래 표가 복습표면 그 표의 `reviewOf` 를, 아니면 원래 표의 `id` 를 잇는다(둘 다 없으면 `undefined`).
|
|
5148
|
+
* `reviewRound` 는 {@link reviewTableName} 이 이름에 적는 회차와 같다(1 = 첫 복습).
|
|
5149
|
+
*
|
|
5150
|
+
* @public
|
|
5151
|
+
*/
|
|
5152
|
+
export declare function reviewMeta(source: ReviewSource): {
|
|
5153
|
+
reviewOf: string | undefined;
|
|
5154
|
+
reviewRound: number;
|
|
5155
|
+
};
|
|
5156
|
+
|
|
4974
5157
|
/** @public 다음 훈련으로 무엇을 만들 수 있나. */
|
|
4975
5158
|
export declare interface ReviewSetPlan {
|
|
4976
5159
|
/** 훈련 플랜에 담을 것 — 문장 유형 */
|
|
@@ -5005,14 +5188,42 @@ export declare interface ReviewSetRef {
|
|
|
5005
5188
|
pending: number;
|
|
5006
5189
|
}
|
|
5007
5190
|
|
|
5191
|
+
/**
|
|
5192
|
+
* 복습할 원래 표 — 이름과, 있으면 **복습 메타**.
|
|
5193
|
+
*
|
|
5194
|
+
* 이름만으로는 회차를 틀리게 읽을 때가 있다. `수업 3차` 라는 표의 복습(`수업 3차 복습 09.15`)과
|
|
5195
|
+
* `수업` 의 3차 복습(`수업 3차 복습 09.15`)이 **같은 이름**이라, 다시 복습하면 둘 다 `수업 4차 복습` 이 됐다.
|
|
5196
|
+
* 복습표를 저장할 때 {@link reviewMeta} 의 값을 함께 남겨 두면 이름을 파싱하지 않고 그 값을 쓴다.
|
|
5197
|
+
* 메타가 없는 옛 표는 지금처럼 이름을 파싱한다.
|
|
5198
|
+
*
|
|
5199
|
+
* @public
|
|
5200
|
+
*/
|
|
5201
|
+
export declare interface ReviewSource {
|
|
5202
|
+
/** 표 이름 */
|
|
5203
|
+
name: string;
|
|
5204
|
+
/** 표 id — 이 표가 원본이면 복습표의 `reviewOf` 가 된다 */
|
|
5205
|
+
id?: string;
|
|
5206
|
+
/** 이 표가 복습표면 **맨 처음 원본 표**의 id */
|
|
5207
|
+
reviewOf?: string | null;
|
|
5208
|
+
/**
|
|
5209
|
+
* 이 표가 몇 번째 복습인가(1부터). `0` 은 "복습표가 아니다" — 이름이 `… 복습 09.01` 꼴이어도 꼬리로 떼지 않는다.
|
|
5210
|
+
* 없으면(`undefined`·`null`) 옛 표로 보고 이름을 파싱한다.
|
|
5211
|
+
*/
|
|
5212
|
+
reviewRound?: number | null;
|
|
5213
|
+
}
|
|
5214
|
+
|
|
5008
5215
|
/**
|
|
5009
5216
|
* 복습표 이름.
|
|
5010
5217
|
*
|
|
5011
5218
|
* 원래 이름을 앞에 두어 **목록에서 나란히 붙어 보이게** 한다(대개 이름순·최신순으로 본다).
|
|
5012
5219
|
* 날짜를 붙이는 것은 같은 표를 여러 번 돌리기 때문이다 — 없으면 같은 이름이 쌓여
|
|
5013
5220
|
* 어느 것이 이번 것인지 알 수 없다.
|
|
5221
|
+
*
|
|
5222
|
+
* 이름 형식(`바탕 [N차 ]복습 MM.DD`)은 저장된 이름·파싱과 맞추느라 바꾸지 않는다.
|
|
5223
|
+
* 원래 표를 {@link ReviewSource} 로 넘기면 복습 메타(`reviewRound`)를 이름 파싱보다 먼저 쓴다 —
|
|
5224
|
+
* 새 복습표를 저장할 때는 {@link reviewMeta} 의 값을 함께 남긴다. 글자만 넘기면 지금처럼 이름을 파싱한다.
|
|
5014
5225
|
*/
|
|
5015
|
-
export declare function reviewTableName(original: string, today: Date): string;
|
|
5226
|
+
export declare function reviewTableName(original: string | ReviewSource, today: Date): string;
|
|
5016
5227
|
|
|
5017
5228
|
/**
|
|
5018
5229
|
* 도넛 링 차트 — 전체 대비 완료 비율을 원형 호로 표현.
|
|
@@ -5048,7 +5259,7 @@ export declare interface RingChartProps {
|
|
|
5048
5259
|
strokeWidth?: number;
|
|
5049
5260
|
/** 중앙 숫자 아래 라벨 (기본: "%") */
|
|
5050
5261
|
label?: string;
|
|
5051
|
-
/** 중앙 텍스트(숫자+라벨) 전체 숨김 (기본: false) */
|
|
5262
|
+
/** 중앙 텍스트(숫자+라벨) 전체 숨김 (기본: false — 단 `titleKey` 섹션의 `size="small"` 은 기본 숨김이고, `false` 를 명시하면 그린다) */
|
|
5052
5263
|
hideCenter?: boolean;
|
|
5053
5264
|
/** 중앙 숫자는 유지하고 아래 라벨("%")만 숨김 (기본: false) */
|
|
5054
5265
|
hideLabel?: boolean;
|
|
@@ -5184,7 +5395,10 @@ export declare interface ScoreRecord {
|
|
|
5184
5395
|
tableId: string | null;
|
|
5185
5396
|
/** 칸 번호 → 표시 */
|
|
5186
5397
|
marks: Record<string, ScoreMark>;
|
|
5187
|
-
/**
|
|
5398
|
+
/**
|
|
5399
|
+
* 칸 번호 → 그때 보인 낱말. 옛 기록에는 없을 수 있다.
|
|
5400
|
+
* `cellKey` 로 동형어 번호까지 적어 두면(`배#2`) `weakItems` 가 동형어를 따로 센다.
|
|
5401
|
+
*/
|
|
5188
5402
|
labels: Record<string, string>;
|
|
5189
5403
|
}
|
|
5190
5404
|
|
|
@@ -5334,6 +5548,10 @@ export declare function SegmentedControl(props: SegmentedControlProps): JSX.Elem
|
|
|
5334
5548
|
export declare interface SegmentedControlProps {
|
|
5335
5549
|
options?: SegmentedOption[];
|
|
5336
5550
|
value?: string;
|
|
5551
|
+
/**
|
|
5552
|
+
* 누른 칸의 key 로 불린다. **이미 고른 칸을 다시 눌러도 부른다**(화살표가 같은 칸에 머물 때도) — 다시 누름을
|
|
5553
|
+
* "새로 고침" 으로 쓰는 자리가 있어 지금 동작을 지킨다. Dropdown·Rating·Tabs 는 값이 바뀔 때만 부른다.
|
|
5554
|
+
*/
|
|
5337
5555
|
onChange?: (v: string) => void;
|
|
5338
5556
|
className?: string;
|
|
5339
5557
|
/** 버튼 높이 — Button과 동일한 숫자 size (32 / 40 / 48) */
|
|
@@ -5473,6 +5691,7 @@ export declare interface ShortcutBadgeProps {
|
|
|
5473
5691
|
* **`transform` 으로 키우지 말 것** — 배지가 모서리에 걸치는 `translate` 와 같은
|
|
5474
5692
|
* 속성이라 한쪽이 다른 쪽을 통째로 지운다. 이 prop 은 `--shortcut-badge-scale` 로
|
|
5475
5693
|
* 내려가고, 자리와 배율은 CSS 한 곳에서 합쳐 적힌다.
|
|
5694
|
+
* `anchor="static"` 에서는 키캡 크기·글자에 곱해 흐름 안에서 차지하는 자리도 함께 커진다.
|
|
5476
5695
|
*/
|
|
5477
5696
|
scale?: number;
|
|
5478
5697
|
className?: string;
|
|
@@ -6018,13 +6237,18 @@ export declare function summarize(marks: Record<string, ScoreMark | null | undef
|
|
|
6018
6237
|
* 정렬은 세 겹이다. 정답률이 낮은 것이 먼저이되, **같은 정답률이면 여러 번 푼 것을
|
|
6019
6238
|
* 앞에 둔다** — 한 번 틀린 것과 다섯 번 내리 틀린 것은 무게가 다르다. 그래도 같으면
|
|
6020
6239
|
* 글자순으로 못 박는다(그러지 않으면 다시 읽을 때마다 차례가 흔들려 보던 줄을 놓친다).
|
|
6240
|
+
*
|
|
6241
|
+
* **"최근"(latestCorrect·latestAt·lastSelected·setIds 앞자리)은 `answeredAt` 으로 가린다.** 시각이 같은 행끼리는
|
|
6242
|
+
* 둘 다 `id` 가 있으면 `id` 가 큰 쪽(숫자는 수 크기, 글은 사전순)이 최근이고, 그렇지 않으면 **넘어온 배열에서
|
|
6243
|
+
* 뒤에 있는 쪽**이 최근이다 — 즉 `id` 없이 넘길 때는 **시간순(옛것 먼저)** 으로 넘겨야 같은 시각의 앞뒤가 맞다.
|
|
6244
|
+
* (최신 먼저 넘기면 같은 시각 행의 최근이 뒤집힌다. 시각이 다른 행은 차례와 상관없이 맞다.)
|
|
6021
6245
|
*/
|
|
6022
6246
|
export declare function summarizeMisses(records: readonly TrainingResultRecord[]): MissSummary;
|
|
6023
6247
|
|
|
6024
6248
|
/**
|
|
6025
6249
|
* 화면 위쪽에 놓이는 한 줄 요약 — "지금 다루고 있는 대상"을 이름표와 값으로 늘어놓는다.
|
|
6026
6250
|
*
|
|
6027
|
-
* 값 길이가 제각각이라 균등 그리드에 앉힌다. 긴 값은 칸을 밀어내지 않고
|
|
6251
|
+
* 값 길이가 제각각이라 균등 그리드에 앉힌다. 긴 값은 칸을 밀어내지 않고 말줄임된다 — 글자·수 값이면 `title` 로 전체 값을 단다.
|
|
6028
6252
|
*
|
|
6029
6253
|
* 값의 서식은 부르는 쪽이 정해 넘긴다 — 빈 값을 `-` 로 적을지, 날짜를 어떻게 쓸지,
|
|
6030
6254
|
* 여러 값을 한 칸에 묶을지(`오른손 / NC / 연구실 내`)는 화면마다 다르다.
|
|
@@ -6325,7 +6549,7 @@ export declare type TableProps<T extends {
|
|
|
6325
6549
|
onDrop?: (e: DragEvent_2<HTMLDivElement>) => void;
|
|
6326
6550
|
/** 펼쳐진 행에 렌더할 콘텐츠. expandedId와 함께 사용 */
|
|
6327
6551
|
renderExpandedRow?: (item: T) => ReactNode;
|
|
6328
|
-
/** 현재 펼쳐진 행의 id */
|
|
6552
|
+
/** 현재 펼쳐진 행의 id(여럿이면 Set). 글자로 견준다 — '5' 와 5 는 같은 줄. */
|
|
6329
6553
|
expandedId?: string | number | Set<string | number> | null;
|
|
6330
6554
|
};
|
|
6331
6555
|
|
|
@@ -6338,6 +6562,15 @@ declare interface TableSettingsSetters {
|
|
|
6338
6562
|
setShowDivLine: (v: boolean) => void;
|
|
6339
6563
|
}
|
|
6340
6564
|
|
|
6565
|
+
/** `useTableSort` 의 선택 인자. @public */
|
|
6566
|
+
export declare interface TableSortOptions<K extends string> {
|
|
6567
|
+
/** 머리를 눌러 정렬이 바뀔 때 바뀐 정렬로 불린다 — 쪽을 따로 들고 있는 표가 첫 쪽으로 돌아가는 자리 등. */
|
|
6568
|
+
onSortChange?: (sort: {
|
|
6569
|
+
key: K;
|
|
6570
|
+
asc: boolean;
|
|
6571
|
+
}) => void;
|
|
6572
|
+
}
|
|
6573
|
+
|
|
6341
6574
|
/** 표 한 개에 대한 흐름 — 같은 표를 여러 번 돌렸을 때 나아지고 있는가. */
|
|
6342
6575
|
export declare interface TableTrend {
|
|
6343
6576
|
tableName: string;
|
|
@@ -6374,6 +6607,7 @@ export declare function Tabs({ items, value, onChange, className, size }: TabsPr
|
|
|
6374
6607
|
export declare interface TabsProps {
|
|
6375
6608
|
items?: TabItem[];
|
|
6376
6609
|
value?: string;
|
|
6610
|
+
/** 고른 탭의 key 로 불린다. **값이 바뀔 때만** — 지금 탭을 다시 누르거나 화살표가 지금 탭에 머물면 부르지 않는다. */
|
|
6377
6611
|
onChange?: (key: string) => void;
|
|
6378
6612
|
className?: string;
|
|
6379
6613
|
/** 탭 버튼 높이 — SegmentedControl과 동일 체계 (32 / 40 / 48) */
|
|
@@ -6554,6 +6788,11 @@ export declare function Toggle({ checked, onChange, disabled, label, ariaLabel,
|
|
|
6554
6788
|
* @public 긍정형 다중 토글 섹션의 filterSelected 갱신 헬퍼 — 단어표·대립쌍표 공용.
|
|
6555
6789
|
* '전체'(FILTER_ALL_VALUE)면 해당 섹션 해제, 그 외엔 값 토글, 남은 값이 없으면 key 자체를 제거한다.
|
|
6556
6790
|
* (FilterPanel은 로케일과 무관하게 FILTER_ALL_VALUE를 방출하므로 t('common.all', '전체')과 비교하면 안 된다.)
|
|
6791
|
+
*
|
|
6792
|
+
* **속성 섹션(등급·음절 수·품사·어종)은 값을 코드로 견준다** — prev 에 다른 언어·옛 라벨로 든 같은 섹션이 있으면 그것을 읽어
|
|
6793
|
+
* `sectionLabel` 의 언어 라벨로 합쳐 적는다. 전에는 한국어로 저장된 '품사' 가 영어 화면의 'Part of Speech' 옆에 따로 남아,
|
|
6794
|
+
* 칩은 꺼진 채로 보이는데 필터는 걸려 있었고 끌 길이 없었다. 반환 모양(라벨 열쇠·라벨 값)은 그대로다.
|
|
6795
|
+
* 저장할 때는 `toWordAttributeFilterCodes` 로 코드 모양을 함께 담는다.
|
|
6557
6796
|
*/
|
|
6558
6797
|
export declare function toggleAttributeFilter(prev: Record<string, string[]>, value: string, sectionLabel: string): Record<string, string[]>;
|
|
6559
6798
|
|
|
@@ -6600,6 +6839,7 @@ export declare function toKstHm(when?: string | number | Date | null): string;
|
|
|
6600
6839
|
* 문자열을 낸다 — 연·월·일 경계 표본으로 대조했다.)
|
|
6601
6840
|
*
|
|
6602
6841
|
* 빈 값·못 읽는 값은 빈 문자열이다. 0(epoch)은 유효한 값이라 그대로 옮긴다.
|
|
6842
|
+
* 시간대 없는 시각 글자('2026-09-30 20:00:00')는 KST 벽시계 시각으로 읽는다(날짜만 있는 글자는 그대로).
|
|
6603
6843
|
*/
|
|
6604
6844
|
export declare function toKstYmd(when?: string | number | Date | null): string;
|
|
6605
6845
|
|
|
@@ -6771,7 +7011,7 @@ export declare function TopBanner({ children, interval, dotTone, className, 'ari
|
|
|
6771
7011
|
export declare interface TopBannerProps {
|
|
6772
7012
|
/** 로테이션할 슬라이드들 — 각 자식이 슬라이드 한 장 */
|
|
6773
7013
|
children: ReactNode;
|
|
6774
|
-
/** 자동 롤링 간격(ms). `0`이면 자동 롤링 안
|
|
7014
|
+
/** 자동 롤링 간격(ms). `0`이면 자동 롤링 안 함. OS '동작 줄이기' 가 켜져 있어도 자동 롤링하지 않는다(점으로 넘긴다). */
|
|
6775
7015
|
interval?: number;
|
|
6776
7016
|
/**
|
|
6777
7017
|
* 슬라이드별 인디케이터 톤. 슬라이드 배경이 어두우면 `'light'`(흰 점),
|
|
@@ -6881,6 +7121,12 @@ export declare function toTrainingText(value: unknown): string;
|
|
|
6881
7121
|
*/
|
|
6882
7122
|
export declare function toUserErrorMessage(msg: string): string;
|
|
6883
7123
|
|
|
7124
|
+
/**
|
|
7125
|
+
* @public filterSelected(라벨 열쇠·라벨 값, 어느 언어든 섞여 있어도) → **코드 모양**. 저장할 때 쓴다.
|
|
7126
|
+
* 속성 섹션(등급·음절 수·품사·어종)만 담고, 그 밖의 섹션(초성·선택·단어 입력 등)은 뺀다. 못 읽는 값은 버린다.
|
|
7127
|
+
*/
|
|
7128
|
+
export declare function toWordAttributeFilterCodes(selected: Record<string, unknown> | null | undefined): WordAttributeFilterCodes;
|
|
7129
|
+
|
|
6884
7130
|
/** 타입 칩 호버 → TrainingTooltip 표시까지의 지연(ms). 말귀자료실 카드와
|
|
6885
7131
|
* 훈련설정 페이지가 동일한 호버 프리뷰 동작을 각자 구현하고 있어 공유한다.
|
|
6886
7132
|
* @public */
|
|
@@ -6953,11 +7199,11 @@ export declare interface TrainingBlockButtonProps {
|
|
|
6953
7199
|
completedIds?: Set<string>;
|
|
6954
7200
|
/** 선택 상태 ID Set. 포함된 항목(완료가 아닌 것)에 체크 배지를 표시 — 완료와 같은 배지이고, `hideCheckBadge` 면 숨는다. */
|
|
6955
7201
|
selectedIds?: Set<string>;
|
|
6956
|
-
/** 호버 시 표시할 문제/문장 텍스트.
|
|
7202
|
+
/** 호버 시 표시할 문제/문장 텍스트. `useDescriptionTooltip` 이면 DescriptionTooltip 으로, 아니면 블록의 `title`(가리키면 뜨고 낭독기엔 설명)로 준다. */
|
|
6957
7203
|
tooltipText?: string | string[];
|
|
6958
7204
|
/** true 이면 호버 시 DescriptionTooltip 으로 문제 텍스트를 표시. 기본값 false. */
|
|
6959
7205
|
useDescriptionTooltip?: boolean;
|
|
6960
|
-
/** 제공 시
|
|
7206
|
+
/** 제공 시 뱃지 자리에 X 버튼 표시 — 가리킬 수 있는 기기는 hover 중에만, 터치 기기(hover: none)는 늘. 클릭하면 호출됨. */
|
|
6961
7207
|
onRemove?: () => void;
|
|
6962
7208
|
/** true 이면 완료/선택 체크 뱃지를 표시하지 않음 */
|
|
6963
7209
|
hideCheckBadge?: boolean;
|
|
@@ -7111,6 +7357,19 @@ export declare interface TrainingCategoryConfig {
|
|
|
7111
7357
|
trainingTypes?: TrainingType[];
|
|
7112
7358
|
}
|
|
7113
7359
|
|
|
7360
|
+
/** @public TrainingPagePopup `onComplete` 인자 */
|
|
7361
|
+
export declare type TrainingCompleteResult = {
|
|
7362
|
+
correct: number | null;
|
|
7363
|
+
total: number | null;
|
|
7364
|
+
/** 이 창에서 몇 번째 판인지(1부터) */
|
|
7365
|
+
attempt?: number;
|
|
7366
|
+
/** 다시하기 전 판들의 결과(앞 판부터) */
|
|
7367
|
+
previousAttempts?: Array<{
|
|
7368
|
+
correct: number | null;
|
|
7369
|
+
total: number | null;
|
|
7370
|
+
}>;
|
|
7371
|
+
};
|
|
7372
|
+
|
|
7114
7373
|
export declare interface TrainingCompletionEntry {
|
|
7115
7374
|
category: 'sentence' | 'word';
|
|
7116
7375
|
trainingType: string;
|
|
@@ -7281,6 +7540,7 @@ export declare type TrainingPagePopupBottomProps = {
|
|
|
7281
7540
|
stepIndex?: number;
|
|
7282
7541
|
stepCount?: number;
|
|
7283
7542
|
pageIndex?: number;
|
|
7543
|
+
/** 쪽 수. 0(쪽이 없음)이어도 '결과보기'(완료) 단추는 보이고, '다음 문제'(쪽 이동)만 숨는다. 기본 1. */
|
|
7284
7544
|
pageCount?: number;
|
|
7285
7545
|
};
|
|
7286
7546
|
|
|
@@ -7309,11 +7569,9 @@ export declare type TrainingPagePopupProps = {
|
|
|
7309
7569
|
stepIndex?: number;
|
|
7310
7570
|
stepCount?: number;
|
|
7311
7571
|
onBack?: () => void;
|
|
7312
|
-
/** 완료 시 호출. 결과 팝업이 계산한 정답/전체 문항 수를 함께 전달(호출부가 무시해도 무방하도록 옵셔널 인자).
|
|
7313
|
-
|
|
7314
|
-
|
|
7315
|
-
total: number | null;
|
|
7316
|
-
}) => void;
|
|
7572
|
+
/** 완료 시 호출. 결과 팝업이 계산한 정답/전체 문항 수를 함께 전달(호출부가 무시해도 무방하도록 옵셔널 인자).
|
|
7573
|
+
* `attempt` 는 이 창에서 몇 번째 판인지(1부터, 다시하기마다 +1), `previousAttempts` 는 다시하기 전 판들의 정답/전체 — 전에는 1회차 결과가 어디에도 남지 않았다. */
|
|
7574
|
+
onComplete?: (result?: TrainingCompleteResult) => void;
|
|
7317
7575
|
onNext?: () => void;
|
|
7318
7576
|
onSettings?: () => void;
|
|
7319
7577
|
/** 좌측 하단 훈련 설정 버튼 + 오디오 미터 토글 표시 여부. 기본 true — 모든 훈련에서 노출되며,
|
|
@@ -7325,6 +7583,7 @@ export declare type TrainingPagePopupProps = {
|
|
|
7325
7583
|
panelRef: RefObject<PanelElement | null>;
|
|
7326
7584
|
setResultOverlay: Dispatch<SetStateAction<unknown>>;
|
|
7327
7585
|
}) => ReactNode);
|
|
7586
|
+
/** 대화상자 이름(낭독기가 읽는 이름). 주면 title·label·시나리오 제목보다 이긴다 — 보이는 제목과 다른 이름이 필요할 때. 없으면 보이는 제목. */
|
|
7328
7587
|
ariaLabel?: string;
|
|
7329
7588
|
label?: string;
|
|
7330
7589
|
buildResults?: (answers: Record<string, unknown>, meta?: Record<string, unknown>) => unknown;
|
|
@@ -7355,6 +7614,8 @@ export declare type TrainingPagePopupProps = {
|
|
|
7355
7614
|
contextsLength?: number | null;
|
|
7356
7615
|
onReplay?: () => void;
|
|
7357
7616
|
onClose?: () => void;
|
|
7617
|
+
/** 결과를 아직 계산하는 중(비동기 buildResults 등) — true 인 동안 '완료' 를 막아야 한다. 기본 결과 창(TrainingResultPopup)은 그대로 받아 막는다. */
|
|
7618
|
+
pending?: boolean;
|
|
7358
7619
|
}) => ReactNode;
|
|
7359
7620
|
};
|
|
7360
7621
|
|
|
@@ -7421,6 +7682,11 @@ declare interface TrainingResultPopupProps {
|
|
|
7421
7682
|
onClose?: () => void;
|
|
7422
7683
|
/** true면 portal 없이 부모 컨테이너 안에 제자리 렌더 (목업/데모용) */
|
|
7423
7684
|
inline?: boolean;
|
|
7685
|
+
/**
|
|
7686
|
+
* 결과를 아직 계산하는 중인가. true 인 동안 '완료' 단추를 막고(aria-disabled, 누르거나 Esc 로 닫아도 기록하지 않음)
|
|
7687
|
+
* 까닭 문구를 보인다 — 결과 없이 완료하면 문항 수(total)가 비어 기록됐다. TrainingPagePopup 이 넘긴다. 기본 false.
|
|
7688
|
+
*/
|
|
7689
|
+
pending?: boolean;
|
|
7424
7690
|
}
|
|
7425
7691
|
|
|
7426
7692
|
/**
|
|
@@ -7447,6 +7713,11 @@ declare interface TrainingResultPopupProps {
|
|
|
7447
7713
|
* 소요가 있다) · **세션 시간**(둘 다 없다). 무엇을 볼지는 읽는 쪽이 정한다.
|
|
7448
7714
|
*/
|
|
7449
7715
|
export declare interface TrainingResultRecord {
|
|
7716
|
+
/**
|
|
7717
|
+
* 행 식별자(선택). `answeredAt` 이 같은 행(한 판을 한꺼번에 저장해 시각이 같은 행)의 **앞뒤를 가르는 데만** 쓴다 —
|
|
7718
|
+
* 숫자면 수가 큰 쪽, 글이면 사전순으로 뒤인 쪽이 최근이다. 없으면 넘어온 배열에서 뒤에 있는 쪽이 최근이다.
|
|
7719
|
+
*/
|
|
7720
|
+
id?: string | number | null;
|
|
7450
7721
|
answeredAt: string;
|
|
7451
7722
|
trainingType: string;
|
|
7452
7723
|
/** 문항 식별자 — 코드가 있는 유형은 코드, 없는 유형(낱말)은 낱말 자체 */
|
|
@@ -7716,6 +7987,12 @@ export declare type TrainingWordCardItem = {
|
|
|
7716
7987
|
subLabel?: string;
|
|
7717
7988
|
colloquialLabel?: string;
|
|
7718
7989
|
homonum?: number;
|
|
7990
|
+
/**
|
|
7991
|
+
* 이미지 없이 **글자 카드**로 보인다(이미지를 청하지 않고, `hideLabel` 이어도 글자를 그림 자리에 크게 보인다).
|
|
7992
|
+
* 안 주면 단어 풀(setWordPool)이 불려 있고 그 풀에 없는 낱말일 때 저절로 글자 카드다 — 받침·자음 탈락의 만든 음절('다'·'애')처럼
|
|
7993
|
+
* 사전에 없는 글자는 이미지가 있을 수 없다. `false` 면 풀에 없어도 이미지를 청한다. `image` 를 직접 주면 그것을 쓴다.
|
|
7994
|
+
*/
|
|
7995
|
+
textOnly?: boolean;
|
|
7719
7996
|
[k: string]: unknown;
|
|
7720
7997
|
};
|
|
7721
7998
|
|
|
@@ -7799,6 +8076,8 @@ export declare function uncoveredLabels(recommendations: readonly Recommendation
|
|
|
7799
8076
|
*
|
|
7800
8077
|
* 여러 장을 동시에 띄우려면 `.update-alert-stack`으로 감싼다 — 낱장은 스스로
|
|
7801
8078
|
* fixed로 붙지만 스택 안에서는 흐름 배치가 되어 아래로 쌓인다.
|
|
8079
|
+
* 따로 놓인 낱장과 스택(또는 낱장 여럿)이 함께 뜨면 문서 순서대로 서로 아래로 비켜 쌓인다(겹치지 않는다).
|
|
8080
|
+
* 층은 창(Popup·Dialog) 위 — 창 위에서도 알림을 읽고 닫을 수 있다(`--z-alert`).
|
|
7802
8081
|
*
|
|
7803
8082
|
* @public
|
|
7804
8083
|
*/
|
|
@@ -7826,11 +8105,11 @@ declare interface UpdateAlertProps {
|
|
|
7826
8105
|
export declare function useAnchoredMenu<Trigger extends HTMLElement = HTMLElement, Menu extends HTMLElement = HTMLElement>({ computeStyle, onScroll, onResize, ignoreOutsideClickSelector, }: UseAnchoredMenuOptions): UseAnchoredMenuResult<Trigger, Menu>;
|
|
7827
8106
|
|
|
7828
8107
|
export declare interface UseAnchoredMenuOptions {
|
|
7829
|
-
/** 트리거의 getBoundingClientRect()로부터 메뉴에 적용할 style을 계산 */
|
|
7830
|
-
computeStyle: (triggerRect: DOMRect) => CSSProperties;
|
|
8108
|
+
/** 트리거의 getBoundingClientRect()로부터 메뉴에 적용할 style을 계산. 둘째 인자는 트리거 요소(층 계산 `anchoredMenuZIndex` 등에 쓴다) */
|
|
8109
|
+
computeStyle: (triggerRect: DOMRect, trigger: HTMLElement) => CSSProperties;
|
|
7831
8110
|
/** 열려있는 동안 스크롤 발생 시 동작 (메뉴 내부 스크롤은 항상 무시) — 기본 'close' */
|
|
7832
8111
|
onScroll?: 'close' | 'reposition' | 'ignore';
|
|
7833
|
-
/** 열려있는 동안 윈도우
|
|
8112
|
+
/** 열려있는 동안 윈도우 리사이즈·기기 회전(orientationchange) 발생 시 동작 — 기본 'close' */
|
|
7834
8113
|
onResize?: 'close' | 'reposition' | 'ignore';
|
|
7835
8114
|
/** 바깥클릭 판정에서 제외할 CSS selector (예: 메뉴 안에 중첩 포탈되는 다른 드롭다운) */
|
|
7836
8115
|
ignoreOutsideClickSelector?: string;
|
|
@@ -7869,9 +8148,12 @@ export declare function useCacheManagement(onToast?: (msg: string) => void): {
|
|
|
7869
8148
|
|
|
7870
8149
|
/**
|
|
7871
8150
|
* "현재 보고 있는 연/월" 상태 + 이전/다음 달 이동. DatePicker의 달력 네비게이션에서 쓴다.
|
|
8151
|
+
*
|
|
8152
|
+
* @param value 고른 날 'YYYY-MM-DD'. 비었으면 오늘의 달을 본다.
|
|
8153
|
+
* @param today 선택. '오늘' 로 쓸 'YYYY-MM-DD'(로컬 앱·SSR). 없거나 꼴이 틀리면 KST 오늘.
|
|
7872
8154
|
* @public
|
|
7873
8155
|
*/
|
|
7874
|
-
export declare function useCalendarMonth(value: string): UseCalendarMonthResult;
|
|
8156
|
+
export declare function useCalendarMonth(value: string, today?: string): UseCalendarMonthResult;
|
|
7875
8157
|
|
|
7876
8158
|
export declare interface UseCalendarMonthResult {
|
|
7877
8159
|
viewY: number;
|
|
@@ -7885,6 +8167,9 @@ export declare interface UseCalendarMonthResult {
|
|
|
7885
8167
|
* TextField의 `suggestions` 옵션이 쓰는 자동완성 콤보박스 상태/키보드 로직.
|
|
7886
8168
|
* 순수 입력(값 관리)과 분리해서, 자동완성이 필요 없는 TextField 사용처는
|
|
7887
8169
|
* 이 훅의 상태가 전혀 관여하지 않는다(항상 호출되지만 open은 기본 false로 시작).
|
|
8170
|
+
*
|
|
8171
|
+
* 한글 조합 중에는 걸리는 후보가 0 건이 되어도 직전 목록을 유지한다 — 입력칸에 `handleCompositionStart`·
|
|
8172
|
+
* `handleCompositionEnd` 를 걸어야 한다(TextField 는 건다). 걸지 않으면 지금처럼 매 값마다 다시 거른다.
|
|
7888
8173
|
* @public
|
|
7889
8174
|
*/
|
|
7890
8175
|
export declare function useComboboxSuggestions({ value, onChange, suggestions, openOnFocus, }: {
|
|
@@ -7902,13 +8187,19 @@ export declare function useComboboxSuggestions({ value, onChange, suggestions, o
|
|
|
7902
8187
|
handleInput: () => void;
|
|
7903
8188
|
handleKeyDown: (e: KeyboardEvent_2<HTMLInputElement | HTMLTextAreaElement>) => void;
|
|
7904
8189
|
handleSelect: (item: string) => void;
|
|
8190
|
+
/** 입력칸의 onCompositionStart 에 건다 — 조합 중에는 걸리는 후보가 0 건이 되어도 직전 목록을 둔다 */
|
|
8191
|
+
handleCompositionStart: () => void;
|
|
8192
|
+
/** 입력칸의 onCompositionEnd 에 건다 — 조합이 끝나면 목록을 다시 계산한다 */
|
|
8193
|
+
handleCompositionEnd: () => void;
|
|
7905
8194
|
};
|
|
7906
8195
|
|
|
7907
8196
|
/**
|
|
7908
8197
|
* 오늘/어제 훈련 선택을 (user, 날짜) 결정적 시드로 계산하는 훅(영속 저장 없음).
|
|
7909
8198
|
*
|
|
7910
|
-
* - resolveSelection은 시드 기반이라 기기/세션 무관 동일
|
|
7911
|
-
*
|
|
8199
|
+
* - resolveSelection은 (사용자, 날짜, 유형) 시드 기반이라 기기/세션 무관 동일 결과. 유형마다 시드가 따로라 한 유형 자료가
|
|
8200
|
+
* 바뀌어도 다른 유형 세트는 그대로
|
|
8201
|
+
* - 오늘 세트는 후보가 충분하면 어제 세트와 겹치지 않는다(어제 보기는 어제 실제로 뜬 세트와 같다)
|
|
8202
|
+
* - 데이터 미로딩 시 ensureTrainingDataLoaded() 대기 후 재계산(받는 중에는 새로 부르지 않는다)
|
|
7912
8203
|
* - 폴링(250ms): 훈련 데이터가 비동기로 채워질 때까지 재시도
|
|
7913
8204
|
*/
|
|
7914
8205
|
/**
|
|
@@ -8125,8 +8416,8 @@ export declare function usePasswordChange(onChangePassword?: (current: string, n
|
|
|
8125
8416
|
* 한곳에 둔다 — 두 곳에 따로 두면 한쪽만 고쳐져 같은 숙제가 화면마다 다른 날짜로
|
|
8126
8417
|
* 읽히게 된다.
|
|
8127
8418
|
*
|
|
8128
|
-
*
|
|
8129
|
-
*
|
|
8419
|
+
* **KST 달력날** 로 센다(사용자 결정 2026-09-15) — 어제 23시(KST)에 온 숙제는 오늘 01시에 "어제". 기기 시간대와 무관하다
|
|
8420
|
+
* (해외 기기도 한국 날짜). 전에는 24시간 단위라 같은 숙제가 "오늘"로 읽혔다. 앞날(시계 차이)은 "오늘".
|
|
8130
8421
|
*/
|
|
8131
8422
|
export declare function useRelativeDay(): (iso?: string | null) => string;
|
|
8132
8423
|
|
|
@@ -8190,8 +8481,24 @@ export declare function useTablePaging<T>(rows: readonly T[], resetOn?: unknown,
|
|
|
8190
8481
|
setPage: Dispatch<SetStateAction<number>>;
|
|
8191
8482
|
};
|
|
8192
8483
|
|
|
8193
|
-
/**
|
|
8194
|
-
|
|
8484
|
+
/**
|
|
8485
|
+
* 머리행 정렬 상태 — 같은 칸을 다시 누르면 방향이 뒤집힌다.
|
|
8486
|
+
*
|
|
8487
|
+
* **정렬이 바뀌면 첫 쪽으로** — `useTablePaging` 의 `resetOn` 에 돌려받은 `정렬` 을 그대로 넣는다.
|
|
8488
|
+
* `정렬` 은 누를 때만 새 객체가 되므로(렌더마다 새로 만들지 않는다) 그 자체가 열쇠다. 쪽을 따로 들고 있으면 `onSortChange` 에서 되돌린다.
|
|
8489
|
+
*
|
|
8490
|
+
* `sortRows(rows, 값)` 은 지금 정렬로 줄을 세운 **새 배열**을 준다(정렬이 없으면 받은 배열 그대로) — `칸순`(숫자는 수로,
|
|
8491
|
+
* 한글·영문은 사람 차례) 으로 견주고 **빈 값(null·undefined·'')은 오름·내림 모두 맨 뒤**(ListPopup 과 같은 규칙).
|
|
8492
|
+
*
|
|
8493
|
+
* @example
|
|
8494
|
+
* const { 정렬, 칸, sortRows } = useTableSort<'name' | 'joined'>()
|
|
8495
|
+
* const 세운줄 = useMemo(() => sortRows(rows, (r, key) => r[key]), [rows, sortRows])
|
|
8496
|
+
* const { pageRows, pageSizeProps, paginationProps } = useTablePaging(세운줄, 정렬) // 정렬이 바뀌면 첫 쪽
|
|
8497
|
+
* <Table fields={[칸('이름', 'name'), 칸('가입일', 'joined')]} … />
|
|
8498
|
+
*
|
|
8499
|
+
* @public
|
|
8500
|
+
*/
|
|
8501
|
+
export declare function useTableSort<K extends string>(opts?: TableSortOptions<K>): {
|
|
8195
8502
|
정렬: {
|
|
8196
8503
|
key: K;
|
|
8197
8504
|
asc: boolean;
|
|
@@ -8201,6 +8508,7 @@ export declare function useTableSort<K extends string>(): {
|
|
|
8201
8508
|
sortDir: "desc" | "asc" | null;
|
|
8202
8509
|
onClick: () => void;
|
|
8203
8510
|
};
|
|
8511
|
+
sortRows: <R>(rows: readonly R[], 값: (row: R, key: K) => unknown) => readonly R[];
|
|
8204
8512
|
};
|
|
8205
8513
|
|
|
8206
8514
|
/**
|
|
@@ -8439,7 +8747,7 @@ export declare interface UseWordTablePrintResult {
|
|
|
8439
8747
|
print: () => void;
|
|
8440
8748
|
/** 새 탭에 단어표를 열어 사용자가 직접 인쇄/저장하게 한다. */
|
|
8441
8749
|
openNewWindow: () => void;
|
|
8442
|
-
/** 단어표를 정적 HTML 파일로 다운로드한다. */
|
|
8750
|
+
/** 단어표를 정적 HTML 파일로 다운로드한다. 파일명이 비면(걸러 내고 남는 글자가 없으면) 기본 이름('단어표'). */
|
|
8443
8751
|
downloadHtml: () => void;
|
|
8444
8752
|
}
|
|
8445
8753
|
|
|
@@ -8568,7 +8876,14 @@ export declare function waveBarVal(a: number): number;
|
|
|
8568
8876
|
|
|
8569
8877
|
/** 낱말 하나에 대해 쌓인 성적. */
|
|
8570
8878
|
export declare interface WeakItem {
|
|
8879
|
+
/** 보이는 낱말 — 동형어 번호를 뗀 글자(`배`, `배 / 패`) */
|
|
8571
8880
|
label: string;
|
|
8881
|
+
/**
|
|
8882
|
+
* 묶은 열쇠 — 저장된 칸 낱말 그대로. 동형어 번호가 저장된 기록이면 `배#2` 처럼 번호가 붙고,
|
|
8883
|
+
* 없는 옛 기록이면 `label` 과 같다. 같은 `label` 이 둘 이상 나올 수 있으니 줄 열쇠로는 이것을 쓴다.
|
|
8884
|
+
* `weakItems` 는 늘 채운다 — 선택 필드인 것은 이 모양을 손으로 짓는 쪽(시험 등)을 깨지 않으려는 것뿐이다.
|
|
8885
|
+
*/
|
|
8886
|
+
key?: string;
|
|
8572
8887
|
/** 이 낱말을 매긴 횟수 */
|
|
8573
8888
|
tried: number;
|
|
8574
8889
|
o: number;
|
|
@@ -8591,6 +8906,9 @@ export declare interface WeakItem {
|
|
|
8591
8906
|
*
|
|
8592
8907
|
* **낱말이 안 남은 옛 기록은 건너뛴다.** 칸 번호로 표를 되짚으면 그 표가 그동안 바뀌었을 때
|
|
8593
8908
|
* 엉뚱한 낱말의 기록이 된다 — 조용히 틀리느니 빼는 편이 낫다.
|
|
8909
|
+
*
|
|
8910
|
+
* **동형어는 저장된 낱말에 번호가 있을 때만 따로 묶는다**(`배#1`·`배#2`, `cellKey`). 번호 없이 저장된 옛 기록은
|
|
8911
|
+
* 지금처럼 글자로 묶는다 — 그래서 같은 '배' 가 옛 기록 한 줄·번호 있는 기록 한 줄로 나뉘어 보일 수 있다.
|
|
8594
8912
|
*/
|
|
8595
8913
|
export declare function weakItems(records: readonly ScoreRecord[]): WeakItem[];
|
|
8596
8914
|
|
|
@@ -8653,6 +8971,17 @@ export declare const WORD_TABLE_PAPER: Record<WordTableOrientation, {
|
|
|
8653
8971
|
/** 어종(단어 유형) 약호 → 전체 표기. 데이터의 Class 컬럼은 축약형('고유'/'한자'/'외래'/'혼종')을 쓴다. */
|
|
8654
8972
|
export declare const WORD_TYPE_LABEL: Record<string, string>;
|
|
8655
8973
|
|
|
8974
|
+
/**
|
|
8975
|
+
* @public 공용 속성 필터를 **언어와 무관한 코드**로 담은 모양 — 저장(DB config·로컬 저장소)용.
|
|
8976
|
+
* 예: `{ grade: ['1', '2'], syllables: ['5+'], pos: ['noun'], wordType: ['sino'] }`
|
|
8977
|
+
*/
|
|
8978
|
+
export declare type WordAttributeFilterCodes = Partial<Record<WordAttributeSectionCode, string[]>>;
|
|
8979
|
+
|
|
8980
|
+
/**
|
|
8981
|
+
* @public 코드 모양 → 지정한 언어(기본: 지금 i18n 언어)의 **라벨 filterSelected**. FilterPanel 의 selected 로 그대로 쓴다.
|
|
8982
|
+
*/
|
|
8983
|
+
export declare function wordAttributeFilterFromCodes(codes: WordAttributeFilterCodes | null | undefined, lng?: string): Record<string, string[]>;
|
|
8984
|
+
|
|
8656
8985
|
/**
|
|
8657
8986
|
* 등급/음절수/품사/어종 필터의 공용 i18n 키+맵.
|
|
8658
8987
|
* 단어표(useWordSearch)·대립쌍표(useWordPairsSearch)·단어훈련(useWordTrainingFilter)이
|
|
@@ -8669,6 +8998,9 @@ export declare interface WordAttributeFilterKeys {
|
|
|
8669
8998
|
typeMap: Record<string, string>;
|
|
8670
8999
|
}
|
|
8671
9000
|
|
|
9001
|
+
/** @public 공용 속성 필터 섹션 코드 */
|
|
9002
|
+
export declare type WordAttributeSectionCode = 'grade' | 'syllables' | 'pos' | 'wordType';
|
|
9003
|
+
|
|
8672
9004
|
/** 정답 단어 구성 선택 상태 (정답 단어에만 적용 — 오답은 대립 관계로 결정) */
|
|
8673
9005
|
export declare interface WordComposition {
|
|
8674
9006
|
cho: string | null;
|
|
@@ -8869,9 +9201,15 @@ export declare function WordSearchResultBlock({ titleIcon, resultCount, resultUn
|
|
|
8869
9201
|
/** @public */
|
|
8870
9202
|
export declare interface WordSearchResultBlockProps {
|
|
8871
9203
|
titleIcon?: string;
|
|
9204
|
+
/**
|
|
9205
|
+
* 검색 결과 수 — 제목 "총 N개" 에 쓴다. **검색 화면이라는 표시이기도 하다**: 이것도 `searchQuery` 도 주지 않으면
|
|
9206
|
+
* 저장된 목록을 보여 주는 것으로 보고(공유 열람) 받은 순서를 기본 정렬로 둔다('받은 순서' 선택지가 생긴다).
|
|
9207
|
+
*/
|
|
8872
9208
|
resultCount?: number;
|
|
8873
9209
|
resultUnit?: string;
|
|
9210
|
+
/** 검색어 — 한 낱말이면 '시작 우선' 을 기본 정렬로 쓴다 */
|
|
8874
9211
|
searchQuery?: string;
|
|
9212
|
+
/** 보일 항목. 검색어·결과 수 없이 이것만 주면 받은 순서 그대로가 기본이다 */
|
|
8875
9213
|
items: WordSearchResultItem[];
|
|
8876
9214
|
groups?: WordSearchResultGroup[];
|
|
8877
9215
|
selected?: string[];
|