@ihabdevteam/core 0.207.0 → 0.209.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +45 -0
- package/dist/components.cjs.js +174 -174
- package/dist/components.esm.css +1 -1
- package/dist/hooks.cjs.js +1 -1
- package/dist/i18n.cjs.js +1 -1
- package/dist/ihabdevteam-core.cjs.js +178 -178
- package/dist/ihabdevteam-core.d.ts +19 -13
- package/dist/packages/core/src/components/Word/WordSearchResultBlock.css +5 -6
- package/dist/packages/core/src/components/Word/WordSearchResultBlock.d.ts +1 -9
- package/dist/packages/core/src/components/Word/WordSearchResultBlock.js +13 -6
- package/dist/packages/core/src/components/Word/WordTableBlock.d.ts +1 -1
- package/dist/packages/core/src/components/Word/WordTableBlock.js +2 -2
- package/dist/packages/core/src/components/Word/wordTableBlockTypes.d.ts +16 -2
- package/dist/packages/core/src/version.d.ts +1 -1
- package/dist/packages/core/src/version.js +1 -1
- package/dist/utils.cjs.js +1 -1
- package/package.json +1 -1
|
@@ -1626,7 +1626,7 @@ export declare function copyText(text: string): Promise<boolean>;
|
|
|
1626
1626
|
*
|
|
1627
1627
|
* 값은 손으로 적고 `test/coreVersion.test.ts` 가 package.json 과 어긋나면 운다.
|
|
1628
1628
|
*/
|
|
1629
|
-
export declare const CORE_VERSION = "0.
|
|
1629
|
+
export declare const CORE_VERSION = "0.209.0";
|
|
1630
1630
|
|
|
1631
1631
|
/** @public */
|
|
1632
1632
|
declare const coreDefault: Record<string, unknown>;
|
|
@@ -10281,7 +10281,7 @@ export declare interface WordSearchFilterPanelProps {
|
|
|
10281
10281
|
}
|
|
10282
10282
|
|
|
10283
10283
|
/** @public */
|
|
10284
|
-
export declare function WordSearchResultBlock({ titleIcon, resultCount, resultUnit, searchQuery, items, groups, selected, onSelect, maxSelect, onClearSelection, onPrint, onPrintEmpty, className, emptyHint, sectionType, disc,
|
|
10284
|
+
export declare function WordSearchResultBlock({ titleIcon, resultCount, resultUnit, searchQuery, items, groups, selected, onSelect, maxSelect, onClearSelection, onPrint, onPrintEmpty, className, emptyHint, sectionType, disc, }: WordSearchResultBlockProps): JSX.Element;
|
|
10285
10285
|
|
|
10286
10286
|
/** @public */
|
|
10287
10287
|
export declare interface WordSearchResultBlockProps {
|
|
@@ -10308,14 +10308,6 @@ export declare interface WordSearchResultBlockProps {
|
|
|
10308
10308
|
sectionType?: 'page' | 'pagePopup' | 'popup';
|
|
10309
10309
|
/** 제목 아래 부제(설명). 지정 시 기본 disc(선택 안내)를 대체한다. */
|
|
10310
10310
|
disc?: ReactNode;
|
|
10311
|
-
/**
|
|
10312
|
-
* 기본 선택 안내 **아래에 덧붙는** 한 줄 — 지금 결과가 걸러지고 있다는 알림 등.
|
|
10313
|
-
*
|
|
10314
|
-
* `disc` 와 달리 기본 안내를 밀어내지 않는다. 밀어내면 '12개까지 선택할 수 있습니다
|
|
10315
|
-
* (n/12)' 가 사라지는데, 그것이 몇 칸을 썼는지 보이는 유일한 자리다 — 필터를 켠
|
|
10316
|
-
* 사람에게서 하필 그 숫자를 뺏게 된다.
|
|
10317
|
-
*/
|
|
10318
|
-
notice?: ReactNode;
|
|
10319
10311
|
/**
|
|
10320
10312
|
* 결과가 없을 때 "검색 결과가 없습니다." 아래에 덧붙일 한 줄.
|
|
10321
10313
|
*
|
|
@@ -10366,7 +10358,7 @@ export declare interface WordSearchResultWord {
|
|
|
10366
10358
|
*/
|
|
10367
10359
|
export declare function WordTable({ title, titleIcon, disc, className, orientation, contentTypes, cutLine, showOutline, showDivLine, items, editCells, count, activeCell, onActivateCell, onRemoveCell, onRemoveItem, onReorder, renderCellAction, showFillerAdd, contentRef, buttonSize, pageNumber, pageNumberPosition, fitHeight, scoring, marks, onMarkClick, scoreIndexOffset, }: WordTableProps): JSX.Element;
|
|
10368
10360
|
|
|
10369
|
-
export declare function WordTableBlock({ title, titleIcon, disc, filterTitle, filterCollapsible, filterDefaultCollapsed, filterHeaderSummary, 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, initialItemsPerPage, renderCellAction, actionsLeftExtra }: WordTableBlockProps): JSX.Element;
|
|
10361
|
+
export declare function WordTableBlock({ title, titleIcon, disc, filterTitle, filterCollapsible, filterDefaultCollapsed, filterCollapsed, onFilterCollapsedChange, filterHeaderSummary, 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, initialItemsPerPage, renderCellAction, actionsLeftExtra }: WordTableBlockProps): JSX.Element;
|
|
10370
10362
|
|
|
10371
10363
|
/** @public */
|
|
10372
10364
|
export declare interface WordTableBlockProps {
|
|
@@ -10380,9 +10372,23 @@ export declare interface WordTableBlockProps {
|
|
|
10380
10372
|
filterTitle?: ReactNode;
|
|
10381
10373
|
/** 안쪽 표 설정 판을 접을 수 있게 한다 — 머리 줄 전체가 손잡이다. */
|
|
10382
10374
|
filterCollapsible?: boolean;
|
|
10383
|
-
/** 그 판을 처음에 접힌 채로 연다(`filterCollapsible` 과 함께).
|
|
10375
|
+
/** 그 판을 처음에 접힌 채로 연다(`filterCollapsible` 과 함께). 들어설 때 한 번만 읽는다 —
|
|
10376
|
+
* 접힘을 **이어서 쥐려면** 아래 둘을 쓴다. */
|
|
10384
10377
|
filterDefaultCollapsed?: boolean;
|
|
10385
|
-
/**
|
|
10378
|
+
/**
|
|
10379
|
+
* 그 판의 접힘을 **부르는 쪽이 쥔다**(controlled). 주면 이 값이 판의 상태고,
|
|
10380
|
+
* `onFilterCollapsedChange` 로 바뀜을 듣는다. 둘 다 안쪽 `FilterPanel` 의 같은 이름으로
|
|
10381
|
+
* 그대로 간다.
|
|
10382
|
+
*
|
|
10383
|
+
* 접은 것을 기억하려면 이 짝이 있어야 한다 — `filterDefaultCollapsed` 는 들어설 때 한 번
|
|
10384
|
+
* 읽고 끝이라 **처음 값은 세워도 다음에 적을 것이 없다.** 말귀가 다른 판들은
|
|
10385
|
+
* `collapsed`/`onCollapsedChange` 로 `localStorage` 에 적고 있었는데 표 설정 판만
|
|
10386
|
+
* 못 했고, 그래서 그 판만 새로고침하면 도로 펴졌다(말귀 요청 ㉙, 2026-09-29).
|
|
10387
|
+
*/
|
|
10388
|
+
filterCollapsed?: boolean;
|
|
10389
|
+
/** 그 판의 접힘이 바뀔 때 — `filterCollapsed` 와 짝이다. */
|
|
10390
|
+
onFilterCollapsedChange?: (collapsed: boolean) => void;
|
|
10391
|
+
/** 그 판이 접혀도 머리 오른쪽에 남는 자리 — 요약. 안 주면 코어가 짓는다(`FilterPanel`). */
|
|
10386
10392
|
filterHeaderSummary?: ReactNode;
|
|
10387
10393
|
disc?: ReactNode;
|
|
10388
10394
|
/** 현재 표의 저장된 이름(불러온 표 등). 있으면 인쇄/PDF 저장 시 파일명으로 사용, 없으면 "오늘 날짜 + 단어표/대립쌍표" */
|
|
@@ -33,7 +33,11 @@
|
|
|
33
33
|
display: flex;
|
|
34
34
|
align-items: center;
|
|
35
35
|
flex-wrap: wrap;
|
|
36
|
-
|
|
36
|
+
/* 가로로만 띄운다 — 아래 줄(안내·알림)과의 세로 틈은 **제목의 줄높이가 이미 낸다.**
|
|
37
|
+
거기에 8px 을 더 얹으니 제목 아래가 13px 로 벌어져 넓어 보였다(사용자 지시 2026-09-29).
|
|
38
|
+
제목이 h3 가 되며(㉘) 줄높이가 26 → 30px 로 늘어 그만큼 더 떴다. */
|
|
39
|
+
column-gap: var(--spacing-xs);
|
|
40
|
+
row-gap: 0;
|
|
37
41
|
}
|
|
38
42
|
.word-search-result-block__head-main {
|
|
39
43
|
display: flex;
|
|
@@ -161,9 +165,4 @@
|
|
|
161
165
|
|
|
162
166
|
/* 부제가 두 줄이 될 때 — 알림(걸러지고 있다) 위, 선택 안내 아래로 쌓는다.
|
|
163
167
|
Section 의 disc 는 한 줄을 전제하므로 여기서 블록으로 만든다. */
|
|
164
|
-
.word-search-result-block__notice,
|
|
165
|
-
.word-search-result-block__disc { display: block; }
|
|
166
168
|
|
|
167
|
-
/* 알림은 왜 결과가 적은지 말하는 줄이라 먼저 읽히게 색을 준다.
|
|
168
|
-
--color-gray 는 부제 기본색이고, 알림만 본문색으로 올린다. */
|
|
169
|
-
.word-search-result-block__notice { color: var(--color-text-primary); }
|
|
@@ -32,14 +32,6 @@ export interface WordSearchResultBlockProps {
|
|
|
32
32
|
sectionType?: 'page' | 'pagePopup' | 'popup';
|
|
33
33
|
/** 제목 아래 부제(설명). 지정 시 기본 disc(선택 안내)를 대체한다. */
|
|
34
34
|
disc?: ReactNode;
|
|
35
|
-
/**
|
|
36
|
-
* 기본 선택 안내 **아래에 덧붙는** 한 줄 — 지금 결과가 걸러지고 있다는 알림 등.
|
|
37
|
-
*
|
|
38
|
-
* `disc` 와 달리 기본 안내를 밀어내지 않는다. 밀어내면 '12개까지 선택할 수 있습니다
|
|
39
|
-
* (n/12)' 가 사라지는데, 그것이 몇 칸을 썼는지 보이는 유일한 자리다 — 필터를 켠
|
|
40
|
-
* 사람에게서 하필 그 숫자를 뺏게 된다.
|
|
41
|
-
*/
|
|
42
|
-
notice?: ReactNode;
|
|
43
35
|
/**
|
|
44
36
|
* 결과가 없을 때 "검색 결과가 없습니다." 아래에 덧붙일 한 줄.
|
|
45
37
|
*
|
|
@@ -50,4 +42,4 @@ export interface WordSearchResultBlockProps {
|
|
|
50
42
|
emptyHint?: ReactNode;
|
|
51
43
|
}
|
|
52
44
|
/** @public */
|
|
53
|
-
export default function WordSearchResultBlock({ titleIcon, resultCount, resultUnit, searchQuery, items, groups, selected, onSelect, maxSelect, onClearSelection, onPrint, onPrintEmpty, className, emptyHint, sectionType, disc,
|
|
45
|
+
export default function WordSearchResultBlock({ titleIcon, resultCount, resultUnit, searchQuery, items, groups, selected, onSelect, maxSelect, onClearSelection, onPrint, onPrintEmpty, className, emptyHint, sectionType, disc, }: WordSearchResultBlockProps): import("react").JSX.Element;
|
|
@@ -16,7 +16,7 @@ import { makeWordQueryMatcher } from '../../utils/koreanSyllable';
|
|
|
16
16
|
const 가나다 = new Intl.Collator('ko');
|
|
17
17
|
import { withIga, withEulReul } from '../../utils/josa';
|
|
18
18
|
/** @public */
|
|
19
|
-
export default function WordSearchResultBlock({ titleIcon, resultCount, resultUnit, searchQuery, items, groups, selected = [], onSelect, maxSelect, onClearSelection, onPrint, onPrintEmpty, className, emptyHint, sectionType = 'page', disc,
|
|
19
|
+
export default function WordSearchResultBlock({ titleIcon, resultCount, resultUnit, searchQuery, items, groups, selected = [], onSelect, maxSelect, onClearSelection, onPrint, onPrintEmpty, className, emptyHint, sectionType = 'page', disc, }) {
|
|
20
20
|
const { t, i18n } = useTranslation();
|
|
21
21
|
// 한국어에서만 조사(이/가·을/를)를 unit 말미에 붙인다 — 문구에는 조사를 고정하지 않는다.
|
|
22
22
|
const ko = i18n.language?.startsWith('ko') ?? false;
|
|
@@ -154,11 +154,18 @@ export default function WordSearchResultBlock({ titleIcon, resultCount, resultUn
|
|
|
154
154
|
const discLabel = resultCount !== undefined && resultCount > 0 && maxSelect !== undefined && resultUnit
|
|
155
155
|
? t('wordSearch.resultDisc', { unit: ko ? withEulReul(resultUnit) : resultUnit, max: maxSelect, selected: selected.length })
|
|
156
156
|
: undefined;
|
|
157
|
-
/*
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
157
|
+
/* 부제 자리는 **하나**다 — `disc` 를 주면 기본 안내를 대신하고, 안 주면 기본 안내가
|
|
158
|
+
선다. 둘 다 없으면 undefined 라 부제 자체가 안 그려진다.
|
|
159
|
+
|
|
160
|
+
한때 `notice` 로 이 위에 한 줄을 더 얹을 수 있었으나 머리가 세 줄이 되어 무엇을
|
|
161
|
+
먼저 읽을지 안 보여 걷었다(사용자 지시 2026-09-29).
|
|
162
|
+
|
|
163
|
+
**걸러지고 있다는 말을 `disc` 로 옮기지 마라.** `disc` 는 기본 안내를 갈아 끼우므로
|
|
164
|
+
`12개까지 선택할 수 있습니다 (n/12)` 가 사라진다 — 몇 칸을 썼는지 보이는 유일한
|
|
165
|
+
자리다. 2026-08-28 에 정확히 그 일이 있었고 `notice` 가 그 때문에 생겼다. 지금은
|
|
166
|
+
그 알림을 **안 보이는 쪽**을 골랐다(위 지시). 다시 필요해지면 `disc` 가 아니라
|
|
167
|
+
안내 줄 곁에 설 자리를 새로 내야 한다. */
|
|
168
|
+
const discNode = disc ?? discLabel;
|
|
162
169
|
return (
|
|
163
170
|
/* 제목·부제·조작부가 **상자 안** 에 선다(사용자 지시 2026-09-29) — 전에는 `Section` 의 머리가
|
|
164
171
|
상자 밖에 서서 제목이 테두리 위에 뜨고 좌우 여백도 옆의 `FilterPanel` 과 달라 보였다.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import './WordTableBlock.css';
|
|
2
2
|
import type { WordTableBlockProps } from './wordTableBlockTypes';
|
|
3
3
|
export type { WordEntry, WordTableBlockProps } from './wordTableBlockTypes';
|
|
4
|
-
export default function WordTableBlock({ title, titleIcon, disc, filterTitle, filterCollapsible, filterDefaultCollapsed, filterHeaderSummary, 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, initialItemsPerPage, renderCellAction, actionsLeftExtra }: WordTableBlockProps): import("react").JSX.Element;
|
|
4
|
+
export default function WordTableBlock({ title, titleIcon, disc, filterTitle, filterCollapsible, filterDefaultCollapsed, filterCollapsed, onFilterCollapsedChange, filterHeaderSummary, 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, initialItemsPerPage, renderCellAction, actionsLeftExtra }: WordTableBlockProps): import("react").JSX.Element;
|
|
@@ -45,7 +45,7 @@ function 겹치지않는id(list) {
|
|
|
45
45
|
return id === it.id ? it : { ...it, id };
|
|
46
46
|
});
|
|
47
47
|
}
|
|
48
|
-
export default function WordTableBlock({ title, titleIcon, disc, filterTitle, filterCollapsible, filterDefaultCollapsed, filterHeaderSummary, 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, initialItemsPerPage, renderCellAction, actionsLeftExtra }) {
|
|
48
|
+
export default function WordTableBlock({ title, titleIcon, disc, filterTitle, filterCollapsible, filterDefaultCollapsed, filterCollapsed, onFilterCollapsedChange, filterHeaderSummary, 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, initialItemsPerPage, renderCellAction, actionsLeftExtra }) {
|
|
49
49
|
const { t } = useTranslation();
|
|
50
50
|
const resolvedResetLabel = resetLabel ?? t('wordPrint.clearAllSelection', '모두 선택 해제');
|
|
51
51
|
const isEditable = items === undefined;
|
|
@@ -318,7 +318,7 @@ export default function WordTableBlock({ title, titleIcon, disc, filterTitle, fi
|
|
|
318
318
|
setActiveCell(null);
|
|
319
319
|
},
|
|
320
320
|
onClose: handleCloseWordSearch,
|
|
321
|
-
}), !hideControls && (_jsx(TableFilterPanel, { title: filterTitle, collapsible: filterCollapsible, defaultCollapsed: filterDefaultCollapsed, headerSummary: filterHeaderSummary, 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,
|
|
321
|
+
}), !hideControls && (_jsx(TableFilterPanel, { title: filterTitle, collapsible: filterCollapsible, defaultCollapsed: filterDefaultCollapsed, collapsed: filterCollapsed, onCollapsedChange: onFilterCollapsedChange, headerSummary: filterHeaderSummary, 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,
|
|
322
322
|
/* 쪽이 나뉘면 끌어 옮기기가 통째로 꺼졌다(말귀 단어 찾기: 9개부터). 쪽 안의 자리를 전체 자리로 옮겨 넘긴다 —
|
|
323
323
|
쪽을 넘는 이동은 하지 않는다. */
|
|
324
324
|
onReorder: onReorder && ((from, to) => onReorder(from + i * itemsPerPage, to + i * itemsPerPage)),
|
|
@@ -26,9 +26,23 @@ export interface WordTableBlockProps {
|
|
|
26
26
|
filterTitle?: ReactNode;
|
|
27
27
|
/** 안쪽 표 설정 판을 접을 수 있게 한다 — 머리 줄 전체가 손잡이다. */
|
|
28
28
|
filterCollapsible?: boolean;
|
|
29
|
-
/** 그 판을 처음에 접힌 채로 연다(`filterCollapsible` 과 함께).
|
|
29
|
+
/** 그 판을 처음에 접힌 채로 연다(`filterCollapsible` 과 함께). 들어설 때 한 번만 읽는다 —
|
|
30
|
+
* 접힘을 **이어서 쥐려면** 아래 둘을 쓴다. */
|
|
30
31
|
filterDefaultCollapsed?: boolean;
|
|
31
|
-
/**
|
|
32
|
+
/**
|
|
33
|
+
* 그 판의 접힘을 **부르는 쪽이 쥔다**(controlled). 주면 이 값이 판의 상태고,
|
|
34
|
+
* `onFilterCollapsedChange` 로 바뀜을 듣는다. 둘 다 안쪽 `FilterPanel` 의 같은 이름으로
|
|
35
|
+
* 그대로 간다.
|
|
36
|
+
*
|
|
37
|
+
* 접은 것을 기억하려면 이 짝이 있어야 한다 — `filterDefaultCollapsed` 는 들어설 때 한 번
|
|
38
|
+
* 읽고 끝이라 **처음 값은 세워도 다음에 적을 것이 없다.** 말귀가 다른 판들은
|
|
39
|
+
* `collapsed`/`onCollapsedChange` 로 `localStorage` 에 적고 있었는데 표 설정 판만
|
|
40
|
+
* 못 했고, 그래서 그 판만 새로고침하면 도로 펴졌다(말귀 요청 ㉙, 2026-09-29).
|
|
41
|
+
*/
|
|
42
|
+
filterCollapsed?: boolean;
|
|
43
|
+
/** 그 판의 접힘이 바뀔 때 — `filterCollapsed` 와 짝이다. */
|
|
44
|
+
onFilterCollapsedChange?: (collapsed: boolean) => void;
|
|
45
|
+
/** 그 판이 접혀도 머리 오른쪽에 남는 자리 — 요약. 안 주면 코어가 짓는다(`FilterPanel`). */
|
|
32
46
|
filterHeaderSummary?: ReactNode;
|
|
33
47
|
disc?: ReactNode;
|
|
34
48
|
/** 현재 표의 저장된 이름(불러온 표 등). 있으면 인쇄/PDF 저장 시 파일명으로 사용, 없으면 "오늘 날짜 + 단어표/대립쌍표" */
|