@sqlrooms/room-shell 0.17.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.
Files changed (63) hide show
  1. package/LICENSE.md +9 -0
  2. package/README.md +722 -0
  3. package/dist/RoomBuilder.d.ts +3 -0
  4. package/dist/RoomBuilder.d.ts.map +1 -0
  5. package/dist/RoomBuilder.js +28 -0
  6. package/dist/RoomBuilder.js.map +1 -0
  7. package/dist/RoomShell.d.ts +38 -0
  8. package/dist/RoomShell.d.ts.map +1 -0
  9. package/dist/RoomShell.js +47 -0
  10. package/dist/RoomShell.js.map +1 -0
  11. package/dist/RoomShellSidebarButtons.d.ts +19 -0
  12. package/dist/RoomShellSidebarButtons.d.ts.map +1 -0
  13. package/dist/RoomShellSidebarButtons.js +31 -0
  14. package/dist/RoomShellSidebarButtons.js.map +1 -0
  15. package/dist/RoomShellStore.d.ts +91 -0
  16. package/dist/RoomShellStore.d.ts.map +1 -0
  17. package/dist/RoomShellStore.js +461 -0
  18. package/dist/RoomShellStore.js.map +1 -0
  19. package/dist/data-sources/FileDataSourceCard.d.ts +9 -0
  20. package/dist/data-sources/FileDataSourceCard.d.ts.map +1 -0
  21. package/dist/data-sources/FileDataSourceCard.js +29 -0
  22. package/dist/data-sources/FileDataSourceCard.js.map +1 -0
  23. package/dist/data-sources/FileDataSourcesPanel.d.ts +6 -0
  24. package/dist/data-sources/FileDataSourcesPanel.d.ts.map +1 -0
  25. package/dist/data-sources/FileDataSourcesPanel.js +10 -0
  26. package/dist/data-sources/FileDataSourcesPanel.js.map +1 -0
  27. package/dist/data-sources/TableCard.d.ts +20 -0
  28. package/dist/data-sources/TableCard.d.ts.map +1 -0
  29. package/dist/data-sources/TableCard.js +12 -0
  30. package/dist/data-sources/TableCard.js.map +1 -0
  31. package/dist/data-sources/TablesListPanel.d.ts +7 -0
  32. package/dist/data-sources/TablesListPanel.d.ts.map +1 -0
  33. package/dist/data-sources/TablesListPanel.js +26 -0
  34. package/dist/data-sources/TablesListPanel.js.map +1 -0
  35. package/dist/data-sources/index.d.ts +5 -0
  36. package/dist/data-sources/index.d.ts.map +1 -0
  37. package/dist/data-sources/index.js +5 -0
  38. package/dist/data-sources/index.js.map +1 -0
  39. package/dist/index.d.ts +19 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +19 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/panels/RoomHeaderButton.d.ts +9 -0
  44. package/dist/panels/RoomHeaderButton.d.ts.map +1 -0
  45. package/dist/panels/RoomHeaderButton.js +8 -0
  46. package/dist/panels/RoomHeaderButton.js.map +1 -0
  47. package/dist/panels/RoomPanel.d.ts +8 -0
  48. package/dist/panels/RoomPanel.d.ts.map +1 -0
  49. package/dist/panels/RoomPanel.js +8 -0
  50. package/dist/panels/RoomPanel.js.map +1 -0
  51. package/dist/panels/RoomPanelHeader.d.ts +8 -0
  52. package/dist/panels/RoomPanelHeader.d.ts.map +1 -0
  53. package/dist/panels/RoomPanelHeader.js +17 -0
  54. package/dist/panels/RoomPanelHeader.js.map +1 -0
  55. package/dist/panels/index.d.ts +4 -0
  56. package/dist/panels/index.d.ts.map +1 -0
  57. package/dist/panels/index.js +4 -0
  58. package/dist/panels/index.js.map +1 -0
  59. package/dist/types.d.ts +26 -0
  60. package/dist/types.d.ts.map +1 -0
  61. package/dist/types.js +8 -0
  62. package/dist/types.js.map +1 -0
  63. package/package.json +46 -0
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { FileDataSourceCard } from './FileDataSourceCard';
3
+ import { useBaseRoomShellStore } from '../RoomShellStore';
4
+ const FileDataSourcesPanel = ({ isReadOnly }) => {
5
+ const roomFiles = useBaseRoomShellStore((state) => state.room.roomFiles);
6
+ const roomFilesProgress = useBaseRoomShellStore((state) => state.room.roomFilesProgress);
7
+ return (_jsx("div", { className: "flex flex-grow flex-col overflow-auto", children: roomFiles.map((fileInfo, i) => (_jsx(FileDataSourceCard, { isReadOnly: isReadOnly, fileInfo: fileInfo, fileState: roomFilesProgress[fileInfo.pathname] }, i))) }));
8
+ };
9
+ export { FileDataSourcesPanel };
10
+ //# sourceMappingURL=FileDataSourcesPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileDataSourcesPanel.js","sourceRoot":"","sources":["../../src/data-sources/FileDataSourcesPanel.tsx"],"names":[],"mappings":";AACA,OAAO,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAC,qBAAqB,EAAC,MAAM,mBAAmB,CAAC;AAExD,MAAM,oBAAoB,GAA+B,CAAC,EAAC,UAAU,EAAC,EAAE,EAAE;IACxE,MAAM,SAAS,GAAG,qBAAqB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzE,MAAM,iBAAiB,GAAG,qBAAqB,CAC7C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CACxC,CAAC;IAEF,OAAO,CACL,cAAK,SAAS,EAAC,uCAAuC,YACnD,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC,CAC9B,KAAC,kBAAkB,IAEjB,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAH1C,CAAC,CAIN,CACH,CAAC,GACE,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAC,oBAAoB,EAAC,CAAC","sourcesContent":["import {FC} from 'react';\nimport {FileDataSourceCard} from './FileDataSourceCard';\nimport {useBaseRoomShellStore} from '../RoomShellStore';\n\nconst FileDataSourcesPanel: FC<{isReadOnly?: boolean}> = ({isReadOnly}) => {\n const roomFiles = useBaseRoomShellStore((state) => state.room.roomFiles);\n const roomFilesProgress = useBaseRoomShellStore(\n (state) => state.room.roomFilesProgress,\n );\n\n return (\n <div className=\"flex flex-grow flex-col overflow-auto\">\n {roomFiles.map((fileInfo, i) => (\n <FileDataSourceCard\n key={i}\n isReadOnly={isReadOnly}\n fileInfo={fileInfo}\n fileState={roomFilesProgress[fileInfo.pathname]}\n />\n ))}\n </div>\n );\n};\n\nexport {FileDataSourcesPanel};\n"]}
@@ -0,0 +1,20 @@
1
+ import { DataTable } from '@sqlrooms/duckdb';
2
+ import React, { FC } from 'react';
3
+ export type TableAction = {
4
+ icon: React.FC<{
5
+ className: string;
6
+ }>;
7
+ label: string;
8
+ onClick: (tableName: string) => void;
9
+ };
10
+ declare const TableCard: FC<{
11
+ isReadOnly?: boolean;
12
+ value?: DataTable;
13
+ rowCount?: number;
14
+ onReset?: () => void;
15
+ onClick?: () => void;
16
+ className?: string;
17
+ menuRenderer?: (v: DataTable) => React.ReactNode;
18
+ }>;
19
+ export { TableCard };
20
+ //# sourceMappingURL=TableCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableCard.d.ts","sourceRoot":"","sources":["../../src/data-sources/TableCard.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAC,SAAS,EAAC,MAAM,kBAAkB,CAAC;AAG3C,OAAO,KAAK,EAAE,EAAC,EAAE,EAAC,MAAM,OAAO,CAAC;AAEhC,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAC,CAAC,CAAC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC,CAAC;AACF,QAAA,MAAM,SAAS,EAAE,EAAE,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,KAAK,KAAK,CAAC,SAAS,CAAC;CAClD,CA2EA,CAAC;AAEF,OAAO,EAAC,SAAS,EAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Badge, Button, Card, cn, DropdownMenu, DropdownMenuContent, DropdownMenuTrigger, Tooltip, TooltipContent, TooltipTrigger, } from '@sqlrooms/ui';
3
+ import { formatNumber } from '@sqlrooms/utils';
4
+ import { EllipsisIcon } from 'lucide-react';
5
+ const TableCard = ({ value, rowCount, onClick, className, menuRenderer }) => {
6
+ if (!value)
7
+ return null;
8
+ const numRows = value.rowCount ?? rowCount;
9
+ return (_jsx(Card, { className: cn(`hover:border-foreground relative flex cursor-pointer flex-col items-center justify-center rounded-sm border px-2 py-2 transition-colors`, className), onClick: onClick, children: _jsx("div", { className: "mt-0 flex w-full flex-col gap-2 px-2", children: _jsxs("div", { className: "w-full overflow-auto", children: [_jsxs("div", { className: "relative mb-2 flex h-[30px] cursor-pointer flex-row items-center gap-1 overflow-hidden", children: [_jsx("div", { className: "text-foreground mb-1 flex-1 overflow-hidden text-ellipsis whitespace-nowrap py-1 font-mono text-sm font-bold", children: value.tableName }), menuRenderer ? (_jsx("div", { className: "flex-none", children: _jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { size: "icon", variant: "ghost", className: "text-muted-foreground h-6 w-6", children: _jsx(EllipsisIcon, { className: "h-5 w-5" }) }) }), _jsx(DropdownMenuContent, { align: "end", children: menuRenderer(value) })] }) })) : null] }), _jsx("div", { className: "flex flex-col gap-1", children: value.columns?.map((row, i) => (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("div", { className: "hover:bg-foreground/10 flex items-center gap-3 rounded-sm font-mono", children: [_jsx(Badge, { variant: "secondary", className: "text-muted-foreground w-[70px] overflow-hidden whitespace-nowrap px-1 py-0 text-xs", children: row.type }), _jsx("div", { className: "max-w-[100px] text-xs", children: row.name })] }) }), _jsx(TooltipContent, { className: "max-w-[250px]", side: "right", align: "center", children: _jsxs("div", { className: "flex flex-col gap-1 font-mono", children: [_jsx("div", { className: "text-sm font-bold", children: row.name }), _jsx("div", { className: "text-muted-foreground text-xs", children: row.type })] }) })] }, i))) }), numRows !== undefined && Number.isFinite(numRows) && (_jsx("div", { className: "mt-1 text-right text-xs", children: `${formatNumber(numRows)} rows` }))] }) }) }));
10
+ };
11
+ export { TableCard };
12
+ //# sourceMappingURL=TableCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableCard.js","sourceRoot":"","sources":["../../src/data-sources/TableCard.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,KAAK,EACL,MAAM,EACN,IAAI,EACJ,EAAE,EACF,YAAY,EACZ,mBAAmB,EACnB,mBAAmB,EACnB,OAAO,EACP,cAAc,EACd,cAAc,GACf,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAC,YAAY,EAAC,MAAM,cAAc,CAAC;AAQ1C,MAAM,SAAS,GAQV,CAAC,EAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAC,EAAE,EAAE;IAC3D,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,IAAI,QAAQ,CAAC;IAC3C,OAAO,CACL,KAAC,IAAI,IACH,SAAS,EAAE,EAAE,CACX,yIAAyI,EACzI,SAAS,CACV,EACD,OAAO,EAAE,OAAO,YAEhB,cAAK,SAAS,EAAC,sCAAsC,YACnD,eAAK,SAAS,EAAC,sBAAsB,aACnC,eAAK,SAAS,EAAC,wFAAwF,aACrG,cAAK,SAAS,EAAC,8GAA8G,YAC1H,KAAK,CAAC,SAAS,GACZ,EACL,YAAY,CAAC,CAAC,CAAC,CACd,cAAK,SAAS,EAAC,WAAW,YACxB,MAAC,YAAY,eACX,KAAC,mBAAmB,IAAC,OAAO,kBAC1B,KAAC,MAAM,IACL,IAAI,EAAC,MAAM,EACX,OAAO,EAAC,OAAO,EACf,SAAS,EAAC,+BAA+B,YAEzC,KAAC,YAAY,IAAC,SAAS,EAAC,SAAS,GAAG,GAC7B,GACW,EACtB,KAAC,mBAAmB,IAAC,KAAK,EAAC,KAAK,YAC7B,YAAY,CAAC,KAAK,CAAC,GACA,IACT,GACX,CACP,CAAC,CAAC,CAAC,IAAI,IACJ,EACN,cAAK,SAAS,EAAC,qBAAqB,YACjC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAC9B,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,eAAK,SAAS,EAAC,qEAAqE,aAClF,KAAC,KAAK,IACJ,OAAO,EAAC,WAAW,EACnB,SAAS,EAAC,oFAAoF,YAE7F,GAAG,CAAC,IAAI,GACH,EACR,cAAK,SAAS,EAAC,uBAAuB,YAAE,GAAG,CAAC,IAAI,GAAO,IACnD,GACS,EACjB,KAAC,cAAc,IACb,SAAS,EAAC,eAAe,EACzB,IAAI,EAAC,OAAO,EACZ,KAAK,EAAC,QAAQ,YAEd,eAAK,SAAS,EAAC,+BAA+B,aAC5C,cAAK,SAAS,EAAC,mBAAmB,YAAE,GAAG,CAAC,IAAI,GAAO,EACnD,cAAK,SAAS,EAAC,+BAA+B,YAC3C,GAAG,CAAC,IAAI,GACL,IACF,GACS,KAvBL,CAAC,CAwBL,CACX,CAAC,GACE,EACL,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CACpD,cAAK,SAAS,EAAC,yBAAyB,YACrC,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,GAC5B,CACP,IACG,GACF,GACD,CACR,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAC,SAAS,EAAC,CAAC","sourcesContent":["import {\n Badge,\n Button,\n Card,\n cn,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuTrigger,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@sqlrooms/ui';\nimport {DataTable} from '@sqlrooms/duckdb';\nimport {formatNumber} from '@sqlrooms/utils';\nimport {EllipsisIcon} from 'lucide-react';\nimport React, {FC} from 'react';\n\nexport type TableAction = {\n icon: React.FC<{className: string}>;\n label: string;\n onClick: (tableName: string) => void;\n};\nconst TableCard: FC<{\n isReadOnly?: boolean;\n value?: DataTable;\n rowCount?: number;\n onReset?: () => void;\n onClick?: () => void;\n className?: string;\n menuRenderer?: (v: DataTable) => React.ReactNode;\n}> = ({value, rowCount, onClick, className, menuRenderer}) => {\n if (!value) return null;\n\n const numRows = value.rowCount ?? rowCount;\n return (\n <Card\n className={cn(\n `hover:border-foreground relative flex cursor-pointer flex-col items-center justify-center rounded-sm border px-2 py-2 transition-colors`,\n className,\n )}\n onClick={onClick}\n >\n <div className=\"mt-0 flex w-full flex-col gap-2 px-2\">\n <div className=\"w-full overflow-auto\">\n <div className=\"relative mb-2 flex h-[30px] cursor-pointer flex-row items-center gap-1 overflow-hidden\">\n <div className=\"text-foreground mb-1 flex-1 overflow-hidden text-ellipsis whitespace-nowrap py-1 font-mono text-sm font-bold\">\n {value.tableName}\n </div>\n {menuRenderer ? (\n <div className=\"flex-none\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n size=\"icon\"\n variant=\"ghost\"\n className=\"text-muted-foreground h-6 w-6\"\n >\n <EllipsisIcon className=\"h-5 w-5\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {menuRenderer(value)}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n ) : null}\n </div>\n <div className=\"flex flex-col gap-1\">\n {value.columns?.map((row, i) => (\n <Tooltip key={i}>\n <TooltipTrigger asChild>\n <div className=\"hover:bg-foreground/10 flex items-center gap-3 rounded-sm font-mono\">\n <Badge\n variant=\"secondary\"\n className=\"text-muted-foreground w-[70px] overflow-hidden whitespace-nowrap px-1 py-0 text-xs\"\n >\n {row.type}\n </Badge>\n <div className=\"max-w-[100px] text-xs\">{row.name}</div>\n </div>\n </TooltipTrigger>\n <TooltipContent\n className=\"max-w-[250px]\"\n side=\"right\"\n align=\"center\"\n >\n <div className=\"flex flex-col gap-1 font-mono\">\n <div className=\"text-sm font-bold\">{row.name}</div>\n <div className=\"text-muted-foreground text-xs\">\n {row.type}\n </div>\n </div>\n </TooltipContent>\n </Tooltip>\n ))}\n </div>\n {numRows !== undefined && Number.isFinite(numRows) && (\n <div className=\"mt-1 text-right text-xs\">\n {`${formatNumber(numRows)} rows`}\n </div>\n )}\n </div>\n </div>\n </Card>\n );\n};\n\nexport {TableCard};\n"]}
@@ -0,0 +1,7 @@
1
+ import { FC } from 'react';
2
+ declare const TablesListPanel: FC<{
3
+ className?: string;
4
+ isReadOnly?: boolean;
5
+ }>;
6
+ export { TablesListPanel };
7
+ //# sourceMappingURL=TablesListPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TablesListPanel.d.ts","sourceRoot":"","sources":["../../src/data-sources/TablesListPanel.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAC,EAAE,EAAW,MAAM,OAAO,CAAC;AAInC,QAAA,MAAM,eAAe,EAAE,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAuDA,CAAC;AAEF,OAAO,EAAC,eAAe,EAAC,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { DataTableModal } from '@sqlrooms/data-table';
3
+ import { cn, useDisclosure } from '@sqlrooms/ui';
4
+ import { useState } from 'react';
5
+ import { useBaseRoomShellStore } from '../RoomShellStore';
6
+ import { TableCard } from './TableCard';
7
+ const TablesListPanel = ({ className, isReadOnly }) => {
8
+ const tables = useBaseRoomShellStore((state) => state.db.tables);
9
+ const tableRowCounts = useBaseRoomShellStore((state) => state.db.tableRowCounts);
10
+ const [selectedTable, setSelectedTable] = useState(undefined);
11
+ const { isOpen, onOpen, onClose } = useDisclosure();
12
+ const handleClick = (table) => {
13
+ onOpen();
14
+ setSelectedTable(table);
15
+ };
16
+ const handleClose = () => {
17
+ onClose();
18
+ setSelectedTable(undefined);
19
+ };
20
+ return (_jsxs(_Fragment, { children: [_jsx("div", { className: cn('relative flex flex-grow flex-col items-stretch gap-2', className), children: tables?.length ? (_jsx("div", { className: "flex flex-col gap-2", children: tables.map((table, i) => (_jsx(TableCard, { onClick: () => handleClick(table), isReadOnly: isReadOnly, value: table, rowCount: tableRowCounts[table.tableName] }, i))) })) : null }), _jsx(DataTableModal, { className: "h-[80vh] max-w-[75vw]", tableModal: {
21
+ isOpen: isOpen,
22
+ onClose: handleClose,
23
+ }, title: selectedTable?.tableName, query: `SELECT * FROM ${selectedTable?.tableName}` })] }));
24
+ };
25
+ export { TablesListPanel };
26
+ //# sourceMappingURL=TablesListPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TablesListPanel.js","sourceRoot":"","sources":["../../src/data-sources/TablesListPanel.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,cAAc,EAAC,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAC,EAAE,EAAE,aAAa,EAAC,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAK,QAAQ,EAAC,MAAM,OAAO,CAAC;AACnC,OAAO,EAAC,qBAAqB,EAAC,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AAEtC,MAAM,eAAe,GAGhB,CAAC,EAAC,SAAS,EAAE,UAAU,EAAC,EAAE,EAAE;IAC/B,MAAM,MAAM,GAAG,qBAAqB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;IACjE,MAAM,cAAc,GAAG,qBAAqB,CAC1C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,cAAc,CACnC,CAAC;IAEF,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAChD,SAAS,CACV,CAAC;IACF,MAAM,EAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAC,GAAG,aAAa,EAAE,CAAC;IAElD,MAAM,WAAW,GAAG,CAAC,KAAgB,EAAE,EAAE;QACvC,MAAM,EAAE,CAAC;QACT,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,GAAG,EAAE;QACvB,OAAO,EAAE,CAAC;QACV,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC9B,CAAC,CAAC;IAEF,OAAO,CACL,8BACE,cACE,SAAS,EAAE,EAAE,CACX,sDAAsD,EACtD,SAAS,CACV,YAEA,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAChB,cAAK,SAAS,EAAC,qBAAqB,YACjC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CACxB,KAAC,SAAS,IAER,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,EACjC,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC,IAJpC,CAAC,CAKN,CACH,CAAC,GACE,CACP,CAAC,CAAC,CAAC,IAAI,GACJ,EAEN,KAAC,cAAc,IACb,SAAS,EAAC,uBAAuB,EACjC,UAAU,EAAE;oBACV,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,WAAW;iBACrB,EACD,KAAK,EAAE,aAAa,EAAE,SAAS,EAC/B,KAAK,EAAE,iBAAiB,aAAa,EAAE,SAAS,EAAE,GAClD,IACD,CACJ,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAC,eAAe,EAAC,CAAC","sourcesContent":["import {DataTableModal} from '@sqlrooms/data-table';\nimport {DataTable} from '@sqlrooms/duckdb';\nimport {cn, useDisclosure} from '@sqlrooms/ui';\nimport {FC, useState} from 'react';\nimport {useBaseRoomShellStore} from '../RoomShellStore';\nimport {TableCard} from './TableCard';\n\nconst TablesListPanel: FC<{\n className?: string;\n isReadOnly?: boolean;\n}> = ({className, isReadOnly}) => {\n const tables = useBaseRoomShellStore((state) => state.db.tables);\n const tableRowCounts = useBaseRoomShellStore(\n (state) => state.db.tableRowCounts,\n );\n\n const [selectedTable, setSelectedTable] = useState<DataTable | undefined>(\n undefined,\n );\n const {isOpen, onOpen, onClose} = useDisclosure();\n\n const handleClick = (table: DataTable) => {\n onOpen();\n setSelectedTable(table);\n };\n\n const handleClose = () => {\n onClose();\n setSelectedTable(undefined);\n };\n\n return (\n <>\n <div\n className={cn(\n 'relative flex flex-grow flex-col items-stretch gap-2',\n className,\n )}\n >\n {tables?.length ? (\n <div className=\"flex flex-col gap-2\">\n {tables.map((table, i) => (\n <TableCard\n key={i}\n onClick={() => handleClick(table)}\n isReadOnly={isReadOnly}\n value={table}\n rowCount={tableRowCounts[table.tableName]}\n />\n ))}\n </div>\n ) : null}\n </div>\n\n <DataTableModal\n className=\"h-[80vh] max-w-[75vw]\"\n tableModal={{\n isOpen: isOpen,\n onClose: handleClose,\n }}\n title={selectedTable?.tableName}\n query={`SELECT * FROM ${selectedTable?.tableName}`}\n />\n </>\n );\n};\n\nexport {TablesListPanel};\n"]}
@@ -0,0 +1,5 @@
1
+ export * from './FileDataSourceCard';
2
+ export * from './FileDataSourcesPanel';
3
+ export * from './TableCard';
4
+ export * from './TablesListPanel';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/data-sources/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from './FileDataSourceCard';
2
+ export * from './FileDataSourcesPanel';
3
+ export * from './TableCard';
4
+ export * from './TablesListPanel';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/data-sources/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC","sourcesContent":["export * from './FileDataSourceCard';\nexport * from './FileDataSourcesPanel';\nexport * from './TableCard';\nexport * from './TablesListPanel';\n"]}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * {@include ../README.md}
3
+ * @packageDocumentation
4
+ */
5
+ export { FileDataSourceCard } from './data-sources/FileDataSourceCard';
6
+ export { FileDataSourcesPanel } from './data-sources/FileDataSourcesPanel';
7
+ export { TableCard } from './data-sources/TableCard';
8
+ export { TablesListPanel } from './data-sources/TablesListPanel';
9
+ export { PanelHeaderButton } from './panels/RoomHeaderButton';
10
+ export { RoomPanel } from './panels/RoomPanel';
11
+ export { RoomPanelHeader } from './panels/RoomPanelHeader';
12
+ export { RoomShellSidebarButton, RoomShellSidebarButtons, SidebarButton, } from './RoomShellSidebarButtons';
13
+ export { type TaskProgress, createRoomStore } from '@sqlrooms/core';
14
+ export { createRoomShellSlice, createSlice, useBaseRoomShellStore, type RoomShellSliceState, type RoomPanelInfo, } from './RoomShellStore';
15
+ export type { StateCreator, StoreApi } from 'zustand';
16
+ export { DataSourceStatus, type DataSourceState, type RoomFileInfo, type RoomFileState, } from './types';
17
+ export * from '@sqlrooms/room-config';
18
+ export { RoomShell } from './RoomShell';
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAC,kBAAkB,EAAC,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAC,oBAAoB,EAAC,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAC,SAAS,EAAC,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAC,eAAe,EAAC,MAAM,gCAAgC,CAAC;AAE/D,OAAO,EAAC,iBAAiB,EAAC,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAC,SAAS,EAAC,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAC,eAAe,EAAC,MAAM,0BAA0B,CAAC;AAEzD,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,aAAa,GACd,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAC,KAAK,YAAY,EAAE,eAAe,EAAC,MAAM,gBAAgB,CAAC;AAElE,OAAO,EACL,oBAAoB,EACpB,WAAW,EACX,qBAAqB,EACrB,KAAK,mBAAmB,EACxB,KAAK,aAAa,GACnB,MAAM,kBAAkB,CAAC;AAE1B,YAAY,EAAC,YAAY,EAAE,QAAQ,EAAC,MAAM,SAAS,CAAC;AAEpD,OAAO,EACL,gBAAgB,EAChB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,aAAa,GACnB,MAAM,SAAS,CAAC;AAGjB,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,19 @@
1
+ /**
2
+ * {@include ../README.md}
3
+ * @packageDocumentation
4
+ */
5
+ export { FileDataSourceCard } from './data-sources/FileDataSourceCard';
6
+ export { FileDataSourcesPanel } from './data-sources/FileDataSourcesPanel';
7
+ export { TableCard } from './data-sources/TableCard';
8
+ export { TablesListPanel } from './data-sources/TablesListPanel';
9
+ export { PanelHeaderButton } from './panels/RoomHeaderButton';
10
+ export { RoomPanel } from './panels/RoomPanel';
11
+ export { RoomPanelHeader } from './panels/RoomPanelHeader';
12
+ export { RoomShellSidebarButton, RoomShellSidebarButtons, SidebarButton, } from './RoomShellSidebarButtons';
13
+ export { createRoomStore } from '@sqlrooms/core';
14
+ export { createRoomShellSlice, createSlice, useBaseRoomShellStore, } from './RoomShellStore';
15
+ export { DataSourceStatus, } from './types';
16
+ // Re-export all room-config types
17
+ export * from '@sqlrooms/room-config';
18
+ export { RoomShell } from './RoomShell';
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAC,kBAAkB,EAAC,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAC,oBAAoB,EAAC,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAC,SAAS,EAAC,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAC,eAAe,EAAC,MAAM,gCAAgC,CAAC;AAE/D,OAAO,EAAC,iBAAiB,EAAC,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAC,SAAS,EAAC,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAC,eAAe,EAAC,MAAM,0BAA0B,CAAC;AAEzD,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,aAAa,GACd,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAoB,eAAe,EAAC,MAAM,gBAAgB,CAAC;AAElE,OAAO,EACL,oBAAoB,EACpB,WAAW,EACX,qBAAqB,GAGtB,MAAM,kBAAkB,CAAC;AAI1B,OAAO,EACL,gBAAgB,GAIjB,MAAM,SAAS,CAAC;AAEjB,kCAAkC;AAClC,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC","sourcesContent":["/**\n * {@include ../README.md}\n * @packageDocumentation\n */\n\nexport {FileDataSourceCard} from './data-sources/FileDataSourceCard';\nexport {FileDataSourcesPanel} from './data-sources/FileDataSourcesPanel';\nexport {TableCard} from './data-sources/TableCard';\nexport {TablesListPanel} from './data-sources/TablesListPanel';\n\nexport {PanelHeaderButton} from './panels/RoomHeaderButton';\nexport {RoomPanel} from './panels/RoomPanel';\nexport {RoomPanelHeader} from './panels/RoomPanelHeader';\n\nexport {\n RoomShellSidebarButton,\n RoomShellSidebarButtons,\n SidebarButton,\n} from './RoomShellSidebarButtons';\n\nexport {type TaskProgress, createRoomStore} from '@sqlrooms/core';\n\nexport {\n createRoomShellSlice,\n createSlice,\n useBaseRoomShellStore,\n type RoomShellSliceState,\n type RoomPanelInfo,\n} from './RoomShellStore';\n\nexport type {StateCreator, StoreApi} from 'zustand';\n\nexport {\n DataSourceStatus,\n type DataSourceState,\n type RoomFileInfo,\n type RoomFileState,\n} from './types';\n\n// Re-export all room-config types\nexport * from '@sqlrooms/room-config';\nexport {RoomShell} from './RoomShell';\n"]}
@@ -0,0 +1,9 @@
1
+ import React, { FC } from 'react';
2
+ declare const PanelHeaderButton: FC<{
3
+ label: string;
4
+ icon: React.ReactElement;
5
+ isPinned?: boolean;
6
+ onClick: () => void;
7
+ }>;
8
+ export { PanelHeaderButton };
9
+ //# sourceMappingURL=RoomHeaderButton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RoomHeaderButton.d.ts","sourceRoot":"","sources":["../../src/panels/RoomHeaderButton.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAC,EAAE,EAAC,MAAM,OAAO,CAAC;AAEhC,QAAA,MAAM,iBAAiB,EAAE,EAAE,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,KAAK,CAAC,YAAY,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAeA,CAAC;AAEF,OAAO,EAAC,iBAAiB,EAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Button } from '@sqlrooms/ui';
3
+ const PanelHeaderButton = (props) => {
4
+ const { isPinned, icon, label, onClick } = props;
5
+ return (_jsx(Button, { size: "icon", onClick: onClick, variant: "ghost", className: `h-6 w-6 ${isPinned ? 'text-foreground' : 'text-muted-foreground'} hover:text-foreground hover:bg-foreground/10`, "aria-label": label, children: icon }));
6
+ };
7
+ export { PanelHeaderButton };
8
+ //# sourceMappingURL=RoomHeaderButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RoomHeaderButton.js","sourceRoot":"","sources":["../../src/panels/RoomHeaderButton.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,cAAc,CAAC;AAGpC,MAAM,iBAAiB,GAKlB,CAAC,KAAK,EAAE,EAAE;IACb,MAAM,EAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAC,GAAG,KAAK,CAAC;IAC/C,OAAO,CACL,KAAC,MAAM,IACL,IAAI,EAAC,MAAM,EACX,OAAO,EAAE,OAAO,EAChB,OAAO,EAAC,OAAO,EACf,SAAS,EAAE,WACT,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,uBACjC,+CAA+C,gBACnC,KAAK,YAEhB,IAAI,GACE,CACV,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAC,iBAAiB,EAAC,CAAC","sourcesContent":["import {Button} from '@sqlrooms/ui';\nimport React, {FC} from 'react';\n\nconst PanelHeaderButton: FC<{\n label: string;\n icon: React.ReactElement;\n isPinned?: boolean;\n onClick: () => void;\n}> = (props) => {\n const {isPinned, icon, label, onClick} = props;\n return (\n <Button\n size=\"icon\"\n onClick={onClick}\n variant=\"ghost\"\n className={`h-6 w-6 ${\n isPinned ? 'text-foreground' : 'text-muted-foreground'\n } hover:text-foreground hover:bg-foreground/10`}\n aria-label={label}\n >\n {icon}\n </Button>\n );\n};\n\nexport {PanelHeaderButton};\n"]}
@@ -0,0 +1,8 @@
1
+ import { FC, PropsWithChildren } from 'react';
2
+ declare const RoomPanel: FC<PropsWithChildren<{
3
+ className?: string;
4
+ type: string;
5
+ showHeader?: boolean;
6
+ }>>;
7
+ export { RoomPanel };
8
+ //# sourceMappingURL=RoomPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RoomPanel.d.ts","sourceRoot":"","sources":["../../src/panels/RoomPanel.tsx"],"names":[],"mappings":"AACA,OAAO,EAAC,EAAE,EAAE,iBAAiB,EAAC,MAAM,OAAO,CAAC;AAG5C,QAAA,MAAM,SAAS,EAAE,EAAE,CACjB,iBAAiB,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC,CAUH,CAAC;AAEF,OAAO,EAAC,SAAS,EAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cn } from '@sqlrooms/ui';
3
+ import { RoomPanelHeader } from './RoomPanelHeader';
4
+ const RoomPanel = ({ type: roomPanelType, children, className, showHeader = true }) => {
5
+ return (_jsxs("div", { className: cn('flex h-full flex-grow flex-col gap-3', className), children: [showHeader && _jsx(RoomPanelHeader, { panelKey: roomPanelType }), _jsx("div", { className: "flex h-full flex-grow flex-col gap-3 overflow-auto", children: children })] }));
6
+ };
7
+ export { RoomPanel };
8
+ //# sourceMappingURL=RoomPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RoomPanel.js","sourceRoot":"","sources":["../../src/panels/RoomPanel.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,EAAE,EAAC,MAAM,cAAc,CAAC;AAEhC,OAAO,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAC;AAElD,MAAM,SAAS,GAMX,CAAC,EAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,GAAG,IAAI,EAAC,EAAE,EAAE;IACpE,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,sCAAsC,EAAE,SAAS,CAAC,aAClE,UAAU,IAAI,KAAC,eAAe,IAAC,QAAQ,EAAE,aAAa,GAAI,EAC3D,cAAK,SAAS,EAAC,oDAAoD,YAChE,QAAQ,GACL,IACF,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAC,SAAS,EAAC,CAAC","sourcesContent":["import {cn} from '@sqlrooms/ui';\nimport {FC, PropsWithChildren} from 'react';\nimport {RoomPanelHeader} from './RoomPanelHeader';\n\nconst RoomPanel: FC<\n PropsWithChildren<{\n className?: string;\n type: string;\n showHeader?: boolean;\n }>\n> = ({type: roomPanelType, children, className, showHeader = true}) => {\n return (\n <div className={cn('flex h-full flex-grow flex-col gap-3', className)}>\n {showHeader && <RoomPanelHeader panelKey={roomPanelType} />}\n <div className=\"flex h-full flex-grow flex-col gap-3 overflow-auto\">\n {children}\n </div>\n </div>\n );\n};\n\nexport {RoomPanel};\n"]}
@@ -0,0 +1,8 @@
1
+ import { FC } from 'react';
2
+ declare const RoomPanelHeader: FC<{
3
+ panelKey: string;
4
+ showHeader?: boolean;
5
+ children?: React.ReactNode;
6
+ }>;
7
+ export { RoomPanelHeader };
8
+ //# sourceMappingURL=RoomPanelHeader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RoomPanelHeader.d.ts","sourceRoot":"","sources":["../../src/panels/RoomPanelHeader.tsx"],"names":[],"mappings":"AACA,OAAO,EAAC,EAAE,EAAU,MAAM,OAAO,CAAC;AAIlC,QAAA,MAAM,eAAe,EAAE,EAAE,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,CAkDA,CAAC;AAEF,OAAO,EAAC,eAAe,EAAC,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { PinIcon, PinOffIcon, XIcon } from 'lucide-react';
3
+ import { useMemo } from 'react';
4
+ import { useBaseRoomShellStore } from '../RoomShellStore';
5
+ import { PanelHeaderButton } from './RoomHeaderButton';
6
+ const RoomPanelHeader = (props) => {
7
+ const { showHeader = true, panelKey: type, children } = props;
8
+ const panels = useBaseRoomShellStore((state) => state.room.panels);
9
+ const { icon: Icon, title } = panels[type] ?? {};
10
+ const togglePanel = useBaseRoomShellStore((state) => state.room.togglePanel);
11
+ const togglePanelPin = useBaseRoomShellStore((state) => state.room.togglePanelPin);
12
+ const pinnedPanels = useBaseRoomShellStore((state) => state.config.layout.pinned);
13
+ const isPinned = useMemo(() => pinnedPanels?.includes(type), [pinnedPanels, type]);
14
+ return (_jsxs("div", { className: "flex", children: [_jsxs("div", { className: "flex w-full flex-row items-center gap-2", children: [showHeader && (_jsxs(_Fragment, { children: [Icon ? _jsx(Icon, { className: "h-4 w-4" }) : null, _jsx("h2", { className: "text-muted-foreground text-xs font-semibold uppercase", children: title })] })), children] }), _jsxs("div", { className: "bg-secondary/50 flex gap-0", children: [_jsx(PanelHeaderButton, { isPinned: isPinned, icon: isPinned ? (_jsx(PinIcon, { className: "w-[18px]" })) : (_jsx(PinOffIcon, { className: "w-[18px]" })), onClick: () => togglePanelPin(type), label: "Pin panel" }), _jsx(PanelHeaderButton, { icon: _jsx(XIcon, { className: "w-[18px]" }), onClick: () => togglePanel(type), label: `Close panel "${title}"` })] })] }));
15
+ };
16
+ export { RoomPanelHeader };
17
+ //# sourceMappingURL=RoomPanelHeader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RoomPanelHeader.js","sourceRoot":"","sources":["../../src/panels/RoomPanelHeader.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAC,MAAM,cAAc,CAAC;AACxD,OAAO,EAAK,OAAO,EAAC,MAAM,OAAO,CAAC;AAClC,OAAO,EAAC,qBAAqB,EAAC,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAC,iBAAiB,EAAC,MAAM,oBAAoB,CAAC;AAErD,MAAM,eAAe,GAIhB,CAAC,KAAK,EAAE,EAAE;IACb,MAAM,EAAC,UAAU,GAAG,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAC,GAAG,KAAK,CAAC;IAC5D,MAAM,MAAM,GAAG,qBAAqB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnE,MAAM,EAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAC,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC/C,MAAM,WAAW,GAAG,qBAAqB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC7E,MAAM,cAAc,GAAG,qBAAqB,CAC1C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CACrC,CAAC;IACF,MAAM,YAAY,GAAG,qBAAqB,CACxC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CACtC,CAAC;IACF,MAAM,QAAQ,GAAG,OAAO,CACtB,GAAG,EAAE,CAAC,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,EAClC,CAAC,YAAY,EAAE,IAAI,CAAC,CACrB,CAAC;IAEF,OAAO,CACL,eAAK,SAAS,EAAC,MAAM,aACnB,eAAK,SAAS,EAAC,yCAAyC,aACrD,UAAU,IAAI,CACb,8BACG,IAAI,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,SAAS,EAAC,SAAS,GAAG,CAAC,CAAC,CAAC,IAAI,EAC3C,aAAI,SAAS,EAAC,uDAAuD,YAClE,KAAK,GACH,IACJ,CACJ,EACA,QAAQ,IACL,EACN,eAAK,SAAS,EAAC,4BAA4B,aACzC,KAAC,iBAAiB,IAChB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EACF,QAAQ,CAAC,CAAC,CAAC,CACT,KAAC,OAAO,IAAC,SAAS,EAAC,UAAU,GAAG,CACjC,CAAC,CAAC,CAAC,CACF,KAAC,UAAU,IAAC,SAAS,EAAC,UAAU,GAAG,CACpC,EAEH,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,EACnC,KAAK,EAAC,WAAW,GACjB,EACF,KAAC,iBAAiB,IAChB,IAAI,EAAE,KAAC,KAAK,IAAC,SAAS,EAAC,UAAU,GAAG,EACpC,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,EAChC,KAAK,EAAE,gBAAgB,KAAK,GAAG,GAC/B,IACE,IACF,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAC,eAAe,EAAC,CAAC","sourcesContent":["import {PinIcon, PinOffIcon, XIcon} from 'lucide-react';\nimport {FC, useMemo} from 'react';\nimport {useBaseRoomShellStore} from '../RoomShellStore';\nimport {PanelHeaderButton} from './RoomHeaderButton';\n\nconst RoomPanelHeader: FC<{\n panelKey: string;\n showHeader?: boolean;\n children?: React.ReactNode;\n}> = (props) => {\n const {showHeader = true, panelKey: type, children} = props;\n const panels = useBaseRoomShellStore((state) => state.room.panels);\n const {icon: Icon, title} = panels[type] ?? {};\n const togglePanel = useBaseRoomShellStore((state) => state.room.togglePanel);\n const togglePanelPin = useBaseRoomShellStore(\n (state) => state.room.togglePanelPin,\n );\n const pinnedPanels = useBaseRoomShellStore(\n (state) => state.config.layout.pinned,\n );\n const isPinned = useMemo(\n () => pinnedPanels?.includes(type),\n [pinnedPanels, type],\n );\n\n return (\n <div className=\"flex\">\n <div className=\"flex w-full flex-row items-center gap-2\">\n {showHeader && (\n <>\n {Icon ? <Icon className=\"h-4 w-4\" /> : null}\n <h2 className=\"text-muted-foreground text-xs font-semibold uppercase\">\n {title}\n </h2>\n </>\n )}\n {children}\n </div>\n <div className=\"bg-secondary/50 flex gap-0\">\n <PanelHeaderButton\n isPinned={isPinned}\n icon={\n isPinned ? (\n <PinIcon className=\"w-[18px]\" />\n ) : (\n <PinOffIcon className=\"w-[18px]\" />\n )\n }\n onClick={() => togglePanelPin(type)}\n label=\"Pin panel\"\n />\n <PanelHeaderButton\n icon={<XIcon className=\"w-[18px]\" />}\n onClick={() => togglePanel(type)}\n label={`Close panel \"${title}\"`}\n />\n </div>\n </div>\n );\n};\n\nexport {RoomPanelHeader};\n"]}
@@ -0,0 +1,4 @@
1
+ export * from './RoomPanel';
2
+ export * from './RoomPanelHeader';
3
+ export * from './RoomHeaderButton';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/panels/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './RoomPanel';
2
+ export * from './RoomPanelHeader';
3
+ export * from './RoomHeaderButton';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/panels/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC","sourcesContent":["export * from './RoomPanel';\nexport * from './RoomPanelHeader';\nexport * from './RoomHeaderButton';\n"]}
@@ -0,0 +1,26 @@
1
+ import { ProgressInfo } from '@sqlrooms/utils';
2
+ export type RoomFileState = {
3
+ status: 'download' | 'upload' | 'done';
4
+ progress?: ProgressInfo;
5
+ } | {
6
+ status: 'error';
7
+ message?: string;
8
+ };
9
+ export type RoomFileInfo = {
10
+ pathname: string;
11
+ duckdbFileName?: string;
12
+ file?: File;
13
+ size?: number;
14
+ numRows?: number;
15
+ };
16
+ export declare enum DataSourceStatus {
17
+ PENDING = "PENDING",
18
+ FETCHING = "FETCHING",
19
+ READY = "READY",
20
+ ERROR = "ERROR"
21
+ }
22
+ export type DataSourceState = {
23
+ status: DataSourceStatus;
24
+ message?: string;
25
+ };
26
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAC;AAE7C,MAAM,MAAM,aAAa,GACrB;IACE,MAAM,EAAE,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAC;IACvC,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB,GACD;IACE,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEN,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAGlB,CAAC;AAEF,oBAAY,gBAAgB;IAC1B,OAAO,YAAY;IACnB,QAAQ,aAAa;IACrB,KAAK,UAAU;IACf,KAAK,UAAU;CAChB;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,gBAAgB,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,8 @@
1
+ export var DataSourceStatus;
2
+ (function (DataSourceStatus) {
3
+ DataSourceStatus["PENDING"] = "PENDING";
4
+ DataSourceStatus["FETCHING"] = "FETCHING";
5
+ DataSourceStatus["READY"] = "READY";
6
+ DataSourceStatus["ERROR"] = "ERROR";
7
+ })(DataSourceStatus || (DataSourceStatus = {}));
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAsBA,MAAM,CAAN,IAAY,gBAKX;AALD,WAAY,gBAAgB;IAC1B,uCAAmB,CAAA;IACnB,yCAAqB,CAAA;IACrB,mCAAe,CAAA;IACf,mCAAe,CAAA;AACjB,CAAC,EALW,gBAAgB,KAAhB,gBAAgB,QAK3B","sourcesContent":["import {ProgressInfo} from '@sqlrooms/utils';\n\nexport type RoomFileState =\n | {\n status: 'download' | 'upload' | 'done';\n progress?: ProgressInfo;\n }\n | {\n status: 'error';\n message?: string;\n };\n\nexport type RoomFileInfo = {\n pathname: string;\n duckdbFileName?: string;\n file?: File;\n size?: number;\n numRows?: number;\n // hasBeenUploaded?: boolean;\n // uploadState?: FileUploadState;\n};\n\nexport enum DataSourceStatus {\n PENDING = 'PENDING',\n FETCHING = 'FETCHING',\n READY = 'READY',\n ERROR = 'ERROR',\n}\n\nexport type DataSourceState = {\n status: DataSourceStatus;\n message?: string;\n};\n"]}
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@sqlrooms/room-shell",
3
+ "version": "0.17.0",
4
+ "main": "dist/index.js",
5
+ "types": "dist/index.d.ts",
6
+ "module": "dist/index.js",
7
+ "type": "module",
8
+ "author": "Ilya Boyandin <ilya@boyandin.me>",
9
+ "license": "MIT",
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "https://github.com/sqlrooms/sqlrooms.git"
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "publishConfig": {
18
+ "access": "public"
19
+ },
20
+ "scripts": {
21
+ "dev": "tsc -w",
22
+ "build": "tsc",
23
+ "lint": "eslint .",
24
+ "typecheck": "tsc --noEmit",
25
+ "typedoc": "typedoc"
26
+ },
27
+ "dependencies": {
28
+ "@sqlrooms/core": "0.17.0",
29
+ "@sqlrooms/data-table": "0.17.0",
30
+ "@sqlrooms/duckdb": "0.17.0",
31
+ "@sqlrooms/layout": "0.17.0",
32
+ "@sqlrooms/room-config": "0.17.0",
33
+ "@sqlrooms/ui": "0.17.0",
34
+ "@sqlrooms/utils": "0.17.0",
35
+ "apache-arrow": "17.0.0",
36
+ "immer": "^10.1.1",
37
+ "lucide-react": "^0.474.0",
38
+ "react-mosaic-component": "5.3.0",
39
+ "zod": "^3.25.57",
40
+ "zustand": "^5.0.5"
41
+ },
42
+ "peerDependencies": {
43
+ "react": ">=18"
44
+ },
45
+ "gitHead": "1f2a306da771481e2c89d8bfbd0507772167b1b5"
46
+ }