@spacesync/client 0.1.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/README.md +39 -0
- package/dist/analog-clock-picker.d.ts +10 -0
- package/dist/analog-clock-picker.js +408 -0
- package/dist/analog-clock-picker.js.map +1 -0
- package/dist/api.d.ts +222 -0
- package/dist/api.js +167 -0
- package/dist/api.js.map +1 -0
- package/dist/app-modal.d.ts +25 -0
- package/dist/app-modal.js +145 -0
- package/dist/app-modal.js.map +1 -0
- package/dist/app-shell-mobile-nav.d.ts +29 -0
- package/dist/app-shell-mobile-nav.js +122 -0
- package/dist/app-shell-mobile-nav.js.map +1 -0
- package/dist/app-web-shell.d.ts +20 -0
- package/dist/app-web-shell.js +45 -0
- package/dist/app-web-shell.js.map +1 -0
- package/dist/booking-schedule-calendars.d.ts +95 -0
- package/dist/booking-schedule-calendars.js +1343 -0
- package/dist/booking-schedule-calendars.js.map +1 -0
- package/dist/chat-stick-to-bottom.d.ts +22 -0
- package/dist/chat-stick-to-bottom.js +190 -0
- package/dist/chat-stick-to-bottom.js.map +1 -0
- package/dist/detail-page-header.d.ts +16 -0
- package/dist/detail-page-header.js +220 -0
- package/dist/detail-page-header.js.map +1 -0
- package/dist/dialog-CIdvylPK.d.ts +16 -0
- package/dist/errors-D1niseaa.d.ts +34 -0
- package/dist/file-picker-field.d.ts +23 -0
- package/dist/file-picker-field.js +165 -0
- package/dist/file-picker-field.js.map +1 -0
- package/dist/file-viewer-dialog.d.ts +15 -0
- package/dist/file-viewer-dialog.js +387 -0
- package/dist/file-viewer-dialog.js.map +1 -0
- package/dist/floor-switcher.d.ts +14 -0
- package/dist/floor-switcher.js +416 -0
- package/dist/floor-switcher.js.map +1 -0
- package/dist/forms.d.ts +52 -0
- package/dist/forms.js +66 -0
- package/dist/forms.js.map +1 -0
- package/dist/image-picker-field.d.ts +11 -0
- package/dist/image-picker-field.js +135 -0
- package/dist/image-picker-field.js.map +1 -0
- package/dist/layout-canvas-view.d.ts +57 -0
- package/dist/layout-canvas-view.js +974 -0
- package/dist/layout-canvas-view.js.map +1 -0
- package/dist/lib/dateDisplay.d.ts +24 -0
- package/dist/lib/dateDisplay.js +84 -0
- package/dist/lib/dateDisplay.js.map +1 -0
- package/dist/live-resource-meta.d.ts +11 -0
- package/dist/live-resource-meta.js +27 -0
- package/dist/live-resource-meta.js.map +1 -0
- package/dist/live-space-pulse-dot.d.ts +8 -0
- package/dist/live-space-pulse-dot.js +18 -0
- package/dist/live-space-pulse-dot.js.map +1 -0
- package/dist/notification-sidebar-preview.d.ts +37 -0
- package/dist/notification-sidebar-preview.js +121 -0
- package/dist/notification-sidebar-preview.js.map +1 -0
- package/dist/page-list-chrome.d.ts +124 -0
- package/dist/page-list-chrome.js +970 -0
- package/dist/page-list-chrome.js.map +1 -0
- package/dist/platform-support-message-composer.d.ts +38 -0
- package/dist/platform-support-message-composer.js +446 -0
- package/dist/platform-support-message-composer.js.map +1 -0
- package/dist/shell-sidebar-nav.d.ts +16 -0
- package/dist/shell-sidebar-nav.js +69 -0
- package/dist/shell-sidebar-nav.js.map +1 -0
- package/dist/shell-theme.d.ts +6 -0
- package/dist/shell-theme.js +9 -0
- package/dist/shell-theme.js.map +1 -0
- package/dist/shell-top-bar-chrome.d.ts +39 -0
- package/dist/shell-top-bar-chrome.js +105 -0
- package/dist/shell-top-bar-chrome.js.map +1 -0
- package/dist/shell-top-bar.d.ts +16 -0
- package/dist/shell-top-bar.js +71 -0
- package/dist/shell-top-bar.js.map +1 -0
- package/dist/styles/theme.css +223 -0
- package/dist/styles/theme.css.map +1 -0
- package/dist/styles/theme.d.ts +2 -0
- package/dist/support-presence-status.d.ts +11 -0
- package/dist/support-presence-status.js +92 -0
- package/dist/support-presence-status.js.map +1 -0
- package/dist/theme-appearance-control.d.ts +5 -0
- package/dist/theme-appearance-control.js +114 -0
- package/dist/theme-appearance-control.js.map +1 -0
- package/dist/theme-boot-script.d.ts +4 -0
- package/dist/theme-boot-script.js +9 -0
- package/dist/theme-boot-script.js.map +1 -0
- package/dist/theme-provider.d.ts +9 -0
- package/dist/theme-provider.js +25 -0
- package/dist/theme-provider.js.map +1 -0
- package/dist/ui.d.ts +765 -0
- package/dist/ui.js +5637 -0
- package/dist/ui.js.map +1 -0
- package/dist/use-client-pagination.d.ts +22 -0
- package/dist/use-client-pagination.js +51 -0
- package/dist/use-client-pagination.js.map +1 -0
- package/dist/use-client-sort.d.ts +20 -0
- package/dist/use-client-sort.js +41 -0
- package/dist/use-client-sort.js.map +1 -0
- package/package.json +208 -0
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { Menu } from 'lucide-react';
|
|
2
|
+
import { useState, useEffect } from 'react';
|
|
3
|
+
import { Drawer as Drawer$1 } from 'vaul';
|
|
4
|
+
import { clsx } from 'clsx';
|
|
5
|
+
import { twMerge } from 'tailwind-merge';
|
|
6
|
+
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
7
|
+
|
|
8
|
+
function cn(...inputs) {
|
|
9
|
+
return twMerge(clsx(inputs));
|
|
10
|
+
}
|
|
11
|
+
function Drawer({ ...props }) {
|
|
12
|
+
return /* @__PURE__ */ jsx(Drawer$1.Root, { "data-slot": "drawer", ...props });
|
|
13
|
+
}
|
|
14
|
+
function DrawerPortal({ ...props }) {
|
|
15
|
+
return /* @__PURE__ */ jsx(Drawer$1.Portal, { "data-slot": "drawer-portal", ...props });
|
|
16
|
+
}
|
|
17
|
+
function DrawerOverlay({
|
|
18
|
+
className,
|
|
19
|
+
...props
|
|
20
|
+
}) {
|
|
21
|
+
return /* @__PURE__ */ jsx(
|
|
22
|
+
Drawer$1.Overlay,
|
|
23
|
+
{
|
|
24
|
+
"data-slot": "drawer-overlay",
|
|
25
|
+
className: cn(
|
|
26
|
+
"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50",
|
|
27
|
+
className
|
|
28
|
+
),
|
|
29
|
+
...props
|
|
30
|
+
}
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
function DrawerContent({
|
|
34
|
+
className,
|
|
35
|
+
children,
|
|
36
|
+
...props
|
|
37
|
+
}) {
|
|
38
|
+
return /* @__PURE__ */ jsxs(DrawerPortal, { "data-slot": "drawer-portal", children: [
|
|
39
|
+
/* @__PURE__ */ jsx(DrawerOverlay, {}),
|
|
40
|
+
/* @__PURE__ */ jsxs(
|
|
41
|
+
Drawer$1.Content,
|
|
42
|
+
{
|
|
43
|
+
"data-slot": "drawer-content",
|
|
44
|
+
className: cn(
|
|
45
|
+
"group/drawer-content bg-background fixed z-50 flex h-auto flex-col",
|
|
46
|
+
"data-[vaul-drawer-direction=top]:inset-x-0 data-[vaul-drawer-direction=top]:top-0 data-[vaul-drawer-direction=top]:mb-24 data-[vaul-drawer-direction=top]:max-h-[80vh] data-[vaul-drawer-direction=top]:rounded-b-lg data-[vaul-drawer-direction=top]:border-b",
|
|
47
|
+
"data-[vaul-drawer-direction=bottom]:inset-x-0 data-[vaul-drawer-direction=bottom]:bottom-0 data-[vaul-drawer-direction=bottom]:mt-24 data-[vaul-drawer-direction=bottom]:max-h-[80vh] data-[vaul-drawer-direction=bottom]:rounded-t-lg data-[vaul-drawer-direction=bottom]:border-t",
|
|
48
|
+
"data-[vaul-drawer-direction=right]:inset-y-0 data-[vaul-drawer-direction=right]:right-0 data-[vaul-drawer-direction=right]:w-3/4 data-[vaul-drawer-direction=right]:border-l data-[vaul-drawer-direction=right]:sm:max-w-sm",
|
|
49
|
+
"data-[vaul-drawer-direction=left]:inset-y-0 data-[vaul-drawer-direction=left]:left-0 data-[vaul-drawer-direction=left]:w-3/4 data-[vaul-drawer-direction=left]:border-r data-[vaul-drawer-direction=left]:sm:max-w-sm",
|
|
50
|
+
className
|
|
51
|
+
),
|
|
52
|
+
...props,
|
|
53
|
+
children: [
|
|
54
|
+
/* @__PURE__ */ jsx("div", { className: "bg-muted mx-auto mt-4 hidden h-2 w-[100px] shrink-0 rounded-full group-data-[vaul-drawer-direction=bottom]/drawer-content:block" }),
|
|
55
|
+
children
|
|
56
|
+
]
|
|
57
|
+
}
|
|
58
|
+
)
|
|
59
|
+
] });
|
|
60
|
+
}
|
|
61
|
+
function DrawerTitle({ className, ...props }) {
|
|
62
|
+
return /* @__PURE__ */ jsx(
|
|
63
|
+
Drawer$1.Title,
|
|
64
|
+
{
|
|
65
|
+
"data-slot": "drawer-title",
|
|
66
|
+
className: cn("text-foreground font-semibold", className),
|
|
67
|
+
...props
|
|
68
|
+
}
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
function useAppShellMobileNav(pathname) {
|
|
72
|
+
const [mobileNavOpen, setMobileNavOpen] = useState(false);
|
|
73
|
+
useEffect(() => {
|
|
74
|
+
setMobileNavOpen(false);
|
|
75
|
+
}, [pathname]);
|
|
76
|
+
useEffect(() => {
|
|
77
|
+
const mq = window.matchMedia("(min-width: 768px)");
|
|
78
|
+
const closeIfDesktop = () => {
|
|
79
|
+
if (mq.matches) setMobileNavOpen(false);
|
|
80
|
+
};
|
|
81
|
+
mq.addEventListener("change", closeIfDesktop);
|
|
82
|
+
closeIfDesktop();
|
|
83
|
+
return () => mq.removeEventListener("change", closeIfDesktop);
|
|
84
|
+
}, []);
|
|
85
|
+
return { mobileNavOpen, setMobileNavOpen };
|
|
86
|
+
}
|
|
87
|
+
function AppShellMobileNav({
|
|
88
|
+
open,
|
|
89
|
+
onOpenChange,
|
|
90
|
+
drawerHeader,
|
|
91
|
+
drawerNav,
|
|
92
|
+
drawerTitle = "Menu"
|
|
93
|
+
}) {
|
|
94
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
95
|
+
/* @__PURE__ */ jsx(Drawer, { open, onOpenChange, children: /* @__PURE__ */ jsxs(DrawerContent, { className: "gap-0 border-sidebar-border bg-sidebar px-0 pt-0 pb-[max(1rem,env(safe-area-inset-bottom))] text-sidebar-foreground", children: [
|
|
96
|
+
/* @__PURE__ */ jsx(DrawerTitle, { className: "sr-only", children: drawerTitle }),
|
|
97
|
+
/* @__PURE__ */ jsxs("div", { className: "flex max-h-[min(85vh,calc(100dvh-3rem))] min-h-0 flex-col", children: [
|
|
98
|
+
/* @__PURE__ */ jsx("div", { className: "shrink-0 space-y-3 border-b border-sidebar-border bg-sidebar px-4 pt-2 pb-4", children: drawerHeader }),
|
|
99
|
+
/* @__PURE__ */ jsx("div", { className: "min-h-0 flex-1 overflow-y-auto py-2", children: drawerNav })
|
|
100
|
+
] })
|
|
101
|
+
] }) }),
|
|
102
|
+
/* @__PURE__ */ jsx(
|
|
103
|
+
"button",
|
|
104
|
+
{
|
|
105
|
+
type: "button",
|
|
106
|
+
className: "fixed z-40 flex size-14 items-center justify-center rounded-full bg-blue-600 text-white shadow-lg ring-1 ring-black/5 transition-colors hover:bg-blue-700 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-600 md:hidden",
|
|
107
|
+
style: {
|
|
108
|
+
bottom: "max(1rem, env(safe-area-inset-bottom))",
|
|
109
|
+
right: "max(1rem, env(safe-area-inset-right))"
|
|
110
|
+
},
|
|
111
|
+
"aria-label": "Open navigation",
|
|
112
|
+
"aria-expanded": open,
|
|
113
|
+
onClick: () => onOpenChange(true),
|
|
114
|
+
children: /* @__PURE__ */ jsx(Menu, { size: 26, strokeWidth: 2.25, "aria-hidden": true })
|
|
115
|
+
}
|
|
116
|
+
)
|
|
117
|
+
] });
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export { AppShellMobileNav, useAppShellMobileNav };
|
|
121
|
+
//# sourceMappingURL=app-shell-mobile-nav.js.map
|
|
122
|
+
//# sourceMappingURL=app-shell-mobile-nav.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ui/utils.ts","../src/ui/drawer.tsx","../src/shell/app-shell-mobile-nav.tsx"],"names":["DrawerPrimitive","jsxs","jsx"],"mappings":"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","file":"app-shell-mobile-nav.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Drawer as DrawerPrimitive } from \"vaul\";\n\nimport { cn } from \"./utils\";\n\nfunction Drawer({ ...props }: React.ComponentProps<typeof DrawerPrimitive.Root>) {\n return <DrawerPrimitive.Root data-slot=\"drawer\" {...props} />;\n}\n\nfunction DrawerTrigger({ ...props }: React.ComponentProps<typeof DrawerPrimitive.Trigger>) {\n return <DrawerPrimitive.Trigger data-slot=\"drawer-trigger\" {...props} />;\n}\n\nfunction DrawerPortal({ ...props }: React.ComponentProps<typeof DrawerPrimitive.Portal>) {\n return <DrawerPrimitive.Portal data-slot=\"drawer-portal\" {...props} />;\n}\n\nfunction DrawerClose({ ...props }: React.ComponentProps<typeof DrawerPrimitive.Close>) {\n return <DrawerPrimitive.Close data-slot=\"drawer-close\" {...props} />;\n}\n\nfunction DrawerOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Overlay>) {\n return (\n <DrawerPrimitive.Overlay\n data-slot=\"drawer-overlay\"\n className={cn(\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction DrawerContent({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Content>) {\n return (\n <DrawerPortal data-slot=\"drawer-portal\">\n <DrawerOverlay />\n <DrawerPrimitive.Content\n data-slot=\"drawer-content\"\n className={cn(\n \"group/drawer-content bg-background fixed z-50 flex h-auto flex-col\",\n \"data-[vaul-drawer-direction=top]:inset-x-0 data-[vaul-drawer-direction=top]:top-0 data-[vaul-drawer-direction=top]:mb-24 data-[vaul-drawer-direction=top]:max-h-[80vh] data-[vaul-drawer-direction=top]:rounded-b-lg data-[vaul-drawer-direction=top]:border-b\",\n \"data-[vaul-drawer-direction=bottom]:inset-x-0 data-[vaul-drawer-direction=bottom]:bottom-0 data-[vaul-drawer-direction=bottom]:mt-24 data-[vaul-drawer-direction=bottom]:max-h-[80vh] data-[vaul-drawer-direction=bottom]:rounded-t-lg data-[vaul-drawer-direction=bottom]:border-t\",\n \"data-[vaul-drawer-direction=right]:inset-y-0 data-[vaul-drawer-direction=right]:right-0 data-[vaul-drawer-direction=right]:w-3/4 data-[vaul-drawer-direction=right]:border-l data-[vaul-drawer-direction=right]:sm:max-w-sm\",\n \"data-[vaul-drawer-direction=left]:inset-y-0 data-[vaul-drawer-direction=left]:left-0 data-[vaul-drawer-direction=left]:w-3/4 data-[vaul-drawer-direction=left]:border-r data-[vaul-drawer-direction=left]:sm:max-w-sm\",\n className,\n )}\n {...props}\n >\n <div className=\"bg-muted mx-auto mt-4 hidden h-2 w-[100px] shrink-0 rounded-full group-data-[vaul-drawer-direction=bottom]/drawer-content:block\" />\n {children}\n </DrawerPrimitive.Content>\n </DrawerPortal>\n );\n}\n\nfunction DrawerHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"drawer-header\"\n className={cn(\"flex flex-col gap-1.5 p-4\", className)}\n {...props}\n />\n );\n}\n\nfunction DrawerFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"drawer-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n );\n}\n\nfunction DrawerTitle({ className, ...props }: React.ComponentProps<typeof DrawerPrimitive.Title>) {\n return (\n <DrawerPrimitive.Title\n data-slot=\"drawer-title\"\n className={cn(\"text-foreground font-semibold\", className)}\n {...props}\n />\n );\n}\n\nfunction DrawerDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Description>) {\n return (\n <DrawerPrimitive.Description\n data-slot=\"drawer-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n );\n}\n\nexport {\n Drawer,\n DrawerPortal,\n DrawerOverlay,\n DrawerTrigger,\n DrawerClose,\n DrawerContent,\n DrawerHeader,\n DrawerFooter,\n DrawerTitle,\n DrawerDescription,\n};\n","\"use client\";\n\nimport { Menu } from \"lucide-react\";\nimport { useEffect, useState, type ReactNode } from \"react\";\nimport { Drawer, DrawerContent, DrawerTitle } from \"../ui/drawer\";\n\n/**\n * Closes the mobile nav drawer on route change and when crossing the `md` breakpoint upward.\n * Pass `location.pathname` from React Router (or any stable route key).\n */\nexport function useAppShellMobileNav(pathname: string) {\n const [mobileNavOpen, setMobileNavOpen] = useState(false);\n\n useEffect(() => {\n setMobileNavOpen(false);\n }, [pathname]);\n\n useEffect(() => {\n const mq = window.matchMedia(\"(min-width: 768px)\");\n const closeIfDesktop = () => {\n if (mq.matches) setMobileNavOpen(false);\n };\n mq.addEventListener(\"change\", closeIfDesktop);\n closeIfDesktop();\n return () => mq.removeEventListener(\"change\", closeIfDesktop);\n }, []);\n\n return { mobileNavOpen, setMobileNavOpen };\n}\n\nexport type AppShellMobileNavProps = {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** Top block inside the drawer (brand, workspace controls, sign out, etc.). */\n drawerHeader: ReactNode;\n /** Scrollable navigation — usually the same content as `AppWebShell`’s `sidebar`. */\n drawerNav: ReactNode;\n /** Accessible name for the drawer (visually hidden). */\n drawerTitle?: string;\n};\n\n/**\n * Bottom drawer + FAB used with {@link AppWebShell} on viewports below `md`\n * (sidebar and top bar hidden; main is full-bleed white).\n */\nexport function AppShellMobileNav({\n open,\n onOpenChange,\n drawerHeader,\n drawerNav,\n drawerTitle = \"Menu\",\n}: AppShellMobileNavProps) {\n return (\n <>\n <Drawer open={open} onOpenChange={onOpenChange}>\n <DrawerContent className=\"gap-0 border-sidebar-border bg-sidebar px-0 pt-0 pb-[max(1rem,env(safe-area-inset-bottom))] text-sidebar-foreground\">\n <DrawerTitle className=\"sr-only\">{drawerTitle}</DrawerTitle>\n <div className=\"flex max-h-[min(85vh,calc(100dvh-3rem))] min-h-0 flex-col\">\n <div className=\"shrink-0 space-y-3 border-b border-sidebar-border bg-sidebar px-4 pt-2 pb-4\">\n {drawerHeader}\n </div>\n <div className=\"min-h-0 flex-1 overflow-y-auto py-2\">{drawerNav}</div>\n </div>\n </DrawerContent>\n </Drawer>\n\n <button\n type=\"button\"\n className=\"fixed z-40 flex size-14 items-center justify-center rounded-full bg-blue-600 text-white shadow-lg ring-1 ring-black/5 transition-colors hover:bg-blue-700 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-600 md:hidden\"\n style={{\n bottom: \"max(1rem, env(safe-area-inset-bottom))\",\n right: \"max(1rem, env(safe-area-inset-right))\",\n }}\n aria-label=\"Open navigation\"\n aria-expanded={open}\n onClick={() => onOpenChange(true)}\n >\n <Menu size={26} strokeWidth={2.25} aria-hidden />\n </button>\n </>\n );\n}\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
|
|
4
|
+
type AppWebShellProps = {
|
|
5
|
+
/** Full-width bar above the sidebar + main row (e.g. brand, account actions). */
|
|
6
|
+
topBar?: ReactNode;
|
|
7
|
+
/** Left navigation column. */
|
|
8
|
+
sidebar: ReactNode;
|
|
9
|
+
/** Collapses the desktop sidebar to an icon rail. */
|
|
10
|
+
sidebarCollapsed?: boolean;
|
|
11
|
+
/** Routed page content — typically a card area on desktop. */
|
|
12
|
+
children: ReactNode;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Shared app chrome: outer shell + sidebar, optional top bar, and inset main on desktop.
|
|
16
|
+
* Keeps operator / member (and future web apps) visually aligned.
|
|
17
|
+
*/
|
|
18
|
+
declare function AppWebShell({ topBar, sidebar, sidebarCollapsed, children, }: AppWebShellProps): react_jsx_runtime.JSX.Element;
|
|
19
|
+
|
|
20
|
+
export { AppWebShell, type AppWebShellProps };
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { useEffect } from 'react';
|
|
2
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
3
|
+
|
|
4
|
+
// src/shell/app-web-shell.tsx
|
|
5
|
+
function getShellTheme() {
|
|
6
|
+
return "light";
|
|
7
|
+
}
|
|
8
|
+
function AppWebShell({
|
|
9
|
+
topBar,
|
|
10
|
+
sidebar,
|
|
11
|
+
sidebarCollapsed = true,
|
|
12
|
+
children
|
|
13
|
+
}) {
|
|
14
|
+
const shellTheme = getShellTheme();
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
document.documentElement.dataset.shellTheme = shellTheme;
|
|
17
|
+
return () => {
|
|
18
|
+
delete document.documentElement.dataset.shellTheme;
|
|
19
|
+
};
|
|
20
|
+
}, [shellTheme]);
|
|
21
|
+
return /* @__PURE__ */ jsxs(
|
|
22
|
+
"div",
|
|
23
|
+
{
|
|
24
|
+
"data-shell-theme": shellTheme,
|
|
25
|
+
className: "flex h-screen w-screen flex-col overflow-hidden bg-background md:bg-sidebar",
|
|
26
|
+
children: [
|
|
27
|
+
topBar != null ? /* @__PURE__ */ jsx("header", { className: "z-10 hidden h-11 shrink-0 items-center justify-between bg-sidebar px-4 text-sidebar-foreground md:flex", children: topBar }) : null,
|
|
28
|
+
/* @__PURE__ */ jsxs("div", { className: "flex min-h-0 min-w-0 flex-1", children: [
|
|
29
|
+
/* @__PURE__ */ jsx(
|
|
30
|
+
"aside",
|
|
31
|
+
{
|
|
32
|
+
className: `hidden h-full min-h-0 shrink-0 flex-col bg-sidebar py-2.5 text-sidebar-foreground transition-[width] duration-200 md:flex ${sidebarCollapsed ? "w-16" : "w-[14.4rem]"}`,
|
|
33
|
+
children: /* @__PURE__ */ jsx("div", { className: "flex min-h-0 w-full flex-1 flex-col", children: sidebar })
|
|
34
|
+
}
|
|
35
|
+
),
|
|
36
|
+
/* @__PURE__ */ jsx("div", { className: "flex min-h-0 min-w-0 flex-1 p-0 md:pr-2.5 md:pb-2.5", children: /* @__PURE__ */ jsx("main", { className: "flex min-h-0 w-full min-w-0 flex-1 flex-col overflow-hidden rounded-none border-0 bg-card md:rounded-2xl md:border md:border-border", children }) })
|
|
37
|
+
] })
|
|
38
|
+
]
|
|
39
|
+
}
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export { AppWebShell };
|
|
44
|
+
//# sourceMappingURL=app-web-shell.js.map
|
|
45
|
+
//# sourceMappingURL=app-web-shell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/theme/shell-theme.ts","../src/shell/app-web-shell.tsx"],"names":[],"mappings":";;;;AAKO,SAAS,aAAA,GAA4B;AAC1C,EAAA,OAAuC,OAAA;AACzC;ACWO,SAAS,WAAA,CAAY;AAAA,EAC1B,MAAA;AAAA,EACA,OAAA;AAAA,EACA,gBAAA,GAAmB,IAAA;AAAA,EACnB;AACF,CAAA,EAAqB;AACnB,EAAA,MAAM,aAAa,aAAA,EAAc;AAEjC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,QAAA,CAAS,eAAA,CAAgB,QAAQ,UAAA,GAAa,UAAA;AAC9C,IAAA,OAAO,MAAM;AACX,MAAA,OAAO,QAAA,CAAS,gBAAgB,OAAA,CAAQ,UAAA;AAAA,IAC1C,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,kBAAA,EAAkB,UAAA;AAAA,MAClB,SAAA,EAAU,6EAAA;AAAA,MAET,QAAA,EAAA;AAAA,QAAA,MAAA,IAAU,uBACT,GAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,wGAAA,EACf,kBACH,CAAA,GACE,IAAA;AAAA,wBAEJ,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,CAAA,0HAAA,EACT,gBAAA,GAAmB,MAAA,GAAS,aAC9B,CAAA,CAAA;AAAA,cAEA,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCAAA,EAAuC,QAAA,EAAA,OAAA,EAAQ;AAAA;AAAA,WAChE;AAAA,0BAEA,GAAA,CAAC,SAAI,SAAA,EAAU,qDAAA,EACb,8BAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qIAAA,EACb,QAAA,EACH,CAAA,EACF;AAAA,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ","file":"app-web-shell.js","sourcesContent":["/** Flip to compare light vs dark outer shell with the team. */\nexport const SHELL_USE_DARK_THEME = false;\n\nexport type ShellTheme = \"light\" | \"dark\";\n\nexport function getShellTheme(): ShellTheme {\n return SHELL_USE_DARK_THEME ? \"dark\" : \"light\";\n}\n","import { useEffect, type ReactNode } from \"react\";\nimport { getShellTheme } from \"../theme/shell-theme\";\n\nexport type AppWebShellProps = {\n /** Full-width bar above the sidebar + main row (e.g. brand, account actions). */\n topBar?: ReactNode;\n /** Left navigation column. */\n sidebar: ReactNode;\n /** Collapses the desktop sidebar to an icon rail. */\n sidebarCollapsed?: boolean;\n /** Routed page content — typically a card area on desktop. */\n children: ReactNode;\n};\n\n/**\n * Shared app chrome: outer shell + sidebar, optional top bar, and inset main on desktop.\n * Keeps operator / member (and future web apps) visually aligned.\n */\nexport function AppWebShell({\n topBar,\n sidebar,\n sidebarCollapsed = true,\n children,\n}: AppWebShellProps) {\n const shellTheme = getShellTheme();\n\n useEffect(() => {\n document.documentElement.dataset.shellTheme = shellTheme;\n return () => {\n delete document.documentElement.dataset.shellTheme;\n };\n }, [shellTheme]);\n\n return (\n <div\n data-shell-theme={shellTheme}\n className=\"flex h-screen w-screen flex-col overflow-hidden bg-background md:bg-sidebar\"\n >\n {topBar != null ? (\n <header className=\"z-10 hidden h-11 shrink-0 items-center justify-between bg-sidebar px-4 text-sidebar-foreground md:flex\">\n {topBar}\n </header>\n ) : null}\n\n <div className=\"flex min-h-0 min-w-0 flex-1\">\n <aside\n className={`hidden h-full min-h-0 shrink-0 flex-col bg-sidebar py-2.5 text-sidebar-foreground transition-[width] duration-200 md:flex ${\n sidebarCollapsed ? \"w-16\" : \"w-[14.4rem]\"\n }`}\n >\n <div className=\"flex min-h-0 w-full flex-1 flex-col\">{sidebar}</div>\n </aside>\n\n <div className=\"flex min-h-0 min-w-0 flex-1 p-0 md:pr-2.5 md:pb-2.5\">\n <main className=\"flex min-h-0 w-full min-w-0 flex-1 flex-col overflow-hidden rounded-none border-0 bg-card md:rounded-2xl md:border md:border-border\">\n {children}\n </main>\n </div>\n </div>\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Date / schedule helpers used by booking-schedule calendars.
|
|
5
|
+
* Copied from `@spacesync/client/domain/lib/pricing` so the client has no package dependency.
|
|
6
|
+
*/
|
|
7
|
+
type RepeatType = "none" | "daily" | "weekly" | "monthly";
|
|
8
|
+
type BookingMode = "slots" | "schedule";
|
|
9
|
+
/** Editor state for slot / schedule / daily / item shaped tiers */
|
|
10
|
+
interface BookingState {
|
|
11
|
+
slotCount: number;
|
|
12
|
+
bookingDate: string;
|
|
13
|
+
bookingMode: BookingMode;
|
|
14
|
+
scheduleDate: string;
|
|
15
|
+
scheduleTime: string;
|
|
16
|
+
repeatType: RepeatType;
|
|
17
|
+
repeatEveryDays: number;
|
|
18
|
+
repeatEveryWeeks: number;
|
|
19
|
+
repeatOnDays: string[];
|
|
20
|
+
repeatEveryMonths: number;
|
|
21
|
+
repeatUntilDate: string;
|
|
22
|
+
startDate: string;
|
|
23
|
+
endDate: string;
|
|
24
|
+
monthFrom: string;
|
|
25
|
+
monthTo: string;
|
|
26
|
+
weekFrom: string;
|
|
27
|
+
weekCount: number;
|
|
28
|
+
itemQuantity: number;
|
|
29
|
+
/** Daily per-day tiers: single-day booking when true (endDate = startDate + 1 day). */
|
|
30
|
+
oneDayBooking?: boolean;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
declare function ScheduleFieldLabel({ children }: {
|
|
34
|
+
children: React.ReactNode;
|
|
35
|
+
}): react_jsx_runtime.JSX.Element;
|
|
36
|
+
declare function ScheduleInfoBanner({ children }: {
|
|
37
|
+
children: React.ReactNode;
|
|
38
|
+
}): react_jsx_runtime.JSX.Element;
|
|
39
|
+
declare function ScheduleStepper({ value, min, max, onChange, }: {
|
|
40
|
+
value: number;
|
|
41
|
+
min?: number;
|
|
42
|
+
max?: number;
|
|
43
|
+
onChange: (v: number) => void;
|
|
44
|
+
}): react_jsx_runtime.JSX.Element;
|
|
45
|
+
declare function WeekCalendarPicker({ weekFrom, onChange, flat, }: {
|
|
46
|
+
weekFrom: string;
|
|
47
|
+
onChange: (v: string) => void;
|
|
48
|
+
flat?: boolean;
|
|
49
|
+
}): react_jsx_runtime.JSX.Element;
|
|
50
|
+
declare function MonthRangeCalendar({ monthFrom, monthTo, onChange, flat, }: {
|
|
51
|
+
monthFrom: string;
|
|
52
|
+
monthTo: string;
|
|
53
|
+
onChange: (from: string, to: string) => void;
|
|
54
|
+
flat?: boolean;
|
|
55
|
+
}): react_jsx_runtime.JSX.Element;
|
|
56
|
+
declare function MonthPeriodPicker({ booking, onChange, flat, }: {
|
|
57
|
+
booking: BookingState;
|
|
58
|
+
onChange: (patch: Partial<BookingState>) => void;
|
|
59
|
+
flat?: boolean;
|
|
60
|
+
}): react_jsx_runtime.JSX.Element;
|
|
61
|
+
declare function WeekPeriodPicker({ booking, onChange, flat, }: {
|
|
62
|
+
booking: BookingState;
|
|
63
|
+
onChange: (patch: Partial<BookingState>) => void;
|
|
64
|
+
flat?: boolean;
|
|
65
|
+
}): react_jsx_runtime.JSX.Element;
|
|
66
|
+
declare function DayCalendarPicker({ selectedDate, onChange, minDate, flat, }: {
|
|
67
|
+
selectedDate: string;
|
|
68
|
+
onChange: (date: string) => void;
|
|
69
|
+
minDate?: string;
|
|
70
|
+
flat?: boolean;
|
|
71
|
+
}): react_jsx_runtime.JSX.Element;
|
|
72
|
+
declare function DayRangeCalendar({ startDate, endDate, onChange, minDate, flat, }: {
|
|
73
|
+
startDate: string;
|
|
74
|
+
endDate: string;
|
|
75
|
+
onChange: (start: string, end: string) => void;
|
|
76
|
+
minDate?: string;
|
|
77
|
+
flat?: boolean;
|
|
78
|
+
}): react_jsx_runtime.JSX.Element;
|
|
79
|
+
declare function DayPeriodPicker({ booking, onChange, flat, }: {
|
|
80
|
+
booking: BookingState;
|
|
81
|
+
onChange: (patch: Partial<BookingState>) => void;
|
|
82
|
+
flat?: boolean;
|
|
83
|
+
}): react_jsx_runtime.JSX.Element;
|
|
84
|
+
declare function HourlySchedulePicker({ scheduleDate, scheduleTime, onChange, timeFormat, flat, }: {
|
|
85
|
+
scheduleDate: string;
|
|
86
|
+
scheduleTime: string;
|
|
87
|
+
onChange: (patch: {
|
|
88
|
+
scheduleDate?: string;
|
|
89
|
+
scheduleTime?: string;
|
|
90
|
+
}) => void;
|
|
91
|
+
timeFormat?: "12h" | "24h";
|
|
92
|
+
flat?: boolean;
|
|
93
|
+
}): react_jsx_runtime.JSX.Element;
|
|
94
|
+
|
|
95
|
+
export { DayCalendarPicker, DayPeriodPicker, DayRangeCalendar, HourlySchedulePicker, MonthPeriodPicker, MonthRangeCalendar, ScheduleFieldLabel, ScheduleInfoBanner, ScheduleStepper, WeekCalendarPicker, WeekPeriodPicker };
|