@m1kapp/kit 0.0.28 → 0.0.30

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.
@@ -21,19 +21,23 @@ description: "@m1kapp/kit 기반 Next.js 프로젝트 초기 설정을 인터랙
21
21
  2. **앱 화면은 반드시 이 트리로 감싼다.** `AppShell`만 쓰면 화면 좌측에 붙고 휑하다. 중앙정렬·풀화면 배경·powered-by 풋터는 `Watermark`가 담당한다.
22
22
  ```tsx
23
23
  "use client";
24
- import { Watermark, AppShell, AppShellHeader, AppShellContent, TabBar, Tab } from "@m1kapp/kit";
24
+ import { Watermark, AppShell, AppShellHeader, AppShellContent, FetchProgress, TabBar, Tab } from "@m1kapp/kit";
25
+ import Link from "next/link";
25
26
 
26
27
  <Watermark color="#0a0d16" text="앱이름" maxWidth={460}>
27
28
  <AppShell maxWidth={460}>
28
29
  <AppShellHeader>…헤더…</AppShellHeader>
30
+ <FetchProgress top={56} color="[테마컬러]" /> {/* 백그라운드 갱신 표시 — useFetch 쓰면 자동 */}
29
31
  <AppShellContent>…스크롤 본문…</AppShellContent>
30
32
  <TabBar>
31
- <Tab active={…} onClick={…} label="홈" icon={<span>🏠</span>} activeColor="[테마컬러]" />
33
+ {/* Next 라우트 탭이면 render+Link — 프리페치로 탭 전환이 즉시가 된다 */}
34
+ <Tab active={…} render={(p) => <Link href="/home" prefetch {...p} />} label="홈" icon={<span>🏠</span>} activeColor="[테마컬러]" />
35
+ {/* 라우터 없는 useState 탭 전환이면 기존처럼 onClick */}
32
36
  </TabBar>
33
37
  </AppShell>
34
38
  </Watermark>
35
39
  ```
36
- - `AppShell`/`TabBar`는 인터랙티브 → 이 트리는 **`"use client"` 컴포넌트**에 둔다. 데이터는 서버 컴포넌트(page.tsx)에서 계산해 props로 내려준다.
40
+ - `AppShell`/`TabBar`는 인터랙티브 → 이 트리는 **`"use client"` 컴포넌트**에 둔다.
37
41
  - `maxWidth`는 Watermark와 AppShell을 **같은 값**으로 맞춘다(기본 430~460).
38
42
 
39
43
  3. **이모지는 토스페이스로 통일한다.** 장식용 이모지는 남발하지 말고, 쓰는 이모지는 토스 스타일로 폴백시킨다.
@@ -42,7 +46,16 @@ description: "@m1kapp/kit 기반 Next.js 프로젝트 초기 설정을 인터랙
42
46
 
43
47
  4. **🚫 `node_modules/@m1kapp/kit` 디렉토리 안에서 `npm run build`/스크립트를 절대 돌리지 마라.** kit 자체 빌드가 돌아 `dist/`를 날린다. 깨지면 `rm -rf node_modules/@m1kapp/kit && npm install @m1kapp/kit`로 복구. 빌드는 항상 프로젝트 루트에서.
44
48
 
45
- 5. **kit 컴포넌트 카탈로그**(필요 시 골라 쓰기): 레이아웃 `AppShell/AppShellHeader/AppShellContent`, 내비 `TabBar/Tab/Fab`, 표시 `Section/SectionHeader/StatChip/Badge/Avatar/EmptyState/Divider`, 브랜딩 `Watermark`, 입력 `Button/EmojiButton`, 테마 `ThemeButton/ThemeDialog`, 모션 `Typewriter`. SEO는 `@m1kapp/kit/seo`, OG는 `@m1kapp/kit/ogimage`, PWA는 `@m1kapp/kit/pwa`.
49
+ 5. **데이터는 `useFetch`로 가져온다 — 스피너로 콘텐츠를 갈아끼우지 마라.** v0.0.30부터 useFetch는 SWR(stale-while-revalidate): 캐시를 즉시 보여주고 백그라운드에서 갱신한다. 로딩 표시는 `FetchProgress` 상단 바 하나면 끝.
50
+ ```tsx
51
+ const { data, status } = useFetch<Item[]>("/api/items"); // GET
52
+ const { data } = useFetch(`/api/list#${id}`, { fetcher: postJson({ id }) }); // POST 조회 — 캐시 키는 경로#식별자
53
+ // 뮤테이션 후: await fetch(...POST...); invalidateFetch("/api/items");
54
+ ```
55
+ - 목록 렌더는 `AsyncList`(로딩/에러/빈/성공 4상태 자동)에 `data`/`status`를 그대로 꽂는다.
56
+ - `loading`은 캐시가 전혀 없는 첫 로드에만 true — 스켈레톤은 그때만 보인다. 재검증 감지는 `revalidating`.
57
+
58
+ 6. **kit 컴포넌트 카탈로그**(필요 시 골라 쓰기): 레이아웃 `AppShell/AppShellHeader/AppShellContent`, 내비 `TabBar/Tab/Fab`, 데이터 `useFetch/usePolling/invalidateFetch/postJson/AsyncList/FetchProgress`, 표시 `Section/SectionHeader/StatChip/Badge/Avatar/EmptyState/Divider/Skeleton/BarList/ProgressRing/GrassMap`, 오버레이 `Dialog/InAppSheet/ToastProvider·useToast/Tooltip`, 브랜딩 `Watermark/PoweredByKit`, 입력 `Button/IconButton/Input/Textarea/Field/Select/Switch/SegmentedControl/EmojiButton/InlineEdit/ColorPicker`, 테마 `ThemeButton/ThemeDialog`, 모션 `Typewriter/Countdown/Carousel`. SEO는 `@m1kapp/kit/seo`, OG는 `@m1kapp/kit/ogimage`, PWA는 `@m1kapp/kit/pwa`.
46
59
 
47
60
  ---
48
61
 
@@ -130,9 +143,9 @@ export const viewport = mobileViewport;
130
143
 
131
144
  ### 앱쉘 레이아웃 — (1) 선택 시
132
145
  - `"use client"` 컴포넌트(예: `components/AppRoot.tsx`)에 위 **핵심 규칙 2번** 트리를 그대로 생성.
133
- - `page.tsx`(서버 컴포넌트)는 데이터만 계산해서 `<AppRoot data={…} />`로 내려준다.
134
- - 탭이 여러 개면 `useState`로 탭 전환, 각 탭은 별도 패널 컴포넌트로 분리.
135
- - `AppShellContent` 안의 섹션은 `Section`/`SectionHeader`/`StatChip` 등 kit 컴포넌트를 우선 사용.
146
+ - 데이터: 자주 갱신되거나 탭 전환마다 보이는 데이터는 **클라이언트에서 `useFetch`**(핵심 규칙 5번 — SWR 캐시로 탭 전환이 즉시). SEO가 중요한 정적 콘텐츠만 서버 컴포넌트에서 props로.
147
+ - 탭이 라우트면 `Tab render+Link prefetch`, 단일 페이지 내 전환이면 `useState`. 각 탭은 별도 패널 컴포넌트로 분리.
148
+ - `AppShellContent` 안의 섹션은 `Section`/`SectionHeader`/`StatChip` 등 kit 컴포넌트를 우선 사용. 목록은 `AsyncList`.
136
149
 
137
150
  ### Tossface 이모지 — (2) 선택 시
138
151
  - layout `<head>`: `<link rel="preconnect" href="https://cdn.jsdelivr.net" />` + tossface css `<link>`.
package/dist/index.d.mts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as React$1 from 'react';
3
- import React__default, { ReactNode, CSSProperties, RefObject, SyntheticEvent } from 'react';
3
+ import React__default, { ReactNode, CSSProperties, ReactElement, RefObject, SyntheticEvent } from 'react';
4
4
  import { MetadataRoute, Viewport } from 'next';
5
5
  import { ClassValue } from 'clsx';
6
6
 
@@ -113,13 +113,25 @@ interface TabBarProps {
113
113
  * Sticky bottom navigation tab bar.
114
114
  */
115
115
  declare function TabBar({ children, className }: TabBarProps): react_jsx_runtime.JSX.Element;
116
+ interface TabRootProps {
117
+ className: string;
118
+ style?: CSSProperties;
119
+ "aria-current"?: "page";
120
+ children: ReactNode;
121
+ }
116
122
  interface TabProps {
117
123
  active: boolean;
118
- onClick: () => void;
124
+ onClick?: () => void;
119
125
  icon: ReactNode;
120
126
  label: string;
121
127
  /** Active tab color. Default: current text color */
122
128
  activeColor?: string;
129
+ /**
130
+ * Render a custom root element instead of the default `<button>` —
131
+ * e.g. a router Link so navigations get prefetching:
132
+ * `render={(p) => <Link href="/store" prefetch {...p} />}`
133
+ */
134
+ render?: (props: TabRootProps) => ReactElement;
123
135
  }
124
136
  /**
125
137
  * Individual tab button for the TabBar.
@@ -130,7 +142,167 @@ interface TabProps {
130
142
  * active tab is full-strength with its label tinted `activeColor`. The icon is
131
143
  * wrapped at a consistent size so mixed emoji/SVG icons line up.
132
144
  */
133
- declare function Tab({ active, onClick, icon, label, activeColor }: TabProps): react_jsx_runtime.JSX.Element;
145
+ declare function Tab({ active, onClick, icon, label, activeColor, render }: TabProps): react_jsx_runtime.JSX.Element;
146
+
147
+ interface FetchProgressProps {
148
+ /** Bar color. Default: `var(--kit-accent)` fallback zinc-900 */
149
+ color?: string;
150
+ /**
151
+ * Visual style. Default: "sweep".
152
+ * - `"sweep"` — a short gradient segment sweeps left-to-right in a loop
153
+ * (indeterminate; honest about unknown duration)
154
+ * - `"creep"` — nprogress-style bar that creeps toward 90%, then snaps
155
+ * to 100% and fades on completion
156
+ */
157
+ variant?: "sweep" | "creep";
158
+ /**
159
+ * Explicit control. When set, overrides the global useFetch activity
160
+ * tracking — e.g. `active={revalidating}` for a single request's bar.
161
+ * When omitted, the bar shows while ANY useFetch request is in flight.
162
+ */
163
+ active?: boolean;
164
+ /** Distance from the top of the positioned ancestor, in px (e.g. header height). Default: 0 */
165
+ top?: number;
166
+ /** Bar thickness in px. Default: 3 */
167
+ height?: number;
168
+ className?: string;
169
+ }
170
+ /**
171
+ * Slim top loading bar for stale-while-revalidate UIs — content stays
172
+ * visible and this bar is the only loading signal. By default it is driven
173
+ * by global useFetch activity (any request, including background
174
+ * revalidation); pass `active` to control it explicitly.
175
+ *
176
+ * Position is `absolute`, so place it inside a positioned container —
177
+ * e.g. directly inside `<AppShell>` (which is `relative`), with `top` set
178
+ * to the header height to sit just below `<AppShellHeader>`.
179
+ */
180
+ declare function FetchProgress({ color, variant, active, top, height, className, }: FetchProgressProps): react_jsx_runtime.JSX.Element | null;
181
+
182
+ /** Manually invalidate cache entries. Pass a URL to clear one, or nothing to clear all. */
183
+ declare function clearFetchCache(url?: string): void;
184
+ /**
185
+ * Invalidate cached data AND force every mounted useFetch hook on that URL to
186
+ * refetch immediately (stale-while-revalidate: current data stays visible
187
+ * while the refetch runs). Pass nothing to invalidate everything.
188
+ *
189
+ * The react-query `invalidateQueries` equivalent:
190
+ * `await fetch("/api/weekly", { method: "POST" }); invalidateFetch("/api/weekly");`
191
+ */
192
+ declare function invalidateFetch(url?: string): void;
193
+ type FetchStatus = "idle" | "loading" | "success" | "error";
194
+ interface UseFetchOptions<T> {
195
+ /** Skip fetching when false (default: true) */
196
+ enabled?: boolean;
197
+ /**
198
+ * Freshness window in ms (default: 0 — always stale).
199
+ *
200
+ * Results are ALWAYS cached and shown instantly on the next mount
201
+ * (stale-while-revalidate). `staleTime` only controls whether a
202
+ * background revalidation fires: within the window the cache is
203
+ * trusted as-is; past it, the cached data is shown immediately and
204
+ * refreshed in the background (`revalidating: true`).
205
+ */
206
+ staleTime?: number;
207
+ /** Number of retries on network error (default: 2) */
208
+ retry?: number;
209
+ /** Base delay between retries in ms — doubles each attempt (default: 1000) */
210
+ retryDelay?: number;
211
+ /** Re-fetch when window regains focus (default: true) */
212
+ revalidateOnFocus?: boolean;
213
+ /** Custom fetcher — defaults to fetch() with JSON/text auto-parse */
214
+ fetcher?: (url: string) => Promise<T>;
215
+ onSuccess?: (data: T) => void;
216
+ onError?: (err: Error) => void;
217
+ }
218
+ interface UseFetchResult<T> {
219
+ data: T | undefined;
220
+ loading: boolean;
221
+ error: Error | undefined;
222
+ /**
223
+ * Lifecycle status:
224
+ * - `"idle"` — url is null/undefined or `enabled: false`
225
+ * - `"loading"` — fetch in progress with NO cached data to show (cold load)
226
+ * - `"success"` — data shown (possibly stale — see `revalidating`)
227
+ * - `"error"` — last fetch failed and no cached data was available
228
+ */
229
+ status: FetchStatus;
230
+ /**
231
+ * True while a background revalidation is in flight — cached data is
232
+ * already displayed. Use for subtle indicators (top bar, spinner icon),
233
+ * NOT for replacing content.
234
+ */
235
+ revalidating: boolean;
236
+ /** Manually trigger a refetch (ignores cache) */
237
+ refetch: () => void;
238
+ }
239
+ declare function useFetch<T>(url: string | null | undefined, options?: UseFetchOptions<T>): UseFetchResult<T>;
240
+
241
+ /** react-query 계열("pending")과 kit useFetch 계열("idle"/"loading") 상태를 모두 수용 */
242
+ type AsyncListStatus = FetchStatus | "pending";
243
+ interface AsyncListProps<T> {
244
+ data: T[] | undefined;
245
+ /** useFetch의 status를 그대로 넘기면 된다 */
246
+ status: AsyncListStatus;
247
+ error?: Error | null;
248
+ renderItem: (item: T, index: number) => ReactNode;
249
+ /** 로딩 중 반복 표시할 스켈레톤 한 개 */
250
+ skeleton: ReactNode;
251
+ skeletonCount?: number;
252
+ emptyMessage?: string;
253
+ /** 빈 상태 아래 렌더할 액션(버튼 등) */
254
+ emptyAction?: ReactNode;
255
+ className?: string;
256
+ }
257
+ /**
258
+ * 비동기 목록의 4상태(로딩/에러/빈/성공)를 한 번에 처리하는 리스트.
259
+ *
260
+ * @example
261
+ * const { data, status } = useFetch<Video[]>("/api/trend");
262
+ * <AsyncList data={data} status={status} renderItem={(v) => <VideoRow key={v.id} video={v} />}
263
+ * skeleton={<VideoSkeleton />} skeletonCount={5} emptyMessage="영상이 없어요" />
264
+ */
265
+ declare function AsyncList<T>({ data, status, error, renderItem, skeleton, skeletonCount, emptyMessage, emptyAction, className, }: AsyncListProps<T>): react_jsx_runtime.JSX.Element;
266
+
267
+ type IconButtonVariant = "ghost" | "outline";
268
+ type IconButtonSize = "sm" | "md" | "lg";
269
+ interface IconButtonProps {
270
+ icon: ReactNode;
271
+ /** 접근성 라벨(aria-label) — 아이콘만 있는 버튼이므로 사실상 필수 */
272
+ label?: string;
273
+ onClick?: () => void;
274
+ variant?: IconButtonVariant;
275
+ size?: IconButtonSize;
276
+ disabled?: boolean;
277
+ className?: string;
278
+ }
279
+ /**
280
+ * 아이콘 전용 정사각 버튼 — Button(텍스트용)과 달리 ghost/outline 스타일.
281
+ *
282
+ * @example
283
+ * <IconButton icon={<RefreshCw size={18} />} label="새로고침" onClick={reload} />
284
+ */
285
+ declare function IconButton({ icon, label, onClick, variant, size, disabled, className, }: IconButtonProps): react_jsx_runtime.JSX.Element;
286
+
287
+ interface InputBaseProps {
288
+ value: string;
289
+ onChange: (value: string) => void;
290
+ placeholder?: string;
291
+ disabled?: boolean;
292
+ onFocus?: () => void;
293
+ onBlur?: () => void;
294
+ className?: string;
295
+ }
296
+ interface InputProps extends InputBaseProps {
297
+ /** input type (text, email, tel, search…) */
298
+ type?: string;
299
+ onEnter?: () => void;
300
+ }
301
+ declare function Input({ value, onChange, placeholder, type, disabled, onFocus, onBlur, onEnter, className, }: InputProps): react_jsx_runtime.JSX.Element;
302
+ interface TextareaProps extends InputBaseProps {
303
+ rows?: number;
304
+ }
305
+ declare function Textarea({ value, onChange, placeholder, rows, disabled, onFocus, onBlur, className, }: TextareaProps): react_jsx_runtime.JSX.Element;
134
306
 
135
307
  interface SectionProps {
136
308
  children: ReactNode;
@@ -148,12 +320,21 @@ interface SectionHeaderProps {
148
320
  */
149
321
  declare function SectionHeader({ children }: SectionHeaderProps): react_jsx_runtime.JSX.Element;
150
322
 
323
+ interface DividerProps {
324
+ /** 여백 프리셋. Default: "md" (mx-4 my-6 — 기존 동작) */
325
+ spacing?: "none" | "sm" | "md";
326
+ /** 선 색 (CSS color) — 클래스 충돌 없이 색만 바꿀 때 */
327
+ color?: string;
328
+ className?: string;
329
+ }
151
330
  /**
152
- * Horizontal divider line with margin.
331
+ * Horizontal divider line.
332
+ *
333
+ * @example
334
+ * <Divider />
335
+ * <Divider spacing="none" color="rgba(255,255,255,0.1)" />
153
336
  */
154
- declare function Divider({ className }: {
155
- className?: string;
156
- }): react_jsx_runtime.JSX.Element;
337
+ declare function Divider({ spacing, color, className }: DividerProps): react_jsx_runtime.JSX.Element;
157
338
 
158
339
  interface StatChipProps {
159
340
  label: string;
@@ -711,7 +892,7 @@ interface PoweredByKitProps {
711
892
  * No slug → no tracking (off by default). Register one with `npx m1kkit track`.
712
893
  */
713
894
  slug?: string;
714
- /** Tracker host. Default: "m1k.app" */
895
+ /** Tracker host. Default: "www.m1k.app" (apex m1k.app는 www로 307 리다이렉트 → cross-origin fetch가 CORS로 깨지므로 www 직결) */
715
896
  trackerHost?: string;
716
897
  /** Set false to disable the visitor beacon even when a slug is present */
717
898
  track?: boolean;
@@ -1453,41 +1634,23 @@ declare function createApiClient(baseUrl: string, defaults?: ApiClientOptions):
1453
1634
  };
1454
1635
  type ApiClient = ReturnType<typeof createApiClient>;
1455
1636
 
1456
- /** Manually invalidate cache entries. Pass a URL to clear one, or nothing to clear all. */
1457
- declare function clearFetchCache(url?: string): void;
1458
- type FetchStatus = "idle" | "loading" | "success" | "error";
1459
- interface UseFetchOptions<T> {
1460
- /** Skip fetching when false (default: true) */
1461
- enabled?: boolean;
1462
- /** Cache duration in ms. 0 = no cache (default: 0) */
1463
- staleTime?: number;
1464
- /** Number of retries on network error (default: 2) */
1465
- retry?: number;
1466
- /** Base delay between retries in ms — doubles each attempt (default: 1000) */
1467
- retryDelay?: number;
1468
- /** Re-fetch when window regains focus (default: true) */
1469
- revalidateOnFocus?: boolean;
1470
- /** Custom fetcher — defaults to fetch() with JSON/text auto-parse */
1471
- fetcher?: (url: string) => Promise<T>;
1472
- onSuccess?: (data: T) => void;
1473
- onError?: (err: Error) => void;
1474
- }
1475
- interface UseFetchResult<T> {
1476
- data: T | undefined;
1477
- loading: boolean;
1478
- error: Error | undefined;
1479
- /**
1480
- * Lifecycle status:
1481
- * - `"idle"` — url is null/undefined or `enabled: false`
1482
- * - `"loading"` — fetch in progress
1483
- * - `"success"` — data loaded (note: data may be null if the API returned null)
1484
- * - `"error"` — last fetch failed
1485
- */
1486
- status: FetchStatus;
1487
- /** Manually trigger a refetch (ignores cache) */
1488
- refetch: () => void;
1489
- }
1490
- declare function useFetch<T>(url: string | null | undefined, options?: UseFetchOptions<T>): UseFetchResult<T>;
1637
+ /** Subscribe to fetch activity changes. Returns an unsubscribe function. */
1638
+ declare function subscribeFetchActivity(listener: () => void): () => void;
1639
+ /** Number of useFetch requests currently in flight. */
1640
+ declare function getFetchActiveCount(): number;
1641
+
1642
+ /**
1643
+ * useFetch용 POST fetcher. useFetch는 URL 문자열이 캐시 키이므로, POST 조회는
1644
+ * `경로#식별자` 형태로 키를 만들고 요청 시 '#' 뒤를 잘라낸다:
1645
+ *
1646
+ * @example
1647
+ * // 같은 경로에 body만 다른 두 조회 — 키로 캐시가 분리된다
1648
+ * useFetch(`/api/playlist#info:${listId}`, { fetcher: postJson({ listId, infoOnly: true }) })
1649
+ * useFetch(`/api/playlist#videos:${listId}`, { fetcher: postJson({ listId }) })
1650
+ *
1651
+ * invalidateFetch(`/api/playlist#videos:${listId}`)로 개별 무효화 가능.
1652
+ */
1653
+ declare function postJson<T>(body?: unknown): (key: string) => Promise<T>;
1491
1654
 
1492
1655
  interface UsePollingOptions<T> {
1493
1656
  /** Polling interval in ms (default: 5000) */
@@ -1533,5 +1696,18 @@ interface DayGroup<T> {
1533
1696
  */
1534
1697
  declare function formatDayLabel(time: number | string | Date): string;
1535
1698
  declare function groupByDay<T>(items: T[], getTime: (item: T) => number | string | Date): DayGroup<T>[];
1699
+ interface DateCount {
1700
+ date: string;
1701
+ count: number;
1702
+ }
1703
+ /**
1704
+ * 최근 N일을 0-채움한 연속 시계열로 변환 (오늘 포함, 과거→현재 순).
1705
+ * 날짜 키는 "YYYY-MM-DD", 기본 KST — 차트 X축이 끊기지 않게 한다.
1706
+ *
1707
+ * @example
1708
+ * fillDateSeries([{ date: "2026-07-06", count: 3 }], 7)
1709
+ * // [{date:"2026-07-01",count:0}, …, {date:"2026-07-06",count:3}, {date:"2026-07-07",count:0}]
1710
+ */
1711
+ declare function fillDateSeries(daily: DateCount[], days: number, timeZone?: string): DateCount[];
1536
1712
 
1537
- export { ActionCard, type ActionCardLabels, type ActionCardProps, type ActionCardState, type ApiClient, type ApiClientOptions, ApiError, AppShell, AppShellContent, type AppShellContentProps, AppShellHeader, type AppShellHeaderProps, type AppShellProps, 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 DayGroup, Dialog, type DialogProps, Divider, EmojiButton, type EmojiButtonProps, EmojiPicker, type EmojiPickerLabels, type EmojiPickerProps, EmptyState, type EmptyStateProps, Fab, type FabProps, Field, type FieldProps, FontLinks, type FontName, GrassMap, type GrassMapData, type GrassMapLabels, type GrassMapProps, IOSInstallSheet, Img, type ImgProps, InAppSheet, type InAppSheetProps, InlineEdit, type InlineEditProps, KitStyles, LinkifiedText, type LinkifiedTextProps, ListRow, type ListRowProps, 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, ThemeButton, type ThemeButtonProps, ThemeDialog, type ThemeDialogLabels, type ThemeDialogProps, type ToastOptions, ToastProvider, type ToastVariant, Tooltip, type TooltipProps, Typewriter, type TypewriterProps, TypingIndicator, type TypingIndicatorProps, 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, fontFamily, fonts, formatDayLabel, formatDuration, formatNumber, formatPrice, groupByDay, mobileViewport, relativeTime, svgIcon, useCopy, useDebounce, useEscapeKey, useFetch, useFocusTrap, useFormSubmit, useImageLoader, useInView, useLocalStorage, usePWAInstall, usePolling, usePortalTarget, useScrollLock, useShare, useToast };
1713
+ export { 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, KitStyles, LinkifiedText, type LinkifiedTextProps, ListRow, type ListRowProps, 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 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, formatDuration, formatNumber, formatPrice, getFetchActiveCount, groupByDay, invalidateFetch, mobileViewport, postJson, relativeTime, subscribeFetchActivity, svgIcon, useCopy, useDebounce, useEscapeKey, useFetch, useFocusTrap, useFormSubmit, useImageLoader, useInView, useLocalStorage, usePWAInstall, usePolling, usePortalTarget, useScrollLock, useShare, useToast };