@cellarnode/ui 0.2.1 → 0.3.1

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.
Files changed (70) hide show
  1. package/README.md +238 -0
  2. package/dist/chat/chat-toggle-button.d.ts +6 -3
  3. package/dist/chat/chat-toggle-button.d.ts.map +1 -1
  4. package/dist/chat/chat-toggle-button.js +9 -4
  5. package/dist/chat/chat-toggle-button.js.map +1 -1
  6. package/dist/chat/messenger-layout.d.ts.map +1 -1
  7. package/dist/chat/messenger-layout.js +7 -2
  8. package/dist/chat/messenger-layout.js.map +1 -1
  9. package/dist/components/stat-card.d.ts +12 -0
  10. package/dist/components/stat-card.d.ts.map +1 -0
  11. package/dist/components/stat-card.js +10 -0
  12. package/dist/components/stat-card.js.map +1 -0
  13. package/dist/globe/country-coords.d.ts +29 -0
  14. package/dist/globe/country-coords.d.ts.map +1 -0
  15. package/dist/globe/country-coords.js +117 -0
  16. package/dist/globe/country-coords.js.map +1 -0
  17. package/dist/globe/globe-loading-skeleton.d.ts +10 -0
  18. package/dist/globe/globe-loading-skeleton.d.ts.map +1 -0
  19. package/dist/globe/globe-loading-skeleton.js +23 -0
  20. package/dist/globe/globe-loading-skeleton.js.map +1 -0
  21. package/dist/globe/index.d.ts +2 -0
  22. package/dist/globe/index.d.ts.map +1 -1
  23. package/dist/globe/index.js +2 -0
  24. package/dist/globe/index.js.map +1 -1
  25. package/dist/hooks/use-deferred-mount.d.ts +16 -0
  26. package/dist/hooks/use-deferred-mount.d.ts.map +1 -0
  27. package/dist/hooks/use-deferred-mount.js +32 -0
  28. package/dist/hooks/use-deferred-mount.js.map +1 -0
  29. package/dist/index.d.ts +3 -0
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +2 -0
  32. package/dist/index.js.map +1 -1
  33. package/dist/nav/app-shell.d.ts +18 -0
  34. package/dist/nav/app-shell.d.ts.map +1 -0
  35. package/dist/nav/app-shell.js +9 -0
  36. package/dist/nav/app-shell.js.map +1 -0
  37. package/dist/nav/app-sidebar.d.ts +33 -0
  38. package/dist/nav/app-sidebar.d.ts.map +1 -0
  39. package/dist/nav/app-sidebar.js +46 -0
  40. package/dist/nav/app-sidebar.js.map +1 -0
  41. package/dist/nav/expandable-nav-item.d.ts +11 -0
  42. package/dist/nav/expandable-nav-item.d.ts.map +1 -0
  43. package/dist/nav/expandable-nav-item.js +27 -0
  44. package/dist/nav/expandable-nav-item.js.map +1 -0
  45. package/dist/nav/index.d.ts +6 -0
  46. package/dist/nav/index.d.ts.map +1 -0
  47. package/dist/nav/index.js +5 -0
  48. package/dist/nav/index.js.map +1 -0
  49. package/dist/nav/types.d.ts +40 -0
  50. package/dist/nav/types.d.ts.map +1 -0
  51. package/dist/nav/types.js +4 -0
  52. package/dist/nav/types.js.map +1 -0
  53. package/dist/opportunities/index.d.ts +3 -0
  54. package/dist/opportunities/index.d.ts.map +1 -0
  55. package/dist/opportunities/index.js +2 -0
  56. package/dist/opportunities/index.js.map +1 -0
  57. package/dist/opportunities/opportunities-table.d.ts +23 -0
  58. package/dist/opportunities/opportunities-table.d.ts.map +1 -0
  59. package/dist/opportunities/opportunities-table.js +115 -0
  60. package/dist/opportunities/opportunities-table.js.map +1 -0
  61. package/dist/profile/index.d.ts +2 -0
  62. package/dist/profile/index.d.ts.map +1 -0
  63. package/dist/profile/index.js +2 -0
  64. package/dist/profile/index.js.map +1 -0
  65. package/dist/profile/profile.d.ts +50 -0
  66. package/dist/profile/profile.d.ts.map +1 -0
  67. package/dist/profile/profile.js +30 -0
  68. package/dist/profile/profile.js.map +1 -0
  69. package/package.json +24 -2
  70. package/src/theme/tokens.css +6 -0
package/README.md ADDED
@@ -0,0 +1,238 @@
1
+ <p align="center">
2
+ <img src="./docs/banner.svg" alt="@cellarnode/ui" width="900"/>
3
+ </p>
4
+
5
+ <p align="center">
6
+ <img src="https://img.shields.io/badge/version-0.2.1-0ea5e9?style=flat-square" alt="version"/>
7
+ <img src="https://img.shields.io/badge/react-19-61dafb?style=flat-square&logo=react" alt="react 19"/>
8
+ <img src="https://img.shields.io/badge/TypeScript-5.9-3178c6?style=flat-square&logo=typescript" alt="typescript"/>
9
+ <img src="https://img.shields.io/badge/Tailwind-v4-06b6d4?style=flat-square&logo=tailwindcss" alt="tailwind v4"/>
10
+ <img src="https://img.shields.io/badge/Storybook-10-ff4785?style=flat-square&logo=storybook" alt="storybook"/>
11
+ <img src="https://img.shields.io/badge/license-UNLICENSED-gray?style=flat-square" alt="license"/>
12
+ </p>
13
+
14
+ ---
15
+
16
+ Shared React component library for CellarNode dashboards. Ships UI primitives, design tokens, chat components, offer components, a globe visualisation, and a Kanban drag-and-drop system — all typed, tree-shakeable, and tested via Storybook.
17
+
18
+ ## Contents
19
+
20
+ - [Architecture](#architecture)
21
+ - [Install](#install)
22
+ - [Peer Dependencies](#peer-dependencies)
23
+ - [Exports](#exports)
24
+ - [Theme & Design Tokens](#theme--design-tokens)
25
+ - [Development](#development)
26
+ - [Writing Stories](#writing-stories)
27
+ - [Make Commands](#make-commands)
28
+ - [Storybook MCP (AI Integration)](#storybook-mcp-ai-integration)
29
+ - [Publishing](#publishing)
30
+
31
+ ---
32
+
33
+ ## Architecture
34
+
35
+ ```
36
+ src/
37
+ ├── components/ UI primitives (Button, Card, Dialog, Table, Sidebar…)
38
+ ├── chat/ Chat & negotiation UI (CommunicationPanel, WebSocket client)
39
+ ├── offer/ Offer workflow components (BeverageDetails, OrgBanner…)
40
+ ├── globe/ Interactive 3-D globe visualisation (react-globe.gl)
41
+ ├── hooks/ Shared hooks (useIsMobile, useToast, useKanbanDnd)
42
+ ├── lib/ Utilities (cn, semantic tones, currencies, kanban transitions)
43
+ └── theme/
44
+ └── tokens.css Canonical Tailwind v4 design tokens
45
+ ```
46
+
47
+ **Primitive layers**
48
+
49
+ | Layer | Package | Used for |
50
+ |-------|---------|----------|
51
+ | Radix UI | `@radix-ui/*` | Dialog, Dropdown, Select, Tabs, Toast… |
52
+ | Headless UI | `@headlessui/react` | Dropdown (Catalyst), Fieldset, Combobox |
53
+ | shadcn/ui | built on Radix | Chat & offer internal variants |
54
+
55
+ ---
56
+
57
+ ## Install
58
+
59
+ ```bash
60
+ pnpm add @cellarnode/ui
61
+ ```
62
+
63
+ > **Note:** This package is published to a private npm registry. Ensure your `.npmrc` points to the correct registry.
64
+
65
+ ---
66
+
67
+ ## Peer Dependencies
68
+
69
+ Install the peers your app uses:
70
+
71
+ ```bash
72
+ # Always required
73
+ pnpm add react react-dom
74
+
75
+ # Optional — only needed when importing the specific sub-path
76
+ pnpm add motion # animations
77
+ pnpm add @dnd-kit/react @dnd-kit/dom # ./kanban-dnd
78
+ pnpm add @tanstack/react-query # chat hooks
79
+ pnpm add react-globe.gl three topojson-client world-atlas # ./globe
80
+ pnpm add @cellarnode/beverage-utils i18n-iso-countries # ./offer
81
+ ```
82
+
83
+ ---
84
+
85
+ ## Exports
86
+
87
+ | Import path | Contents |
88
+ |-------------|----------|
89
+ | `@cellarnode/ui` | All UI primitives, hooks, and utilities |
90
+ | `@cellarnode/ui/theme/tokens.css` | Tailwind v4 design token CSS |
91
+ | `@cellarnode/ui/chat` | CommunicationPanel, MessengerLayout, chat hooks |
92
+ | `@cellarnode/ui/offer` | BeverageDetails, OrgBanner, OfferStatusBadge… |
93
+ | `@cellarnode/ui/kanban-dnd` | KanbanDndBoard component |
94
+ | `@cellarnode/ui/kanban-dnd-hooks` | useDraggableCard, useDroppableColumn |
95
+ | `@cellarnode/ui/globe` | GlobeView component |
96
+ | `@cellarnode/ui/animated-list` | AnimatedList component |
97
+
98
+ ---
99
+
100
+ ## Theme & Design Tokens
101
+
102
+ Import the canonical token sheet **before** Tailwind in your app's root CSS:
103
+
104
+ ```css
105
+ @import "@cellarnode/ui/theme/tokens.css";
106
+ @import "tailwindcss";
107
+ ```
108
+
109
+ Tokens expose semantic CSS variables (`--color-background`, `--color-primary`, `--color-brand-secondary`, etc.) that are automatically mapped into Tailwind utility classes.
110
+
111
+ Light/dark mode is toggled by adding the `dark` class to `<html>`.
112
+
113
+ ---
114
+
115
+ ## Development
116
+
117
+ **Prerequisites:** Node 20+, pnpm 9+, Playwright Chromium (for browser tests).
118
+
119
+ ```bash
120
+ # Install dependencies
121
+ pnpm install
122
+
123
+ # Install Playwright browser
124
+ pnpm playwright install chromium
125
+
126
+ # Start Storybook dev server
127
+ make storybook # → http://localhost:6006
128
+
129
+ # Type-check
130
+ make typecheck
131
+
132
+ # Lint
133
+ make lint
134
+
135
+ # Run tests (Storybook browser tests, headless)
136
+ make test
137
+
138
+ # Full build
139
+ make build
140
+ ```
141
+
142
+ ---
143
+
144
+ ## Writing Stories
145
+
146
+ Every component **must** have a `.stories.tsx` file co-located next to it.
147
+
148
+ ```tsx
149
+ import type { Meta, StoryObj } from "@storybook/react-vite";
150
+ import { Button } from "./button";
151
+
152
+ const meta = {
153
+ title: "Components/Button",
154
+ component: Button,
155
+ tags: ["autodocs"],
156
+ } satisfies Meta<typeof Button>;
157
+
158
+ export default meta;
159
+ type Story = StoryObj<typeof meta>;
160
+
161
+ export const Default: Story = {
162
+ args: { children: "Click me" },
163
+ };
164
+
165
+ export const Variants: Story = {
166
+ render: () => (
167
+ <div className="flex gap-3">
168
+ <Button color="brand">Brand</Button>
169
+ <Button outline>Outline</Button>
170
+ <Button plain>Plain</Button>
171
+ </div>
172
+ ),
173
+ };
174
+ ```
175
+
176
+ ### Conventions
177
+
178
+ - `tags: ["autodocs"]` → auto-generated prop docs
179
+ - Include a `Default` story + at least one variant story
180
+ - Use `argTypes` for enum-like props (color, size, variant)
181
+ - Check the **A11y** addon panel — fix all violations before merging
182
+ - Toggle **light / dark** via the Themes toolbar
183
+ - Write `play` functions for interaction testing when behaviour is complex
184
+
185
+ ---
186
+
187
+ ## Make Commands
188
+
189
+ ```
190
+ make build Full build: lint + typecheck + compile
191
+ make clean Remove dist/
192
+ make compile Compile TypeScript to dist/
193
+ make lint Run ESLint
194
+ make typecheck TypeScript type checking (no emit)
195
+ make test Run Storybook/Vitest browser tests (headless Chromium)
196
+ make test-watch Run Vitest in watch mode
197
+ make storybook Start Storybook dev server on :6006
198
+ make build-storybook Build static Storybook to storybook-static/
199
+ make publish Build and publish current version to npm
200
+ make release-patch Bump patch version, publish, and git tag
201
+ make release-minor Bump minor version, publish, and git tag
202
+ make release-major Bump major version, publish, and git tag
203
+ ```
204
+
205
+ ---
206
+
207
+ ## Storybook MCP (AI Integration)
208
+
209
+ When Storybook is running (`make storybook`), the `@storybook/addon-mcp` addon exposes an MCP server at `http://localhost:6006/mcp`.
210
+
211
+ **Register it with Claude Code once:**
212
+
213
+ ```bash
214
+ claude mcp add storybook-mcp --transport http http://localhost:6006/mcp --scope project
215
+ ```
216
+
217
+ **Available MCP tools:**
218
+
219
+ | Tool | Description |
220
+ |------|-------------|
221
+ | `get_ui_building_instructions` | Guidelines for creating components and stories |
222
+ | `get_story_urls` | Direct browser links to every story |
223
+
224
+ **Component manifest** (for AI context): `http://localhost:6006/manifests/components.html`
225
+
226
+ ---
227
+
228
+ ## Publishing
229
+
230
+ Packages are published to npm (restricted access). Releases are managed via Make:
231
+
232
+ ```bash
233
+ make release-patch # 0.2.1 → 0.2.2
234
+ make release-minor # 0.2.1 → 0.3.0
235
+ make release-major # 0.2.1 → 1.0.0
236
+ ```
237
+
238
+ Each release target: bumps version in `package.json`, publishes to npm, commits, and creates a git tag `ui-vX.Y.Z`.
@@ -1,8 +1,11 @@
1
- interface ChatToggleButtonProps {
1
+ export interface ChatToggleButtonProps {
2
2
  unreadCount: number;
3
3
  isConnected: boolean;
4
4
  onClick: () => void;
5
+ /** Optional short label shown in the pill, e.g. "Counter offer pending" */
6
+ contextLabel?: string | null;
7
+ /** ARIA label for the button */
8
+ "aria-label"?: string;
5
9
  }
6
- export declare function ChatToggleButton({ unreadCount, isConnected, onClick, }: ChatToggleButtonProps): import("react/jsx-runtime").JSX.Element;
7
- export {};
10
+ export declare function ChatToggleButton({ unreadCount, isConnected, onClick, contextLabel, "aria-label": ariaLabel, }: ChatToggleButtonProps): import("react/jsx-runtime").JSX.Element;
8
11
  //# sourceMappingURL=chat-toggle-button.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"chat-toggle-button.d.ts","sourceRoot":"","sources":["../../src/chat/chat-toggle-button.tsx"],"names":[],"mappings":"AAIA,UAAU,qBAAqB;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,WAAW,EACX,WAAW,EACX,OAAO,GACR,EAAE,qBAAqB,2CAsCvB"}
1
+ {"version":3,"file":"chat-toggle-button.d.ts","sourceRoot":"","sources":["../../src/chat/chat-toggle-button.tsx"],"names":[],"mappings":"AAIA,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,2EAA2E;IAC3E,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,gCAAgC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,WAAW,EACX,WAAW,EACX,OAAO,EACP,YAAY,EACZ,YAAY,EAAE,SAAS,GACxB,EAAE,qBAAqB,2CAsFvB"}
@@ -1,8 +1,13 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { MessageCircle } from "lucide-react";
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { MessageCircle, Wifi, WifiOff } from "lucide-react";
3
3
  import { motion, AnimatePresence } from "motion/react";
4
4
  import { cn } from "../lib/utils";
5
- export function ChatToggleButton({ unreadCount, isConnected, onClick, }) {
6
- return (_jsx("div", { className: "fixed bottom-6 right-6 z-40 lg:bottom-8 lg:right-8", children: _jsxs("button", { type: "button", onClick: onClick, className: cn("premium-panel relative flex size-16 items-center justify-center rounded-full", "shadow-md transition-all hover:shadow-lg hover:scale-105 active:scale-95", "focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:outline-hidden"), children: [_jsx(MessageCircle, { className: "size-6 text-foreground" }), isConnected && unreadCount === 0 && (_jsx("span", { className: "absolute top-3 right-3 size-2.5 rounded-full bg-emerald-500", children: _jsx("span", { className: "absolute inset-0 animate-ping rounded-full bg-emerald-400 opacity-75" }) })), _jsx(AnimatePresence, { children: unreadCount > 0 && (_jsx(motion.span, { initial: { scale: 0 }, animate: { scale: 1 }, exit: { scale: 0 }, transition: { type: "spring", stiffness: 500, damping: 25 }, className: "absolute -top-1.5 -right-1.5 flex min-w-6 items-center justify-center rounded-full bg-destructive px-1.5 py-0.5 text-xs font-semibold text-destructive-foreground", children: unreadCount > 99 ? "99+" : unreadCount })) })] }) }));
5
+ export function ChatToggleButton({ unreadCount, isConnected, onClick, contextLabel, "aria-label": ariaLabel, }) {
6
+ const hasContext = !!contextLabel;
7
+ return (_jsx("div", { className: "fixed bottom-6 right-6 z-40 lg:bottom-8 lg:right-8", children: _jsx(AnimatePresence, { mode: "wait", children: _jsxs(motion.button, { type: "button", onClick: onClick, "aria-label": ariaLabel ?? (hasContext ? contextLabel : "Open chat"), initial: { opacity: 0, y: 8, scale: 0.92 }, animate: { opacity: 1, y: 0, scale: 1 }, exit: { opacity: 0, y: 8, scale: 0.92 }, transition: { type: "spring", stiffness: 420, damping: 28 }, whileHover: { scale: 1.03 }, whileTap: { scale: 0.96 }, className: cn("premium-panel relative flex items-center gap-2.5 shadow-md", "transition-shadow hover:shadow-lg", "focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:outline-hidden", hasContext
8
+ ? "rounded-[22px] px-4 py-3"
9
+ : "size-14 justify-center rounded-full"), children: [_jsxs("span", { className: "relative shrink-0", children: [_jsx(MessageCircle, { className: "size-5 text-foreground" }), isConnected && unreadCount === 0 && (_jsx("span", { className: "absolute -top-0.5 -right-0.5 size-2 rounded-full bg-emerald-500", children: _jsx("span", { className: "absolute inset-0 animate-ping rounded-full bg-emerald-400 opacity-75" }) }))] }), _jsx("div", { className: cn("flex min-w-0 flex-col gap-0", !hasContext && "hidden lg:flex"), children: hasContext ? (_jsxs(_Fragment, { children: [_jsx("span", { className: "truncate text-[11px] font-semibold leading-tight text-foreground", children: contextLabel }), _jsx("span", { className: cn("flex items-center gap-1 text-[10px] font-medium leading-tight", isConnected ? "text-emerald-600 dark:text-emerald-400" : "text-muted-foreground"), children: isConnected
10
+ ? _jsxs(_Fragment, { children: [_jsx(Wifi, { className: "size-2.5", "aria-hidden": "true" }), "Live"] })
11
+ : _jsxs(_Fragment, { children: [_jsx(WifiOff, { className: "size-2.5", "aria-hidden": "true" }), "Offline"] }) })] })) : (_jsx("span", { className: cn("text-[11px] font-medium leading-tight", isConnected ? "text-emerald-600 dark:text-emerald-400" : "text-muted-foreground"), children: isConnected ? "Live" : "Offline" })) }), _jsx(AnimatePresence, { children: unreadCount > 0 && (_jsx(motion.span, { initial: { scale: 0 }, animate: { scale: 1 }, exit: { scale: 0 }, transition: { type: "spring", stiffness: 500, damping: 25 }, "aria-label": `${unreadCount} unread messages`, className: cn("flex min-w-5 items-center justify-center rounded-full bg-destructive px-1 py-0.5 text-[10px] font-semibold text-destructive-foreground", hasContext ? "shrink-0" : "absolute -top-1.5 -right-1.5"), children: unreadCount > 99 ? "99+" : unreadCount })) })] }, hasContext ? "pill-context" : "pill-default") }) }));
7
12
  }
8
13
  //# sourceMappingURL=chat-toggle-button.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chat-toggle-button.js","sourceRoot":"","sources":["../../src/chat/chat-toggle-button.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAQlC,MAAM,UAAU,gBAAgB,CAAC,EAC/B,WAAW,EACX,WAAW,EACX,OAAO,GACe;IACtB,OAAO,CACL,cAAK,SAAS,EAAC,oDAAoD,YACjE,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,EAAE,CACX,8EAA8E,EAC9E,0EAA0E,EAC1E,8EAA8E,CAC/E,aAED,KAAC,aAAa,IAAC,SAAS,EAAC,wBAAwB,GAAG,EAGnD,WAAW,IAAI,WAAW,KAAK,CAAC,IAAI,CACnC,eAAM,SAAS,EAAC,6DAA6D,YAC3E,eAAM,SAAS,EAAC,sEAAsE,GAAG,GACpF,CACR,EAGD,KAAC,eAAe,cACb,WAAW,GAAG,CAAC,IAAI,CAClB,KAAC,MAAM,CAAC,IAAI,IACV,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EACrB,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EACrB,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAClB,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,EAC3D,SAAS,EAAC,mKAAmK,YAE5K,WAAW,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,GAC3B,CACf,GACe,IACX,GACL,CACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"chat-toggle-button.js","sourceRoot":"","sources":["../../src/chat/chat-toggle-button.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"messenger-layout.d.ts","sourceRoot":"","sources":["../../src/chat/messenger-layout.tsx"],"names":[],"mappings":"AAMA,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,mBAAmB,EAAE,CAAC;IACrC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oBAAoB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,eAAe,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;CAChD;AA2MD,wBAAgB,eAAe,CAAC,EAC9B,aAAa,EACb,oBAAoB,EACpB,oBAAoB,EACpB,SAAiB,EACjB,WAAgB,EAChB,cAAc,EACd,QAAQ,EACR,MAAM,EACN,MAAM,EACN,eAAe,EACf,CAAY,GACb,EAAE,oBAAoB,2CAoGtB"}
1
+ {"version":3,"file":"messenger-layout.d.ts","sourceRoot":"","sources":["../../src/chat/messenger-layout.tsx"],"names":[],"mappings":"AAMA,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,mBAAmB,EAAE,CAAC;IACrC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oBAAoB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,eAAe,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;CAChD;AAkND,wBAAgB,eAAe,CAAC,EAC9B,aAAa,EACb,oBAAoB,EACpB,oBAAoB,EACpB,SAAiB,EACjB,WAAgB,EAChB,cAAc,EACd,QAAQ,EACR,MAAM,EACN,MAAM,EACN,eAAe,EACf,CAAY,GACb,EAAE,oBAAoB,2CAoGtB"}
@@ -40,10 +40,15 @@ function ConversationItem({ conversation, isSelected, onClick, onSubtitleClick,
40
40
  ? "bg-primary text-primary-foreground"
41
41
  : "bg-muted text-muted-foreground"), children: conversation.initials }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex items-center justify-between gap-2", children: [_jsx("span", { className: cn("truncate text-sm", hasUnread
42
42
  ? "font-semibold text-foreground"
43
- : "font-medium text-foreground/80"), children: conversation.name }), conversation.lastMessageAt && (_jsx("span", { className: "shrink-0 text-xs text-muted-foreground", children: formatRelativeTime(conversation.lastMessageAt) }))] }), conversation.subtitle && (onSubtitleClick ? (_jsxs("button", { type: "button", onClick: (e) => {
43
+ : "font-medium text-foreground/80"), children: conversation.name }), conversation.lastMessageAt && (_jsx("span", { className: "shrink-0 text-xs text-muted-foreground", children: formatRelativeTime(conversation.lastMessageAt) }))] }), conversation.subtitle && (onSubtitleClick ? (_jsxs("span", { role: "link", tabIndex: 0, onClick: (e) => {
44
44
  e.stopPropagation();
45
45
  onSubtitleClick(conversation.id);
46
- }, className: cn("mt-0.5 flex items-center gap-1 truncate text-xs", "text-primary/70 hover:text-primary hover:underline", "transition-colors"), "aria-label": `View offer for ${conversation.subtitle}`, children: [_jsx("span", { className: "truncate", children: conversation.subtitle }), _jsx(ArrowUpRight, { className: "size-3 shrink-0" })] })) : (_jsx("p", { className: "mt-0.5 truncate text-xs text-muted-foreground/70", children: conversation.subtitle }))), conversation.lastMessage && (_jsx("p", { className: "mt-0.5 truncate text-sm/5 text-muted-foreground", children: conversation.lastMessage }))] }), hasUnread && (_jsx("span", { className: cn("flex size-5 shrink-0 items-center justify-center rounded-full", "text-[10px] font-bold tabular-nums", "bg-primary text-primary-foreground"), children: conversation.unreadCount > 9 ? "9+" : conversation.unreadCount }))] }));
46
+ }, onKeyDown: (e) => {
47
+ if (e.key === "Enter" || e.key === " ") {
48
+ e.stopPropagation();
49
+ onSubtitleClick(conversation.id);
50
+ }
51
+ }, className: cn("mt-0.5 flex cursor-pointer items-center gap-1 truncate text-xs", "text-primary/70 hover:text-primary hover:underline", "transition-colors"), "aria-label": `View offer for ${conversation.subtitle}`, children: [_jsx("span", { className: "truncate", children: conversation.subtitle }), _jsx(ArrowUpRight, { className: "size-3 shrink-0" })] })) : (_jsx("p", { className: "mt-0.5 truncate text-xs text-muted-foreground/70", children: conversation.subtitle }))), conversation.lastMessage && (_jsx("p", { className: "mt-0.5 truncate text-sm/5 text-muted-foreground", children: conversation.lastMessage }))] }), hasUnread && (_jsx("span", { className: cn("flex size-5 shrink-0 items-center justify-center rounded-full", "text-[10px] font-bold tabular-nums", "bg-primary text-primary-foreground"), children: conversation.unreadCount > 9 ? "9+" : conversation.unreadCount }))] }));
47
52
  }
48
53
  /* ─── Empty state ─── */
49
54
  function EmptyState({ t = defaultT }) {
@@ -1 +1 @@
1
- {"version":3,"file":"messenger-layout.js","sourceRoot":"","sources":["../../src/chat/messenger-layout.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AA6B9E,qBAAqB;AAErB,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,QAAiB,EAAE,EAAE,CAAC,QAAQ,IAAI,IAAI,CAAC;AAEvE,SAAS,kBAAkB,CAAC,OAAe;IACzC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;IACzC,MAAM,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC;IAC1B,IAAI,MAAM,GAAG,CAAC;QAAE,OAAO,UAAU,CAAC;IAElC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IAC5C,IAAI,OAAO,GAAG,CAAC;QAAE,OAAO,UAAU,CAAC;IACnC,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,GAAG,CAAC;IAEvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACvC,IAAI,KAAK,GAAG,EAAE;QAAE,OAAO,GAAG,KAAK,GAAG,CAAC;IAEnC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IACpC,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5B,IAAI,IAAI,GAAG,CAAC;QAAE,OAAO,GAAG,IAAI,GAAG,CAAC;IAEhC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,kBAAkB,CAAC,SAAS,EAAE;QACrD,KAAK,EAAE,OAAO;QACd,GAAG,EAAE,SAAS;KACf,CAAC,CAAC;AACL,CAAC;AAED,8BAA8B;AAE9B,SAAS,wBAAwB,CAAC,EAAE,KAAK,GAAG,CAAC,EAAsB;IACjE,OAAO,CACL,cAAK,SAAS,EAAC,yBAAyB,YACrC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAC3C,eAAa,SAAS,EAAC,mCAAmC,aACxD,KAAC,QAAQ,IAAC,SAAS,EAAC,+BAA+B,GAAG,EACtD,eAAK,SAAS,EAAC,kBAAkB,aAC/B,eAAK,SAAS,EAAC,yCAAyC,aACtD,KAAC,QAAQ,IAAC,SAAS,EAAC,YAAY,GAAG,EACnC,KAAC,QAAQ,IAAC,SAAS,EAAC,UAAU,GAAG,IAC7B,EACN,KAAC,QAAQ,IAAC,SAAS,EAAC,WAAW,GAAG,IAC9B,KARE,CAAC,CASL,CACP,CAAC,GACE,CACP,CAAC;AACJ,CAAC;AAWD,SAAS,gBAAgB,CAAC,EACxB,YAAY,EACZ,UAAU,EACV,OAAO,EACP,eAAe,GACO;IACtB,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,GAAG,CAAC,CAAC;IAE/C,OAAO,CACL,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,EAAE,CACX,qEAAqE,EACrE,6BAA6B,EAC7B,mFAAmF,EACnF,UAAU;YACR,CAAC,CAAC,kCAAkC;YACpC,CAAC,CAAC,4CAA4C,CACjD,aAGD,eACE,SAAS,EAAE,EAAE,CACX,sFAAsF,EACtF,SAAS,IAAI,UAAU;oBACrB,CAAC,CAAC,oCAAoC;oBACtC,CAAC,CAAC,gCAAgC,CACrC,YAEA,YAAY,CAAC,QAAQ,GACjB,EAGP,eAAK,SAAS,EAAC,gBAAgB,aAC7B,eAAK,SAAS,EAAC,yCAAyC,aACtD,eACE,SAAS,EAAE,EAAE,CACX,kBAAkB,EAClB,SAAS;oCACP,CAAC,CAAC,+BAA+B;oCACjC,CAAC,CAAC,gCAAgC,CACrC,YAEA,YAAY,CAAC,IAAI,GACb,EACN,YAAY,CAAC,aAAa,IAAI,CAC7B,eAAM,SAAS,EAAC,wCAAwC,YACrD,kBAAkB,CAAC,YAAY,CAAC,aAAa,CAAC,GAC1C,CACR,IACG,EAEL,YAAY,CAAC,QAAQ,IAAI,CACxB,eAAe,CAAC,CAAC,CAAC,CAChB,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;4BACb,CAAC,CAAC,eAAe,EAAE,CAAC;4BACpB,eAAe,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;wBACnC,CAAC,EACD,SAAS,EAAE,EAAE,CACX,iDAAiD,EACjD,oDAAoD,EACpD,mBAAmB,CACpB,gBACW,kBAAkB,YAAY,CAAC,QAAQ,EAAE,aAErD,eAAM,SAAS,EAAC,UAAU,YAAE,YAAY,CAAC,QAAQ,GAAQ,EACzD,KAAC,YAAY,IAAC,SAAS,EAAC,iBAAiB,GAAG,IACrC,CACV,CAAC,CAAC,CAAC,CACF,YAAG,SAAS,EAAC,kDAAkD,YAC5D,YAAY,CAAC,QAAQ,GACpB,CACL,CACF,EAEA,YAAY,CAAC,WAAW,IAAI,CAC3B,YAAG,SAAS,EAAC,iDAAiD,YAC3D,YAAY,CAAC,WAAW,GACvB,CACL,IACG,EAGL,SAAS,IAAI,CACZ,eACE,SAAS,EAAE,EAAE,CACX,+DAA+D,EAC/D,oCAAoC,EACpC,oCAAoC,CACrC,YAEA,YAAY,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,GAC1D,CACR,IACM,CACV,CAAC;AACJ,CAAC;AAED,yBAAyB;AAEzB,SAAS,UAAU,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAsD;IACtF,OAAO,CACL,eAAK,SAAS,EAAC,+EAA+E,aAC5F,cAAK,SAAS,EAAC,gEAAgE,YAC7E,KAAC,aAAa,IAAC,SAAS,EAAC,iCAAiC,GAAG,GACzD,EACN,YAAG,SAAS,EAAC,2CAA2C,YACrD,CAAC,CAAC,iBAAiB,EAAE,sBAAsB,CAAC,GAC3C,EACJ,YAAG,SAAS,EAAC,gDAAgD,YAC1D,CAAC,CACA,qBAAqB,EACrB,yDAAyD,CAC1D,GACC,IACA,CACP,CAAC;AACJ,CAAC;AAED,wBAAwB;AAExB,SAAS,SAAS,CAAC,EACjB,KAAK,EACL,CAAC,GAAG,QAAQ,GAIb;IACC,OAAO,CACL,eAAK,SAAS,EAAC,+EAA+E,aAC5F,KAAC,MAAM,IAAC,SAAS,EAAC,iCAAiC,GAAG,EACtD,aAAG,SAAS,EAAC,+BAA+B,aACzC,CAAC,CAAC,qBAAqB,EAAE,gBAAgB,CAAC,EAAE,GAAG,EAChD,gBAAM,SAAS,EAAC,6BAA6B,uBAAS,KAAK,cAAe,IACxE,IACA,CACP,CAAC;AACJ,CAAC;AAED,yBAAyB;AAEzB,MAAM,UAAU,eAAe,CAAC,EAC9B,aAAa,EACb,oBAAoB,EACpB,oBAAoB,EACpB,SAAS,GAAG,KAAK,EACjB,WAAW,GAAG,EAAE,EAChB,cAAc,EACd,QAAQ,EACR,MAAM,EACN,MAAM,EACN,eAAe,EACf,CAAC,GAAG,QAAQ,GACS;IACrB,oCAAoC;IACpC,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,EAAE;QACjC,CAAC,CAAC,aAAa,CAAC,MAAM,CAClB,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;YACxD,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,CAChE;QACH,CAAC,CAAC,aAAa,CAAC;IAElB,MAAM,SAAS,GAAG,CAAC,CAAC,oBAAoB,CAAC;IAEzC,OAAO,CACL,eAAK,SAAS,EAAC,wFAAwF,aAErG,eACE,SAAS,EAAE,EAAE,CACX,6DAA6D;gBAC7D,6DAA6D;gBAC7D,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,CACtC,aAGA,MAAM,EAGN,cAAc,IAAI,CACjB,cAAK,SAAS,EAAC,kCAAkC,YAC/C,eAAK,SAAS,EAAC,UAAU,aACvB,KAAC,MAAM,IAAC,SAAS,EAAC,2FAA2F,GAAG,EAChH,gBACE,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC/C,WAAW,EAAE,CAAC,CAAC,kBAAkB,EAAE,yBAAyB,CAAC,EAC7D,SAAS,EAAE,EAAE,CACX,qEAAqE,EACrE,2DAA2D,EAC3D,iGAAiG,CAClG,GACD,IACE,GACF,CACP,EAGD,cAAK,SAAS,EAAC,wBAAwB,YACpC,SAAS,CAAC,CAAC,CAAC,CACX,KAAC,wBAAwB,KAAG,CAC7B,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAChD,KAAC,SAAS,IAAC,KAAK,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,GAAI,CACxC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAC1B,KAAC,UAAU,IAAC,CAAC,EAAE,CAAC,GAAI,CACrB,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,2BAA2B,YACvC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACtB,KAAC,gBAAgB,IAEf,YAAY,EAAE,IAAI,EAClB,UAAU,EAAE,IAAI,CAAC,EAAE,KAAK,oBAAoB,EAC5C,OAAO,EAAE,GAAG,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC,EAC5C,eAAe,EAAE,eAAe,IAJ3B,IAAI,CAAC,EAAE,CAKZ,CACH,CAAC,GACE,CACP,GACG,IACF,EAGN,eACE,SAAS,EAAE,EAAE,CACX,8BAA8B;gBAC9B,4DAA4D;gBAC5D,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,CACvC,aAGA,SAAS,IAAI,MAAM,IAAI,CACtB,cAAK,SAAS,EAAC,oEAAoE,YACjF,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,EAAE,CACX,yDAAyD,EACzD,2CAA2C,EAC3C,yDAAyD,EACzD,mFAAmF,CACpF,aAED,KAAC,SAAS,IAAC,SAAS,EAAC,QAAQ,GAAG,EAC/B,CAAC,CAAC,gBAAgB,EAAE,MAAM,CAAC,IACrB,GACL,CACP,EAEA,QAAQ,IACL,IACF,CACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"messenger-layout.js","sourceRoot":"","sources":["../../src/chat/messenger-layout.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import * as React from "react";
2
+ export interface StatCardProps {
3
+ icon: React.ReactNode;
4
+ label: string;
5
+ value: string | number;
6
+ description?: string;
7
+ href?: string;
8
+ renderLink?: (href: string, children: React.ReactNode) => React.ReactNode;
9
+ className?: string;
10
+ }
11
+ export declare function StatCard({ icon, label, value, description, href, renderLink, className, }: StatCardProps): import("react/jsx-runtime").JSX.Element;
12
+ //# sourceMappingURL=stat-card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stat-card.d.ts","sourceRoot":"","sources":["../../src/components/stat-card.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,CAAC;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,QAAQ,CAAC,EACvB,IAAI,EACJ,KAAK,EACL,KAAK,EACL,WAAW,EACX,IAAI,EACJ,UAAU,EACV,SAAS,GACV,EAAE,aAAa,2CAiCf"}
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { cn } from "../lib/utils";
3
+ export function StatCard({ icon, label, value, description, href, renderLink, className, }) {
4
+ const cardContent = (_jsxs("div", { className: cn("border-border/60 bg-card rounded-2xl p-5 transition-colors", href && renderLink && "hover:bg-accent/30 cursor-pointer", className), children: [_jsxs("div", { className: "flex items-start justify-between gap-4", children: [_jsxs("div", { className: "grid gap-1.5", children: [_jsx("p", { className: "text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground", children: label }), _jsx("p", { className: "text-3xl font-bold tracking-tight text-foreground", children: value })] }), _jsx("div", { className: "tone-icon tone-brand shrink-0 rounded-xl p-2.5", children: icon })] }), description && (_jsx("p", { className: "mt-4 text-sm/5 text-muted-foreground", children: description }))] }));
5
+ if (href && renderLink) {
6
+ return _jsx(_Fragment, { children: renderLink(href, cardContent) });
7
+ }
8
+ return cardContent;
9
+ }
10
+ //# sourceMappingURL=stat-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stat-card.js","sourceRoot":"","sources":["../../src/components/stat-card.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAYlC,MAAM,UAAU,QAAQ,CAAC,EACvB,IAAI,EACJ,KAAK,EACL,KAAK,EACL,WAAW,EACX,IAAI,EACJ,UAAU,EACV,SAAS,GACK;IACd,MAAM,WAAW,GAAG,CAClB,eACE,SAAS,EAAE,EAAE,CACX,4DAA4D,EAC5D,IAAI,IAAI,UAAU,IAAI,mCAAmC,EACzD,SAAS,CACV,aAED,eAAK,SAAS,EAAC,wCAAwC,aACrD,eAAK,SAAS,EAAC,cAAc,aAC3B,YAAG,SAAS,EAAC,yEAAyE,YACnF,KAAK,GACJ,EACJ,YAAG,SAAS,EAAC,mDAAmD,YAC7D,KAAK,GACJ,IACA,EACN,cAAK,SAAS,EAAC,gDAAgD,YAC5D,IAAI,GACD,IACF,EACL,WAAW,IAAI,CACd,YAAG,SAAS,EAAC,sCAAsC,YAAE,WAAW,GAAK,CACtE,IACG,CACP,CAAC;IAEF,IAAI,IAAI,IAAI,UAAU,EAAE,CAAC;QACvB,OAAO,4BAAG,UAAU,CAAC,IAAI,EAAE,WAAW,CAAC,GAAI,CAAC;IAC9C,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Compact country centroid coordinates (ISO-3166-1 alpha-2 → lat/lng).
3
+ * Covers all major wine & beverage producing/importing regions plus full global coverage.
4
+ * Centroids are approximate geographic centers suitable for globe arc endpoints.
5
+ */
6
+ export declare const COUNTRY_COORDS: Record<string, {
7
+ lat: number;
8
+ lng: number;
9
+ name: string;
10
+ }>;
11
+ /**
12
+ * Look up coordinates for an ISO-3166-1 alpha-2 country code.
13
+ * Returns null if the code is unknown.
14
+ */
15
+ export declare function countryCoords(code: string): {
16
+ lat: number;
17
+ lng: number;
18
+ name: string;
19
+ } | null;
20
+ /**
21
+ * Batch look up coordinates, skipping unknown codes.
22
+ */
23
+ export declare function resolveCountries(codes: string[]): Array<{
24
+ code: string;
25
+ lat: number;
26
+ lng: number;
27
+ name: string;
28
+ }>;
29
+ //# sourceMappingURL=country-coords.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"country-coords.d.ts","sourceRoot":"","sources":["../../src/globe/country-coords.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CA6FrF,CAAC;AAEF;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAI7F;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAMjH"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Compact country centroid coordinates (ISO-3166-1 alpha-2 → lat/lng).
3
+ * Covers all major wine & beverage producing/importing regions plus full global coverage.
4
+ * Centroids are approximate geographic centers suitable for globe arc endpoints.
5
+ */
6
+ export const COUNTRY_COORDS = {
7
+ // Europe — wine & spirits heartland
8
+ FR: { lat: 46.23, lng: 2.21, name: "France" },
9
+ IT: { lat: 42.83, lng: 12.83, name: "Italy" },
10
+ ES: { lat: 40.46, lng: -3.75, name: "Spain" },
11
+ PT: { lat: 39.4, lng: -8.22, name: "Portugal" },
12
+ DE: { lat: 51.17, lng: 10.45, name: "Germany" },
13
+ AT: { lat: 47.52, lng: 14.55, name: "Austria" },
14
+ CH: { lat: 46.82, lng: 8.23, name: "Switzerland" },
15
+ GB: { lat: 55.38, lng: -3.44, name: "United Kingdom" },
16
+ BE: { lat: 50.5, lng: 4.47, name: "Belgium" },
17
+ NL: { lat: 52.13, lng: 5.29, name: "Netherlands" },
18
+ SE: { lat: 60.13, lng: 18.64, name: "Sweden" },
19
+ NO: { lat: 60.47, lng: 8.47, name: "Norway" },
20
+ DK: { lat: 56.26, lng: 9.5, name: "Denmark" },
21
+ FI: { lat: 61.92, lng: 25.75, name: "Finland" },
22
+ IE: { lat: 53.41, lng: -8.24, name: "Ireland" },
23
+ GR: { lat: 39.07, lng: 21.82, name: "Greece" },
24
+ HR: { lat: 45.1, lng: 15.2, name: "Croatia" },
25
+ SI: { lat: 46.15, lng: 14.99, name: "Slovenia" },
26
+ HU: { lat: 47.16, lng: 19.5, name: "Hungary" },
27
+ CZ: { lat: 49.82, lng: 15.47, name: "Czech Republic" },
28
+ SK: { lat: 48.67, lng: 19.7, name: "Slovakia" },
29
+ PL: { lat: 51.92, lng: 19.14, name: "Poland" },
30
+ RO: { lat: 45.94, lng: 24.97, name: "Romania" },
31
+ BG: { lat: 42.73, lng: 25.49, name: "Bulgaria" },
32
+ MD: { lat: 47.41, lng: 28.37, name: "Moldova" },
33
+ UA: { lat: 48.38, lng: 31.17, name: "Ukraine" },
34
+ RS: { lat: 44.02, lng: 21.01, name: "Serbia" },
35
+ ME: { lat: 42.71, lng: 19.37, name: "Montenegro" },
36
+ BA: { lat: 44.16, lng: 17.68, name: "Bosnia and Herzegovina" },
37
+ MK: { lat: 41.61, lng: 21.75, name: "North Macedonia" },
38
+ AL: { lat: 41.15, lng: 20.17, name: "Albania" },
39
+ LU: { lat: 49.82, lng: 6.13, name: "Luxembourg" },
40
+ MT: { lat: 35.94, lng: 14.37, name: "Malta" },
41
+ CY: { lat: 35.13, lng: 33.43, name: "Cyprus" },
42
+ // Americas
43
+ US: { lat: 37.09, lng: -95.71, name: "United States" },
44
+ CA: { lat: 56.13, lng: -106.35, name: "Canada" },
45
+ MX: { lat: 23.63, lng: -102.55, name: "Mexico" },
46
+ AR: { lat: -38.42, lng: -63.62, name: "Argentina" },
47
+ CL: { lat: -35.68, lng: -71.54, name: "Chile" },
48
+ BR: { lat: -14.24, lng: -51.93, name: "Brazil" },
49
+ UY: { lat: -32.52, lng: -55.77, name: "Uruguay" },
50
+ PE: { lat: -9.19, lng: -75.02, name: "Peru" },
51
+ CO: { lat: 4.57, lng: -74.3, name: "Colombia" },
52
+ EC: { lat: -1.83, lng: -78.18, name: "Ecuador" },
53
+ BO: { lat: -16.29, lng: -63.59, name: "Bolivia" },
54
+ // Oceania
55
+ AU: { lat: -25.27, lng: 133.78, name: "Australia" },
56
+ NZ: { lat: -40.9, lng: 174.89, name: "New Zealand" },
57
+ // Asia
58
+ CN: { lat: 35.86, lng: 104.2, name: "China" },
59
+ JP: { lat: 36.2, lng: 138.25, name: "Japan" },
60
+ KR: { lat: 35.91, lng: 127.77, name: "South Korea" },
61
+ IN: { lat: 20.59, lng: 78.96, name: "India" },
62
+ SG: { lat: 1.35, lng: 103.82, name: "Singapore" },
63
+ HK: { lat: 22.32, lng: 114.17, name: "Hong Kong" },
64
+ TW: { lat: 23.7, lng: 120.96, name: "Taiwan" },
65
+ TH: { lat: 15.87, lng: 100.99, name: "Thailand" },
66
+ VN: { lat: 14.06, lng: 108.28, name: "Vietnam" },
67
+ MY: { lat: 4.21, lng: 101.98, name: "Malaysia" },
68
+ ID: { lat: -0.79, lng: 113.92, name: "Indonesia" },
69
+ PH: { lat: 12.88, lng: 121.77, name: "Philippines" },
70
+ PK: { lat: 30.38, lng: 69.35, name: "Pakistan" },
71
+ BD: { lat: 23.68, lng: 90.36, name: "Bangladesh" },
72
+ LK: { lat: 7.87, lng: 80.77, name: "Sri Lanka" },
73
+ NP: { lat: 28.39, lng: 84.12, name: "Nepal" },
74
+ IL: { lat: 31.05, lng: 34.85, name: "Israel" },
75
+ TR: { lat: 38.96, lng: 35.24, name: "Turkey" },
76
+ GE: { lat: 42.32, lng: 43.36, name: "Georgia" },
77
+ AM: { lat: 40.07, lng: 45.04, name: "Armenia" },
78
+ AZ: { lat: 40.14, lng: 47.58, name: "Azerbaijan" },
79
+ UZ: { lat: 41.38, lng: 64.59, name: "Uzbekistan" },
80
+ KZ: { lat: 48.02, lng: 66.92, name: "Kazakhstan" },
81
+ AE: { lat: 23.42, lng: 53.85, name: "United Arab Emirates" },
82
+ SA: { lat: 23.89, lng: 45.08, name: "Saudi Arabia" },
83
+ QA: { lat: 25.35, lng: 51.18, name: "Qatar" },
84
+ // Africa
85
+ ZA: { lat: -30.56, lng: 22.94, name: "South Africa" },
86
+ MA: { lat: 31.79, lng: -7.09, name: "Morocco" },
87
+ TN: { lat: 33.89, lng: 9.54, name: "Tunisia" },
88
+ DZ: { lat: 28.03, lng: 1.66, name: "Algeria" },
89
+ EG: { lat: 26.82, lng: 30.8, name: "Egypt" },
90
+ NG: { lat: 9.08, lng: 8.68, name: "Nigeria" },
91
+ ET: { lat: 9.15, lng: 40.49, name: "Ethiopia" },
92
+ KE: { lat: -0.02, lng: 37.91, name: "Kenya" },
93
+ GH: { lat: 7.95, lng: -1.02, name: "Ghana" },
94
+ TZ: { lat: -6.37, lng: 34.89, name: "Tanzania" },
95
+ };
96
+ /**
97
+ * Look up coordinates for an ISO-3166-1 alpha-2 country code.
98
+ * Returns null if the code is unknown.
99
+ */
100
+ export function countryCoords(code) {
101
+ if (!code)
102
+ return null;
103
+ const normalized = code.trim().toUpperCase();
104
+ return COUNTRY_COORDS[normalized] ?? null;
105
+ }
106
+ /**
107
+ * Batch look up coordinates, skipping unknown codes.
108
+ */
109
+ export function resolveCountries(codes) {
110
+ return codes.flatMap((code) => {
111
+ const coords = countryCoords(code);
112
+ if (!coords)
113
+ return [];
114
+ return [{ code: code.toUpperCase(), ...coords }];
115
+ });
116
+ }
117
+ //# sourceMappingURL=country-coords.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"country-coords.js","sourceRoot":"","sources":["../../src/globe/country-coords.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Animated loading skeleton shown while globe data is being fetched.
3
+ * Renders a pulsing globe silhouette with arc-trace lines and a status label.
4
+ */
5
+ export declare function GlobeLoadingSkeleton({ height, label, className, }: {
6
+ height?: string;
7
+ label?: string;
8
+ className?: string;
9
+ }): import("react/jsx-runtime").JSX.Element;
10
+ //# sourceMappingURL=globe-loading-skeleton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"globe-loading-skeleton.d.ts","sourceRoot":"","sources":["../../src/globe/globe-loading-skeleton.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,MAAoC,EACpC,KAA+B,EAC/B,SAAc,GACf,EAAE;IACD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,2CA4DA"}
@@ -0,0 +1,23 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * Animated loading skeleton shown while globe data is being fetched.
4
+ * Renders a pulsing globe silhouette with arc-trace lines and a status label.
5
+ */
6
+ export function GlobeLoadingSkeleton({ height = "clamp(320px, 40vw, 450px)", label = "Mapping global flows…", className = "", }) {
7
+ return (_jsxs("div", { className: `relative flex flex-col items-center justify-center overflow-hidden rounded-xl bg-primary/5 dark:bg-white/[0.03] ${className}`, style: { height }, "aria-label": label, "aria-busy": "true", children: [_jsxs("div", { className: "relative", children: [_jsx("div", { className: "absolute inset-0 rounded-full animate-ping bg-primary/10 dark:bg-white/5 scale-110" }), _jsxs("div", { className: "relative size-36 rounded-full border-2 border-primary/20 dark:border-white/10 bg-primary/5 dark:bg-white/5 animate-pulse", children: [_jsx("div", { className: "absolute inset-x-0 top-[30%] h-px bg-primary/15 dark:bg-white/10" }), _jsx("div", { className: "absolute inset-x-0 top-[50%] h-px bg-primary/20 dark:bg-white/15" }), _jsx("div", { className: "absolute inset-x-0 top-[70%] h-px bg-primary/15 dark:bg-white/10" }), _jsx("div", { className: "absolute inset-y-0 left-[50%] w-px -translate-x-1/2 bg-primary/15 dark:bg-white/10" }), _jsx("div", { className: "absolute inset-y-0 bg-primary/10 dark:bg-white/8", style: {
8
+ left: "25%",
9
+ right: "25%",
10
+ borderLeft: "1px solid",
11
+ borderRight: "1px solid",
12
+ borderColor: "rgba(var(--color-primary-rgb, 14 165 114) / 0.12)",
13
+ borderRadius: "50%",
14
+ } })] })] }), _jsxs("svg", { className: "absolute inset-0 size-full opacity-30", viewBox: "0 0 400 400", fill: "none", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true", children: [_jsx(ArcTrace, { d: "M 60 250 Q 200 80 340 200", delay: "0s" }), _jsx(ArcTrace, { d: "M 80 180 Q 180 300 320 160", delay: "0.4s" }), _jsx(ArcTrace, { d: "M 100 300 Q 230 120 360 280", delay: "0.8s" }), _jsx(ArcTrace, { d: "M 50 200 Q 160 60 300 220", delay: "1.2s" })] }), _jsxs("div", { className: "mt-6 flex items-center gap-2", children: [_jsx("span", { className: "inline-block size-1.5 rounded-full bg-primary/60 dark:bg-white/40 animate-bounce [animation-delay:0ms]" }), _jsx("span", { className: "inline-block size-1.5 rounded-full bg-primary/60 dark:bg-white/40 animate-bounce [animation-delay:150ms]" }), _jsx("span", { className: "inline-block size-1.5 rounded-full bg-primary/60 dark:bg-white/40 animate-bounce [animation-delay:300ms]" }), _jsx("span", { className: "ml-2 text-xs font-medium text-muted-foreground/70 tracking-wide", children: label })] })] }));
15
+ }
16
+ function ArcTrace({ d, delay }) {
17
+ return (_jsx("path", { d: d, stroke: "currentColor", strokeWidth: "1.5", strokeDasharray: "6 4", className: "text-primary dark:text-white", style: {
18
+ animation: `dash-trace 2s linear infinite`,
19
+ animationDelay: delay,
20
+ opacity: 0.4,
21
+ } }));
22
+ }
23
+ //# sourceMappingURL=globe-loading-skeleton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"globe-loading-skeleton.js","sourceRoot":"","sources":["../../src/globe/globe-loading-skeleton.tsx"],"names":[],"mappings":";AAAA;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,EACnC,MAAM,GAAG,2BAA2B,EACpC,KAAK,GAAG,uBAAuB,EAC/B,SAAS,GAAG,EAAE,GAKf;IACC,OAAO,CACL,eACE,SAAS,EAAE,mHAAmH,SAAS,EAAE,EACzI,KAAK,EAAE,EAAE,MAAM,EAAE,gBACL,KAAK,eACP,MAAM,aAGhB,eAAK,SAAS,EAAC,UAAU,aAEvB,cAAK,SAAS,EAAC,oFAAoF,GAAG,EAEtG,eAAK,SAAS,EAAC,0HAA0H,aAEvI,cAAK,SAAS,EAAC,kEAAkE,GAAG,EACpF,cAAK,SAAS,EAAC,kEAAkE,GAAG,EACpF,cAAK,SAAS,EAAC,kEAAkE,GAAG,EAEpF,cAAK,SAAS,EAAC,oFAAoF,GAAG,EAEtG,cACE,SAAS,EAAC,kDAAkD,EAC5D,KAAK,EAAE;oCACL,IAAI,EAAE,KAAK;oCACX,KAAK,EAAE,KAAK;oCACZ,UAAU,EAAE,WAAW;oCACvB,WAAW,EAAE,WAAW;oCACxB,WAAW,EAAE,mDAAmD;oCAChE,YAAY,EAAE,KAAK;iCACpB,GACD,IACE,IACF,EAGN,eACE,SAAS,EAAC,uCAAuC,EACjD,OAAO,EAAC,aAAa,EACrB,IAAI,EAAC,MAAM,EACX,KAAK,EAAC,4BAA4B,iBACtB,MAAM,aAElB,KAAC,QAAQ,IAAC,CAAC,EAAC,2BAA2B,EAAC,KAAK,EAAC,IAAI,GAAG,EACrD,KAAC,QAAQ,IAAC,CAAC,EAAC,4BAA4B,EAAC,KAAK,EAAC,MAAM,GAAG,EACxD,KAAC,QAAQ,IAAC,CAAC,EAAC,6BAA6B,EAAC,KAAK,EAAC,MAAM,GAAG,EACzD,KAAC,QAAQ,IAAC,CAAC,EAAC,2BAA2B,EAAC,KAAK,EAAC,MAAM,GAAG,IACnD,EAGN,eAAK,SAAS,EAAC,8BAA8B,aAC3C,eAAM,SAAS,EAAC,wGAAwG,GAAG,EAC3H,eAAM,SAAS,EAAC,0GAA0G,GAAG,EAC7H,eAAM,SAAS,EAAC,0GAA0G,GAAG,EAC7H,eAAM,SAAS,EAAC,iEAAiE,YAC9E,KAAK,GACD,IACH,IACF,CACP,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,EAAE,CAAC,EAAE,KAAK,EAAgC;IAC1D,OAAO,CACL,eACE,CAAC,EAAE,CAAC,EACJ,MAAM,EAAC,cAAc,EACrB,WAAW,EAAC,KAAK,EACjB,eAAe,EAAC,KAAK,EACrB,SAAS,EAAC,8BAA8B,EACxC,KAAK,EAAE;YACL,SAAS,EAAE,+BAA+B;YAC1C,cAAc,EAAE,KAAK;YACrB,OAAO,EAAE,GAAG;SACb,GACD,CACH,CAAC;AACJ,CAAC"}
@@ -9,4 +9,6 @@ export { useElectronEmitter } from "./electron-arc";
9
9
  export { GlobeView } from "./globe-view";
10
10
  export type { GlobeViewProps } from "./globe-view";
11
11
  export { addStarfield, addHalo, getVignetteStyle } from "./scene-extras";
12
+ export { GlobeLoadingSkeleton } from "./globe-loading-skeleton";
13
+ export { countryCoords, resolveCountries, COUNTRY_COORDS } from "./country-coords";
12
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/globe/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,QAAQ,EACR,UAAU,EACV,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AAEvB,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAEjG,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC3F,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE1E,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEpD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/globe/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,QAAQ,EACR,UAAU,EACV,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AAEvB,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAEjG,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC3F,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE1E,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEpD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}