@ihabdevteam/core 0.8.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/README.md +591 -0
- package/dist/components.cjs.css +19 -0
- package/dist/components.cjs.js +975 -0
- package/dist/components.esm.css +19 -0
- package/dist/components.esm.js +975 -0
- package/dist/hooks.cjs.css +1 -0
- package/dist/hooks.cjs.js +799 -0
- package/dist/hooks.esm.css +1 -0
- package/dist/hooks.esm.js +799 -0
- package/dist/ihabdevteam-core-tokens.css +1 -0
- package/dist/ihabdevteam-core.cjs.js +993 -0
- package/dist/ihabdevteam-core.css +1 -0
- package/dist/ihabdevteam-core.d.ts +8272 -0
- package/dist/ihabdevteam-core.esm.js +993 -0
- package/dist/logo/Logo_APEB.svg +53 -0
- package/dist/logo/Logo_APEB_black.svg +42 -0
- package/dist/logo/Logo_APEB_white.svg +42 -0
- package/dist/logo/Logo_HTP_kr.svg +21 -0
- package/dist/logo/Logo_HTP_kr_black.svg +17 -0
- package/dist/logo/Logo_HTP_kr_white.svg +17 -0
- package/dist/logo/Logo_IHAB_en.svg +18 -0
- package/dist/logo/Logo_IHAB_en_black.svg +14 -0
- package/dist/logo/Logo_IHAB_en_white.svg +14 -0
- package/dist/logo/Logo_IHAB_kr.svg +18 -0
- package/dist/logo/Logo_IHAB_kr_black.svg +14 -0
- package/dist/logo/Logo_IHAB_kr_white.svg +14 -0
- package/dist/logo/Logo_SDS_kr.svg +22 -0
- package/dist/logo/Logo_SDS_kr_black.svg +18 -0
- package/dist/logo/Logo_SDS_kr_white.svg +18 -0
- package/dist/logo/Logo_speechearManager_kr.svg +20 -0
- package/dist/logo/Logo_speechearManager_kr_black.svg +21 -0
- package/dist/logo/Logo_speechearManager_kr_textWhite.svg +45 -0
- package/dist/logo/Logo_speechearManager_kr_white.svg +21 -0
- package/dist/logo/Logo_speechear_kr.svg +17 -0
- package/dist/logo/Logo_speechear_kr_black.svg +16 -0
- package/dist/logo/Logo_speechear_kr_textWhite.svg +42 -0
- package/dist/logo/Logo_speechear_kr_white.svg +16 -0
- package/dist/logo/Symbol_APEB.svg +34 -0
- package/dist/logo/Symbol_APEB_black.svg +15 -0
- package/dist/logo/Symbol_APEB_white.svg +15 -0
- package/dist/logo/Symbol_HTP.svg +14 -0
- package/dist/logo/Symbol_HTP_black.svg +10 -0
- package/dist/logo/Symbol_HTP_white.svg +10 -0
- package/dist/logo/Symbol_IHAB.svg +14 -0
- package/dist/logo/Symbol_IHAB_black.svg +10 -0
- package/dist/logo/Symbol_IHAB_white.svg +10 -0
- package/dist/logo/Symbol_SDS.svg +14 -0
- package/dist/logo/Symbol_SDS_black.svg +10 -0
- package/dist/logo/Symbol_SDS_white.svg +10 -0
- package/dist/logo/Symbol_speechear.svg +15 -0
- package/dist/logo/Symbol_speechear_black.svg +16 -0
- package/dist/logo/Symbol_speechear_white.svg +16 -0
- package/dist/logo/qr_speechear.svg +1 -0
- package/dist/packages/core/src/CoreScope.d.ts +40 -0
- package/dist/packages/core/src/CoreScope.js +19 -0
- package/dist/packages/core/src/components/Accordion.css +125 -0
- package/dist/packages/core/src/components/Accordion.d.ts +19 -0
- package/dist/packages/core/src/components/Accordion.js +33 -0
- package/dist/packages/core/src/components/ActionCard.css +109 -0
- package/dist/packages/core/src/components/ActionCard.d.ts +33 -0
- package/dist/packages/core/src/components/ActionCard.js +28 -0
- package/dist/packages/core/src/components/Alert.css +76 -0
- package/dist/packages/core/src/components/Alert.d.ts +18 -0
- package/dist/packages/core/src/components/Alert.js +28 -0
- package/dist/packages/core/src/components/AudioMeter.css +80 -0
- package/dist/packages/core/src/components/AudioMeter.d.ts +49 -0
- package/dist/packages/core/src/components/AudioMeter.js +91 -0
- package/dist/packages/core/src/components/Avatar.css +42 -0
- package/dist/packages/core/src/components/Avatar.d.ts +21 -0
- package/dist/packages/core/src/components/Avatar.js +31 -0
- package/dist/packages/core/src/components/Badge.css +166 -0
- package/dist/packages/core/src/components/Badge.d.ts +82 -0
- package/dist/packages/core/src/components/Badge.js +62 -0
- package/dist/packages/core/src/components/BarChart.css +142 -0
- package/dist/packages/core/src/components/BarChart.d.ts +16 -0
- package/dist/packages/core/src/components/BarChart.js +187 -0
- package/dist/packages/core/src/components/Board.css +85 -0
- package/dist/packages/core/src/components/Board.d.ts +39 -0
- package/dist/packages/core/src/components/Board.js +12 -0
- package/dist/packages/core/src/components/BottomNav.css +105 -0
- package/dist/packages/core/src/components/BottomNav.d.ts +32 -0
- package/dist/packages/core/src/components/BottomNav.js +92 -0
- package/dist/packages/core/src/components/Breadcrumb.css +62 -0
- package/dist/packages/core/src/components/Breadcrumb.d.ts +13 -0
- package/dist/packages/core/src/components/Breadcrumb.js +10 -0
- package/dist/packages/core/src/components/BulkBar.css +75 -0
- package/dist/packages/core/src/components/BulkBar.d.ts +22 -0
- package/dist/packages/core/src/components/BulkBar.js +40 -0
- package/dist/packages/core/src/components/Button.css +655 -0
- package/dist/packages/core/src/components/Button.d.ts +5 -0
- package/dist/packages/core/src/components/Button.js +202 -0
- package/dist/packages/core/src/components/Calendar.css +249 -0
- package/dist/packages/core/src/components/Calendar.d.ts +23 -0
- package/dist/packages/core/src/components/Calendar.js +92 -0
- package/dist/packages/core/src/components/ChartSection.css +191 -0
- package/dist/packages/core/src/components/ChartSection.d.ts +42 -0
- package/dist/packages/core/src/components/ChartSection.js +22 -0
- package/dist/packages/core/src/components/Checkbox.css +94 -0
- package/dist/packages/core/src/components/Checkbox.d.ts +16 -0
- package/dist/packages/core/src/components/Checkbox.js +15 -0
- package/dist/packages/core/src/components/ChoiceChips.css +65 -0
- package/dist/packages/core/src/components/ChoiceChips.d.ts +15 -0
- package/dist/packages/core/src/components/ChoiceChips.js +8 -0
- package/dist/packages/core/src/components/CircleBadge.d.ts +31 -0
- package/dist/packages/core/src/components/CircleBadge.js +20 -0
- package/dist/packages/core/src/components/CodeBox.css +62 -0
- package/dist/packages/core/src/components/CodeBox.d.ts +18 -0
- package/dist/packages/core/src/components/CodeBox.js +132 -0
- package/dist/packages/core/src/components/ColorPicker.css +40 -0
- package/dist/packages/core/src/components/ColorPicker.d.ts +17 -0
- package/dist/packages/core/src/components/ColorPicker.js +23 -0
- package/dist/packages/core/src/components/CompanyMeta.css +33 -0
- package/dist/packages/core/src/components/CompanyMeta.d.ts +14 -0
- package/dist/packages/core/src/components/CompanyMeta.js +12 -0
- package/dist/packages/core/src/components/CountTile.css +47 -0
- package/dist/packages/core/src/components/CountTile.d.ts +22 -0
- package/dist/packages/core/src/components/CountTile.js +24 -0
- package/dist/packages/core/src/components/DatePicker.css +151 -0
- package/dist/packages/core/src/components/DatePicker.d.ts +13 -0
- package/dist/packages/core/src/components/DatePicker.js +107 -0
- package/dist/packages/core/src/components/Dialog.css +98 -0
- package/dist/packages/core/src/components/Dialog.d.ts +31 -0
- package/dist/packages/core/src/components/Dialog.js +51 -0
- package/dist/packages/core/src/components/Divider.css +33 -0
- package/dist/packages/core/src/components/Divider.d.ts +13 -0
- package/dist/packages/core/src/components/Divider.js +14 -0
- package/dist/packages/core/src/components/Dropdown.css +175 -0
- package/dist/packages/core/src/components/Dropdown.d.ts +23 -0
- package/dist/packages/core/src/components/Dropdown.js +117 -0
- package/dist/packages/core/src/components/Effect/EffectPartyPopper.css +25 -0
- package/dist/packages/core/src/components/Effect/EffectPartyPopper.d.ts +11 -0
- package/dist/packages/core/src/components/Effect/EffectPartyPopper.js +298 -0
- package/dist/packages/core/src/components/Effect/EffectPartyPopperHost.d.ts +5 -0
- package/dist/packages/core/src/components/Effect/EffectPartyPopperHost.js +13 -0
- package/dist/packages/core/src/components/EmptyState.css +23 -0
- package/dist/packages/core/src/components/EmptyState.d.ts +19 -0
- package/dist/packages/core/src/components/EmptyState.js +7 -0
- package/dist/packages/core/src/components/ErrorState.css +2 -0
- package/dist/packages/core/src/components/ErrorState.d.ts +18 -0
- package/dist/packages/core/src/components/ErrorState.js +11 -0
- package/dist/packages/core/src/components/FileUpload.css +114 -0
- package/dist/packages/core/src/components/FileUpload.d.ts +25 -0
- package/dist/packages/core/src/components/FileUpload.js +111 -0
- package/dist/packages/core/src/components/FilterPanel.css +188 -0
- package/dist/packages/core/src/components/FilterPanel.d.ts +34 -0
- package/dist/packages/core/src/components/FilterPanel.js +82 -0
- package/dist/packages/core/src/components/FilterSectionInfo.d.ts +12 -0
- package/dist/packages/core/src/components/FilterSectionInfo.js +15 -0
- package/dist/packages/core/src/components/Footer.css +186 -0
- package/dist/packages/core/src/components/Footer.d.ts +18 -0
- package/dist/packages/core/src/components/Footer.js +19 -0
- package/dist/packages/core/src/components/Header.css +274 -0
- package/dist/packages/core/src/components/Header.d.ts +44 -0
- package/dist/packages/core/src/components/Header.js +98 -0
- package/dist/packages/core/src/components/HearingDeviceInfo.css +48 -0
- package/dist/packages/core/src/components/HearingDeviceInfo.d.ts +22 -0
- package/dist/packages/core/src/components/HearingDeviceInfo.js +13 -0
- package/dist/packages/core/src/components/Icon.d.ts +14 -0
- package/dist/packages/core/src/components/Icon.js +73 -0
- package/dist/packages/core/src/components/IconGridMenu.css +141 -0
- package/dist/packages/core/src/components/IconGridMenu.d.ts +20 -0
- package/dist/packages/core/src/components/IconGridMenu.js +45 -0
- package/dist/packages/core/src/components/LandingBottomSticky.css +114 -0
- package/dist/packages/core/src/components/LandingBottomSticky.d.ts +26 -0
- package/dist/packages/core/src/components/LandingBottomSticky.js +20 -0
- package/dist/packages/core/src/components/LandingHeader.css +192 -0
- package/dist/packages/core/src/components/LandingHeader.d.ts +67 -0
- package/dist/packages/core/src/components/LandingHeader.js +40 -0
- package/dist/packages/core/src/components/Loader.css +88 -0
- package/dist/packages/core/src/components/Loader.d.ts +14 -0
- package/dist/packages/core/src/components/Loader.js +12 -0
- package/dist/packages/core/src/components/NoticeBox.css +79 -0
- package/dist/packages/core/src/components/NoticeBox.d.ts +21 -0
- package/dist/packages/core/src/components/NoticeBox.js +19 -0
- package/dist/packages/core/src/components/PageTitle.css +27 -0
- package/dist/packages/core/src/components/PageTitle.d.ts +23 -0
- package/dist/packages/core/src/components/PageTitle.js +10 -0
- package/dist/packages/core/src/components/Pagination.css +11 -0
- package/dist/packages/core/src/components/Pagination.d.ts +22 -0
- package/dist/packages/core/src/components/Pagination.js +20 -0
- package/dist/packages/core/src/components/Panel.css +361 -0
- package/dist/packages/core/src/components/Panel.d.ts +166 -0
- package/dist/packages/core/src/components/Panel.js +162 -0
- package/dist/packages/core/src/components/PassCard/PassCard.css +289 -0
- package/dist/packages/core/src/components/PassCard/PassCard.d.ts +56 -0
- package/dist/packages/core/src/components/PassCard/PassCard.js +313 -0
- package/dist/packages/core/src/components/PassCard/PassCardBg.css +39 -0
- package/dist/packages/core/src/components/PassCard/PassCardBg.d.ts +8 -0
- package/dist/packages/core/src/components/PassCard/PassCardBg.js +6 -0
- package/dist/packages/core/src/components/PassCard/PassCardBgIHAB.css +25 -0
- package/dist/packages/core/src/components/PassCard/PassCardBgIHAB.d.ts +7 -0
- package/dist/packages/core/src/components/PassCard/PassCardBgIHAB.js +18 -0
- package/dist/packages/core/src/components/PassCard/PassCardBgLeftColorGrid.css +45 -0
- package/dist/packages/core/src/components/PassCard/PassCardBgLeftColorGrid.d.ts +9 -0
- package/dist/packages/core/src/components/PassCard/PassCardBgLeftColorGrid.js +19 -0
- package/dist/packages/core/src/components/PassCard/PassCardBgSoundLine.css +19 -0
- package/dist/packages/core/src/components/PassCard/PassCardBgSoundLine.d.ts +9 -0
- package/dist/packages/core/src/components/PassCard/PassCardBgSoundLine.js +23 -0
- package/dist/packages/core/src/components/PassCard/PassCardBgSoundLineV1.css +15 -0
- package/dist/packages/core/src/components/PassCard/PassCardBgSoundLineV1.d.ts +9 -0
- package/dist/packages/core/src/components/PassCard/PassCardBgSoundLineV1.js +24 -0
- package/dist/packages/core/src/components/PassCard/PassCardBgSoundMove.css +16 -0
- package/dist/packages/core/src/components/PassCard/PassCardBgSoundMove.d.ts +9 -0
- package/dist/packages/core/src/components/PassCard/PassCardBgSoundMove.js +31 -0
- package/dist/packages/core/src/components/PassCard/PassCardBgSoundMoveV1.css +16 -0
- package/dist/packages/core/src/components/PassCard/PassCardBgSoundMoveV1.d.ts +9 -0
- package/dist/packages/core/src/components/PassCard/PassCardBgSoundMoveV1.js +32 -0
- package/dist/packages/core/src/components/PassCard/PassCardBgTalk.css +33 -0
- package/dist/packages/core/src/components/PassCard/PassCardBgTalk.d.ts +9 -0
- package/dist/packages/core/src/components/PassCard/PassCardBgTalk.js +18 -0
- package/dist/packages/core/src/components/PassCard/PassCardBgTalkV1.css +36 -0
- package/dist/packages/core/src/components/PassCard/PassCardBgTalkV1.d.ts +13 -0
- package/dist/packages/core/src/components/PassCard/PassCardBgTalkV1.js +22 -0
- package/dist/packages/core/src/components/PassCard/PassCardBgTheme.d.ts +38 -0
- package/dist/packages/core/src/components/PassCard/PassCardBgTheme.js +34 -0
- package/dist/packages/core/src/components/PassCard/PassCardBgTwoCircle.css +36 -0
- package/dist/packages/core/src/components/PassCard/PassCardBgTwoCircle.d.ts +9 -0
- package/dist/packages/core/src/components/PassCard/PassCardBgTwoCircle.js +18 -0
- package/dist/packages/core/src/components/PassCard/PassCard_Back.css +76 -0
- package/dist/packages/core/src/components/PassCard/PassCard_Back.d.ts +13 -0
- package/dist/packages/core/src/components/PassCard/PassCard_Back.js +20 -0
- package/dist/packages/core/src/components/PassCard/ihabOutlinePath.d.ts +12 -0
- package/dist/packages/core/src/components/PassCard/ihabOutlinePath.js +19 -0
- package/dist/packages/core/src/components/PassCard/passCardProduct.d.ts +48 -0
- package/dist/packages/core/src/components/PassCard/passCardProduct.js +56 -0
- package/dist/packages/core/src/components/PaymentPlan.css +318 -0
- package/dist/packages/core/src/components/PaymentPlan.d.ts +57 -0
- package/dist/packages/core/src/components/PaymentPlan.js +126 -0
- package/dist/packages/core/src/components/PersonCard.css +72 -0
- package/dist/packages/core/src/components/PersonCard.d.ts +27 -0
- package/dist/packages/core/src/components/PersonCard.js +11 -0
- package/dist/packages/core/src/components/Popup/ConfirmPopup.d.ts +58 -0
- package/dist/packages/core/src/components/Popup/ConfirmPopup.js +59 -0
- package/dist/packages/core/src/components/Popup/CouponInputPopup.css +28 -0
- package/dist/packages/core/src/components/Popup/CouponInputPopup.d.ts +8 -0
- package/dist/packages/core/src/components/Popup/CouponInputPopup.js +45 -0
- package/dist/packages/core/src/components/Popup/DeviceListPopup.css +78 -0
- package/dist/packages/core/src/components/Popup/DeviceListPopup.d.ts +28 -0
- package/dist/packages/core/src/components/Popup/DeviceListPopup.js +31 -0
- package/dist/packages/core/src/components/Popup/DeviceSideTable.d.ts +41 -0
- package/dist/packages/core/src/components/Popup/DeviceSideTable.js +92 -0
- package/dist/packages/core/src/components/Popup/ListPopup.css +44 -0
- package/dist/packages/core/src/components/Popup/ListPopup.d.ts +75 -0
- package/dist/packages/core/src/components/Popup/ListPopup.js +85 -0
- package/dist/packages/core/src/components/Popup/LoadTablePopup.css +248 -0
- package/dist/packages/core/src/components/Popup/LoadTablePopup.d.ts +12 -0
- package/dist/packages/core/src/components/Popup/LoadTablePopup.js +86 -0
- package/dist/packages/core/src/components/Popup/Popup.css +136 -0
- package/dist/packages/core/src/components/Popup/Popup.d.ts +77 -0
- package/dist/packages/core/src/components/Popup/Popup.js +135 -0
- package/dist/packages/core/src/components/Popup/SaveTablePopup.css +32 -0
- package/dist/packages/core/src/components/Popup/SaveTablePopup.d.ts +25 -0
- package/dist/packages/core/src/components/Popup/SaveTablePopup.js +55 -0
- package/dist/packages/core/src/components/Popup/TrainingResultPopup.css +277 -0
- package/dist/packages/core/src/components/Popup/TrainingResultPopup.d.ts +14 -0
- package/dist/packages/core/src/components/Popup/TrainingResultPopup.js +104 -0
- package/dist/packages/core/src/components/Popup/WordDataUpdatePopup.css +119 -0
- package/dist/packages/core/src/components/Popup/WordDataUpdatePopup.d.ts +12 -0
- package/dist/packages/core/src/components/Popup/WordDataUpdatePopup.js +73 -0
- package/dist/packages/core/src/components/Popup/customerDetailUtils.d.ts +19 -0
- package/dist/packages/core/src/components/Popup/customerDetailUtils.js +45 -0
- package/dist/packages/core/src/components/ProgressBar.css +114 -0
- package/dist/packages/core/src/components/ProgressBar.d.ts +65 -0
- package/dist/packages/core/src/components/ProgressBar.js +51 -0
- package/dist/packages/core/src/components/ProgressIndicator.css +41 -0
- package/dist/packages/core/src/components/ProgressIndicator.d.ts +18 -0
- package/dist/packages/core/src/components/ProgressIndicator.js +45 -0
- package/dist/packages/core/src/components/PromoBanner.css +54 -0
- package/dist/packages/core/src/components/PromoBanner.d.ts +30 -0
- package/dist/packages/core/src/components/PromoBanner.js +54 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBg.css +8 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgDark.css +3 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgDark.d.ts +11 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgDark.js +20 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgDeep.css +3 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgDeep.d.ts +10 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgDeep.js +19 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgDiagonal.css +10 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgDiagonal.d.ts +10 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgDiagonal.js +19 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgDots.css +5 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgDots.d.ts +10 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgDots.js +19 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgInstagram.css +3 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgInstagram.d.ts +11 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgInstagram.js +20 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgMain.css +3 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgMain.d.ts +12 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgMain.js +21 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgNaver.css +3 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgNaver.d.ts +11 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgNaver.js +20 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgOutline.css +16 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgOutline.d.ts +11 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgOutline.js +20 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgRadial.css +3 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgRadial.d.ts +10 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgRadial.js +19 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgSoft.css +3 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgSoft.d.ts +12 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgSoft.js +21 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgSoftSub.css +3 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgSoftSub.d.ts +10 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgSoftSub.js +19 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgSub.css +3 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgSub.d.ts +10 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgSub.js +19 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgSuccess.css +3 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgSuccess.d.ts +11 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgSuccess.js +20 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgTheme.d.ts +32 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgTheme.js +29 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgWarm.css +3 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgWarm.d.ts +11 -0
- package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgWarm.js +20 -0
- package/dist/packages/core/src/components/PromoBannerBg/promoBannerBg.d.ts +21 -0
- package/dist/packages/core/src/components/PromoBannerBg/promoBannerBg.js +49 -0
- package/dist/packages/core/src/components/PublicationCard.css +70 -0
- package/dist/packages/core/src/components/PublicationCard.d.ts +31 -0
- package/dist/packages/core/src/components/PublicationCard.js +11 -0
- package/dist/packages/core/src/components/Radio.css +64 -0
- package/dist/packages/core/src/components/Radio.d.ts +13 -0
- package/dist/packages/core/src/components/Radio.js +9 -0
- package/dist/packages/core/src/components/RadioGroup.css +14 -0
- package/dist/packages/core/src/components/RadioGroup.d.ts +21 -0
- package/dist/packages/core/src/components/RadioGroup.js +14 -0
- package/dist/packages/core/src/components/Rating.css +69 -0
- package/dist/packages/core/src/components/Rating.d.ts +21 -0
- package/dist/packages/core/src/components/Rating.js +51 -0
- package/dist/packages/core/src/components/RingChart.css +50 -0
- package/dist/packages/core/src/components/RingChart.d.ts +68 -0
- package/dist/packages/core/src/components/RingChart.js +57 -0
- package/dist/packages/core/src/components/SearchSummary.css +62 -0
- package/dist/packages/core/src/components/SearchSummary.d.ts +32 -0
- package/dist/packages/core/src/components/SearchSummary.js +48 -0
- package/dist/packages/core/src/components/Section.css +73 -0
- package/dist/packages/core/src/components/Section.d.ts +16 -0
- package/dist/packages/core/src/components/Section.js +15 -0
- package/dist/packages/core/src/components/SectionHeader.css +87 -0
- package/dist/packages/core/src/components/SectionHeader.d.ts +31 -0
- package/dist/packages/core/src/components/SectionHeader.js +16 -0
- package/dist/packages/core/src/components/SegmentedControl.css +67 -0
- package/dist/packages/core/src/components/SegmentedControl.d.ts +26 -0
- package/dist/packages/core/src/components/SegmentedControl.js +13 -0
- package/dist/packages/core/src/components/ShortcutBadge.css +68 -0
- package/dist/packages/core/src/components/ShortcutBadge.d.ts +31 -0
- package/dist/packages/core/src/components/ShortcutBadge.js +23 -0
- package/dist/packages/core/src/components/SideNav.css +281 -0
- package/dist/packages/core/src/components/SideNav.d.ts +32 -0
- package/dist/packages/core/src/components/SideNav.js +92 -0
- package/dist/packages/core/src/components/Slider.css +184 -0
- package/dist/packages/core/src/components/Slider.d.ts +67 -0
- package/dist/packages/core/src/components/Slider.js +97 -0
- package/dist/packages/core/src/components/SoundCompass.css +138 -0
- package/dist/packages/core/src/components/SoundCompass.d.ts +42 -0
- package/dist/packages/core/src/components/SoundCompass.js +136 -0
- package/dist/packages/core/src/components/SplashLogo.css +32 -0
- package/dist/packages/core/src/components/SplashLogo.d.ts +35 -0
- package/dist/packages/core/src/components/SplashLogo.js +32 -0
- package/dist/packages/core/src/components/StatChart.css +83 -0
- package/dist/packages/core/src/components/StatChart.d.ts +26 -0
- package/dist/packages/core/src/components/StatChart.js +41 -0
- package/dist/packages/core/src/components/Table.css +158 -0
- package/dist/packages/core/src/components/Table.d.ts +94 -0
- package/dist/packages/core/src/components/Table.js +200 -0
- package/dist/packages/core/src/components/TableCell.css +12 -0
- package/dist/packages/core/src/components/TableField.css +60 -0
- package/dist/packages/core/src/components/Tabs.css +55 -0
- package/dist/packages/core/src/components/Tabs.d.ts +30 -0
- package/dist/packages/core/src/components/Tabs.js +55 -0
- package/dist/packages/core/src/components/TextField.css +266 -0
- package/dist/packages/core/src/components/TextField.d.ts +86 -0
- package/dist/packages/core/src/components/TextField.js +149 -0
- package/dist/packages/core/src/components/Timeline.css +62 -0
- package/dist/packages/core/src/components/Timeline.d.ts +26 -0
- package/dist/packages/core/src/components/Timeline.js +11 -0
- package/dist/packages/core/src/components/Toast.css +76 -0
- package/dist/packages/core/src/components/Toast.d.ts +10 -0
- package/dist/packages/core/src/components/Toast.js +19 -0
- package/dist/packages/core/src/components/Toggle.css +61 -0
- package/dist/packages/core/src/components/Toggle.d.ts +18 -0
- package/dist/packages/core/src/components/Toggle.js +7 -0
- package/dist/packages/core/src/components/Toolbar.css +86 -0
- package/dist/packages/core/src/components/Toolbar.d.ts +52 -0
- package/dist/packages/core/src/components/Toolbar.js +20 -0
- package/dist/packages/core/src/components/Tooltip/DebugTooltip.css +27 -0
- package/dist/packages/core/src/components/Tooltip/DebugTooltip.d.ts +12 -0
- package/dist/packages/core/src/components/Tooltip/DebugTooltip.js +79 -0
- package/dist/packages/core/src/components/Tooltip/DescriptionTooltip.css +50 -0
- package/dist/packages/core/src/components/Tooltip/DescriptionTooltip.d.ts +16 -0
- package/dist/packages/core/src/components/Tooltip/DescriptionTooltip.js +11 -0
- package/dist/packages/core/src/components/Tooltip/InfoTooltip.css +39 -0
- package/dist/packages/core/src/components/Tooltip/InfoTooltip.d.ts +13 -0
- package/dist/packages/core/src/components/Tooltip/InfoTooltip.js +10 -0
- package/dist/packages/core/src/components/Tooltip/MenuTooltip.css +93 -0
- package/dist/packages/core/src/components/Tooltip/MenuTooltip.d.ts +30 -0
- package/dist/packages/core/src/components/Tooltip/MenuTooltip.js +92 -0
- package/dist/packages/core/src/components/Tooltip/TextBoxTooltip.css +95 -0
- package/dist/packages/core/src/components/Tooltip/TextBoxTooltip.d.ts +13 -0
- package/dist/packages/core/src/components/Tooltip/TextBoxTooltip.js +55 -0
- package/dist/packages/core/src/components/Tooltip/Tooltip.css +120 -0
- package/dist/packages/core/src/components/Tooltip/Tooltip.d.ts +25 -0
- package/dist/packages/core/src/components/Tooltip/Tooltip.js +296 -0
- package/dist/packages/core/src/components/Tooltip/TrainingTooltip.css +67 -0
- package/dist/packages/core/src/components/Tooltip/TrainingTooltip.d.ts +16 -0
- package/dist/packages/core/src/components/Tooltip/TrainingTooltip.js +40 -0
- package/dist/packages/core/src/components/Tooltip/WordImageTooltip.css +61 -0
- package/dist/packages/core/src/components/Tooltip/WordImageTooltip.d.ts +12 -0
- package/dist/packages/core/src/components/Tooltip/WordImageTooltip.js +39 -0
- package/dist/packages/core/src/components/Tooltip/tooltipConstants.d.ts +44 -0
- package/dist/packages/core/src/components/Tooltip/tooltipConstants.js +38 -0
- package/dist/packages/core/src/components/TopBanner.css +100 -0
- package/dist/packages/core/src/components/TopBanner.d.ts +25 -0
- package/dist/packages/core/src/components/TopBanner.js +36 -0
- package/dist/packages/core/src/components/Training/AudioPlayerWaveForm.d.ts +17 -0
- package/dist/packages/core/src/components/Training/AudioPlayerWaveForm.js +237 -0
- package/dist/packages/core/src/components/Training/CategoryIcon.css +85 -0
- package/dist/packages/core/src/components/Training/CategoryIcon.d.ts +16 -0
- package/dist/packages/core/src/components/Training/CategoryIcon.js +79 -0
- package/dist/packages/core/src/components/Training/NoisePlayerContext.d.ts +43 -0
- package/dist/packages/core/src/components/Training/NoisePlayerContext.js +26 -0
- package/dist/packages/core/src/components/Training/NoiseSettingsTooltip.css +52 -0
- package/dist/packages/core/src/components/Training/NoiseSettingsTooltip.d.ts +13 -0
- package/dist/packages/core/src/components/Training/NoiseSettingsTooltip.js +81 -0
- package/dist/packages/core/src/components/Training/TrainingBlock.css +33 -0
- package/dist/packages/core/src/components/Training/TrainingBlock.d.ts +45 -0
- package/dist/packages/core/src/components/Training/TrainingBlock.js +44 -0
- package/dist/packages/core/src/components/Training/TrainingBlockButton.css +337 -0
- package/dist/packages/core/src/components/Training/TrainingBlockButton.d.ts +5 -0
- package/dist/packages/core/src/components/Training/TrainingBlockButton.js +193 -0
- package/dist/packages/core/src/components/Training/TrainingCard.css +178 -0
- package/dist/packages/core/src/components/Training/TrainingCard.d.ts +24 -0
- package/dist/packages/core/src/components/Training/TrainingCard.js +29 -0
- package/dist/packages/core/src/components/Training/TrainingCardGroup.css +73 -0
- package/dist/packages/core/src/components/Training/TrainingCardGroup.d.ts +41 -0
- package/dist/packages/core/src/components/Training/TrainingCardGroup.js +16 -0
- package/dist/packages/core/src/components/Training/TrainingPagePopup.css +210 -0
- package/dist/packages/core/src/components/Training/TrainingPagePopup.d.ts +91 -0
- package/dist/packages/core/src/components/Training/TrainingPagePopup.js +799 -0
- package/dist/packages/core/src/components/Training/TrainingPagePopupBottom.css +45 -0
- package/dist/packages/core/src/components/Training/TrainingPagePopupBottom.d.ts +14 -0
- package/dist/packages/core/src/components/Training/TrainingPagePopupBottom.js +60 -0
- package/dist/packages/core/src/components/Training/TrainingPagePopupContext.d.ts +13 -0
- package/dist/packages/core/src/components/Training/TrainingPagePopupContext.js +12 -0
- package/dist/packages/core/src/components/Training/TrainingPagePopupTitle.css +77 -0
- package/dist/packages/core/src/components/Training/TrainingPagePopupTitle.d.ts +21 -0
- package/dist/packages/core/src/components/Training/TrainingPagePopupTitle.js +41 -0
- package/dist/packages/core/src/components/Training/TrainingStep.css +236 -0
- package/dist/packages/core/src/components/Training/TrainingStep.d.ts +15 -0
- package/dist/packages/core/src/components/Training/TrainingStep.js +89 -0
- package/dist/packages/core/src/components/Training/TrainingStepAudioPlayer.css +320 -0
- package/dist/packages/core/src/components/Training/TrainingStepAudioPlayer.d.ts +5 -0
- package/dist/packages/core/src/components/Training/TrainingStepAudioPlayer.js +971 -0
- package/dist/packages/core/src/components/Training/TrainingStepBullet.css +148 -0
- package/dist/packages/core/src/components/Training/TrainingStepBullet.d.ts +6 -0
- package/dist/packages/core/src/components/Training/TrainingStepBullet.js +11 -0
- package/dist/packages/core/src/components/Training/TrainingStepCard.css +0 -0
- package/dist/packages/core/src/components/Training/TrainingStepCard.d.ts +36 -0
- package/dist/packages/core/src/components/Training/TrainingStepCard.js +110 -0
- package/dist/packages/core/src/components/Training/TrainingStepCardOrder.d.ts +15 -0
- package/dist/packages/core/src/components/Training/TrainingStepCardOrder.js +58 -0
- package/dist/packages/core/src/components/Training/TrainingStepComponents.d.ts +35 -0
- package/dist/packages/core/src/components/Training/TrainingStepComponents.js +60 -0
- package/dist/packages/core/src/components/Training/TrainingStepConfirm.d.ts +24 -0
- package/dist/packages/core/src/components/Training/TrainingStepConfirm.js +117 -0
- package/dist/packages/core/src/components/Training/TrainingStepConfirmWithText.d.ts +16 -0
- package/dist/packages/core/src/components/Training/TrainingStepConfirmWithText.js +60 -0
- package/dist/packages/core/src/components/Training/TrainingStepListen.d.ts +27 -0
- package/dist/packages/core/src/components/Training/TrainingStepListen.js +13 -0
- package/dist/packages/core/src/components/Training/TrainingStepOrderList.css +221 -0
- package/dist/packages/core/src/components/Training/TrainingStepOrderList.d.ts +7 -0
- package/dist/packages/core/src/components/Training/TrainingStepOrderList.js +445 -0
- package/dist/packages/core/src/components/Training/TrainingStepTextBox.css +111 -0
- package/dist/packages/core/src/components/Training/TrainingStepTextBox.d.ts +8 -0
- package/dist/packages/core/src/components/Training/TrainingStepTextBox.js +74 -0
- package/dist/packages/core/src/components/Training/TrainingStepTitle.css +89 -0
- package/dist/packages/core/src/components/Training/TrainingStepTitle.d.ts +21 -0
- package/dist/packages/core/src/components/Training/TrainingStepTitle.js +91 -0
- package/dist/packages/core/src/components/Training/TrainingWordCard.css +266 -0
- package/dist/packages/core/src/components/Training/TrainingWordCard.d.ts +43 -0
- package/dist/packages/core/src/components/Training/TrainingWordCard.js +229 -0
- package/dist/packages/core/src/components/Training/WordTablePopup.css +56 -0
- package/dist/packages/core/src/components/Training/WordTablePopup.d.ts +61 -0
- package/dist/packages/core/src/components/Training/WordTablePopup.js +105 -0
- package/dist/packages/core/src/components/Training/audioPlaybackRules.d.ts +95 -0
- package/dist/packages/core/src/components/Training/audioPlaybackRules.js +125 -0
- package/dist/packages/core/src/components/Training/audioWaits.d.ts +27 -0
- package/dist/packages/core/src/components/Training/audioWaits.js +64 -0
- package/dist/packages/core/src/components/Training/currentSound.d.ts +26 -0
- package/dist/packages/core/src/components/Training/currentSound.js +46 -0
- package/dist/packages/core/src/components/Training/pagePopupTiming.d.ts +17 -0
- package/dist/packages/core/src/components/Training/pagePopupTiming.js +17 -0
- package/dist/packages/core/src/components/Training/trainingBlockButtonTypes.d.ts +79 -0
- package/dist/packages/core/src/components/Training/trainingBlockButtonTypes.js +27 -0
- package/dist/packages/core/src/components/Training/trainingMissStats.d.ts +148 -0
- package/dist/packages/core/src/components/Training/trainingMissStats.js +163 -0
- package/dist/packages/core/src/components/Training/trainingPopupUtils.d.ts +108 -0
- package/dist/packages/core/src/components/Training/trainingPopupUtils.js +226 -0
- package/dist/packages/core/src/components/Training/trainingScenario.d.ts +42 -0
- package/dist/packages/core/src/components/Training/trainingScenario.js +25 -0
- package/dist/packages/core/src/components/Training/trainingStepAudioPlayerTypes.d.ts +37 -0
- package/dist/packages/core/src/components/Training/trainingStepAudioPlayerTypes.js +20 -0
- package/dist/packages/core/src/components/Training/trainingStepOrderListTypes.d.ts +34 -0
- package/dist/packages/core/src/components/Training/trainingStepOrderListTypes.js +5 -0
- package/dist/packages/core/src/components/Training/useAnchorRect.d.ts +26 -0
- package/dist/packages/core/src/components/Training/useAnchorRect.js +52 -0
- package/dist/packages/core/src/components/Training/useAudioPreview.d.ts +11 -0
- package/dist/packages/core/src/components/Training/useAudioPreview.js +178 -0
- package/dist/packages/core/src/components/Training/useNoiseFade.d.ts +24 -0
- package/dist/packages/core/src/components/Training/useNoiseFade.js +303 -0
- package/dist/packages/core/src/components/Training/useObjectUrls.d.ts +25 -0
- package/dist/packages/core/src/components/Training/useObjectUrls.js +56 -0
- package/dist/packages/core/src/components/Training/useProgressTicker.d.ts +33 -0
- package/dist/packages/core/src/components/Training/useProgressTicker.js +74 -0
- package/dist/packages/core/src/components/Training/useTTSPlayback.d.ts +30 -0
- package/dist/packages/core/src/components/Training/useTTSPlayback.js +172 -0
- package/dist/packages/core/src/components/Training/useWaveReady.d.ts +36 -0
- package/dist/packages/core/src/components/Training/useWaveReady.js +65 -0
- package/dist/packages/core/src/components/UpdateAlert.css +116 -0
- package/dist/packages/core/src/components/UpdateAlert.d.ts +23 -0
- package/dist/packages/core/src/components/UpdateAlert.js +25 -0
- package/dist/packages/core/src/components/Word/ContrastFilterPanel.d.ts +25 -0
- package/dist/packages/core/src/components/Word/ContrastFilterPanel.js +69 -0
- package/dist/packages/core/src/components/Word/PhonemeFilterPanel.d.ts +24 -0
- package/dist/packages/core/src/components/Word/PhonemeFilterPanel.js +15 -0
- package/dist/packages/core/src/components/Word/PhonemeSelectBlock.css +272 -0
- package/dist/packages/core/src/components/Word/PhonemeSelectBlock.d.ts +45 -0
- package/dist/packages/core/src/components/Word/PhonemeSelectBlock.js +71 -0
- package/dist/packages/core/src/components/Word/TableFilterPanel.d.ts +56 -0
- package/dist/packages/core/src/components/Word/TableFilterPanel.js +42 -0
- package/dist/packages/core/src/components/Word/WordSearchFilterPanel.d.ts +23 -0
- package/dist/packages/core/src/components/Word/WordSearchFilterPanel.js +14 -0
- package/dist/packages/core/src/components/Word/WordSearchResultBlock.css +130 -0
- package/dist/packages/core/src/components/Word/WordSearchResultBlock.d.ts +47 -0
- package/dist/packages/core/src/components/Word/WordSearchResultBlock.js +141 -0
- package/dist/packages/core/src/components/Word/WordTableBlock.css +85 -0
- package/dist/packages/core/src/components/Word/WordTableBlock.d.ts +5 -0
- package/dist/packages/core/src/components/Word/WordTableBlock.js +297 -0
- package/dist/packages/core/src/components/Word/WordTableButton.css +185 -0
- package/dist/packages/core/src/components/Word/WordTableButton.d.ts +48 -0
- package/dist/packages/core/src/components/Word/WordTableButton.js +28 -0
- package/dist/packages/core/src/components/Word/WordTableThumbnail.css +56 -0
- package/dist/packages/core/src/components/Word/WordTableThumbnail.d.ts +10 -0
- package/dist/packages/core/src/components/Word/WordTableThumbnail.js +21 -0
- package/dist/packages/core/src/components/Word/generatedDraft.d.ts +39 -0
- package/dist/packages/core/src/components/Word/generatedDraft.js +69 -0
- package/dist/packages/core/src/components/Word/phonemeSelectBlockUtils.d.ts +14 -0
- package/dist/packages/core/src/components/Word/phonemeSelectBlockUtils.js +10 -0
- package/dist/packages/core/src/components/Word/useWordTableDisplaySettings.d.ts +35 -0
- package/dist/packages/core/src/components/Word/useWordTableDisplaySettings.js +82 -0
- package/dist/packages/core/src/components/Word/useWordTablePrint.d.ts +31 -0
- package/dist/packages/core/src/components/Word/useWordTablePrint.js +43 -0
- package/dist/packages/core/src/components/Word/wordScoreStats.d.ts +77 -0
- package/dist/packages/core/src/components/Word/wordScoreStats.js +100 -0
- package/dist/packages/core/src/components/Word/wordTableBlockTypes.d.ts +85 -0
- package/dist/packages/core/src/components/Word/wordTableBlockTypes.js +3 -0
- package/dist/packages/core/src/components/Word/wordTablePrint.d.ts +14 -0
- package/dist/packages/core/src/components/Word/wordTablePrint.js +210 -0
- package/dist/packages/core/src/components/Word/wordTableRecommend.d.ts +67 -0
- package/dist/packages/core/src/components/Word/wordTableRecommend.js +91 -0
- package/dist/packages/core/src/components/Word/wordTableReview.d.ts +49 -0
- package/dist/packages/core/src/components/Word/wordTableReview.js +112 -0
- package/dist/packages/core/src/components/Word/wordTableScoring.d.ts +100 -0
- package/dist/packages/core/src/components/Word/wordTableScoring.js +126 -0
- package/dist/packages/core/src/components/Word/wordTableSettings.d.ts +56 -0
- package/dist/packages/core/src/components/Word/wordTableSettings.js +140 -0
- package/dist/packages/core/src/components/WordTable.css +424 -0
- package/dist/packages/core/src/components/WordTable.d.ts +75 -0
- package/dist/packages/core/src/components/WordTable.js +184 -0
- package/dist/packages/core/src/components/barChartData.d.ts +48 -0
- package/dist/packages/core/src/components/barChartData.js +111 -0
- package/dist/packages/core/src/components/barChartTypes.d.ts +82 -0
- package/dist/packages/core/src/components/barChartTypes.js +22 -0
- package/dist/packages/core/src/components/buttonTypes.d.ts +102 -0
- package/dist/packages/core/src/components/buttonTypes.js +1 -0
- package/dist/packages/core/src/components/tableTrackList.d.ts +9 -0
- package/dist/packages/core/src/components/tableTrackList.js +32 -0
- package/dist/packages/core/src/components/useAnchoredMenu.d.ts +28 -0
- package/dist/packages/core/src/components/useAnchoredMenu.js +72 -0
- package/dist/packages/core/src/components/useBarChartControl.d.ts +8 -0
- package/dist/packages/core/src/components/useBarChartControl.js +76 -0
- package/dist/packages/core/src/components/useCalendarMonth.d.ts +12 -0
- package/dist/packages/core/src/components/useCalendarMonth.js +50 -0
- package/dist/packages/core/src/components/useComboboxSuggestions.d.ts +22 -0
- package/dist/packages/core/src/components/useComboboxSuggestions.js +60 -0
- package/dist/packages/core/src/components/useFitScale.d.ts +16 -0
- package/dist/packages/core/src/components/useFitScale.js +43 -0
- package/dist/packages/core/src/components/useSoundCompassExam.d.ts +54 -0
- package/dist/packages/core/src/components/useSoundCompassExam.js +128 -0
- package/dist/packages/core/src/components/useToastLifecycle.d.ts +16 -0
- package/dist/packages/core/src/components/useToastLifecycle.js +140 -0
- package/dist/packages/core/src/components/wordTableLayout.d.ts +76 -0
- package/dist/packages/core/src/components/wordTableLayout.js +162 -0
- package/dist/packages/core/src/components.d.ts +314 -0
- package/dist/packages/core/src/components.js +232 -0
- package/dist/packages/core/src/context/I18nContext.d.ts +11 -0
- package/dist/packages/core/src/context/I18nContext.js +20 -0
- package/dist/packages/core/src/context/I18nProvider.d.ts +9 -0
- package/dist/packages/core/src/context/I18nProvider.js +15 -0
- package/dist/packages/core/src/context/WordDataContext.d.ts +25 -0
- package/dist/packages/core/src/context/WordDataContext.js +6 -0
- package/dist/packages/core/src/context/WordDataProvider.d.ts +5 -0
- package/dist/packages/core/src/context/WordDataProvider.js +5 -0
- package/dist/packages/core/src/hooks/bodyScrollLock.d.ts +5 -0
- package/dist/packages/core/src/hooks/bodyScrollLock.js +62 -0
- package/dist/packages/core/src/hooks/escStack.d.ts +2 -0
- package/dist/packages/core/src/hooks/escStack.js +38 -0
- package/dist/packages/core/src/hooks/useBackgroundUrl.d.ts +2 -0
- package/dist/packages/core/src/hooks/useBackgroundUrl.js +13 -0
- package/dist/packages/core/src/hooks/useCacheManagement.d.ts +34 -0
- package/dist/packages/core/src/hooks/useCacheManagement.js +107 -0
- package/dist/packages/core/src/hooks/useDailyTrainingSelection.d.ts +17 -0
- package/dist/packages/core/src/hooks/useDailyTrainingSelection.js +87 -0
- package/dist/packages/core/src/hooks/useDeviceManagement.d.ts +37 -0
- package/dist/packages/core/src/hooks/useDeviceManagement.js +40 -0
- package/dist/packages/core/src/hooks/useDocumentTitle.d.ts +22 -0
- package/dist/packages/core/src/hooks/useDocumentTitle.js +49 -0
- package/dist/packages/core/src/hooks/useEditableList.d.ts +20 -0
- package/dist/packages/core/src/hooks/useEditableList.js +73 -0
- package/dist/packages/core/src/hooks/useEscToClose.d.ts +19 -0
- package/dist/packages/core/src/hooks/useEscToClose.js +30 -0
- package/dist/packages/core/src/hooks/useFocusTrap.d.ts +19 -0
- package/dist/packages/core/src/hooks/useFocusTrap.js +50 -0
- package/dist/packages/core/src/hooks/useFontScale.d.ts +20 -0
- package/dist/packages/core/src/hooks/useFontScale.js +51 -0
- package/dist/packages/core/src/hooks/useHoverAnchor.d.ts +33 -0
- package/dist/packages/core/src/hooks/useHoverAnchor.js +49 -0
- package/dist/packages/core/src/hooks/useIcon.d.ts +7 -0
- package/dist/packages/core/src/hooks/useIcon.js +124 -0
- package/dist/packages/core/src/hooks/useLatestRef.d.ts +12 -0
- package/dist/packages/core/src/hooks/useLatestRef.js +17 -0
- package/dist/packages/core/src/hooks/useLucideIcon.d.ts +15 -0
- package/dist/packages/core/src/hooks/useLucideIcon.js +71 -0
- package/dist/packages/core/src/hooks/useMediaQuery.d.ts +17 -0
- package/dist/packages/core/src/hooks/useMediaQuery.js +45 -0
- package/dist/packages/core/src/hooks/usePagedList.d.ts +23 -0
- package/dist/packages/core/src/hooks/usePagedList.js +26 -0
- package/dist/packages/core/src/hooks/useParentBgTheme.d.ts +8 -0
- package/dist/packages/core/src/hooks/useParentBgTheme.js +18 -0
- package/dist/packages/core/src/hooks/usePasswordChange.d.ts +28 -0
- package/dist/packages/core/src/hooks/usePasswordChange.js +54 -0
- package/dist/packages/core/src/hooks/useRelativeDay.d.ts +12 -0
- package/dist/packages/core/src/hooks/useRelativeDay.js +30 -0
- package/dist/packages/core/src/hooks/useTablePaging.d.ts +46 -0
- package/dist/packages/core/src/hooks/useTablePaging.js +63 -0
- package/dist/packages/core/src/hooks/useToastState.d.ts +15 -0
- package/dist/packages/core/src/hooks/useToastState.js +29 -0
- package/dist/packages/core/src/hooks/useTrainingSessionLog.d.ts +7 -0
- package/dist/packages/core/src/hooks/useTrainingSessionLog.js +26 -0
- package/dist/packages/core/src/hooks/useTrainingTypeLabels.d.ts +16 -0
- package/dist/packages/core/src/hooks/useTrainingTypeLabels.js +25 -0
- package/dist/packages/core/src/hooks/useVisitAllPanel.d.ts +30 -0
- package/dist/packages/core/src/hooks/useVisitAllPanel.js +43 -0
- package/dist/packages/core/src/hooks/useVisitHistory.d.ts +38 -0
- package/dist/packages/core/src/hooks/useVisitHistory.js +59 -0
- package/dist/packages/core/src/hooks/useVisitSchedule.d.ts +31 -0
- package/dist/packages/core/src/hooks/useVisitSchedule.js +101 -0
- package/dist/packages/core/src/hooks/useWindowEvent.d.ts +11 -0
- package/dist/packages/core/src/hooks/useWindowEvent.js +27 -0
- package/dist/packages/core/src/hooks/useWordAttributeFilter.d.ts +70 -0
- package/dist/packages/core/src/hooks/useWordAttributeFilter.js +115 -0
- package/dist/packages/core/src/hooks/useWordDataStats.d.ts +22 -0
- package/dist/packages/core/src/hooks/useWordDataStats.js +40 -0
- package/dist/packages/core/src/hooks/useWordImage.d.ts +19 -0
- package/dist/packages/core/src/hooks/useWordImage.js +28 -0
- package/dist/packages/core/src/hooks/useWordMeanings.d.ts +39 -0
- package/dist/packages/core/src/hooks/useWordMeanings.js +62 -0
- package/dist/packages/core/src/hooks/useWordTrainingDataGeneration.d.ts +34 -0
- package/dist/packages/core/src/hooks/useWordTrainingDataGeneration.js +98 -0
- package/dist/packages/core/src/hooks/useWordTrainingFilter.d.ts +91 -0
- package/dist/packages/core/src/hooks/useWordTrainingFilter.js +549 -0
- package/dist/packages/core/src/hooks/wordTrainingFilterModel.d.ts +61 -0
- package/dist/packages/core/src/hooks/wordTrainingFilterModel.js +102 -0
- package/dist/packages/core/src/hooks.d.ts +27 -0
- package/dist/packages/core/src/hooks.js +28 -0
- package/dist/packages/core/src/i18n/index.d.ts +21 -0
- package/dist/packages/core/src/i18n/index.js +68 -0
- package/dist/packages/core/src/i18n/locales/en.json +4055 -0
- package/dist/packages/core/src/i18n/locales/ko.json +4052 -0
- package/dist/packages/core/src/icon/none.svg +4 -0
- package/dist/packages/core/src/icon/null.svg +3 -0
- package/dist/packages/core/src/index.d.ts +16 -0
- package/dist/packages/core/src/index.js +25 -0
- package/dist/packages/core/src/logo/Logo_APEB.svg +53 -0
- package/dist/packages/core/src/logo/Logo_APEB_black.svg +42 -0
- package/dist/packages/core/src/logo/Logo_APEB_white.svg +42 -0
- package/dist/packages/core/src/logo/Logo_HTP_kr.svg +21 -0
- package/dist/packages/core/src/logo/Logo_HTP_kr_black.svg +17 -0
- package/dist/packages/core/src/logo/Logo_HTP_kr_white.svg +17 -0
- package/dist/packages/core/src/logo/Logo_IHAB_en.svg +18 -0
- package/dist/packages/core/src/logo/Logo_IHAB_en_black.svg +14 -0
- package/dist/packages/core/src/logo/Logo_IHAB_en_white.svg +14 -0
- package/dist/packages/core/src/logo/Logo_IHAB_kr.svg +18 -0
- package/dist/packages/core/src/logo/Logo_IHAB_kr_black.svg +14 -0
- package/dist/packages/core/src/logo/Logo_IHAB_kr_white.svg +14 -0
- package/dist/packages/core/src/logo/Logo_SDS_kr.svg +22 -0
- package/dist/packages/core/src/logo/Logo_SDS_kr_black.svg +18 -0
- package/dist/packages/core/src/logo/Logo_SDS_kr_white.svg +18 -0
- package/dist/packages/core/src/logo/Logo_speechearManager_kr.svg +20 -0
- package/dist/packages/core/src/logo/Logo_speechearManager_kr_black.svg +21 -0
- package/dist/packages/core/src/logo/Logo_speechearManager_kr_textWhite.svg +45 -0
- package/dist/packages/core/src/logo/Logo_speechearManager_kr_white.svg +21 -0
- package/dist/packages/core/src/logo/Logo_speechear_kr.svg +17 -0
- package/dist/packages/core/src/logo/Logo_speechear_kr_black.svg +16 -0
- package/dist/packages/core/src/logo/Logo_speechear_kr_textWhite.svg +42 -0
- package/dist/packages/core/src/logo/Logo_speechear_kr_white.svg +16 -0
- package/dist/packages/core/src/logo/Symbol_APEB.svg +34 -0
- package/dist/packages/core/src/logo/Symbol_APEB_black.svg +15 -0
- package/dist/packages/core/src/logo/Symbol_APEB_white.svg +15 -0
- package/dist/packages/core/src/logo/Symbol_HTP.svg +14 -0
- package/dist/packages/core/src/logo/Symbol_HTP_black.svg +10 -0
- package/dist/packages/core/src/logo/Symbol_HTP_white.svg +10 -0
- package/dist/packages/core/src/logo/Symbol_IHAB.svg +14 -0
- package/dist/packages/core/src/logo/Symbol_IHAB_black.svg +10 -0
- package/dist/packages/core/src/logo/Symbol_IHAB_white.svg +10 -0
- package/dist/packages/core/src/logo/Symbol_SDS.svg +14 -0
- package/dist/packages/core/src/logo/Symbol_SDS_black.svg +10 -0
- package/dist/packages/core/src/logo/Symbol_SDS_white.svg +10 -0
- package/dist/packages/core/src/logo/Symbol_speechear.svg +15 -0
- package/dist/packages/core/src/logo/Symbol_speechear_black.svg +16 -0
- package/dist/packages/core/src/logo/Symbol_speechear_white.svg +16 -0
- package/dist/packages/core/src/logo/qr_speechear.svg +1 -0
- package/dist/packages/core/src/sounds/noiseAssets.d.ts +6 -0
- package/dist/packages/core/src/sounds/noiseAssets.js +24 -0
- package/dist/packages/core/src/styles.css +144 -0
- package/dist/packages/core/src/tokens.css +407 -0
- package/dist/packages/core/src/types/audio.d.ts +11 -0
- package/dist/packages/core/src/types/audio.js +1 -0
- package/dist/packages/core/src/types/device.d.ts +10 -0
- package/dist/packages/core/src/types/device.js +1 -0
- package/dist/packages/core/src/types/filterPanel.d.ts +63 -0
- package/dist/packages/core/src/types/filterPanel.js +8 -0
- package/dist/packages/core/src/types/geometry.d.ts +14 -0
- package/dist/packages/core/src/types/geometry.js +1 -0
- package/dist/packages/core/src/types/training.d.ts +131 -0
- package/dist/packages/core/src/types/training.js +1 -0
- package/dist/packages/core/src/types/wordSearch.d.ts +49 -0
- package/dist/packages/core/src/types/wordSearch.js +1 -0
- package/dist/packages/core/src/types.d.ts +3 -0
- package/dist/packages/core/src/types.js +1 -0
- package/dist/packages/core/src/utils/CategoryData.d.ts +91 -0
- package/dist/packages/core/src/utils/CategoryData.js +57 -0
- package/dist/packages/core/src/utils/array.d.ts +20 -0
- package/dist/packages/core/src/utils/array.js +36 -0
- package/dist/packages/core/src/utils/assets.d.ts +41 -0
- package/dist/packages/core/src/utils/assets.js +62 -0
- package/dist/packages/core/src/utils/audioMeter.d.ts +19 -0
- package/dist/packages/core/src/utils/audioMeter.js +70 -0
- package/dist/packages/core/src/utils/categories.d.ts +67 -0
- package/dist/packages/core/src/utils/categories.js +70 -0
- package/dist/packages/core/src/utils/clipboard.d.ts +10 -0
- package/dist/packages/core/src/utils/clipboard.js +46 -0
- package/dist/packages/core/src/utils/companyTypes.d.ts +2 -0
- package/dist/packages/core/src/utils/companyTypes.js +6 -0
- package/dist/packages/core/src/utils/csv.d.ts +22 -0
- package/dist/packages/core/src/utils/csv.js +35 -0
- package/dist/packages/core/src/utils/cx.d.ts +7 -0
- package/dist/packages/core/src/utils/cx.js +9 -0
- package/dist/packages/core/src/utils/dailySelectionUtils.d.ts +15 -0
- package/dist/packages/core/src/utils/dailySelectionUtils.js +68 -0
- package/dist/packages/core/src/utils/date.d.ts +86 -0
- package/dist/packages/core/src/utils/date.js +171 -0
- package/dist/packages/core/src/utils/deviceKind.d.ts +13 -0
- package/dist/packages/core/src/utils/deviceKind.js +19 -0
- package/dist/packages/core/src/utils/encoding.d.ts +26 -0
- package/dist/packages/core/src/utils/encoding.js +33 -0
- package/dist/packages/core/src/utils/errorMessage.d.ts +44 -0
- package/dist/packages/core/src/utils/errorMessage.js +63 -0
- package/dist/packages/core/src/utils/fontScale.d.ts +10 -0
- package/dist/packages/core/src/utils/fontScale.js +28 -0
- package/dist/packages/core/src/utils/format.d.ts +48 -0
- package/dist/packages/core/src/utils/format.js +122 -0
- package/dist/packages/core/src/utils/gameScoreLogger.d.ts +48 -0
- package/dist/packages/core/src/utils/gameScoreLogger.js +42 -0
- package/dist/packages/core/src/utils/getTrainingData.d.ts +61 -0
- package/dist/packages/core/src/utils/getTrainingData.js +156 -0
- package/dist/packages/core/src/utils/imageConfig.d.ts +48 -0
- package/dist/packages/core/src/utils/imageConfig.js +159 -0
- package/dist/packages/core/src/utils/josa.d.ts +29 -0
- package/dist/packages/core/src/utils/josa.js +103 -0
- package/dist/packages/core/src/utils/koreanPronunciation.d.ts +16 -0
- package/dist/packages/core/src/utils/koreanPronunciation.js +223 -0
- package/dist/packages/core/src/utils/koreanSyllable.d.ts +174 -0
- package/dist/packages/core/src/utils/koreanSyllable.js +654 -0
- package/dist/packages/core/src/utils/lucideIconSet.d.ts +16 -0
- package/dist/packages/core/src/utils/lucideIconSet.js +350 -0
- package/dist/packages/core/src/utils/lucideLoader.d.ts +44 -0
- package/dist/packages/core/src/utils/lucideLoader.js +76 -0
- package/dist/packages/core/src/utils/noiseSettingsStore.d.ts +22 -0
- package/dist/packages/core/src/utils/noiseSettingsStore.js +36 -0
- package/dist/packages/core/src/utils/phonemeConvert.d.ts +9 -0
- package/dist/packages/core/src/utils/phonemeConvert.js +53 -0
- package/dist/packages/core/src/utils/phonemeGroups.d.ts +22 -0
- package/dist/packages/core/src/utils/phonemeGroups.js +29 -0
- package/dist/packages/core/src/utils/phonemePairSearch.d.ts +22 -0
- package/dist/packages/core/src/utils/phonemePairSearch.js +583 -0
- package/dist/packages/core/src/utils/phonemePairSearchTypes.d.ts +46 -0
- package/dist/packages/core/src/utils/phonemePairSearchTypes.js +1 -0
- package/dist/packages/core/src/utils/planFeatures.d.ts +61 -0
- package/dist/packages/core/src/utils/planFeatures.js +168 -0
- package/dist/packages/core/src/utils/pronunciationConfig.d.ts +7 -0
- package/dist/packages/core/src/utils/pronunciationConfig.js +21 -0
- package/dist/packages/core/src/utils/savedWordTables.d.ts +18 -0
- package/dist/packages/core/src/utils/savedWordTables.js +70 -0
- package/dist/packages/core/src/utils/sortValue.d.ts +24 -0
- package/dist/packages/core/src/utils/sortValue.js +26 -0
- package/dist/packages/core/src/utils/speak.d.ts +7 -0
- package/dist/packages/core/src/utils/speak.js +35 -0
- package/dist/packages/core/src/utils/storage.d.ts +102 -0
- package/dist/packages/core/src/utils/storage.js +118 -0
- package/dist/packages/core/src/utils/theme.d.ts +11 -0
- package/dist/packages/core/src/utils/theme.js +28 -0
- package/dist/packages/core/src/utils/trainingItemResults.d.ts +60 -0
- package/dist/packages/core/src/utils/trainingItemResults.js +72 -0
- package/dist/packages/core/src/utils/trainingLogger.d.ts +58 -0
- package/dist/packages/core/src/utils/trainingLogger.js +50 -0
- package/dist/packages/core/src/utils/trainingPalette.d.ts +12 -0
- package/dist/packages/core/src/utils/trainingPalette.js +12 -0
- package/dist/packages/core/src/utils/ttsConfig.d.ts +78 -0
- package/dist/packages/core/src/utils/ttsConfig.js +89 -0
- package/dist/packages/core/src/utils/ttsResolver.d.ts +17 -0
- package/dist/packages/core/src/utils/ttsResolver.js +56 -0
- package/dist/packages/core/src/utils/wordContrast.d.ts +54 -0
- package/dist/packages/core/src/utils/wordContrast.js +198 -0
- package/dist/packages/core/src/utils/wordPairIndex.d.ts +26 -0
- package/dist/packages/core/src/utils/wordPairIndex.js +194 -0
- package/dist/packages/core/src/utils/wordPool.d.ts +34 -0
- package/dist/packages/core/src/utils/wordPool.js +20 -0
- package/dist/packages/core/src/utils/wordSuggestionPolicy.d.ts +55 -0
- package/dist/packages/core/src/utils/wordSuggestionPolicy.js +97 -0
- package/dist/packages/core/src/utils/wordTrainingGenerators.d.ts +122 -0
- package/dist/packages/core/src/utils/wordTrainingGenerators.js +560 -0
- package/dist/packages/core/src/utils/wordTrainingGroups.d.ts +10 -0
- package/dist/packages/core/src/utils/wordTrainingGroups.js +69 -0
- package/dist/packages/core/src/utils/wordTrainingPool.d.ts +51 -0
- package/dist/packages/core/src/utils/wordTrainingPool.js +436 -0
- package/dist/packages/core/src/utils/wordTrainingRuntime.d.ts +38 -0
- package/dist/packages/core/src/utils/wordTrainingRuntime.js +641 -0
- package/dist/packages/core/src/utils/wordTrainingRuntimeTypes.d.ts +89 -0
- package/dist/packages/core/src/utils/wordTrainingRuntimeTypes.js +77 -0
- package/dist/packages/core/src/utils.d.ts +57 -0
- package/dist/packages/core/src/utils.js +46 -0
- package/dist/tsdoc-metadata.json +11 -0
- package/dist/types.cjs.js +1 -0
- package/dist/types.esm.js +1 -0
- package/dist/utils.cjs.js +20 -0
- package/dist/utils.esm.js +20 -0
- package/package.json +171 -0
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { cx } from '../../utils/cx';
|
|
4
|
+
import { useCallback, useState, useRef, useEffect, useMemo } from 'react';
|
|
5
|
+
import { useTranslation } from 'react-i18next';
|
|
6
|
+
import './WordTableBlock.css';
|
|
7
|
+
import Button from '../Button';
|
|
8
|
+
import Section from '../Section';
|
|
9
|
+
import TextField from '../TextField';
|
|
10
|
+
import Panel, { PanelRow } from '../Panel';
|
|
11
|
+
import Popup from '../Popup/Popup';
|
|
12
|
+
import WordTable, { WORD_TABLE_PAPER } from '../WordTable';
|
|
13
|
+
import { chunkItems } from '../wordTableLayout';
|
|
14
|
+
import TableFilterPanel from './TableFilterPanel';
|
|
15
|
+
import { buildItemsPerPageSection, buildPageNumberSection, PAGE_NUM_POSITION_VALUE, parsePageNumberPosition } from './wordTableSettings';
|
|
16
|
+
import Toast from '../Toast';
|
|
17
|
+
import { useToastState } from '../../hooks/useToastState';
|
|
18
|
+
import { getImageResolver, checkImageExists } from '../../utils/imageConfig';
|
|
19
|
+
import { formatYmd, getTodayKst } from '../../utils/date';
|
|
20
|
+
import { getSavedTables } from '../../utils/savedWordTables';
|
|
21
|
+
import { useWordTablePrint } from './useWordTablePrint';
|
|
22
|
+
import { CELL_COUNTS } from './wordTableBlockTypes';
|
|
23
|
+
// ── 컴포넌트 ───────────────────────────────────────────────
|
|
24
|
+
/** @public */
|
|
25
|
+
export default function WordTableBlock({ title, titleIcon, disc, items, onSaveComplete, onLoad, onRemoveItem, onReset, resetLabel, saveButtonLabel, secondarySaveButtonLabel, onReorder, showCellCount, onAddItem, className, renderSavePopup, renderWordSearch, hideControls, saveOnly, tableName, nameValue, onNameChange, descriptionValue, onDescriptionChange, namePlaceholder, descriptionPlaceholder, existingNames, editingName, onCancel }) {
|
|
26
|
+
const { t } = useTranslation();
|
|
27
|
+
const resolvedResetLabel = resetLabel ?? t('wordPrint.clearAllSelection', '모두 선택 해제');
|
|
28
|
+
const isEditable = items === undefined;
|
|
29
|
+
// 인라인 이름·설명 모드 — onNameChange가 있으면 표 구성 화면에 입력란을 띄우고 저장 팝업 없이 즉시 저장한다.
|
|
30
|
+
const inlineNameFields = !!onNameChange;
|
|
31
|
+
// 이 블록에서 방금 저장한 이름들(소문자). 생성 모드에선 저장 직후 그 이름이 existingNames에
|
|
32
|
+
// 추가되는데, editingName 자기제외가 없어 자기 이름을 중복으로 오탐한다 — 이를 막기 위해 함께 제외한다.
|
|
33
|
+
const [savedNames, setSavedNames] = useState([]);
|
|
34
|
+
// 사용자가 실제로 입력한 값. 중복 검사·에러 표시는 이 값만 판단한다(자동 제안 placeholder는 제외).
|
|
35
|
+
const typedName = (nameValue ?? '').trim();
|
|
36
|
+
// 입력이 비어 있으면 자동 제안(placeholder)을 실효값으로 사용 — 저장 시에만 fallback.
|
|
37
|
+
const trimmedName = (typedName || (namePlaceholder ?? '').trim());
|
|
38
|
+
const trimmedDescription = ((descriptionValue ?? '').trim() || (descriptionPlaceholder ?? '').trim());
|
|
39
|
+
// 중복 검사: 소문자 비교. '저장하기'는 자기 이름(수정 대상 + 방금 저장한 이름) 제외(덮어쓰기 허용),
|
|
40
|
+
// '다른 이름으로 저장'은 전체와 비교. 자기 이름은 목록에서 각각 1건씩만 뺀다(같은 이름의 남의 표는 남긴다).
|
|
41
|
+
const namesLower = (existingNames ?? []).map(n => n.trim().toLowerCase());
|
|
42
|
+
const ownLower = [editingName?.trim().toLowerCase(), ...savedNames].filter((v) => !!v);
|
|
43
|
+
const othersLower = [...namesLower];
|
|
44
|
+
for (const own of ownLower) {
|
|
45
|
+
const idx = othersLower.indexOf(own);
|
|
46
|
+
if (idx !== -1)
|
|
47
|
+
othersLower.splice(idx, 1);
|
|
48
|
+
}
|
|
49
|
+
// 자동 제안이 우연히 기존 이름과 겹치더라도, 사용자가 그 이름을 직접 입력하지 않았다면 중복으로 보지 않는다.
|
|
50
|
+
const collidesOthers = typedName !== '' && othersLower.includes(typedName.toLowerCase());
|
|
51
|
+
// 편집 모드 전용 상태
|
|
52
|
+
const [cells, setCells] = useState(Array(4).fill(null));
|
|
53
|
+
const [cellCount, setCellCount] = useState(4);
|
|
54
|
+
const [activeCell, setActiveCell] = useState(null);
|
|
55
|
+
// 공통 단어 표 설정 상태
|
|
56
|
+
const [orientation, setOrientation] = useState('landscape');
|
|
57
|
+
const [contentTypes, setContentTypes] = useState(['이미지', '단어', '표준 발음']);
|
|
58
|
+
const [cutLine, setCutLine] = useState('표시');
|
|
59
|
+
const [showOutline, setShowOutline] = useState(true);
|
|
60
|
+
const [showDivLine, setShowDivLine] = useState(true);
|
|
61
|
+
// 인쇄 캡처용 그리드 콘텐츠 ref (단일 페이지)
|
|
62
|
+
const contentRef = useRef(null);
|
|
63
|
+
// 인쇄 캡처용 그리드 콘텐츠 ref 배열 (다중 페이지 — 페이지 분할 시)
|
|
64
|
+
const pageRefs = useRef([]);
|
|
65
|
+
// 페이지 분할(표시 모드 전용) — 페이지당 단어/대립쌍 개수. 기본값 8(=1페이지에 전부)
|
|
66
|
+
const [itemsPerPageSetting, setItemsPerPageSetting] = useState(8);
|
|
67
|
+
// 종이 안에 페이지 번호(1 / N)를 찍을 위치 — 미표시 포함
|
|
68
|
+
const [pageNumberPosition, setPageNumberPosition] = useState('right');
|
|
69
|
+
// 내부 저장 팝업
|
|
70
|
+
const [showSavePopup, setShowSavePopup] = useState(false);
|
|
71
|
+
// '다른 이름으로 저장'(새 표 생성)으로 저장 팝업을 열었는지 — 저장 시 onSaveComplete에 saveAsNew로 전달.
|
|
72
|
+
const [saveAsNew, setSaveAsNew] = useState(false);
|
|
73
|
+
// 토스트
|
|
74
|
+
const { toastMessage, toastType, showWarning, clearToast } = useToastState('warning');
|
|
75
|
+
const handleCloseWordSearch = useCallback(() => setActiveCell(null), [setActiveCell]);
|
|
76
|
+
// display 모드에서 칸 수 조절용 상태 (showCellCount일 때만 사용)
|
|
77
|
+
const [displayCellCount, setDisplayCellCount] = useState(() => Math.max(items?.length ?? 1, 1));
|
|
78
|
+
/* eslint-disable react-hooks/set-state-in-effect */
|
|
79
|
+
useEffect(() => {
|
|
80
|
+
if (!isEditable)
|
|
81
|
+
setDisplayCellCount(prev => Math.max(prev, items?.length ?? 1));
|
|
82
|
+
}, [items?.length, isEditable]);
|
|
83
|
+
/* eslint-enable react-hooks/set-state-in-effect */
|
|
84
|
+
// 레이아웃 칸 수
|
|
85
|
+
const count = isEditable
|
|
86
|
+
? cellCount
|
|
87
|
+
: showCellCount
|
|
88
|
+
? Math.max(displayCellCount, items?.length ?? 1)
|
|
89
|
+
: Math.max(items?.length ?? 0, 1);
|
|
90
|
+
const { width, height } = WORD_TABLE_PAPER[orientation];
|
|
91
|
+
// 페이지 분할 — 편집/칸수조절(showCellCount) 모드에서는 적용하지 않고, 완성된 표시 모드에서만 적용
|
|
92
|
+
const pagesEnabled = !isEditable && !showCellCount;
|
|
93
|
+
// '페이지당 개수' 첫 옵션은 항상 전체 개수(=한 페이지에 전부), 나머지는 그보다 작은 표준 분할값만.
|
|
94
|
+
const itemCount = items?.length ?? 0;
|
|
95
|
+
// 기본/저장된 설정(8)이 실제 개수보다 크면 전체로 클램프 — 5개뿐이면 "5개(전부)"가 기본 선택되게.
|
|
96
|
+
const effectiveItemsPerPage = Math.min(itemsPerPageSetting, Math.max(itemCount, 1));
|
|
97
|
+
const itemsPerPage = pagesEnabled ? effectiveItemsPerPage : count;
|
|
98
|
+
const pages = pagesEnabled ? chunkItems(items ?? [], itemsPerPage) : null;
|
|
99
|
+
const isPaginated = !!pages && pages.length > 1;
|
|
100
|
+
const hasPairs = isEditable
|
|
101
|
+
? cells.some(c => c !== null && c.length > 1)
|
|
102
|
+
: (items ?? []).some(item => item.words.length > 1);
|
|
103
|
+
// PDF로 저장할 때 OS가 제안하는 기본 파일명. 저장된 표 이름이 있으면 그대로, 없으면 "오늘 날짜 + 단어표/대립쌍표"
|
|
104
|
+
const printFileName = tableName?.trim()
|
|
105
|
+
|| `${formatYmd(getTodayKst())} ${hasPairs ? t('wordTable.printFileNamePair', '대립쌍표') : t('wordTable.printFileNameSingle', '단어표')}`;
|
|
106
|
+
// 인쇄/새창/다운로드는 공용 훅으로 위임 — 페이지 분할 시 페이지별 ref, 아니면 단일 콘텐츠 ref를 넘긴다.
|
|
107
|
+
const getElements = useCallback(() => isPaginated
|
|
108
|
+
? pageRefs.current.filter((el) => el !== null)
|
|
109
|
+
: (contentRef.current ? [contentRef.current] : []), [isPaginated]);
|
|
110
|
+
const { print: handlePrint, openNewWindow: handleOpenNewWindow, downloadHtml } = useWordTablePrint({
|
|
111
|
+
getElements, paperW: width, paperH: height, fileName: printFileName,
|
|
112
|
+
onPopupBlocked: () => { showWarning(t('wordTable.popupBlocked', '팝업이 차단되었습니다. 브라우저 설정에서 팝업을 허용해 주세요.')); },
|
|
113
|
+
});
|
|
114
|
+
// 편집 모드 핸들러
|
|
115
|
+
const handleCellCountChange = (next) => {
|
|
116
|
+
setCellCount(next);
|
|
117
|
+
setCells(prev => {
|
|
118
|
+
const arr = Array(next).fill(null);
|
|
119
|
+
prev.slice(0, next).forEach((v, i) => { arr[i] = v; });
|
|
120
|
+
return arr;
|
|
121
|
+
});
|
|
122
|
+
setActiveCell(null);
|
|
123
|
+
};
|
|
124
|
+
const handleRemove = (idx) => {
|
|
125
|
+
setCells(prev => { const next = [...prev]; next[idx] = null; return next; });
|
|
126
|
+
if (activeCell === idx)
|
|
127
|
+
setActiveCell(null);
|
|
128
|
+
};
|
|
129
|
+
const handleWordConfirm = (entries) => {
|
|
130
|
+
if (activeCell === null)
|
|
131
|
+
return;
|
|
132
|
+
const idx = activeCell;
|
|
133
|
+
setCells(prev => { const next = [...prev]; next[idx] = entries; return next; });
|
|
134
|
+
const nextEmpty = cells.findIndex((c, i) => i > idx && c === null);
|
|
135
|
+
setActiveCell(nextEmpty !== -1 ? nextEmpty : null);
|
|
136
|
+
};
|
|
137
|
+
const hasColloquial = isEditable
|
|
138
|
+
? cells.some(c => c?.some(e => !!e.colloquialPronunciation))
|
|
139
|
+
: (items ?? []).some(item => item.words.some(w => !!w.colloquialLabel));
|
|
140
|
+
// 표에 실제로 이미지가 있는지 — resolver(word)는 존재 여부와 무관하게 항상 URL을 만들어 반환하므로
|
|
141
|
+
// 그 truthiness만으로는 판정할 수 없다(항상 true가 되어 이미지 없는 표에서도 '이미지' 토글이
|
|
142
|
+
// 활성화되는 문제가 있었다). checkImageExists로 실제 HEAD 요청(+캐시) 확인을 거친다.
|
|
143
|
+
/* 물어볼 낱말이 있는지는 **렌더 중에 안다** — 굳이 상태로 들고 있을 것이 아니다.
|
|
144
|
+
이걸 상태로 두면 "없음"으로 되돌리는 일을 효과가 해야 하고, 그러면 낡은 값으로
|
|
145
|
+
한 번 그린 뒤에 고쳐진다. */
|
|
146
|
+
const imagePairs = useMemo(() => {
|
|
147
|
+
if (!getImageResolver())
|
|
148
|
+
return [];
|
|
149
|
+
return isEditable
|
|
150
|
+
? cells.flatMap(c => (c ?? []).map(e => [e.word, e.homonum]))
|
|
151
|
+
: (items ?? []).flatMap(item => item.words.map(w => [w.label, w.homonum]));
|
|
152
|
+
}, [isEditable, cells, items]);
|
|
153
|
+
/* 실제로 파일이 있는지는 물어봐야 안다(HEAD 요청 + 캐시). 그 답만 상태로 든다.
|
|
154
|
+
`imagePairs` 가 비면 물어볼 것도 없으므로 아래 유도에서 곧바로 false 가 된다. */
|
|
155
|
+
const [imageFound, setImageFound] = useState(false);
|
|
156
|
+
useEffect(() => {
|
|
157
|
+
if (imagePairs.length === 0)
|
|
158
|
+
return;
|
|
159
|
+
let cancelled = false;
|
|
160
|
+
Promise.all(imagePairs.map(([w, h]) => checkImageExists(w, h))).then(results => {
|
|
161
|
+
if (!cancelled)
|
|
162
|
+
setImageFound(results.some(Boolean));
|
|
163
|
+
});
|
|
164
|
+
return () => { cancelled = true; };
|
|
165
|
+
}, [imagePairs]);
|
|
166
|
+
const hasImage = imagePairs.length > 0 && imageFound;
|
|
167
|
+
// TableFilterPanel에 끼워 넣을 편집/표시 전용 섹션(칸 수·페이지당 개수·페이지 번호) — 기본
|
|
168
|
+
// 5개(구성·용지방향·외곽선·절취선·구분선)는 그 컴포넌트가 wordTableSettings 공용 빌더로 직접 만든다.
|
|
169
|
+
const middleSections = useMemo(() => [
|
|
170
|
+
...((isEditable || showCellCount) ? [{ label: t('wordTable.filter.columns', '칸 수'), items: CELL_COUNTS.map(n => ({ value: `${n}칸`, displayLabel: t('wordTable.filter.column', { count: n }) })), display: 'segmented' }] : []),
|
|
171
|
+
// 내용이 있는(1개 이상) 표면 '페이지당 대립쌍/단어 수'를 항상 노출한다(표시 모드 한정).
|
|
172
|
+
...(pagesEnabled && (items?.length ?? 0) > 0 ? [buildItemsPerPageSection(t, { hasPairs, itemCount })] : []),
|
|
173
|
+
...(isPaginated ? [buildPageNumberSection(t)] : []),
|
|
174
|
+
], [t, isEditable, showCellCount, pagesEnabled, items?.length, hasPairs, itemCount, isPaginated]);
|
|
175
|
+
const middleSelected = {
|
|
176
|
+
...((isEditable || showCellCount) ? { [t('wordTable.filter.columns', '칸 수')]: `${isEditable ? cellCount : displayCellCount}칸` } : {}),
|
|
177
|
+
...(pagesEnabled && (items?.length ?? 0) > 0 ? { [t(hasPairs ? 'wordTable.filter.itemsPerPagePair' : 'wordTable.filter.itemsPerPageWord')]: `${effectiveItemsPerPage}개` } : {}),
|
|
178
|
+
...(isPaginated ? { [t('wordTable.filter.pageNumber', '페이지 번호')]: PAGE_NUM_POSITION_VALUE[pageNumberPosition] } : {}),
|
|
179
|
+
};
|
|
180
|
+
const handleMiddleSelect = (value, sectionLabel) => {
|
|
181
|
+
if (sectionLabel === t('wordTable.filter.columns', '칸 수')) {
|
|
182
|
+
if (isEditable)
|
|
183
|
+
handleCellCountChange(parseInt(value));
|
|
184
|
+
else
|
|
185
|
+
setDisplayCellCount(parseInt(value));
|
|
186
|
+
}
|
|
187
|
+
else if (sectionLabel === t(hasPairs ? 'wordTable.filter.itemsPerPagePair' : 'wordTable.filter.itemsPerPageWord')) {
|
|
188
|
+
setItemsPerPageSetting(parseInt(value));
|
|
189
|
+
}
|
|
190
|
+
else if (sectionLabel === t('wordTable.filter.pageNumber', '페이지 번호')) {
|
|
191
|
+
setPageNumberPosition(parsePageNumberPosition(value));
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
// 저장 팝업용 현재 items / preview
|
|
195
|
+
const saveItems = isEditable
|
|
196
|
+
? cells.filter((c) => c !== null).map(c => ({
|
|
197
|
+
id: c[0].word,
|
|
198
|
+
words: c.map(e => ({ label: e.word, subLabel: e.pronunciation, homonum: e.homonum })),
|
|
199
|
+
}))
|
|
200
|
+
: items ?? [];
|
|
201
|
+
const handleSave = (asNew = false) => {
|
|
202
|
+
setSaveAsNew(asNew);
|
|
203
|
+
// 인라인 이름·설명 모드: 팝업 없이 화면의 이름·설명으로 즉시 저장(덮어쓰기). 빈 값은 제안(placeholder)으로 대체.
|
|
204
|
+
if (inlineNameFields && onSaveComplete) {
|
|
205
|
+
// 저장한 이름을 기억해 둔다 — 저장 직후 existingNames에 이 이름이 추가돼도 자기 자신을
|
|
206
|
+
// 중복으로 오탐하지 않도록('저장하기'는 덮어쓰기 허용). '다른 이름으로 저장'은 여기 경로가 아니다.
|
|
207
|
+
const savedLower = trimmedName.trim().toLowerCase();
|
|
208
|
+
if (savedLower)
|
|
209
|
+
setSavedNames(prev => prev.includes(savedLower) ? prev : [...prev, savedLower]);
|
|
210
|
+
onSaveComplete(trimmedName, saveItems, trimmedDescription || undefined, asNew);
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
// saveOnly: 이름 입력 팝업 없이 바로 저장(이름은 상위에서 처리)
|
|
214
|
+
if (saveOnly && onSaveComplete) {
|
|
215
|
+
onSaveComplete('', saveItems, undefined, asNew);
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
if (onSaveComplete) {
|
|
219
|
+
setShowSavePopup(true);
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
downloadHtml();
|
|
223
|
+
};
|
|
224
|
+
// '다른 이름으로 저장' — 이름만 새로 입력받아 새 표로 저장(saveAsNew=true). 설명은 현재 값 유지(복사본).
|
|
225
|
+
const [showSaveAsPopup, setShowSaveAsPopup] = useState(false);
|
|
226
|
+
const [saveAsName, setSaveAsName] = useState('');
|
|
227
|
+
const saveAsTrimmed = saveAsName.trim();
|
|
228
|
+
const saveAsCollides = saveAsTrimmed !== '' && namesLower.includes(saveAsTrimmed.toLowerCase());
|
|
229
|
+
const openSaveAsPopup = () => {
|
|
230
|
+
setSaveAsName(trimmedName ? `${trimmedName} (복사)` : '');
|
|
231
|
+
setShowSaveAsPopup(true);
|
|
232
|
+
};
|
|
233
|
+
const handleSaveAsConfirm = () => {
|
|
234
|
+
if (!saveAsTrimmed || saveAsCollides || !onSaveComplete)
|
|
235
|
+
return;
|
|
236
|
+
onSaveComplete(saveAsTrimmed, saveItems, trimmedDescription || undefined, true);
|
|
237
|
+
setShowSaveAsPopup(false);
|
|
238
|
+
};
|
|
239
|
+
// 저장 버튼 활성 조건 — 인라인 모드에선 이름 필수·중복(others) 불가. 항목이 비어도 불가.
|
|
240
|
+
const noItems = saveItems.length === 0;
|
|
241
|
+
const mainSaveDisabled = noItems || (inlineNameFields && (trimmedName === '' || collidesOthers));
|
|
242
|
+
const handleMainDisabledClick = () => {
|
|
243
|
+
if (noItems) {
|
|
244
|
+
showWarning(t('wordTable.emptyItems', '단어를 1개 이상 추가해주세요.'));
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
if (inlineNameFields && trimmedName === '') {
|
|
248
|
+
showWarning(t('wordTable.save.nameRequired', '표 이름을 입력해 주세요.'));
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
if (inlineNameFields && collidesOthers) {
|
|
252
|
+
showWarning(t('wordTable.save.duplicateName', '이미 사용 중인 이름입니다.'));
|
|
253
|
+
}
|
|
254
|
+
};
|
|
255
|
+
const savePreview = (_jsx(WordTable, { items: saveItems, orientation: orientation, contentTypes: contentTypes, cutLine: cutLine, showOutline: showOutline, showDivLine: showDivLine, count: count }));
|
|
256
|
+
return (_jsxs(_Fragment, { children: [_jsxs(Section, { type: "page", icon: titleIcon, title: title, disc: disc, className: cx('word-table-block', className), children: [showSaveAsPopup && (_jsx(Popup, { size: "small", title: secondarySaveButtonLabel ?? t('wordTable.saveAsNewButton', '다른 이름으로 저장'), onClose: () => setShowSaveAsPopup(false), footer: ({ closeWithAnimation }) => (_jsxs(_Fragment, { children: [_jsx(Button, { size: 48, type: "bar", label: t('common.cancel', '취소'), onClick: closeWithAnimation }), _jsx(Button, { size: 48, type: "bar", variant: "main", label: t('common.save', '저장'), disabled: !saveAsTrimmed || saveAsCollides, onClick: handleSaveAsConfirm })] })), children: _jsx(TextField, { label: t('wordTable.save.nameLabel', '이름'), value: saveAsName, onChange: setSaveAsName, placeholder: t('wordTable.save.placeholder', '이 단어표에 대한 제목을 입력하세요.'), maxLength: 40, size: 48, fullWidth: true, autoFocus: true, onEnter: handleSaveAsConfirm, error: saveAsCollides ? t('wordTable.save.duplicateName', '이미 사용 중인 이름입니다.') : undefined }) })), showSavePopup && onSaveComplete && renderSavePopup?.({
|
|
257
|
+
defaultName: typeof title === 'string' ? title : t('wordTable.defaultName', '단어 표'),
|
|
258
|
+
preview: savePreview,
|
|
259
|
+
previewW: width,
|
|
260
|
+
previewH: height,
|
|
261
|
+
items: saveItems,
|
|
262
|
+
existingNames: getSavedTables().map(tb => tb.name),
|
|
263
|
+
saveAsNew,
|
|
264
|
+
onSave: (name, description) => { onSaveComplete(name, saveItems, description, saveAsNew); setShowSavePopup(false); },
|
|
265
|
+
onCancel: () => setShowSavePopup(false),
|
|
266
|
+
}), (isEditable || onAddItem) && activeCell !== null && renderWordSearch?.({
|
|
267
|
+
cellIndex: activeCell,
|
|
268
|
+
onConfirm: isEditable ? handleWordConfirm : (entries) => {
|
|
269
|
+
if (onAddItem) {
|
|
270
|
+
const entry = entries[0];
|
|
271
|
+
if (entry) {
|
|
272
|
+
onAddItem({
|
|
273
|
+
id: entry.word,
|
|
274
|
+
words: [{ label: entry.word, subLabel: entry.pronunciation, homonum: entry.homonum }],
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
setActiveCell(null);
|
|
279
|
+
},
|
|
280
|
+
onClose: handleCloseWordSearch,
|
|
281
|
+
}), !hideControls && (_jsx(TableFilterPanel, { hasImage: hasImage, hasColloquial: hasColloquial, contentTypes: contentTypes, orientation: orientation, showOutline: showOutline, cutLine: cutLine, showDivLine: showDivLine, setters: { setContentTypes, setOrientation, setShowOutline, setCutLine, setShowDivLine }, showCutLine: (pagesEnabled ? itemsPerPage : count) > 1, showDivLine2: hasPairs, middleSections: middleSections, extraSelected: middleSelected, onExtraSelect: handleMiddleSelect })), isPaginated && pages ? (_jsx("div", { className: "word-table-block__pages", children: pages.map((page, i) => (_jsx(WordTable, { orientation: orientation, contentTypes: contentTypes, cutLine: cutLine, showOutline: showOutline, showDivLine: showDivLine, count: itemsPerPage, items: page, onRemoveItem: onRemoveItem, contentRef: el => { pageRefs.current[i] = el; }, pageNumber: { current: i + 1, total: pages.length }, pageNumberPosition: pageNumberPosition }, i))) })) : (_jsx(WordTable, { orientation: orientation, contentTypes: contentTypes, cutLine: cutLine, showOutline: showOutline, showDivLine: showDivLine, count: count, items: isEditable ? undefined : (items ?? []), editCells: isEditable ? cells : undefined, activeCell: activeCell, onActivateCell: (isEditable || onAddItem) ? setActiveCell : undefined, onRemoveCell: isEditable ? handleRemove : undefined, onRemoveItem: !isEditable ? onRemoveItem : undefined, onReorder: !isEditable ? onReorder : undefined, showFillerAdd: !!onAddItem, contentRef: contentRef })), inlineNameFields && !hideControls && (_jsxs(Panel, { size: "medium", labelWidth: 64, useBorder: false, useRowBorder: false, className: "word-table-block__meta", children: [_jsx(PanelRow, { variant: "custom", label: t('wordTable.save.nameLabel', '이름'), required: true, align: "vertical", useFullWidth: true, children: _jsx(TextField, { required: true, value: nameValue ?? '', onChange: onNameChange, placeholder: namePlaceholder ? namePlaceholder + t('wordTable.save.autoFillHint', ' (Tab 또는 space 입력시 자동 입력)') : t('wordTable.save.placeholder', '이 단어표에 대한 제목을 입력하세요.'),
|
|
282
|
+
/* PanelRow의 라벨은 시각적으로만 붙어 있고 입력과 연결돼 있지 않아, 낭독기에는
|
|
283
|
+
이름 없는 입력으로 읽혔다. placeholder는 자동완성 안내문("Tab 또는 space…")이
|
|
284
|
+
섞여 있어 이름으로 부적절하므로 같은 라벨 문구를 넘긴다. */
|
|
285
|
+
ariaLabel: t('wordTable.save.nameLabel', '이름'), maxLength: 40, size: 48, fullWidth: true, error: collidesOthers ? t('wordTable.save.duplicateName', '이미 사용 중인 이름입니다.') : undefined, onKeyDown: (e) => {
|
|
286
|
+
// Tab/Space: 입력이 비어 있고 제안(placeholder)이 있으면 그 값을 채운다(ghost-text 수락).
|
|
287
|
+
if (((e.key === 'Tab' && !e.shiftKey) || e.key === ' ') && !(nameValue ?? '').trim() && (namePlaceholder ?? '').trim()) {
|
|
288
|
+
e.preventDefault();
|
|
289
|
+
onNameChange?.(namePlaceholder ?? '');
|
|
290
|
+
}
|
|
291
|
+
} }) }), _jsx(PanelRow, { variant: "custom", label: t('wordTable.save.descriptionLabel', '설명'), align: "vertical", useFullWidth: true, children: _jsx(TextField, { value: descriptionValue ?? '', onChange: onDescriptionChange, placeholder: descriptionPlaceholder ? descriptionPlaceholder + t('wordTable.save.autoFillHint', ' (Tab 또는 space 입력시 자동 입력)') : t('wordTable.save.descriptionPlaceholder', '이 단어표에 대한 설명을 입력하세요.'), ariaLabel: t('wordTable.save.descriptionLabel', '설명'), maxLength: 200, multiline: true, rows: 2, fullWidth: true, onKeyDown: (e) => {
|
|
292
|
+
if (((e.key === 'Tab' && !e.shiftKey) || e.key === ' ') && !(descriptionValue ?? '').trim() && (descriptionPlaceholder ?? '').trim()) {
|
|
293
|
+
e.preventDefault();
|
|
294
|
+
onDescriptionChange?.(descriptionPlaceholder ?? '');
|
|
295
|
+
}
|
|
296
|
+
} }) })] }))] }), !hideControls && (_jsxs("div", { className: "word-table-block__actions", children: [_jsxs("div", { className: "word-table-block__actions-left", children: [!saveOnly && onReset && (_jsx(Button, { size: 40, type: "bar", label: resolvedResetLabel, onClick: onReset })), !saveOnly && onLoad && (_jsx(Button, { size: 40, type: "bar", label: t('wordTable.load', '불러오기'), onClick: onLoad })), !saveOnly && _jsx(Button, { size: 40, type: "bar", label: t('wordTable.openNewWindow', '새 창으로 보기'), onClick: handleOpenNewWindow })] }), _jsxs("div", { className: "word-table-block__actions-right", children: [onCancel && _jsx(Button, { size: "56", type: "bar", label: t('common.cancel', '취소'), onClick: onCancel }), !saveOnly && _jsx(Button, { size: "56", type: "bar", label: t('wordTable.print', '인쇄하기'), onClick: handlePrint }), secondarySaveButtonLabel && (_jsx(Button, { size: "56", type: "bar", label: secondarySaveButtonLabel, onClick: () => inlineNameFields ? openSaveAsPopup() : handleSave(true), disabled: noItems, onDisabledClick: () => { showWarning(t('wordTable.emptyItems', '단어를 1개 이상 추가해주세요.')); } })), _jsx(Button, { size: "56", type: "bar", variant: "main", label: saveButtonLabel ?? t('wordTable.saveButton', '저장하기'), onClick: () => handleSave(false), disabled: mainSaveDisabled, onDisabledClick: handleMainDisabledClick })] })] })), _jsx(Toast, { message: toastMessage, type: toastType, onClose: clearToast })] }));
|
|
297
|
+
}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/* 단어표 '문서형' 미리보기 카드 (내용 썸네일 + 이름 + 날짜·개수) */
|
|
2
|
+
.word-table-button {
|
|
3
|
+
position: relative;
|
|
4
|
+
box-sizing: border-box;
|
|
5
|
+
width: 240px;
|
|
6
|
+
display: flex;
|
|
7
|
+
flex-direction: column;
|
|
8
|
+
border: 1px solid var(--color-whiteLine);
|
|
9
|
+
border-radius: var(--radius-s, 8px);
|
|
10
|
+
background: var(--color-white);
|
|
11
|
+
overflow: hidden;
|
|
12
|
+
cursor: pointer;
|
|
13
|
+
transition: border-color 0.15s, box-shadow 0.15s;
|
|
14
|
+
}
|
|
15
|
+
.word-table-button:hover {
|
|
16
|
+
border-color: var(--color-main);
|
|
17
|
+
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.06);
|
|
18
|
+
}
|
|
19
|
+
.word-table-button:focus-visible {
|
|
20
|
+
outline: 2px solid var(--color-main);
|
|
21
|
+
outline-offset: 1px;
|
|
22
|
+
}
|
|
23
|
+
.word-table-button--selected {
|
|
24
|
+
border-color: var(--color-main);
|
|
25
|
+
box-shadow: 0 0 0 1px var(--color-main) inset;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/* 단어(썸네일) 영역 고정 높이, 정보/푸터는 아래에 자동 높이.
|
|
29
|
+
*
|
|
30
|
+
* 240px 이었는데 **대립쌍표에서 칸이 잘렸다.** 한 표는 최대 12칸이고(MAX_SELECT),
|
|
31
|
+
* 대립쌍은 한 칸에 낱말이 둘이라 6행 × 47px + 간격 5px = 287px 가 필요하다.
|
|
32
|
+
* 240px 에서는 여섯 칸만 보이고 나머지는 잘렸다(2026-08-28 실측).
|
|
33
|
+
* 단어표(칸당 하나)는 예전에도 지금도 다 들어간다. */
|
|
34
|
+
.word-table-button__thumb {
|
|
35
|
+
flex: 0 0 auto;
|
|
36
|
+
height: 290px;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.word-table-button__info {
|
|
40
|
+
display: flex;
|
|
41
|
+
flex-direction: row;
|
|
42
|
+
align-items: flex-start;
|
|
43
|
+
gap: 8px;
|
|
44
|
+
padding: 12px 14px 0;
|
|
45
|
+
min-width: 0;
|
|
46
|
+
/* '더보기'(⋯)를 띄우기 위한 기준점 — 아래 참고 */
|
|
47
|
+
position: relative;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/* '더보기'는 **흐름에서 뺀다.**
|
|
51
|
+
*
|
|
52
|
+
* 예전에는 제목·설명과 같은 줄에 놓인 형제라, 글 묶음이 그 단추 폭(약 40px)만큼
|
|
53
|
+
* 좁아졌다. 제목은 어차피 두 줄에서 잘리니 티가 안 났지만 **설명은 오른쪽이 늘 비었다**
|
|
54
|
+
* (사용자가 화면에서 그 빈 자리를 짚었다). 띄워 놓으면 설명이 카드 폭을 다 쓴다.
|
|
55
|
+
* 대신 **제목만** 오른쪽을 비켜 가게 한다 — 제목 첫 줄이 단추와 같은 높이다. */
|
|
56
|
+
.word-table-button__more {
|
|
57
|
+
position: absolute;
|
|
58
|
+
top: 8px;
|
|
59
|
+
right: 10px;
|
|
60
|
+
}
|
|
61
|
+
.word-table-button__title {
|
|
62
|
+
padding-right: 34px;
|
|
63
|
+
}
|
|
64
|
+
/* 스토어 하단 영역(footer)이 없을 때 — footer의 padding-bottom(14px)이 없는 만큼
|
|
65
|
+
info 쪽에서 카드 하단 여백을 직접 채운다.
|
|
66
|
+
|
|
67
|
+
그리고 **카드의 남은 높이를 이 영역이 받는다.** 카드는 같은 줄에서 가장 큰 것에
|
|
68
|
+
맞춰 늘어나는데(`my-word-table-doc-wrap` 의 `align-self: stretch`), 늘어난 만큼이
|
|
69
|
+
`23시간 전` 아래에 빈칸으로 남았다. 여기서 받아 두면 아래 `__meta` 의
|
|
70
|
+
`margin-top: auto` 가 그 값을 바닥으로 민다.
|
|
71
|
+
푸터가 있는 스토어 카드는 푸터가 이미 `margin-top: auto` 로 바닥을 잡으므로
|
|
72
|
+
건드리지 않는다. */
|
|
73
|
+
.word-table-button--no-footer .word-table-button__info {
|
|
74
|
+
flex: 1 1 auto;
|
|
75
|
+
min-height: 0;
|
|
76
|
+
}
|
|
77
|
+
/* 글 묶음이 세로로 꽉 차야 그 안에서 아래로 밀 수 있다. 옆의 '더보기' 단추까지
|
|
78
|
+
늘리지 않도록 부모의 align-items 를 바꾸지 않고 자기 자신만 늘린다. */
|
|
79
|
+
.word-table-button--no-footer .word-table-button__info-text {
|
|
80
|
+
align-self: stretch;
|
|
81
|
+
}
|
|
82
|
+
.word-table-button__info-text {
|
|
83
|
+
display: flex;
|
|
84
|
+
flex-direction: column;
|
|
85
|
+
align-items: flex-start;
|
|
86
|
+
gap: 4px;
|
|
87
|
+
min-width: 0;
|
|
88
|
+
flex: 1 1 auto;
|
|
89
|
+
text-align: left;
|
|
90
|
+
}
|
|
91
|
+
.word-table-button__title {
|
|
92
|
+
color: var(--color-black);
|
|
93
|
+
display: -webkit-box;
|
|
94
|
+
-webkit-line-clamp: 2;
|
|
95
|
+
-webkit-box-orient: vertical;
|
|
96
|
+
overflow: hidden;
|
|
97
|
+
overflow-wrap: anywhere;
|
|
98
|
+
}
|
|
99
|
+
/* 설명 — 제목 아래, 2줄까지 표시 후 말줄임 (폰트는 body-3 토큰 그대로) */
|
|
100
|
+
.word-table-button__desc {
|
|
101
|
+
color: var(--color-gray);
|
|
102
|
+
display: -webkit-box;
|
|
103
|
+
-webkit-line-clamp: 2;
|
|
104
|
+
-webkit-box-orient: vertical;
|
|
105
|
+
overflow: hidden;
|
|
106
|
+
}
|
|
107
|
+
.word-table-button__meta { color: var(--color-gray); }
|
|
108
|
+
|
|
109
|
+
/* 등록일 + 상태 배지 한 줄 — 왼쪽 끝에 등록일, 오른쪽 끝에 배지. */
|
|
110
|
+
.word-table-button__meta-row {
|
|
111
|
+
display: flex;
|
|
112
|
+
align-items: center;
|
|
113
|
+
justify-content: space-between;
|
|
114
|
+
gap: 8px;
|
|
115
|
+
min-width: 0;
|
|
116
|
+
/* 좌우는 `__info` 와 같게 — 등록일이 제목과 같은 세로선에서 시작한다.
|
|
117
|
+
위쪽 12px 은 **최소 간격**이다. 남는 높이는 `margin-top: auto` 가 전부 이 위로
|
|
118
|
+
몰아주는데(제목이 한 줄이면 26px, 두 줄이면 0px), 0px 일 때 설명이 등록일에
|
|
119
|
+
바짝 붙었다. 카드마다 달라도 최소한 이만큼은 띄운다. */
|
|
120
|
+
padding: 12px 14px 14px;
|
|
121
|
+
}
|
|
122
|
+
.word-table-button__badges {
|
|
123
|
+
display: flex;
|
|
124
|
+
align-items: center;
|
|
125
|
+
gap: 4px;
|
|
126
|
+
flex: 0 0 auto;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/* 등록일은 **카드 왼쪽 아래**에 붙인다 — 설명이 한 줄이든 두 줄이든, 카드가 얼마나
|
|
130
|
+
늘어나든 자리가 같아야 여러 카드를 훑을 때 눈이 한 줄을 따라간다.
|
|
131
|
+
|
|
132
|
+
푸터가 없는 카드에만 건다. 스토어 카드는 푸터가 이미 `margin-top: auto` 로 바닥을
|
|
133
|
+
잡고 있어서, 여기까지 밀면 설명과 등록일 사이가 벌어진다. 화면에서 확인할 수 없는
|
|
134
|
+
변경은 만들지 않는다 — 자료실 화면에 닿지 못해서, 아예 안 닿게 범위를 좁혔다. */
|
|
135
|
+
.word-table-button--no-footer .word-table-button__meta-row { margin-top: auto; }
|
|
136
|
+
|
|
137
|
+
/* 하단 부가 영역 — 세로 스택(스토어: 1행 게시자·시간 / 2행 우측 좋아요·다운로드)
|
|
138
|
+
margin-top:auto 로 카드가 늘어나도 항상 하단에 고정(그리드 stretch와 함께 동작) */
|
|
139
|
+
.word-table-button__footer {
|
|
140
|
+
display: flex;
|
|
141
|
+
flex-direction: column;
|
|
142
|
+
gap: 8px;
|
|
143
|
+
padding: 12px 14px 14px;
|
|
144
|
+
margin-top: auto;
|
|
145
|
+
min-width: 0;
|
|
146
|
+
}
|
|
147
|
+
.word-table-button__store-by {
|
|
148
|
+
display: inline-flex;
|
|
149
|
+
align-items: center;
|
|
150
|
+
gap: 6px;
|
|
151
|
+
min-width: 0;
|
|
152
|
+
overflow: hidden;
|
|
153
|
+
}
|
|
154
|
+
.word-table-button__store-by .training-card__date { white-space: nowrap; }
|
|
155
|
+
.word-table-button__store-stats {
|
|
156
|
+
display: inline-flex;
|
|
157
|
+
align-items: center;
|
|
158
|
+
gap: 4px;
|
|
159
|
+
align-self: flex-end;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/* 더보기 버튼 — info 우측 인라인 */
|
|
163
|
+
.word-table-button__more {
|
|
164
|
+
flex: 0 0 auto;
|
|
165
|
+
}
|
|
166
|
+
/* 스토어 발행 배지 — 썸네일 좌상단 오버레이 */
|
|
167
|
+
/* 상태 배지 — 한때 썸네일 위에 `position: absolute` 로 얹혀 있었고, **낱말을 가렸다**
|
|
168
|
+
(실측: '공유 중'이 '가구'를 덮었다). 이제 등록일과 같은 줄, 카드 오른쪽 아래에 둔다.
|
|
169
|
+
겹칠 일이 없으니 띄우지 않는다. */
|
|
170
|
+
.word-table-button__badge {
|
|
171
|
+
pointer-events: none;
|
|
172
|
+
}
|
|
173
|
+
/* 최근 생성·미열람 표 표시 — 우상단 원형 배지(circle badge) */
|
|
174
|
+
.word-table-button__new-dot {
|
|
175
|
+
position: absolute;
|
|
176
|
+
top: 8px;
|
|
177
|
+
right: 8px;
|
|
178
|
+
z-index: 3;
|
|
179
|
+
width: 10px;
|
|
180
|
+
height: 10px;
|
|
181
|
+
border-radius: 50%;
|
|
182
|
+
background: var(--color-main);
|
|
183
|
+
box-shadow: 0 0 0 2px var(--color-white);
|
|
184
|
+
pointer-events: none;
|
|
185
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { ReactNode, MouseEvent } from 'react';
|
|
2
|
+
import type { WordSearchResultItem } from '../../types/wordSearch';
|
|
3
|
+
import './WordTableButton.css';
|
|
4
|
+
/** @public */
|
|
5
|
+
export interface WordTableButtonProps {
|
|
6
|
+
/** 단어표 내용(썸네일 미리보기 + 개수) */
|
|
7
|
+
items: WordSearchResultItem[];
|
|
8
|
+
/** 단어표 이름 */
|
|
9
|
+
name: string;
|
|
10
|
+
/** 설명 — 제목 아래 body-3로 표시(있을 때만) */
|
|
11
|
+
description?: string;
|
|
12
|
+
/** 생성일(ISO) — 메타(날짜)에 표시. 없으면 개수만. */
|
|
13
|
+
createdAt?: string;
|
|
14
|
+
/** 스토어 발행 배지 표시 */
|
|
15
|
+
published?: boolean;
|
|
16
|
+
/** 발행 배지 라벨(i18n 주입) */
|
|
17
|
+
publishedLabel?: string;
|
|
18
|
+
/** 활성 공유 링크 존재 배지 표시(썸네일 우상단) */
|
|
19
|
+
shared?: boolean;
|
|
20
|
+
/** 공유 배지 라벨(i18n 주입) */
|
|
21
|
+
sharedLabel?: string;
|
|
22
|
+
/** 최근 생성·미열람 표 표시 — 우상단 원형 배지(circle badge) */
|
|
23
|
+
isNew?: boolean;
|
|
24
|
+
/** 게시자명 — 지정 시 하단에 게시자·발행일·좋아요/다운로드 수(스토어 푸터)를 표시 */
|
|
25
|
+
publisherName?: string;
|
|
26
|
+
/** 발행일(ISO) — 게시자명 옆에 상대 시간으로 표시 */
|
|
27
|
+
publishedAt?: string;
|
|
28
|
+
/** 좋아요 수 — 지정 시(0 포함) 하트 배지로 표시 */
|
|
29
|
+
likeCount?: number;
|
|
30
|
+
/** 다운로드 수 — 지정 시(0 포함) 다운로드 배지로 표시 */
|
|
31
|
+
downloadCount?: number;
|
|
32
|
+
/** 게시자명 클릭(게시자 프로필/필터 이동 등) */
|
|
33
|
+
onPublisherClick?: () => void;
|
|
34
|
+
/** 선택 상태(불러오기 팝업 등 선택용) */
|
|
35
|
+
selected?: boolean;
|
|
36
|
+
/** 카드 클릭(미리보기/열기) */
|
|
37
|
+
onClick?: () => void;
|
|
38
|
+
/** 더보기 메뉴 */
|
|
39
|
+
onMore?: (e: MouseEvent<Element>) => void;
|
|
40
|
+
/** 제목 영역 오버라이드(인라인 이름 바꾸기 등). 지정 시 클릭·더보기 비활성. */
|
|
41
|
+
titleNode?: ReactNode;
|
|
42
|
+
className?: string;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* @public 단어표를 '문서형' 미리보기 카드로 표현하는 컴포넌트.
|
|
46
|
+
* 내용 썸네일(WordTableThumbnail) + 이름 + 날짜·개수 + (발행 배지 / 더보기 / 스토어 푸터).
|
|
47
|
+
*/
|
|
48
|
+
export default function WordTableButton({ items, name, description, createdAt, published, publishedLabel, shared, sharedLabel, isNew, publisherName, publishedAt, likeCount, downloadCount, onPublisherClick, selected, onClick, onMore, titleNode, className, }: WordTableButtonProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { cx } from '../../utils/cx';
|
|
4
|
+
import { useTranslation } from 'react-i18next';
|
|
5
|
+
import WordTableThumbnail from './WordTableThumbnail';
|
|
6
|
+
import Badge from '../Badge';
|
|
7
|
+
import Button from '../Button';
|
|
8
|
+
import { formatRelativeTime } from '../../utils/date';
|
|
9
|
+
import './WordTableButton.css';
|
|
10
|
+
/**
|
|
11
|
+
* @public 단어표를 '문서형' 미리보기 카드로 표현하는 컴포넌트.
|
|
12
|
+
* 내용 썸네일(WordTableThumbnail) + 이름 + 날짜·개수 + (발행 배지 / 더보기 / 스토어 푸터).
|
|
13
|
+
*/
|
|
14
|
+
export default function WordTableButton({ items, name, description, createdAt, published, publishedLabel, shared, sharedLabel, isNew, publisherName, publishedAt, likeCount, downloadCount, onPublisherClick, selected, onClick, onMore, titleNode, className, }) {
|
|
15
|
+
const { t } = useTranslation();
|
|
16
|
+
const renaming = titleNode != null;
|
|
17
|
+
const hasStoreFooter = publisherName != null || publishedAt != null || likeCount != null || downloadCount != null;
|
|
18
|
+
const handleKey = (e) => {
|
|
19
|
+
if (!renaming && (e.key === 'Enter' || e.key === ' ')) {
|
|
20
|
+
e.preventDefault();
|
|
21
|
+
onClick?.();
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
return (_jsxs("div", { className: cx('word-table-button', selected ? 'word-table-button--selected' : '', !hasStoreFooter ? 'word-table-button--no-footer' : '', className), role: "button", tabIndex: 0, "aria-label": name, onClick: renaming ? undefined : onClick, onKeyDown: handleKey, children: [isNew && _jsx("span", { className: "word-table-button__new-dot", "aria-label": t('myWordTable.newBadge', '새로 만든 표') }), _jsx(WordTableThumbnail, { items: items, className: "word-table-button__thumb" }), _jsxs("div", { className: "word-table-button__info", children: [_jsxs("div", { className: "word-table-button__info-text", children: [titleNode ?? _jsx("div", { className: "word-table-button__title h4", children: name }), description && _jsx("div", { className: "word-table-button__desc body-3", children: description })] }), onMore && !renaming && (_jsx(Button, { className: "word-table-button__more", size: 32, type: "dot", variant: "transparent-gray", useBorder: false, icon: "ellipsis",
|
|
25
|
+
/* 하드코딩 '더보기'였다(영어 화면에서도 한국어로 남았다). 목록에 표가
|
|
26
|
+
여러 개면 이름이 같은 버튼이 여러 개이기도 해서 이름을 함께 넣는다. */
|
|
27
|
+
ariaLabel: t('common.moreFor', { name }), onClick: (e) => { e.stopPropagation(); onMore(e); } }))] }), (createdAt || published || shared) && (_jsxs("div", { className: "word-table-button__meta-row", children: [_jsx("span", { className: "word-table-button__meta caption-1", children: createdAt ? formatRelativeTime(createdAt, t) : '' }), _jsxs("span", { className: "word-table-button__badges", children: [published && (_jsx(Badge, { className: "word-table-button__badge", size: "small", variant: "main", fill: "soft", iconLeft: "book-marked", label: publishedLabel ?? '발행됨' })), shared && (_jsx(Badge, { className: "word-table-button__badge", size: "small", fill: "soft", iconLeft: "link", label: sharedLabel ?? '공유 중' }))] })] })), hasStoreFooter && (_jsxs("div", { className: "word-table-button__footer", children: [_jsxs("span", { className: "word-table-button__store-by", children: [publisherName && (_jsx("button", { className: "training-card__publisher body-4", type: "button", onClick: (e) => { e.stopPropagation(); onPublisherClick?.(); }, children: publisherName })), publishedAt && _jsx("span", { className: "training-card__date body-4", children: formatRelativeTime(publishedAt, t) })] }), _jsxs("span", { className: "word-table-button__store-stats", children: [likeCount != null && _jsx(Badge, { size: "small", fill: "soft", variant: "like", iconLeft: "heart", label: String(likeCount) }), downloadCount != null && _jsx(Badge, { size: "small", fill: "soft", variant: "main", iconLeft: "download", label: String(downloadCount) })] })] }))] }));
|
|
28
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
.word-table-thumb {
|
|
2
|
+
display: grid;
|
|
3
|
+
gap: 1px;
|
|
4
|
+
background: var(--color-darkWhite);
|
|
5
|
+
border-bottom: 1px solid var(--color-darkWhite);
|
|
6
|
+
height: 140px;
|
|
7
|
+
/* **행은 내용보다 작아지지 않는다.**
|
|
8
|
+
*
|
|
9
|
+
* 예전에는 `1fr` 이었다. 썸네일은 항목 수만큼 행을 만드는데(12개 → 6행), 높이는
|
|
10
|
+
* 고정이라 항목이 늘수록 행이 짜부라진다. 대립쌍표는 한 칸에 낱말이 **둘**이라
|
|
11
|
+
* 먼저 무너졌다 — 12개짜리 표에서 행이 39px 인데 내용은 54px 이라, 글자가 칸을
|
|
12
|
+
* 넘어 아랫줄과 겹쳐 보였다(2026-08-28 실측, 겹친 쌍 8개).
|
|
13
|
+
*
|
|
14
|
+
* `minmax(min-content, 1fr)` 는 두 가지를 함께 지킨다 —
|
|
15
|
+
* 항목이 적으면 예전처럼 늘어나 상자를 채우고, 많으면 글자 크기를 지킨 채 멈춘다.
|
|
16
|
+
* 넘치는 행은 아래 `overflow: hidden` 이 자른다. **미리보기는 잘려도 읽혀야 한다.** */
|
|
17
|
+
grid-auto-rows: minmax(min-content, 1fr);
|
|
18
|
+
overflow: hidden;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.word-table-thumb__cell {
|
|
22
|
+
display: flex;
|
|
23
|
+
flex-direction: column;
|
|
24
|
+
align-items: center;
|
|
25
|
+
justify-content: center;
|
|
26
|
+
padding: 4px;
|
|
27
|
+
background: var(--color-white);
|
|
28
|
+
gap: 1px;
|
|
29
|
+
overflow: hidden;
|
|
30
|
+
min-height: 0;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.word-table-thumb__word {
|
|
34
|
+
color: var(--color-black);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/* 줄간격을 좁힌다. **선택자를 한 단계 겹쳐 쓴 이유가 있다** — 쓰는 쪽이 `body-3` 을
|
|
38
|
+
함께 붙이는데 그쪽도 클래스 하나라, 단순 `.word-table-thumb__word` 로는 나중에 오는
|
|
39
|
+
`body-3`(22px)에 진다. 한때 여기 `line-height: 1` 이 적혀 있었지만 **한 번도 적용된
|
|
40
|
+
적이 없었다**(실측: 계산값 22px).
|
|
41
|
+
|
|
42
|
+
미리보기는 읽히기만 하면 되고, 22px → 17px 로 줄이면 한 칸에 두 낱말이 들어가는
|
|
43
|
+
대립쌍표에서 행 하나가 63px → 47px 이 된다. 그래야 최대 12칸이 다 보인다. */
|
|
44
|
+
.word-table-thumb .word-table-thumb__word {
|
|
45
|
+
line-height: 1.2;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.word-table-thumb__divider {
|
|
49
|
+
display: block;
|
|
50
|
+
width: 30%;
|
|
51
|
+
height: 1px;
|
|
52
|
+
background: var(--color-darkWhite);
|
|
53
|
+
/* 위아래 4px 씩이면 대립쌍 한 칸이 8px 더 두꺼워지고, 그것이 여섯 행이면 48px 다.
|
|
54
|
+
미리보기에서는 1px 로도 두 낱말이 충분히 갈린다. */
|
|
55
|
+
margin: 1px 0;
|
|
56
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { WordSearchResultItem } from '../../types/wordSearch';
|
|
2
|
+
import './WordTableThumbnail.css';
|
|
3
|
+
/**
|
|
4
|
+
* @public 단어표 내용 미니 미리보기(그리드 썸네일).
|
|
5
|
+
* 단어표 불러오기 팝업·나의 단어표 카드 등에서 공유하는 '문서형' 미리보기.
|
|
6
|
+
*/
|
|
7
|
+
export default function WordTableThumbnail({ items, className }: {
|
|
8
|
+
items: WordSearchResultItem[];
|
|
9
|
+
className?: string;
|
|
10
|
+
}): import("react").JSX.Element;
|