@m1kapp/kit 0.0.44 → 0.0.45

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/dist/index.d.mts CHANGED
@@ -774,13 +774,20 @@ type AvatarSize = "xs" | "sm" | "md" | "lg" | "xl";
774
774
  type AvatarShape = "circle" | "rounded";
775
775
  interface AvatarProps {
776
776
  src?: string;
777
+ /**
778
+ * 순서대로 시도할 후보 URL 목록. 첫 장이 죽으면 다음 장으로 넘어가고,
779
+ * 전부 실패해야 이니셜 폴백이 뜬다. src 보다 우선한다.
780
+ */
781
+ candidates?: string[];
777
782
  fallback: string;
778
783
  size?: AvatarSize;
779
784
  shape?: AvatarShape;
780
785
  color?: string;
786
+ /** 그라데이션 링. 프로필·계정 아바타를 눈에 띄게 세울 때. */
787
+ ring?: boolean;
781
788
  className?: string;
782
789
  }
783
- declare function Avatar({ src, fallback, size, shape, color, className, }: AvatarProps): react_jsx_runtime.JSX.Element;
790
+ declare function Avatar({ src, candidates, fallback, size, shape, color, ring, className, }: AvatarProps): react_jsx_runtime.JSX.Element;
784
791
 
785
792
  type BadgeVariant = "default" | "green" | "red" | "yellow" | "blue" | "purple" | "orange";
786
793
  type BadgeSize = "sm" | "md";
@@ -1588,6 +1595,103 @@ interface CarouselProps {
1588
1595
  */
1589
1596
  declare function Carousel({ count, index, onChange, children, loop, showArrows, showDots, accent, className, }: CarouselProps): react_jsx_runtime.JSX.Element;
1590
1597
 
1598
+ interface EvidenceDialogProps {
1599
+ open: boolean;
1600
+ onClose: () => void;
1601
+ /** 어느 항목의 근거인지 — 다이얼로그 제목. 예: "카카오 → SM" */
1602
+ heading?: string;
1603
+ /** 그 값 자체. 예: "인수금액 1.25조 원 · 지분 39.9%" */
1604
+ title: ReactNode;
1605
+ /** 원문에서 그 값이 나온 대목(인용). */
1606
+ quote?: ReactNode;
1607
+ /** 그 값을 그대로 믿기 전에 알아야 할 것. */
1608
+ note?: ReactNode;
1609
+ /** 원문 주소. */
1610
+ source?: string;
1611
+ /** 원문 링크 라벨. 기본: 그림이 있으면 "원문 ↗", 없으면 "그 값이 적힌 원문 ↗" */
1612
+ sourceLabel?: string;
1613
+ /** 그 값이 적힌 자리를 찍은 그림. */
1614
+ imageSrc?: string;
1615
+ imageAlt?: string;
1616
+ /** 그림도 주소도 없을 때 대신 보일 말. 기본: "원문 그림이 아직 없다" */
1617
+ emptyLabel?: string;
1618
+ }
1619
+ /**
1620
+ * 숫자 하나의 근거. 값을 눌렀을 때 인용문·캡처 그림·원문 링크가 뜬다.
1621
+ *
1622
+ * "이 숫자 어디서 왔나"를 화면에서 바로 보여 주는 증거 기반 앱들의 공통 골격 —
1623
+ * nlnn 의 값 다이얼로그, median-income-calc 의 정확도 안내가 전부 이 모양이었다.
1624
+ * 링크만 걸어 두면 원문이 바뀌거나 사라졌을 때 무엇을 보고 적었는지 알 길이
1625
+ * 없으므로, 그림(캡처)을 함께 두는 것을 권한다.
1626
+ */
1627
+ declare function EvidenceDialog({ open, onClose, heading, title, quote, note, source, sourceLabel, imageSrc, imageAlt, emptyLabel, }: EvidenceDialogProps): react_jsx_runtime.JSX.Element;
1628
+
1629
+ interface ColumnDatum {
1630
+ /** 축 라벨. weekday 를 켜면 ISO 날짜("2026-09-03")로 요일을 그린다. */
1631
+ label: string;
1632
+ value: number;
1633
+ /** 이 막대만 다른 색. */
1634
+ color?: string;
1635
+ /** 아직 오지 않은 구간(예측). 반투명하게 그리고 경계에 점선을 세운다. */
1636
+ projected?: boolean;
1637
+ }
1638
+ interface ColumnChartProps {
1639
+ data: ColumnDatum[];
1640
+ /** 막대 색. 기본: var(--kit-accent) */
1641
+ color?: string;
1642
+ /** 실측 구간 평균에 점선을 긋는다. */
1643
+ showAverage?: boolean;
1644
+ averageLabel?: string;
1645
+ /** 평균·타이틀 표기용 포맷터. */
1646
+ format?: (n: number) => string;
1647
+ /** 축 라벨을 "일 + 요일 첫 글자"로 그린다(label 이 ISO 날짜일 때). */
1648
+ weekday?: boolean;
1649
+ /** 예측 경계 라벨. 기본: "예상 →" */
1650
+ projectedLabel?: string;
1651
+ height?: number;
1652
+ className?: string;
1653
+ }
1654
+ /** 세로 막대 + 평균선 + 예측 구간. 일별·주별 사용량류에 맞다. */
1655
+ declare function ColumnChart({ data, color, showAverage, averageLabel, format, weekday, projectedLabel, height, className, }: ColumnChartProps): react_jsx_runtime.JSX.Element | null;
1656
+ interface DuoBarSide {
1657
+ value: number;
1658
+ label: string;
1659
+ color: string;
1660
+ }
1661
+ interface DuoBarProps {
1662
+ /** 위에 서는 제목. 오른쪽에 합계가 붙는다. */
1663
+ title?: string;
1664
+ a: DuoBarSide;
1665
+ b: DuoBarSide;
1666
+ format?: (n: number) => string;
1667
+ className?: string;
1668
+ }
1669
+ /** 두 값의 비율 스택 바 + 하단 범례. 입력/출력·모바일/데스크톱 같은 2분할에. */
1670
+ declare function DuoBar({ title, a, b, format, className }: DuoBarProps): react_jsx_runtime.JSX.Element;
1671
+ interface CumulativeCurveProps {
1672
+ /** 일별 증가량(누적이 아니라 그날 값). */
1673
+ daily: {
1674
+ date: string;
1675
+ count: number;
1676
+ }[];
1677
+ /** 지금까지의 총합 — 마일스톤 달성 판정에 쓴다. */
1678
+ total: number;
1679
+ /** 오늘 값이 있으면 끝점에 라이브 점을 찍는다. */
1680
+ todayCount?: number;
1681
+ /** 곡선·면적 색. */
1682
+ accent?: string;
1683
+ /** 교차점 배지를 세울 마일스톤. */
1684
+ milestones?: {
1685
+ value: number;
1686
+ label: string;
1687
+ }[];
1688
+ /** 데이터가 없을 때 보일 말. */
1689
+ empty?: React.ReactNode;
1690
+ className?: string;
1691
+ }
1692
+ /** 누적 성장 곡선 + 마일스톤 배지 + 다음 목표선. 방문자·판매·적립 총량류에. */
1693
+ declare function CumulativeCurve({ daily, total, todayCount, accent, milestones, empty, className, }: CumulativeCurveProps): react_jsx_runtime.JSX.Element | null;
1694
+
1591
1695
  type PWAInstallState = "android-ready" | "ios-safari" | "installed" | "unsupported";
1592
1696
  interface UsePWAInstallReturn {
1593
1697
  state: PWAInstallState;
@@ -1632,6 +1736,28 @@ interface PWAInstallButtonProps {
1632
1736
  */
1633
1737
  declare function PWAInstallButton({ appName, iconSrc, label, installedLabel, className, }: PWAInstallButtonProps): react_jsx_runtime.JSX.Element | null;
1634
1738
 
1739
+ declare function markTabNavigation(): void;
1740
+ /**
1741
+ * 뒤로가기 스크롤 복원 (Next 전용 — usePathname/useSearchParams 를 쓴다).
1742
+ *
1743
+ * AppShell 앱의 스크롤은 window 가 아니라 AppShellContent 의 내부 컨테이너
1744
+ * (`.tab-scroll`)에서 일어나서 브라우저 기본 복원이 안 먹는다 — URL 별 스크롤
1745
+ * 위치를 sessionStorage 에 저장해 두고 다시 그 URL 로 돌아오면 되돌린다.
1746
+ * 레이아웃에 한 번 두면 된다: `<Suspense><ScrollRestorer /></Suspense>`
1747
+ * (useSearchParams 때문에 Suspense 경계가 필요하다).
1748
+ *
1749
+ * 까다로운 점: 목록에서 상세(다른 레이아웃)로 갔다 돌아오면 컨테이너가 통째로
1750
+ * 새로 생기는데, 그 순간엔 목록이 아직 덜 그려져 높이가 부족하다. 그냥 scrollTop 을
1751
+ * 한 번 넣으면 잘려서(클램프) 맨 위로 튄다. 그래서 콘텐츠가 목표 높이에 도달할
1752
+ * 때까지 짧게 재시도하고(ResizeObserver + rAF), 복원 중엔 저장을 멈춘다(잘린
1753
+ * 위치가 좋은 값을 덮어쓰지 않도록). 사용자가 실제로 스크롤하면 즉시 포기한다.
1754
+ *
1755
+ * ytcc 에서 실전 검증된 코드를 그대로 올렸다.
1756
+ */
1757
+ declare function ScrollRestorer({ selector }: {
1758
+ selector?: string;
1759
+ }): null;
1760
+
1635
1761
  /**
1636
1762
  * Drop into <head> in your root layout to pre-load kit styles and
1637
1763
  * prevent the JS injection from re-running (eliminates FOUC).
@@ -1778,6 +1904,48 @@ interface UsePollingResult<T> {
1778
1904
  }
1779
1905
  declare function usePolling<T>(fetcher: () => Promise<T>, options?: UsePollingOptions<T>): UsePollingResult<T>;
1780
1906
 
1907
+ /** epoch → 한국 시각의 달력 부분을 UTC 게터(getUTCFullYear 등)로 읽을 수 있는 Date */
1908
+ declare function toKst(ms?: number): Date;
1909
+ /** 그 시각이 속한 한국 날짜의 00:00 epoch */
1910
+ declare function kstMidnight(ms?: number): number;
1911
+ /** 한국 기준 오늘 날짜 "2026-09-03" */
1912
+ declare function kstToday(ms?: number): string;
1913
+ /** 한국 시각 파츠 — { date: "2026-09-03", weekday: "수", hhmm: "14:05" } */
1914
+ declare function kstNowParts(ms?: number): {
1915
+ date: string;
1916
+ weekday: string;
1917
+ hhmm: string;
1918
+ };
1919
+ /** epoch → 한국 기준 '일' 숫자 (날짜 스트립용) */
1920
+ declare function kstDayOfMonth(ms: number): number;
1921
+ /** 그 시각이 한국 기준 오늘인가 */
1922
+ declare function isKstToday(ms: number, now?: number): boolean;
1923
+ /** 이번주(월~일, 한국 달력) 시작 epoch — 이번주 월요일 00:00. weeksAgo=1 이면 지난주 */
1924
+ declare function startOfKstWeek(weeksAgo?: number, now?: number): number;
1925
+ /** weeksAgo → "7.6(월) ~ 7.12(일)" 주차 라벨 — 클라이언트·서버 공용 */
1926
+ declare function kstWeekLabel(weeksAgo?: number, now?: number): string;
1927
+ /** 그 주 월요일 시작 epoch → ISO 8601 { year, week }. 목요일이 속한 해가 ISO 연도 */
1928
+ declare function isoWeekOfStart(start: number): {
1929
+ year: number;
1930
+ week: number;
1931
+ };
1932
+ /** weeksAgo → "2026년 28주차" (ISO 8601 주번호) */
1933
+ declare function kstWeekTitle(weeksAgo?: number, now?: number): string;
1934
+ /** weeksAgo → URL 용 주차 키 "2026-28" */
1935
+ declare function kstWeekParam(weeksAgo?: number, now?: number): string;
1936
+ /** "2026-28" 주차 키 → weeksAgo. 형식이 안 맞으면 null */
1937
+ declare function weeksAgoFromKstWeekParam(param: string | null | undefined, now?: number): number | null;
1938
+
1939
+ /** 한글 음절을 초성으로 — "셀토스" → "ㅅㅌㅅ". 한글이 아니면 그대로 둔다. */
1940
+ declare function toChoseong(text: string): string;
1941
+ /**
1942
+ * 이름·브랜드를 부분일치로 찾는다. 질의가 초성만이면 초성끼리 비교한다.
1943
+ * 공백·점·하이픈은 무시한다. 빈 질의는 전부 통과.
1944
+ *
1945
+ * items.filter((c) => matchesQuery(q, c.name, c.brand, c.english))
1946
+ */
1947
+ declare function matchesQuery(query: string, ...fields: (string | undefined)[]): boolean;
1948
+
1781
1949
  declare function relativeTime(date: Date | string | number): string;
1782
1950
  declare function formatNumber(n: number): string;
1783
1951
  declare function formatPrice(amount: number, currency?: string, locale?: string): string;
@@ -1853,4 +2021,4 @@ declare function watermarkTint(accentHex: string, { saturation, lightness }?: {
1853
2021
  lightness?: number | undefined;
1854
2022
  }): string;
1855
2023
 
1856
- export { APP_SHELL_HEADER_HEIGHT, ActionCard, type ActionCardLabels, type ActionCardProps, type ActionCardState, type ApiClient, type ApiClientOptions, ApiError, AppShell, AppShellContent, type AppShellContentProps, AppShellHeader, type AppShellHeaderProps, type AppShellProps, AsyncList, type AsyncListProps, type AsyncListStatus, Avatar, type AvatarProps, Badge, type BadgeProps, BarList, type BarListItem, type BarListProps, Button, type ButtonProps, Carousel, type CarouselProps, ChatBubble, type ChatBubbleProps, type ChatMessage, type ChatRole, CodeBlock, type CodeBlockProps, Collapsible, type CollapsibleProps, type ColorName, ColorPicker, type ColorPickerProps, CopyButton, type CopyButtonProps, Countdown, type CountdownLabels, type CountdownProps, type DateCount, type DayGroup, Dialog, type DialogProps, Divider, type DividerProps, EmojiButton, type EmojiButtonProps, EmojiPicker, type EmojiPickerLabels, type EmojiPickerProps, EmptyState, type EmptyStateProps, Fab, type FabProps, FetchProgress, type FetchProgressProps, Field, type FieldProps, FontLinks, type FontName, GrassMap, type GrassMapData, type GrassMapLabels, type GrassMapProps, IOSInstallSheet, IconButton, type IconButtonProps, Img, type ImgProps, InAppSheet, type InAppSheetProps, InlineEdit, type InlineEditProps, Input, type InputProps, type IsoDuration, KitStyles, LinkifiedText, type LinkifiedTextProps, ListRow, type ListRowProps, MediaCard, type MediaCardProps, MessageList, type MessageListProps, PWAInstallButton, type PWAInstallState, PoweredByKit, type PoweredByKitProps, ProgressRing, type ProgressRingProps, Section, SectionHeader, type SectionHeaderProps, type SectionProps, type SegmentOption, SegmentedControl, type SegmentedControlProps, Select, type SelectOption, type SelectProps, ShareButton, type ShareButtonProps, Skeleton, type SkeletonProps, StatChip, type StatChipProps, type Step, Stepper, type StepperProps, Switch, type SwitchProps, THEME_SCRIPT, Tab, TabBar, type TabBarProps, type TabProps, type TabRootProps, Textarea, type TextareaProps, ThemeButton, type ThemeButtonProps, ThemeDialog, type ThemeDialogLabels, type ThemeDialogProps, type ToastOptions, ToastProvider, type ToastVariant, Tooltip, type TooltipProps, Typewriter, type TypewriterProps, TypingIndicator, type TypingIndicatorProps, type UnderlineTab, UnderlineTabs, type UnderlineTabsProps, type UseFetchOptions, type UseFetchResult, type UseFormSubmitOptions, type UseFormSubmitResult, type UseInViewOptions, type UseInViewResult, type UsePWAInstallReturn, type UsePollingOptions, type UsePollingResult, type UseShareOptions, type UseShareReturn, Watermark, type WatermarkProps, type WatermarkSponsor, clearFetchCache, cn, colors, createApiClient, createManifest, fillDateSeries, fontFamily, fonts, formatDayLabel, formatDollarEok, formatDuration, formatKoreanNumber, formatNumber, formatPrice, formatWon, formatWonTight, getFetchActiveCount, groupByDay, invalidateFetch, isoDurationToSec, mobileViewport, parseIsoDuration, particle, postJson, relativeTime, subscribeFetchActivity, svgIcon, useCopy, useDebounce, useEscapeKey, useFetch, useFocusTrap, useFormSubmit, useImageLoader, useInView, useLocalStorage, usePWAInstall, usePolling, usePortalTarget, useScrollLock, useShare, useToast, watermarkTint, withParticle };
2024
+ export { APP_SHELL_HEADER_HEIGHT, ActionCard, type ActionCardLabels, type ActionCardProps, type ActionCardState, type ApiClient, type ApiClientOptions, ApiError, AppShell, AppShellContent, type AppShellContentProps, AppShellHeader, type AppShellHeaderProps, type AppShellProps, AsyncList, type AsyncListProps, type AsyncListStatus, Avatar, type AvatarProps, Badge, type BadgeProps, BarList, type BarListItem, type BarListProps, Button, type ButtonProps, Carousel, type CarouselProps, ChatBubble, type ChatBubbleProps, type ChatMessage, type ChatRole, CodeBlock, type CodeBlockProps, Collapsible, type CollapsibleProps, type ColorName, ColorPicker, type ColorPickerProps, ColumnChart, type ColumnChartProps, type ColumnDatum, CopyButton, type CopyButtonProps, Countdown, type CountdownLabels, type CountdownProps, CumulativeCurve, type CumulativeCurveProps, type DateCount, type DayGroup, Dialog, type DialogProps, Divider, type DividerProps, DuoBar, type DuoBarProps, type DuoBarSide, EmojiButton, type EmojiButtonProps, EmojiPicker, type EmojiPickerLabels, type EmojiPickerProps, EmptyState, type EmptyStateProps, EvidenceDialog, type EvidenceDialogProps, Fab, type FabProps, FetchProgress, type FetchProgressProps, Field, type FieldProps, FontLinks, type FontName, GrassMap, type GrassMapData, type GrassMapLabels, type GrassMapProps, IOSInstallSheet, IconButton, type IconButtonProps, Img, type ImgProps, InAppSheet, type InAppSheetProps, InlineEdit, type InlineEditProps, Input, type InputProps, type IsoDuration, KitStyles, LinkifiedText, type LinkifiedTextProps, ListRow, type ListRowProps, MediaCard, type MediaCardProps, MessageList, type MessageListProps, PWAInstallButton, type PWAInstallState, PoweredByKit, type PoweredByKitProps, ProgressRing, type ProgressRingProps, ScrollRestorer, Section, SectionHeader, type SectionHeaderProps, type SectionProps, type SegmentOption, SegmentedControl, type SegmentedControlProps, Select, type SelectOption, type SelectProps, ShareButton, type ShareButtonProps, Skeleton, type SkeletonProps, StatChip, type StatChipProps, type Step, Stepper, type StepperProps, Switch, type SwitchProps, THEME_SCRIPT, Tab, TabBar, type TabBarProps, type TabProps, type TabRootProps, Textarea, type TextareaProps, ThemeButton, type ThemeButtonProps, ThemeDialog, type ThemeDialogLabels, type ThemeDialogProps, type ToastOptions, ToastProvider, type ToastVariant, Tooltip, type TooltipProps, Typewriter, type TypewriterProps, TypingIndicator, type TypingIndicatorProps, type UnderlineTab, UnderlineTabs, type UnderlineTabsProps, type UseFetchOptions, type UseFetchResult, type UseFormSubmitOptions, type UseFormSubmitResult, type UseInViewOptions, type UseInViewResult, type UsePWAInstallReturn, type UsePollingOptions, type UsePollingResult, type UseShareOptions, type UseShareReturn, Watermark, type WatermarkProps, type WatermarkSponsor, clearFetchCache, cn, colors, createApiClient, createManifest, fillDateSeries, fontFamily, fonts, formatDayLabel, formatDollarEok, formatDuration, formatKoreanNumber, formatNumber, formatPrice, formatWon, formatWonTight, getFetchActiveCount, groupByDay, invalidateFetch, isKstToday, isoDurationToSec, isoWeekOfStart, kstDayOfMonth, kstMidnight, kstNowParts, kstToday, kstWeekLabel, kstWeekParam, kstWeekTitle, markTabNavigation, matchesQuery, mobileViewport, parseIsoDuration, particle, postJson, relativeTime, startOfKstWeek, subscribeFetchActivity, svgIcon, toChoseong, toKst, useCopy, useDebounce, useEscapeKey, useFetch, useFocusTrap, useFormSubmit, useImageLoader, useInView, useLocalStorage, usePWAInstall, usePolling, usePortalTarget, useScrollLock, useShare, useToast, watermarkTint, weeksAgoFromKstWeekParam, withParticle };
package/dist/index.d.ts CHANGED
@@ -774,13 +774,20 @@ type AvatarSize = "xs" | "sm" | "md" | "lg" | "xl";
774
774
  type AvatarShape = "circle" | "rounded";
775
775
  interface AvatarProps {
776
776
  src?: string;
777
+ /**
778
+ * 순서대로 시도할 후보 URL 목록. 첫 장이 죽으면 다음 장으로 넘어가고,
779
+ * 전부 실패해야 이니셜 폴백이 뜬다. src 보다 우선한다.
780
+ */
781
+ candidates?: string[];
777
782
  fallback: string;
778
783
  size?: AvatarSize;
779
784
  shape?: AvatarShape;
780
785
  color?: string;
786
+ /** 그라데이션 링. 프로필·계정 아바타를 눈에 띄게 세울 때. */
787
+ ring?: boolean;
781
788
  className?: string;
782
789
  }
783
- declare function Avatar({ src, fallback, size, shape, color, className, }: AvatarProps): react_jsx_runtime.JSX.Element;
790
+ declare function Avatar({ src, candidates, fallback, size, shape, color, ring, className, }: AvatarProps): react_jsx_runtime.JSX.Element;
784
791
 
785
792
  type BadgeVariant = "default" | "green" | "red" | "yellow" | "blue" | "purple" | "orange";
786
793
  type BadgeSize = "sm" | "md";
@@ -1588,6 +1595,103 @@ interface CarouselProps {
1588
1595
  */
1589
1596
  declare function Carousel({ count, index, onChange, children, loop, showArrows, showDots, accent, className, }: CarouselProps): react_jsx_runtime.JSX.Element;
1590
1597
 
1598
+ interface EvidenceDialogProps {
1599
+ open: boolean;
1600
+ onClose: () => void;
1601
+ /** 어느 항목의 근거인지 — 다이얼로그 제목. 예: "카카오 → SM" */
1602
+ heading?: string;
1603
+ /** 그 값 자체. 예: "인수금액 1.25조 원 · 지분 39.9%" */
1604
+ title: ReactNode;
1605
+ /** 원문에서 그 값이 나온 대목(인용). */
1606
+ quote?: ReactNode;
1607
+ /** 그 값을 그대로 믿기 전에 알아야 할 것. */
1608
+ note?: ReactNode;
1609
+ /** 원문 주소. */
1610
+ source?: string;
1611
+ /** 원문 링크 라벨. 기본: 그림이 있으면 "원문 ↗", 없으면 "그 값이 적힌 원문 ↗" */
1612
+ sourceLabel?: string;
1613
+ /** 그 값이 적힌 자리를 찍은 그림. */
1614
+ imageSrc?: string;
1615
+ imageAlt?: string;
1616
+ /** 그림도 주소도 없을 때 대신 보일 말. 기본: "원문 그림이 아직 없다" */
1617
+ emptyLabel?: string;
1618
+ }
1619
+ /**
1620
+ * 숫자 하나의 근거. 값을 눌렀을 때 인용문·캡처 그림·원문 링크가 뜬다.
1621
+ *
1622
+ * "이 숫자 어디서 왔나"를 화면에서 바로 보여 주는 증거 기반 앱들의 공통 골격 —
1623
+ * nlnn 의 값 다이얼로그, median-income-calc 의 정확도 안내가 전부 이 모양이었다.
1624
+ * 링크만 걸어 두면 원문이 바뀌거나 사라졌을 때 무엇을 보고 적었는지 알 길이
1625
+ * 없으므로, 그림(캡처)을 함께 두는 것을 권한다.
1626
+ */
1627
+ declare function EvidenceDialog({ open, onClose, heading, title, quote, note, source, sourceLabel, imageSrc, imageAlt, emptyLabel, }: EvidenceDialogProps): react_jsx_runtime.JSX.Element;
1628
+
1629
+ interface ColumnDatum {
1630
+ /** 축 라벨. weekday 를 켜면 ISO 날짜("2026-09-03")로 요일을 그린다. */
1631
+ label: string;
1632
+ value: number;
1633
+ /** 이 막대만 다른 색. */
1634
+ color?: string;
1635
+ /** 아직 오지 않은 구간(예측). 반투명하게 그리고 경계에 점선을 세운다. */
1636
+ projected?: boolean;
1637
+ }
1638
+ interface ColumnChartProps {
1639
+ data: ColumnDatum[];
1640
+ /** 막대 색. 기본: var(--kit-accent) */
1641
+ color?: string;
1642
+ /** 실측 구간 평균에 점선을 긋는다. */
1643
+ showAverage?: boolean;
1644
+ averageLabel?: string;
1645
+ /** 평균·타이틀 표기용 포맷터. */
1646
+ format?: (n: number) => string;
1647
+ /** 축 라벨을 "일 + 요일 첫 글자"로 그린다(label 이 ISO 날짜일 때). */
1648
+ weekday?: boolean;
1649
+ /** 예측 경계 라벨. 기본: "예상 →" */
1650
+ projectedLabel?: string;
1651
+ height?: number;
1652
+ className?: string;
1653
+ }
1654
+ /** 세로 막대 + 평균선 + 예측 구간. 일별·주별 사용량류에 맞다. */
1655
+ declare function ColumnChart({ data, color, showAverage, averageLabel, format, weekday, projectedLabel, height, className, }: ColumnChartProps): react_jsx_runtime.JSX.Element | null;
1656
+ interface DuoBarSide {
1657
+ value: number;
1658
+ label: string;
1659
+ color: string;
1660
+ }
1661
+ interface DuoBarProps {
1662
+ /** 위에 서는 제목. 오른쪽에 합계가 붙는다. */
1663
+ title?: string;
1664
+ a: DuoBarSide;
1665
+ b: DuoBarSide;
1666
+ format?: (n: number) => string;
1667
+ className?: string;
1668
+ }
1669
+ /** 두 값의 비율 스택 바 + 하단 범례. 입력/출력·모바일/데스크톱 같은 2분할에. */
1670
+ declare function DuoBar({ title, a, b, format, className }: DuoBarProps): react_jsx_runtime.JSX.Element;
1671
+ interface CumulativeCurveProps {
1672
+ /** 일별 증가량(누적이 아니라 그날 값). */
1673
+ daily: {
1674
+ date: string;
1675
+ count: number;
1676
+ }[];
1677
+ /** 지금까지의 총합 — 마일스톤 달성 판정에 쓴다. */
1678
+ total: number;
1679
+ /** 오늘 값이 있으면 끝점에 라이브 점을 찍는다. */
1680
+ todayCount?: number;
1681
+ /** 곡선·면적 색. */
1682
+ accent?: string;
1683
+ /** 교차점 배지를 세울 마일스톤. */
1684
+ milestones?: {
1685
+ value: number;
1686
+ label: string;
1687
+ }[];
1688
+ /** 데이터가 없을 때 보일 말. */
1689
+ empty?: React.ReactNode;
1690
+ className?: string;
1691
+ }
1692
+ /** 누적 성장 곡선 + 마일스톤 배지 + 다음 목표선. 방문자·판매·적립 총량류에. */
1693
+ declare function CumulativeCurve({ daily, total, todayCount, accent, milestones, empty, className, }: CumulativeCurveProps): react_jsx_runtime.JSX.Element | null;
1694
+
1591
1695
  type PWAInstallState = "android-ready" | "ios-safari" | "installed" | "unsupported";
1592
1696
  interface UsePWAInstallReturn {
1593
1697
  state: PWAInstallState;
@@ -1632,6 +1736,28 @@ interface PWAInstallButtonProps {
1632
1736
  */
1633
1737
  declare function PWAInstallButton({ appName, iconSrc, label, installedLabel, className, }: PWAInstallButtonProps): react_jsx_runtime.JSX.Element | null;
1634
1738
 
1739
+ declare function markTabNavigation(): void;
1740
+ /**
1741
+ * 뒤로가기 스크롤 복원 (Next 전용 — usePathname/useSearchParams 를 쓴다).
1742
+ *
1743
+ * AppShell 앱의 스크롤은 window 가 아니라 AppShellContent 의 내부 컨테이너
1744
+ * (`.tab-scroll`)에서 일어나서 브라우저 기본 복원이 안 먹는다 — URL 별 스크롤
1745
+ * 위치를 sessionStorage 에 저장해 두고 다시 그 URL 로 돌아오면 되돌린다.
1746
+ * 레이아웃에 한 번 두면 된다: `<Suspense><ScrollRestorer /></Suspense>`
1747
+ * (useSearchParams 때문에 Suspense 경계가 필요하다).
1748
+ *
1749
+ * 까다로운 점: 목록에서 상세(다른 레이아웃)로 갔다 돌아오면 컨테이너가 통째로
1750
+ * 새로 생기는데, 그 순간엔 목록이 아직 덜 그려져 높이가 부족하다. 그냥 scrollTop 을
1751
+ * 한 번 넣으면 잘려서(클램프) 맨 위로 튄다. 그래서 콘텐츠가 목표 높이에 도달할
1752
+ * 때까지 짧게 재시도하고(ResizeObserver + rAF), 복원 중엔 저장을 멈춘다(잘린
1753
+ * 위치가 좋은 값을 덮어쓰지 않도록). 사용자가 실제로 스크롤하면 즉시 포기한다.
1754
+ *
1755
+ * ytcc 에서 실전 검증된 코드를 그대로 올렸다.
1756
+ */
1757
+ declare function ScrollRestorer({ selector }: {
1758
+ selector?: string;
1759
+ }): null;
1760
+
1635
1761
  /**
1636
1762
  * Drop into <head> in your root layout to pre-load kit styles and
1637
1763
  * prevent the JS injection from re-running (eliminates FOUC).
@@ -1778,6 +1904,48 @@ interface UsePollingResult<T> {
1778
1904
  }
1779
1905
  declare function usePolling<T>(fetcher: () => Promise<T>, options?: UsePollingOptions<T>): UsePollingResult<T>;
1780
1906
 
1907
+ /** epoch → 한국 시각의 달력 부분을 UTC 게터(getUTCFullYear 등)로 읽을 수 있는 Date */
1908
+ declare function toKst(ms?: number): Date;
1909
+ /** 그 시각이 속한 한국 날짜의 00:00 epoch */
1910
+ declare function kstMidnight(ms?: number): number;
1911
+ /** 한국 기준 오늘 날짜 "2026-09-03" */
1912
+ declare function kstToday(ms?: number): string;
1913
+ /** 한국 시각 파츠 — { date: "2026-09-03", weekday: "수", hhmm: "14:05" } */
1914
+ declare function kstNowParts(ms?: number): {
1915
+ date: string;
1916
+ weekday: string;
1917
+ hhmm: string;
1918
+ };
1919
+ /** epoch → 한국 기준 '일' 숫자 (날짜 스트립용) */
1920
+ declare function kstDayOfMonth(ms: number): number;
1921
+ /** 그 시각이 한국 기준 오늘인가 */
1922
+ declare function isKstToday(ms: number, now?: number): boolean;
1923
+ /** 이번주(월~일, 한국 달력) 시작 epoch — 이번주 월요일 00:00. weeksAgo=1 이면 지난주 */
1924
+ declare function startOfKstWeek(weeksAgo?: number, now?: number): number;
1925
+ /** weeksAgo → "7.6(월) ~ 7.12(일)" 주차 라벨 — 클라이언트·서버 공용 */
1926
+ declare function kstWeekLabel(weeksAgo?: number, now?: number): string;
1927
+ /** 그 주 월요일 시작 epoch → ISO 8601 { year, week }. 목요일이 속한 해가 ISO 연도 */
1928
+ declare function isoWeekOfStart(start: number): {
1929
+ year: number;
1930
+ week: number;
1931
+ };
1932
+ /** weeksAgo → "2026년 28주차" (ISO 8601 주번호) */
1933
+ declare function kstWeekTitle(weeksAgo?: number, now?: number): string;
1934
+ /** weeksAgo → URL 용 주차 키 "2026-28" */
1935
+ declare function kstWeekParam(weeksAgo?: number, now?: number): string;
1936
+ /** "2026-28" 주차 키 → weeksAgo. 형식이 안 맞으면 null */
1937
+ declare function weeksAgoFromKstWeekParam(param: string | null | undefined, now?: number): number | null;
1938
+
1939
+ /** 한글 음절을 초성으로 — "셀토스" → "ㅅㅌㅅ". 한글이 아니면 그대로 둔다. */
1940
+ declare function toChoseong(text: string): string;
1941
+ /**
1942
+ * 이름·브랜드를 부분일치로 찾는다. 질의가 초성만이면 초성끼리 비교한다.
1943
+ * 공백·점·하이픈은 무시한다. 빈 질의는 전부 통과.
1944
+ *
1945
+ * items.filter((c) => matchesQuery(q, c.name, c.brand, c.english))
1946
+ */
1947
+ declare function matchesQuery(query: string, ...fields: (string | undefined)[]): boolean;
1948
+
1781
1949
  declare function relativeTime(date: Date | string | number): string;
1782
1950
  declare function formatNumber(n: number): string;
1783
1951
  declare function formatPrice(amount: number, currency?: string, locale?: string): string;
@@ -1853,4 +2021,4 @@ declare function watermarkTint(accentHex: string, { saturation, lightness }?: {
1853
2021
  lightness?: number | undefined;
1854
2022
  }): string;
1855
2023
 
1856
- export { APP_SHELL_HEADER_HEIGHT, ActionCard, type ActionCardLabels, type ActionCardProps, type ActionCardState, type ApiClient, type ApiClientOptions, ApiError, AppShell, AppShellContent, type AppShellContentProps, AppShellHeader, type AppShellHeaderProps, type AppShellProps, AsyncList, type AsyncListProps, type AsyncListStatus, Avatar, type AvatarProps, Badge, type BadgeProps, BarList, type BarListItem, type BarListProps, Button, type ButtonProps, Carousel, type CarouselProps, ChatBubble, type ChatBubbleProps, type ChatMessage, type ChatRole, CodeBlock, type CodeBlockProps, Collapsible, type CollapsibleProps, type ColorName, ColorPicker, type ColorPickerProps, CopyButton, type CopyButtonProps, Countdown, type CountdownLabels, type CountdownProps, type DateCount, type DayGroup, Dialog, type DialogProps, Divider, type DividerProps, EmojiButton, type EmojiButtonProps, EmojiPicker, type EmojiPickerLabels, type EmojiPickerProps, EmptyState, type EmptyStateProps, Fab, type FabProps, FetchProgress, type FetchProgressProps, Field, type FieldProps, FontLinks, type FontName, GrassMap, type GrassMapData, type GrassMapLabels, type GrassMapProps, IOSInstallSheet, IconButton, type IconButtonProps, Img, type ImgProps, InAppSheet, type InAppSheetProps, InlineEdit, type InlineEditProps, Input, type InputProps, type IsoDuration, KitStyles, LinkifiedText, type LinkifiedTextProps, ListRow, type ListRowProps, MediaCard, type MediaCardProps, MessageList, type MessageListProps, PWAInstallButton, type PWAInstallState, PoweredByKit, type PoweredByKitProps, ProgressRing, type ProgressRingProps, Section, SectionHeader, type SectionHeaderProps, type SectionProps, type SegmentOption, SegmentedControl, type SegmentedControlProps, Select, type SelectOption, type SelectProps, ShareButton, type ShareButtonProps, Skeleton, type SkeletonProps, StatChip, type StatChipProps, type Step, Stepper, type StepperProps, Switch, type SwitchProps, THEME_SCRIPT, Tab, TabBar, type TabBarProps, type TabProps, type TabRootProps, Textarea, type TextareaProps, ThemeButton, type ThemeButtonProps, ThemeDialog, type ThemeDialogLabels, type ThemeDialogProps, type ToastOptions, ToastProvider, type ToastVariant, Tooltip, type TooltipProps, Typewriter, type TypewriterProps, TypingIndicator, type TypingIndicatorProps, type UnderlineTab, UnderlineTabs, type UnderlineTabsProps, type UseFetchOptions, type UseFetchResult, type UseFormSubmitOptions, type UseFormSubmitResult, type UseInViewOptions, type UseInViewResult, type UsePWAInstallReturn, type UsePollingOptions, type UsePollingResult, type UseShareOptions, type UseShareReturn, Watermark, type WatermarkProps, type WatermarkSponsor, clearFetchCache, cn, colors, createApiClient, createManifest, fillDateSeries, fontFamily, fonts, formatDayLabel, formatDollarEok, formatDuration, formatKoreanNumber, formatNumber, formatPrice, formatWon, formatWonTight, getFetchActiveCount, groupByDay, invalidateFetch, isoDurationToSec, mobileViewport, parseIsoDuration, particle, postJson, relativeTime, subscribeFetchActivity, svgIcon, useCopy, useDebounce, useEscapeKey, useFetch, useFocusTrap, useFormSubmit, useImageLoader, useInView, useLocalStorage, usePWAInstall, usePolling, usePortalTarget, useScrollLock, useShare, useToast, watermarkTint, withParticle };
2024
+ export { APP_SHELL_HEADER_HEIGHT, ActionCard, type ActionCardLabels, type ActionCardProps, type ActionCardState, type ApiClient, type ApiClientOptions, ApiError, AppShell, AppShellContent, type AppShellContentProps, AppShellHeader, type AppShellHeaderProps, type AppShellProps, AsyncList, type AsyncListProps, type AsyncListStatus, Avatar, type AvatarProps, Badge, type BadgeProps, BarList, type BarListItem, type BarListProps, Button, type ButtonProps, Carousel, type CarouselProps, ChatBubble, type ChatBubbleProps, type ChatMessage, type ChatRole, CodeBlock, type CodeBlockProps, Collapsible, type CollapsibleProps, type ColorName, ColorPicker, type ColorPickerProps, ColumnChart, type ColumnChartProps, type ColumnDatum, CopyButton, type CopyButtonProps, Countdown, type CountdownLabels, type CountdownProps, CumulativeCurve, type CumulativeCurveProps, type DateCount, type DayGroup, Dialog, type DialogProps, Divider, type DividerProps, DuoBar, type DuoBarProps, type DuoBarSide, EmojiButton, type EmojiButtonProps, EmojiPicker, type EmojiPickerLabels, type EmojiPickerProps, EmptyState, type EmptyStateProps, EvidenceDialog, type EvidenceDialogProps, Fab, type FabProps, FetchProgress, type FetchProgressProps, Field, type FieldProps, FontLinks, type FontName, GrassMap, type GrassMapData, type GrassMapLabels, type GrassMapProps, IOSInstallSheet, IconButton, type IconButtonProps, Img, type ImgProps, InAppSheet, type InAppSheetProps, InlineEdit, type InlineEditProps, Input, type InputProps, type IsoDuration, KitStyles, LinkifiedText, type LinkifiedTextProps, ListRow, type ListRowProps, MediaCard, type MediaCardProps, MessageList, type MessageListProps, PWAInstallButton, type PWAInstallState, PoweredByKit, type PoweredByKitProps, ProgressRing, type ProgressRingProps, ScrollRestorer, Section, SectionHeader, type SectionHeaderProps, type SectionProps, type SegmentOption, SegmentedControl, type SegmentedControlProps, Select, type SelectOption, type SelectProps, ShareButton, type ShareButtonProps, Skeleton, type SkeletonProps, StatChip, type StatChipProps, type Step, Stepper, type StepperProps, Switch, type SwitchProps, THEME_SCRIPT, Tab, TabBar, type TabBarProps, type TabProps, type TabRootProps, Textarea, type TextareaProps, ThemeButton, type ThemeButtonProps, ThemeDialog, type ThemeDialogLabels, type ThemeDialogProps, type ToastOptions, ToastProvider, type ToastVariant, Tooltip, type TooltipProps, Typewriter, type TypewriterProps, TypingIndicator, type TypingIndicatorProps, type UnderlineTab, UnderlineTabs, type UnderlineTabsProps, type UseFetchOptions, type UseFetchResult, type UseFormSubmitOptions, type UseFormSubmitResult, type UseInViewOptions, type UseInViewResult, type UsePWAInstallReturn, type UsePollingOptions, type UsePollingResult, type UseShareOptions, type UseShareReturn, Watermark, type WatermarkProps, type WatermarkSponsor, clearFetchCache, cn, colors, createApiClient, createManifest, fillDateSeries, fontFamily, fonts, formatDayLabel, formatDollarEok, formatDuration, formatKoreanNumber, formatNumber, formatPrice, formatWon, formatWonTight, getFetchActiveCount, groupByDay, invalidateFetch, isKstToday, isoDurationToSec, isoWeekOfStart, kstDayOfMonth, kstMidnight, kstNowParts, kstToday, kstWeekLabel, kstWeekParam, kstWeekTitle, markTabNavigation, matchesQuery, mobileViewport, parseIsoDuration, particle, postJson, relativeTime, startOfKstWeek, subscribeFetchActivity, svgIcon, toChoseong, toKst, useCopy, useDebounce, useEscapeKey, useFetch, useFocusTrap, useFormSubmit, useImageLoader, useInView, useLocalStorage, usePWAInstall, usePolling, usePortalTarget, useScrollLock, useShare, useToast, watermarkTint, weeksAgoFromKstWeekParam, withParticle };