@spacesync/client 0.1.4 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/shell/page-list-loading.tsx"],"names":[],"mappings":"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","file":"page-list-loading.js","sourcesContent":["import type { ReactNode } from \"react\";\nimport { Skeleton } from \"../ui/skeleton\";\nimport {\n PageListHeaderRow,\n PageListStickyThead,\n PageListTable,\n PageListTd,\n PageListTh,\n PageListTr,\n} from \"./page-list-chrome\";\n\nexport type PageListSkeletonCell =\n | \"text\"\n | \"pill\"\n | \"avatar\"\n | \"actions\"\n | \"empty\"\n | \"checkbox\"\n | \"titleBody\";\n\nexport type PageListSkeletonColumn = {\n label?: ReactNode;\n align?: \"left\" | \"right\";\n cell: PageListSkeletonCell;\n className?: string;\n hidden?: boolean;\n};\n\nconst TEXT_WIDTHS = [\"w-28\", \"w-20\", \"w-24\", \"w-32\", \"w-16\"] as const;\n\nexport function StatValueSkeleton() {\n return (\n <span className=\"inline-flex h-5 items-center\" role=\"status\" aria-busy=\"true\" aria-label=\"Loading\">\n <Skeleton className=\"h-4 w-10\" />\n <span className=\"sr-only\">Loading</span>\n </span>\n );\n}\n\nfunction SkeletonCell({ cell, row, align }: { cell: PageListSkeletonCell; row: number; align?: \"left\" | \"right\" }) {\n switch (cell) {\n case \"checkbox\":\n return <Skeleton className=\"size-4 rounded\" />;\n case \"avatar\":\n return (\n <span className=\"inline-flex items-center gap-2.5\">\n <Skeleton className=\"size-7 shrink-0 rounded-full\" />\n <Skeleton className={`h-3.5 ${TEXT_WIDTHS[row % TEXT_WIDTHS.length]}`} />\n </span>\n );\n case \"pill\":\n return <Skeleton className=\"h-5 w-16 rounded-full\" />;\n case \"actions\":\n return (\n <div className={`inline-flex gap-2 ${align === \"right\" ? \"justify-end\" : \"\"}`}>\n <Skeleton className=\"h-7 w-16 rounded-lg\" />\n {row % 3 !== 0 ? <Skeleton className=\"h-7 w-14 rounded-lg\" /> : null}\n </div>\n );\n case \"titleBody\":\n return (\n <div className=\"flex items-start gap-3 min-w-0\">\n <Skeleton className=\"mt-1.5 h-2 w-2 shrink-0 rounded-full\" />\n <div className=\"min-w-0 space-y-1.5\">\n <Skeleton className={`h-3.5 ${row % 2 === 0 ? \"w-40\" : \"w-32\"}`} />\n <Skeleton className={`h-3 ${row % 3 === 0 ? \"w-56\" : \"w-44\"}`} />\n </div>\n </div>\n );\n case \"empty\":\n return null;\n default:\n return (\n <Skeleton\n className={`h-3.5 ${TEXT_WIDTHS[row % TEXT_WIDTHS.length]} ${align === \"right\" ? \"ml-auto\" : \"\"}`}\n />\n );\n }\n}\n\nexport function PageListTableSkeleton({\n columns,\n rows = 8,\n label = \"Loading\",\n minWidth,\n}: {\n columns: PageListSkeletonColumn[];\n rows?: number;\n label?: string;\n minWidth?: number;\n}) {\n const visible = columns.filter((column) => !column.hidden);\n\n return (\n <div role=\"status\" aria-busy=\"true\" aria-label={label}>\n <PageListTable minWidth={minWidth}>\n <PageListStickyThead>\n <PageListHeaderRow>\n {visible.map((column, i) => (\n <PageListTh\n key={i}\n align={column.align}\n className={column.className}\n aria-hidden={column.label == null ? true : undefined}\n >\n {column.label}\n </PageListTh>\n ))}\n </PageListHeaderRow>\n </PageListStickyThead>\n <tbody>\n {Array.from({ length: rows }, (_, row) => (\n <PageListTr key={row}>\n {visible.map((column, i) => (\n <PageListTd key={i} align={column.align} className={column.className}>\n <SkeletonCell cell={column.cell} row={row} align={column.align} />\n </PageListTd>\n ))}\n </PageListTr>\n ))}\n </tbody>\n </PageListTable>\n <span className=\"sr-only\">{label}</span>\n </div>\n );\n}\n"]}
@@ -1,10 +1,11 @@
1
1
  import { FilePickerField } from './chunk-OMSJWTSZ.js';
2
- import { Tooltip, TooltipTrigger, TooltipContent, Textarea } from './chunk-R4L4TDT3.js';
2
+ import { Tooltip, TooltipTrigger, TooltipContent, Textarea } from './chunk-H3CNZCYU.js';
3
3
  import './chunk-RV5PMZYZ.js';
4
4
  import './chunk-L65F4EMK.js';
5
5
  import './chunk-PBNBLCC2.js';
6
6
  import './chunk-VVXGQKN7.js';
7
7
  import './chunk-7YCAAP43.js';
8
+ import './chunk-DC4QH6W2.js';
8
9
  import './chunk-LUB7QWGU.js';
9
10
  import { Button } from './chunk-VHINHHZQ.js';
10
11
  import './chunk-FCY5FYJB.js';
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/support-attachments.ts","../src/support/platform-support-message-composer.tsx"],"names":["ImageIcon"],"mappings":"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","file":"platform-support-message-composer.js","sourcesContent":["/**\n * Support attachment helpers for the shared message composer.\n * Copied from `@spacesync/client/domain` so the client has no package dependency.\n */\n\nexport const MAX_ATTACHMENTS_PER_MESSAGE = 5;\n\nexport const MAX_SUPPORT_ATTACHMENT_BYTES = 5 * 1024 * 1024;\n\nconst ALLOWED_MIME_PREFIXES = [\"image/\", \"application/pdf\", \"text/\"];\nconst ALLOWED_MIME_EXACT = new Set([\n \"application/zip\",\n \"application/json\",\n \"application/msword\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n]);\n\nexport type SupportAttachmentValidationError =\n | { kind: \"too_big\"; max: number }\n | { kind: \"unsupported_type\" };\n\n/** Same shape as platform support attachments from the API. */\nexport interface SupportAttachment {\n id: string;\n name: string;\n mimeType: string;\n sizeBytes: number;\n storageKey: string;\n uploadedAt: string;\n /** Short-lived signed URL, populated by the API on read — not stored in Mongo. */\n readUrl?: string;\n}\n\nexport function validateSupportAttachmentFile(file: {\n size: number;\n type: string;\n}): SupportAttachmentValidationError | null {\n if (file.size > MAX_SUPPORT_ATTACHMENT_BYTES) {\n return { kind: \"too_big\", max: MAX_SUPPORT_ATTACHMENT_BYTES };\n }\n const mime = file.type || \"application/octet-stream\";\n const allowed =\n ALLOWED_MIME_EXACT.has(mime) || ALLOWED_MIME_PREFIXES.some((prefix) => mime.startsWith(prefix));\n if (!allowed) {\n return { kind: \"unsupported_type\" };\n }\n return null;\n}\n\nexport function describeSupportAttachmentError(err: SupportAttachmentValidationError): string {\n if (err.kind === \"too_big\") {\n const mb = (err.max / (1024 * 1024)).toFixed(1);\n return `File too large (max ${mb} MB).`;\n }\n return \"Unsupported file type.\";\n}\n","import { useCallback, useState } from \"react\";\nimport { FileText, Image as ImageIcon, Paperclip, Plus, Send, X } from \"lucide-react\";\nimport { toast } from \"sonner\";\nimport {\n MAX_ATTACHMENTS_PER_MESSAGE,\n describeSupportAttachmentError,\n validateSupportAttachmentFile,\n type SupportAttachment,\n} from \"../lib/support-attachments\";\nimport { FilePickerField } from \"../files/file-picker-field\";\nimport { Button, Textarea, Tooltip, TooltipContent, TooltipTrigger, cn } from \"../ui\";\n\nexport type { SupportAttachment };\n\nexport function PlatformSupportAttachmentChip({\n attachment,\n onRemove,\n}: {\n attachment: SupportAttachment;\n onRemove?: () => void;\n}) {\n return (\n <li className=\"inline-flex items-center gap-1.5 rounded-lg border border-border bg-card px-2.5 py-1 text-xs text-muted-foreground\">\n <Paperclip size={11} className=\"shrink-0 text-muted-foreground\" />\n <span className=\"max-w-[140px] truncate\">{attachment.name}</span>\n {onRemove ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n onClick={onRemove}\n className=\"size-5 text-muted-foreground hover:text-red-500\"\n aria-label={`Remove ${attachment.name}`}\n >\n <X size={11} />\n </Button>\n ) : null}\n </li>\n );\n}\n\nexport function PlatformSupportAttachmentPreview({\n attachment,\n className,\n}: {\n attachment: SupportAttachment;\n className?: string;\n}) {\n const href = attachment.readUrl;\n const isImage = attachment.mimeType.startsWith(\"image/\");\n const inner = (\n <>\n {isImage ? (\n <ImageIcon size={12} className=\"shrink-0 text-muted-foreground\" />\n ) : (\n <FileText size={12} className=\"shrink-0 text-muted-foreground\" />\n )}\n <span className=\"min-w-0 flex-1 truncate font-medium\">{attachment.name}</span>\n <span className=\"shrink-0 text-[10px] text-muted-foreground\">\n {Math.round(attachment.sizeBytes / 1024)} KB\n </span>\n </>\n );\n if (!href) {\n return (\n <span\n className={cn(\n \"flex max-w-[220px] items-center gap-2 rounded-lg border border-border bg-card px-2.5 py-1.5 text-xs text-muted-foreground\",\n className,\n )}\n title={attachment.name}\n >\n {inner}\n </span>\n );\n }\n return (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noreferrer\"\n download={attachment.name}\n className={cn(\n \"flex max-w-[220px] items-center gap-2 rounded-lg border border-border bg-card px-2.5 py-1.5 text-xs text-muted-foreground hover:bg-accent\",\n className,\n )}\n title={attachment.name}\n >\n {inner}\n </a>\n );\n}\n\nexport type PlatformSupportMessageComposerProps = {\n value: string;\n onChange: (value: string) => void;\n attachments: SupportAttachment[];\n onAttachmentsChange: (attachments: SupportAttachment[]) => void;\n onSend: () => void;\n onUploadFile: (file: File) => Promise<SupportAttachment>;\n onTyping?: () => void;\n placeholder?: string;\n disabled?: boolean;\n compact?: boolean;\n className?: string;\n};\n\nexport function PlatformSupportMessageComposer({\n value,\n onChange,\n attachments,\n onAttachmentsChange,\n onSend,\n onUploadFile,\n onTyping,\n placeholder = \"Write a message…\",\n disabled = false,\n compact = false,\n className,\n}: PlatformSupportMessageComposerProps) {\n const [busy, setBusy] = useState(false);\n\n const canSend = !disabled && (value.trim().length > 0 || attachments.length > 0);\n\n const handleFiles = useCallback(\n async (files: FileList | null) => {\n if (!files || files.length === 0) return;\n const remaining = MAX_ATTACHMENTS_PER_MESSAGE - attachments.length;\n if (remaining <= 0) {\n toast.error(`Maximum ${MAX_ATTACHMENTS_PER_MESSAGE} attachments per message`);\n return;\n }\n setBusy(true);\n try {\n const next = [...attachments];\n for (const file of Array.from(files).slice(0, remaining)) {\n const err = validateSupportAttachmentFile(file);\n if (err) {\n toast.error(describeSupportAttachmentError(err));\n continue;\n }\n next.push(await onUploadFile(file));\n }\n onAttachmentsChange(next);\n } catch {\n toast.error(\"Could not upload file\");\n } finally {\n setBusy(false);\n }\n },\n [attachments, onAttachmentsChange, onUploadFile],\n );\n\n const removeAttachment = (id: string) => {\n onAttachmentsChange(attachments.filter((a) => a.id !== id));\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n if (canSend) onSend();\n }\n };\n\n return (\n <div className={cn(\"space-y-2\", className)}>\n {attachments.length > 0 ? (\n <ul className=\"flex flex-wrap gap-1.5\">\n {attachments.map((attachment) => (\n <PlatformSupportAttachmentChip\n key={attachment.id}\n attachment={attachment}\n onRemove={() => removeAttachment(attachment.id)}\n />\n ))}\n </ul>\n ) : null}\n\n <div\n className={cn(\n \"rounded-xl border border-border bg-card px-2.5 py-2 shadow-sm\",\n disabled && \"opacity-60\",\n )}\n >\n <div className=\"flex items-end gap-2\">\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"inline-flex shrink-0\">\n <FilePickerField\n variant=\"inline\"\n multiple\n disabled={disabled || busy || attachments.length >= MAX_ATTACHMENTS_PER_MESSAGE}\n actionLabel=\"\"\n icon={<Plus size={compact ? 16 : 18} strokeWidth={1.75} />}\n triggerClassName={cn(\n \"inline-flex items-center justify-center rounded-lg border border-transparent text-muted-foreground transition-colors hover:border-border hover:bg-muted hover:text-foreground\",\n compact ? \"size-8\" : \"size-9\",\n )}\n title=\"Attach files\"\n onFilesSelected={(files) => void handleFiles(files)}\n />\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"top\">Attach</TooltipContent>\n </Tooltip>\n <Textarea\n value={value}\n onChange={(e) => {\n onChange(e.target.value);\n onTyping?.();\n }}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled || busy}\n rows={1}\n className={cn(\n \"max-h-28 min-h-[36px] flex-1 resize-none border-0 bg-transparent px-0.5 py-1.5 text-sm shadow-none focus-visible:ring-0 focus-visible:ring-offset-0\",\n compact && \"min-h-[32px] text-xs\",\n )}\n />\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n size=\"icon\"\n onClick={onSend}\n disabled={!canSend || busy}\n aria-label=\"Send message\"\n className={cn(\n \"shrink-0 rounded-lg bg-blue-500 text-white hover:bg-blue-600 disabled:bg-muted disabled:text-muted-foreground\",\n compact ? \"size-8\" : \"size-9\",\n )}\n >\n <Send size={compact ? 14 : 16} strokeWidth={2} />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">Send</TooltipContent>\n </Tooltip>\n </div>\n </div>\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/lib/support-attachments.ts","../src/support/platform-support-message-composer.tsx"],"names":["ImageIcon"],"mappings":"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","file":"platform-support-message-composer.js","sourcesContent":["/**\n * Support attachment helpers for the shared message composer.\n * Copied from `@spacesync/client/domain` so the client has no package dependency.\n */\n\nexport const MAX_ATTACHMENTS_PER_MESSAGE = 5;\n\nexport const MAX_SUPPORT_ATTACHMENT_BYTES = 5 * 1024 * 1024;\n\nconst ALLOWED_MIME_PREFIXES = [\"image/\", \"application/pdf\", \"text/\"];\nconst ALLOWED_MIME_EXACT = new Set([\n \"application/zip\",\n \"application/json\",\n \"application/msword\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n]);\n\nexport type SupportAttachmentValidationError =\n | { kind: \"too_big\"; max: number }\n | { kind: \"unsupported_type\" };\n\n/** Same shape as platform support attachments from the API. */\nexport interface SupportAttachment {\n id: string;\n name: string;\n mimeType: string;\n sizeBytes: number;\n storageKey: string;\n uploadedAt: string;\n /** Short-lived signed URL, populated by the API on read — not stored in Mongo. */\n readUrl?: string;\n}\n\nexport function validateSupportAttachmentFile(file: {\n size: number;\n type: string;\n}): SupportAttachmentValidationError | null {\n if (file.size > MAX_SUPPORT_ATTACHMENT_BYTES) {\n return { kind: \"too_big\", max: MAX_SUPPORT_ATTACHMENT_BYTES };\n }\n const mime = file.type || \"application/octet-stream\";\n const allowed =\n ALLOWED_MIME_EXACT.has(mime) || ALLOWED_MIME_PREFIXES.some((prefix) => mime.startsWith(prefix));\n if (!allowed) {\n return { kind: \"unsupported_type\" };\n }\n return null;\n}\n\nexport function describeSupportAttachmentError(err: SupportAttachmentValidationError): string {\n if (err.kind === \"too_big\") {\n const mb = (err.max / (1024 * 1024)).toFixed(1);\n return `File too large (max ${mb} MB).`;\n }\n return \"Unsupported file type.\";\n}\n","import { useCallback, useState } from \"react\";\nimport { FileText, Image as ImageIcon, Paperclip, Plus, Send, X } from \"lucide-react\";\nimport { toast } from \"sonner\";\nimport {\n MAX_ATTACHMENTS_PER_MESSAGE,\n describeSupportAttachmentError,\n validateSupportAttachmentFile,\n type SupportAttachment,\n} from \"../lib/support-attachments\";\nimport { FilePickerField } from \"../files/file-picker-field\";\nimport { Button, Textarea, Tooltip, TooltipContent, TooltipTrigger, cn } from \"../ui\";\n\nexport type { SupportAttachment };\n\nexport function PlatformSupportAttachmentChip({\n attachment,\n onRemove,\n}: {\n attachment: SupportAttachment;\n onRemove?: () => void;\n}) {\n return (\n <li className=\"inline-flex items-center gap-1.5 rounded-lg border border-border bg-card px-2.5 py-1 text-xs text-muted-foreground\">\n <Paperclip size={11} className=\"shrink-0 text-muted-foreground\" />\n <span className=\"max-w-[140px] truncate\">{attachment.name}</span>\n {onRemove ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n onClick={onRemove}\n className=\"size-5 text-muted-foreground hover:text-red-500\"\n aria-label={`Remove ${attachment.name}`}\n >\n <X size={11} />\n </Button>\n ) : null}\n </li>\n );\n}\n\nexport function PlatformSupportAttachmentPreview({\n attachment,\n className,\n}: {\n attachment: SupportAttachment;\n className?: string;\n}) {\n const href = attachment.readUrl;\n const isImage = attachment.mimeType.startsWith(\"image/\");\n const inner = (\n <>\n {isImage ? (\n <ImageIcon size={12} className=\"shrink-0 text-muted-foreground\" />\n ) : (\n <FileText size={12} className=\"shrink-0 text-muted-foreground\" />\n )}\n <span className=\"min-w-0 flex-1 truncate font-medium\">{attachment.name}</span>\n <span className=\"shrink-0 text-[10px] text-muted-foreground\">\n {Math.round(attachment.sizeBytes / 1024)} KB\n </span>\n </>\n );\n if (!href) {\n return (\n <span\n className={cn(\n \"flex max-w-[220px] items-center gap-2 rounded-lg border border-border bg-card px-2.5 py-1.5 text-xs text-muted-foreground\",\n className,\n )}\n title={attachment.name}\n >\n {inner}\n </span>\n );\n }\n return (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noreferrer\"\n download={attachment.name}\n className={cn(\n \"flex max-w-[220px] items-center gap-2 rounded-lg border border-border bg-card px-2.5 py-1.5 text-xs text-muted-foreground hover:bg-accent\",\n className,\n )}\n title={attachment.name}\n >\n {inner}\n </a>\n );\n}\n\nexport type PlatformSupportMessageComposerProps = {\n value: string;\n onChange: (value: string) => void;\n attachments: SupportAttachment[];\n onAttachmentsChange: (attachments: SupportAttachment[]) => void;\n onSend: () => void;\n onUploadFile: (file: File) => Promise<SupportAttachment>;\n onTyping?: () => void;\n placeholder?: string;\n disabled?: boolean;\n compact?: boolean;\n className?: string;\n};\n\nexport function PlatformSupportMessageComposer({\n value,\n onChange,\n attachments,\n onAttachmentsChange,\n onSend,\n onUploadFile,\n onTyping,\n placeholder = \"Write a message…\",\n disabled = false,\n compact = false,\n className,\n}: PlatformSupportMessageComposerProps) {\n const [busy, setBusy] = useState(false);\n\n const canSend = !disabled && (value.trim().length > 0 || attachments.length > 0);\n\n const handleFiles = useCallback(\n async (files: FileList | null) => {\n if (!files || files.length === 0) return;\n const remaining = MAX_ATTACHMENTS_PER_MESSAGE - attachments.length;\n if (remaining <= 0) {\n toast.error(`Maximum ${MAX_ATTACHMENTS_PER_MESSAGE} attachments per message`);\n return;\n }\n setBusy(true);\n try {\n const next = [...attachments];\n for (const file of Array.from(files).slice(0, remaining)) {\n const err = validateSupportAttachmentFile(file);\n if (err) {\n toast.error(describeSupportAttachmentError(err));\n continue;\n }\n next.push(await onUploadFile(file));\n }\n onAttachmentsChange(next);\n } catch {\n toast.error(\"Could not upload file\");\n } finally {\n setBusy(false);\n }\n },\n [attachments, onAttachmentsChange, onUploadFile],\n );\n\n const removeAttachment = (id: string) => {\n onAttachmentsChange(attachments.filter((a) => a.id !== id));\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n if (canSend) onSend();\n }\n };\n\n return (\n <div className={cn(\"space-y-2\", className)}>\n {attachments.length > 0 ? (\n <ul className=\"flex flex-wrap gap-1.5\">\n {attachments.map((attachment) => (\n <PlatformSupportAttachmentChip\n key={attachment.id}\n attachment={attachment}\n onRemove={() => removeAttachment(attachment.id)}\n />\n ))}\n </ul>\n ) : null}\n\n <div\n className={cn(\n \"rounded-xl border border-border bg-card px-2.5 py-2 shadow-sm\",\n disabled && \"opacity-60\",\n )}\n >\n <div className=\"flex items-end gap-2\">\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"inline-flex shrink-0\">\n <FilePickerField\n variant=\"inline\"\n multiple\n disabled={disabled || busy || attachments.length >= MAX_ATTACHMENTS_PER_MESSAGE}\n actionLabel=\"\"\n icon={<Plus size={compact ? 16 : 18} strokeWidth={1.75} />}\n triggerClassName={cn(\n \"inline-flex items-center justify-center rounded-lg border border-transparent text-muted-foreground transition-colors hover:border-border hover:bg-muted hover:text-foreground\",\n compact ? \"size-8\" : \"size-9\",\n )}\n title=\"Attach files\"\n onFilesSelected={(files) => void handleFiles(files)}\n />\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"top\">Attach</TooltipContent>\n </Tooltip>\n <Textarea\n value={value}\n onChange={(e) => {\n onChange(e.target.value);\n onTyping?.();\n }}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled || busy}\n rows={1}\n className={cn(\n \"max-h-28 min-h-[36px] flex-1 resize-none border-0 bg-transparent px-0.5 py-1.5 text-sm shadow-none focus-visible:ring-0 focus-visible:ring-offset-0\",\n compact && \"min-h-[32px] text-xs\",\n )}\n />\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n size=\"icon\"\n onClick={onSend}\n disabled={!canSend || busy}\n aria-label=\"Send message\"\n className={cn(\n \"shrink-0 rounded-lg bg-blue-500 text-white hover:bg-blue-600 disabled:bg-muted disabled:text-muted-foreground\",\n compact ? \"size-8\" : \"size-9\",\n )}\n >\n <Send size={compact ? 14 : 16} strokeWidth={2} />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">Send</TooltipContent>\n </Tooltip>\n </div>\n </div>\n </div>\n );\n}\n"]}
package/dist/ui.js CHANGED
@@ -1,9 +1,10 @@
1
- export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AspectRatio, Avatar, AvatarFallback, AvatarImage, Badge, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Calendar, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, ChartContainer, ChartLegend, ChartLegendContent, ChartStyle, ChartTooltip, ChartTooltipContent, Checkbox, CheckboxField, Collapsible, CollapsibleContent, CollapsibleTrigger, ColorPicker, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, ContentFade, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, DashFade, DateField, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, FeedSkeleton, FieldLabel, FilterPopover, Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, IconInput, InputGroup, InputGroupInput, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, NumberInput, PasswordInput, PhoneInput, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, Progress, ReceiptCard, ReceiptSummaryRow, ResizableHandle, ResizablePanel, ResizablePanelGroup, ResponsiveAlertDialog, ResponsiveAlertDialogAction, ResponsiveAlertDialogCancel, ResponsiveAlertDialogContent, ResponsiveAlertDialogDescription, AlertDialogFooter as ResponsiveAlertDialogFooter, AlertDialogHeader as ResponsiveAlertDialogHeader, ResponsiveAlertDialogTitle, ResponsiveDialog, ResponsiveDialogClose, ResponsiveDialogContent, ResponsiveDialogDescription, ResponsiveDialogTitle, ResponsiveDialogTrigger, ScrollArea, ScrollBar, SegmentedTabList, SegmentedTabTrigger, SelectableCard, SelectableListRow, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, ShellTopBarViewToggle, ShellTopBarViewToggleItem, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, Slider, SmoothSize, Switch, TabCountBadge, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Text, Textarea, TimeField, Toaster, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, badgeVariants, fieldLabelClass, formatTimeForDisplay, navigationMenuTriggerStyle, parseHm, tabsListVariants, tabsTriggerVariants, textVariants, toTimeStr, toggleVariants, useFormField, useIsMobile, useResponsiveDialogDrawer, useSidebar } from './chunk-R4L4TDT3.js';
1
+ export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AspectRatio, Avatar, AvatarFallback, AvatarImage, Badge, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Calendar, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, ChartContainer, ChartLegend, ChartLegendContent, ChartStyle, ChartTooltip, ChartTooltipContent, Checkbox, CheckboxField, Collapsible, CollapsibleContent, CollapsibleTrigger, ColorPicker, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, ContentFade, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, DashFade, DateField, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, FeedSkeleton, FieldLabel, FilterPopover, Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, IconInput, InputGroup, InputGroupInput, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, NumberInput, PasswordInput, PhoneInput, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, Progress, ReceiptCard, ReceiptSummaryRow, ResizableHandle, ResizablePanel, ResizablePanelGroup, ResponsiveAlertDialog, ResponsiveAlertDialogAction, ResponsiveAlertDialogCancel, ResponsiveAlertDialogContent, ResponsiveAlertDialogDescription, AlertDialogFooter as ResponsiveAlertDialogFooter, AlertDialogHeader as ResponsiveAlertDialogHeader, ResponsiveAlertDialogTitle, ResponsiveDialog, ResponsiveDialogClose, ResponsiveDialogContent, ResponsiveDialogDescription, ResponsiveDialogTitle, ResponsiveDialogTrigger, ScrollArea, ScrollBar, SegmentedTabList, SegmentedTabTrigger, SelectableCard, SelectableListRow, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, ShellTopBarViewToggle, ShellTopBarViewToggleItem, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Slider, SmoothSize, Switch, TabCountBadge, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Text, Textarea, TimeField, Toaster, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, badgeVariants, fieldLabelClass, formatTimeForDisplay, navigationMenuTriggerStyle, parseHm, tabsListVariants, tabsTriggerVariants, textVariants, toTimeStr, toggleVariants, useFormField, useIsMobile, useResponsiveDialogDrawer, useSidebar } from './chunk-H3CNZCYU.js';
2
2
  export { Label, RadioGroup, RadioGroupItem } from './chunk-RV5PMZYZ.js';
3
3
  export { HoverCard, HoverCardContent, HoverCardTrigger } from './chunk-L65F4EMK.js';
4
4
  import './chunk-PBNBLCC2.js';
5
5
  export { Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger } from './chunk-VVXGQKN7.js';
6
6
  export { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger } from './chunk-7YCAAP43.js';
7
+ export { Skeleton } from './chunk-DC4QH6W2.js';
7
8
  export { Input, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, SearchField, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, inputVariants } from './chunk-LUB7QWGU.js';
8
9
  export { Button, buttonVariants } from './chunk-VHINHHZQ.js';
9
10
  import './chunk-FCY5FYJB.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spacesync/client",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "description": "Reusable SpaceSync React UI, shell, theme, and API client primitives.",
5
5
  "type": "module",
6
6
  "files": [
@@ -44,6 +44,10 @@
44
44
  "types": "./dist/page-list-chrome.d.ts",
45
45
  "import": "./dist/page-list-chrome.js"
46
46
  },
47
+ "./page-list-loading": {
48
+ "types": "./dist/page-list-loading.d.ts",
49
+ "import": "./dist/page-list-loading.js"
50
+ },
47
51
  "./detail-page-header": {
48
52
  "types": "./dist/detail-page-header.d.ts",
49
53
  "import": "./dist/detail-page-header.js"
@@ -192,12 +196,6 @@
192
196
  "vaul": "1.1.2",
193
197
  "zod": "^3.24.1"
194
198
  },
195
- "scripts": {
196
- "build": "tsup",
197
- "typecheck": "tsc --noEmit -p tsconfig.json",
198
- "prepack": "pnpm build",
199
- "prepublishOnly": "pnpm typecheck"
200
- },
201
199
  "devDependencies": {
202
200
  "@types/react": "^18.3.28",
203
201
  "@types/react-dom": "^18.3.7",
@@ -212,5 +210,8 @@
212
210
  },
213
211
  "homepage": "https://github.com/YOUR_ORG/spacesync-client#readme",
214
212
  "bugs": "https://github.com/YOUR_ORG/spacesync-client/issues",
215
- "packageManager": "pnpm@9.15.0+sha512.76e2379760a4328ec4415815bcd6628dee727af3779aaa4c914e3944156c4299921a89f976381ee107d41f12cfa4b66681ca9c718f0668fa0831ed4c6d8ba56c"
216
- }
213
+ "scripts": {
214
+ "build": "tsup",
215
+ "typecheck": "tsc --noEmit -p tsconfig.json"
216
+ }
217
+ }