@workspace-platform/ui 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin.d.mts +23 -1
- package/dist/admin.d.ts +23 -1
- package/dist/admin.js +2385 -0
- package/dist/admin.js.map +1 -1
- package/dist/admin.mjs +1857 -0
- package/dist/admin.mjs.map +1 -1
- package/dist/chunk-4UDSYAAD.mjs +735 -0
- package/dist/chunk-4UDSYAAD.mjs.map +1 -0
- package/dist/index.mjs +1147 -1849
- package/dist/index.mjs.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/api/client.ts","../src/socket/client.ts","../src/theme.ts","../src/theme-context.tsx","../src/styling.ts","../src/components/ui/cn.ts","../src/provider.tsx","../src/api/index.ts","../src/hooks/useWorkspaceApi.ts","../src/components/ui/Modal.tsx","../src/components/ui/Button.tsx","../src/components/ui/ConfirmModal.tsx"],"sourcesContent":["import type { WorkspaceConfig } from '../provider';\n\n// ─── Decoupled Workspace API HTTP Client ──────────────────────────────────────\n// Uses config from WorkspaceProvider instead of localStorage.\n\nexport interface WorkspaceClient {\n get: <T>(path: string) => Promise<T>;\n post: <T>(path: string, body: unknown) => Promise<T>;\n patch: <T>(path: string, body: unknown) => Promise<T>;\n delete: <T>(path: string) => Promise<T>;\n upload: <T>(path: string, formData: FormData) => Promise<T>;\n getBlob: (path: string) => Promise<Blob>;\n}\n\nexport function createWorkspaceClient(config: WorkspaceConfig): WorkspaceClient {\n function buildHeaders(extra?: HeadersInit): Record<string, string> {\n const base: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...(extra as Record<string, string> | undefined),\n };\n const token = config.getAuthToken();\n if (token) base['Authorization'] = `Bearer ${token}`;\n if (config.extraHeaders) Object.assign(base, config.extraHeaders);\n return base;\n }\n\n async function req<T>(path: string, options?: RequestInit): Promise<T> {\n const res = await fetch(`${config.baseUrl}${path}`, {\n ...options,\n headers: buildHeaders(options?.headers),\n });\n if (res.status === 204) return undefined as T;\n const json = await res.json();\n if (!res.ok) {\n const rawMessage = json?.message ?? `Error ${res.status}`;\n const errorMessage = Array.isArray(rawMessage)\n ? rawMessage.join(', ')\n : typeof rawMessage === 'string'\n ? rawMessage\n : JSON.stringify(rawMessage);\n throw new Error(errorMessage);\n }\n return json as T;\n }\n\n async function reqBlob(path: string): Promise<Blob> {\n const res = await fetch(`${config.baseUrl}${path}`, {\n headers: buildHeaders(),\n });\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new Error(`Error ${res.status}: ${text}`);\n }\n return res.blob();\n }\n\n async function upload<T>(path: string, formData: FormData): Promise<T> {\n const headers: Record<string, string> = {};\n const token = config.getAuthToken();\n if (token) headers['Authorization'] = `Bearer ${token}`;\n if (config.extraHeaders) Object.assign(headers, config.extraHeaders);\n // Do NOT set Content-Type — browser handles multipart boundary\n const res = await fetch(`${config.baseUrl}${path}`, {\n method: 'POST',\n headers,\n body: formData,\n });\n if (!res.ok) {\n const json = await res.json().catch(() => ({}));\n throw new Error(\n (json as { message?: string })?.message ??\n `Upload failed (${res.status})`\n );\n }\n return res.json();\n }\n\n return {\n get: <T>(path: string) => req<T>(path),\n post: <T>(path: string, body: unknown) =>\n req<T>(path, { method: 'POST', body: JSON.stringify(body) }),\n patch: <T>(path: string, body: unknown) =>\n req<T>(path, { method: 'PATCH', body: JSON.stringify(body) }),\n delete: <T>(path: string) => req<T>(path, { method: 'DELETE' }),\n upload: <T>(path: string, formData: FormData) => upload<T>(path, formData),\n getBlob: (path: string) => reqBlob(path),\n };\n}\n","import { io, Socket } from 'socket.io-client';\nimport type { WorkspaceConfig } from '../provider';\n\n// ─── Decoupled Workspace Socket.IO Client ─────────────────────────────────────\n\nexport interface WorkspaceSocketManager {\n getSocket: () => Socket;\n connect: (userId?: string) => Socket;\n disconnect: () => void;\n}\n\nexport function createWorkspaceSocket(\n config: WorkspaceConfig\n): WorkspaceSocketManager {\n let socket: Socket | null = null;\n\n function getSocket(): Socket {\n if (!socket) {\n const token = config.getAuthToken();\n socket = io(`${config.baseUrl}/workspaces`, {\n autoConnect: false,\n auth: { token: token ?? '' },\n });\n }\n return socket;\n }\n\n function connect(userId?: string): Socket {\n const s = getSocket();\n if (!s.connected) s.connect();\n const uid = userId ?? config.currentUserId;\n if (uid) {\n if (s.connected) {\n s.emit('authenticate', { userId: uid });\n } else {\n s.once('connect', () => {\n s.emit('authenticate', { userId: uid });\n });\n }\n }\n return s;\n }\n\n function disconnect() {\n socket?.disconnect();\n socket = null;\n }\n\n return { getSocket, connect, disconnect };\n}\n","import type React from 'react';\n\n/** Light or dark base palette for the workspace UI. */\nexport type WorkspaceColorScheme = 'light' | 'dark';\n\n/**\n * Theme override for the workspace UI. Only `primary` and `secondary` are\n * required to rebrand the whole surface — every shade (hover / light / tints)\n * is derived automatically with CSS `color-mix()`.\n *\n * Any other token can be overridden too (useful for dark themes or matching a\n * host design system exactly).\n */\nexport interface WorkspaceTheme {\n /** Main brand color (buttons, active states, user bubbles…). */\n primary?: string;\n /** Text/icon color rendered on top of the primary color. */\n primaryContrast?: string;\n /** Secondary/accent brand color. */\n secondary?: string;\n /** Text/icon color rendered on top of the secondary color. */\n secondaryContrast?: string;\n\n /** App background. */\n bg?: string;\n /** Subtle background (hover rows, tracks…). */\n bgSubtle?: string;\n /** Card / panel surface. */\n surface?: string;\n /** Surface hover state. */\n surfaceHover?: string;\n\n /** Default border color. */\n border?: string;\n /** Lighter border color. */\n borderLight?: string;\n\n /** Primary text color. */\n text?: string;\n /** Secondary text color. */\n textSecondary?: string;\n /** Muted text color. */\n textMuted?: string;\n /** Placeholder text color. */\n textPlaceholder?: string;\n\n danger?: string;\n success?: string;\n warning?: string;\n info?: string;\n}\n\ntype CSSVars = React.CSSProperties & Record<`--${string}`, string>;\n\nconst mix = (color: string, amount: number, other: string) =>\n `color-mix(in srgb, ${color} ${amount}%, ${other})`;\n\n/**\n * Build the inline CSS custom properties that theme the workspace UI.\n * Returns a style object safe to spread onto a wrapper element.\n *\n * When `scheme === 'dark'`, brand tints are re-mixed against a dark base so the\n * derived shades keep enough contrast on dark surfaces (matching the\n * `.ws-theme-dark` defaults in styles.css). Neutral tokens (bg/surface/text…)\n * come from the `.ws-theme-dark` class unless explicitly overridden here.\n */\nexport function buildThemeVars(\n theme?: WorkspaceTheme,\n scheme: WorkspaceColorScheme = 'light',\n): CSSVars {\n const vars: CSSVars = {};\n if (!theme) return vars;\n\n const dark = scheme === 'dark';\n // Base to mix light tints against, and direction for hover.\n const tintBase = dark ? '#0b1220' : '#fff';\n\n const set = (name: string, value?: string) => {\n if (value != null && value !== '') vars[`--ws-${name}` as `--${string}`] = value;\n };\n\n if (theme.primary) {\n set('primary', theme.primary);\n set('primary-hover', dark ? mix(theme.primary, 82, '#fff') : mix(theme.primary, 86, '#000'));\n set('primary-light', mix(theme.primary, dark ? 26 : 12, tintBase));\n set('primary-50', mix(theme.primary, dark ? 14 : 6, tintBase));\n set('primary-100', mix(theme.primary, dark ? 20 : 14, tintBase));\n set('primary-200', mix(theme.primary, dark ? 34 : 28, tintBase));\n }\n set('primary-contrast', theme.primaryContrast);\n\n if (theme.secondary) {\n set('secondary', theme.secondary);\n set('secondary-hover', dark ? mix(theme.secondary, 82, '#fff') : mix(theme.secondary, 86, '#000'));\n set('secondary-light', mix(theme.secondary, dark ? 26 : 12, tintBase));\n }\n set('secondary-contrast', theme.secondaryContrast);\n\n set('bg', theme.bg);\n set('bg-subtle', theme.bgSubtle);\n set('surface', theme.surface);\n set('surface-hover', theme.surfaceHover);\n set('border', theme.border);\n set('border-light', theme.borderLight);\n set('text', theme.text);\n set('text-secondary', theme.textSecondary);\n set('text-muted', theme.textMuted);\n set('text-placeholder', theme.textPlaceholder);\n set('danger', theme.danger);\n set('success', theme.success);\n set('warning', theme.warning);\n set('info', theme.info);\n\n return vars;\n}\n","'use client';\n\nimport React, { createContext, useContext } from 'react';\n\n/**\n * Theme attributes that must be re-applied on elements rendered OUTSIDE the\n * provider's DOM subtree — most importantly React portals (modals), which\n * mount on `document.body` and therefore don't inherit the `--ws-*` custom\n * properties set on the provider wrapper.\n *\n * `Modal` reads this via {@link useWorkspaceThemeAttrs} and spreads it onto its\n * portal root so modals stay branded (and never fall back to the light\n * defaults / become transparent) in both light and dark mode.\n */\nexport interface WorkspaceThemeAttrs {\n /** Class name carrying the color-scheme (e.g. `ws-root ws-theme-dark`). */\n className: string;\n /** Inline `--ws-*` custom properties from the active theme. */\n style: React.CSSProperties;\n}\n\nconst EMPTY: WorkspaceThemeAttrs = { className: '', style: {} };\n\nexport const WorkspaceThemeContext = createContext<WorkspaceThemeAttrs>(EMPTY);\n\n/**\n * Returns the theme class + inline vars to re-apply on portal roots.\n * Safe to call outside a provider — returns empty attrs so primitives like\n * `Modal` remain usable standalone.\n */\nexport function useWorkspaceThemeAttrs(): WorkspaceThemeAttrs {\n return useContext(WorkspaceThemeContext);\n}\n","'use client';\n\nimport { createContext, useContext } from 'react';\nimport { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\n/**\n * Style override for one component.\n *\n * Either a single string — applied to the component's root element — or a map\n * targeting individual slots (inner elements) for finer control:\n *\n * ```tsx\n * <WorkspaceCard classNames=\"rounded-none\" />\n * <WorkspaceCard classNames={{ root: 'rounded-none', title: 'text-base' }} />\n * ```\n */\nexport type WorkspaceSlotOverride<Slot extends string = never> =\n | string\n | Partial<Record<Slot | 'root', string>>;\n\n/**\n * App-wide component style overrides, passed once through\n * `WorkspaceConfig.classNames`. Every entry is merged with the component's own\n * classes using `tailwind-merge`, so conflicting Tailwind utilities are\n * replaced rather than duplicated (`bg-surface` + `bg-white` → `bg-white`).\n *\n * Precedence, lowest to highest:\n * `component defaults` → `config.classNames` → per-instance `classNames`\n * → per-instance `className`.\n *\n * For anything not reachable here, every element also carries a stable\n * `ws-*` class you can target from plain CSS (see STYLING.md).\n */\n/** Slots shared by every right-drawer panel. */\nexport type PanelSlot = 'header' | 'title' | 'body' | 'empty';\nexport type PanelSlotOverride = WorkspaceSlotOverride<PanelSlot>;\n\nexport interface WorkspaceClassNames {\n // ── Primitives ──\n button?: WorkspaceSlotOverride;\n iconButton?: WorkspaceSlotOverride;\n card?: WorkspaceSlotOverride;\n badge?: WorkspaceSlotOverride;\n tooltip?: WorkspaceSlotOverride<'bubble'>;\n /** `root` is the full-screen overlay (the backdrop); `panel` is the dialog. */\n modal?: WorkspaceSlotOverride<\n 'panel' | 'header' | 'title' | 'description' | 'close'\n >;\n input?: WorkspaceSlotOverride;\n textarea?: WorkspaceSlotOverride;\n select?: WorkspaceSlotOverride;\n field?: WorkspaceSlotOverride<'label' | 'error' | 'hint'>;\n emojiPicker?: WorkspaceSlotOverride;\n memberAvatar?: WorkspaceSlotOverride;\n pagination?: WorkspaceSlotOverride;\n sidePanel?: WorkspaceSlotOverride;\n\n // ── Workspace listing ──\n workspaceCard?: WorkspaceSlotOverride<'header' | 'title' | 'body' | 'footer'>;\n workspaceRow?: WorkspaceSlotOverride<'title'>;\n workspaceList?: WorkspaceSlotOverride<'grid' | 'empty'>;\n\n // ── Chat ──\n messageFeed?: WorkspaceSlotOverride<'empty'>;\n messageItem?: WorkspaceSlotOverride<\n 'avatar' | 'bubble' | 'header' | 'body' | 'actions' | 'reactions' | 'attachments'\n >;\n messageInput?: WorkspaceSlotOverride<'field' | 'toolbar' | 'send'>;\n\n /** Applies to every right-drawer panel; refine with the keys below. */\n panel?: PanelSlotOverride;\n contextPanel?: PanelSlotOverride;\n membersPanel?: PanelSlotOverride;\n syncPanel?: PanelSlotOverride;\n artifactsPanel?: PanelSlotOverride;\n pinnedMessagesPanel?: PanelSlotOverride;\n summaryPanel?: PanelSlotOverride;\n activityPanel?: PanelSlotOverride;\n}\n\nexport type WorkspaceComponentKey = keyof WorkspaceClassNames;\n\nconst EMPTY: WorkspaceClassNames = {};\n\nexport const WorkspaceStylesContext = createContext<WorkspaceClassNames>(EMPTY);\n\n/** The app-wide overrides currently in effect. Empty outside a provider. */\nexport function useWorkspaceClassNames(): WorkspaceClassNames {\n return useContext(WorkspaceStylesContext);\n}\n\nfunction pickSlot(\n override: WorkspaceSlotOverride<string> | undefined,\n slot: string,\n): string | undefined {\n if (!override) return undefined;\n // The string shorthand only ever targets the root element.\n if (typeof override === 'string') return slot === 'root' ? override : undefined;\n return override[slot];\n}\n\n/** Resolves the classes for one slot: `base` first, overrides last. */\nexport type SlotResolver<Slot extends string> = (\n slot: Slot | 'root',\n ...base: ClassValue[]\n) => string;\n\n/**\n * Builds the class resolver a component uses for each of its slots.\n *\n * `keys` may list several registry entries (e.g. `['panel', 'contextPanel']`)\n * — they apply in order, so the more specific one wins.\n *\n * The `className` prop is applied to the root slot only, last, so a\n * per-instance class always beats every other source.\n */\nexport function useSlots<Slot extends string = never>(\n keys: WorkspaceComponentKey | WorkspaceComponentKey[],\n local?: WorkspaceSlotOverride<Slot>,\n className?: string,\n): SlotResolver<Slot> {\n const registry = useContext(WorkspaceStylesContext);\n const keyList = Array.isArray(keys) ? keys : [keys];\n\n return (slot, ...base) =>\n twMerge(\n clsx(\n ...base,\n ...keyList.map((key) => pickSlot(registry[key], slot)),\n pickSlot(local, slot),\n slot === 'root' ? className : undefined,\n ),\n );\n}\n","import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import React, { createContext, useContext, useMemo } from 'react';\nimport { createWorkspaceClient, type WorkspaceClient } from './api/client';\nimport { createWorkspaceSocket, type WorkspaceSocketManager } from './socket/client';\nimport { buildThemeVars, type WorkspaceTheme, type WorkspaceColorScheme } from './theme';\nimport { WorkspaceThemeContext } from './theme-context';\nimport { WorkspaceStylesContext, type WorkspaceClassNames } from './styling';\nimport { cn } from './components/ui/cn';\n\n// ─── Config types ─────────────────────────────────────────────────────────────\n\nexport interface UserSearchResult {\n id: string;\n email: string;\n displayName: string;\n avatarUrl?: string;\n}\n\nexport interface WorkspaceConfig {\n /** Base URL of the workspace-platform server (e.g. http://localhost:3100) */\n baseUrl: string;\n /** Function that returns the current Bearer token (JWT) */\n getAuthToken: () => string | null;\n /** Current user identifier (email or ID) — used for socket auth & UI */\n currentUserId: string | null;\n /** Current user display name */\n currentUserName?: string | null;\n /** Optional: additional headers for API requests (e.g. { 'x-auth-mode': 'keycloak' }) */\n extraHeaders?: Record<string, string>;\n /** Optional: function to search users for member invitation */\n searchUsers?: (query: string) => Promise<UserSearchResult[]>;\n /** Optional: function to resolve user avatar URLs by email */\n resolveAvatars?: (memberIds: string[]) => Promise<Record<string, string>>;\n /** Optional: callback when navigating to a workspace */\n onNavigateToWorkspace?: (workspaceId: string) => void;\n /**\n * Optional: brand colors for this project. Provide at least `primary` and\n * `secondary` — all derived shades are computed automatically.\n */\n theme?: WorkspaceTheme;\n /**\n * Optional: light or dark base palette. Pass this from the host app (e.g.\n * following the user's OS / app theme). Defaults to `'light'`. Neutral tokens\n * (backgrounds, surfaces, text, borders) switch automatically; brand colors\n * from `theme` are re-tinted to stay legible on dark surfaces.\n */\n colorScheme?: WorkspaceColorScheme;\n /**\n * Optional: app-wide component style overrides. Use this when the `theme`\n * tokens aren't enough and you need to restyle components themselves (e.g.\n * square corners on every card, a different message bubble).\n *\n * Merged with `tailwind-merge`, so conflicting utilities replace the\n * defaults instead of stacking. Per-instance `classNames` / `className`\n * props still win over anything set here.\n */\n classNames?: WorkspaceClassNames;\n}\n\n// ─── Context ──────────────────────────────────────────────────────────────────\n\nexport interface WorkspaceContextValue {\n config: WorkspaceConfig;\n apiClient: WorkspaceClient;\n socket: WorkspaceSocketManager;\n}\n\nconst WorkspaceContext = createContext<WorkspaceContextValue | null>(null);\n\n// Stable identity so consumers that omit `classNames` never re-render the tree.\nconst EMPTY_CLASS_NAMES: WorkspaceClassNames = {};\n\nexport function WorkspaceProvider({\n config,\n children,\n}: {\n config: WorkspaceConfig;\n children: React.ReactNode;\n}) {\n const value = useMemo(() => {\n const apiClient = createWorkspaceClient(config);\n const socket = createWorkspaceSocket(config);\n return { config, apiClient, socket };\n }, [config.baseUrl, config.currentUserId]);\n\n const isDark = config.colorScheme === 'dark';\n\n const themeVars = useMemo(\n () => buildThemeVars(config.theme, config.colorScheme),\n [config.theme, config.colorScheme],\n );\n\n // The class carries the color-scheme; the style carries brand overrides.\n const themeClassName = cn('ws-root', isDark && 'ws-theme-dark');\n\n const themeAttrs = useMemo(\n () => ({ className: themeClassName, style: themeVars as React.CSSProperties }),\n [themeClassName, themeVars],\n );\n\n const classNames = config.classNames ?? EMPTY_CLASS_NAMES;\n\n return (\n <WorkspaceContext.Provider value={value}>\n <WorkspaceStylesContext.Provider value={classNames}>\n <WorkspaceThemeContext.Provider value={themeAttrs}>\n {/* Always rendered, even with no theme overrides: `.ws-root` is the\n * scope the stylesheet uses for element-level rules (cursors,\n * hover affordances), so it has to exist unconditionally.\n * `display: contents` keeps it out of the layout box tree while\n * still letting the --ws-* custom properties (and the color-scheme\n * class) inherit down to every child. */}\n <div\n className={themeClassName}\n style={{ display: 'contents', ...themeVars }}\n >\n {children}\n </div>\n </WorkspaceThemeContext.Provider>\n </WorkspaceStylesContext.Provider>\n </WorkspaceContext.Provider>\n );\n}\n\nexport function useWorkspaceContext(): WorkspaceContextValue {\n const ctx = useContext(WorkspaceContext);\n if (!ctx)\n throw new Error(\n 'useWorkspaceContext must be used within <WorkspaceProvider>'\n );\n return ctx;\n}\n","import type { WorkspaceClient } from './client';\nimport type {\n Workspace,\n WorkspaceType,\n WorkspaceMember,\n WorkspaceMessage,\n WorkspaceArtefact,\n WorkspaceMessageReaction,\n MessageWithArtefacts,\n PaginatedResponse,\n CreateWorkspacePayload,\n SendMessagePayload,\n UpdateMessagePayload,\n WebhookSubscription,\n WorkspaceStatus,\n MemberRole,\n MemberType,\n ArtefactType,\n WorkspaceAgent,\n AgentDeleteInfo,\n EntityWithSecret,\n WorkspaceSummary,\n LatestSummaryResponse,\n} from '../types';\n\n// ─── Sync types (co-located with API for convenience) ─────────────────────────\n\nexport interface SyncLink {\n provider: string;\n externalId: string;\n externalName?: string;\n externalTeamId?: string;\n active: boolean;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface SyncStatus {\n syncWithSlack: boolean;\n syncProviders?: string[];\n links: SyncLink[];\n}\n\nexport interface SyncProviderInfo {\n id: string;\n enabled: boolean;\n}\n\nexport interface ToggleReactionResponse {\n action: 'created' | 'deleted';\n reaction: WorkspaceMessageReaction | null;\n}\n\n// ─── API factory ──────────────────────────────────────────────────────────────\n// Each API object uses the injected client (from WorkspaceProvider).\n\nexport function createWorkspaceApis(client: WorkspaceClient) {\n // ── Workspace Types ──\n const workspaceTypeApi = {\n list: () => client.get<WorkspaceType[]>('/workspace-types'),\n get: (id: string) => client.get<WorkspaceType>(`/workspace-types/${id}`),\n create: (payload: { name: string; entitiesWithSecrets?: EntityWithSecret[] }) =>\n client.post<WorkspaceType>('/workspace-types', payload),\n update: (id: string, payload: { name?: string; entitiesWithSecrets?: EntityWithSecret[] }) =>\n client.patch<WorkspaceType>(`/workspace-types/${id}`, payload),\n delete: (id: string) => client.delete<void>(`/workspace-types/${id}`),\n };\n\n // ── Workspaces ──\n const workspaceApi = {\n list: (params?: {\n search?: string;\n status?: string;\n type?: string;\n isPrivate?: boolean;\n limit?: number;\n skip?: number;\n }) => {\n const cleanParams = Object.fromEntries(\n Object.entries(params || {})\n .filter(([, v]) => v != null && v !== '' && v !== 'all')\n .map(([k, v]) => [k, String(v)])\n );\n const qs =\n Object.keys(cleanParams).length > 0\n ? '?' + new URLSearchParams(cleanParams as Record<string, string>).toString()\n : '';\n return client.get<PaginatedResponse<Workspace>>(`/workspaces${qs}`);\n },\n get: (id: string) => client.get<Workspace>(`/workspaces/${id}`),\n create: (payload: CreateWorkspacePayload) =>\n client.post<Workspace>('/workspaces', payload),\n update: (id: string, payload: Partial<Omit<CreateWorkspacePayload, 'members'>>) =>\n client.patch<Workspace>(`/workspaces/${id}`, payload),\n updateStatus: (id: string, status: WorkspaceStatus) =>\n client.patch<Workspace>(`/workspaces/${id}/status`, { status }),\n delete: (id: string) => client.delete<void>(`/workspaces/${id}`),\n startTyping: (id: string) => client.post<void>(`/workspaces/${id}/writing/start`, {}),\n stopTyping: (id: string) => client.post<void>(`/workspaces/${id}/writing/stop`, {}),\n timeline: (\n workspaceId: string,\n params?: { limit?: number; offset?: number; entityType?: string }\n ) => {\n const qs = params\n ? '?' +\n new URLSearchParams(\n Object.fromEntries(\n Object.entries(params)\n .filter(([, v]) => v != null)\n .map(([k, v]) => [k, String(v)])\n )\n ).toString()\n : '';\n return client.get<PaginatedResponse<any>>(`/workspaces/${workspaceId}/timeline${qs}`);\n },\n };\n\n // ── Members ──\n const memberApi = {\n list: (workspaceId: string) =>\n client.get<WorkspaceMember[]>(`/workspaces/${workspaceId}/members`),\n add: (\n workspaceId: string,\n payload: { memberId: string; memberName: string; memberType?: MemberType; role?: MemberRole }\n ) => client.post<WorkspaceMember>(`/workspaces/${workspaceId}/members`, payload),\n updateRole: (workspaceId: string, memberId: string, role: MemberRole) =>\n client.patch<WorkspaceMember>(`/workspaces/${workspaceId}/members/${memberId}`, { role }),\n remove: (workspaceId: string, memberId: string) =>\n client.delete<void>(`/workspaces/${workspaceId}/members/${memberId}`),\n };\n\n // ── Messages ──\n const messageApi = {\n list: (\n workspaceId: string,\n params?: { limit?: number; offset?: number; sort?: 'asc' | 'desc' }\n ) => {\n const qs = params\n ? '?' +\n new URLSearchParams(\n Object.fromEntries(\n Object.entries(params)\n .filter(([, v]) => v != null)\n .map(([k, v]) => [k, String(v)])\n )\n ).toString()\n : '';\n return client.get<PaginatedResponse<WorkspaceMessage>>(`/workspaces/${workspaceId}/messages${qs}`);\n },\n send: (workspaceId: string, payload: SendMessagePayload) =>\n client.post<WorkspaceMessage>(`/workspaces/${workspaceId}/messages`, payload),\n update: (workspaceId: string, messageId: string, payload: UpdateMessagePayload) =>\n client.patch<WorkspaceMessage>(`/workspaces/${workspaceId}/messages/${messageId}`, payload),\n delete: (workspaceId: string, messageId: string) =>\n client.delete<WorkspaceMessage>(`/workspaces/${workspaceId}/messages/${messageId}`),\n togglePin: (workspaceId: string, messageId: string) =>\n client.patch<WorkspaceMessage>(`/workspaces/${workspaceId}/messages/${messageId}/pin`, {}),\n };\n\n // ── Artefacts ──\n const artefactApi = {\n upload: async (\n workspaceId: string,\n files: File[],\n messageId?: string,\n artefactType?: string\n ): Promise<{ success: boolean; count: number; results: WorkspaceArtefact[] }> => {\n const formData = new FormData();\n files.forEach((f) => formData.append('files', f));\n if (messageId) formData.append('messageId', messageId);\n if (artefactType) formData.append('type', artefactType);\n return client.upload(`/workspaces/${workspaceId}/artefacts`, formData);\n },\n list: (workspaceId: string, artefactType?: ArtefactType) => {\n const query = artefactType ? `?type=${artefactType}` : '';\n return client.get<{ data: WorkspaceArtefact[]; total: number }>(\n `/workspaces/${workspaceId}/artefacts${query}`\n );\n },\n listPaginated: (\n workspaceId: string,\n params?: { type?: ArtefactType; limit?: number; offset?: number }\n ) => {\n const entries: [string, string][] = [];\n if (params) {\n if (params.type) entries.push(['type', params.type]);\n if (params.limit != null) entries.push(['limit', String(params.limit)]);\n if (params.offset != null) entries.push(['offset', String(params.offset)]);\n }\n const qs = entries.length > 0 ? '?' + new URLSearchParams(entries).toString() : '';\n return client.get<PaginatedResponse<WorkspaceArtefact>>(\n `/workspaces/${workspaceId}/artefacts${qs}`\n );\n },\n delete: (workspaceId: string, artefactId: string) =>\n client.delete(`/workspaces/${workspaceId}/artefacts/${artefactId}`),\n getSignedUrl: (fileId: string) =>\n client.get<{ url: string }>(`/files/${fileId}/signed-url`),\n getDownloadBlob: (fileId: string) => client.getBlob(`/files/${fileId}/download`),\n messagesWithArtefacts: (\n workspaceId: string,\n params?: {\n limit?: number;\n offset?: number;\n sort?: 'asc' | 'desc';\n members?: string[];\n concernsMe?: boolean;\n pinned?: boolean;\n }\n ) => {\n const entries: [string, string][] = [];\n if (params) {\n if (params.limit != null) entries.push(['limit', String(params.limit)]);\n if (params.offset != null) entries.push(['offset', String(params.offset)]);\n if (params.sort) entries.push(['sort', params.sort]);\n if (params.members && params.members.length > 0)\n entries.push(['members', params.members.join(',')]);\n if (params.concernsMe) entries.push(['concernsMe', 'true']);\n if (params.pinned) entries.push(['pinned', 'true']);\n }\n const qs = entries.length > 0 ? '?' + new URLSearchParams(entries).toString() : '';\n return client.get<PaginatedResponse<MessageWithArtefacts>>(\n `/workspaces/${workspaceId}/messages/with-artefacts${qs}`\n );\n },\n };\n\n // ── Reactions ──\n const reactionApi = {\n toggle: (workspaceId: string, messageId: string, reaction: string) =>\n client.post<ToggleReactionResponse>(\n `/workspaces/${workspaceId}/messages/${messageId}/reactions/toggle`,\n { reaction }\n ),\n };\n\n // ── Agents ──\n const agentApi = {\n list: (search?: string) => {\n const qs = search ? `?search=${encodeURIComponent(search)}` : '';\n return client.get<WorkspaceAgent[]>(`/workspace-agents${qs}`);\n },\n create: (body: { agentId: string; agentName: string }) =>\n client.post<WorkspaceAgent>('/workspace-agents', body),\n update: (id: string, body: { agentName: string }) =>\n client.patch<WorkspaceAgent>(`/workspace-agents/${id}`, body),\n delete: (id: string) => client.delete<void>(`/workspace-agents/${id}`),\n getDeleteInfo: (id: string) =>\n client.get<AgentDeleteInfo>(`/workspace-agents/${id}/delete-info`),\n };\n\n // ── Summaries ──\n const summaryApi = {\n generate: (workspaceId: string) =>\n client.post<WorkspaceSummary>(`/workspaces/${workspaceId}/summaries/generate`, {}),\n getLatest: (workspaceId: string) =>\n client.get<LatestSummaryResponse>(`/workspaces/${workspaceId}/summaries/latest`),\n getHistory: (workspaceId: string) =>\n client.get<WorkspaceSummary[]>(`/workspaces/${workspaceId}/summaries`),\n create: (\n workspaceId: string,\n payload: {\n keyPoints: string[];\n keyTasks: string[];\n keyDecisions: string[];\n messageCount: number;\n lastMessage?: string;\n wasTruncated?: boolean;\n generatedAt?: string;\n }\n ) => client.post<WorkspaceSummary>(`/workspaces/${workspaceId}/summaries`, payload),\n update: (\n workspaceId: string,\n summaryId: string,\n payload: Partial<{\n keyPoints: string[];\n keyTasks: string[];\n keyDecisions: string[];\n messageCount: number;\n wasTruncated: boolean;\n }>\n ) =>\n client.patch<WorkspaceSummary>(\n `/workspaces/${workspaceId}/summaries/${summaryId}`,\n payload\n ),\n };\n\n // ── Webhooks ──\n const webhookApi = {\n list: (params?: { search?: string; isAgent?: string; agentId?: string }) => {\n const cleanParams = Object.fromEntries(\n Object.entries(params || {}).filter(([, v]) => v !== undefined && v !== '')\n );\n const qs =\n Object.keys(cleanParams).length > 0\n ? '?' + new URLSearchParams(cleanParams as Record<string, string>).toString()\n : '';\n return client.get<WebhookSubscription[]>(`/webhook-subscriptions${qs}`);\n },\n create: (data: {\n name: string;\n targetUrl: string;\n secretKey: string;\n secretValue: string;\n eventTypes?: string[];\n active?: boolean;\n isAgent?: boolean;\n agentId?: string;\n metadata?: Record<string, unknown>;\n }) => client.post<WebhookSubscription>('/webhook-subscriptions', data),\n update: (\n id: string,\n data: Partial<{\n name: string;\n targetUrl: string;\n secretKey: string;\n secretValue: string;\n eventTypes: string[];\n active: boolean;\n isAgent: boolean;\n agentId: string;\n metadata: Record<string, unknown>;\n }>\n ) => client.patch<WebhookSubscription>(`/webhook-subscriptions/${id}`, data),\n delete: (id: string) => client.delete(`/webhook-subscriptions/${id}`),\n };\n\n // ── Sync ──\n const syncApi = {\n getAvailableProviders: () =>\n client\n .get<{ providers: SyncProviderInfo[] }>('/workspaces/sync/providers')\n .then((res) => res.providers),\n getStatus: (workspaceId: string) =>\n client.get<SyncStatus>(`/workspaces/${workspaceId}/sync-status`),\n toggleSync: (workspaceId: string, provider: string, enabled: boolean) =>\n client.patch<Workspace>(`/workspaces/${workspaceId}/sync`, { provider, enabled }),\n };\n\n return {\n workspaceTypeApi,\n workspaceApi,\n memberApi,\n messageApi,\n artefactApi,\n reactionApi,\n agentApi,\n summaryApi,\n webhookApi,\n syncApi,\n };\n}\n\nexport type WorkspaceApis = ReturnType<typeof createWorkspaceApis>;\n","import { useMemo } from 'react';\nimport { createWorkspaceApis, type WorkspaceApis } from '../api';\nimport { useWorkspaceContext } from '../provider';\n\n/**\n * Hook to access all workspace API modules within a WorkspaceProvider.\n * The APIs are memoized and only recreated when the client changes.\n */\nexport function useWorkspaceApi(): WorkspaceApis {\n const { apiClient } = useWorkspaceContext();\n return useMemo(() => createWorkspaceApis(apiClient), [apiClient]);\n}\n","import React, { useEffect, useId, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { X } from 'lucide-react';\nimport { useWorkspaceThemeAttrs } from '../../theme-context';\nimport { useSlots, type WorkspaceSlotOverride } from '../../styling';\n\n/** Preset width for the centered panel */\nexport type ModalSize =\n | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl' | '5xl' | '6xl' | '7xl' | 'full';\n\nexport type ModalHeaderVariant = 'strip' | 'plain';\n\nconst MODAL_SIZE_CLASS: Record<ModalSize, string> = {\n sm: 'w-full min-w-0 max-w-sm',\n md: 'w-full min-w-0 max-w-md',\n lg: 'w-full min-w-0 max-w-lg',\n xl: 'w-full min-w-0 max-w-xl',\n '2xl': 'w-full min-w-0 max-w-2xl',\n '3xl': 'w-full min-w-0 max-w-3xl',\n '4xl': 'w-full min-w-0 max-w-4xl',\n '5xl': 'w-full min-w-0 max-w-5xl',\n '6xl': 'w-full min-w-0 max-w-6xl',\n '7xl': 'w-full min-w-0 max-w-7xl',\n full: 'w-full min-w-0 max-w-[calc(100vw-2rem)] sm:max-w-[min(96vw,90rem)]',\n};\n\nexport interface ModalProps {\n open: boolean;\n onClose: () => void;\n children: React.ReactNode;\n zIndexClass?: string;\n backdropClassName?: string;\n size?: ModalSize;\n panelClassName?: string;\n className?: string;\n closeOnBackdropClick?: boolean;\n closeOnEscape?: boolean;\n ariaLabelledBy?: string;\n ariaDescribedBy?: string;\n title?: React.ReactNode;\n description?: React.ReactNode;\n titleIcon?: React.ReactNode;\n headingId?: string;\n modalHeaderVariant?: ModalHeaderVariant;\n hideCloseButton?: boolean;\n headerTrailing?: React.ReactNode;\n closeButtonAriaLabel?: string;\n closeButtonDisabled?: boolean;\n closeButtonClassName?: string;\n closeIconSize?: number;\n headerClassName?: string;\n titleClassName?: string;\n descriptionClassName?: string;\n /**\n * Per-slot style overrides. Applied after the individual `*ClassName` props\n * above (kept for backwards compatibility) and after `config.classNames`.\n */\n classNames?: WorkspaceSlotOverride<\n 'panel' | 'header' | 'title' | 'description' | 'close'\n >;\n}\n\nexport function Modal({\n open,\n onClose,\n children,\n zIndexClass = 'z-[100]',\n backdropClassName = 'bg-black/40 backdrop-blur-sm',\n size,\n panelClassName,\n className,\n closeOnBackdropClick = false,\n closeOnEscape = true,\n ariaLabelledBy: ariaLabelledByProp,\n ariaDescribedBy: ariaDescribedByProp,\n title,\n description,\n titleIcon,\n headingId,\n modalHeaderVariant = 'strip',\n hideCloseButton = false,\n headerTrailing,\n closeButtonAriaLabel = 'Fermer',\n closeButtonDisabled = false,\n closeButtonClassName,\n closeIconSize = 20,\n headerClassName,\n titleClassName,\n descriptionClassName = 'text-text-secondary mt-1 text-sm',\n classNames,\n}: ModalProps) {\n const slot = useSlots('modal', classNames, className);\n const [mounted, setMounted] = useState(false);\n const autoHeadingId = useId();\n const autoDescIdByModal = useId();\n // Re-apply the active theme on the portal root — portals mount on\n // document.body, outside the provider wrapper, so they'd otherwise lose the\n // --ws-* custom properties and the dark color-scheme class.\n const themeAttrs = useWorkspaceThemeAttrs();\n\n const hasHeader = title != null;\n const resolvedHeadingId = headingId ?? ariaLabelledByProp ?? autoHeadingId;\n\n const assignAutoDescriptionId =\n hasHeader &&\n description != null &&\n ariaDescribedByProp === undefined &&\n (typeof description === 'string' || typeof description === 'number');\n\n const resolvedAriaDescribedBy = assignAutoDescriptionId\n ? autoDescIdByModal\n : ariaDescribedByProp;\n\n const resolvedAriaLabelledBy = hasHeader\n ? ariaLabelledByProp ?? resolvedHeadingId\n : ariaLabelledByProp;\n\n useEffect(() => { setMounted(true); }, []);\n\n useEffect(() => {\n if (!open) return;\n const prevOverflow = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n return () => { document.body.style.overflow = prevOverflow; };\n }, [open]);\n\n useEffect(() => {\n if (!open || !closeOnEscape) return;\n const onKeyDown = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); };\n window.addEventListener('keydown', onKeyDown);\n return () => window.removeEventListener('keydown', onKeyDown);\n }, [open, closeOnEscape, onClose]);\n\n const defaultCloseClasses =\n closeButtonClassName ?? 'text-text-secondary hover:text-text rounded p-1 transition-colors';\n\n const trailing =\n headerTrailing ??\n (!hideCloseButton ? (\n <button\n type=\"button\"\n disabled={closeButtonDisabled}\n onClick={onClose}\n className={slot(\n 'close',\n 'ws-modal__close',\n defaultCloseClasses,\n closeButtonDisabled && 'opacity-40',\n )}\n aria-label={closeButtonAriaLabel}\n >\n <X size={closeIconSize} />\n </button>\n ) : null);\n\n const descriptionSlot =\n description == null ? null : typeof description === 'string' ||\n typeof description === 'number' ? (\n <p\n id={assignAutoDescriptionId ? autoDescIdByModal : undefined}\n className={slot('description', 'ws-modal__description', descriptionClassName)}\n >\n {description}\n </p>\n ) : (\n description\n );\n\n const headerShellClass =\n modalHeaderVariant === 'strip'\n ? 'border-border flex shrink-0 items-start justify-between gap-3 border-b px-6 py-4'\n : 'mb-4 flex shrink-0 items-start justify-between gap-3';\n\n const modalHeaderMarkup = hasHeader ? (\n <div className={slot('header', 'ws-modal__header', headerShellClass, headerClassName)}>\n <div className=\"flex min-w-0 flex-1 items-start gap-3\">\n {titleIcon != null ? <div className=\"mt-0.5 shrink-0\">{titleIcon}</div> : null}\n <div className=\"min-w-0 flex-1\">\n <h2\n id={resolvedHeadingId}\n className={slot(\n 'title',\n 'ws-modal__title',\n 'text-text text-lg font-semibold',\n titleClassName,\n )}\n >\n {title}\n </h2>\n {descriptionSlot}\n </div>\n </div>\n {trailing ? <div className=\"flex shrink-0 items-start\">{trailing}</div> : null}\n </div>\n ) : null;\n\n if (!mounted || !open) return null;\n\n return createPortal(\n <div\n className={slot(\n 'root',\n 'ws-modal',\n 'fixed inset-0 flex items-center justify-center p-4',\n themeAttrs.className,\n zIndexClass,\n backdropClassName,\n )}\n style={themeAttrs.style}\n onClick={closeOnBackdropClick ? onClose : undefined}\n aria-hidden={false}\n >\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={resolvedAriaLabelledBy}\n aria-describedby={resolvedAriaDescribedBy}\n className={slot(\n 'panel',\n 'ws-modal__panel',\n // Solid, opaque panel by default — guarantees the modal is never\n // transparent even if the caller forgets to pass `panelClassName`.\n 'bg-surface text-text border-border relative flex max-h-[calc(100vh-2rem)] w-full min-w-0 flex-col overflow-hidden rounded-2xl border shadow-panel animate-ws-scale-in',\n size ? MODAL_SIZE_CLASS[size] : undefined,\n panelClassName,\n )}\n onClick={(e) => e.stopPropagation()}\n >\n {modalHeaderMarkup}\n {children}\n </div>\n </div>,\n document.body,\n );\n}\n","'use client';\n\nimport React from 'react';\nimport { Loader2 } from 'lucide-react';\nimport { useSlots } from '../../styling';\n\nexport type ButtonVariant =\n | 'primary'\n | 'secondary'\n | 'outline'\n | 'ghost'\n | 'danger'\n | 'subtle';\nexport type ButtonSize = 'xs' | 'sm' | 'md' | 'lg';\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant;\n size?: ButtonSize;\n loading?: boolean;\n fullWidth?: boolean;\n leftIcon?: React.ReactNode;\n rightIcon?: React.ReactNode;\n}\n\nconst VARIANT_CLASSES: Record<ButtonVariant, string> = {\n primary:\n 'bg-primary text-primary-contrast hover:bg-primary-hover border border-transparent shadow-xs',\n secondary:\n 'bg-secondary text-secondary-contrast hover:bg-secondary-hover border border-transparent shadow-xs',\n outline:\n 'bg-surface text-text border border-border hover:bg-bg-subtle hover:border-text-muted/40',\n ghost:\n 'bg-transparent text-text-secondary hover:bg-bg-subtle hover:text-text border border-transparent',\n danger:\n 'bg-danger text-white hover:brightness-95 border border-transparent shadow-xs',\n subtle:\n 'bg-primary-light text-primary hover:bg-primary-light/70 border border-transparent',\n};\n\nconst SIZE_CLASSES: Record<ButtonSize, string> = {\n xs: 'h-7 gap-1 px-2.5 text-xs rounded-lg',\n sm: 'h-9 gap-1.5 px-3.5 text-sm rounded-lg',\n md: 'h-10 gap-2 px-4 text-sm rounded-xl',\n lg: 'h-11 gap-2 px-5 text-[15px] rounded-xl',\n};\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n variant = 'primary',\n size = 'md',\n loading = false,\n fullWidth = false,\n leftIcon,\n rightIcon,\n className,\n children,\n disabled,\n type = 'button',\n ...props\n },\n ref,\n ) => {\n const isDisabled = disabled || loading;\n const slot = useSlots('button', undefined, className);\n return (\n <button\n ref={ref}\n type={type}\n disabled={isDisabled}\n data-variant={variant}\n data-size={size}\n className={slot(\n 'root',\n 'ws-button',\n `ws-button--${variant}`,\n `ws-button--${size}`,\n 'inline-flex items-center justify-center font-medium whitespace-nowrap transition-all duration-150',\n 'focus-visible:ring-primary/40 focus-visible:ring-2 focus-visible:outline-none',\n 'active:scale-[0.98]',\n 'disabled:pointer-events-none disabled:opacity-55',\n VARIANT_CLASSES[variant],\n SIZE_CLASSES[size],\n fullWidth && 'w-full',\n )}\n {...props}\n >\n {loading ? (\n <Loader2 className=\"animate-spin\" size={size === 'lg' ? 18 : 16} />\n ) : (\n leftIcon\n )}\n {children}\n {!loading && rightIcon}\n </button>\n );\n },\n);\n\nButton.displayName = 'Button';\n","'use client';\n\nimport React from 'react';\nimport { AlertTriangle } from 'lucide-react';\nimport { cn } from './cn';\nimport { Modal, type ModalProps } from './Modal';\nimport { Button } from './Button';\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport interface ConfirmModalProps {\n open: boolean;\n onClose: () => void;\n onConfirm: () => void | Promise<void>;\n title: string;\n description?: React.ReactNode;\n confirmText?: string;\n cancelText?: string;\n danger?: boolean;\n className?: string;\n /** Forwarded to the underlying `Modal` (see its slots). */\n classNames?: ModalProps['classNames'];\n}\n\n// ── Component ─────────────────────────────────────────────────────────────────\n\nexport const ConfirmModal: React.FC<ConfirmModalProps> = ({\n open,\n onClose,\n onConfirm,\n title,\n description,\n confirmText = 'Confirmer',\n cancelText = 'Annuler',\n danger = false,\n className,\n classNames,\n}) => {\n const [loading, setLoading] = React.useState(false);\n\n const handleConfirm = async () => {\n setLoading(true);\n try {\n await onConfirm();\n } finally {\n setLoading(false);\n onClose();\n }\n };\n\n return (\n <Modal\n open={open}\n onClose={() => {\n if (!loading) onClose();\n }}\n size=\"sm\"\n closeOnBackdropClick={!loading}\n closeOnEscape={!loading}\n hideCloseButton\n zIndexClass=\"z-[120]\"\n className={cn('ws-confirm-modal', className)}\n classNames={classNames}\n >\n <div className=\"ws-confirm-modal__body flex flex-col gap-5 p-6\">\n <div className=\"flex items-start gap-3.5\">\n <div\n className={cn(\n 'flex h-11 w-11 flex-shrink-0 items-center justify-center rounded-full',\n danger ? 'bg-danger-light' : 'bg-primary-light',\n )}\n >\n <AlertTriangle\n size={20}\n className={danger ? 'text-danger' : 'text-primary'}\n />\n </div>\n <div className=\"min-w-0 flex-1 pt-0.5\">\n <h3 className=\"text-text text-base font-semibold\">{title}</h3>\n {description && (\n <div className=\"text-text-secondary mt-1.5 text-sm leading-relaxed\">\n {description}\n </div>\n )}\n </div>\n </div>\n\n <div className=\"flex justify-end gap-2.5\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={onClose}\n disabled={loading}\n >\n {cancelText}\n </Button>\n <Button\n variant={danger ? 'danger' : 'primary'}\n size=\"sm\"\n loading={loading}\n onClick={handleConfirm}\n >\n {confirmText}\n </Button>\n </div>\n </div>\n </Modal>\n );\n};\n"],"mappings":"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","names":["createContext","useContext","EMPTY","clsx","twMerge","createContext","useContext","createContext","useContext","useMemo","useMemo","jsx","React","jsx","jsxs","React","React","jsx","jsxs","React"]}
|