@omnifyjp/shell 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +476 -0
- package/dist/chunk-6JYWZJEY.js +123 -0
- package/dist/chunk-6JYWZJEY.js.map +1 -0
- package/dist/chunk-ACCHC3AM.js +57 -0
- package/dist/chunk-ACCHC3AM.js.map +1 -0
- package/dist/chunk-EJEVW4RO.js +49 -0
- package/dist/chunk-EJEVW4RO.js.map +1 -0
- package/dist/chunk-OHORC3F5.js +72 -0
- package/dist/chunk-OHORC3F5.js.map +1 -0
- package/dist/chunk-OMIE3Z5N.js +661 -0
- package/dist/chunk-OMIE3Z5N.js.map +1 -0
- package/dist/chunk-OYE3TXTK.js +37 -0
- package/dist/chunk-OYE3TXTK.js.map +1 -0
- package/dist/chunk-Q3QWQG6P.js +91 -0
- package/dist/chunk-Q3QWQG6P.js.map +1 -0
- package/dist/chunk-QNCYBLHC.js +189 -0
- package/dist/chunk-QNCYBLHC.js.map +1 -0
- package/dist/chunk-SHHZRZMM.js +83 -0
- package/dist/chunk-SHHZRZMM.js.map +1 -0
- package/dist/chunk-WCRLQ5M5.js +235 -0
- package/dist/chunk-WCRLQ5M5.js.map +1 -0
- package/dist/chunk-YVUVYTVZ.js +224 -0
- package/dist/chunk-YVUVYTVZ.js.map +1 -0
- package/dist/components/AppShell.d.ts +27 -0
- package/dist/components/AppShell.js +11 -0
- package/dist/components/AppShell.js.map +1 -0
- package/dist/components/Header.d.ts +11 -0
- package/dist/components/Header.js +6 -0
- package/dist/components/Header.js.map +1 -0
- package/dist/components/OrganizationSelector.d.ts +8 -0
- package/dist/components/OrganizationSelector.js +4 -0
- package/dist/components/OrganizationSelector.js.map +1 -0
- package/dist/components/OrganizationSetupModal.d.ts +5 -0
- package/dist/components/OrganizationSetupModal.js +4 -0
- package/dist/components/OrganizationSetupModal.js.map +1 -0
- package/dist/components/PageContainer.d.ts +105 -0
- package/dist/components/PageContainer.js +3 -0
- package/dist/components/PageContainer.js.map +1 -0
- package/dist/components/ServiceMenu.d.ts +11 -0
- package/dist/components/ServiceMenu.js +3 -0
- package/dist/components/ServiceMenu.js.map +1 -0
- package/dist/components/Sidebar.d.ts +11 -0
- package/dist/components/Sidebar.js +5 -0
- package/dist/components/Sidebar.js.map +1 -0
- package/dist/contexts/OrganizationContext.d.ts +26 -0
- package/dist/contexts/OrganizationContext.js +3 -0
- package/dist/contexts/OrganizationContext.js.map +1 -0
- package/dist/contexts/ThemeContext.d.ts +14 -0
- package/dist/contexts/ThemeContext.js +3 -0
- package/dist/contexts/ThemeContext.js.map +1 -0
- package/dist/hooks/useDateFormat.d.ts +28 -0
- package/dist/hooks/useDateFormat.js +4 -0
- package/dist/hooks/useDateFormat.js.map +1 -0
- package/dist/i18n.d.ts +38 -0
- package/dist/i18n.js +3 -0
- package/dist/i18n.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +89 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { createContext, useState, useCallback, useEffect, useContext } from 'react';
|
|
2
|
+
import { jsx } from 'react/jsx-runtime';
|
|
3
|
+
|
|
4
|
+
// src/contexts/ThemeContext.tsx
|
|
5
|
+
var ThemeContext = createContext(void 0);
|
|
6
|
+
function loadSavedTheme() {
|
|
7
|
+
if (typeof window === "undefined") return "light";
|
|
8
|
+
const saved = localStorage.getItem("omnify_theme");
|
|
9
|
+
if (saved === "light" || saved === "dark" || saved === "system") return saved;
|
|
10
|
+
return "light";
|
|
11
|
+
}
|
|
12
|
+
function applyTheme(theme) {
|
|
13
|
+
const root = document.documentElement;
|
|
14
|
+
if (theme === "system") {
|
|
15
|
+
const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
|
|
16
|
+
root.classList.toggle("dark", prefersDark);
|
|
17
|
+
} else {
|
|
18
|
+
root.classList.toggle("dark", theme === "dark");
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function ThemeProvider({ children }) {
|
|
22
|
+
const [theme, setThemeState] = useState(loadSavedTheme);
|
|
23
|
+
const setTheme = useCallback((t) => {
|
|
24
|
+
setThemeState(t);
|
|
25
|
+
}, []);
|
|
26
|
+
useEffect(() => {
|
|
27
|
+
localStorage.setItem("omnify_theme", theme);
|
|
28
|
+
applyTheme(theme);
|
|
29
|
+
}, [theme]);
|
|
30
|
+
useEffect(() => {
|
|
31
|
+
if (theme !== "system") return;
|
|
32
|
+
const mq = window.matchMedia("(prefers-color-scheme: dark)");
|
|
33
|
+
const handler = () => applyTheme("system");
|
|
34
|
+
mq.addEventListener("change", handler);
|
|
35
|
+
return () => mq.removeEventListener("change", handler);
|
|
36
|
+
}, [theme]);
|
|
37
|
+
return /* @__PURE__ */ jsx(ThemeContext.Provider, { value: { theme, setTheme }, children });
|
|
38
|
+
}
|
|
39
|
+
function useTheme() {
|
|
40
|
+
const context = useContext(ThemeContext);
|
|
41
|
+
if (context === void 0) {
|
|
42
|
+
throw new Error("useTheme must be used within a ThemeProvider");
|
|
43
|
+
}
|
|
44
|
+
return context;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export { ThemeProvider, useTheme };
|
|
48
|
+
//# sourceMappingURL=chunk-EJEVW4RO.js.map
|
|
49
|
+
//# sourceMappingURL=chunk-EJEVW4RO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/contexts/ThemeContext.tsx"],"names":[],"mappings":";;;;AASA,IAAM,YAAA,GAAe,cAA4C,MAAS,CAAA;AAE1E,SAAS,cAAA,GAAwB;AAC/B,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,OAAA;AAC1C,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,OAAA,CAAQ,cAAc,CAAA;AACjD,EAAA,IAAI,UAAU,OAAA,IAAW,KAAA,KAAU,MAAA,IAAU,KAAA,KAAU,UAAU,OAAO,KAAA;AACxE,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,WAAW,KAAA,EAAc;AAChC,EAAA,MAAM,OAAO,QAAA,CAAS,eAAA;AACtB,EAAA,IAAI,UAAU,QAAA,EAAU;AACtB,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,UAAA,CAAW,8BAA8B,CAAA,CAAE,OAAA;AACtE,IAAA,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,MAAA,EAAQ,WAAW,CAAA;AAAA,EAC3C,CAAA,MAAO;AACL,IAAA,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,MAAA,EAAQ,KAAA,KAAU,MAAM,CAAA;AAAA,EAChD;AACF;AAEO,SAAS,aAAA,CAAc,EAAE,QAAA,EAAS,EAA4B;AACnE,EAAA,MAAM,CAAC,KAAA,EAAO,aAAa,CAAA,GAAI,SAAgB,cAAc,CAAA;AAE7D,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,CAAC,CAAA,KAAa;AACzC,IAAA,aAAA,CAAc,CAAC,CAAA;AAAA,EACjB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,YAAA,CAAa,OAAA,CAAQ,gBAAgB,KAAK,CAAA;AAC1C,IAAA,UAAA,CAAW,KAAK,CAAA;AAAA,EAClB,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,UAAU,QAAA,EAAU;AACxB,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,UAAA,CAAW,8BAA8B,CAAA;AAC3D,IAAA,MAAM,OAAA,GAAU,MAAM,UAAA,CAAW,QAAQ,CAAA;AACzC,IAAA,EAAA,CAAG,gBAAA,CAAiB,UAAU,OAAO,CAAA;AACrC,IAAA,OAAO,MAAM,EAAA,CAAG,mBAAA,CAAoB,QAAA,EAAU,OAAO,CAAA;AAAA,EACvD,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,uBACE,GAAA,CAAC,aAAa,QAAA,EAAb,EAAsB,OAAO,EAAE,KAAA,EAAO,QAAA,EAAS,EAC7C,QAAA,EACH,CAAA;AAEJ;AAEO,SAAS,QAAA,GAAW;AACzB,EAAA,MAAM,OAAA,GAAU,WAAW,YAAY,CAAA;AACvC,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,EAChE;AACA,EAAA,OAAO,OAAA;AACT","file":"chunk-EJEVW4RO.js","sourcesContent":["import { createContext, useContext, useState, useEffect, useCallback, ReactNode } from 'react';\n\nexport type Theme = 'light' | 'dark' | 'system';\n\ninterface ThemeContextType {\n theme: Theme;\n setTheme: (theme: Theme) => void;\n}\n\nconst ThemeContext = createContext<ThemeContextType | undefined>(undefined);\n\nfunction loadSavedTheme(): Theme {\n if (typeof window === 'undefined') return 'light';\n const saved = localStorage.getItem('omnify_theme');\n if (saved === 'light' || saved === 'dark' || saved === 'system') return saved;\n return 'light';\n}\n\nfunction applyTheme(theme: Theme) {\n const root = document.documentElement;\n if (theme === 'system') {\n const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;\n root.classList.toggle('dark', prefersDark);\n } else {\n root.classList.toggle('dark', theme === 'dark');\n }\n}\n\nexport function ThemeProvider({ children }: { children: ReactNode }) {\n const [theme, setThemeState] = useState<Theme>(loadSavedTheme);\n\n const setTheme = useCallback((t: Theme) => {\n setThemeState(t);\n }, []);\n\n useEffect(() => {\n localStorage.setItem('omnify_theme', theme);\n applyTheme(theme);\n }, [theme]);\n\n useEffect(() => {\n if (theme !== 'system') return;\n const mq = window.matchMedia('(prefers-color-scheme: dark)');\n const handler = () => applyTheme('system');\n mq.addEventListener('change', handler);\n return () => mq.removeEventListener('change', handler);\n }, [theme]);\n\n return (\n <ThemeContext.Provider value={{ theme, setTheme }}>\n {children}\n </ThemeContext.Provider>\n );\n}\n\nexport function useTheme() {\n const context = useContext(ThemeContext);\n if (context === undefined) {\n throw new Error('useTheme must be used within a ThemeProvider');\n }\n return context;\n}\n"]}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { Separator } from '@omnifyjp/ui/components/separator';
|
|
2
|
+
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
3
|
+
|
|
4
|
+
// src/components/PageContainer.tsx
|
|
5
|
+
function PageContainer({
|
|
6
|
+
title,
|
|
7
|
+
subtitle,
|
|
8
|
+
extra,
|
|
9
|
+
children,
|
|
10
|
+
footer,
|
|
11
|
+
sidebar,
|
|
12
|
+
sidebarPosition = "right",
|
|
13
|
+
sidebarWidth = "w-80",
|
|
14
|
+
variant = "standard",
|
|
15
|
+
className = "",
|
|
16
|
+
contentClassName = "",
|
|
17
|
+
showHeaderSeparator = true
|
|
18
|
+
}) {
|
|
19
|
+
if (variant === "full") {
|
|
20
|
+
return /* @__PURE__ */ jsxs("div", { className: `h-full flex flex-col ${className}`, children: [
|
|
21
|
+
children,
|
|
22
|
+
footer && /* @__PURE__ */ jsx("div", { className: "border-t border-border", children: footer })
|
|
23
|
+
] });
|
|
24
|
+
}
|
|
25
|
+
if (variant === "split") {
|
|
26
|
+
return /* @__PURE__ */ jsxs("div", { className: `h-full flex flex-col ${className}`, children: [
|
|
27
|
+
(title || extra) && /* @__PURE__ */ jsx("div", { className: "px-page py-4 border-b border-border", children: /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-4", children: [
|
|
28
|
+
/* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0", children: [
|
|
29
|
+
title && /* @__PURE__ */ jsx("h1", { className: "text-page-title font-semibold mb-2", children: title }),
|
|
30
|
+
subtitle && /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: subtitle })
|
|
31
|
+
] }),
|
|
32
|
+
extra && /* @__PURE__ */ jsx("div", { className: "flex-shrink-0", children: extra })
|
|
33
|
+
] }) }),
|
|
34
|
+
/* @__PURE__ */ jsxs("div", { className: "flex-1 flex overflow-hidden", children: [
|
|
35
|
+
sidebar && sidebarPosition === "left" && /* @__PURE__ */ jsx("aside", { className: `${sidebarWidth} border-r border-border overflow-y-auto flex-shrink-0`, children: sidebar }),
|
|
36
|
+
/* @__PURE__ */ jsx("main", { className: `flex-1 overflow-y-auto ${contentClassName}`, children }),
|
|
37
|
+
sidebar && sidebarPosition === "right" && /* @__PURE__ */ jsx("aside", { className: `${sidebarWidth} border-l border-border overflow-y-auto flex-shrink-0`, children: sidebar })
|
|
38
|
+
] }),
|
|
39
|
+
footer && /* @__PURE__ */ jsx("div", { className: "border-t border-border", children: footer })
|
|
40
|
+
] });
|
|
41
|
+
}
|
|
42
|
+
return /* @__PURE__ */ jsxs("div", { className: `h-full flex flex-col ${className}`, children: [
|
|
43
|
+
(title || extra) && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
44
|
+
/* @__PURE__ */ jsx("div", { className: "px-page py-4", children: /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-4", children: [
|
|
45
|
+
/* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0", children: [
|
|
46
|
+
title && /* @__PURE__ */ jsx("h1", { className: "text-page-title font-semibold mb-2", children: title }),
|
|
47
|
+
subtitle && /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: subtitle })
|
|
48
|
+
] }),
|
|
49
|
+
extra && /* @__PURE__ */ jsx("div", { className: "flex-shrink-0", children: extra })
|
|
50
|
+
] }) }),
|
|
51
|
+
showHeaderSeparator && /* @__PURE__ */ jsx(Separator, {})
|
|
52
|
+
] }),
|
|
53
|
+
/* @__PURE__ */ jsx("main", { className: `flex-1 overflow-y-auto p-page ${contentClassName}`, children }),
|
|
54
|
+
footer && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
55
|
+
/* @__PURE__ */ jsx(Separator, {}),
|
|
56
|
+
/* @__PURE__ */ jsx("div", { className: "px-page py-4", children: footer })
|
|
57
|
+
] })
|
|
58
|
+
] });
|
|
59
|
+
}
|
|
60
|
+
function StandardPageContainer(props) {
|
|
61
|
+
return /* @__PURE__ */ jsx(PageContainer, { ...props, variant: "standard" });
|
|
62
|
+
}
|
|
63
|
+
function SplitPageContainer(props) {
|
|
64
|
+
return /* @__PURE__ */ jsx(PageContainer, { ...props, variant: "split" });
|
|
65
|
+
}
|
|
66
|
+
function FullWidthPageContainer(props) {
|
|
67
|
+
return /* @__PURE__ */ jsx(PageContainer, { ...props, variant: "full" });
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export { FullWidthPageContainer, PageContainer, SplitPageContainer, StandardPageContainer };
|
|
71
|
+
//# sourceMappingURL=chunk-OHORC3F5.js.map
|
|
72
|
+
//# sourceMappingURL=chunk-OHORC3F5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/PageContainer.tsx"],"names":[],"mappings":"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","file":"chunk-OHORC3F5.js","sourcesContent":["import { ReactNode } from 'react';\nimport { Separator } from '@omnifyjp/ui/components/separator';\n\nexport interface PageContainerProps {\n /**\n * Page title\n */\n title?: string;\n\n /**\n * Subtitle or description below title\n */\n subtitle?: string;\n\n /**\n * Extra content (buttons, actions) displayed on the right side of header\n */\n extra?: ReactNode;\n\n /**\n * Main page content\n */\n children: ReactNode;\n\n /**\n * Footer content displayed at the bottom\n */\n footer?: ReactNode;\n\n /**\n * Sidebar content displayed on left or right\n */\n sidebar?: ReactNode;\n\n /**\n * Sidebar position\n * @default 'right'\n */\n sidebarPosition?: 'left' | 'right';\n\n /**\n * Sidebar width\n * @default 'w-80'\n */\n sidebarWidth?: string;\n\n /**\n * Layout variant\n * - 'standard': Default padded layout with header\n * - 'full': Full width, no padding (for boards, gantt)\n * - 'split': Layout with sidebar inside page\n * @default 'standard'\n */\n variant?: 'standard' | 'full' | 'split';\n\n /**\n * Custom container className\n */\n className?: string;\n\n /**\n * Custom content className\n */\n contentClassName?: string;\n\n /**\n * Show separator below header\n * @default true for standard variant\n */\n showHeaderSeparator?: boolean;\n}\n\n/**\n * PageContainer - Flexible page layout component\n *\n * @example\n * // Standard layout with title and actions\n * <PageContainer\n * title=\"Dashboard\"\n * subtitle=\"Overview of all projects\"\n * extra={<Button>Create</Button>}\n * >\n * <div>Content here</div>\n * </PageContainer>\n *\n * @example\n * // Split layout with right sidebar\n * <PageContainer\n * title=\"Task Detail\"\n * variant=\"split\"\n * sidebar={<CommentSection />}\n * sidebarPosition=\"right\"\n * >\n * <div>Main content</div>\n * </PageContainer>\n *\n * @example\n * // Full width layout (no padding)\n * <PageContainer variant=\"full\">\n * <KanbanBoard />\n * </PageContainer>\n */\nexport function PageContainer({\n title,\n subtitle,\n extra,\n children,\n footer,\n sidebar,\n sidebarPosition = 'right',\n sidebarWidth = 'w-80',\n variant = 'standard',\n className = '',\n contentClassName = '',\n showHeaderSeparator = true,\n}: PageContainerProps) {\n // Full width variant - no padding, no header\n if (variant === 'full') {\n return (\n <div className={`h-full flex flex-col ${className}`}>\n {children}\n {footer && <div className=\"border-t border-border\">{footer}</div>}\n </div>\n );\n }\n\n // Split variant - with sidebar\n if (variant === 'split') {\n return (\n <div className={`h-full flex flex-col ${className}`}>\n {/* Header */}\n {(title || extra) && (\n <div className=\"px-page py-4 border-b border-border\">\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"flex-1 min-w-0\">\n {title && <h1 className=\"text-page-title font-semibold mb-2\">{title}</h1>}\n {subtitle && <p className=\"text-sm text-muted-foreground\">{subtitle}</p>}\n </div>\n {extra && <div className=\"flex-shrink-0\">{extra}</div>}\n </div>\n </div>\n )}\n\n {/* Content with sidebar */}\n <div className=\"flex-1 flex overflow-hidden\">\n {sidebar && sidebarPosition === 'left' && (\n <aside className={`${sidebarWidth} border-r border-border overflow-y-auto flex-shrink-0`}>\n {sidebar}\n </aside>\n )}\n\n <main className={`flex-1 overflow-y-auto ${contentClassName}`}>\n {children}\n </main>\n\n {sidebar && sidebarPosition === 'right' && (\n <aside className={`${sidebarWidth} border-l border-border overflow-y-auto flex-shrink-0`}>\n {sidebar}\n </aside>\n )}\n </div>\n\n {footer && (\n <div className=\"border-t border-border\">\n {footer}\n </div>\n )}\n </div>\n );\n }\n\n // Standard variant - default padded layout\n return (\n <div className={`h-full flex flex-col ${className}`}>\n {/* Header */}\n {(title || extra) && (\n <>\n <div className=\"px-page py-4\">\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"flex-1 min-w-0\">\n {title && <h1 className=\"text-page-title font-semibold mb-2\">{title}</h1>}\n {subtitle && <p className=\"text-sm text-muted-foreground\">{subtitle}</p>}\n </div>\n {extra && <div className=\"flex-shrink-0\">{extra}</div>}\n </div>\n </div>\n {showHeaderSeparator && <Separator />}\n </>\n )}\n\n {/* Content */}\n <main className={`flex-1 overflow-y-auto p-page ${contentClassName}`}>\n {children}\n </main>\n\n {/* Footer */}\n {footer && (\n <>\n <Separator />\n <div className=\"px-page py-4\">\n {footer}\n </div>\n </>\n )}\n </div>\n );\n}\n\n/**\n * Convenience wrapper for standard layout\n */\nexport function StandardPageContainer(props: Omit<PageContainerProps, 'variant'>) {\n return <PageContainer {...props} variant=\"standard\" />;\n}\n\n/**\n * Convenience wrapper for split layout with sidebar\n */\nexport function SplitPageContainer(props: Omit<PageContainerProps, 'variant'>) {\n return <PageContainer {...props} variant=\"split\" />;\n}\n\n/**\n * Convenience wrapper for full width layout\n */\nexport function FullWidthPageContainer(props: Omit<PageContainerProps, 'variant' | 'title' | 'subtitle' | 'extra'>) {\n return <PageContainer {...props} variant=\"full\" />;\n}\n"]}
|