@unisim/sdk 0.2.0 → 0.3.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/dist/KnowledgeBaseMenu.d.ts +28 -0
- package/dist/KnowledgeBaseMenu.d.ts.map +1 -0
- package/dist/KnowledgeBaseMenu.js +160 -0
- package/dist/KnowledgeBaseMenu.js.map +1 -0
- package/dist/SettingsMenu.d.ts +26 -0
- package/dist/SettingsMenu.d.ts.map +1 -0
- package/dist/SettingsMenu.js +130 -0
- package/dist/SettingsMenu.js.map +1 -0
- package/dist/UniversalNavBar.d.ts +65 -0
- package/dist/UniversalNavBar.d.ts.map +1 -0
- package/dist/UniversalNavBar.js +197 -0
- package/dist/UniversalNavBar.js.map +1 -0
- package/dist/UserProfile.d.ts +21 -0
- package/dist/UserProfile.d.ts.map +1 -0
- package/dist/UserProfile.js +165 -0
- package/dist/UserProfile.js.map +1 -0
- package/dist/auth.js +1 -1
- package/dist/auth.js.map +1 -1
- package/dist/branding.d.ts +4 -0
- package/dist/branding.d.ts.map +1 -1
- package/dist/branding.js +6 -0
- package/dist/branding.js.map +1 -1
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +8 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +61 -61
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type CSSProperties } from 'react';
|
|
2
|
+
export interface KnowledgeBaseItem {
|
|
3
|
+
id: string;
|
|
4
|
+
/** Short identifier shown as a coloured chip, e.g. "REBA" or "FW". */
|
|
5
|
+
name: string;
|
|
6
|
+
/** Full descriptive name shown alongside the chip. */
|
|
7
|
+
fullName?: string;
|
|
8
|
+
/** Where the item links to (relative to the current product's basePath). */
|
|
9
|
+
href: string;
|
|
10
|
+
/** Optional Tailwind-style colour name for the chip (blue, indigo, teal, …). */
|
|
11
|
+
color?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface KnowledgeBaseMenuProps {
|
|
14
|
+
/** Items in the "Product Knowledge" section. Empty array shows an empty state. */
|
|
15
|
+
productItems?: KnowledgeBaseItem[];
|
|
16
|
+
/** "View all" link for the product KB landing page. */
|
|
17
|
+
productKBHref?: string;
|
|
18
|
+
/** Label for the product knowledge section header. Defaults to "Product Knowledge". */
|
|
19
|
+
productLabel?: string;
|
|
20
|
+
/** Items in the "Company Knowledge" section. Empty / undefined shows "Coming soon" state. */
|
|
21
|
+
companyItems?: KnowledgeBaseItem[];
|
|
22
|
+
/** Trigger className — typically Tailwind classes from the host nav. */
|
|
23
|
+
triggerClassName?: string;
|
|
24
|
+
style?: CSSProperties;
|
|
25
|
+
className?: string;
|
|
26
|
+
}
|
|
27
|
+
export declare function KnowledgeBaseMenu({ productItems, productKBHref, productLabel, companyItems, triggerClassName, style, className, }: KnowledgeBaseMenuProps): import("react/jsx-runtime").JSX.Element;
|
|
28
|
+
//# sourceMappingURL=KnowledgeBaseMenu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KnowledgeBaseMenu.d.ts","sourceRoot":"","sources":["../src/KnowledgeBaseMenu.tsx"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,aAAa,EAEnB,MAAM,OAAO,CAAA;AAMd,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAS,MAAM,CAAA;IACjB,sEAAsE;IACtE,IAAI,EAAO,MAAM,CAAA;IACjB,sDAAsD;IACtD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,4EAA4E;IAC5E,IAAI,EAAO,MAAM,CAAA;IACjB,gFAAgF;IAChF,KAAK,CAAC,EAAK,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,sBAAsB;IACrC,kFAAkF;IAClF,YAAY,CAAC,EAAK,iBAAiB,EAAE,CAAA;IACrC,uDAAuD;IACvD,aAAa,CAAC,EAAI,MAAM,CAAA;IACxB,uFAAuF;IACvF,YAAY,CAAC,EAAK,MAAM,CAAA;IACxB,6FAA6F;IAC7F,YAAY,CAAC,EAAK,iBAAiB,EAAE,CAAA;IACrC,wEAAwE;IACxE,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,KAAK,CAAC,EAAY,aAAa,CAAA;IAC/B,SAAS,CAAC,EAAQ,MAAM,CAAA;CACzB;AA2BD,wBAAgB,iBAAiB,CAAC,EAChC,YAAY,EACZ,aAAa,EACb,YAAqC,EACrC,YAAY,EACZ,gBAAgB,EAChB,KAAK,EACL,SAAS,GACV,EAAE,sBAAsB,2CAqFxB"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useState, useRef, useEffect, } from 'react';
|
|
4
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
5
|
+
// Chip colour map — mirrors the per-method colouring used in Ergo's KB.
|
|
6
|
+
// Resolved as flat hex so the component has no Tailwind dependency.
|
|
7
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
8
|
+
const COLOUR_HEX = {
|
|
9
|
+
blue: '#2563eb',
|
|
10
|
+
indigo: '#4f46e5',
|
|
11
|
+
teal: '#0d9488',
|
|
12
|
+
orange: '#c2410c',
|
|
13
|
+
yellow: '#ca8a04',
|
|
14
|
+
cyan: '#0891b2',
|
|
15
|
+
pink: '#db2777',
|
|
16
|
+
violet: '#7c3aed',
|
|
17
|
+
red: '#dc2626',
|
|
18
|
+
amber: '#d97706',
|
|
19
|
+
green: '#16a34a',
|
|
20
|
+
rose: '#e11d48',
|
|
21
|
+
slate: '#475569',
|
|
22
|
+
};
|
|
23
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
24
|
+
// Component
|
|
25
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
26
|
+
export function KnowledgeBaseMenu({ productItems, productKBHref, productLabel = 'Product Knowledge', companyItems, triggerClassName, style, className, }) {
|
|
27
|
+
const [open, setOpen] = useState(false);
|
|
28
|
+
const wrapRef = useRef(null);
|
|
29
|
+
const closeTimer = useRef(null);
|
|
30
|
+
function openNow() {
|
|
31
|
+
if (closeTimer.current)
|
|
32
|
+
clearTimeout(closeTimer.current);
|
|
33
|
+
setOpen(true);
|
|
34
|
+
}
|
|
35
|
+
function closeSoon() {
|
|
36
|
+
if (closeTimer.current)
|
|
37
|
+
clearTimeout(closeTimer.current);
|
|
38
|
+
closeTimer.current = setTimeout(() => setOpen(false), 220);
|
|
39
|
+
}
|
|
40
|
+
useEffect(() => {
|
|
41
|
+
function onDown(e) {
|
|
42
|
+
if (wrapRef.current && !wrapRef.current.contains(e.target))
|
|
43
|
+
setOpen(false);
|
|
44
|
+
}
|
|
45
|
+
function onKey(e) {
|
|
46
|
+
if (e.key === 'Escape')
|
|
47
|
+
setOpen(false);
|
|
48
|
+
}
|
|
49
|
+
document.addEventListener('mousedown', onDown);
|
|
50
|
+
document.addEventListener('keydown', onKey);
|
|
51
|
+
return () => {
|
|
52
|
+
document.removeEventListener('mousedown', onDown);
|
|
53
|
+
document.removeEventListener('keydown', onKey);
|
|
54
|
+
};
|
|
55
|
+
}, []);
|
|
56
|
+
const hasProductItems = productItems && productItems.length > 0;
|
|
57
|
+
const hasCompanyItems = companyItems && companyItems.length > 0;
|
|
58
|
+
return (_jsxs("div", { ref: wrapRef, className: className, style: { position: 'relative', display: 'inline-block', ...style }, onMouseEnter: openNow, onMouseLeave: closeSoon, children: [_jsxs("button", { type: "button", "aria-label": "Knowledge Base", "aria-expanded": open, "aria-haspopup": "true", onClick: () => setOpen((v) => !v), onFocus: openNow, className: triggerClassName, style: triggerClassName ? undefined : defaultTriggerStyle, children: ["Knowledge Base", _jsx(IconChevron, {})] }), _jsxs("div", { role: "menu", style: menuStyle(open), children: [_jsx(SectionHeader, { label: productLabel }), hasProductItems ? (_jsxs(_Fragment, { children: [_jsx("div", { style: listStyle, children: productItems.map((item) => (_jsx(KBLink, { item: item }, item.id))) }), productKBHref && _jsx(SeeAllRow, { href: productKBHref })] })) : (_jsx(EmptyState, { text: "No articles yet." })), _jsx(Divider, {}), _jsx(SectionHeader, { label: "Company Knowledge" }), hasCompanyItems ? (_jsx("div", { style: listStyle, children: companyItems.map((item) => (_jsx(KBLink, { item: item }, item.id))) })) : (_jsx(EmptyState, { text: "Company Knowledge \u2014 coming soon." }))] })] }));
|
|
59
|
+
}
|
|
60
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
61
|
+
// Subcomponents
|
|
62
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
63
|
+
function KBLink({ item }) {
|
|
64
|
+
const chipColour = item.color ? COLOUR_HEX[item.color] : COLOUR_HEX.slate;
|
|
65
|
+
return (_jsxs("a", { role: "menuitem", href: item.href, style: kbLinkStyle, onMouseEnter: (e) => { e.currentTarget.style.background = '#f8fafc'; }, onMouseLeave: (e) => { e.currentTarget.style.background = 'transparent'; }, children: [_jsx("span", { style: {
|
|
66
|
+
flexShrink: 0,
|
|
67
|
+
fontSize: 10,
|
|
68
|
+
fontWeight: 700,
|
|
69
|
+
color: chipColour ?? '#475569',
|
|
70
|
+
width: 50,
|
|
71
|
+
letterSpacing: '0.02em',
|
|
72
|
+
}, children: item.name }), _jsx("span", { style: { fontSize: 12, color: '#475569', flex: 1, minWidth: 0, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }, children: item.fullName ?? item.name })] }));
|
|
73
|
+
}
|
|
74
|
+
function SectionHeader({ label }) {
|
|
75
|
+
return (_jsx("div", { style: sectionHeaderStyle, children: label }));
|
|
76
|
+
}
|
|
77
|
+
function EmptyState({ text }) {
|
|
78
|
+
return (_jsx("div", { style: emptyStateStyle, children: text }));
|
|
79
|
+
}
|
|
80
|
+
function SeeAllRow({ href }) {
|
|
81
|
+
return (_jsx("div", { style: seeAllRowStyle, children: _jsxs("a", { href: href, style: { fontSize: 11, color: '#c2410c', fontWeight: 600, textDecoration: 'none', display: 'inline-flex', alignItems: 'center', gap: 4 }, children: ["View all", _jsx("span", { "aria-hidden": true, children: "\u2192" })] }) }));
|
|
82
|
+
}
|
|
83
|
+
function Divider() {
|
|
84
|
+
return _jsx("div", { style: { height: 1, background: '#e5e7eb', margin: '4px 0' }, "aria-hidden": true });
|
|
85
|
+
}
|
|
86
|
+
function IconChevron() {
|
|
87
|
+
return (_jsx("svg", { width: "10", height: "10", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", style: { marginTop: 1 }, "aria-hidden": true, children: _jsx("path", { d: "M6 9l6 6 6-6" }) }));
|
|
88
|
+
}
|
|
89
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
90
|
+
// Styles
|
|
91
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
92
|
+
const defaultTriggerStyle = {
|
|
93
|
+
display: 'inline-flex',
|
|
94
|
+
alignItems: 'center',
|
|
95
|
+
gap: 4,
|
|
96
|
+
fontSize: 14,
|
|
97
|
+
color: 'inherit',
|
|
98
|
+
background: 'transparent',
|
|
99
|
+
border: 0,
|
|
100
|
+
padding: 0,
|
|
101
|
+
cursor: 'pointer',
|
|
102
|
+
fontFamily: 'inherit',
|
|
103
|
+
};
|
|
104
|
+
function menuStyle(open) {
|
|
105
|
+
return {
|
|
106
|
+
position: 'absolute',
|
|
107
|
+
left: 0,
|
|
108
|
+
top: 'calc(100% + 8px)',
|
|
109
|
+
minWidth: 280,
|
|
110
|
+
background: '#ffffff',
|
|
111
|
+
border: '1px solid #e5e7eb',
|
|
112
|
+
borderRadius: 12,
|
|
113
|
+
boxShadow: '0 16px 32px -8px rgba(15,23,42,0.16), 0 4px 8px -2px rgba(15,23,42,0.08)',
|
|
114
|
+
padding: '6px 0',
|
|
115
|
+
opacity: open ? 1 : 0,
|
|
116
|
+
visibility: open ? 'visible' : 'hidden',
|
|
117
|
+
transform: open ? 'translateY(0)' : 'translateY(-4px)',
|
|
118
|
+
transition: 'opacity 150ms cubic-bezier(0.16,1,0.3,1), transform 150ms cubic-bezier(0.16,1,0.3,1), visibility 150ms',
|
|
119
|
+
zIndex: 50,
|
|
120
|
+
color: '#111827',
|
|
121
|
+
maxHeight: '70vh',
|
|
122
|
+
overflowY: 'auto',
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
const sectionHeaderStyle = {
|
|
126
|
+
padding: '8px 14px 4px',
|
|
127
|
+
fontSize: 10,
|
|
128
|
+
fontWeight: 700,
|
|
129
|
+
letterSpacing: '0.08em',
|
|
130
|
+
textTransform: 'uppercase',
|
|
131
|
+
color: '#64748b',
|
|
132
|
+
};
|
|
133
|
+
const listStyle = {
|
|
134
|
+
display: 'flex',
|
|
135
|
+
flexDirection: 'column',
|
|
136
|
+
};
|
|
137
|
+
const kbLinkStyle = {
|
|
138
|
+
display: 'flex',
|
|
139
|
+
alignItems: 'center',
|
|
140
|
+
gap: 10,
|
|
141
|
+
padding: '6px 14px',
|
|
142
|
+
fontSize: 12,
|
|
143
|
+
color: '#374151',
|
|
144
|
+
background: 'transparent',
|
|
145
|
+
textDecoration: 'none',
|
|
146
|
+
fontFamily: 'inherit',
|
|
147
|
+
transition: 'background 120ms',
|
|
148
|
+
};
|
|
149
|
+
const emptyStateStyle = {
|
|
150
|
+
padding: '6px 14px 10px',
|
|
151
|
+
fontSize: 12,
|
|
152
|
+
color: '#94a3b8',
|
|
153
|
+
fontStyle: 'italic',
|
|
154
|
+
};
|
|
155
|
+
const seeAllRowStyle = {
|
|
156
|
+
padding: '8px 14px 6px',
|
|
157
|
+
borderTop: '1px solid #f1f5f9',
|
|
158
|
+
marginTop: 4,
|
|
159
|
+
};
|
|
160
|
+
//# sourceMappingURL=KnowledgeBaseMenu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KnowledgeBaseMenu.js","sourceRoot":"","sources":["../src/KnowledgeBaseMenu.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type CSSProperties, type MouseEvent, type ReactNode } from 'react';
|
|
2
|
+
export interface SettingsItem {
|
|
3
|
+
/** Display label, e.g. "Default analysis methods". */
|
|
4
|
+
label: string;
|
|
5
|
+
/** Either provide href (renders as link) or onClick (renders as button). */
|
|
6
|
+
href?: string;
|
|
7
|
+
onClick?: (e: MouseEvent<HTMLButtonElement>) => void;
|
|
8
|
+
/** Optional small icon shown left of the label. */
|
|
9
|
+
icon?: ReactNode;
|
|
10
|
+
/** Render in red — for destructive actions like "Sign out". */
|
|
11
|
+
danger?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface SettingsMenuProps {
|
|
14
|
+
/** Items in the product-specific settings section. */
|
|
15
|
+
productItems?: SettingsItem[];
|
|
16
|
+
/** Items in the global / cross-product settings section (e.g. Theme, Language). */
|
|
17
|
+
globalItems?: SettingsItem[];
|
|
18
|
+
/** Trigger className — typically Tailwind classes from the host nav. */
|
|
19
|
+
triggerClassName?: string;
|
|
20
|
+
/** aria-label for the trigger. Defaults to "Settings". */
|
|
21
|
+
ariaLabel?: string;
|
|
22
|
+
style?: CSSProperties;
|
|
23
|
+
className?: string;
|
|
24
|
+
}
|
|
25
|
+
export declare function SettingsMenu({ productItems, globalItems, triggerClassName, ariaLabel, style, className, }: SettingsMenuProps): import("react/jsx-runtime").JSX.Element;
|
|
26
|
+
//# sourceMappingURL=SettingsMenu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SettingsMenu.d.ts","sourceRoot":"","sources":["../src/SettingsMenu.tsx"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,SAAS,EACf,MAAM,OAAO,CAAA;AAMd,MAAM,WAAW,YAAY;IAC3B,sDAAsD;IACtD,KAAK,EAAK,MAAM,CAAA;IAChB,4EAA4E;IAC5E,IAAI,CAAC,EAAK,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAA;IACpD,mDAAmD;IACnD,IAAI,CAAC,EAAK,SAAS,CAAA;IACnB,+DAA+D;IAC/D,MAAM,CAAC,EAAG,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,sDAAsD;IACtD,YAAY,CAAC,EAAK,YAAY,EAAE,CAAA;IAChC,mFAAmF;IACnF,WAAW,CAAC,EAAM,YAAY,EAAE,CAAA;IAChC,wEAAwE;IACxE,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,0DAA0D;IAC1D,SAAS,CAAC,EAAQ,MAAM,CAAA;IACxB,KAAK,CAAC,EAAY,aAAa,CAAA;IAC/B,SAAS,CAAC,EAAQ,MAAM,CAAA;CACzB;AAMD,wBAAgB,YAAY,CAAC,EAC3B,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,SAAsB,EACtB,KAAK,EACL,SAAS,GACV,EAAE,iBAAiB,2CAkFnB"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState, useRef, useEffect, } from 'react';
|
|
4
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
5
|
+
// Component
|
|
6
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
7
|
+
export function SettingsMenu({ productItems, globalItems, triggerClassName, ariaLabel = 'Settings', style, className, }) {
|
|
8
|
+
const [open, setOpen] = useState(false);
|
|
9
|
+
const wrapRef = useRef(null);
|
|
10
|
+
const closeTimer = useRef(null);
|
|
11
|
+
function openNow() {
|
|
12
|
+
if (closeTimer.current)
|
|
13
|
+
clearTimeout(closeTimer.current);
|
|
14
|
+
setOpen(true);
|
|
15
|
+
}
|
|
16
|
+
function closeSoon() {
|
|
17
|
+
if (closeTimer.current)
|
|
18
|
+
clearTimeout(closeTimer.current);
|
|
19
|
+
closeTimer.current = setTimeout(() => setOpen(false), 220);
|
|
20
|
+
}
|
|
21
|
+
useEffect(() => {
|
|
22
|
+
function onDown(e) {
|
|
23
|
+
if (wrapRef.current && !wrapRef.current.contains(e.target))
|
|
24
|
+
setOpen(false);
|
|
25
|
+
}
|
|
26
|
+
function onKey(e) {
|
|
27
|
+
if (e.key === 'Escape')
|
|
28
|
+
setOpen(false);
|
|
29
|
+
}
|
|
30
|
+
document.addEventListener('mousedown', onDown);
|
|
31
|
+
document.addEventListener('keydown', onKey);
|
|
32
|
+
return () => {
|
|
33
|
+
document.removeEventListener('mousedown', onDown);
|
|
34
|
+
document.removeEventListener('keydown', onKey);
|
|
35
|
+
};
|
|
36
|
+
}, []);
|
|
37
|
+
const hasProduct = productItems && productItems.length > 0;
|
|
38
|
+
const hasGlobal = globalItems && globalItems.length > 0;
|
|
39
|
+
return (_jsxs("div", { ref: wrapRef, className: className, style: { position: 'relative', display: 'inline-block', ...style }, onMouseEnter: openNow, onMouseLeave: closeSoon, children: [_jsx("button", { type: "button", "aria-label": ariaLabel, "aria-expanded": open, "aria-haspopup": "true", onClick: () => setOpen((v) => !v), onFocus: openNow, className: triggerClassName, style: triggerClassName ? undefined : defaultTriggerStyle, children: _jsx(IconGear, {}) }), _jsxs("div", { role: "menu", style: menuStyle(open), children: [hasProduct && (_jsxs(_Fragment, { children: [_jsx(SectionHeader, { label: "Product Settings" }), productItems.map((item, i) => (_jsx(Item, { item: item }, `p${i}`)))] })), hasProduct && hasGlobal && _jsx(Divider, {}), hasGlobal && (_jsxs(_Fragment, { children: [_jsx(SectionHeader, { label: "Global Settings" }), globalItems.map((item, i) => (_jsx(Item, { item: item }, `g${i}`)))] })), !hasProduct && !hasGlobal && (_jsx("div", { style: { padding: '12px 14px', fontSize: 12, color: '#94a3b8', fontStyle: 'italic' }, children: "No settings yet." }))] })] }));
|
|
40
|
+
}
|
|
41
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
42
|
+
// Subcomponents
|
|
43
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
44
|
+
function Item({ item }) {
|
|
45
|
+
const restingColor = item.danger ? '#dc2626' : '#374151';
|
|
46
|
+
const hoverColor = item.danger ? '#b91c1c' : '#111827';
|
|
47
|
+
const hoverBg = item.danger ? '#fef2f2' : '#f3f4f6';
|
|
48
|
+
const baseStyle = {
|
|
49
|
+
display: 'flex',
|
|
50
|
+
alignItems: 'center',
|
|
51
|
+
gap: 10,
|
|
52
|
+
padding: '8px 14px',
|
|
53
|
+
fontSize: 13,
|
|
54
|
+
color: restingColor,
|
|
55
|
+
background: 'transparent',
|
|
56
|
+
border: 0,
|
|
57
|
+
cursor: 'pointer',
|
|
58
|
+
width: '100%',
|
|
59
|
+
textAlign: 'left',
|
|
60
|
+
textDecoration: 'none',
|
|
61
|
+
fontFamily: 'inherit',
|
|
62
|
+
transition: 'background 120ms, color 120ms',
|
|
63
|
+
};
|
|
64
|
+
const onEnter = (e) => {
|
|
65
|
+
e.currentTarget.style.background = hoverBg;
|
|
66
|
+
e.currentTarget.style.color = hoverColor;
|
|
67
|
+
};
|
|
68
|
+
const onLeave = (e) => {
|
|
69
|
+
e.currentTarget.style.background = 'transparent';
|
|
70
|
+
e.currentTarget.style.color = restingColor;
|
|
71
|
+
};
|
|
72
|
+
if (item.onClick) {
|
|
73
|
+
return (_jsxs("button", { type: "button", role: "menuitem", onClick: item.onClick, onMouseEnter: onEnter, onMouseLeave: onLeave, style: baseStyle, children: [item.icon, item.label] }));
|
|
74
|
+
}
|
|
75
|
+
return (_jsxs("a", { role: "menuitem", href: item.href, onMouseEnter: onEnter, onMouseLeave: onLeave, style: baseStyle, children: [item.icon, item.label] }));
|
|
76
|
+
}
|
|
77
|
+
function SectionHeader({ label }) {
|
|
78
|
+
return _jsx("div", { style: sectionHeaderStyle, children: label });
|
|
79
|
+
}
|
|
80
|
+
function Divider() {
|
|
81
|
+
return _jsx("div", { style: { height: 1, background: '#e5e7eb', margin: '4px 0' }, "aria-hidden": true });
|
|
82
|
+
}
|
|
83
|
+
function IconGear() {
|
|
84
|
+
return (_jsxs("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": true, children: [_jsx("circle", { cx: "12", cy: "12", r: "3" }), _jsx("path", { d: "M19.4 15a1.65 1.65 0 00.33 1.82l.06.06a2 2 0 010 2.83 2 2 0 01-2.83 0l-.06-.06a1.65 1.65 0 00-1.82-.33 1.65 1.65 0 00-1 1.51V21a2 2 0 01-4 0v-.09A1.65 1.65 0 009 19.4a1.65 1.65 0 00-1.82.33l-.06.06a2 2 0 01-2.83-2.83l.06-.06A1.65 1.65 0 004.68 15a1.65 1.65 0 00-1.51-1H3a2 2 0 010-4h.09A1.65 1.65 0 004.6 9a1.65 1.65 0 00-.33-1.82l-.06-.06a2 2 0 012.83-2.83l.06.06A1.65 1.65 0 009 4.68a1.65 1.65 0 001-1.51V3a2 2 0 014 0v.09a1.65 1.65 0 001 1.51 1.65 1.65 0 001.82-.33l.06-.06a2 2 0 012.83 2.83l-.06.06A1.65 1.65 0 0019.4 9a1.65 1.65 0 001.51 1H21a2 2 0 010 4h-.09a1.65 1.65 0 00-1.51 1z" })] }));
|
|
85
|
+
}
|
|
86
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
87
|
+
// Styles
|
|
88
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
89
|
+
const defaultTriggerStyle = {
|
|
90
|
+
display: 'inline-flex',
|
|
91
|
+
alignItems: 'center',
|
|
92
|
+
justifyContent: 'center',
|
|
93
|
+
width: 32,
|
|
94
|
+
height: 32,
|
|
95
|
+
borderRadius: 8,
|
|
96
|
+
border: 0,
|
|
97
|
+
background: 'transparent',
|
|
98
|
+
color: '#64748b',
|
|
99
|
+
cursor: 'pointer',
|
|
100
|
+
padding: 0,
|
|
101
|
+
transition: 'background 120ms, color 120ms',
|
|
102
|
+
};
|
|
103
|
+
function menuStyle(open) {
|
|
104
|
+
return {
|
|
105
|
+
position: 'absolute',
|
|
106
|
+
right: 0,
|
|
107
|
+
top: 'calc(100% + 8px)',
|
|
108
|
+
minWidth: 220,
|
|
109
|
+
background: '#ffffff',
|
|
110
|
+
border: '1px solid #e5e7eb',
|
|
111
|
+
borderRadius: 12,
|
|
112
|
+
boxShadow: '0 16px 32px -8px rgba(15,23,42,0.16), 0 4px 8px -2px rgba(15,23,42,0.08)',
|
|
113
|
+
padding: '6px 0',
|
|
114
|
+
opacity: open ? 1 : 0,
|
|
115
|
+
visibility: open ? 'visible' : 'hidden',
|
|
116
|
+
transform: open ? 'translateY(0)' : 'translateY(-4px)',
|
|
117
|
+
transition: 'opacity 150ms cubic-bezier(0.16,1,0.3,1), transform 150ms cubic-bezier(0.16,1,0.3,1), visibility 150ms',
|
|
118
|
+
zIndex: 50,
|
|
119
|
+
color: '#111827',
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
const sectionHeaderStyle = {
|
|
123
|
+
padding: '8px 14px 4px',
|
|
124
|
+
fontSize: 10,
|
|
125
|
+
fontWeight: 700,
|
|
126
|
+
letterSpacing: '0.08em',
|
|
127
|
+
textTransform: 'uppercase',
|
|
128
|
+
color: '#64748b',
|
|
129
|
+
};
|
|
130
|
+
//# sourceMappingURL=SettingsMenu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SettingsMenu.js","sourceRoot":"","sources":["../src/SettingsMenu.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { type CSSProperties, type ReactNode } from 'react';
|
|
2
|
+
import { type SuiteProductId } from './SuiteSwitcher.js';
|
|
3
|
+
import { type KnowledgeBaseItem } from './KnowledgeBaseMenu.js';
|
|
4
|
+
import { type SettingsItem } from './SettingsMenu.js';
|
|
5
|
+
import { type UserProfileProps } from './UserProfile.js';
|
|
6
|
+
export interface UniversalNavBarProps {
|
|
7
|
+
/** Which product is currently mounting this nav. Used by SuiteSwitcher. */
|
|
8
|
+
product: SuiteProductId;
|
|
9
|
+
/** Element shown on the far left — typically the product wordmark/logo. */
|
|
10
|
+
productLogo: ReactNode;
|
|
11
|
+
/** Override the dynamic org-name label. When unset, reads from useOrg(). */
|
|
12
|
+
companyLabel?: string;
|
|
13
|
+
/** Override the org icon. When unset, reads from useOrgBranding().icon_url. */
|
|
14
|
+
companyIconUrl?: string | null;
|
|
15
|
+
/**
|
|
16
|
+
* Href for "New Assessment". Standardised to "/new" across the suite.
|
|
17
|
+
* Pass null to hide the link on a product that doesn't support it yet.
|
|
18
|
+
*/
|
|
19
|
+
newAssessmentHref?: string | null;
|
|
20
|
+
/** Knowledge base content (per-product items + future company-knowledge slot). */
|
|
21
|
+
knowledgeBase?: {
|
|
22
|
+
productItems?: KnowledgeBaseItem[];
|
|
23
|
+
productKBHref?: string;
|
|
24
|
+
productLabel?: string;
|
|
25
|
+
companyItems?: KnowledgeBaseItem[];
|
|
26
|
+
};
|
|
27
|
+
/** Product-specific items for the gear-icon dropdown. */
|
|
28
|
+
productSettings?: SettingsItem[];
|
|
29
|
+
/** Global / cross-product items (Theme, Language, etc.). */
|
|
30
|
+
globalSettings?: SettingsItem[];
|
|
31
|
+
/**
|
|
32
|
+
* Override the auto-derived user profile. Pass when the host product has
|
|
33
|
+
* richer profile data (display name, profile photo from its own store).
|
|
34
|
+
* If omitted, the navbar renders a profile button derived from useUser():
|
|
35
|
+
* - anonymous Supabase session → generic icon + "Sign in" item
|
|
36
|
+
* - signed in → email-derived initials + email + Sign out
|
|
37
|
+
*/
|
|
38
|
+
user?: UserProfileProps | null;
|
|
39
|
+
/** A small chip rendered inside the SuiteSwitcher — typically <VersionChip />. */
|
|
40
|
+
versionChip?: ReactNode;
|
|
41
|
+
/** Trigger icon for the SuiteSwitcher. Defaults to the inline UNISIM monogram. */
|
|
42
|
+
suiteSwitcherIconSrc?: string;
|
|
43
|
+
/** Top brand strip — pass false to hide. Default: shown. */
|
|
44
|
+
showBrandStrip?: boolean;
|
|
45
|
+
/** Where the central hub lives. Used for the "Sign in" link on anonymous sessions. */
|
|
46
|
+
hubLoginHref?: string;
|
|
47
|
+
className?: string;
|
|
48
|
+
style?: CSSProperties;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* The Universal Suite navigation bar — single source of truth for the header
|
|
52
|
+
* layout across every Assess product. Each product mounts this once and the
|
|
53
|
+
* suite-wide visual identity (gradient strip, company badge, suite switcher,
|
|
54
|
+
* my-company menu, settings, profile) propagates automatically on the next
|
|
55
|
+
* SDK bump.
|
|
56
|
+
*
|
|
57
|
+
* Layout (left → right):
|
|
58
|
+
* [Brand strip]
|
|
59
|
+
* ┌──────────────────────────────────────────────────────────────────────┐
|
|
60
|
+
* │ [Logo] [Icon] for [Org] New Assessment · KB · My Company │
|
|
61
|
+
* │ · ⚙ · 👤 · ⊞ │
|
|
62
|
+
* └──────────────────────────────────────────────────────────────────────┘
|
|
63
|
+
*/
|
|
64
|
+
export declare function UniversalNavBar({ product, productLogo, companyLabel, companyIconUrl, newAssessmentHref, knowledgeBase, productSettings, globalSettings, user, versionChip, suiteSwitcherIconSrc, showBrandStrip, hubLoginHref, className, style, }: UniversalNavBarProps): import("react/jsx-runtime").JSX.Element;
|
|
65
|
+
//# sourceMappingURL=UniversalNavBar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UniversalNavBar.d.ts","sourceRoot":"","sources":["../src/UniversalNavBar.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAE1D,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAEvE,OAAO,EAAqB,KAAK,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAClF,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACnE,OAAO,EAAe,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AASrE,MAAM,WAAW,oBAAoB;IAEnC,2EAA2E;IAC3E,OAAO,EAAE,cAAc,CAAA;IACvB,2EAA2E;IAC3E,WAAW,EAAE,SAAS,CAAA;IAGtB,4EAA4E;IAC5E,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,+EAA+E;IAC/E,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAG9B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAEjC,kFAAkF;IAClF,aAAa,CAAC,EAAE;QACd,YAAY,CAAC,EAAG,iBAAiB,EAAE,CAAA;QACnC,aAAa,CAAC,EAAE,MAAM,CAAA;QACtB,YAAY,CAAC,EAAG,MAAM,CAAA;QACtB,YAAY,CAAC,EAAG,iBAAiB,EAAE,CAAA;KACpC,CAAA;IAGD,yDAAyD;IACzD,eAAe,CAAC,EAAE,YAAY,EAAE,CAAA;IAChC,4DAA4D;IAC5D,cAAc,CAAC,EAAG,YAAY,EAAE,CAAA;IAEhC;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAA;IAE9B,kFAAkF;IAClF,WAAW,CAAC,EAAE,SAAS,CAAA;IAEvB,kFAAkF;IAClF,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAE7B,4DAA4D;IAC5D,cAAc,CAAC,EAAE,OAAO,CAAA;IAExB,sFAAsF;IACtF,YAAY,CAAC,EAAE,MAAM,CAAA;IAGrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAM,aAAa,CAAA;CAC1B;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAAC,EAC9B,OAAO,EACP,WAAW,EACX,YAAY,EACZ,cAAc,EACd,iBAA0B,EAC1B,aAAa,EACb,eAAe,EACf,cAAc,EACd,IAAI,EACJ,WAAW,EACX,oBAAoB,EACpB,cAAqB,EACrB,YAA+C,EAC/C,SAAS,EACT,KAAK,GACN,EAAE,oBAAoB,2CAyDtB"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { CompanyMenu } from './CompanyMenu.js';
|
|
4
|
+
import { SuiteSwitcher } from './SuiteSwitcher.js';
|
|
5
|
+
import { UniversalBar } from './UniversalBar.js';
|
|
6
|
+
import { KnowledgeBaseMenu } from './KnowledgeBaseMenu.js';
|
|
7
|
+
import { SettingsMenu } from './SettingsMenu.js';
|
|
8
|
+
import { UserProfile } from './UserProfile.js';
|
|
9
|
+
import { useOrg, useUser } from './auth.js';
|
|
10
|
+
import { useOrgBranding } from './branding.js';
|
|
11
|
+
import { useUniversal } from './provider.js';
|
|
12
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
13
|
+
// Component
|
|
14
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
15
|
+
/**
|
|
16
|
+
* The Universal Suite navigation bar — single source of truth for the header
|
|
17
|
+
* layout across every Assess product. Each product mounts this once and the
|
|
18
|
+
* suite-wide visual identity (gradient strip, company badge, suite switcher,
|
|
19
|
+
* my-company menu, settings, profile) propagates automatically on the next
|
|
20
|
+
* SDK bump.
|
|
21
|
+
*
|
|
22
|
+
* Layout (left → right):
|
|
23
|
+
* [Brand strip]
|
|
24
|
+
* ┌──────────────────────────────────────────────────────────────────────┐
|
|
25
|
+
* │ [Logo] [Icon] for [Org] New Assessment · KB · My Company │
|
|
26
|
+
* │ · ⚙ · 👤 · ⊞ │
|
|
27
|
+
* └──────────────────────────────────────────────────────────────────────┘
|
|
28
|
+
*/
|
|
29
|
+
export function UniversalNavBar({ product, productLogo, companyLabel, companyIconUrl, newAssessmentHref = '/new', knowledgeBase, productSettings, globalSettings, user, versionChip, suiteSwitcherIconSrc, showBrandStrip = true, hubLoginHref = 'https://app.unisim.co.uk/login', className, style, }) {
|
|
30
|
+
// ── Company label + icon ────────────────────────────────────────────────
|
|
31
|
+
const { org } = useOrg();
|
|
32
|
+
const branding = useOrgBranding();
|
|
33
|
+
const resolvedCompany = companyLabel ?? org?.name ?? 'Your Company';
|
|
34
|
+
const resolvedIconUrl = companyIconUrl ?? branding.icon_url;
|
|
35
|
+
const initial = (org?.name?.[0] ?? '?').toUpperCase();
|
|
36
|
+
const iconBg = branding.brand_color ?? '#e2e8f0';
|
|
37
|
+
// ── User profile auto-wiring ───────────────────────────────────────────
|
|
38
|
+
const resolvedUser = useResolvedUser(user, hubLoginHref);
|
|
39
|
+
return (_jsxs("div", { className: className, style: style, children: [showBrandStrip && _jsx(UniversalBar, {}), _jsxs("header", { style: headerStyle, children: [_jsxs("div", { style: leftStyle, children: [_jsx("div", { style: { display: 'inline-flex', alignItems: 'center' }, children: productLogo }), _jsx("span", { style: separatorStyle, "aria-hidden": true, children: "\u00B7" }), _jsx(CompanyBadge, { iconUrl: resolvedIconUrl, initial: initial, iconBg: iconBg, hasOrg: !!org }), _jsxs("span", { style: companyLabelStyle, children: [_jsx("span", { style: { color: '#94a3b8', marginRight: 4 }, children: "for" }), _jsx("span", { style: { color: org?.name ? '#0f172a' : '#94a3b8' }, children: resolvedCompany })] })] }), _jsxs("nav", { style: centreStyle, "aria-label": "Primary", children: [newAssessmentHref && (_jsx("a", { href: newAssessmentHref, style: linkStyle, children: "New Assessment" })), knowledgeBase && (_jsx(KnowledgeBaseMenu, { productItems: knowledgeBase.productItems, productKBHref: knowledgeBase.productKBHref, productLabel: knowledgeBase.productLabel, companyItems: knowledgeBase.companyItems })), _jsx(CompanyMenu, {})] }), _jsxs("div", { style: rightStyle, children: [_jsx(SettingsMenu, { productItems: productSettings, globalItems: globalSettings }), _jsx(UserProfile, { ...resolvedUser }), _jsx(SuiteSwitcher, { current: product, iconSrc: suiteSwitcherIconSrc, chip: versionChip })] })] })] }));
|
|
40
|
+
}
|
|
41
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
42
|
+
// useResolvedUser — combines an explicit `user` prop with auto-derived data
|
|
43
|
+
// from useUser(). Host products that pass `user` get full control; everyone
|
|
44
|
+
// else gets a sensible default with a "Sign in" item for anonymous sessions.
|
|
45
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
46
|
+
function useResolvedUser(override, hubLoginHref) {
|
|
47
|
+
const { user, loading } = useUser();
|
|
48
|
+
const { supabase, session } = useUniversal();
|
|
49
|
+
// Honour an explicit override fully.
|
|
50
|
+
if (override)
|
|
51
|
+
return override;
|
|
52
|
+
// Loading: show a neutral placeholder.
|
|
53
|
+
if (loading) {
|
|
54
|
+
return { name: undefined, email: undefined, initials: '·' };
|
|
55
|
+
}
|
|
56
|
+
// Supabase exposes is_anonymous on the user object; the SDK doesn't surface
|
|
57
|
+
// it directly so we read it off the session.
|
|
58
|
+
const isAnonymous = session?.user?.is_anonymous === true;
|
|
59
|
+
if (!user || isAnonymous) {
|
|
60
|
+
return {
|
|
61
|
+
// Show "Sign in" as the profile item link rather than a sign-out flow.
|
|
62
|
+
name: undefined,
|
|
63
|
+
email: undefined,
|
|
64
|
+
profileHref: hubLoginHref,
|
|
65
|
+
// The avatar fallback shows "?" for anonymous — clean read.
|
|
66
|
+
initials: '?',
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
// Signed-in real user. Use email-derived initials when no display name yet.
|
|
70
|
+
return {
|
|
71
|
+
name: undefined,
|
|
72
|
+
email: user.email ?? undefined,
|
|
73
|
+
initials: emailInitials(user.email),
|
|
74
|
+
onSignOut: () => { void supabase.auth.signOut(); },
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
function emailInitials(email) {
|
|
78
|
+
if (!email)
|
|
79
|
+
return '?';
|
|
80
|
+
const local = email.split('@')[0] ?? '';
|
|
81
|
+
if (local.length === 0)
|
|
82
|
+
return '?';
|
|
83
|
+
if (local.length === 1)
|
|
84
|
+
return local[0].toUpperCase();
|
|
85
|
+
return (local[0] + local[1]).toUpperCase();
|
|
86
|
+
}
|
|
87
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
88
|
+
// Subcomponents
|
|
89
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
90
|
+
function CompanyBadge({ iconUrl, initial, iconBg, hasOrg, }) {
|
|
91
|
+
if (iconUrl) {
|
|
92
|
+
return (_jsx("span", { style: iconImgWrapperStyle, children: _jsx("img", { src: iconUrl, alt: "", "aria-hidden": true, style: iconImgStyle }) }));
|
|
93
|
+
}
|
|
94
|
+
return (_jsx("span", { style: {
|
|
95
|
+
...iconFallbackStyle,
|
|
96
|
+
background: hasOrg ? iconBg : '#e2e8f0',
|
|
97
|
+
color: hasOrg ? readableTextOn(iconBg) : '#94a3b8',
|
|
98
|
+
}, "aria-hidden": true, children: hasOrg ? initial : '·' }));
|
|
99
|
+
}
|
|
100
|
+
function readableTextOn(bgHex) {
|
|
101
|
+
// Naive luminance check — picks white text for dark backgrounds, dark for
|
|
102
|
+
// light. Good enough for the small initials badge; not WCAG-rigorous.
|
|
103
|
+
const m = /^#?([\da-f]{2})([\da-f]{2})([\da-f]{2})$/i.exec(bgHex);
|
|
104
|
+
if (!m)
|
|
105
|
+
return '#0f172a';
|
|
106
|
+
const r = parseInt(m[1], 16), g = parseInt(m[2], 16), b = parseInt(m[3], 16);
|
|
107
|
+
const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;
|
|
108
|
+
return luminance > 0.6 ? '#0f172a' : '#ffffff';
|
|
109
|
+
}
|
|
110
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
111
|
+
// Styles
|
|
112
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
113
|
+
const headerStyle = {
|
|
114
|
+
display: 'flex',
|
|
115
|
+
alignItems: 'center',
|
|
116
|
+
justifyContent: 'space-between',
|
|
117
|
+
gap: 16,
|
|
118
|
+
padding: '10px 20px',
|
|
119
|
+
background: '#ffffff',
|
|
120
|
+
borderBottom: '1px solid #e2e8f0',
|
|
121
|
+
fontFamily: "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif",
|
|
122
|
+
color: '#0f172a',
|
|
123
|
+
minHeight: 56,
|
|
124
|
+
boxSizing: 'border-box',
|
|
125
|
+
};
|
|
126
|
+
const leftStyle = {
|
|
127
|
+
display: 'inline-flex',
|
|
128
|
+
alignItems: 'center',
|
|
129
|
+
gap: 8,
|
|
130
|
+
minWidth: 0,
|
|
131
|
+
flexShrink: 0,
|
|
132
|
+
};
|
|
133
|
+
const separatorStyle = {
|
|
134
|
+
color: '#cbd5e1',
|
|
135
|
+
fontSize: 12,
|
|
136
|
+
margin: '0 2px',
|
|
137
|
+
};
|
|
138
|
+
const companyLabelStyle = {
|
|
139
|
+
fontSize: 13,
|
|
140
|
+
fontWeight: 500,
|
|
141
|
+
whiteSpace: 'nowrap',
|
|
142
|
+
overflow: 'hidden',
|
|
143
|
+
textOverflow: 'ellipsis',
|
|
144
|
+
maxWidth: 240,
|
|
145
|
+
};
|
|
146
|
+
const iconImgWrapperStyle = {
|
|
147
|
+
width: 22,
|
|
148
|
+
height: 22,
|
|
149
|
+
borderRadius: 5,
|
|
150
|
+
overflow: 'hidden',
|
|
151
|
+
display: 'inline-flex',
|
|
152
|
+
alignItems: 'center',
|
|
153
|
+
justifyContent: 'center',
|
|
154
|
+
background: '#ffffff',
|
|
155
|
+
border: '1px solid #e2e8f0',
|
|
156
|
+
flexShrink: 0,
|
|
157
|
+
};
|
|
158
|
+
const iconImgStyle = {
|
|
159
|
+
width: '100%',
|
|
160
|
+
height: '100%',
|
|
161
|
+
objectFit: 'cover',
|
|
162
|
+
display: 'block',
|
|
163
|
+
};
|
|
164
|
+
const iconFallbackStyle = {
|
|
165
|
+
width: 22,
|
|
166
|
+
height: 22,
|
|
167
|
+
borderRadius: 5,
|
|
168
|
+
fontSize: 11,
|
|
169
|
+
fontWeight: 700,
|
|
170
|
+
display: 'inline-flex',
|
|
171
|
+
alignItems: 'center',
|
|
172
|
+
justifyContent: 'center',
|
|
173
|
+
flexShrink: 0,
|
|
174
|
+
letterSpacing: '0.02em',
|
|
175
|
+
};
|
|
176
|
+
const centreStyle = {
|
|
177
|
+
display: 'inline-flex',
|
|
178
|
+
alignItems: 'center',
|
|
179
|
+
gap: 20,
|
|
180
|
+
flex: 1,
|
|
181
|
+
marginLeft: 24,
|
|
182
|
+
minWidth: 0,
|
|
183
|
+
};
|
|
184
|
+
const linkStyle = {
|
|
185
|
+
fontSize: 14,
|
|
186
|
+
color: '#374151',
|
|
187
|
+
textDecoration: 'none',
|
|
188
|
+
fontWeight: 500,
|
|
189
|
+
transition: 'color 120ms',
|
|
190
|
+
};
|
|
191
|
+
const rightStyle = {
|
|
192
|
+
display: 'inline-flex',
|
|
193
|
+
alignItems: 'center',
|
|
194
|
+
gap: 8,
|
|
195
|
+
flexShrink: 0,
|
|
196
|
+
};
|
|
197
|
+
//# sourceMappingURL=UniversalNavBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UniversalNavBar.js","sourceRoot":"","sources":["../src/UniversalNavBar.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type CSSProperties, type MouseEvent } from 'react';
|
|
2
|
+
export interface UserProfileProps {
|
|
3
|
+
/** Display name. Used to derive initials if none provided. */
|
|
4
|
+
name?: string;
|
|
5
|
+
/** Email address, shown beneath the name in the dropdown. */
|
|
6
|
+
email?: string;
|
|
7
|
+
/** Profile photo URL. When present, renders as an <img>. */
|
|
8
|
+
photoUrl?: string | null;
|
|
9
|
+
/** Override the initials shown in the avatar fallback. */
|
|
10
|
+
initials?: string;
|
|
11
|
+
/** Link to the profile page. Defaults to "/profile". */
|
|
12
|
+
profileHref?: string;
|
|
13
|
+
/** Click handler for sign-out. If omitted, the sign-out item is hidden. */
|
|
14
|
+
onSignOut?: (e: MouseEvent<HTMLButtonElement>) => void;
|
|
15
|
+
/** aria-label for the trigger. Defaults to "Profile". */
|
|
16
|
+
ariaLabel?: string;
|
|
17
|
+
style?: CSSProperties;
|
|
18
|
+
className?: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function UserProfile({ name, email, photoUrl, initials, profileHref, onSignOut, ariaLabel, style, className, }: UserProfileProps): import("react/jsx-runtime").JSX.Element;
|
|
21
|
+
//# sourceMappingURL=UserProfile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UserProfile.d.ts","sourceRoot":"","sources":["../src/UserProfile.tsx"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,aAAa,EAClB,KAAK,UAAU,EAEhB,MAAM,OAAO,CAAA;AAMd,MAAM,WAAW,gBAAgB;IAC/B,8DAA8D;IAC9D,IAAI,CAAC,EAAM,MAAM,CAAA;IACjB,6DAA6D;IAC7D,KAAK,CAAC,EAAK,MAAM,CAAA;IACjB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,wDAAwD;IACxD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,2EAA2E;IAC3E,SAAS,CAAC,EAAI,CAAC,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAA;IACxD,yDAAyD;IACzD,SAAS,CAAC,EAAI,MAAM,CAAA;IACpB,KAAK,CAAC,EAAQ,aAAa,CAAA;IAC3B,SAAS,CAAC,EAAI,MAAM,CAAA;CACrB;AAMD,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,WAAwB,EACxB,SAAS,EACT,SAAqB,EACrB,KAAK,EACL,SAAS,GACV,EAAE,gBAAgB,2CAsFlB"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useState, useRef, useEffect, } from 'react';
|
|
4
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
5
|
+
// Component
|
|
6
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
7
|
+
export function UserProfile({ name, email, photoUrl, initials, profileHref = '/profile', onSignOut, ariaLabel = 'Profile', style, className, }) {
|
|
8
|
+
const [open, setOpen] = useState(false);
|
|
9
|
+
const wrapRef = useRef(null);
|
|
10
|
+
const closeTimer = useRef(null);
|
|
11
|
+
function openNow() {
|
|
12
|
+
if (closeTimer.current)
|
|
13
|
+
clearTimeout(closeTimer.current);
|
|
14
|
+
setOpen(true);
|
|
15
|
+
}
|
|
16
|
+
function closeSoon() {
|
|
17
|
+
if (closeTimer.current)
|
|
18
|
+
clearTimeout(closeTimer.current);
|
|
19
|
+
closeTimer.current = setTimeout(() => setOpen(false), 220);
|
|
20
|
+
}
|
|
21
|
+
useEffect(() => {
|
|
22
|
+
function onDown(e) {
|
|
23
|
+
if (wrapRef.current && !wrapRef.current.contains(e.target))
|
|
24
|
+
setOpen(false);
|
|
25
|
+
}
|
|
26
|
+
function onKey(e) {
|
|
27
|
+
if (e.key === 'Escape')
|
|
28
|
+
setOpen(false);
|
|
29
|
+
}
|
|
30
|
+
document.addEventListener('mousedown', onDown);
|
|
31
|
+
document.addEventListener('keydown', onKey);
|
|
32
|
+
return () => {
|
|
33
|
+
document.removeEventListener('mousedown', onDown);
|
|
34
|
+
document.removeEventListener('keydown', onKey);
|
|
35
|
+
};
|
|
36
|
+
}, []);
|
|
37
|
+
// Derive initials when not explicitly passed in.
|
|
38
|
+
const derivedInitials = initials ?? deriveInitials(name) ?? '?';
|
|
39
|
+
return (_jsxs("div", { ref: wrapRef, className: className, style: { position: 'relative', display: 'inline-block', ...style }, onMouseEnter: openNow, onMouseLeave: closeSoon, children: [_jsx("button", { type: "button", "aria-label": ariaLabel, "aria-expanded": open, "aria-haspopup": "true", onClick: () => setOpen((v) => !v), onFocus: openNow, style: triggerStyle, children: photoUrl ? (_jsx("img", { src: photoUrl, alt: "", "aria-hidden": true, style: avatarImgStyle })) : (_jsx("span", { style: avatarFallbackStyle, children: derivedInitials })) }), _jsxs("div", { role: "menu", style: menuStyle(open), children: [(name || email) && (_jsxs("div", { style: headerStyle, children: [name && _jsx("div", { style: nameStyle, children: name }), email && _jsx("div", { style: emailStyle, children: email })] })), _jsxs("a", { role: "menuitem", href: profileHref, style: itemStyle, onMouseEnter: hoverIn, onMouseLeave: hoverOut, children: [_jsx(IconUser, {}), " View profile"] }), onSignOut && (_jsxs(_Fragment, { children: [_jsx(Divider, {}), _jsxs("button", { type: "button", role: "menuitem", onClick: onSignOut, style: dangerItemStyle, onMouseEnter: dangerHoverIn, onMouseLeave: dangerHoverOut, children: [_jsx(IconLogout, {}), " Sign out"] })] }))] })] }));
|
|
40
|
+
}
|
|
41
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
42
|
+
// Helpers
|
|
43
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
44
|
+
function deriveInitials(name) {
|
|
45
|
+
if (!name)
|
|
46
|
+
return undefined;
|
|
47
|
+
const parts = name.trim().split(/\s+/);
|
|
48
|
+
if (parts.length === 0)
|
|
49
|
+
return undefined;
|
|
50
|
+
if (parts.length === 1)
|
|
51
|
+
return parts[0].slice(0, 2).toUpperCase();
|
|
52
|
+
return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();
|
|
53
|
+
}
|
|
54
|
+
function hoverIn(e) { e.currentTarget.style.background = '#f3f4f6'; e.currentTarget.style.color = '#111827'; }
|
|
55
|
+
function hoverOut(e) { e.currentTarget.style.background = 'transparent'; e.currentTarget.style.color = '#374151'; }
|
|
56
|
+
function dangerHoverIn(e) { e.currentTarget.style.background = '#fef2f2'; e.currentTarget.style.color = '#b91c1c'; }
|
|
57
|
+
function dangerHoverOut(e) { e.currentTarget.style.background = 'transparent'; e.currentTarget.style.color = '#dc2626'; }
|
|
58
|
+
function Divider() {
|
|
59
|
+
return _jsx("div", { style: { height: 1, background: '#e5e7eb', margin: '4px 0' }, "aria-hidden": true });
|
|
60
|
+
}
|
|
61
|
+
function IconUser() {
|
|
62
|
+
return (_jsxs("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": true, children: [_jsx("path", { d: "M20 21v-2a4 4 0 00-4-4H8a4 4 0 00-4 4v2" }), _jsx("circle", { cx: "12", cy: "7", r: "4" })] }));
|
|
63
|
+
}
|
|
64
|
+
function IconLogout() {
|
|
65
|
+
return (_jsxs("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": true, children: [_jsx("path", { d: "M9 21H5a2 2 0 01-2-2V5a2 2 0 012-2h4" }), _jsx("polyline", { points: "16 17 21 12 16 7" }), _jsx("line", { x1: "21", y1: "12", x2: "9", y2: "12" })] }));
|
|
66
|
+
}
|
|
67
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
68
|
+
// Styles
|
|
69
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
70
|
+
const triggerStyle = {
|
|
71
|
+
display: 'inline-flex',
|
|
72
|
+
alignItems: 'center',
|
|
73
|
+
justifyContent: 'center',
|
|
74
|
+
width: 32,
|
|
75
|
+
height: 32,
|
|
76
|
+
borderRadius: '50%',
|
|
77
|
+
border: 0,
|
|
78
|
+
background: 'transparent',
|
|
79
|
+
cursor: 'pointer',
|
|
80
|
+
padding: 0,
|
|
81
|
+
overflow: 'hidden',
|
|
82
|
+
};
|
|
83
|
+
const avatarImgStyle = {
|
|
84
|
+
width: 32,
|
|
85
|
+
height: 32,
|
|
86
|
+
objectFit: 'cover',
|
|
87
|
+
borderRadius: '50%',
|
|
88
|
+
display: 'block',
|
|
89
|
+
};
|
|
90
|
+
const avatarFallbackStyle = {
|
|
91
|
+
width: 32,
|
|
92
|
+
height: 32,
|
|
93
|
+
borderRadius: '50%',
|
|
94
|
+
background: '#fff7ed',
|
|
95
|
+
border: '1px solid #fed7aa',
|
|
96
|
+
color: '#c2410c',
|
|
97
|
+
fontSize: 11,
|
|
98
|
+
fontWeight: 700,
|
|
99
|
+
display: 'inline-flex',
|
|
100
|
+
alignItems: 'center',
|
|
101
|
+
justifyContent: 'center',
|
|
102
|
+
letterSpacing: '0.04em',
|
|
103
|
+
};
|
|
104
|
+
function menuStyle(open) {
|
|
105
|
+
return {
|
|
106
|
+
position: 'absolute',
|
|
107
|
+
right: 0,
|
|
108
|
+
top: 'calc(100% + 8px)',
|
|
109
|
+
minWidth: 220,
|
|
110
|
+
background: '#ffffff',
|
|
111
|
+
border: '1px solid #e5e7eb',
|
|
112
|
+
borderRadius: 12,
|
|
113
|
+
boxShadow: '0 16px 32px -8px rgba(15,23,42,0.16), 0 4px 8px -2px rgba(15,23,42,0.08)',
|
|
114
|
+
padding: '6px 0',
|
|
115
|
+
opacity: open ? 1 : 0,
|
|
116
|
+
visibility: open ? 'visible' : 'hidden',
|
|
117
|
+
transform: open ? 'translateY(0)' : 'translateY(-4px)',
|
|
118
|
+
transition: 'opacity 150ms cubic-bezier(0.16,1,0.3,1), transform 150ms cubic-bezier(0.16,1,0.3,1), visibility 150ms',
|
|
119
|
+
zIndex: 50,
|
|
120
|
+
color: '#111827',
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
const headerStyle = {
|
|
124
|
+
padding: '8px 14px 10px',
|
|
125
|
+
borderBottom: '1px solid #e5e7eb',
|
|
126
|
+
marginBottom: 4,
|
|
127
|
+
minWidth: 0,
|
|
128
|
+
};
|
|
129
|
+
const nameStyle = {
|
|
130
|
+
fontSize: 13,
|
|
131
|
+
fontWeight: 600,
|
|
132
|
+
color: '#0f172a',
|
|
133
|
+
overflow: 'hidden',
|
|
134
|
+
textOverflow: 'ellipsis',
|
|
135
|
+
whiteSpace: 'nowrap',
|
|
136
|
+
};
|
|
137
|
+
const emailStyle = {
|
|
138
|
+
fontSize: 11,
|
|
139
|
+
color: '#64748b',
|
|
140
|
+
marginTop: 2,
|
|
141
|
+
overflow: 'hidden',
|
|
142
|
+
textOverflow: 'ellipsis',
|
|
143
|
+
whiteSpace: 'nowrap',
|
|
144
|
+
};
|
|
145
|
+
const itemStyle = {
|
|
146
|
+
display: 'flex',
|
|
147
|
+
alignItems: 'center',
|
|
148
|
+
gap: 10,
|
|
149
|
+
padding: '8px 14px',
|
|
150
|
+
fontSize: 13,
|
|
151
|
+
color: '#374151',
|
|
152
|
+
background: 'transparent',
|
|
153
|
+
border: 0,
|
|
154
|
+
cursor: 'pointer',
|
|
155
|
+
width: '100%',
|
|
156
|
+
textAlign: 'left',
|
|
157
|
+
textDecoration: 'none',
|
|
158
|
+
fontFamily: 'inherit',
|
|
159
|
+
transition: 'background 120ms, color 120ms',
|
|
160
|
+
};
|
|
161
|
+
const dangerItemStyle = {
|
|
162
|
+
...itemStyle,
|
|
163
|
+
color: '#dc2626',
|
|
164
|
+
};
|
|
165
|
+
//# sourceMappingURL=UserProfile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UserProfile.js","sourceRoot":"","sources":["../src/UserProfile.tsx"],"names":[],"mappings":"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"}
|
package/dist/auth.js
CHANGED
|
@@ -22,7 +22,7 @@ export function useOrg() {
|
|
|
22
22
|
setLoading(true);
|
|
23
23
|
supabase
|
|
24
24
|
.from('organisations')
|
|
25
|
-
.select('id, slug, name, logo_url, brand_color, billing_email')
|
|
25
|
+
.select('id, slug, name, logo_url, icon_url, brand_color, billing_email')
|
|
26
26
|
.then(({ data, error }) => {
|
|
27
27
|
if (cancelled)
|
|
28
28
|
return;
|
package/dist/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAQ5C,MAAM,UAAU,OAAO;IACrB,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,YAAY,EAAE,CAAA;IAC3C,OAAO;QACL,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI;QACvF,OAAO;KACR,CAAA;AACH,CAAC;AASD,MAAM,UAAU,MAAM;IACpB,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,GAAG,YAAY,EAAE,CAAA;IACzE,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAiB,EAAE,CAAC,CAAA;IACpD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;IAE5C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,EAAE,CAAC,CAAA;YACX,UAAU,CAAC,KAAK,CAAC,CAAA;YACjB,OAAM;QACR,CAAC;QAED,IAAI,SAAS,GAAG,KAAK,CAAA;QACrB,UAAU,CAAC,IAAI,CAAC,CAAA;QAEhB,QAAQ;aACL,IAAI,CAAC,eAAe,CAAC;aACrB,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAQ5C,MAAM,UAAU,OAAO;IACrB,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,YAAY,EAAE,CAAA;IAC3C,OAAO;QACL,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI;QACvF,OAAO;KACR,CAAA;AACH,CAAC;AASD,MAAM,UAAU,MAAM;IACpB,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,GAAG,YAAY,EAAE,CAAA;IACzE,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAiB,EAAE,CAAC,CAAA;IACpD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;IAE5C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,EAAE,CAAC,CAAA;YACX,UAAU,CAAC,KAAK,CAAC,CAAA;YACjB,OAAM;QACR,CAAC;QAED,IAAI,SAAS,GAAG,KAAK,CAAA;QACrB,UAAU,CAAC,IAAI,CAAC,CAAA;QAEhB,QAAQ;aACL,IAAI,CAAC,eAAe,CAAC;aACrB,MAAM,CAAC,gEAAgE,CAAC;aACxE,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;YACxB,IAAI,SAAS;gBAAE,OAAM;YACrB,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,KAAK,CAAC,2CAA2C,EAAE,KAAK,CAAC,CAAA;gBACjE,OAAO,CAAC,EAAE,CAAC,CAAA;YACb,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAA;gBACnB,IAAI,CAAC,WAAW,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC5C,cAAc,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,CAAA;gBAC7B,CAAC;YACH,CAAC;YACD,UAAU,CAAC,KAAK,CAAC,CAAA;QACnB,CAAC,CAAC,CAAA;QAEJ,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,IAAI,CAAA;QAClB,CAAC,CAAA;IACH,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC,CAAA;IAEpD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,WAAW,CAAC,IAAI,IAAI,CAAA;IAE1D,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,CAAA;AAC7D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,QAAqD,EACrD,KAAa,EACb,QAAgB;IAEhB,OAAO,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;AAC9D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,QAAqD;IACjF,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAA;AAChC,CAAC"}
|
package/dist/branding.d.ts
CHANGED
|
@@ -2,6 +2,10 @@ import type { OrgBranding } from './types.js';
|
|
|
2
2
|
/**
|
|
3
3
|
* Returns the active org's branding for product UI chrome.
|
|
4
4
|
* Falls back to suite defaults if no org is active or no branding is set.
|
|
5
|
+
*
|
|
6
|
+
* `logo_url` is the full wordmark / horizontal lockup (used in PDFs, hero
|
|
7
|
+
* areas, etc.); `icon_url` is the 1:1 square mark used in compact surfaces
|
|
8
|
+
* like the navbar company badge and suite-switcher tiles.
|
|
5
9
|
*/
|
|
6
10
|
export declare function useOrgBranding(): OrgBranding;
|
|
7
11
|
//# sourceMappingURL=branding.d.ts.map
|
package/dist/branding.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"branding.d.ts","sourceRoot":"","sources":["../src/branding.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"branding.d.ts","sourceRoot":"","sources":["../src/branding.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAQ7C;;;;;;;GAOG;AACH,wBAAgB,cAAc,IAAI,WAAW,CAQ5C"}
|
package/dist/branding.js
CHANGED
|
@@ -2,11 +2,16 @@
|
|
|
2
2
|
import { useOrg } from './auth.js';
|
|
3
3
|
const DEFAULT_BRANDING = {
|
|
4
4
|
logo_url: null,
|
|
5
|
+
icon_url: null,
|
|
5
6
|
brand_color: null,
|
|
6
7
|
};
|
|
7
8
|
/**
|
|
8
9
|
* Returns the active org's branding for product UI chrome.
|
|
9
10
|
* Falls back to suite defaults if no org is active or no branding is set.
|
|
11
|
+
*
|
|
12
|
+
* `logo_url` is the full wordmark / horizontal lockup (used in PDFs, hero
|
|
13
|
+
* areas, etc.); `icon_url` is the 1:1 square mark used in compact surfaces
|
|
14
|
+
* like the navbar company badge and suite-switcher tiles.
|
|
10
15
|
*/
|
|
11
16
|
export function useOrgBranding() {
|
|
12
17
|
const { org } = useOrg();
|
|
@@ -14,6 +19,7 @@ export function useOrgBranding() {
|
|
|
14
19
|
return DEFAULT_BRANDING;
|
|
15
20
|
return {
|
|
16
21
|
logo_url: org.logo_url,
|
|
22
|
+
icon_url: org.icon_url,
|
|
17
23
|
brand_color: org.brand_color,
|
|
18
24
|
};
|
|
19
25
|
}
|
package/dist/branding.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"branding.js","sourceRoot":"","sources":["../src/branding.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAGlC,MAAM,gBAAgB,GAAgB;IACpC,QAAQ,
|
|
1
|
+
{"version":3,"file":"branding.js","sourceRoot":"","sources":["../src/branding.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAGlC,MAAM,gBAAgB,GAAgB;IACpC,QAAQ,EAAK,IAAI;IACjB,QAAQ,EAAK,IAAI;IACjB,WAAW,EAAE,IAAI;CAClB,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc;IAC5B,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,EAAE,CAAA;IACxB,IAAI,CAAC,GAAG;QAAE,OAAO,gBAAgB,CAAA;IACjC,OAAO;QACL,QAAQ,EAAK,GAAG,CAAC,QAAQ;QACzB,QAAQ,EAAK,GAAG,CAAC,QAAQ;QACzB,WAAW,EAAE,GAAG,CAAC,WAAW;KAC7B,CAAA;AACH,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -26,6 +26,14 @@ export { SuiteSwitcher, DEFAULT_SUITE_PRODUCTS, UKFlag } from './SuiteSwitcher.j
|
|
|
26
26
|
export type { SuiteSwitcherProps, SuiteProduct, SuiteProductId } from './SuiteSwitcher.js';
|
|
27
27
|
export { CompanyMenu, DEFAULT_COMPANY_URLS } from './CompanyMenu.js';
|
|
28
28
|
export type { CompanyMenuProps } from './CompanyMenu.js';
|
|
29
|
+
export { KnowledgeBaseMenu } from './KnowledgeBaseMenu.js';
|
|
30
|
+
export type { KnowledgeBaseMenuProps, KnowledgeBaseItem } from './KnowledgeBaseMenu.js';
|
|
31
|
+
export { SettingsMenu } from './SettingsMenu.js';
|
|
32
|
+
export type { SettingsMenuProps, SettingsItem } from './SettingsMenu.js';
|
|
33
|
+
export { UserProfile } from './UserProfile.js';
|
|
34
|
+
export type { UserProfileProps } from './UserProfile.js';
|
|
35
|
+
export { UniversalNavBar } from './UniversalNavBar.js';
|
|
36
|
+
export type { UniversalNavBarProps } from './UniversalNavBar.js';
|
|
29
37
|
export { useOrgMembers, useOrgSeats, useAuditLog, assignSeat, revokeSeat, reassignSeat, } from './admin.js';
|
|
30
38
|
export type { UseOrgMembersResult, UseOrgSeatsResult, UseAuditLogOptions, } from './admin.js';
|
|
31
39
|
export type { ProductCode, SubTier, OrgRole, SeatStatus, AccessSource, Profile, Organisation, OrgBranding, OrgMember, Subscription, Seat, SeatPool, ChangelogEntry, ChangelogRelease, ChangelogFeed, AuditLogEntry, Person, PersonRole, Team, TeamMembership, Place, PlaceType, Project, ProjectStatus, } from './types.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
|
+
'use client';
|
|
1
2
|
// @unisim/sdk — public API.
|
|
2
3
|
// Every product depends on this; no product should import @supabase/supabase-js directly.
|
|
4
|
+
//
|
|
5
|
+
// The 'use client' directive above is essential: Next 14 App Router needs the
|
|
6
|
+
// entry point of a re-exporting module to be client-marked so the consumer
|
|
7
|
+
// and provider end up in the *same* React context instance. Without it
|
|
8
|
+
// useUniversal() throws "must be called inside <UniversalProvider>" even
|
|
9
|
+
// when the provider is in the tree.
|
|
3
10
|
export { UniversalProvider, useUniversal } from './provider.js';
|
|
4
11
|
export { useUser, useOrg, signInWithPassword, signOut } from './auth.js';
|
|
5
12
|
export { useHasAccess, useHasFeature, useSeat } from './access.js';
|
|
@@ -15,5 +22,9 @@ export { TrialBadge, UpgradeWall } from './TrialUi.js';
|
|
|
15
22
|
export { UniversalBar } from './UniversalBar.js';
|
|
16
23
|
export { SuiteSwitcher, DEFAULT_SUITE_PRODUCTS, UKFlag } from './SuiteSwitcher.js';
|
|
17
24
|
export { CompanyMenu, DEFAULT_COMPANY_URLS } from './CompanyMenu.js';
|
|
25
|
+
export { KnowledgeBaseMenu } from './KnowledgeBaseMenu.js';
|
|
26
|
+
export { SettingsMenu } from './SettingsMenu.js';
|
|
27
|
+
export { UserProfile } from './UserProfile.js';
|
|
28
|
+
export { UniversalNavBar } from './UniversalNavBar.js';
|
|
18
29
|
export { useOrgMembers, useOrgSeats, useAuditLog, assignSeat, revokeSeat, reassignSeat, } from './admin.js';
|
|
19
30
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,0FAA0F;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AACZ,4BAA4B;AAC5B,0FAA0F;AAC1F,EAAE;AACF,8EAA8E;AAC9E,2EAA2E;AAC3E,uEAAuE;AACvE,yEAAyE;AACzE,oCAAoC;AAEpC,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAG/D,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGxE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAGlE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAG7C,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEnD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAE9C,OAAO,EACL,SAAS,EACT,QAAQ,EACR,kBAAkB,EAClB,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,UAAU,EACV,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,aAAa,CAAA;AAQpB,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAGjE,OAAO,EACL,WAAW,EACX,aAAa,EACb,mBAAmB,EACnB,aAAa,GACd,MAAM,eAAe,CAAA;AAOtB,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAGzC,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAG/D,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAGtD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAGhD,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAGlF,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAGpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAG1D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAGhD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAG9C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAGtD,OAAO,EACL,aAAa,EACb,WAAW,EACX,WAAW,EACX,UAAU,EACV,UAAU,EACV,YAAY,GACb,MAAM,YAAY,CAAA"}
|
package/dist/types.d.ts
CHANGED
|
@@ -14,11 +14,19 @@ export interface Organisation {
|
|
|
14
14
|
slug: string;
|
|
15
15
|
name: string;
|
|
16
16
|
logo_url: string | null;
|
|
17
|
+
/**
|
|
18
|
+
* Square 1:1 image used in compact surfaces (navbar company badge, suite
|
|
19
|
+
* switcher tiles). Falls back to a coloured initials tile when null.
|
|
20
|
+
* Separate from logo_url so wide/horizontal marks can stay un-cropped where
|
|
21
|
+
* they have room, and the navbar still gets something square to render.
|
|
22
|
+
*/
|
|
23
|
+
icon_url: string | null;
|
|
17
24
|
brand_color: string | null;
|
|
18
25
|
billing_email: string | null;
|
|
19
26
|
}
|
|
20
27
|
export interface OrgBranding {
|
|
21
28
|
logo_url: string | null;
|
|
29
|
+
icon_url: string | null;
|
|
22
30
|
brand_color: string | null;
|
|
23
31
|
}
|
|
24
32
|
export interface OrgMember {
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,61 +1,61 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@unisim/sdk",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Shared React SDK for the Universal Suite — auth, entitlements, usage telemetry, changelog, org admin.",
|
|
5
|
-
"license": "MIT",
|
|
6
|
-
"author": "Universal Simulation Ltd",
|
|
7
|
-
"keywords": [
|
|
8
|
-
"supabase",
|
|
9
|
-
"react",
|
|
10
|
-
"hooks",
|
|
11
|
-
"saas",
|
|
12
|
-
"multi-tenant",
|
|
13
|
-
"auth",
|
|
14
|
-
"rbac",
|
|
15
|
-
"universal-simulation"
|
|
16
|
-
],
|
|
17
|
-
"homepage": "https://github.com/universal-simulation-ltd/universal-platform/tree/main/packages/sdk#readme",
|
|
18
|
-
"repository": {
|
|
19
|
-
"type": "git",
|
|
20
|
-
"url": "git+https://github.com/universal-simulation-ltd/universal-platform.git",
|
|
21
|
-
"directory": "packages/sdk"
|
|
22
|
-
},
|
|
23
|
-
"bugs": {
|
|
24
|
-
"url": "https://github.com/universal-simulation-ltd/universal-platform/issues"
|
|
25
|
-
},
|
|
26
|
-
"type": "module",
|
|
27
|
-
"main": "./dist/index.js",
|
|
28
|
-
"module": "./dist/index.js",
|
|
29
|
-
"types": "./dist/index.d.ts",
|
|
30
|
-
"sideEffects": false,
|
|
31
|
-
"exports": {
|
|
32
|
-
".": {
|
|
33
|
-
"types": "./dist/index.d.ts",
|
|
34
|
-
"import": "./dist/index.js"
|
|
35
|
-
}
|
|
36
|
-
},
|
|
37
|
-
"files": [
|
|
38
|
-
"dist",
|
|
39
|
-
"README.md"
|
|
40
|
-
],
|
|
41
|
-
"scripts": {
|
|
42
|
-
"build": "tsc -p tsconfig.build.json",
|
|
43
|
-
"dev": "tsc -p tsconfig.build.json --watch",
|
|
44
|
-
"typecheck": "tsc --noEmit",
|
|
45
|
-
"prepublishOnly": "npm run typecheck && npm run build"
|
|
46
|
-
},
|
|
47
|
-
"peerDependencies": {
|
|
48
|
-
"react": "^18.0.0 || ^19.0.0"
|
|
49
|
-
},
|
|
50
|
-
"dependencies": {
|
|
51
|
-
"@supabase/supabase-js": "^2.45.0"
|
|
52
|
-
},
|
|
53
|
-
"devDependencies": {
|
|
54
|
-
"@types/react": "^18.3.0",
|
|
55
|
-
"react": "^18.3.0",
|
|
56
|
-
"typescript": "^5.7.2"
|
|
57
|
-
},
|
|
58
|
-
"publishConfig": {
|
|
59
|
-
"access": "public"
|
|
60
|
-
}
|
|
61
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@unisim/sdk",
|
|
3
|
+
"version": "0.3.1",
|
|
4
|
+
"description": "Shared React SDK for the Universal Suite — auth, entitlements, usage telemetry, changelog, org admin.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "Universal Simulation Ltd",
|
|
7
|
+
"keywords": [
|
|
8
|
+
"supabase",
|
|
9
|
+
"react",
|
|
10
|
+
"hooks",
|
|
11
|
+
"saas",
|
|
12
|
+
"multi-tenant",
|
|
13
|
+
"auth",
|
|
14
|
+
"rbac",
|
|
15
|
+
"universal-simulation"
|
|
16
|
+
],
|
|
17
|
+
"homepage": "https://github.com/universal-simulation-ltd/universal-platform/tree/main/packages/sdk#readme",
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "git+https://github.com/universal-simulation-ltd/universal-platform.git",
|
|
21
|
+
"directory": "packages/sdk"
|
|
22
|
+
},
|
|
23
|
+
"bugs": {
|
|
24
|
+
"url": "https://github.com/universal-simulation-ltd/universal-platform/issues"
|
|
25
|
+
},
|
|
26
|
+
"type": "module",
|
|
27
|
+
"main": "./dist/index.js",
|
|
28
|
+
"module": "./dist/index.js",
|
|
29
|
+
"types": "./dist/index.d.ts",
|
|
30
|
+
"sideEffects": false,
|
|
31
|
+
"exports": {
|
|
32
|
+
".": {
|
|
33
|
+
"types": "./dist/index.d.ts",
|
|
34
|
+
"import": "./dist/index.js"
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
"files": [
|
|
38
|
+
"dist",
|
|
39
|
+
"README.md"
|
|
40
|
+
],
|
|
41
|
+
"scripts": {
|
|
42
|
+
"build": "tsc -p tsconfig.build.json",
|
|
43
|
+
"dev": "tsc -p tsconfig.build.json --watch",
|
|
44
|
+
"typecheck": "tsc --noEmit",
|
|
45
|
+
"prepublishOnly": "npm run typecheck && npm run build"
|
|
46
|
+
},
|
|
47
|
+
"peerDependencies": {
|
|
48
|
+
"react": "^18.0.0 || ^19.0.0"
|
|
49
|
+
},
|
|
50
|
+
"dependencies": {
|
|
51
|
+
"@supabase/supabase-js": "^2.45.0"
|
|
52
|
+
},
|
|
53
|
+
"devDependencies": {
|
|
54
|
+
"@types/react": "^18.3.0",
|
|
55
|
+
"react": "^18.3.0",
|
|
56
|
+
"typescript": "^5.7.2"
|
|
57
|
+
},
|
|
58
|
+
"publishConfig": {
|
|
59
|
+
"access": "public"
|
|
60
|
+
}
|
|
61
|
+
}
|