@ihabdevteam/core 0.321.0 → 0.323.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 +617 -0
- package/dist/components.cjs.js +183 -183
- 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 +187 -187
- package/dist/ihabdevteam-core.d.ts +108 -66
- package/dist/packages/core/src/components/Accordion.js +3 -3
- package/dist/packages/core/src/components/Alert.js +2 -2
- package/dist/packages/core/src/components/BarChart.js +120 -119
- package/dist/packages/core/src/components/BottomNav.js +18 -18
- package/dist/packages/core/src/components/BulkBar.js +25 -25
- package/dist/packages/core/src/components/Button.js +16 -16
- package/dist/packages/core/src/components/Calendar.js +17 -17
- package/dist/packages/core/src/components/ChartSection.js +30 -30
- package/dist/packages/core/src/components/CountTile.js +38 -38
- package/dist/packages/core/src/components/DatePicker.js +59 -59
- package/dist/packages/core/src/components/Dialog.js +14 -14
- package/dist/packages/core/src/components/Effect/EffectPartyPopperHost.js +8 -8
- package/dist/packages/core/src/components/FilterPanel.js +6 -6
- package/dist/packages/core/src/components/FilterSectionInfo.js +6 -6
- package/dist/packages/core/src/components/GameIntro.js +1 -1
- package/dist/packages/core/src/components/HearingDeviceInfo.d.ts +5 -5
- package/dist/packages/core/src/components/HearingDeviceInfo.js +2 -2
- package/dist/packages/core/src/components/Icon.js +2 -2
- package/dist/packages/core/src/components/ItemActions.js +16 -16
- package/dist/packages/core/src/components/LandingHeader.js +6 -6
- package/dist/packages/core/src/components/LineChart.js +24 -24
- package/dist/packages/core/src/components/Loader.js +5 -5
- package/dist/packages/core/src/components/NoticeBox.js +3 -3
- package/dist/packages/core/src/components/PageTitle.js +2 -2
- package/dist/packages/core/src/components/Pagination.js +4 -4
- package/dist/packages/core/src/components/Panel.js +2 -2
- package/dist/packages/core/src/components/PanelRow.d.ts +2 -4
- package/dist/packages/core/src/components/PanelRow.js +8 -15
- package/dist/packages/core/src/components/PassCard/PassCard.js +9 -9
- package/dist/packages/core/src/components/PassCard/passCardProduct.js +2 -2
- package/dist/packages/core/src/components/PaymentPlan.js +5 -5
- package/dist/packages/core/src/components/Popup/ConfirmPopup.js +29 -29
- package/dist/packages/core/src/components/Popup/CouponInputPopup.js +2 -2
- package/dist/packages/core/src/components/Popup/DeviceListPopup.d.ts +4 -8
- package/dist/packages/core/src/components/Popup/DeviceListPopup.js +1 -1
- package/dist/packages/core/src/components/Popup/DeviceSideTable.js +19 -26
- package/dist/packages/core/src/components/Popup/ListPopup.js +6 -6
- package/dist/packages/core/src/components/Popup/LoadTablePopup.js +10 -10
- package/dist/packages/core/src/components/Popup/Popup.js +27 -27
- package/dist/packages/core/src/components/Popup/SaveTablePopup.js +5 -5
- package/dist/packages/core/src/components/Popup/TrainingResultPopup.js +4 -4
- package/dist/packages/core/src/components/Popup/customerDetailUtils.js +18 -18
- package/dist/packages/core/src/components/Popup/useDiscardGuard.js +4 -4
- package/dist/packages/core/src/components/ProgressIndicator.js +5 -5
- package/dist/packages/core/src/components/PromoBannerBg/promoBannerBg.js +16 -16
- package/dist/packages/core/src/components/Rating.js +20 -20
- package/dist/packages/core/src/components/Report/ReportDocument.js +21 -21
- package/dist/packages/core/src/components/RingChart.js +5 -5
- package/dist/packages/core/src/components/SectionHeadFloat.js +15 -15
- package/dist/packages/core/src/components/SegmentedControl.js +34 -34
- package/dist/packages/core/src/components/SideNav.js +37 -37
- package/dist/packages/core/src/components/Slider.js +2 -2
- package/dist/packages/core/src/components/SoundCompass.js +5 -5
- package/dist/packages/core/src/components/Table.js +257 -98
- package/dist/packages/core/src/components/Tabs.js +12 -12
- package/dist/packages/core/src/components/TextField.js +34 -34
- package/dist/packages/core/src/components/Toast.js +6 -6
- package/dist/packages/core/src/components/Tooltip/MenuTooltip.js +4 -4
- package/dist/packages/core/src/components/Tooltip/Tooltip.js +22 -22
- package/dist/packages/core/src/components/Tooltip/TrainingTooltip.js +4 -4
- package/dist/packages/core/src/components/TopBanner.js +28 -28
- package/dist/packages/core/src/components/Training/AudioPlayerWaveForm.js +11 -11
- package/dist/packages/core/src/components/Training/CategoryIcon.js +2 -2
- package/dist/packages/core/src/components/Training/NoisePlayerContext.d.ts +7 -4
- package/dist/packages/core/src/components/Training/NoisePlayerContext.js +12 -12
- package/dist/packages/core/src/components/Training/NoiseSettingsTooltip.js +2 -2
- package/dist/packages/core/src/components/Training/TrainingBlock.js +12 -12
- package/dist/packages/core/src/components/Training/TrainingBlockButton.js +10 -10
- package/dist/packages/core/src/components/Training/TrainingBlockGrid.js +21 -21
- package/dist/packages/core/src/components/Training/TrainingCard.css +13 -1
- package/dist/packages/core/src/components/Training/TrainingCard.js +2 -2
- package/dist/packages/core/src/components/Training/TrainingCardGroup.js +6 -6
- package/dist/packages/core/src/components/Training/TrainingPagePopup.js +83 -83
- package/dist/packages/core/src/components/Training/TrainingPagePopupBottom.js +17 -17
- package/dist/packages/core/src/components/Training/TrainingStepAudioPlayer.js +128 -128
- package/dist/packages/core/src/components/Training/TrainingStepCard.js +18 -18
- package/dist/packages/core/src/components/Training/TrainingStepConfirmWithText.js +4 -4
- package/dist/packages/core/src/components/Training/TrainingStepOrderList.js +12 -12
- package/dist/packages/core/src/components/Training/TrainingStepTextBox.js +13 -13
- package/dist/packages/core/src/components/Training/TrainingStepTitle.js +4 -4
- package/dist/packages/core/src/components/Training/TrainingWordCard.js +17 -17
- package/dist/packages/core/src/components/Training/WordTablePopup.js +5 -5
- package/dist/packages/core/src/components/Training/audioPlaybackRules.js +8 -8
- package/dist/packages/core/src/components/Training/audioTimeline.js +25 -25
- package/dist/packages/core/src/components/Training/oneShotSound.d.ts +1 -1
- package/dist/packages/core/src/components/Training/oneShotSound.js +14 -14
- package/dist/packages/core/src/components/Training/stepAnswerable.d.ts +2 -2
- package/dist/packages/core/src/components/Training/trainingMissStats.js +22 -22
- package/dist/packages/core/src/components/Training/trainingPopupUtils.js +7 -7
- package/dist/packages/core/src/components/Training/useAudioPreview.js +15 -15
- package/dist/packages/core/src/components/Training/useFloatingFocus.js +14 -14
- package/dist/packages/core/src/components/Training/useNoiseFade.js +22 -22
- package/dist/packages/core/src/components/Training/useObjectUrls.js +2 -2
- package/dist/packages/core/src/components/Training/usePlaybackSequencer.d.ts +2 -2
- package/dist/packages/core/src/components/Training/usePlaybackSequencer.js +23 -23
- package/dist/packages/core/src/components/Training/useProgressTicker.js +33 -33
- package/dist/packages/core/src/components/Training/useTTSPlayback.js +17 -17
- package/dist/packages/core/src/components/Training/useWaveReady.js +11 -11
- package/dist/packages/core/src/components/UpdateAlert.js +6 -6
- package/dist/packages/core/src/components/Word/PhonemeSelectBlock.js +7 -1
- package/dist/packages/core/src/components/Word/TableFilterPanel.js +3 -3
- package/dist/packages/core/src/components/Word/WordSearchResultBlock.js +18 -18
- package/dist/packages/core/src/components/Word/WordTableBlock.js +28 -28
- package/dist/packages/core/src/components/Word/WordTableButton.css +16 -2
- package/dist/packages/core/src/components/Word/WordTableThumbnail.css +6 -1
- package/dist/packages/core/src/components/Word/generatedDraft.js +14 -14
- package/dist/packages/core/src/components/Word/useWordTableDisplaySettings.js +7 -7
- package/dist/packages/core/src/components/Word/wordScoreStats.js +17 -17
- package/dist/packages/core/src/components/Word/wordTablePrint.js +10 -10
- package/dist/packages/core/src/components/Word/wordTableRecommend.js +13 -13
- package/dist/packages/core/src/components/Word/wordTableReview.js +28 -28
- package/dist/packages/core/src/components/Word/wordTableSettings.d.ts +8 -11
- package/dist/packages/core/src/components/Word/wordTableSettings.js +48 -36
- package/dist/packages/core/src/components/WordTable.js +130 -130
- package/dist/packages/core/src/components/barChartData.d.ts +16 -1
- package/dist/packages/core/src/components/barChartData.js +49 -29
- package/dist/packages/core/src/components/barChartTypes.js +8 -8
- package/dist/packages/core/src/components/tableTrackList.js +11 -11
- package/dist/packages/core/src/components/updateAlertStack.js +28 -28
- package/dist/packages/core/src/components/useBarChartControl.js +4 -6
- package/dist/packages/core/src/components/useComboboxSuggestions.js +17 -17
- package/dist/packages/core/src/components/useToastLifecycle.js +18 -18
- package/dist/packages/core/src/components/wordTableLayout.d.ts +22 -7
- package/dist/packages/core/src/components/wordTableLayout.js +5 -5
- package/dist/packages/core/src/context/I18nProvider.js +6 -6
- package/dist/packages/core/src/hooks/focusReturn.js +27 -27
- package/dist/packages/core/src/hooks/inputModality.d.ts +1 -1
- package/dist/packages/core/src/hooks/inputModality.js +14 -14
- package/dist/packages/core/src/hooks/touchToggle.js +39 -39
- package/dist/packages/core/src/hooks/useAnchoredMenu.js +30 -30
- package/dist/packages/core/src/hooks/useDailyTrainingSelection.js +28 -28
- package/dist/packages/core/src/hooks/useDeviceManagement.d.ts +5 -17
- package/dist/packages/core/src/hooks/useDeviceManagement.js +20 -8
- package/dist/packages/core/src/hooks/useDocumentTitle.js +10 -10
- package/dist/packages/core/src/hooks/useEditableList.js +4 -4
- package/dist/packages/core/src/hooks/useFocusTrap.js +2 -2
- package/dist/packages/core/src/hooks/useFontScale.js +6 -6
- package/dist/packages/core/src/hooks/useIcon.js +7 -7
- package/dist/packages/core/src/hooks/useListControls.js +2 -2
- package/dist/packages/core/src/hooks/usePageResetOnChange.d.ts +3 -3
- package/dist/packages/core/src/hooks/usePageResetOnChange.js +6 -6
- package/dist/packages/core/src/hooks/usePasswordChange.js +4 -4
- package/dist/packages/core/src/hooks/usePendingPress.js +7 -7
- package/dist/packages/core/src/hooks/useRelativeDay.js +4 -4
- package/dist/packages/core/src/hooks/useSoundCompassExam.js +6 -6
- package/dist/packages/core/src/hooks/useTablePaging.d.ts +7 -7
- package/dist/packages/core/src/hooks/useTablePaging.js +40 -34
- package/dist/packages/core/src/hooks/useTrainingSessionLog.js +35 -35
- package/dist/packages/core/src/hooks/useVisitSchedule.js +4 -4
- package/dist/packages/core/src/hooks/useWordAttributeFilter.js +14 -14
- package/dist/packages/core/src/hooks/useWordMeanings.js +5 -5
- package/dist/packages/core/src/hooks/useWordTrainingFilter.d.ts +3 -1
- package/dist/packages/core/src/hooks/useWordTrainingFilter.js +14 -12
- package/dist/packages/core/src/i18n/locales/en.json +13 -2
- package/dist/packages/core/src/i18n/locales/ko.json +12 -1
- package/dist/packages/core/src/types/wordSearch.d.ts +9 -0
- package/dist/packages/core/src/utils/audioMeter.js +5 -5
- package/dist/packages/core/src/utils/audioPeaks.d.ts +1 -1
- package/dist/packages/core/src/utils/audioPeaks.js +18 -18
- package/dist/packages/core/src/utils/blockGrid.js +4 -4
- package/dist/packages/core/src/utils/chunkSkew.js +9 -9
- package/dist/packages/core/src/utils/clipboard.js +3 -3
- package/dist/packages/core/src/utils/dailySelectionUtils.js +12 -12
- package/dist/packages/core/src/utils/date.js +12 -12
- package/dist/packages/core/src/utils/devWarn.d.ts +2 -2
- package/dist/packages/core/src/utils/devWarn.js +7 -7
- package/dist/packages/core/src/utils/deviceKind.d.ts +37 -7
- package/dist/packages/core/src/utils/deviceKind.js +53 -10
- package/dist/packages/core/src/utils/errorMessage.js +7 -7
- package/dist/packages/core/src/utils/filterPanelSummary.d.ts +1 -1
- package/dist/packages/core/src/utils/filterPanelSummary.js +16 -16
- package/dist/packages/core/src/utils/format.js +4 -4
- package/dist/packages/core/src/utils/getTrainingData.js +9 -9
- package/dist/packages/core/src/utils/imageConfig.js +17 -17
- package/dist/packages/core/src/utils/koreanSyllable.js +18 -18
- package/dist/packages/core/src/utils/navScroll.d.ts +2 -2
- package/dist/packages/core/src/utils/navScroll.js +6 -6
- package/dist/packages/core/src/utils/phonemeConvert.d.ts +7 -0
- package/dist/packages/core/src/utils/phonemeConvert.js +19 -10
- package/dist/packages/core/src/utils/phonemeGroups.js +2 -2
- package/dist/packages/core/src/utils/phonemePairSearch.d.ts +1 -0
- package/dist/packages/core/src/utils/phonemePairSearch.js +118 -102
- package/dist/packages/core/src/utils/phonemeSectionCodes.d.ts +52 -0
- package/dist/packages/core/src/utils/phonemeSectionCodes.js +76 -0
- package/dist/packages/core/src/utils/prefetchChunk.js +6 -6
- package/dist/packages/core/src/utils/pressable.d.ts +1 -1
- package/dist/packages/core/src/utils/pressable.js +3 -3
- package/dist/packages/core/src/utils/safeHref.js +4 -4
- package/dist/packages/core/src/utils/savedWordTables.js +5 -5
- package/dist/packages/core/src/utils/sessionTab.d.ts +7 -7
- package/dist/packages/core/src/utils/sessionTab.js +9 -9
- package/dist/packages/core/src/utils/speak.js +12 -12
- package/dist/packages/core/src/utils/textSort.d.ts +5 -5
- package/dist/packages/core/src/utils/textSort.js +47 -47
- package/dist/packages/core/src/utils/theme.js +3 -3
- package/dist/packages/core/src/utils/trainingItemResults.js +3 -3
- package/dist/packages/core/src/utils/ttsConfig.js +2 -2
- package/dist/packages/core/src/utils/wordAttributeFilterCodes.d.ts +2 -2
- package/dist/packages/core/src/utils/wordAttributeFilterCodes.js +48 -48
- package/dist/packages/core/src/utils/wordContrast.js +3 -3
- package/dist/packages/core/src/utils/wordPairIndex.js +4 -4
- package/dist/packages/core/src/utils/wordTrainingGenerators.js +4 -4
- package/dist/packages/core/src/utils/wordTrainingPool.js +15 -15
- package/dist/packages/core/src/utils/wordTrainingRuntime.js +6 -6
- package/dist/packages/core/src/utils/wornDate.d.ts +3 -3
- package/dist/packages/core/src/utils/wornDate.js +14 -14
- package/dist/packages/core/src/version.d.ts +1 -1
- package/dist/packages/core/src/version.js +1 -1
- package/dist/utils.cjs.js +4 -4
- package/package.json +1 -1
|
@@ -1678,7 +1678,7 @@ export declare function copyText(text: string): Promise<boolean>;
|
|
|
1678
1678
|
*
|
|
1679
1679
|
* 값은 손으로 적고 `test/coreVersion.test.ts` 가 package.json 과 어긋나면 운다.
|
|
1680
1680
|
*/
|
|
1681
|
-
export declare const CORE_VERSION = "0.
|
|
1681
|
+
export declare const CORE_VERSION = "0.323.0";
|
|
1682
1682
|
|
|
1683
1683
|
/** @public */
|
|
1684
1684
|
declare const coreDefault: Record<string, unknown>;
|
|
@@ -2039,7 +2039,7 @@ export declare interface DeviceRow {
|
|
|
2039
2039
|
worn: boolean;
|
|
2040
2040
|
}
|
|
2041
2041
|
|
|
2042
|
-
declare type DeviceSide = '
|
|
2042
|
+
declare type DeviceSide = 'left' | 'right';
|
|
2043
2043
|
|
|
2044
2044
|
export declare function DeviceSideTable({ rows, loading, onSelect, onDelete, onWear, onRelease, onAdd }: DeviceSideTableProps): JSX.Element;
|
|
2045
2045
|
|
|
@@ -2231,10 +2231,10 @@ export declare interface DropdownProps {
|
|
|
2231
2231
|
* @public 소음이 **들리는 크기**(0~2, 원본 소음 파일 기준) = mainVolume × 비율. 켜짐 여부는 보지
|
|
2232
2232
|
* 않는다. 결과 기록·파형이 쓴다. 소음 `<audio>` 에 거는 값은 `noiseElementVolume`.
|
|
2233
2233
|
*/
|
|
2234
|
-
export declare function effectiveNoiseVolume(settings:
|
|
2234
|
+
export declare function effectiveNoiseVolume(settings: SpeechVolumeSettings): number;
|
|
2235
2235
|
|
|
2236
2236
|
/** @public 문제 소리 볼륨(0~1) = mainVolume. 비율과 상관없다. */
|
|
2237
|
-
export declare function effectiveSpeechVolume(settings:
|
|
2237
|
+
export declare function effectiveSpeechVolume(settings: SpeechVolumeSettings): number;
|
|
2238
2238
|
|
|
2239
2239
|
/** @public */
|
|
2240
2240
|
export declare function EffectPartyPopper({ active, count, duration, strength, // multiplier for speed/spread
|
|
@@ -2927,6 +2927,16 @@ export declare function getTTSUrlResolver(): ((text: string) => string | Promise
|
|
|
2927
2927
|
/** @public 단어 풀 조회 */
|
|
2928
2928
|
export declare function getWordPool(): WordPool | null;
|
|
2929
2929
|
|
|
2930
|
+
/**
|
|
2931
|
+
* 등급 고르개의 설명 줄들 — 지금 언어로. 사전에 배열이 없으면 한국어 원문.
|
|
2932
|
+
*
|
|
2933
|
+
* **공개 API 가 아니다**(대응표에 `internal`) — 코어 안에서만 쓰고, 내보내는 것은 못이 읽기 때문이다.
|
|
2934
|
+
* 그래도 **이름은 영어다** — `internal` 이라도 배포 `d.ts` 에는 그대로 나가 소비자 편집기에 보인다
|
|
2935
|
+
* (사용자 지시 2026-10-13. 소비자 사용처 0 이라 옛 이름을 남기지 않았다 — 말귀의 같은 이름 함수는 제 지역 것이다).
|
|
2936
|
+
* 앱은 제 열쇠(`wordSearch.filter.gradeInfo`)와 제 받는 함수를 따로 갖는다.
|
|
2937
|
+
*/
|
|
2938
|
+
export declare function gradeDescriptions(t: TFunction): string[];
|
|
2939
|
+
|
|
2930
2940
|
/** @public 이 타입에 '문제(정답) 단어' 구조 제약이 있는가(편집기 카운트/후보 좁히기 판단용). */
|
|
2931
2941
|
export declare function hasQuestionWordConstraint(typeKey: WordTrainingTypeKey): boolean;
|
|
2932
2942
|
|
|
@@ -3179,20 +3189,20 @@ declare interface IsSelectionCorrectParams {
|
|
|
3179
3189
|
* 여기서 막으면 이 탭이 로그인된 채로 남는다 — 막는 것보다 나쁜 쪽이다.
|
|
3180
3190
|
*
|
|
3181
3191
|
* ```ts
|
|
3182
|
-
* onAuthStateChange((event,
|
|
3192
|
+
* onAuthStateChange((event, incoming) => {
|
|
3183
3193
|
* getSession().then(({ data }) => {
|
|
3184
|
-
* const
|
|
3185
|
-
* if (!isSessionForThisTab(
|
|
3186
|
-
*
|
|
3194
|
+
* const thisTab = data.session
|
|
3195
|
+
* if (!isSessionForThisTab(incoming, thisTab)) return // 다른 탭에서 온 것 — 무시
|
|
3196
|
+
* …thisTab 으로 상태를 맞춘다
|
|
3187
3197
|
* })
|
|
3188
3198
|
* })
|
|
3189
3199
|
* ```
|
|
3190
3200
|
*
|
|
3191
|
-
* @param
|
|
3192
|
-
* @param
|
|
3201
|
+
* @param incoming 이벤트가 실어 온 세션(없을 수 있다)
|
|
3202
|
+
* @param thisTab `getSession()` 이 이 탭 저장소에서 다시 읽은 세션
|
|
3193
3203
|
* @public
|
|
3194
3204
|
*/
|
|
3195
|
-
export declare function isSessionForThisTab(
|
|
3205
|
+
export declare function isSessionForThisTab(incoming: TabSessionLike | null | undefined, thisTab: TabSessionLike | null | undefined): boolean;
|
|
3196
3206
|
|
|
3197
3207
|
/**
|
|
3198
3208
|
* @public 문자열이 음절 패턴 DSL 문법인지 — 쉼표(,) 포함 여부로 판별한다.
|
|
@@ -3991,7 +4001,7 @@ declare interface NoiseContext_2 {
|
|
|
3991
4001
|
* @public 소음 `<audio>` 볼륨(0~1) = min(1, 들리는 크기 ÷ gain). gain 은 소음 파일이 원본보다 몇 배
|
|
3992
4002
|
* 큰지 — 기본은 `configureStorage({ noiseFileGain })`(없으면 1).
|
|
3993
4003
|
*/
|
|
3994
|
-
export declare function noiseElementVolume(settings:
|
|
4004
|
+
export declare function noiseElementVolume(settings: SpeechVolumeSettings, gain?: number): number;
|
|
3995
4005
|
|
|
3996
4006
|
/** @public */
|
|
3997
4007
|
export declare const NoisePlayerContext: Context<NoisePlayerContextValue | null>;
|
|
@@ -4379,10 +4389,8 @@ declare type PanelRowDescription = {
|
|
|
4379
4389
|
export declare function PanelRowDevice({ devices, onRelease, emptyLabel }: PanelRowDeviceProps): JSX.Element;
|
|
4380
4390
|
|
|
4381
4391
|
export declare interface PanelRowDeviceProps {
|
|
4382
|
-
|
|
4383
|
-
|
|
4384
|
-
우: DeviceEntry | null;
|
|
4385
|
-
};
|
|
4392
|
+
/** 쪽별로 지금 끼고 있는 기기 — 열쇠는 `DeviceSide` 값이다(`HearingDeviceInfo` 와 같은 꼴) */
|
|
4393
|
+
devices: Record<DeviceSide, DeviceEntry | null>;
|
|
4386
4394
|
/** 있으면 각 쪽 이름 옆에 '착용 해제'가 선다 — 그 쪽의 '지금 착용중' 만 내린다(이력은 남는다) */
|
|
4387
4395
|
onRelease?: (side: DeviceSide) => void;
|
|
4388
4396
|
/**
|
|
@@ -4850,6 +4858,33 @@ export declare interface PhonemeFilterPanelProps {
|
|
|
4850
4858
|
*/
|
|
4851
4859
|
export declare function phonemePartsOf(word: string): string[];
|
|
4852
4860
|
|
|
4861
|
+
/**
|
|
4862
|
+
* **음절 자리의 코드** — `onset`·`vowel`·`coda`·`glide`, 그리고 빔(`none`).
|
|
4863
|
+
*
|
|
4864
|
+
* ## 왜 제 모듈인가
|
|
4865
|
+
*
|
|
4866
|
+
* 처음에는 이 가름을 `phonemePairSearch` 에 두고 `phonemeConvert` 가 들여왔다 — 그런데
|
|
4867
|
+
* `phonemePairSearch` 도 `phonemeConvert`(`VOWEL_TO_PHONEME`)를 들여온다. **돌림 import** 가
|
|
4868
|
+
* 되어 시험 **338 꾸러미**가 한꺼번에 무너졌다(2026-10-13). 두 쪽이 함께 쓰는 것은 **어느
|
|
4869
|
+
* 한쪽이 아니라 그 아래**에 둔다.
|
|
4870
|
+
*
|
|
4871
|
+
* ## 왜 코드인가
|
|
4872
|
+
*
|
|
4873
|
+
* 전에는 열쇠가 한글(`'초성'`)이었고 그것이 **저장된다** — 단어표의
|
|
4874
|
+
* `searchConfig.phonemeSelected` 가 그 꼴이다. 저장되는 값이 표시 언어에 묶이면 말을 고치려
|
|
4875
|
+
* 해도 자료를 밀어야 한다(사장님 지시 2026-10-13 "동작에 한글이 끼지 말라").
|
|
4876
|
+
*
|
|
4877
|
+
* **값을 바꾸지 않고 읽는 쪽을 너그럽게 했다** — 표준의 *lenient reader · strict writer*.
|
|
4878
|
+
* 저장된 표를 밀지 않아도 되고 소비자 코드도 안 바뀐다. 안쪽 로직에서만 한글이 사라진다.
|
|
4879
|
+
*
|
|
4880
|
+
* 어휘는 **훈련 필터가 이미 쓰던 것**과 같게 뒀다(`useWordTrainingFilter` 의 `onset`·`vowel`·
|
|
4881
|
+
* `coda`) — 같은 뜻에 어휘가 둘이던 것을 모았다.
|
|
4882
|
+
*
|
|
4883
|
+
* **값(자모 `'ㄴ'`)은 그대로다** — 그것은 한국어 글자 그 자체이고 바꿀 것은 열쇠와 빔 값이다.
|
|
4884
|
+
*/
|
|
4885
|
+
/** 음절 자리 코드 @public */
|
|
4886
|
+
declare type PhonemeSectionCode = 'onset' | 'vowel' | 'coda' | 'glide';
|
|
4887
|
+
|
|
4853
4888
|
/** @public */
|
|
4854
4889
|
export declare function PhonemeSelectBlock({ sections, selectedList, count, onCountChange, maxCount, minCount, combinationSections, combinationSectionsForSlot, onSelect, placeholder, className, title, titleIcon, disc, showInfoButton, onClearPhoneme, onSearch, onSearchEmpty, searchDisabled, searchLabel, searchChecking, pairMode, sectionType, beforeSearchContent, beforeContent, afterContent, hideCountControl, ordinal, }: PhonemeSelectBlockProps): JSX.Element;
|
|
4855
4890
|
|
|
@@ -5287,7 +5322,7 @@ export declare const POS_LABEL: Record<string, string>;
|
|
|
5287
5322
|
* 사전에 없는 약호는 한국어 전체 표기(`POS_LABEL`)로 둔다 — 자료에 새 약호가 와도 빈칸이 안 된다.
|
|
5288
5323
|
* @public
|
|
5289
5324
|
*/
|
|
5290
|
-
export declare function posLabels(t:
|
|
5325
|
+
export declare function posLabels(t: Translate): Record<string, string>;
|
|
5291
5326
|
|
|
5292
5327
|
/**
|
|
5293
5328
|
* **늦게 받는 화면 청크를 한가할 때 미리 받아 둔다.**
|
|
@@ -6754,7 +6789,7 @@ export declare type ShuffledItem = {
|
|
|
6754
6789
|
text: string;
|
|
6755
6790
|
};
|
|
6756
6791
|
|
|
6757
|
-
declare type Side = '
|
|
6792
|
+
declare type Side = 'left' | 'right';
|
|
6758
6793
|
|
|
6759
6794
|
/** @public */
|
|
6760
6795
|
export declare function SideNav(props: SideNavProps): React_2.JSX.Element;
|
|
@@ -7108,6 +7143,13 @@ export declare interface SpeakerPos {
|
|
|
7108
7143
|
/** @public */
|
|
7109
7144
|
export declare type SpeakerState = 'idle' | 'active' | 'played' | 'correct' | 'wrong';
|
|
7110
7145
|
|
|
7146
|
+
/** `effectiveSpeechVolume`·`effectiveNoiseVolume`·`noiseElementVolume` 이 받는 것 —
|
|
7147
|
+
* **공개 `d.ts` 에 이름이 그대로 나가는 자리**라 영어로 둔다. 안쪽 이름은 한글로 쓰는 저장소지만,
|
|
7148
|
+
* 소비자가 편집기에서 보는 이름은 영어라야 한다(사용자 지시 2026-10-13). */
|
|
7149
|
+
declare type SpeechVolumeSettings = Pick<CoreNoiseSettings, 'level' | 'mainVolume'> & {
|
|
7150
|
+
noiseRatio?: number;
|
|
7151
|
+
};
|
|
7152
|
+
|
|
7111
7153
|
/**
|
|
7112
7154
|
* 앱에 처음 들어올 때 로고를 한 번 보여 주는 연출.
|
|
7113
7155
|
*
|
|
@@ -9525,6 +9567,13 @@ export declare interface TrainingWordCardProps {
|
|
|
9525
9567
|
orderRank?: number | null;
|
|
9526
9568
|
}
|
|
9527
9569
|
|
|
9570
|
+
/** `t` 하나만 받는 작은 꼴 — `TFunction` 을 들여오지 않아 이 모듈이 i18n 에 안 매인다 */
|
|
9571
|
+
/** i18next `t` 와 같은 꼴 — **공개 서명(`posLabels`·`wordTypeLabels`)이 받는 자리**라 이름을 영어로 둔다
|
|
9572
|
+
* (사용자 지시 2026-10-13). 안쪽 이름은 한글이어도 소비자가 보는 이름은 영어라야 한다. */
|
|
9573
|
+
declare type Translate = (k: string, o: {
|
|
9574
|
+
defaultValue: string;
|
|
9575
|
+
}) => string;
|
|
9576
|
+
|
|
9528
9577
|
declare type TranslateFn = TFunction;
|
|
9529
9578
|
|
|
9530
9579
|
/**
|
|
@@ -9770,22 +9819,10 @@ export declare function useDeviceManagement(): {
|
|
|
9770
9819
|
setShowDevice: Dispatch<SetStateAction<boolean>>;
|
|
9771
9820
|
deviceDirection: Side;
|
|
9772
9821
|
setDeviceDirection: Dispatch<SetStateAction<Side>>;
|
|
9773
|
-
devices:
|
|
9774
|
-
|
|
9775
|
-
|
|
9776
|
-
|
|
9777
|
-
setDevices: Dispatch<SetStateAction< {
|
|
9778
|
-
좌: DeviceForm | null;
|
|
9779
|
-
우: DeviceForm | null;
|
|
9780
|
-
}>>;
|
|
9781
|
-
deviceHistory: {
|
|
9782
|
-
좌: DeviceForm[];
|
|
9783
|
-
우: DeviceForm[];
|
|
9784
|
-
};
|
|
9785
|
-
setDeviceHistory: Dispatch<SetStateAction< {
|
|
9786
|
-
좌: DeviceForm[];
|
|
9787
|
-
우: DeviceForm[];
|
|
9788
|
-
}>>;
|
|
9822
|
+
devices: Record<Side, DeviceForm | null>;
|
|
9823
|
+
setDevices: Dispatch<SetStateAction<Record<Side, DeviceForm | null>>>;
|
|
9824
|
+
deviceHistory: Record<Side, DeviceForm[]>;
|
|
9825
|
+
setDeviceHistory: Dispatch<SetStateAction<Record<Side, DeviceForm[]>>>;
|
|
9789
9826
|
showDeviceList: boolean;
|
|
9790
9827
|
setShowDeviceList: Dispatch<SetStateAction<boolean>>;
|
|
9791
9828
|
listForSide: Side;
|
|
@@ -9995,15 +10032,15 @@ export declare function usePagedList<T>(items: T[], perPage: number, page: numbe
|
|
|
9995
10032
|
* React 가 이 꼴을 위해 내준 길이다(같은 컴포넌트를 바로 다시 그린다).
|
|
9996
10033
|
*
|
|
9997
10034
|
* ```ts
|
|
9998
|
-
* usePageResetOnChange(`${검색어}|${갈래}|${
|
|
10035
|
+
* usePageResetOnChange(`${검색어}|${갈래}|${sort}`, setPage)
|
|
9999
10036
|
* const { pageItems, totalPages } = usePagedList(걸러낸것, 쪽크기, page)
|
|
10000
10037
|
* ```
|
|
10001
10038
|
*
|
|
10002
|
-
* @param
|
|
10039
|
+
* @param key 조건을 하나로 이어 붙인 글 — 이것이 달라지면 첫 쪽이다
|
|
10003
10040
|
* @param setPage 쪽 번호를 쥔 쪽에서 준다
|
|
10004
10041
|
* @public
|
|
10005
10042
|
*/
|
|
10006
|
-
export declare function usePageResetOnChange(
|
|
10043
|
+
export declare function usePageResetOnChange(key: string, setPage: (n: number) => void): void;
|
|
10007
10044
|
|
|
10008
10045
|
/**
|
|
10009
10046
|
* 비밀번호 변경 폼 상태와 핸들러를 캡슐화한 훅.
|
|
@@ -10108,28 +10145,28 @@ export declare function useTablePaging<T>(rows: readonly T[], resetOn?: unknown,
|
|
|
10108
10145
|
* **정렬이 바뀌면 첫 쪽으로** — `useTablePaging` 의 `resetOn` 에 돌려받은 `정렬` 을 그대로 넣는다.
|
|
10109
10146
|
* `정렬` 은 누를 때만 새 객체가 되므로(렌더마다 새로 만들지 않는다) 그 자체가 열쇠다. 쪽을 따로 들고 있으면 `onSortChange` 에서 되돌린다.
|
|
10110
10147
|
*
|
|
10111
|
-
* `sortRows(rows,
|
|
10148
|
+
* `sortRows(rows, getValue)` 은 지금 정렬로 줄을 세운 **새 배열**을 준다(정렬이 없으면 받은 배열 그대로) — `compareCell`(숫자는 수로,
|
|
10112
10149
|
* 한글·영문은 사람 차례) 으로 견주고 **빈 값(null·undefined·'')은 오름·내림 모두 맨 뒤**(ListPopup 과 같은 규칙).
|
|
10113
10150
|
*
|
|
10114
10151
|
* @example
|
|
10115
|
-
* const {
|
|
10152
|
+
* const { sort, field, sortRows } = useTableSort<'name' | 'joined'>()
|
|
10116
10153
|
* const 세운줄 = useMemo(() => sortRows(rows, (r, key) => r[key]), [rows, sortRows])
|
|
10117
|
-
* const { pageRows, pageSizeProps, paginationProps } = useTablePaging(세운줄,
|
|
10118
|
-
* <Table fields={[
|
|
10154
|
+
* const { pageRows, pageSizeProps, paginationProps } = useTablePaging(세운줄, sort) // 정렬이 바뀌면 첫 쪽
|
|
10155
|
+
* <Table fields={[field('이름', 'name'), field('가입일', 'joined')]} … />
|
|
10119
10156
|
*
|
|
10120
10157
|
* @public
|
|
10121
10158
|
*/
|
|
10122
10159
|
export declare function useTableSort<K extends string>(opts?: TableSortOptions<K>): {
|
|
10123
|
-
|
|
10160
|
+
sort: {
|
|
10124
10161
|
key: K;
|
|
10125
10162
|
asc: boolean;
|
|
10126
10163
|
} | null;
|
|
10127
|
-
|
|
10164
|
+
field: (label: string, key: K) => {
|
|
10128
10165
|
label: string;
|
|
10129
10166
|
sortDir: "desc" | "asc" | null;
|
|
10130
10167
|
onClick: () => void;
|
|
10131
10168
|
};
|
|
10132
|
-
sortRows: <R>(rows: readonly R[],
|
|
10169
|
+
sortRows: <R>(rows: readonly R[], getValue: (row: R, key: K) => unknown) => readonly R[];
|
|
10133
10170
|
};
|
|
10134
10171
|
|
|
10135
10172
|
/**
|
|
@@ -10987,7 +11024,16 @@ export declare interface WordSearchResultGroup {
|
|
|
10987
11024
|
export declare interface WordSearchResultItem {
|
|
10988
11025
|
id: string;
|
|
10989
11026
|
words: WordSearchResultWord[];
|
|
11027
|
+
/**
|
|
11028
|
+
* 갈린 자리 — **옛 한글 이름**(`'초성'`·`'모음'`·`'종성'`·`'활음'`)이다.
|
|
11029
|
+
*
|
|
11030
|
+
* @deprecated `diffSectionCode` 를 쓴다 — 같은 자리를 코드로 가리킨다. 2026-10-13 안쪽을
|
|
11031
|
+
* 코드로 옮겼지만 **소비자가 이 값으로 묶음을 가른다**(말귀 `WordPairsPage` 의 `GROUP_ORDER`).
|
|
11032
|
+
* 혼자 바꾸면 그쪽 묶음이 조용히 빈다. 소비자가 옮긴 뒤 걷는다.
|
|
11033
|
+
*/
|
|
10990
11034
|
diffSection?: string;
|
|
11035
|
+
/** 갈린 자리 — 코드(`'onset'`·`'vowel'`·`'coda'`·`'glide'`). 이쪽이 정본이다. */
|
|
11036
|
+
diffSectionCode?: PhonemeSectionCode;
|
|
10991
11037
|
diffHasEmpty?: boolean;
|
|
10992
11038
|
}
|
|
10993
11039
|
|
|
@@ -11238,11 +11284,24 @@ export declare interface WordTableButtonProps {
|
|
|
11238
11284
|
className?: string;
|
|
11239
11285
|
}
|
|
11240
11286
|
|
|
11241
|
-
/**
|
|
11242
|
-
|
|
11287
|
+
/**
|
|
11288
|
+
* 단어표 칸에 무엇을 그리나 — **코드다, 보일 글이 아니다.**
|
|
11289
|
+
*
|
|
11290
|
+
* 2026-10-13 한글 값(`'단어'`·`'이미지'`…)에서 옮겼다(사장님 지시 "모두 표준으로"). 저장되는
|
|
11291
|
+
* 값이 표시 언어에 묶이면 **말을 고치려 해도 자료를 밀어야** 한다 — 보일 글은 사전이 쥐고
|
|
11292
|
+
* (`wordTable.filter.*`), 코드는 안 바뀐다. 같은 저장소의 `wordAttributeFilterCodes` 가
|
|
11293
|
+
* 이미 그 꼴이었다(`'grade'`·`'native'`…).
|
|
11294
|
+
*
|
|
11295
|
+
* 옮길 때 소비자 넷을 셌다 — `WordTableContentType`·`WordTableCutLine` 을 적는 줄이 **0** 이고,
|
|
11296
|
+
* 저장되는 자리도 없었다(`SavedWordTable` 에 안 들고 `localStorage` 에도 안 적는다).
|
|
11297
|
+
* 그래서 받침 없이 그냥 옮겼다 — `DeviceSide` 때와 달리 밀 자료가 없다.
|
|
11298
|
+
*
|
|
11299
|
+
* @public
|
|
11300
|
+
*/
|
|
11301
|
+
export declare type WordTableContentType = 'word' | 'image' | 'standardPron' | 'colloquialPron';
|
|
11243
11302
|
|
|
11244
|
-
/** @public */
|
|
11245
|
-
export declare type WordTableCutLine = '
|
|
11303
|
+
/** 칸 사이 선 — **코드다.** 보일 글은 사전(`wordTable.filter.show`·`.dotted`·`.corner`·`.hide`). @public */
|
|
11304
|
+
export declare type WordTableCutLine = 'show' | 'dashed' | 'corner' | 'hide';
|
|
11246
11305
|
|
|
11247
11306
|
/** 표시(비편집) 단어표의 표 설정 값 — WordTable 렌더 props에 그대로 전달한다. */
|
|
11248
11307
|
export declare interface WordTableDisplaySettings {
|
|
@@ -11601,7 +11660,7 @@ export declare type WordTrainingTypeKey = 'SAME_SOUND_PICK' | 'SAME_OR_DIFF' | '
|
|
|
11601
11660
|
* **어종 약호 → 지금 언어의 이름**(`{ '한자': 'Sino-Korean', … }`). 쓰는 법은 `posLabels` 와 같다.
|
|
11602
11661
|
* @public
|
|
11603
11662
|
*/
|
|
11604
|
-
export declare function wordTypeLabels(t:
|
|
11663
|
+
export declare function wordTypeLabels(t: Translate): Record<string, string>;
|
|
11605
11664
|
|
|
11606
11665
|
/**
|
|
11607
11666
|
* @public 틀린 문항만 — 음소별 오류를 세는 쪽이 먼저 볼 것이다.
|
|
@@ -11610,21 +11669,4 @@ export declare function wordTypeLabels(t: 번역): Record<string, string>;
|
|
|
11610
11669
|
*/
|
|
11611
11670
|
export declare function wrongItems(items: readonly TrainingItemResult[]): TrainingItemResult[];
|
|
11612
11671
|
|
|
11613
|
-
/**
|
|
11614
|
-
* 등급 고르개의 설명 줄들 — 지금 언어로. 사전에 배열이 없으면 한국어 원문.
|
|
11615
|
-
*
|
|
11616
|
-
* **공개 API 가 아니다**(대응표에 `internal`) — 코어 안에서만 쓰고, 내보내는 것은 못이 읽기 때문이다.
|
|
11617
|
-
* 앱은 제 열쇠(`wordSearch.filter.gradeInfo`)와 제 받는 함수를 따로 갖는다.
|
|
11618
|
-
*/
|
|
11619
|
-
export declare function 등급설명(t: TFunction): string[];
|
|
11620
|
-
|
|
11621
|
-
/** `t` 하나만 받는 작은 꼴 — `TFunction` 을 들여오지 않아 이 모듈이 i18n 에 안 매인다 */
|
|
11622
|
-
declare type 번역 = (k: string, o: {
|
|
11623
|
-
defaultValue: string;
|
|
11624
|
-
}) => string;
|
|
11625
|
-
|
|
11626
|
-
declare type 비율설정 = Pick<CoreNoiseSettings, 'level' | 'mainVolume'> & {
|
|
11627
|
-
noiseRatio?: number;
|
|
11628
|
-
};
|
|
11629
|
-
|
|
11630
11672
|
export { }
|
|
@@ -37,7 +37,7 @@ function Item({ title, body, open = false, onToggle, avatar, titleClassName = 'b
|
|
|
37
37
|
export default function Accordion({ items = [], defaultOpenIndex = 0, size = 72, className = '', bodyClassName, }) {
|
|
38
38
|
/* 펼침을 자리 번호로만 들고 있어, 앞에 항목이 더해지면 **다른 항목이** 펼쳐졌다. id 가 있는 항목을 누르면 id 로 기억한다.
|
|
39
39
|
처음(아직 누르기 전)은 defaultOpenIndex 자리 — 항목이 늦게 와도 그 자리가 열린다(예전과 같다). */
|
|
40
|
-
const [
|
|
41
|
-
const
|
|
42
|
-
return (_jsx("div", { className: `accordion-group accordion-group--s${size} ${className}`.trim(), role: "list", children: items.map((item, i) => (_jsx(Item, { title: item.title, body: item.body, avatar: item.avatar, open:
|
|
40
|
+
const [open, setOpen] = useState({ index: defaultOpenIndex });
|
|
41
|
+
const isOpen = (item, i) => open.id != null && item.id != null ? item.id === open.id : open.id == null && i === open.index;
|
|
42
|
+
return (_jsx("div", { className: `accordion-group accordion-group--s${size} ${className}`.trim(), role: "list", children: items.map((item, i) => (_jsx(Item, { title: item.title, body: item.body, avatar: item.avatar, open: isOpen(item, i), onToggle: () => setOpen(isOpen(item, i) ? { index: -1 } : { index: i, id: item.id }), bodyClassName: bodyClassName }, item.id ?? i))) }));
|
|
43
43
|
}
|
|
@@ -29,8 +29,8 @@ export default function Alert({ tone = 'info', title, message, children, dismiss
|
|
|
29
29
|
return null;
|
|
30
30
|
const cls = cx('alert', `alert--${tone}`, className);
|
|
31
31
|
/* 톤과 상관없이 늘 role="alert" 였다 — "저장했습니다"(success)·안내(info)까지 하던 말을 끊고 읽혔다 */
|
|
32
|
-
const
|
|
33
|
-
const role =
|
|
32
|
+
const liveMode = live ?? (tone === 'danger' || tone === 'warning' ? 'assertive' : 'polite');
|
|
33
|
+
const role = liveMode === 'assertive' ? 'alert' : liveMode === 'polite' ? 'status' : undefined;
|
|
34
34
|
const hasTitle = Boolean(title);
|
|
35
35
|
const hasMessage = Boolean(message || children);
|
|
36
36
|
return (_jsxs("div", { ref: rootRef, className: cls, role: role, children: [_jsxs("div", { className: "alert__body", children: [_jsxs("div", { className: "alert__header", children: [_jsx(Icon, { icon: TONE_ICON[tone], size: 20, className: "alert__icon" }), hasTitle && _jsx("span", { className: "alert__title body-2", children: title }), !hasTitle && hasMessage && _jsx("div", { className: "alert__message body-3", children: message || children })] }), hasTitle && hasMessage && (_jsx("div", { className: "alert__message alert__message--indented body-3", children: message || children }))] }), dismissible && (_jsx("button", { type: "button", className: "alert__dismiss", onClick: handleDismiss, "aria-label": t('common.close', '닫기'), children: "\u00D7" }))] }));
|