@ihabdevteam/core 0.212.0 → 0.214.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 +101 -0
- package/dist/components.cjs.js +186 -186
- package/dist/components.esm.css +2 -2
- package/dist/hooks.cjs.js +3 -3
- package/dist/i18n.cjs.js +3 -3
- package/dist/ihabdevteam-core.cjs.js +184 -184
- package/dist/ihabdevteam-core.d.ts +69 -3
- package/dist/packages/core/src/components/Word/TableFilterPanel.d.ts +4 -0
- package/dist/packages/core/src/components/Word/TableFilterPanel.js +5 -3
- package/dist/packages/core/src/components/Word/WordTableBlock.js +2 -2
- package/dist/packages/core/src/components/Word/useWordTableDisplaySettings.d.ts +10 -1
- package/dist/packages/core/src/components/Word/useWordTableDisplaySettings.js +18 -7
- package/dist/packages/core/src/components/Word/wordTablePrint.js +7 -0
- package/dist/packages/core/src/components/Word/wordTableSettings.d.ts +8 -0
- package/dist/packages/core/src/components/Word/wordTableSettings.js +33 -0
- package/dist/packages/core/src/components/WordTable.css +164 -0
- package/dist/packages/core/src/components/WordTable.d.ts +52 -1
- package/dist/packages/core/src/components/WordTable.js +43 -4
- package/dist/packages/core/src/i18n/locales/en.json +2 -0
- package/dist/packages/core/src/i18n/locales/ko.json +2 -0
- package/dist/packages/core/src/version.d.ts +1 -1
- package/dist/packages/core/src/version.js +1 -1
- package/dist/utils.cjs.js +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.214.0";
|
|
1630
1630
|
|
|
1631
1631
|
/** @public */
|
|
1632
1632
|
declare const coreDefault: Record<string, unknown>;
|
|
@@ -7332,6 +7332,10 @@ declare interface TableFilterPanelSmartProps extends TableFilterPanelBaseProps {
|
|
|
7332
7332
|
showCutLine?: boolean;
|
|
7333
7333
|
/** 구분선 섹션 노출 여부 — 대립쌍표 등 짝이 있는 표에서만(호출부가 판단). */
|
|
7334
7334
|
showDivLine2?: boolean;
|
|
7335
|
+
/** 상단·하단 정보(종이 머리·바닥 띠) 절을 세운다 — 띠를 쓰는 화면에서만(호출부가 판단). */
|
|
7336
|
+
showPaperBands?: boolean;
|
|
7337
|
+
showTopInfo?: boolean;
|
|
7338
|
+
showBottomInfo?: boolean;
|
|
7335
7339
|
/** 용지 방향과 외곽선 사이에 끼워 넣을 추가 섹션 — 칸 수/페이지당 개수/페이지 번호 등, 호출부 전용이라 직접 구성해 넘긴다. */
|
|
7336
7340
|
middleSections?: FilterPanelSection[];
|
|
7337
7341
|
/** middleSections의 현재 선택값. */
|
|
@@ -7458,6 +7462,8 @@ declare interface TableSettingsSetters {
|
|
|
7458
7462
|
setShowOutline: (v: boolean) => void;
|
|
7459
7463
|
setCutLine: (v: WordTableCutLine) => void;
|
|
7460
7464
|
setShowDivLine: (v: boolean) => void;
|
|
7465
|
+
setShowTopInfo?: (v: boolean) => void;
|
|
7466
|
+
setShowBottomInfo?: (v: boolean) => void;
|
|
7461
7467
|
}
|
|
7462
7468
|
|
|
7463
7469
|
/** `useTableSort` 의 선택 인자. @public */
|
|
@@ -9747,7 +9753,12 @@ export declare function useWordMeanings(rows: {
|
|
|
9747
9753
|
* WordTablePopup 등 표를 미리 보여주고 인쇄하는 곳에서 쓴다.
|
|
9748
9754
|
* @public
|
|
9749
9755
|
*/
|
|
9750
|
-
export declare function useWordTableDisplaySettings(items: WordSearchResultItem[]
|
|
9756
|
+
export declare function useWordTableDisplaySettings(items: WordSearchResultItem[],
|
|
9757
|
+
/** 종이 머리·바닥 띠를 쓰는 화면이면 참 — '상단 정보'·'하단 정보' 절이 함께 선다.
|
|
9758
|
+
* 안 쓰는 화면에 켜고 끌 것이 없는 절이 서면 안 되므로 기본은 거짓이다. */
|
|
9759
|
+
opts?: {
|
|
9760
|
+
paperBands?: boolean;
|
|
9761
|
+
}): UseWordTableDisplaySettingsResult;
|
|
9751
9762
|
|
|
9752
9763
|
/** @public */
|
|
9753
9764
|
export declare interface UseWordTableDisplaySettingsResult {
|
|
@@ -10360,7 +10371,7 @@ export declare interface WordSearchResultWord {
|
|
|
10360
10371
|
* 표시(items)·편집(editCells) 두 모드를 지원한다.
|
|
10361
10372
|
* @public
|
|
10362
10373
|
*/
|
|
10363
|
-
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;
|
|
10374
|
+
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, brand, code, pageNumber, pageNumberPosition, fitHeight, scoring, marks, onMarkClick, scoreIndexOffset, }: WordTableProps): JSX.Element;
|
|
10364
10375
|
|
|
10365
10376
|
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;
|
|
10366
10377
|
|
|
@@ -10585,6 +10596,10 @@ export declare interface WordTableDisplaySettings {
|
|
|
10585
10596
|
contentTypes: WordTableContentType[];
|
|
10586
10597
|
cutLine: WordTableCutLine;
|
|
10587
10598
|
showOutline: boolean;
|
|
10599
|
+
/** 종이 머리 띠(로고·표 번호)를 찍나 */
|
|
10600
|
+
showTopInfo: boolean;
|
|
10601
|
+
/** 종이 바닥 띠(만든 곳·주소·쪽 번호)를 찍나 */
|
|
10602
|
+
showBottomInfo: boolean;
|
|
10588
10603
|
showDivLine: boolean;
|
|
10589
10604
|
/** 표 칸 수(= 페이지당 개수, 최소 1). */
|
|
10590
10605
|
count: number;
|
|
@@ -10741,6 +10756,57 @@ export declare interface WordTableProps {
|
|
|
10741
10756
|
* 쪽의 시작 번호를 받아 표 전체에서 유일한 번호로 만든다.
|
|
10742
10757
|
*/
|
|
10743
10758
|
scoreIndexOffset?: number;
|
|
10759
|
+
/**
|
|
10760
|
+
* **종이 위·아래에 띠를 두르고** 로고·표 번호·주소·쪽 번호를 담는다(사용자 지시 2026-09-30).
|
|
10761
|
+
*
|
|
10762
|
+
* 자리는 넷이다 — 위 왼쪽 말귀 로고 · 위 오른쪽 `code` · 아래 왼쪽 ihab 로고와 저작권 ·
|
|
10763
|
+
* 아래 오른쪽 주소와 쪽 번호.
|
|
10764
|
+
*
|
|
10765
|
+
* **안 주면 종이가 한 픽셀도 안 바뀐다.** 띠는 격자 위아래를 비워 만드는 것이라(쪽 번호가
|
|
10766
|
+
* 쓰던 방식과 같다) 칸이 그만큼 낮아진다 — 안 쓰는 표까지 낮아지면 안 된다.
|
|
10767
|
+
*
|
|
10768
|
+
* 띠는 **격자 안**에 있다(자리만 절대 배치로 잡는다). 인쇄는 격자 하나만 복사해 가므로
|
|
10769
|
+
* (`contentRef` → `printWordTableElements`) 격자 밖에 두면 **종이에는 안 찍힌다** —
|
|
10770
|
+
* 화면에서는 멀쩡해 보이고 종이에서만 사라지는 꼴이라 눈치채기 어렵다.
|
|
10771
|
+
*/
|
|
10772
|
+
brand?: {
|
|
10773
|
+
/** 로고와 저작권을 세운다. 나머지 자리는 각자 값이 있을 때만 선다. */
|
|
10774
|
+
show?: boolean;
|
|
10775
|
+
/** 위 띠만 끈다(`show` 가 켜져 있을 때). 표 설정의 '상단 정보' 가 이것을 움직인다. */
|
|
10776
|
+
top?: boolean;
|
|
10777
|
+
/** 아래 띠만 끈다(`show` 가 켜져 있을 때). 표 설정의 '하단 정보' 가 이것을 움직인다. */
|
|
10778
|
+
bottom?: boolean;
|
|
10779
|
+
/**
|
|
10780
|
+
* 아래 오른쪽 — **이 표로 가는 주소**. 회사 홈 주소가 아니라 그 표의 공유 링크다
|
|
10781
|
+
* (사용자 지시 2026-09-30). 종이를 든 사람이 이 주소로 같은 표를 화면에서 연다.
|
|
10782
|
+
*
|
|
10783
|
+
* **`code` 와는 다른 것이다.** 표 번호는 기관 안에서 매긴 번호고 이 주소는 따로 난
|
|
10784
|
+
* 공유 링크다 — 번호에서 주소를 만들어 내지 않는다. 둘 다 이 표를 가리키지만 나오는
|
|
10785
|
+
* 데가 다르므로 각각 받는다.
|
|
10786
|
+
*
|
|
10787
|
+
* 종이라 누를 수 없으니 글자 그대로 찍는다 — 그래서 **사람이 옮겨 칠 수 있는 길이**
|
|
10788
|
+
* 여야 한다. 긴 주소를 그대로 주면 넘쳐 …로 잘리고, 잘린 주소는 옮겨 칠 수 없다.
|
|
10789
|
+
* 짧은 주소를 쓰거나, 표 번호로 찾는 길을 함께 두는 편이 낫다.
|
|
10790
|
+
*/
|
|
10791
|
+
link?: string;
|
|
10792
|
+
/** 저작권 글월 — 안 주면 `© IHAB, Inc. All rights reserved.` */
|
|
10793
|
+
copyright?: string;
|
|
10794
|
+
/** 위 오른쪽 맨 앞 — **이 표의 이름**. `표 제목 · 기관 이름 · 표 번호` 로 선다. */
|
|
10795
|
+
title?: string;
|
|
10796
|
+
/**
|
|
10797
|
+
* 위 오른쪽 — **표 번호 앞에 붙는 기관 이름**(말귀매니저). 번호는 그 기관 안에서만
|
|
10798
|
+
* 고유하므로 이름과 함께여야 어느 곳의 몇 번인지가 정해진다(사용자 지시 2026-09-30).
|
|
10799
|
+
* `이름 · 번호` 로 선다. 이름이 길면 이름만 줄고 번호는 안 줄인다 — 번호가 잘리면
|
|
10800
|
+
* 확인 글자가 사라져 뜻이 없다.
|
|
10801
|
+
*/
|
|
10802
|
+
owner?: string;
|
|
10803
|
+
};
|
|
10804
|
+
/**
|
|
10805
|
+
* **짧은 식별 글** — 표 번호(`1043-E`). `brand` 를 줬을 때 위 오른쪽에 선다.
|
|
10806
|
+
* 종이에 찍힌 번호로 나중에 그 표를 찾는다(`WordTableButton` 의 같은 이름 프롭과 짝이다).
|
|
10807
|
+
* 종이 글씨는 전부 한 글꼴이라 여기서는 고정폭을 안 쓴다 — 목록 카드 쪽은 고정폭이다.
|
|
10808
|
+
*/
|
|
10809
|
+
code?: string;
|
|
10744
10810
|
/** 페이지 분할 시 현재/전체 페이지 — 지정하면 종이 안에 페이지 번호를 찍는다 */
|
|
10745
10811
|
pageNumber?: {
|
|
10746
10812
|
current: number;
|
|
@@ -45,6 +45,10 @@ export interface TableFilterPanelSmartProps extends TableFilterPanelBaseProps {
|
|
|
45
45
|
showCutLine?: boolean;
|
|
46
46
|
/** 구분선 섹션 노출 여부 — 대립쌍표 등 짝이 있는 표에서만(호출부가 판단). */
|
|
47
47
|
showDivLine2?: boolean;
|
|
48
|
+
/** 상단·하단 정보(종이 머리·바닥 띠) 절을 세운다 — 띠를 쓰는 화면에서만(호출부가 판단). */
|
|
49
|
+
showPaperBands?: boolean;
|
|
50
|
+
showTopInfo?: boolean;
|
|
51
|
+
showBottomInfo?: boolean;
|
|
48
52
|
/** 용지 방향과 외곽선 사이에 끼워 넣을 추가 섹션 — 칸 수/페이지당 개수/페이지 번호 등, 호출부 전용이라 직접 구성해 넘긴다. */
|
|
49
53
|
middleSections?: FilterPanelSection[];
|
|
50
54
|
/** middleSections의 현재 선택값. */
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
3
|
import { useTranslation } from 'react-i18next';
|
|
4
4
|
import FilterPanel from '../FilterPanel';
|
|
5
|
-
import { buildCompositionSection, buildOrientationSection, buildBorderSection, buildCutLineSection, buildDivLineSection, buildTableSettingsSelected, applyTableSettingsSelect, } from './wordTableSettings';
|
|
5
|
+
import { buildCompositionSection, buildOrientationSection, buildBorderSection, buildCutLineSection, buildDivLineSection, buildTopInfoSection, buildBottomInfoSection, buildTableSettingsSelected, applyTableSettingsSelect, } from './wordTableSettings';
|
|
6
6
|
function isShellProps(props) {
|
|
7
7
|
return 'sections' in props;
|
|
8
8
|
}
|
|
@@ -22,7 +22,7 @@ export default function TableFilterPanel(props) {
|
|
|
22
22
|
if (isShellProps(props)) {
|
|
23
23
|
return (_jsx(FilterPanel, { className: className, title: title ?? t('wordTable.filterTitle', '표 설정'), sections: props.sections, selected: props.selected, onSelect: props.onSelect, ...접기, align: "inline" }));
|
|
24
24
|
}
|
|
25
|
-
const { hasImage, hasColloquial, contentTypes, orientation, showOutline, cutLine, showDivLine, setters, showCutLine = false, showDivLine2 = false, middleSections = [], extraSelected = {}, onExtraSelect, } = props;
|
|
25
|
+
const { hasImage, hasColloquial, contentTypes, orientation, showOutline, cutLine, showDivLine, setters, showCutLine = false, showDivLine2 = false, middleSections = [], extraSelected = {}, onExtraSelect, showPaperBands = false, showTopInfo = true, showBottomInfo = true, } = props;
|
|
26
26
|
const sections = [
|
|
27
27
|
buildCompositionSection(t, { hasImage, hasColloquial }),
|
|
28
28
|
buildOrientationSection(t),
|
|
@@ -30,9 +30,11 @@ export default function TableFilterPanel(props) {
|
|
|
30
30
|
buildBorderSection(t),
|
|
31
31
|
...(showCutLine ? [buildCutLineSection(t)] : []),
|
|
32
32
|
...(showDivLine2 ? [buildDivLineSection(t)] : []),
|
|
33
|
+
/* 띠를 쓰는 화면에서만 — 안 쓰는 표에 켜고 끌 것이 없는 절이 서면 안 된다 */
|
|
34
|
+
...(showPaperBands ? [buildTopInfoSection(t), buildBottomInfoSection(t)] : []),
|
|
33
35
|
];
|
|
34
36
|
const selected = {
|
|
35
|
-
...buildTableSettingsSelected(t, { contentTypes, orientation, showOutline, cutLine, showDivLine }),
|
|
37
|
+
...buildTableSettingsSelected(t, { contentTypes, orientation, showOutline, cutLine, showDivLine, showTopInfo, showBottomInfo }),
|
|
36
38
|
...extraSelected,
|
|
37
39
|
};
|
|
38
40
|
const onSelect = (value, sectionLabel) => {
|
|
@@ -12,7 +12,7 @@ import Popup from '../Popup/Popup';
|
|
|
12
12
|
import WordTable, { WORD_TABLE_PAPER } from '../WordTable';
|
|
13
13
|
import { chunkItems } from '../wordTableLayout';
|
|
14
14
|
import TableFilterPanel from './TableFilterPanel';
|
|
15
|
-
import { buildItemsPerPageSection,
|
|
15
|
+
import { buildItemsPerPageSection, PAGE_NUM_POSITION_VALUE, parsePageNumberPosition, itemsPerPageFromChoice } from './wordTableSettings';
|
|
16
16
|
import Toast from '../Toast';
|
|
17
17
|
import { useToastState } from '../../hooks/useToastState';
|
|
18
18
|
import { getImageResolver, checkImageExists } from '../../utils/imageConfig';
|
|
@@ -196,7 +196,7 @@ export default function WordTableBlock({ title, titleIcon, disc, filterTitle, fi
|
|
|
196
196
|
...((isEditable || showCellCount) ? [{ label: t('wordTable.filter.columns', '칸 수'), items: CELL_COUNTS.map(n => ({ value: `${n}칸`, displayLabel: t('wordTable.filter.column', { count: n }) })), display: 'segmented' }] : []),
|
|
197
197
|
// 내용이 있는(1개 이상) 표면 '페이지당 대립쌍/단어 수'를 항상 노출한다(표시 모드 한정).
|
|
198
198
|
...(pagesEnabled && (items?.length ?? 0) > 0 ? [buildItemsPerPageSection(t, { hasPairs, itemCount })] : []),
|
|
199
|
-
|
|
199
|
+
/* '페이지 번호' 자리 고르개는 걷었다 — 쪽 번호는 바닥 띠가 자리를 쥔다(사용자 지시 2026-09-30) */
|
|
200
200
|
], [t, isEditable, showCellCount, pagesEnabled, items?.length, hasPairs, itemCount, isPaginated]);
|
|
201
201
|
const middleSelected = {
|
|
202
202
|
...((isEditable || showCellCount) ? { [t('wordTable.filter.columns', '칸 수')]: `${count}칸` } : {}),
|
|
@@ -7,6 +7,10 @@ export interface WordTableDisplaySettings {
|
|
|
7
7
|
contentTypes: WordTableContentType[];
|
|
8
8
|
cutLine: WordTableCutLine;
|
|
9
9
|
showOutline: boolean;
|
|
10
|
+
/** 종이 머리 띠(로고·표 번호)를 찍나 */
|
|
11
|
+
showTopInfo: boolean;
|
|
12
|
+
/** 종이 바닥 띠(만든 곳·주소·쪽 번호)를 찍나 */
|
|
13
|
+
showBottomInfo: boolean;
|
|
10
14
|
showDivLine: boolean;
|
|
11
15
|
/** 표 칸 수(= 페이지당 개수, 최소 1). */
|
|
12
16
|
count: number;
|
|
@@ -32,4 +36,9 @@ export interface UseWordTableDisplaySettingsResult {
|
|
|
32
36
|
* WordTablePopup 등 표를 미리 보여주고 인쇄하는 곳에서 쓴다.
|
|
33
37
|
* @public
|
|
34
38
|
*/
|
|
35
|
-
export declare function useWordTableDisplaySettings(items: WordSearchResultItem[]
|
|
39
|
+
export declare function useWordTableDisplaySettings(items: WordSearchResultItem[],
|
|
40
|
+
/** 종이 머리·바닥 띠를 쓰는 화면이면 참 — '상단 정보'·'하단 정보' 절이 함께 선다.
|
|
41
|
+
* 안 쓰는 화면에 켜고 끌 것이 없는 절이 서면 안 되므로 기본은 거짓이다. */
|
|
42
|
+
opts?: {
|
|
43
|
+
paperBands?: boolean;
|
|
44
|
+
}): UseWordTableDisplaySettingsResult;
|
|
@@ -3,7 +3,7 @@ import { useMemo, useState, useCallback, useEffect } from 'react';
|
|
|
3
3
|
import { useTranslation } from 'react-i18next';
|
|
4
4
|
import { chunkItems } from '../wordTableLayout';
|
|
5
5
|
import { getImageResolver, checkImageExists } from '../../utils/imageConfig';
|
|
6
|
-
import { buildCompositionSection, buildOrientationSection, buildBorderSection, buildCutLineSection, buildDivLineSection,
|
|
6
|
+
import { buildCompositionSection, buildOrientationSection, buildBorderSection, buildCutLineSection, buildDivLineSection, buildTopInfoSection, buildBottomInfoSection, buildItemsPerPageSection, buildTableSettingsSelected, applyTableSettingsSelect, PAGE_NUM_POSITION_VALUE, parsePageNumberPosition, itemsPerPageFromChoice, } from './wordTableSettings';
|
|
7
7
|
/**
|
|
8
8
|
* 표시 전용 단어표(편집 없음)의 '표 설정' FilterPanel 상태·섹션을 제공하는 훅.
|
|
9
9
|
* 구성·용지 방향·외곽선, 내용이 있으면 페이지당 개수, 2페이지 이상이면 페이지 번호, 항목이 2개 이상이면
|
|
@@ -11,12 +11,19 @@ import { buildCompositionSection, buildOrientationSection, buildBorderSection, b
|
|
|
11
11
|
* WordTablePopup 등 표를 미리 보여주고 인쇄하는 곳에서 쓴다.
|
|
12
12
|
* @public
|
|
13
13
|
*/
|
|
14
|
-
export function useWordTableDisplaySettings(items
|
|
14
|
+
export function useWordTableDisplaySettings(items,
|
|
15
|
+
/** 종이 머리·바닥 띠를 쓰는 화면이면 참 — '상단 정보'·'하단 정보' 절이 함께 선다.
|
|
16
|
+
* 안 쓰는 화면에 켜고 끌 것이 없는 절이 서면 안 되므로 기본은 거짓이다. */
|
|
17
|
+
opts) {
|
|
15
18
|
const { t } = useTranslation();
|
|
19
|
+
const 띠쓰나 = opts?.paperBands === true;
|
|
16
20
|
const [orientation, setOrientation] = useState('landscape');
|
|
17
21
|
const [contentTypes, setContentTypes] = useState(['이미지', '단어', '표준 발음']);
|
|
18
22
|
const [cutLine, setCutLine] = useState('표시');
|
|
19
23
|
const [showOutline, setShowOutline] = useState(true);
|
|
24
|
+
/* 종이 머리·바닥 띠 — 기본은 켬(브랜드가 찍힌 종이가 기본값이다) */
|
|
25
|
+
const [showTopInfo, setShowTopInfo] = useState(true);
|
|
26
|
+
const [showBottomInfo, setShowBottomInfo] = useState(true);
|
|
20
27
|
const [showDivLine, setShowDivLine] = useState(true);
|
|
21
28
|
const [itemsPerPageSetting, setItemsPerPageSetting] = useState(8);
|
|
22
29
|
const [pageNumberPosition, setPageNumberPosition] = useState('right');
|
|
@@ -54,19 +61,23 @@ export function useWordTableDisplaySettings(items) {
|
|
|
54
61
|
buildOrientationSection(t),
|
|
55
62
|
// 내용이 있는(1개 이상) 표면 페이지당 개수를 항상 노출.
|
|
56
63
|
...(itemCount > 0 ? [buildItemsPerPageSection(t, { hasPairs, itemCount })] : []),
|
|
57
|
-
|
|
64
|
+
/* '페이지 번호' 자리 고르개는 걷었다(사용자 지시 2026-09-30) — 쪽 번호가 바닥 띠
|
|
65
|
+
오른쪽에 고정으로 서므로 고를 자리가 없다. `pageNumberPosition` 프롭은 남아 있어
|
|
66
|
+
띠를 안 쓰는 화면은 전처럼 자리를 정할 수 있다. */
|
|
58
67
|
buildBorderSection(t),
|
|
59
68
|
...(count > 1 ? [buildCutLineSection(t)] : []),
|
|
60
69
|
...(hasPairs ? [buildDivLineSection(t)] : []),
|
|
61
|
-
|
|
70
|
+
/* 띠를 쓰는 화면에서만 — 안 쓰는 표에 켜고 끌 것이 없는 절이 서면 안 된다 */
|
|
71
|
+
...(띠쓰나 ? [buildTopInfoSection(t), buildBottomInfoSection(t)] : []),
|
|
72
|
+
], [t, hasImage, hasColloquial, itemCount, hasPairs, isPaginated, count, 띠쓰나]);
|
|
62
73
|
const filterSelected = {
|
|
63
|
-
...buildTableSettingsSelected(t, { contentTypes, orientation, showOutline, cutLine, showDivLine }),
|
|
74
|
+
...buildTableSettingsSelected(t, { contentTypes, orientation, showOutline, cutLine, showDivLine, showTopInfo, showBottomInfo }),
|
|
64
75
|
...(itemCount > 0 ? { [t(hasPairs ? 'wordTable.filter.itemsPerPagePair' : 'wordTable.filter.itemsPerPageWord')]: `${effectiveItemsPerPage}개` } : {}),
|
|
65
76
|
...(isPaginated ? { [t('wordTable.filter.pageNumber', '페이지 번호')]: PAGE_NUM_POSITION_VALUE[pageNumberPosition] } : {}),
|
|
66
77
|
};
|
|
67
78
|
const handleSelect = useCallback((value, sectionLabel) => {
|
|
68
79
|
// 기본 5개 설정은 공용 헬퍼가 처리 — 처리했으면 종료. 나머지(페이지당 개수·페이지 번호)만 여기서.
|
|
69
|
-
if (applyTableSettingsSelect(t, value, sectionLabel, { setContentTypes, setOrientation, setShowOutline, setCutLine, setShowDivLine }))
|
|
80
|
+
if (applyTableSettingsSelect(t, value, sectionLabel, { setContentTypes, setOrientation, setShowOutline, setCutLine, setShowDivLine, setShowTopInfo, setShowBottomInfo }))
|
|
70
81
|
return;
|
|
71
82
|
if (sectionLabel === t('wordTable.filter.itemsPerPagePair', '페이지당 대립쌍 수') || sectionLabel === t('wordTable.filter.itemsPerPageWord', '페이지당 단어 수')) {
|
|
72
83
|
setItemsPerPageSetting(itemsPerPageFromChoice(parseInt(value), itemCount));
|
|
@@ -76,7 +87,7 @@ export function useWordTableDisplaySettings(items) {
|
|
|
76
87
|
}
|
|
77
88
|
}, [t, itemCount]);
|
|
78
89
|
return {
|
|
79
|
-
settings: { orientation, contentTypes, cutLine, showOutline, showDivLine, count },
|
|
90
|
+
settings: { orientation, contentTypes, cutLine, showOutline, showDivLine, count, showTopInfo, showBottomInfo },
|
|
80
91
|
filterSections, filterSelected, handleSelect,
|
|
81
92
|
pages, isPaginated, pageNumberPosition,
|
|
82
93
|
};
|
|
@@ -105,6 +105,13 @@ export function captureHtml(els, paperW, paperH, autoPrint = false, fileName = '
|
|
|
105
105
|
아무도 opacity 를 되돌리지 않아 **빈칸으로 인쇄**되고, 새 창·내려받은 HTML 에서는 스피너가 영영 돈다(말귀 내 단어표
|
|
106
106
|
'인쇄' 는 열자마자 100ms 뒤 인쇄해 처음 보는 표는 거의 늘 이랬다). */
|
|
107
107
|
clone.querySelectorAll('.word-table-cell__spinner').forEach(s => s.remove());
|
|
108
|
+
/* **머리·바닥 띠의 배율 되돌림을 걷는다.**
|
|
109
|
+
화면의 표는 미리보기 상자에 맞춰 줄어 있고, 띠가 그만큼 줄지 않도록 격자에
|
|
110
|
+
`--wt-unscale`(1/배율)이 **인라인으로** 박혀 있다. 이 문서는 그 격자를 인라인 스타일째
|
|
111
|
+
복사해 오는데 여기서는 종이가 제 크기다 — 그대로 두면 미리보기가 좁았을수록 로고와
|
|
112
|
+
글씨가 그 배수만큼 커진다(0.5 로 보고 있었으면 두 배). CSS 로 덮으려면 인라인을
|
|
113
|
+
이겨야 해 `!important` 가 필요하니, 아예 지운다. */
|
|
114
|
+
clone.style.removeProperty('--wt-unscale');
|
|
108
115
|
/* 불러오는 중이던 그림은 opacity 를 **그대로 두고** 받아지면 보이고 실패하면 숨게 한다 — 지우기만 하면 없는 그림(404, 화면에서는
|
|
109
116
|
onError 로 칸이 사라짐)이 인쇄 문서에서 깨진 그림 아이콘과 alt 글자로 찍혔다. autoPrint 는 그림 로드를 기다린 뒤 인쇄한다. */
|
|
110
117
|
clone.querySelectorAll('img').forEach(i => {
|
|
@@ -17,6 +17,10 @@ export declare function buildCompositionSection(t: TFunction, opts: {
|
|
|
17
17
|
export declare function buildOrientationSection(t: TFunction): FilterPanelSection;
|
|
18
18
|
/** @public 외곽선(표시/미표시) 세그먼트 섹션. */
|
|
19
19
|
export declare function buildBorderSection(t: TFunction): FilterPanelSection;
|
|
20
|
+
/** @public 상단 정보(표시/미표시) 세그먼트 섹션 — 종이 머리 띠(로고·표 번호)를 켜고 끈다. */
|
|
21
|
+
export declare function buildTopInfoSection(t: TFunction): FilterPanelSection;
|
|
22
|
+
/** @public 하단 정보(표시/미표시) 세그먼트 섹션 — 종이 바닥 띠(만든 곳·주소·쪽 번호)를 켜고 끈다. */
|
|
23
|
+
export declare function buildBottomInfoSection(t: TFunction): FilterPanelSection;
|
|
20
24
|
/** @public 절취선(표시/점선/코너/미표시) 세그먼트 섹션. */
|
|
21
25
|
export declare function buildCutLineSection(t: TFunction): FilterPanelSection;
|
|
22
26
|
/** @public 구분선(대립선, 표시/미표시) 세그먼트 섹션 — 대립쌍표에만 노출. */
|
|
@@ -48,6 +52,8 @@ export declare function buildTableSettingsSelected(t: TFunction, v: {
|
|
|
48
52
|
showOutline: boolean;
|
|
49
53
|
cutLine: WordTableCutLine;
|
|
50
54
|
showDivLine: boolean;
|
|
55
|
+
showTopInfo?: boolean;
|
|
56
|
+
showBottomInfo?: boolean;
|
|
51
57
|
}): Record<string, string | string[]>;
|
|
52
58
|
/** @public 기본 5개 설정 상태 setter 묶음. */
|
|
53
59
|
export interface TableSettingsSetters {
|
|
@@ -56,6 +62,8 @@ export interface TableSettingsSetters {
|
|
|
56
62
|
setShowOutline: (v: boolean) => void;
|
|
57
63
|
setCutLine: (v: WordTableCutLine) => void;
|
|
58
64
|
setShowDivLine: (v: boolean) => void;
|
|
65
|
+
setShowTopInfo?: (v: boolean) => void;
|
|
66
|
+
setShowBottomInfo?: (v: boolean) => void;
|
|
59
67
|
}
|
|
60
68
|
/**
|
|
61
69
|
* @public 기본 5개 설정 섹션의 FilterPanel select 처리. 처리했으면 true, 아니면(추가 섹션 라벨) false를
|
|
@@ -43,6 +43,28 @@ export function buildBorderSection(t) {
|
|
|
43
43
|
display: 'segmented',
|
|
44
44
|
};
|
|
45
45
|
}
|
|
46
|
+
/** @public 상단 정보(표시/미표시) 세그먼트 섹션 — 종이 머리 띠(로고·표 번호)를 켜고 끈다. */
|
|
47
|
+
export function buildTopInfoSection(t) {
|
|
48
|
+
return {
|
|
49
|
+
label: t('wordTable.filter.topInfo', '상단 정보'),
|
|
50
|
+
items: [
|
|
51
|
+
{ value: '표시', displayLabel: t('wordTable.filter.show', '표시') },
|
|
52
|
+
{ value: '미표시', displayLabel: t('wordTable.filter.hide', '미표시') },
|
|
53
|
+
],
|
|
54
|
+
display: 'segmented',
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/** @public 하단 정보(표시/미표시) 세그먼트 섹션 — 종이 바닥 띠(만든 곳·주소·쪽 번호)를 켜고 끈다. */
|
|
58
|
+
export function buildBottomInfoSection(t) {
|
|
59
|
+
return {
|
|
60
|
+
label: t('wordTable.filter.bottomInfo', '하단 정보'),
|
|
61
|
+
items: [
|
|
62
|
+
{ value: '표시', displayLabel: t('wordTable.filter.show', '표시') },
|
|
63
|
+
{ value: '미표시', displayLabel: t('wordTable.filter.hide', '미표시') },
|
|
64
|
+
],
|
|
65
|
+
display: 'segmented',
|
|
66
|
+
};
|
|
67
|
+
}
|
|
46
68
|
/** @public 절취선(표시/점선/코너/미표시) 세그먼트 섹션. */
|
|
47
69
|
export function buildCutLineSection(t) {
|
|
48
70
|
return {
|
|
@@ -115,6 +137,9 @@ export function buildTableSettingsSelected(t, v) {
|
|
|
115
137
|
[t('wordTable.filter.border', '외곽선')]: v.showOutline ? '표시' : '미표시',
|
|
116
138
|
[t('wordTable.filter.cutLine', '절취선')]: v.cutLine,
|
|
117
139
|
[t('wordPrint.divLine', '대립선')]: v.showDivLine ? '표시' : '미표시',
|
|
140
|
+
/* 띠를 안 쓰는 화면은 이 절을 아예 안 세우므로 값이 있어도 안 보인다 */
|
|
141
|
+
[t('wordTable.filter.topInfo', '상단 정보')]: v.showTopInfo === false ? '미표시' : '표시',
|
|
142
|
+
[t('wordTable.filter.bottomInfo', '하단 정보')]: v.showBottomInfo === false ? '미표시' : '표시',
|
|
118
143
|
};
|
|
119
144
|
}
|
|
120
145
|
/**
|
|
@@ -147,5 +172,13 @@ export function applyTableSettingsSelect(t, value, sectionLabel, s) {
|
|
|
147
172
|
s.setShowDivLine(value === '표시');
|
|
148
173
|
return true;
|
|
149
174
|
}
|
|
175
|
+
if (sectionLabel === t('wordTable.filter.topInfo', '상단 정보')) {
|
|
176
|
+
s.setShowTopInfo?.(value === '표시');
|
|
177
|
+
return true;
|
|
178
|
+
}
|
|
179
|
+
if (sectionLabel === t('wordTable.filter.bottomInfo', '하단 정보')) {
|
|
180
|
+
s.setShowBottomInfo?.(value === '표시');
|
|
181
|
+
return true;
|
|
182
|
+
}
|
|
150
183
|
return false;
|
|
151
184
|
}
|
|
@@ -63,6 +63,163 @@
|
|
|
63
63
|
pointer-events: none;
|
|
64
64
|
}
|
|
65
65
|
|
|
66
|
+
/* ── 종이 머리·바닥 띠 ────────────────────────────────────────────────
|
|
67
|
+
쪽 번호가 쓰던 수를 위아래로 넓힌 것이다. 격자가 그만큼 비우고 띠는 그 빈 자리에
|
|
68
|
+
절대 배치로 선다 — **격자 안**이라 인쇄가 격자만 복사해 가도 함께 간다. */
|
|
69
|
+
/* 띠 높이에 딱 붙인다 — 남는 틈은 4px 뿐이다(사용자 지시 2026-09-30: 여백이 많다).
|
|
70
|
+
비운 자리가 띠보다 크면 로고와 칸 사이가 벌어져 종이가 헐거워 보인다.
|
|
71
|
+
**위아래를 따로 비운다** — 표 설정에서 한쪽만 끌 수 있다. */
|
|
72
|
+
.word-table-block__content--brand-top { padding-top: calc(32px * var(--wt-unscale, 1)); }
|
|
73
|
+
.word-table-block__content--brand-bottom { padding-bottom: calc(26px * var(--wt-unscale, 1)); }
|
|
74
|
+
/* 절취선 바탕·외곽선은 칸이 있는 데까지만 — 띠까지 두르면 로고가 표 안에 든 것처럼 보인다
|
|
75
|
+
(쪽 번호 때와 같은 까닭). 아래는 쪽 번호 규칙과 겹치므로 여기서 다시 적어 이긴다. */
|
|
76
|
+
.word-table-block__content--brand-top.word-table-block__content--cut-show,
|
|
77
|
+
.word-table-block__content--brand-bottom.word-table-block__content--cut-show {
|
|
78
|
+
background-clip: content-box;
|
|
79
|
+
}
|
|
80
|
+
.word-table-block__content--brand-top.word-table-block__content--outline::after {
|
|
81
|
+
top: calc(32px * var(--wt-unscale, 1));
|
|
82
|
+
}
|
|
83
|
+
.word-table-block__content--brand-bottom.word-table-block__content--outline::after {
|
|
84
|
+
bottom: calc(26px * var(--wt-unscale, 1));
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.word-table__band {
|
|
88
|
+
position: absolute;
|
|
89
|
+
left: 0;
|
|
90
|
+
right: 0;
|
|
91
|
+
display: flex;
|
|
92
|
+
align-items: center;
|
|
93
|
+
justify-content: space-between;
|
|
94
|
+
gap: calc(12px * var(--wt-unscale, 1));
|
|
95
|
+
z-index: 2;
|
|
96
|
+
pointer-events: none;
|
|
97
|
+
color: var(--color-gray);
|
|
98
|
+
/* 글꼴 크기는 띠마다 다르다 — 위는 caption-1, 아래는 caption-2(사용자 지시 2026-09-30).
|
|
99
|
+
클래스(`.caption-1`)를 그냥 붙이면 크기가 고정돼 배율 되돌림이 안 먹으므로 같은
|
|
100
|
+
토큰에 되돌림만 곱한다. 그 토큰은 보는 사람 쪽 설정(좁은 화면 · 큰 글씨)을 타므로
|
|
101
|
+
종이 글씨도 그만큼 달라진다 — 화면과 종이를 한 급으로 맞추기로 한 값이다. */
|
|
102
|
+
font-weight: var(--text-caption-1-weight, 400);
|
|
103
|
+
}
|
|
104
|
+
/* 비워 둔 44px 안에 든다 */
|
|
105
|
+
/* 위는 **11px**, 아래는 **8px** — 둘 다 종이 전용 값이라 토큰에서 벗어난다
|
|
106
|
+
(사용자 지시 2026-09-30). 화면 글씨는 읽는 거리에 맞추지만 이 줄들은 종이에 찍혀
|
|
107
|
+
필요할 때만 들여다본다. 배율 되돌림은 그대로 받는다. */
|
|
108
|
+
.word-table__band--top {
|
|
109
|
+
top: 0;
|
|
110
|
+
height: calc(28px * var(--wt-unscale, 1));
|
|
111
|
+
font-size: calc(11px * var(--wt-unscale, 1));
|
|
112
|
+
line-height: calc(15px * var(--wt-unscale, 1));
|
|
113
|
+
}
|
|
114
|
+
/* 아래는 **8px** 이다(사용자 지시 2026-09-30) — 만든 곳 · 주소 · 쪽 번호는 찾을 때만 읽는
|
|
115
|
+
잔글이라 디자인 시스템의 가장 작은 급(caption-2, 11px)보다 더 내린다. 토큰을 안 쓰는
|
|
116
|
+
유일한 자리이고, **종이 전용 값**이라 그렇다: 화면 글씨는 사람이 읽는 거리에 맞추지만
|
|
117
|
+
이 줄은 종이에 인쇄돼 필요할 때만 들여다본다. 배율 되돌림은 그대로 받는다. */
|
|
118
|
+
.word-table__band--bottom {
|
|
119
|
+
/* 로고까지 이 색을 받는다 — 마스크를 `currentColor` 로 칠하므로 글씨와 늘 같은 색이다 */
|
|
120
|
+
color: var(--color-gray);
|
|
121
|
+
bottom: 0;
|
|
122
|
+
height: calc(22px * var(--wt-unscale, 1));
|
|
123
|
+
font-size: calc(8px * var(--wt-unscale, 1));
|
|
124
|
+
line-height: calc(12px * var(--wt-unscale, 1));
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.word-table__brand-logo {
|
|
128
|
+
height: calc(28px * var(--wt-unscale, 1));
|
|
129
|
+
width: auto;
|
|
130
|
+
display: block;
|
|
131
|
+
/* 말귀 로고는 컬러다 — 브라우저 인쇄 기본값은 바탕·색을 빼므로 그대로 두면 종이에서
|
|
132
|
+
흐려지거나 사라진다(절취선 바탕이 쓰는 것과 같은 수다). */
|
|
133
|
+
print-color-adjust: exact;
|
|
134
|
+
-webkit-print-color-adjust: exact;
|
|
135
|
+
}
|
|
136
|
+
/* 만든 곳(ihab) 로고 — **그림이 아니라 꼴**이다. 흰 판 SVG 를 마스크로 오려 그 자리를
|
|
137
|
+
`currentColor` 로 칠하므로 곁의 글씨와 **같은 색**이 된다(사용자 지시 2026-09-30).
|
|
138
|
+
파일에 `fill` 이 박혀 있어 `<img>` 로는 색을 못 바꾼다. 가로세로비는 파일 그대로(264:100).
|
|
139
|
+
인쇄에서도 색이 빠지지 않게 말귀 로고와 같은 수를 쓴다. */
|
|
140
|
+
.word-table__brand-logo--ihab {
|
|
141
|
+
display: block;
|
|
142
|
+
height: calc(17px * var(--wt-unscale, 1));
|
|
143
|
+
width: calc(17px * 2.64 * var(--wt-unscale, 1));
|
|
144
|
+
flex-shrink: 0;
|
|
145
|
+
background-color: currentColor;
|
|
146
|
+
/* 이 파일이 로고를 **직접** 가리킨다 — 묶개가 주소를 풀어 준다. 마디에 인라인으로
|
|
147
|
+
주던 때는 그 값이 화면에 안 실리는 일이 있었고, 무엇보다 여기 적어야 인쇄 문서로
|
|
148
|
+
(스타일시트를 통째로 베껴 가므로) 함께 간다. */
|
|
149
|
+
-webkit-mask-image: url('../logo/Logo_IHAB_en_white.svg');
|
|
150
|
+
mask-image: url('../logo/Logo_IHAB_en_white.svg');
|
|
151
|
+
-webkit-mask-repeat: no-repeat;
|
|
152
|
+
mask-repeat: no-repeat;
|
|
153
|
+
-webkit-mask-size: contain;
|
|
154
|
+
mask-size: contain;
|
|
155
|
+
-webkit-mask-position: center;
|
|
156
|
+
mask-position: center;
|
|
157
|
+
print-color-adjust: exact;
|
|
158
|
+
-webkit-print-color-adjust: exact;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/* 만든 곳 — 로고와 저작권이 한 줄로 붙는다 */
|
|
162
|
+
.word-table__brand-by {
|
|
163
|
+
display: flex;
|
|
164
|
+
align-items: center;
|
|
165
|
+
gap: calc(8px * var(--wt-unscale, 1));
|
|
166
|
+
min-width: 0;
|
|
167
|
+
}
|
|
168
|
+
.word-table__copyright {
|
|
169
|
+
white-space: nowrap;
|
|
170
|
+
overflow: hidden;
|
|
171
|
+
text-overflow: ellipsis;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/* 바닥 오른쪽 — 이 표의 주소와 쪽 번호. 주소가 길면(짧은 주소가 아닐 때) 먼저 양보한다. */
|
|
175
|
+
.word-table__band-end {
|
|
176
|
+
display: flex;
|
|
177
|
+
align-items: center;
|
|
178
|
+
gap: calc(12px * var(--wt-unscale, 1));
|
|
179
|
+
min-width: 0;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/* 표 번호·주소 — **종이 글씨는 전부 한 글꼴이다**(사용자 지시 2026-09-30). 고정폭으로
|
|
183
|
+
찍어 봤는데 한 장 안에 글꼴이 둘 섞여 보였다. 종이가 한 벌로 읽히는 쪽을 골랐다 —
|
|
184
|
+
목록 카드(`WordTableButton`)의 번호는 청한 대로 고정폭 그대로다. */
|
|
185
|
+
/* 기관 이름 · 표 번호 — 번호만 진하게 둔다(찾는 눈이 번호에 먼저 닿게) */
|
|
186
|
+
.word-table__ident {
|
|
187
|
+
display: flex;
|
|
188
|
+
align-items: center;
|
|
189
|
+
gap: calc(6px * var(--wt-unscale, 1));
|
|
190
|
+
min-width: 0;
|
|
191
|
+
}
|
|
192
|
+
/* 이름이 길면 이름만 줄어든다 — 번호는 잘리면 확인 글자가 사라져 뜻이 없다 */
|
|
193
|
+
.word-table__owner {
|
|
194
|
+
min-width: 0;
|
|
195
|
+
overflow: hidden;
|
|
196
|
+
text-overflow: ellipsis;
|
|
197
|
+
white-space: nowrap;
|
|
198
|
+
}
|
|
199
|
+
.word-table__ident-dot { flex-shrink: 0; }
|
|
200
|
+
/* 표 번호 — **띠와 같은 회색**이다(사용자 지시 2026-09-30). 한때 번호만 진하게 뒀는데,
|
|
201
|
+
머리 줄 전체가 종이를 식별하는 잔글이라 한 무게로 읽히는 편이 낫다. */
|
|
202
|
+
.word-table__code {
|
|
203
|
+
flex-shrink: 0;
|
|
204
|
+
white-space: nowrap;
|
|
205
|
+
}
|
|
206
|
+
/* 표 제목 — 셋 중 제일 먼저 줄어든다(기관 이름·번호가 이 종이를 가리키는 값이다) */
|
|
207
|
+
.word-table__paper-title {
|
|
208
|
+
min-width: 0;
|
|
209
|
+
overflow: hidden;
|
|
210
|
+
text-overflow: ellipsis;
|
|
211
|
+
white-space: nowrap;
|
|
212
|
+
}
|
|
213
|
+
/* 이 표로 가는 주소 — 길 수 있으므로 넘치면 …로 자른다(쪽 번호는 안 밀린다) */
|
|
214
|
+
.word-table__link {
|
|
215
|
+
color: var(--color-gray);
|
|
216
|
+
min-width: 0;
|
|
217
|
+
overflow: hidden;
|
|
218
|
+
text-overflow: ellipsis;
|
|
219
|
+
white-space: nowrap;
|
|
220
|
+
}
|
|
221
|
+
.word-table__page-count { flex-shrink: 0; white-space: nowrap; }
|
|
222
|
+
|
|
66
223
|
.word-table__page-number--left { left: 12px; }
|
|
67
224
|
.word-table__page-number--right { right: 12px; }
|
|
68
225
|
.word-table__page-number--center { left: 50%; transform: translateX(-50%); }
|
|
@@ -456,6 +613,13 @@
|
|
|
456
613
|
transform: none !important;
|
|
457
614
|
}
|
|
458
615
|
|
|
616
|
+
/* 표가 제 크기로 돌아오니 띠의 배율 되돌림도 끈다 — 안 끄면 화면에서 좁게 보던 만큼
|
|
617
|
+
로고와 글씨가 커져 찍힌다. 인라인으로 박힌 값이라 `!important` 라야 이긴다
|
|
618
|
+
(위 `transform` 과 같은 까닭). */
|
|
619
|
+
.word-table-block__content {
|
|
620
|
+
--wt-unscale: 1 !important;
|
|
621
|
+
}
|
|
622
|
+
|
|
459
623
|
.word-table-block__card-close,
|
|
460
624
|
.word-table-block__card-actions,
|
|
461
625
|
.word-table-block__card-handle { display: none; }
|
|
@@ -83,6 +83,57 @@ export interface WordTableProps {
|
|
|
83
83
|
* 쪽의 시작 번호를 받아 표 전체에서 유일한 번호로 만든다.
|
|
84
84
|
*/
|
|
85
85
|
scoreIndexOffset?: number;
|
|
86
|
+
/**
|
|
87
|
+
* **종이 위·아래에 띠를 두르고** 로고·표 번호·주소·쪽 번호를 담는다(사용자 지시 2026-09-30).
|
|
88
|
+
*
|
|
89
|
+
* 자리는 넷이다 — 위 왼쪽 말귀 로고 · 위 오른쪽 `code` · 아래 왼쪽 ihab 로고와 저작권 ·
|
|
90
|
+
* 아래 오른쪽 주소와 쪽 번호.
|
|
91
|
+
*
|
|
92
|
+
* **안 주면 종이가 한 픽셀도 안 바뀐다.** 띠는 격자 위아래를 비워 만드는 것이라(쪽 번호가
|
|
93
|
+
* 쓰던 방식과 같다) 칸이 그만큼 낮아진다 — 안 쓰는 표까지 낮아지면 안 된다.
|
|
94
|
+
*
|
|
95
|
+
* 띠는 **격자 안**에 있다(자리만 절대 배치로 잡는다). 인쇄는 격자 하나만 복사해 가므로
|
|
96
|
+
* (`contentRef` → `printWordTableElements`) 격자 밖에 두면 **종이에는 안 찍힌다** —
|
|
97
|
+
* 화면에서는 멀쩡해 보이고 종이에서만 사라지는 꼴이라 눈치채기 어렵다.
|
|
98
|
+
*/
|
|
99
|
+
brand?: {
|
|
100
|
+
/** 로고와 저작권을 세운다. 나머지 자리는 각자 값이 있을 때만 선다. */
|
|
101
|
+
show?: boolean;
|
|
102
|
+
/** 위 띠만 끈다(`show` 가 켜져 있을 때). 표 설정의 '상단 정보' 가 이것을 움직인다. */
|
|
103
|
+
top?: boolean;
|
|
104
|
+
/** 아래 띠만 끈다(`show` 가 켜져 있을 때). 표 설정의 '하단 정보' 가 이것을 움직인다. */
|
|
105
|
+
bottom?: boolean;
|
|
106
|
+
/**
|
|
107
|
+
* 아래 오른쪽 — **이 표로 가는 주소**. 회사 홈 주소가 아니라 그 표의 공유 링크다
|
|
108
|
+
* (사용자 지시 2026-09-30). 종이를 든 사람이 이 주소로 같은 표를 화면에서 연다.
|
|
109
|
+
*
|
|
110
|
+
* **`code` 와는 다른 것이다.** 표 번호는 기관 안에서 매긴 번호고 이 주소는 따로 난
|
|
111
|
+
* 공유 링크다 — 번호에서 주소를 만들어 내지 않는다. 둘 다 이 표를 가리키지만 나오는
|
|
112
|
+
* 데가 다르므로 각각 받는다.
|
|
113
|
+
*
|
|
114
|
+
* 종이라 누를 수 없으니 글자 그대로 찍는다 — 그래서 **사람이 옮겨 칠 수 있는 길이**
|
|
115
|
+
* 여야 한다. 긴 주소를 그대로 주면 넘쳐 …로 잘리고, 잘린 주소는 옮겨 칠 수 없다.
|
|
116
|
+
* 짧은 주소를 쓰거나, 표 번호로 찾는 길을 함께 두는 편이 낫다.
|
|
117
|
+
*/
|
|
118
|
+
link?: string;
|
|
119
|
+
/** 저작권 글월 — 안 주면 `© IHAB, Inc. All rights reserved.` */
|
|
120
|
+
copyright?: string;
|
|
121
|
+
/** 위 오른쪽 맨 앞 — **이 표의 이름**. `표 제목 · 기관 이름 · 표 번호` 로 선다. */
|
|
122
|
+
title?: string;
|
|
123
|
+
/**
|
|
124
|
+
* 위 오른쪽 — **표 번호 앞에 붙는 기관 이름**(말귀매니저). 번호는 그 기관 안에서만
|
|
125
|
+
* 고유하므로 이름과 함께여야 어느 곳의 몇 번인지가 정해진다(사용자 지시 2026-09-30).
|
|
126
|
+
* `이름 · 번호` 로 선다. 이름이 길면 이름만 줄고 번호는 안 줄인다 — 번호가 잘리면
|
|
127
|
+
* 확인 글자가 사라져 뜻이 없다.
|
|
128
|
+
*/
|
|
129
|
+
owner?: string;
|
|
130
|
+
};
|
|
131
|
+
/**
|
|
132
|
+
* **짧은 식별 글** — 표 번호(`1043-E`). `brand` 를 줬을 때 위 오른쪽에 선다.
|
|
133
|
+
* 종이에 찍힌 번호로 나중에 그 표를 찾는다(`WordTableButton` 의 같은 이름 프롭과 짝이다).
|
|
134
|
+
* 종이 글씨는 전부 한 글꼴이라 여기서는 고정폭을 안 쓴다 — 목록 카드 쪽은 고정폭이다.
|
|
135
|
+
*/
|
|
136
|
+
code?: string;
|
|
86
137
|
/** 페이지 분할 시 현재/전체 페이지 — 지정하면 종이 안에 페이지 번호를 찍는다 */
|
|
87
138
|
pageNumber?: {
|
|
88
139
|
current: number;
|
|
@@ -114,4 +165,4 @@ export interface WordTableProps {
|
|
|
114
165
|
* 표시(items)·편집(editCells) 두 모드를 지원한다.
|
|
115
166
|
* @public
|
|
116
167
|
*/
|
|
117
|
-
export default 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): import("react").JSX.Element;
|
|
168
|
+
export default function WordTable({ title, titleIcon, disc, className, orientation, contentTypes, cutLine, showOutline, showDivLine, items, editCells, count, activeCell, onActivateCell, onRemoveCell, onRemoveItem, onReorder, renderCellAction, showFillerAdd, contentRef, buttonSize, brand, code, pageNumber, pageNumberPosition, fitHeight, scoring, marks, onMarkClick, scoreIndexOffset, }: WordTableProps): import("react").JSX.Element;
|