diff --git a/.gitignore b/.gitignore index 938355a..dc39bc7 100644 --- a/.gitignore +++ b/.gitignore @@ -46,4 +46,5 @@ app/test/ app/api/test # Idea -/.idea \ No newline at end of file +/.idea +/.claude \ No newline at end of file diff --git a/src/app/components/HelpModal.tsx b/src/app/components/HelpModal.tsx index c1db22f..17a4e0d 100644 --- a/src/app/components/HelpModal.tsx +++ b/src/app/components/HelpModal.tsx @@ -7,6 +7,7 @@ import { DialogTitle, DialogTrigger, } from '@/src/app/components/ui/dialog'; +import { Button } from './ui/button'; interface HelpModalProps { title: string; @@ -28,13 +29,10 @@ const HelpModal = ({ return ( - + {triggerText && {triggerText}} + diff --git a/src/app/kkuko/profile/KkukoProfile.tsx b/src/app/kkuko/profile/KkukoProfile.tsx index c964329..453e1e7 100644 --- a/src/app/kkuko/profile/KkukoProfile.tsx +++ b/src/app/kkuko/profile/KkukoProfile.tsx @@ -107,7 +107,8 @@ export default function KkukoProfile() {

{error}

- 2026-01-18 17시 이후 게임 접속한 유저에 대해서 조회할 수 있습니다. + 2026-01-18 17시 ~ 2026-03-03 00시 사이에 게임 접속한 유저에 대해서 조회할 수 있습니다. + 프로필 등록을 원하신다면 id검색을 이용해주세요.

)} diff --git a/src/app/lib/lib.ts b/src/app/lib/lib.ts index 74f42d3..137182c 100644 --- a/src/app/lib/lib.ts +++ b/src/app/lib/lib.ts @@ -47,4 +47,31 @@ export function misssionCharMask(chars: string[]): number { } } return base; -} \ No newline at end of file +} + + +/** + * 한글 텍스트 필터링 함수 + * + * @param text 필터링할 텍스트 + * @param search 검색할 텍스트 + * @returns text가 search를 포함하는지 여부 + */ +export function filterKoreanText(text: string, search: string): boolean { + if (search === "") return true; + let indexText = 0; + let indexSearch = 0; + + while (indexText < text.length && indexSearch < search.length) { + if ( + text[indexText] === search[indexSearch] || + (("ㄱ" <= search[indexSearch] && search[indexSearch] <= "ㅎ") && + calculateKoreanInitials(text[indexText]) === calculateKoreanInitials(search[indexSearch])) + ) { + indexSearch++; + } + indexText++; + } + + return indexSearch === search.length; +}; \ No newline at end of file diff --git a/src/app/manager-tool/Home.tsx b/src/app/manager-tool/Home.tsx index e0c1357..9a9a409 100644 --- a/src/app/manager-tool/Home.tsx +++ b/src/app/manager-tool/Home.tsx @@ -47,7 +47,7 @@ export default function Home() {
- 등등 + 미션 단어 추출
diff --git a/src/app/manager-tool/extract/containx/ContainX.tsx b/src/app/manager-tool/extract/containx/ContainX.tsx index c3a1535..53d2eec 100644 --- a/src/app/manager-tool/extract/containx/ContainX.tsx +++ b/src/app/manager-tool/extract/containx/ContainX.tsx @@ -106,14 +106,14 @@ const WordExtractorApp = () => {
diff --git a/src/app/manager-tool/extract/endx/EndX.tsx b/src/app/manager-tool/extract/endx/EndX.tsx index 639feb9..c984e01 100644 --- a/src/app/manager-tool/extract/endx/EndX.tsx +++ b/src/app/manager-tool/extract/endx/EndX.tsx @@ -110,15 +110,15 @@ const WordExtractorApp = () => {
-
{/* Step 0 */} diff --git a/src/app/manager-tool/extract/english-mission/EnglishMission.tsx b/src/app/manager-tool/extract/english-mission/EnglishMission.tsx index 82deb55..a6f40a0 100644 --- a/src/app/manager-tool/extract/english-mission/EnglishMission.tsx +++ b/src/app/manager-tool/extract/english-mission/EnglishMission.tsx @@ -126,15 +126,15 @@ const WordExtractorApp = () => {
-
{/* Step 0 */} diff --git a/src/app/manager-tool/extract/korean-mission-b/KoreanMissionB.tsx b/src/app/manager-tool/extract/korean-mission-b/KoreanMissionB.tsx index adafc1f..e99ff1c 100644 --- a/src/app/manager-tool/extract/korean-mission-b/KoreanMissionB.tsx +++ b/src/app/manager-tool/extract/korean-mission-b/KoreanMissionB.tsx @@ -186,14 +186,14 @@ const WordExtractorApp = () => {
{/* Step 0 */} diff --git a/src/app/manager-tool/extract/korean-mission/KoreanMission.tsx b/src/app/manager-tool/extract/korean-mission/KoreanMission.tsx index 67eb5d6..352b004 100644 --- a/src/app/manager-tool/extract/korean-mission/KoreanMission.tsx +++ b/src/app/manager-tool/extract/korean-mission/KoreanMission.tsx @@ -323,14 +323,14 @@ const WordExtractorApp = () => {
{/* Step 0 */} diff --git a/src/app/manager-tool/extract/lenx/LenX.tsx b/src/app/manager-tool/extract/lenx/LenX.tsx index 85da5dc..422c153 100644 --- a/src/app/manager-tool/extract/lenx/LenX.tsx +++ b/src/app/manager-tool/extract/lenx/LenX.tsx @@ -109,14 +109,14 @@ const WordExtractorApp = () => {
{/* Step 0 */} diff --git a/src/app/manager-tool/extract/loop/Loop.tsx b/src/app/manager-tool/extract/loop/Loop.tsx index e52aba5..3cb35ea 100644 --- a/src/app/manager-tool/extract/loop/Loop.tsx +++ b/src/app/manager-tool/extract/loop/Loop.tsx @@ -134,14 +134,14 @@ const LoopWordExtractorApp = () => {
{/* Step 0 */} diff --git a/src/app/manager-tool/extract/merge/Merge.tsx b/src/app/manager-tool/extract/merge/Merge.tsx index 98c3022..3867078 100644 --- a/src/app/manager-tool/extract/merge/Merge.tsx +++ b/src/app/manager-tool/extract/merge/Merge.tsx @@ -324,14 +324,14 @@ const WordExtractorApp = () => {
{/* Step 0 */} diff --git a/src/app/manager-tool/extract/startx/StartX.tsx b/src/app/manager-tool/extract/startx/StartX.tsx index 92bc89c..da65b2d 100644 --- a/src/app/manager-tool/extract/startx/StartX.tsx +++ b/src/app/manager-tool/extract/startx/StartX.tsx @@ -110,14 +110,14 @@ const WordExtractorApp = () => {
{/* Step 0 */} diff --git a/src/app/terms/page.tsx b/src/app/terms/page.tsx index a7dc42c..7f9a94f 100644 --- a/src/app/terms/page.tsx +++ b/src/app/terms/page.tsx @@ -29,7 +29,7 @@ const TermsOfService = () => {
- 최종 수정일: 2025년 12월 20일 + 최종 수정일: 2026년 7월 22일
제1조 (목적) @@ -132,13 +132,100 @@ const TermsOfService = () => {

- 제8조 (콘텐츠 및 지적재산권) + 제8조 (콘텐츠, 데이터 및 지적재산권)

+
-

1. 서비스에 대한 저작권 및 지적재산권은 서비스 제공자에게 귀속됩니다.

-

2. 이용자가 서비스 내에 게시한 콘텐츠(단어, 데이터 등)에 대한 권리는 해당 이용자에게 있습니다.

-

3. 이용자는 자신이 게시한 콘텐츠에 대해 다른 이용자들이 서비스 내에서 이용할 수 있도록 동의합니다.

-

4. 이용자는 타인의 저작권, 상표권 등 지적재산권을 침해하는 콘텐츠를 게시해서는 안 됩니다.

+

+ 1. 서비스 및 서비스 제공자가 직접 제작한 소프트웨어, 화면 구성, + 디자인, 문서 등에 관한 저작권과 그 밖의 지적재산권은 서비스 + 제공자에게 귀속됩니다. 다만, 별도의 라이선스가 명시된 경우에는 + 해당 라이선스를 따릅니다. +

+ +

+ 2. 이용자가 서비스 내에 게시하거나 등록한 콘텐츠에 대한 권리는 + 해당 이용자 또는 정당한 권리자에게 귀속됩니다. +

+ +

+ 3. 이용자는 자신이 서비스 내에 게시하거나 등록한 콘텐츠를 서비스의 + 운영, 제공 및 다른 이용자의 서비스 내 이용을 위하여 필요한 범위에서 + 서비스 제공자가 이용하는 것에 동의합니다. +

+ +

+ 4. 서비스에서 제공하는 단어 목록, 단어 데이터베이스 및 이에 부수하는 + 데이터 중 서비스 제공자가 권리를 보유하거나 이용허락 권한을 가진 + 데이터(이하 "제공 데이터")는 별도의 표시가 없는 한{' '} + + 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 + 국제 라이선스(CC BY-NC-SA 4.0) + + 에 따라 이용할 수 있습니다. +

+ +

+ 5. 제공 데이터를 복제, 배포, 공개, 가공하거나 외부 프로젝트에서 + 이용하는 경우 이용자는 다음 조건을 모두 준수해야 합니다. +

+ +
    +
  • + • "끄코 유틸리티(Kkuko Utils)"를 출처로 명시하고 + 서비스로 연결되는 링크를 함께 표시할 것 +
  • +
  • + • CC BY-NC-SA 4.0 라이선스의 명칭과 해당 라이선스 안내 페이지의 + 링크를 표시할 것 +
  • +
  • + • 제공 데이터를 수정, 번역, 정리, 병합하거나 그 밖의 방법으로 + 변경한 경우 그 변경 사실을 표시할 것 +
  • +
  • • 제공 데이터를 영리 목적으로 이용하지 않을 것
  • +
  • + • 제공 데이터를 변경하거나 이를 기반으로 결과물을 제작하여 공개하는 + 경우 해당 결과물을 CC BY-NC-SA 4.0 또는 이와 호환되는 라이선스로 + 제공할 것 +
  • +
  • + • 라이선스가 허용하는 이용을 제한하는 추가적인 법적 조건이나 기술적 + 보호조치를 적용하지 않을 것 +
  • +
+ +

6. 다음 자료에는 위 라이선스가 적용되지 않습니다.

+ +
    +
  • • 이용자가 직접 게시하거나 등록한 콘텐츠
  • +
  • + • 제3자가 저작권, 데이터베이스제작자권리 또는 그 밖의 권리를 + 보유한 자료 +
  • +
  • • 별도의 출처 또는 이용조건이 표시된 자료
  • +
  • • 상표, 로고, 서비스 명칭 및 서비스의 소스코드
  • +
  • + • 관련 법령에 따라 권리가 서비스 제공자에게 귀속되지 않는 개별 + 단어 또는 사실정보 +
  • +
+ +

+ 7. 제3자의 자료를 이용하는 경우 이용자는 해당 자료에 표시된 출처와 + 이용조건을 별도로 확인하고 준수해야 합니다. +

+ +

+ 8. 이용자는 타인의 저작권, 상표권, 데이터베이스제작자권리 및 그 밖의 + 지적재산권을 침해하는 콘텐츠를 게시하거나 서비스를 통하여 이용해서는 + 안 됩니다. +

diff --git a/src/app/word/components/WordAddFrom.tsx b/src/app/word/components/WordAddFrom.tsx index f8febdd..99bd38b 100644 --- a/src/app/word/components/WordAddFrom.tsx +++ b/src/app/word/components/WordAddFrom.tsx @@ -19,27 +19,7 @@ import ErrorModal from "@/src/app/components/ErrModal"; import { fetcher } from "../lib"; import { PostgrestError } from "@supabase/supabase-js"; import HelpModal from "@/src/app/components/HelpModal"; -import { calculateKoreanInitials } from "@/src/app/lib/lib"; - -// Utility function for Korean search filtering -const filterKoreanText = (text: string, search: string) => { - if (search === "") return true; - let indexText = 0; - let indexSearch = 0; - - while (indexText < text.length && indexSearch < search.length) { - if ( - text[indexText] === search[indexSearch] || - (("ㄱ" <= search[indexSearch] && search[indexSearch] <= "ㅎ") && - calculateKoreanInitials(text[indexText]) === calculateKoreanInitials(search[indexSearch])) - ) { - indexSearch++; - } - indexText++; - } - - return indexSearch === search.length; -}; +import { calculateKoreanInitials, filterKoreanText } from "@/src/app/lib/lib"; type TopicItemProps = { label: string; diff --git a/src/app/word/search/components/ThemeSelectionModal.tsx b/src/app/word/search/components/ThemeSelectionModal.tsx index 4a3d67b..0913772 100644 --- a/src/app/word/search/components/ThemeSelectionModal.tsx +++ b/src/app/word/search/components/ThemeSelectionModal.tsx @@ -4,6 +4,7 @@ import { X, Loader2 } from 'lucide-react'; import { SCM } from '@/src/app/lib/supabaseClient'; import { Theme } from '../types'; import { disassemble } from 'es-hangul'; +import { filterKoreanText } from '@/src/app/lib/lib'; interface ThemeSelectionModalProps { isOpen: boolean; @@ -39,9 +40,7 @@ export default function ThemeSelectionModal({ const filtered = themeSearchQuery.trim() === '' ? themes : themes.filter(theme => - theme.name.toLowerCase().includes(themeSearchQuery.toLowerCase()) || - theme.code.toLowerCase().includes(themeSearchQuery.toLowerCase()) || - theme.name.split('').map(c => disassemble(c)[0]).join('').includes(cho) + filterKoreanText(theme.name, themeSearchQuery) || filterKoreanText(theme.name, cho) ); const groupA = filtered.filter(theme => /^\d+$/.test(theme.code)); diff --git a/src/app/word/search/components/WordSearchHelpModal.tsx b/src/app/word/search/components/WordSearchHelpModal.tsx index fab69ca..63aa55c 100644 --- a/src/app/word/search/components/WordSearchHelpModal.tsx +++ b/src/app/word/search/components/WordSearchHelpModal.tsx @@ -84,7 +84,7 @@ const WordSearchHelpModal = () => { 매너: 한방 단어를 표시 하지 않습니다.
  • - 젠틀: 후속단어 수가 5개 미만인 단어를 표시 하지 않습니다. + 젠틀: 후속단어 수가 10개 미만인 단어를 표시 하지 않습니다.
  • 에티켓: 노인정을 기준으로 한방 글자를 산정한 한방단어를 표시하지 않습니다.