@ihabdevteam/core 0.187.0 → 0.189.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.
@@ -0,0 +1,59 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useCallback, useEffect, useState } from 'react';
4
+ import { cx } from '../utils/cx';
5
+ import './LineChart.css';
6
+ import Tooltip from './Tooltip/Tooltip';
7
+ import { useDelayedHoverAnchor } from '../hooks/useHoverAnchor';
8
+ /** 점 위에 잠깐 머물면 뜨는 뜸 — 지나가는 마우스에 툴팁이 번쩍이지 않을 만큼만 짧게 @public */
9
+ export const LINE_CHART_HOVER_DELAY_MS = 120;
10
+ const 기본여백 = { left: 38, right: 16, top: 26, bottom: 24 };
11
+ /**
12
+ * **작은 선 그래프** — 시간·조건에 따라 값이 어떻게 흐르는지를 그린다.
13
+ * 세로는 0~100%로 고정이고, 가로 범위는 부르는 쪽이 준다.
14
+ *
15
+ * **제 상자를 재어 배율 1 로 그린다.** `viewBox` 를 상자보다 좁게 두면 SVG 가 통째로 늘어나
16
+ * **글자까지 커진다**(말귀 실측 1.22배 — 사용자 지적 2026-09-17 "이 그래프가 폰트가 크게 보이는게
17
+ * 스케일 되서 그런건가?"). 잰 픽셀을 그대로 쓰면 CSS 에 적은 12px 이 화면에서도 12px 이다.
18
+ * 못 재는 자리(첫 렌더·ResizeObserver 없는 틀)에서는 `fallbackWidth` 로 그린다 — 늘어날 뿐 안 깨진다.
19
+ *
20
+ * **면 칠하기·짚는 자리처럼 그 화면에만 있는 말은 `overlay` 로 덧그린다** — 자(`x`·`y`)를 받으므로
21
+ * 좌표 셈을 다시 하지 않는다.
22
+ * @public
23
+ */
24
+ export default function LineChart({ points = [], range, ticks = [], axisTitle, color, height = 156, fallbackWidth = 320, insets, overlay, ariaLabel, className, }) {
25
+ /* **제 상자를 재어 그 픽셀 수를 그림 칸으로 쓴다.** `width: 100%` 는 그대로라 viewBox 를 바꿔도
26
+ 가로가 다시 바뀌지 않는다(되먹임이 없다). */
27
+ const [잰폭, set잰폭] = useState(null);
28
+ const [칸, set칸] = useState(null);
29
+ useEffect(() => {
30
+ if (!칸)
31
+ return;
32
+ const 재기 = (w) => set잰폭(Math.round(w) || null);
33
+ 재기(칸.getBoundingClientRect().width);
34
+ if (typeof ResizeObserver === 'undefined')
35
+ return;
36
+ const 지켜보기 = new ResizeObserver(([e]) => 재기(e.contentRect.width));
37
+ 지켜보기.observe(칸);
38
+ return () => { 지켜보기.disconnect(); };
39
+ }, [칸]);
40
+ const { payload: 짚은글, anchorRect: 짚은자리, openAfterDelay, close: 닫기 } = useDelayedHoverAnchor(LINE_CHART_HOVER_DELAY_MS);
41
+ const 얹힘 = useCallback((글, el) => {
42
+ if (글)
43
+ openAfterDelay(글, el.getBoundingClientRect());
44
+ }, [openAfterDelay]);
45
+ const W = 잰폭 ?? fallbackWidth, H = height;
46
+ const { left: 왼, right: 오른, top: 위, bottom: 아래 } = { ...기본여백, ...insets };
47
+ const [처음, 끝] = range;
48
+ /* 범위는 부르는 쪽이 적어도 한 칸 폭으로 준다(끝 > 처음) — 같으면 0 으로 나누므로 왼쪽 끝에 몰아 둔다 */
49
+ const x = (v) => (끝 === 처음 ? 왼 : 왼 + ((W - 왼 - 오른) * (v - 처음)) / (끝 - 처음));
50
+ const y = (pct) => 위 + ((H - 위 - 아래) * (100 - pct)) / 100;
51
+ const 자 = {
52
+ x, y,
53
+ plot: { left: 왼, right: W - 오른, top: 위, bottom: H - 아래, width: Math.max(0, W - 왼 - 오른), height: Math.max(0, H - 위 - 아래) },
54
+ };
55
+ /* 선은 **믿을 점만** 잇는다 — 속 빈 점까지 이으면 "이만큼 봤다" 는 말이 흐려진다 */
56
+ const 이을점 = points.filter(p => !p.hollow);
57
+ const 색 = color ?? 'var(--color-main)';
58
+ return (_jsxs(_Fragment, { children: [_jsxs("svg", { ref: set칸, className: cx('line-chart', className), viewBox: `0 0 ${W} ${H}`, role: "img", "aria-label": ariaLabel ?? points.map(p => p.description).filter(Boolean).join(', '), children: [axisTitle && _jsx("text", { className: "line-chart__axis-title", x: 0, y: 12, children: axisTitle }), [0, 100].map(v => (_jsxs("g", { children: [_jsx("line", { className: "line-chart__grid", x1: 왼, x2: W - 오른, y1: y(v), y2: y(v) }), _jsxs("text", { className: "line-chart__tick", x: 왼 - 6, y: y(v) + 4, textAnchor: "end", children: [v, "%"] })] }, v))), overlay?.(자), ticks.map(tk => (_jsx("text", { className: "line-chart__tick", x: x(tk.x), y: H - 5, textAnchor: "middle", children: tk.label }, tk.x))), 이을점.length > 1 && (_jsx("polyline", { className: "line-chart__line", fill: "none", stroke: 색, points: 이을점.map(p => `${x(p.x)},${y(p.pct)}`).join(' ') })), points.map(p => (_jsxs("g", { className: "line-chart__dot", onPointerEnter: e => 얹힘(p.description, e.currentTarget), onPointerLeave: 닫기, children: [_jsx("circle", { className: "line-chart__dot-hit", cx: x(p.x), cy: y(p.pct), r: 12 }), _jsx("circle", { className: cx('line-chart__dot-main', p.hollow && 'is-hollow'), cx: x(p.x), cy: y(p.pct), r: 4, stroke: 색, fill: p.hollow ? undefined : 색 })] }, p.x)))] }), 짚은글 != null && (_jsx(Tooltip, { anchorRect: 짚은자리, offset: 10, closeOnOutsideClick: false, className: "line-chart__tip", role: "tooltip", ariaLabel: 짚은글, children: 짚은글 }))] }));
59
+ }
@@ -0,0 +1,25 @@
1
+ /* 카드 머리 오른쪽에 띄우는 단추 줄 — 까닭과 쓰는 법은 `SectionHeadFloat.tsx` 의 글에. */
2
+ .section-head-float {
3
+ position: absolute;
4
+ /* 카드 안쪽 여백과 같은 값이라야 제목 줄과 윗선이 맞는다 — 그 수는 카드가 알고 있다 */
5
+ top: var(--card-pad, 19px);
6
+ right: var(--card-pad, 19px);
7
+ display: flex;
8
+ align-items: center;
9
+ justify-content: flex-end;
10
+ gap: var(--spacing-m);
11
+ /* 제목이 설 자리는 남긴다 */
12
+ max-width: 50%;
13
+ z-index: 1;
14
+ }
15
+
16
+ /* **좁으면 흐름으로 되돌린다** — 띄운 채로 두면 제목과 그 아랫줄을 덮고, 단추 이름도 두 줄로 갈린다.
17
+ 이 줄은 대개 250px 안팎이라 600px 아래에서는 제목과 나란히 설 자리가 없다. */
18
+ @media (max-width: 600px) {
19
+ .section-head-float {
20
+ position: static;
21
+ max-width: none;
22
+ margin-top: var(--spacing-m);
23
+ flex-wrap: wrap;
24
+ }
25
+ }
@@ -0,0 +1,28 @@
1
+ import './SectionHeadFloat.css';
2
+ import type { ReactNode } from 'react';
3
+ /** @public */
4
+ export interface SectionHeadFloatProps {
5
+ children?: ReactNode;
6
+ className?: string;
7
+ }
8
+ /**
9
+ * **카드 머리 오른쪽에 띄우는 단추 줄.**
10
+ *
11
+ * 흐름에서 빼는 까닭은 자리가 아니라 **높이**다 — 40px 짜리 단추를 제목 줄에 함께 세우면
12
+ * 제목 줄이 그만큼 커져 카드마다 머리 높이가 달라진다. 띄우면 제목은 제 높이로 선다.
13
+ *
14
+ * 세 가지를 이 조각이 맡는다. 앱마다 손으로 하다 보니 같은 규칙이 여러 벌이 됐다(말귀 두 벌 —
15
+ * `top/right: 19px` 라는 **카드 안쪽 여백**을 베껴 적고 있었다. 그 수를 아는 쪽은 카드다).
16
+ *
17
+ * 1. **자리** — 카드 안쪽 여백에 맞춰 띄운다(`--card-pad`, 기본 19px). 카드가 여백을 고치면 함께 움직인다.
18
+ * 2. **좁은 화면(600px 이하)에서 흐름으로 되돌린다** — 띄운 채로 두면 제목과 그 아랫줄을 덮는다.
19
+ * 문턱이 600 인 것은 이 줄이 대개 250px 안팎이라, 그 아래에서는 제목과 나란히 설 자리가 없어서다.
20
+ * 3. **제 폭을 재어 알린다** — 띄운 줄은 흐름에서 빠져 제목·곁줄을 덮으므로 그만큼 비워 둬야 하는데,
21
+ * 부르는 쪽이 눈대중으로 `padding-right: 260px` 같은 수를 적고 있었다. 잰 폭을 부모에
22
+ * `--section-head-float-w` 로 적으므로, 비울 자리는 `padding-right: calc(var(--section-head-float-w, -12px) + 12px)`
23
+ * 한 줄이면 된다(안 띄운 카드에서는 0 이 된다). 코어 카드(`manager-section`)는 이미 그렇게 해 둔다.
24
+ *
25
+ * 기준점은 **부모가 준다** — 카드에 `position: relative` 가 있어야 한다(코어 카드에는 있다).
26
+ * @public
27
+ */
28
+ export default function SectionHeadFloat({ children, className }: SectionHeadFloatProps): import("react").JSX.Element;
@@ -0,0 +1,54 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { useEffect, useRef, useState } from 'react';
4
+ import { cx } from '../utils/cx';
5
+ import './SectionHeadFloat.css';
6
+ /**
7
+ * **카드 머리 오른쪽에 띄우는 단추 줄.**
8
+ *
9
+ * 흐름에서 빼는 까닭은 자리가 아니라 **높이**다 — 40px 짜리 단추를 제목 줄에 함께 세우면
10
+ * 제목 줄이 그만큼 커져 카드마다 머리 높이가 달라진다. 띄우면 제목은 제 높이로 선다.
11
+ *
12
+ * 세 가지를 이 조각이 맡는다. 앱마다 손으로 하다 보니 같은 규칙이 여러 벌이 됐다(말귀 두 벌 —
13
+ * `top/right: 19px` 라는 **카드 안쪽 여백**을 베껴 적고 있었다. 그 수를 아는 쪽은 카드다).
14
+ *
15
+ * 1. **자리** — 카드 안쪽 여백에 맞춰 띄운다(`--card-pad`, 기본 19px). 카드가 여백을 고치면 함께 움직인다.
16
+ * 2. **좁은 화면(600px 이하)에서 흐름으로 되돌린다** — 띄운 채로 두면 제목과 그 아랫줄을 덮는다.
17
+ * 문턱이 600 인 것은 이 줄이 대개 250px 안팎이라, 그 아래에서는 제목과 나란히 설 자리가 없어서다.
18
+ * 3. **제 폭을 재어 알린다** — 띄운 줄은 흐름에서 빠져 제목·곁줄을 덮으므로 그만큼 비워 둬야 하는데,
19
+ * 부르는 쪽이 눈대중으로 `padding-right: 260px` 같은 수를 적고 있었다. 잰 폭을 부모에
20
+ * `--section-head-float-w` 로 적으므로, 비울 자리는 `padding-right: calc(var(--section-head-float-w, -12px) + 12px)`
21
+ * 한 줄이면 된다(안 띄운 카드에서는 0 이 된다). 코어 카드(`manager-section`)는 이미 그렇게 해 둔다.
22
+ *
23
+ * 기준점은 **부모가 준다** — 카드에 `position: relative` 가 있어야 한다(코어 카드에는 있다).
24
+ * @public
25
+ */
26
+ export default function SectionHeadFloat({ children, className }) {
27
+ const ref = useRef(null);
28
+ const [부모, set부모] = useState(null);
29
+ useEffect(() => { set부모(ref.current?.parentElement ?? null); }, []);
30
+ useEffect(() => {
31
+ const el = ref.current;
32
+ if (!el || !부모)
33
+ return;
34
+ /* 흐름으로 돌아간 좁은 화면에서는 비울 자리가 없다 — 그때 폭을 적어 두면 제목이 공연히 좁아진다.
35
+ `position` 을 보고 가른다(문턱을 두 군데 적지 않으려고 — CSS 가 정본이다). */
36
+ const 적기 = () => {
37
+ const 띄웠나 = typeof window !== 'undefined' && window.getComputedStyle(el).position === 'absolute';
38
+ const w = 띄웠나 ? Math.ceil(el.getBoundingClientRect().width) : 0;
39
+ if (w > 0)
40
+ 부모.style.setProperty('--section-head-float-w', `${w}px`);
41
+ else
42
+ 부모.style.removeProperty('--section-head-float-w');
43
+ };
44
+ 적기();
45
+ if (typeof ResizeObserver === 'undefined')
46
+ return () => { 부모.style.removeProperty('--section-head-float-w'); };
47
+ /* 줄 자신과 카드를 함께 본다 — 단추 글자가 바뀌면 줄이, 창이 좁아지면 카드가 먼저 움직인다 */
48
+ const 지켜보기 = new ResizeObserver(() => 적기());
49
+ 지켜보기.observe(el);
50
+ 지켜보기.observe(부모);
51
+ return () => { 지켜보기.disconnect(); 부모.style.removeProperty('--section-head-float-w'); };
52
+ }, [부모, children]);
53
+ return _jsx("div", { ref: ref, className: cx('section-head-float', className), children: children });
54
+ }
@@ -498,3 +498,13 @@
498
498
  border-color: var(--color-warn);
499
499
  --button-icon-color: #ffffff;
500
500
  }
501
+
502
+ /* **미리보기를 담는 틀** — `fitHeight` 에 높이를 주면 표가 스스로 두른다.
503
+ 부르는 쪽마다 이 상자를 손수 만들다 보니 같은 규칙이 여러 벌이 됐다(말귀 두 벌, 주석 문장까지
504
+ 같았다 — 2026-09-24). `useFitScale` 이 스케일러의 **부모**를 재므로 이 틀이 곧 그 자다. */
505
+ .word-table__frame {
506
+ display: flex;
507
+ justify-content: center;
508
+ /* 남는 세로를 위아래로 나눈다 — 표가 상자보다 납작할 때 아래로만 쏠려 보이지 않게 */
509
+ align-items: center;
510
+ }
@@ -69,8 +69,23 @@ export interface WordTableProps {
69
69
  };
70
70
  /** 페이지 번호 위치 — 'none'이면 미표시 (기본 'right') */
71
71
  pageNumberPosition?: PageNumberPosition;
72
- /** 컨테이너 높이에도 맞춰 축소한다(세로 용지가 넘쳐 잘리는 것 방지). 부모가 높이 제한 박스여야 한다. */
73
- fitHeight?: boolean;
72
+ /**
73
+ * 정해진 세로 자리에 맞춰 줄인다(세로 용지가 넘쳐 잘리는 것 방지).
74
+ *
75
+ * - **수(px)** — 그 높이의 **담는 틀을 표가 스스로** 두른다. 표는 그 안에서 가로·세로 가운데에
76
+ * 선다. 부르는 쪽은 "이만큼 자리에 맞춰 줄여" 한 마디면 된다.
77
+ * - **`{ wide, narrow }`** — 좁은 화면(767px 이하)에서는 `narrow` 를 쓴다. 좁으면 **폭이 먼저
78
+ * 걸려** 표가 가로에 맞춰 줄고 상자 아래가 비므로, 상자를 그만큼 낮춰 빈 자리를 없앤다
79
+ * (말귀 실측 375px: 320px 상자에 183px 표 — 137px 이 비었다).
80
+ * - **`true`** — 틀을 두르지 않는다. **부모가 높이 제한 박스여야 한다**(예전 동작).
81
+ *
82
+ * 앱마다 이 틀을 손수 만들다 보니 같은 규칙이 여러 벌이 됐다(말귀 두 벌, 주석 문장까지 같았다)
83
+ * — 틀을 여기로 들인 까닭이다(2026-09-24).
84
+ */
85
+ fitHeight?: boolean | number | {
86
+ wide: number;
87
+ narrow: number;
88
+ };
74
89
  }
75
90
  /**
76
91
  * 단어표(표 디자인) — A4 종이를 컨테이너에 맞춰 축소(scale)하고,
@@ -12,6 +12,7 @@ import { getTTSUrlResolver } from '../utils/ttsConfig';
12
12
  import { getImageResolver } from '../utils/imageConfig';
13
13
  import { getPronunciationResolver } from '../utils/pronunciationConfig';
14
14
  import { useWordImage } from '../hooks/useWordImage';
15
+ import useMediaQuery from '../hooks/useMediaQuery';
15
16
  import { isTouchPointer, recentlyTouched, useTouchToggle } from '../hooks/touchToggle';
16
17
  import { WORD_TABLE_PAPER, gridFor, CUT_CLASS, POS_LABEL, WORD_TYPE_LABEL, expandSlashLabel, dotDashStyle, REF_W_BOTH, REF_W_TEXT_ONLY, REF_W_IMAGE_ONLY, REF_H_BOTH, REF_H_TEXT_ONLY, REF_H_IMAGE_ONLY, } from './wordTableLayout';
17
18
  import { useFitScale } from './useFitScale';
@@ -204,6 +205,8 @@ export default function WordTable({ title, titleIcon, disc, className, orientati
204
205
  const isEdit = editCells !== undefined;
205
206
  /** title·titleIcon·disc 중 하나라도 있으면 Section 으로 감싼다 */
206
207
  const wrapped = title != null || !!titleIcon || !!disc;
208
+ /* 틀 높이는 화면 폭에 따라 갈린다 — 훅은 늘 부른다(순서 고정) */
209
+ const 좁은화면 = useMediaQuery('(max-width: 767px)');
207
210
  // 드래그 상태(표시 모드 재정렬)
208
211
  const dragIndex = useRef(null);
209
212
  const [dragOver, setDragOver] = useState(null);
@@ -342,6 +345,10 @@ export default function WordTable({ title, titleIcon, disc, className, orientati
342
345
  window.addEventListener('pointercancel', 뗌);
343
346
  }, [onReorder, 옮기기]);
344
347
  const { width, height } = WORD_TABLE_PAPER[orientation];
348
+ /* 담는 틀의 높이 — 수나 `{ wide, narrow }` 를 주면 표가 그 틀을 스스로 두른다(`true` 는 예전대로 부모 몫) */
349
+ const 틀높이 = typeof fitHeight === 'number' ? fitHeight
350
+ : (fitHeight && typeof fitHeight === 'object') ? (좁은화면 ? fitHeight.narrow : fitHeight.wide)
351
+ : null;
345
352
  // 스케일러 — 용지(width 고정)를 컨테이너 폭에 맞춰 축소 + 가운데 정렬. fitHeight면 높이도 함께 맞춘다.
346
353
  const { scalerRef, scale, offset } = useFitScale(width, fitHeight ? height : undefined);
347
354
  const dataLen = isEdit ? (editCells?.length ?? 0) : (items?.length ?? 0);
@@ -387,8 +394,12 @@ export default function WordTable({ title, titleIcon, disc, className, orientati
387
394
  const isWithinCount = (items?.length ?? 0) + i < cellCount;
388
395
  return (_jsx("div", { className: "word-table-block__card word-table-block__card--filler", children: showFillerAdd && onActivateCell && isWithinCount && (_jsx("div", { style: counterScale, children: _jsx(Button, { htmlType: "button", size: buttonSize, type: "bar", icon: "plus", label: t('wordTable.addWord', '추가하기'), onClick: () => onActivateCell((items?.length ?? 0) + i) }) })) }, `filler-${i}`));
389
396
  })] })), pageNumber && pageNumberPosition !== 'none' && (_jsx("span", { className: `word-table__page-number body-3 word-table__page-number--${pageNumberPosition}`, children: t('wordTable.filter.pageIndicator', { current: pageNumber.current, total: pageNumber.total }) }))] }) }), onReorder && _jsx("span", { role: "status", style: 보이지않게, children: 옮김알림 })] }));
397
+ /* 담는 틀 — 높이를 받은 자리에서만 두른다. `useFitScale` 은 **스케일러의 부모**를 재므로
398
+ 이 틀이 곧 그 자(척도)가 된다. 가운데 맞춤은 남는 세로를 위아래로 나눈다 — 표가 상자보다
399
+ 납작할 때 아래로만 쏠려 보이지 않게. */
400
+ const 담긴것 = 틀높이 == null ? grid : (_jsx("div", { className: "word-table__frame", style: { height: 틀높이 }, children: grid }));
390
401
  if (wrapped) {
391
- return (_jsx(Section, { type: "page", icon: titleIcon, title: title, disc: disc, className: cx('word-table-block', className), children: grid }));
402
+ return (_jsx(Section, { type: "page", icon: titleIcon, title: title, disc: disc, className: cx('word-table-block', className), children: 담긴것 }));
392
403
  }
393
- return grid;
404
+ return 담긴것;
394
405
  }
@@ -139,11 +139,13 @@ export type { DatePickerProps } from './components/DatePicker';
139
139
  export { useCalendarMonth } from './components/useCalendarMonth';
140
140
  export type { UseCalendarMonthResult } from './components/useCalendarMonth';
141
141
  export { default as BarChart, BarChartControls } from './components/BarChart';
142
+ export { default as LineChart, LINE_CHART_HOVER_DELAY_MS } from './components/LineChart';
142
143
  export { useBarChartControl } from './components/useBarChartControl';
143
144
  export { buildMonthChartData } from './components/barChartData';
144
145
  export { getControlDateRange } from './components/barChartTypes';
145
146
  export type { ControlDateRange } from './components/barChartTypes';
146
147
  export type { BarChartProps, BarChartControl, BarChartSize, BarData, MonthBarData, ChartPoint } from './components/BarChart';
148
+ export type { LineChartProps, LineChartPoint, LineChartScales } from './components/LineChart';
147
149
  export { default as RingChart } from './components/RingChart';
148
150
  export type { RingChartProps, RingChartSize, RingChartSegment } from './components/RingChart';
149
151
  export { default as ChartSection, ChartTotal, ChartLegend } from './components/ChartSection';
@@ -298,7 +300,9 @@ export type { PopupProps, PopupOptions, PopupButtonConfig } from './components/P
298
300
  export { default as Panel, PanelRow, PanelGrid, PanelRowDevice } from './components/Panel';
299
301
  export type { PanelRowToggle, PanelRowSegmented, DropdownItem, PanelRowDropdown, PanelRowDeviceProps } from './components/Panel';
300
302
  export { default as Section } from './components/Section';
303
+ export { default as SectionHeadFloat } from './components/SectionHeadFloat';
301
304
  export type { SectionProps, SectionType } from './components/Section';
305
+ export type { SectionHeadFloatProps } from './components/SectionHeadFloat';
302
306
  export { default as Pagination } from './components/Pagination';
303
307
  export { default as SummaryStrip } from './components/SummaryStrip';
304
308
  export type { SummaryStripProps, SummaryStripItem } from './components/SummaryStrip';
@@ -90,6 +90,7 @@ export { default as BulkBar } from './components/BulkBar';
90
90
  export { default as DatePicker } from './components/DatePicker';
91
91
  export { useCalendarMonth } from './components/useCalendarMonth';
92
92
  export { default as BarChart, BarChartControls } from './components/BarChart';
93
+ export { default as LineChart, LINE_CHART_HOVER_DELAY_MS } from './components/LineChart';
93
94
  export { useBarChartControl } from './components/useBarChartControl';
94
95
  export { buildMonthChartData } from './components/barChartData';
95
96
  export { getControlDateRange } from './components/barChartTypes';
@@ -234,6 +235,7 @@ export { MediaQueryOverrideContext } from './hooks/useMediaQuery';
234
235
  export { default as Popup } from './components/Popup/Popup';
235
236
  export { default as Panel, PanelRow, PanelGrid, PanelRowDevice } from './components/Panel';
236
237
  export { default as Section } from './components/Section';
238
+ export { default as SectionHeadFloat } from './components/SectionHeadFloat';
237
239
  export { default as Pagination } from './components/Pagination';
238
240
  export { default as SummaryStrip } from './components/SummaryStrip';
239
241
  export { default as ReportDocument } from './components/Report/ReportDocument';
@@ -46,4 +46,4 @@
46
46
  *
47
47
  * 값은 손으로 적고 `test/coreVersion.test.ts` 가 package.json 과 어긋나면 운다.
48
48
  */
49
- export declare const CORE_VERSION = "0.187.0";
49
+ export declare const CORE_VERSION = "0.189.0";
@@ -46,4 +46,4 @@
46
46
  *
47
47
  * 값은 손으로 적고 `test/coreVersion.test.ts` 가 package.json 과 어긋나면 운다.
48
48
  */
49
- export const CORE_VERSION = '0.187.0';
49
+ export const CORE_VERSION = '0.189.0';