Align workspace colors with landing palette
This commit is contained in:
parent
88c1db36fd
commit
130333c0df
@ -136,19 +136,19 @@ export default function LayoutAuthenticated({ children, permission }: Props) {
|
|||||||
const activePath = router.pathname.split('/')[1];
|
const activePath = router.pathname.split('/')[1];
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='min-h-screen bg-[#f7f5f1] text-[#17201b]'>
|
<div className='min-h-screen bg-[#fffdf9] text-[#19192d]'>
|
||||||
<aside
|
<aside
|
||||||
className={`fixed inset-y-0 left-0 z-40 w-64 border-r border-[#ded8cc] bg-[#fbfaf6] px-3 py-4 shadow-[16px_0_45px_rgba(23,32,27,0.08)] transition-transform duration-300 lg:translate-x-0 ${
|
className={`fixed inset-y-0 left-0 z-40 w-64 border-r border-[#19192d]/10 bg-[#fffdf9] px-3 py-4 shadow-[16px_0_45px_rgba(23,32,27,0.08)] transition-transform duration-300 lg:translate-x-0 ${
|
||||||
isAsideOpen ? 'translate-x-0' : '-translate-x-full'
|
isAsideOpen ? 'translate-x-0' : '-translate-x-full'
|
||||||
}`}
|
}`}
|
||||||
>
|
>
|
||||||
<div className='flex items-center justify-between'>
|
<div className='flex items-center justify-between'>
|
||||||
<Link href='/dashboard' className='flex items-center gap-3'>
|
<Link href='/dashboard' className='flex items-center gap-3'>
|
||||||
<span className='grid h-8 w-8 place-items-center rounded-full border border-[#d8b15e]/50 bg-[#245c4c] text-sm font-black text-white'>
|
<span className='grid h-8 w-8 place-items-center rounded-full border border-[#b17a1e]/50 bg-[#35b7a5] text-sm font-black text-white'>
|
||||||
CW
|
CW
|
||||||
</span>
|
</span>
|
||||||
<span>
|
<span>
|
||||||
<span className='block text-sm font-semibold uppercase tracking-[0.22em] text-[#9a6a2f]'>
|
<span className='block text-sm font-semibold uppercase tracking-[0.22em] text-[#b17a1e]'>
|
||||||
AppWizzy
|
AppWizzy
|
||||||
</span>
|
</span>
|
||||||
<span className='block text-lg font-semibold'>
|
<span className='block text-lg font-semibold'>
|
||||||
@ -158,18 +158,18 @@ export default function LayoutAuthenticated({ children, permission }: Props) {
|
|||||||
</Link>
|
</Link>
|
||||||
<button
|
<button
|
||||||
type='button'
|
type='button'
|
||||||
className='grid h-8 w-8 place-items-center rounded-full border border-[#ded8cc] text-[#526159] lg:hidden'
|
className='grid h-8 w-8 place-items-center rounded-full border border-[#19192d]/10 text-[#72798a] lg:hidden'
|
||||||
onClick={() => setIsAsideOpen(false)}
|
onClick={() => setIsAsideOpen(false)}
|
||||||
>
|
>
|
||||||
<BaseIcon path={mdiClose} size={18} />
|
<BaseIcon path={mdiClose} size={18} />
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className='mt-5 rounded-lg border border-[#ded8cc] bg-white p-4'>
|
<div className='mt-5 rounded-lg border border-[#19192d]/10 bg-white p-4'>
|
||||||
<p className='text-xs font-semibold uppercase tracking-[0.2em] text-[#9a6a2f]'>
|
<p className='text-xs font-semibold uppercase tracking-[0.2em] text-[#b17a1e]'>
|
||||||
Today
|
Today
|
||||||
</p>
|
</p>
|
||||||
<p className='mt-2 text-sm leading-6 text-[#5f6b64]'>
|
<p className='mt-2 text-sm leading-6 text-[#72798a]'>
|
||||||
Prepare, follow up, and keep every coaching relationship warm
|
Prepare, follow up, and keep every coaching relationship warm
|
||||||
between sessions.
|
between sessions.
|
||||||
</p>
|
</p>
|
||||||
@ -186,8 +186,8 @@ export default function LayoutAuthenticated({ children, permission }: Props) {
|
|||||||
href={item.href}
|
href={item.href}
|
||||||
className={`flex items-center gap-3 rounded-lg px-3 py-2 text-sm font-semibold transition ${
|
className={`flex items-center gap-3 rounded-lg px-3 py-2 text-sm font-semibold transition ${
|
||||||
isActive
|
isActive
|
||||||
? 'bg-[#245c4c] text-white shadow-[0_14px_28px_rgba(36,92,76,0.2)]'
|
? 'bg-[#35b7a5] text-white shadow-[0_14px_28px_rgba(36,92,76,0.2)]'
|
||||||
: 'text-[#56645d] hover:bg-[#efeae0] hover:text-[#17201b]'
|
: 'text-[#72798a] hover:bg-[#fbf8f1] hover:text-[#19192d]'
|
||||||
}`}
|
}`}
|
||||||
>
|
>
|
||||||
<BaseIcon path={item.icon} size={18} />
|
<BaseIcon path={item.icon} size={18} />
|
||||||
@ -197,8 +197,8 @@ export default function LayoutAuthenticated({ children, permission }: Props) {
|
|||||||
})}
|
})}
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
<div className='absolute inset-x-4 bottom-5 rounded-lg border border-[#ded8cc] bg-[#f0ede6] p-4'>
|
<div className='absolute inset-x-4 bottom-5 rounded-lg border border-[#19192d]/10 bg-[#fbf8f1] p-4'>
|
||||||
<p className='text-xs font-semibold uppercase tracking-[0.18em] text-[#9a6a2f]'>
|
<p className='text-xs font-semibold uppercase tracking-[0.18em] text-[#b17a1e]'>
|
||||||
Signed in
|
Signed in
|
||||||
</p>
|
</p>
|
||||||
<p className='mt-2 truncate text-sm font-semibold'>
|
<p className='mt-2 truncate text-sm font-semibold'>
|
||||||
@ -206,7 +206,7 @@ export default function LayoutAuthenticated({ children, permission }: Props) {
|
|||||||
</p>
|
</p>
|
||||||
<button
|
<button
|
||||||
type='button'
|
type='button'
|
||||||
className='mt-4 flex w-full items-center justify-center gap-2 rounded-full bg-[#17201b] px-3 py-1.5 text-sm font-semibold text-white'
|
className='mt-4 flex w-full items-center justify-center gap-2 rounded-full bg-[#19192d] px-3 py-1.5 text-sm font-semibold text-white'
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
dispatch(logoutUser());
|
dispatch(logoutUser());
|
||||||
router.push('/login');
|
router.push('/login');
|
||||||
@ -222,32 +222,32 @@ export default function LayoutAuthenticated({ children, permission }: Props) {
|
|||||||
<button
|
<button
|
||||||
type='button'
|
type='button'
|
||||||
aria-label='Close menu'
|
aria-label='Close menu'
|
||||||
className='fixed inset-0 z-30 bg-[#17201b]/40 lg:hidden'
|
className='fixed inset-0 z-30 bg-[#19192d]/40 lg:hidden'
|
||||||
onClick={() => setIsAsideOpen(false)}
|
onClick={() => setIsAsideOpen(false)}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
<div className='lg:pl-64'>
|
<div className='lg:pl-64'>
|
||||||
<header className='sticky top-0 z-20 border-b border-[#ded8cc]/80 bg-[#f7f5f1]/92 px-3 py-2 backdrop-blur lg:px-8'>
|
<header className='sticky top-0 z-20 border-b border-[#19192d]/10/80 bg-[#fffdf9]/92 px-3 py-2 backdrop-blur lg:px-8'>
|
||||||
<div className='flex items-center justify-between'>
|
<div className='flex items-center justify-between'>
|
||||||
<button
|
<button
|
||||||
type='button'
|
type='button'
|
||||||
className='grid h-8 w-8 place-items-center rounded-full border border-[#ded8cc] bg-white text-[#526159] lg:hidden'
|
className='grid h-8 w-8 place-items-center rounded-full border border-[#19192d]/10 bg-white text-[#72798a] lg:hidden'
|
||||||
onClick={() => setIsAsideOpen(true)}
|
onClick={() => setIsAsideOpen(true)}
|
||||||
>
|
>
|
||||||
<BaseIcon path={mdiMenu} size={18} />
|
<BaseIcon path={mdiMenu} size={18} />
|
||||||
</button>
|
</button>
|
||||||
<div className='hidden lg:block'>
|
<div className='hidden lg:block'>
|
||||||
<p className='text-xs font-semibold uppercase tracking-[0.22em] text-[#9a6a2f]'>
|
<p className='text-xs font-semibold uppercase tracking-[0.22em] text-[#b17a1e]'>
|
||||||
Workspace status
|
Workspace status
|
||||||
</p>
|
</p>
|
||||||
<p className='mt-1 text-sm text-[#647068]'>
|
<p className='mt-1 text-sm text-[#72798a]'>
|
||||||
Review sessions, clients, tasks, and shared client materials.
|
Review sessions, clients, tasks, and shared client materials.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<Link
|
<Link
|
||||||
href='/'
|
href='/'
|
||||||
className='rounded-full border border-[#ded8cc] bg-white px-3 py-1.5 text-sm font-semibold text-[#17201b] shadow-sm'
|
className='rounded-full border border-[#19192d]/10 bg-white px-3 py-1.5 text-sm font-semibold text-[#19192d] shadow-sm'
|
||||||
>
|
>
|
||||||
Public site
|
Public site
|
||||||
</Link>
|
</Link>
|
||||||
|
|||||||
@ -37,7 +37,7 @@ function Panel({
|
|||||||
}) {
|
}) {
|
||||||
return (
|
return (
|
||||||
<section
|
<section
|
||||||
className={`rounded-lg border border-[#ded8cc] bg-white shadow-[0_18px_60px_rgba(23,32,27,0.07)] ${className}`}
|
className={`rounded-lg border border-[#19192d]/10 bg-white shadow-[0_18px_60px_rgba(23,32,27,0.07)] ${className}`}
|
||||||
>
|
>
|
||||||
{children}
|
{children}
|
||||||
</section>
|
</section>
|
||||||
@ -87,8 +87,8 @@ const ClientPortal = () => {
|
|||||||
<SectionMain>
|
<SectionMain>
|
||||||
<div className='mx-auto max-w-7xl'>
|
<div className='mx-auto max-w-7xl'>
|
||||||
<div className='mb-4 grid gap-4 xl:grid-cols-[0.95fr_1.05fr]'>
|
<div className='mb-4 grid gap-4 xl:grid-cols-[0.95fr_1.05fr]'>
|
||||||
<div className='rounded-lg bg-[#17201b] p-5 text-white'>
|
<div className='rounded-lg bg-[#19192d] p-5 text-white'>
|
||||||
<div className='flex items-center gap-3 text-[#d8b15e]'>
|
<div className='flex items-center gap-3 text-[#b17a1e]'>
|
||||||
<BaseIcon path={mdiAccountCircle} size={18} />
|
<BaseIcon path={mdiAccountCircle} size={18} />
|
||||||
<span className='text-xs font-semibold uppercase tracking-[0.22em]'>
|
<span className='text-xs font-semibold uppercase tracking-[0.22em]'>
|
||||||
Client portal
|
Client portal
|
||||||
@ -97,19 +97,19 @@ const ClientPortal = () => {
|
|||||||
<h1 className='mt-3 text-xl font-semibold'>
|
<h1 className='mt-3 text-xl font-semibold'>
|
||||||
Client portal preview
|
Client portal preview
|
||||||
</h1>
|
</h1>
|
||||||
<p className='mt-2 max-w-2xl text-sm leading-6 text-[#d9d5ca]'>
|
<p className='mt-2 max-w-2xl text-sm leading-6 text-[#fffdf9]'>
|
||||||
Preview the client-facing workspace with shared notes,
|
Preview the client-facing workspace with shared notes,
|
||||||
commitments, resources, and a pre-session reflection prompt.
|
commitments, resources, and a pre-session reflection prompt.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<Panel className='p-4'>
|
<Panel className='p-4'>
|
||||||
<label className='block text-xs font-semibold uppercase tracking-[0.22em] text-[#9a6a2f]'>
|
<label className='block text-xs font-semibold uppercase tracking-[0.22em] text-[#b17a1e]'>
|
||||||
Preview as client
|
Preview as client
|
||||||
</label>
|
</label>
|
||||||
<select
|
<select
|
||||||
value={clientId}
|
value={clientId}
|
||||||
onChange={(event) => setClientId(event.target.value)}
|
onChange={(event) => setClientId(event.target.value)}
|
||||||
className='mt-4 w-full rounded-lg border border-[#d8d1c2] bg-white px-3 py-2 text-[#17201b] outline-none focus:border-[#245c4c] focus:ring-2 focus:ring-[#245c4c]/15'
|
className='mt-4 w-full rounded-lg border border-[#19192d]/10 bg-white px-3 py-2 text-[#19192d] outline-none focus:border-[#35b7a5] focus:ring-2 focus:ring-[#35b7a5]/15'
|
||||||
>
|
>
|
||||||
{clients.map((client) => (
|
{clients.map((client) => (
|
||||||
<option key={client.id} value={client.id}>
|
<option key={client.id} value={client.id}>
|
||||||
@ -117,7 +117,7 @@ const ClientPortal = () => {
|
|||||||
</option>
|
</option>
|
||||||
))}
|
))}
|
||||||
</select>
|
</select>
|
||||||
<p className='mt-4 text-sm leading-6 text-[#68736c]'>
|
<p className='mt-4 text-sm leading-6 text-[#72798a]'>
|
||||||
MVP note: this is still a coach-visible preview. Final client
|
MVP note: this is still a coach-visible preview. Final client
|
||||||
access should be a client role or magic-link route.
|
access should be a client role or magic-link route.
|
||||||
</p>
|
</p>
|
||||||
@ -127,28 +127,28 @@ const ClientPortal = () => {
|
|||||||
{portalClient && (
|
{portalClient && (
|
||||||
<div className='grid gap-4 xl:grid-cols-[1.05fr_0.95fr]'>
|
<div className='grid gap-4 xl:grid-cols-[1.05fr_0.95fr]'>
|
||||||
<Panel className='overflow-hidden'>
|
<Panel className='overflow-hidden'>
|
||||||
<div className='bg-[#fbfaf6] p-5'>
|
<div className='bg-[#fffdf9] p-5'>
|
||||||
<p className='text-xs font-semibold uppercase tracking-[0.22em] text-[#9a6a2f]'>
|
<p className='text-xs font-semibold uppercase tracking-[0.22em] text-[#b17a1e]'>
|
||||||
Your coaching workspace
|
Your coaching workspace
|
||||||
</p>
|
</p>
|
||||||
<h2 className='mt-2 text-xl font-semibold text-[#17201b]'>
|
<h2 className='mt-2 text-xl font-semibold text-[#19192d]'>
|
||||||
{portalClient.name}
|
{portalClient.name}
|
||||||
</h2>
|
</h2>
|
||||||
<p className='mt-4 max-w-2xl leading-6 text-[#4f5a53]'>
|
<p className='mt-4 max-w-2xl leading-6 text-[#72798a]'>
|
||||||
{portalClient.goals}
|
{portalClient.goals}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className='p-5'>
|
<div className='p-5'>
|
||||||
<div className='flex items-center gap-3'>
|
<div className='flex items-center gap-3'>
|
||||||
<span className='grid h-8 w-8 place-items-center rounded-full bg-[#e8f1ec] text-[#245c4c]'>
|
<span className='grid h-8 w-8 place-items-center rounded-full bg-[#f3fbf8] text-[#35b7a5]'>
|
||||||
<BaseIcon path={mdiMessageReplyTextOutline} size={18} />
|
<BaseIcon path={mdiMessageReplyTextOutline} size={18} />
|
||||||
</span>
|
</span>
|
||||||
<div>
|
<div>
|
||||||
<h3 className='text-lg font-semibold text-[#17201b]'>
|
<h3 className='text-lg font-semibold text-[#19192d]'>
|
||||||
Shared session notes
|
Shared session notes
|
||||||
</h3>
|
</h3>
|
||||||
<p className='text-sm text-[#68736c]'>
|
<p className='text-sm text-[#72798a]'>
|
||||||
Only coach-approved notes appear here.
|
Only coach-approved notes appear here.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
@ -158,12 +158,12 @@ const ClientPortal = () => {
|
|||||||
{(portalClient.sessions || []).map((session) => (
|
{(portalClient.sessions || []).map((session) => (
|
||||||
<div
|
<div
|
||||||
key={session.id}
|
key={session.id}
|
||||||
className='rounded-lg border border-[#ded8cc] bg-white p-5'
|
className='rounded-lg border border-[#19192d]/10 bg-white p-5'
|
||||||
>
|
>
|
||||||
<p className='font-semibold text-[#17201b]'>
|
<p className='font-semibold text-[#19192d]'>
|
||||||
{session.title}
|
{session.title}
|
||||||
</p>
|
</p>
|
||||||
<p className='mt-3 leading-6 text-[#4f5a53]'>
|
<p className='mt-3 leading-6 text-[#72798a]'>
|
||||||
{session.shared_client_notes}
|
{session.shared_client_notes}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
@ -174,8 +174,8 @@ const ClientPortal = () => {
|
|||||||
|
|
||||||
<div className='space-y-6'>
|
<div className='space-y-6'>
|
||||||
<Panel>
|
<Panel>
|
||||||
<div className='border-b border-[#ded8cc] p-5'>
|
<div className='border-b border-[#19192d]/10 p-5'>
|
||||||
<h3 className='text-lg font-semibold text-[#17201b]'>
|
<h3 className='text-lg font-semibold text-[#19192d]'>
|
||||||
Commitments
|
Commitments
|
||||||
</h3>
|
</h3>
|
||||||
</div>
|
</div>
|
||||||
@ -183,16 +183,16 @@ const ClientPortal = () => {
|
|||||||
{(portalClient.action_items || []).map((item) => (
|
{(portalClient.action_items || []).map((item) => (
|
||||||
<div
|
<div
|
||||||
key={item.id}
|
key={item.id}
|
||||||
className='flex gap-3 rounded-lg border border-[#ded8cc] bg-[#fbfaf6] p-4'
|
className='flex gap-3 rounded-lg border border-[#19192d]/10 bg-[#fffdf9] p-4'
|
||||||
>
|
>
|
||||||
<span className='mt-0.5 grid h-8 w-8 flex-none place-items-center rounded-full bg-[#245c4c] text-white'>
|
<span className='mt-0.5 grid h-8 w-8 flex-none place-items-center rounded-full bg-[#35b7a5] text-white'>
|
||||||
<BaseIcon path={mdiCheckCircleOutline} size={18} />
|
<BaseIcon path={mdiCheckCircleOutline} size={18} />
|
||||||
</span>
|
</span>
|
||||||
<div>
|
<div>
|
||||||
<p className='font-semibold text-[#17201b]'>
|
<p className='font-semibold text-[#19192d]'>
|
||||||
{item.title}
|
{item.title}
|
||||||
</p>
|
</p>
|
||||||
<p className='mt-1 text-sm text-[#68736c]'>
|
<p className='mt-1 text-sm text-[#72798a]'>
|
||||||
{item.status.replace('_', ' ')}
|
{item.status.replace('_', ' ')}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
@ -202,8 +202,8 @@ const ClientPortal = () => {
|
|||||||
</Panel>
|
</Panel>
|
||||||
|
|
||||||
<Panel>
|
<Panel>
|
||||||
<div className='border-b border-[#ded8cc] p-5'>
|
<div className='border-b border-[#19192d]/10 p-5'>
|
||||||
<h3 className='text-lg font-semibold text-[#17201b]'>
|
<h3 className='text-lg font-semibold text-[#19192d]'>
|
||||||
Resources
|
Resources
|
||||||
</h3>
|
</h3>
|
||||||
</div>
|
</div>
|
||||||
@ -212,17 +212,17 @@ const ClientPortal = () => {
|
|||||||
<a
|
<a
|
||||||
key={resource.id}
|
key={resource.id}
|
||||||
href={resource.url}
|
href={resource.url}
|
||||||
className='flex items-center justify-between gap-4 rounded-lg border border-[#ded8cc] bg-white p-4 transition hover:bg-[#fbfaf6]'
|
className='flex items-center justify-between gap-4 rounded-lg border border-[#19192d]/10 bg-white p-4 transition hover:bg-[#fffdf9]'
|
||||||
>
|
>
|
||||||
<div className='flex gap-3'>
|
<div className='flex gap-3'>
|
||||||
<span className='grid h-8 w-8 place-items-center rounded-full bg-[#f0ede6] text-[#9a6a2f]'>
|
<span className='grid h-8 w-8 place-items-center rounded-full bg-[#fbf8f1] text-[#b17a1e]'>
|
||||||
<BaseIcon path={mdiBookOpenVariant} size={18} />
|
<BaseIcon path={mdiBookOpenVariant} size={18} />
|
||||||
</span>
|
</span>
|
||||||
<div>
|
<div>
|
||||||
<p className='font-semibold text-[#17201b]'>
|
<p className='font-semibold text-[#19192d]'>
|
||||||
{resource.title}
|
{resource.title}
|
||||||
</p>
|
</p>
|
||||||
<p className='mt-1 text-sm leading-6 text-[#68736c]'>
|
<p className='mt-1 text-sm leading-6 text-[#72798a]'>
|
||||||
{resource.description}
|
{resource.description}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
@ -230,21 +230,21 @@ const ClientPortal = () => {
|
|||||||
<BaseIcon
|
<BaseIcon
|
||||||
path={mdiChevronRight}
|
path={mdiChevronRight}
|
||||||
size={18}
|
size={18}
|
||||||
className='text-[#245c4c]'
|
className='text-[#35b7a5]'
|
||||||
/>
|
/>
|
||||||
</a>
|
</a>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
</Panel>
|
</Panel>
|
||||||
|
|
||||||
<Panel className='bg-[#e8f1ec] p-4'>
|
<Panel className='bg-[#f3fbf8] p-4'>
|
||||||
<p className='text-xs font-semibold uppercase tracking-[0.22em] text-[#245c4c]'>
|
<p className='text-xs font-semibold uppercase tracking-[0.22em] text-[#35b7a5]'>
|
||||||
Pre-session reflection
|
Pre-session reflection
|
||||||
</p>
|
</p>
|
||||||
<h3 className='mt-2 text-lg font-semibold text-[#17201b]'>
|
<h3 className='mt-2 text-lg font-semibold text-[#19192d]'>
|
||||||
What changed since last time?
|
What changed since last time?
|
||||||
</h3>
|
</h3>
|
||||||
<p className='mt-3 leading-6 text-[#4f5a53]'>
|
<p className='mt-3 leading-6 text-[#72798a]'>
|
||||||
Final MVP should let the client answer this before a
|
Final MVP should let the client answer this before a
|
||||||
session, then feed the response into the coach prep brief.
|
session, then feed the response into the coach prep brief.
|
||||||
</p>
|
</p>
|
||||||
|
|||||||
@ -55,7 +55,7 @@ function Panel({
|
|||||||
}) {
|
}) {
|
||||||
return (
|
return (
|
||||||
<section
|
<section
|
||||||
className={`rounded-lg border border-[#ded8cc] bg-white shadow-[0_18px_60px_rgba(23,32,27,0.07)] ${className}`}
|
className={`rounded-lg border border-[#19192d]/10 bg-white shadow-[0_18px_60px_rgba(23,32,27,0.07)] ${className}`}
|
||||||
>
|
>
|
||||||
{children}
|
{children}
|
||||||
</section>
|
</section>
|
||||||
@ -64,7 +64,7 @@ function Panel({
|
|||||||
|
|
||||||
function EmptyState({ label }: { label: string }) {
|
function EmptyState({ label }: { label: string }) {
|
||||||
return (
|
return (
|
||||||
<p className='rounded-lg border border-dashed border-[#d8d1c2] bg-[#fbfaf6] p-4 text-sm text-[#68736c]'>
|
<p className='rounded-lg border border-dashed border-[#19192d]/10 bg-[#fffdf9] p-4 text-sm text-[#72798a]'>
|
||||||
{label}
|
{label}
|
||||||
</p>
|
</p>
|
||||||
);
|
);
|
||||||
@ -113,33 +113,33 @@ const Clients = () => {
|
|||||||
</Head>
|
</Head>
|
||||||
<SectionMain>
|
<SectionMain>
|
||||||
<div className='mx-auto max-w-7xl'>
|
<div className='mx-auto max-w-7xl'>
|
||||||
<div className='mb-4 flex flex-col justify-between gap-4 rounded-lg bg-[#17201b] p-5 text-white md:flex-row md:items-end'>
|
<div className='mb-4 flex flex-col justify-between gap-4 rounded-lg bg-[#19192d] p-5 text-white md:flex-row md:items-end'>
|
||||||
<div>
|
<div>
|
||||||
<div className='flex items-center gap-3 text-[#d8b15e]'>
|
<div className='flex items-center gap-3 text-[#b17a1e]'>
|
||||||
<BaseIcon path={mdiAccountGroup} size={18} />
|
<BaseIcon path={mdiAccountGroup} size={18} />
|
||||||
<span className='text-xs font-semibold uppercase tracking-[0.22em]'>
|
<span className='text-xs font-semibold uppercase tracking-[0.22em]'>
|
||||||
Client CRM
|
Client CRM
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<h1 className='mt-3 text-xl font-semibold'>Client records</h1>
|
<h1 className='mt-3 text-xl font-semibold'>Client records</h1>
|
||||||
<p className='mt-2 max-w-2xl text-sm leading-6 text-[#d9d5ca]'>
|
<p className='mt-2 max-w-2xl text-sm leading-6 text-[#fffdf9]'>
|
||||||
Open a client record to review goals, coach notes, recent
|
Open a client record to review goals, coach notes, recent
|
||||||
sessions, and commitments.
|
sessions, and commitments.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div className='rounded-full bg-white/10 px-3 py-1.5 text-sm font-semibold text-[#f5ead5]'>
|
<div className='rounded-full bg-white/10 px-3 py-1.5 text-sm font-semibold text-[#fbf8f1]'>
|
||||||
{clients.length} clients
|
{clients.length} clients
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className='grid gap-4 xl:grid-cols-[0.85fr_1.15fr]'>
|
<div className='grid gap-4 xl:grid-cols-[0.85fr_1.15fr]'>
|
||||||
<Panel className='overflow-hidden'>
|
<Panel className='overflow-hidden'>
|
||||||
<div className='border-b border-[#ded8cc] p-5'>
|
<div className='border-b border-[#19192d]/10 p-5'>
|
||||||
<p className='text-xs font-semibold uppercase tracking-[0.22em] text-[#9a6a2f]'>
|
<p className='text-xs font-semibold uppercase tracking-[0.22em] text-[#b17a1e]'>
|
||||||
Coaching relationships
|
Coaching relationships
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div className='divide-y divide-[#eee8dc]'>
|
<div className='divide-y divide-[#19192d]/10'>
|
||||||
{clients.map((client) => (
|
{clients.map((client) => (
|
||||||
<button
|
<button
|
||||||
key={client.id}
|
key={client.id}
|
||||||
@ -147,20 +147,20 @@ const Clients = () => {
|
|||||||
onClick={() => selectClient(client.id)}
|
onClick={() => selectClient(client.id)}
|
||||||
className={`block w-full p-5 text-left transition ${
|
className={`block w-full p-5 text-left transition ${
|
||||||
selectedClient?.id === client.id
|
selectedClient?.id === client.id
|
||||||
? 'bg-[#e8f1ec]'
|
? 'bg-[#f3fbf8]'
|
||||||
: 'bg-white hover:bg-[#fbfaf6]'
|
: 'bg-white hover:bg-[#fffdf9]'
|
||||||
}`}
|
}`}
|
||||||
>
|
>
|
||||||
<div className='flex items-start justify-between gap-3'>
|
<div className='flex items-start justify-between gap-3'>
|
||||||
<div>
|
<div>
|
||||||
<p className='font-semibold text-[#17201b]'>
|
<p className='font-semibold text-[#19192d]'>
|
||||||
{client.name}
|
{client.name}
|
||||||
</p>
|
</p>
|
||||||
<p className='mt-1 text-sm text-[#68736c]'>
|
<p className='mt-1 text-sm text-[#72798a]'>
|
||||||
{client.role_title} · {client.company}
|
{client.role_title} · {client.company}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<span className='rounded-full bg-[#f0ede6] px-3 py-1 text-xs font-semibold text-[#6e5730]'>
|
<span className='rounded-full bg-[#fbf8f1] px-3 py-1 text-xs font-semibold text-[#b17a1e]'>
|
||||||
{client.status}
|
{client.status}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
@ -173,7 +173,7 @@ const Clients = () => {
|
|||||||
.map((tag) => (
|
.map((tag) => (
|
||||||
<span
|
<span
|
||||||
key={tag}
|
key={tag}
|
||||||
className='rounded-full bg-white px-3 py-1 text-xs text-[#68736c]'
|
className='rounded-full bg-white px-3 py-1 text-xs text-[#72798a]'
|
||||||
>
|
>
|
||||||
{tag}
|
{tag}
|
||||||
</span>
|
</span>
|
||||||
@ -189,22 +189,22 @@ const Clients = () => {
|
|||||||
<Panel className='p-4'>
|
<Panel className='p-4'>
|
||||||
<div className='flex flex-col justify-between gap-4 md:flex-row md:items-start'>
|
<div className='flex flex-col justify-between gap-4 md:flex-row md:items-start'>
|
||||||
<div>
|
<div>
|
||||||
<p className='text-xs font-semibold uppercase tracking-[0.22em] text-[#9a6a2f]'>
|
<p className='text-xs font-semibold uppercase tracking-[0.22em] text-[#b17a1e]'>
|
||||||
{selectedClient.package?.title || 'Coaching client'}
|
{selectedClient.package?.title || 'Coaching client'}
|
||||||
</p>
|
</p>
|
||||||
<h2 className='mt-2 text-xl font-semibold text-[#17201b]'>
|
<h2 className='mt-2 text-xl font-semibold text-[#19192d]'>
|
||||||
{selectedClient.name}
|
{selectedClient.name}
|
||||||
</h2>
|
</h2>
|
||||||
<p className='mt-2 text-[#68736c]'>
|
<p className='mt-2 text-[#72798a]'>
|
||||||
{selectedClient.email}
|
{selectedClient.email}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div className='rounded-lg border border-[#ded8cc] bg-[#fbfaf6] p-4 md:min-w-56'>
|
<div className='rounded-lg border border-[#19192d]/10 bg-[#fffdf9] p-4 md:min-w-56'>
|
||||||
<div className='flex items-center gap-2 text-sm font-semibold text-[#245c4c]'>
|
<div className='flex items-center gap-2 text-sm font-semibold text-[#35b7a5]'>
|
||||||
<BaseIcon path={mdiCalendarClock} size={18} />
|
<BaseIcon path={mdiCalendarClock} size={18} />
|
||||||
Next session
|
Next session
|
||||||
</div>
|
</div>
|
||||||
<p className='mt-2 text-sm text-[#68736c]'>
|
<p className='mt-2 text-sm text-[#72798a]'>
|
||||||
{selectedClient.next_session_at ||
|
{selectedClient.next_session_at ||
|
||||||
'No session scheduled'}
|
'No session scheduled'}
|
||||||
</p>
|
</p>
|
||||||
@ -212,21 +212,21 @@ const Clients = () => {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className='mt-4 grid gap-4 lg:grid-cols-2'>
|
<div className='mt-4 grid gap-4 lg:grid-cols-2'>
|
||||||
<div className='rounded-lg bg-[#f7f5f1] p-5'>
|
<div className='rounded-lg bg-[#fffdf9] p-5'>
|
||||||
<div className='flex items-center gap-2 text-sm font-semibold text-[#245c4c]'>
|
<div className='flex items-center gap-2 text-sm font-semibold text-[#35b7a5]'>
|
||||||
<BaseIcon path={mdiTarget} size={18} />
|
<BaseIcon path={mdiTarget} size={18} />
|
||||||
Goals
|
Goals
|
||||||
</div>
|
</div>
|
||||||
<p className='mt-3 leading-6 text-[#4f5a53]'>
|
<p className='mt-3 leading-6 text-[#72798a]'>
|
||||||
{selectedClient.goals}
|
{selectedClient.goals}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div className='rounded-lg bg-[#f7f5f1] p-5'>
|
<div className='rounded-lg bg-[#fffdf9] p-5'>
|
||||||
<div className='flex items-center gap-2 text-sm font-semibold text-[#245c4c]'>
|
<div className='flex items-center gap-2 text-sm font-semibold text-[#35b7a5]'>
|
||||||
<BaseIcon path={mdiFileDocumentOutline} size={18} />
|
<BaseIcon path={mdiFileDocumentOutline} size={18} />
|
||||||
Private coach notes
|
Private coach notes
|
||||||
</div>
|
</div>
|
||||||
<p className='mt-3 leading-6 text-[#4f5a53]'>
|
<p className='mt-3 leading-6 text-[#72798a]'>
|
||||||
{selectedClient.notes}
|
{selectedClient.notes}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
@ -235,8 +235,8 @@ const Clients = () => {
|
|||||||
|
|
||||||
<div className='grid gap-4 lg:grid-cols-2'>
|
<div className='grid gap-4 lg:grid-cols-2'>
|
||||||
<Panel>
|
<Panel>
|
||||||
<div className='border-b border-[#ded8cc] p-5'>
|
<div className='border-b border-[#19192d]/10 p-5'>
|
||||||
<h3 className='text-lg font-semibold text-[#17201b]'>
|
<h3 className='text-lg font-semibold text-[#19192d]'>
|
||||||
Session timeline
|
Session timeline
|
||||||
</h3>
|
</h3>
|
||||||
</div>
|
</div>
|
||||||
@ -245,12 +245,12 @@ const Clients = () => {
|
|||||||
(selectedClient.sessions || []).map((session) => (
|
(selectedClient.sessions || []).map((session) => (
|
||||||
<div
|
<div
|
||||||
key={session.id}
|
key={session.id}
|
||||||
className='rounded-lg border border-[#ded8cc] bg-[#fbfaf6] p-4'
|
className='rounded-lg border border-[#19192d]/10 bg-[#fffdf9] p-4'
|
||||||
>
|
>
|
||||||
<p className='font-semibold text-[#17201b]'>
|
<p className='font-semibold text-[#19192d]'>
|
||||||
{session.title}
|
{session.title}
|
||||||
</p>
|
</p>
|
||||||
<p className='mt-2 text-sm leading-6 text-[#68736c]'>
|
<p className='mt-2 text-sm leading-6 text-[#72798a]'>
|
||||||
{session.ai_summary}
|
{session.ai_summary}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
@ -262,8 +262,8 @@ const Clients = () => {
|
|||||||
</Panel>
|
</Panel>
|
||||||
|
|
||||||
<Panel>
|
<Panel>
|
||||||
<div className='border-b border-[#ded8cc] p-5'>
|
<div className='border-b border-[#19192d]/10 p-5'>
|
||||||
<h3 className='text-lg font-semibold text-[#17201b]'>
|
<h3 className='text-lg font-semibold text-[#19192d]'>
|
||||||
Open commitments
|
Open commitments
|
||||||
</h3>
|
</h3>
|
||||||
</div>
|
</div>
|
||||||
@ -272,19 +272,19 @@ const Clients = () => {
|
|||||||
(selectedClient.action_items || []).map((item) => (
|
(selectedClient.action_items || []).map((item) => (
|
||||||
<div
|
<div
|
||||||
key={item.id}
|
key={item.id}
|
||||||
className='flex gap-3 rounded-lg border border-[#ded8cc] bg-white p-4'
|
className='flex gap-3 rounded-lg border border-[#19192d]/10 bg-white p-4'
|
||||||
>
|
>
|
||||||
<span className='mt-0.5 grid h-8 w-8 flex-none place-items-center rounded-full bg-[#e8f1ec] text-[#245c4c]'>
|
<span className='mt-0.5 grid h-8 w-8 flex-none place-items-center rounded-full bg-[#f3fbf8] text-[#35b7a5]'>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
path={mdiCheckCircleOutline}
|
path={mdiCheckCircleOutline}
|
||||||
size={18}
|
size={18}
|
||||||
/>
|
/>
|
||||||
</span>
|
</span>
|
||||||
<div>
|
<div>
|
||||||
<p className='font-semibold text-[#17201b]'>
|
<p className='font-semibold text-[#19192d]'>
|
||||||
{item.title}
|
{item.title}
|
||||||
</p>
|
</p>
|
||||||
<p className='mt-1 text-sm text-[#68736c]'>
|
<p className='mt-1 text-sm text-[#72798a]'>
|
||||||
{item.status.replace('_', ' ')}
|
{item.status.replace('_', ' ')}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -68,7 +68,7 @@ function ShellCard({
|
|||||||
}) {
|
}) {
|
||||||
return (
|
return (
|
||||||
<section
|
<section
|
||||||
className={`rounded-lg border border-[#ded8cc] bg-white shadow-[0_18px_60px_rgba(23,32,27,0.07)] ${className}`}
|
className={`rounded-lg border border-[#19192d]/10 bg-white shadow-[0_18px_60px_rgba(23,32,27,0.07)] ${className}`}
|
||||||
>
|
>
|
||||||
{children}
|
{children}
|
||||||
</section>
|
</section>
|
||||||
@ -125,8 +125,8 @@ const Dashboard = () => {
|
|||||||
<SectionMain>
|
<SectionMain>
|
||||||
<div className='mx-auto max-w-7xl'>
|
<div className='mx-auto max-w-7xl'>
|
||||||
<div className='grid gap-4 xl:grid-cols-[1.1fr_0.9fr]'>
|
<div className='grid gap-4 xl:grid-cols-[1.1fr_0.9fr]'>
|
||||||
<div className='rounded-lg bg-[#17201b] p-5 text-white shadow-[0_24px_80px_rgba(23,32,27,0.18)]'>
|
<div className='rounded-lg bg-[#19192d] p-5 text-white shadow-[0_24px_80px_rgba(23,32,27,0.18)]'>
|
||||||
<div className='flex items-center gap-3 text-[#d8b15e]'>
|
<div className='flex items-center gap-3 text-[#b17a1e]'>
|
||||||
<BaseIcon path={mdiViewDashboardOutline} size={18} />
|
<BaseIcon path={mdiViewDashboardOutline} size={18} />
|
||||||
<span className='text-xs font-semibold uppercase tracking-[0.22em]'>
|
<span className='text-xs font-semibold uppercase tracking-[0.22em]'>
|
||||||
Workspace overview
|
Workspace overview
|
||||||
@ -136,14 +136,14 @@ const Dashboard = () => {
|
|||||||
Manage upcoming sessions, client notes, commitments, and
|
Manage upcoming sessions, client notes, commitments, and
|
||||||
follow-up drafts.
|
follow-up drafts.
|
||||||
</h1>
|
</h1>
|
||||||
<p className='mt-3 max-w-2xl text-sm leading-6 text-[#d9d5ca]'>
|
<p className='mt-3 max-w-2xl text-sm leading-6 text-[#fffdf9]'>
|
||||||
Review scheduled sessions, open tasks, recent notes, and drafts
|
Review scheduled sessions, open tasks, recent notes, and drafts
|
||||||
that need approval.
|
that need approval.
|
||||||
</p>
|
</p>
|
||||||
<div className='mt-5 flex flex-wrap gap-3'>
|
<div className='mt-5 flex flex-wrap gap-3'>
|
||||||
<Link
|
<Link
|
||||||
href='/session-memory'
|
href='/session-memory'
|
||||||
className='rounded-full bg-[#d8b15e] px-4 py-2 text-sm font-semibold text-[#17201b]'
|
className='rounded-full bg-[#b17a1e] px-4 py-2 text-sm font-semibold text-[#19192d]'
|
||||||
>
|
>
|
||||||
Generate session memory
|
Generate session memory
|
||||||
</Link>
|
</Link>
|
||||||
@ -157,30 +157,30 @@ const Dashboard = () => {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<ShellCard className='p-4'>
|
<ShellCard className='p-4'>
|
||||||
<p className='text-xs font-semibold uppercase tracking-[0.22em] text-[#9a6a2f]'>
|
<p className='text-xs font-semibold uppercase tracking-[0.22em] text-[#b17a1e]'>
|
||||||
Next session prep
|
Next session prep
|
||||||
</p>
|
</p>
|
||||||
{nextSession ? (
|
{nextSession ? (
|
||||||
<div>
|
<div>
|
||||||
<h2 className='mt-4 text-lg font-semibold text-[#17201b]'>
|
<h2 className='mt-4 text-lg font-semibold text-[#19192d]'>
|
||||||
{nextSession.client?.name || 'Client session'}
|
{nextSession.client?.name || 'Client session'}
|
||||||
</h2>
|
</h2>
|
||||||
<p className='mt-1 text-sm text-[#68736c]'>
|
<p className='mt-1 text-sm text-[#72798a]'>
|
||||||
{nextSession.title}
|
{nextSession.title}
|
||||||
</p>
|
</p>
|
||||||
<p className='mt-5 leading-6 text-[#4f5a53]'>
|
<p className='mt-5 leading-6 text-[#72798a]'>
|
||||||
{nextSession.ai_summary}
|
{nextSession.ai_summary}
|
||||||
</p>
|
</p>
|
||||||
<Link
|
<Link
|
||||||
href='/session-memory'
|
href='/session-memory'
|
||||||
className='mt-4 inline-flex items-center gap-2 rounded-full bg-[#245c4c] px-3 py-1.5 text-sm font-semibold text-white'
|
className='mt-4 inline-flex items-center gap-2 rounded-full bg-[#35b7a5] px-3 py-1.5 text-sm font-semibold text-white'
|
||||||
>
|
>
|
||||||
Review memory
|
Review memory
|
||||||
<BaseIcon path={mdiArrowRight} size={18} />
|
<BaseIcon path={mdiArrowRight} size={18} />
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<p className='mt-4 leading-6 text-[#68736c]'>
|
<p className='mt-4 leading-6 text-[#72798a]'>
|
||||||
{loading
|
{loading
|
||||||
? 'Loading your coaching workspace...'
|
? 'Loading your coaching workspace...'
|
||||||
: 'No upcoming session memory yet.'}
|
: 'No upcoming session memory yet.'}
|
||||||
@ -195,14 +195,14 @@ const Dashboard = () => {
|
|||||||
<ShellCard className='h-full p-5 transition hover:-translate-y-0.5 hover:shadow-[0_22px_60px_rgba(23,32,27,0.1)]'>
|
<ShellCard className='h-full p-5 transition hover:-translate-y-0.5 hover:shadow-[0_22px_60px_rgba(23,32,27,0.1)]'>
|
||||||
<div className='flex items-start justify-between gap-4'>
|
<div className='flex items-start justify-between gap-4'>
|
||||||
<div>
|
<div>
|
||||||
<p className='text-sm font-semibold text-[#68736c]'>
|
<p className='text-sm font-semibold text-[#72798a]'>
|
||||||
{stat.label}
|
{stat.label}
|
||||||
</p>
|
</p>
|
||||||
<p className='mt-2 text-2xl font-semibold text-[#17201b]'>
|
<p className='mt-2 text-2xl font-semibold text-[#19192d]'>
|
||||||
{loading ? '...' : stat.value}
|
{loading ? '...' : stat.value}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<span className='grid h-9 w-9 place-items-center rounded-full bg-[#e8f1ec] text-[#245c4c]'>
|
<span className='grid h-9 w-9 place-items-center rounded-full bg-[#f3fbf8] text-[#35b7a5]'>
|
||||||
<BaseIcon path={stat.icon} size={19} />
|
<BaseIcon path={stat.icon} size={19} />
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
@ -213,10 +213,10 @@ const Dashboard = () => {
|
|||||||
|
|
||||||
<div className='mt-4 grid gap-4 xl:grid-cols-[0.95fr_1.05fr]'>
|
<div className='mt-4 grid gap-4 xl:grid-cols-[0.95fr_1.05fr]'>
|
||||||
<ShellCard>
|
<ShellCard>
|
||||||
<div className='border-b border-[#ded8cc] p-4'>
|
<div className='border-b border-[#19192d]/10 p-4'>
|
||||||
<div className='flex items-center justify-between gap-4'>
|
<div className='flex items-center justify-between gap-4'>
|
||||||
<div>
|
<div>
|
||||||
<p className='text-xs font-semibold uppercase tracking-[0.22em] text-[#9a6a2f]'>
|
<p className='text-xs font-semibold uppercase tracking-[0.22em] text-[#b17a1e]'>
|
||||||
Client records
|
Client records
|
||||||
</p>
|
</p>
|
||||||
<h2 className='mt-2 text-lg font-semibold'>
|
<h2 className='mt-2 text-lg font-semibold'>
|
||||||
@ -224,30 +224,30 @@ const Dashboard = () => {
|
|||||||
</h2>
|
</h2>
|
||||||
</div>
|
</div>
|
||||||
<Link
|
<Link
|
||||||
className='text-sm font-semibold text-[#245c4c]'
|
className='text-sm font-semibold text-[#35b7a5]'
|
||||||
href='/clients'
|
href='/clients'
|
||||||
>
|
>
|
||||||
View all
|
View all
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className='divide-y divide-[#eee8dc]'>
|
<div className='divide-y divide-[#19192d]/10'>
|
||||||
{summary.activeClients.map((client) => (
|
{summary.activeClients.map((client) => (
|
||||||
<Link
|
<Link
|
||||||
key={client.id}
|
key={client.id}
|
||||||
href={`/clients?clientId=${client.id}`}
|
href={`/clients?clientId=${client.id}`}
|
||||||
className='block p-5 transition hover:bg-[#fbfaf6]'
|
className='block p-5 transition hover:bg-[#fffdf9]'
|
||||||
>
|
>
|
||||||
<div className='flex items-start justify-between gap-4'>
|
<div className='flex items-start justify-between gap-4'>
|
||||||
<div>
|
<div>
|
||||||
<p className='font-semibold text-[#17201b]'>
|
<p className='font-semibold text-[#19192d]'>
|
||||||
{client.name}
|
{client.name}
|
||||||
</p>
|
</p>
|
||||||
<p className='mt-1 text-sm text-[#68736c]'>
|
<p className='mt-1 text-sm text-[#72798a]'>
|
||||||
{client.role_title} · {client.company}
|
{client.role_title} · {client.company}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<span className='rounded-full bg-[#f0ede6] px-3 py-1 text-xs font-semibold text-[#6e5730]'>
|
<span className='rounded-full bg-[#fbf8f1] px-3 py-1 text-xs font-semibold text-[#b17a1e]'>
|
||||||
{client.package?.title || 'Coaching'}
|
{client.package?.title || 'Coaching'}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
@ -257,10 +257,10 @@ const Dashboard = () => {
|
|||||||
</ShellCard>
|
</ShellCard>
|
||||||
|
|
||||||
<ShellCard>
|
<ShellCard>
|
||||||
<div className='border-b border-[#ded8cc] p-4'>
|
<div className='border-b border-[#19192d]/10 p-4'>
|
||||||
<div className='flex items-center justify-between gap-4'>
|
<div className='flex items-center justify-between gap-4'>
|
||||||
<div>
|
<div>
|
||||||
<p className='text-xs font-semibold uppercase tracking-[0.22em] text-[#9a6a2f]'>
|
<p className='text-xs font-semibold uppercase tracking-[0.22em] text-[#b17a1e]'>
|
||||||
Recent intelligence
|
Recent intelligence
|
||||||
</p>
|
</p>
|
||||||
<h2 className='mt-2 text-lg font-semibold'>
|
<h2 className='mt-2 text-lg font-semibold'>
|
||||||
@ -268,23 +268,23 @@ const Dashboard = () => {
|
|||||||
</h2>
|
</h2>
|
||||||
</div>
|
</div>
|
||||||
<Link
|
<Link
|
||||||
className='text-sm font-semibold text-[#245c4c]'
|
className='text-sm font-semibold text-[#35b7a5]'
|
||||||
href='/session-memory'
|
href='/session-memory'
|
||||||
>
|
>
|
||||||
Open
|
Open
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className='divide-y divide-[#eee8dc]'>
|
<div className='divide-y divide-[#19192d]/10'>
|
||||||
{summary.nextSessions.map((session) => (
|
{summary.nextSessions.map((session) => (
|
||||||
<div key={session.id} className='p-5'>
|
<div key={session.id} className='p-5'>
|
||||||
<p className='font-semibold text-[#17201b]'>
|
<p className='font-semibold text-[#19192d]'>
|
||||||
{session.title}
|
{session.title}
|
||||||
</p>
|
</p>
|
||||||
<p className='mt-1 text-sm text-[#68736c]'>
|
<p className='mt-1 text-sm text-[#72798a]'>
|
||||||
{session.client?.name}
|
{session.client?.name}
|
||||||
</p>
|
</p>
|
||||||
<p className='mt-3 leading-6 text-[#4f5a53]'>
|
<p className='mt-3 leading-6 text-[#72798a]'>
|
||||||
{session.ai_summary}
|
{session.ai_summary}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -39,7 +39,7 @@ function Panel({
|
|||||||
}) {
|
}) {
|
||||||
return (
|
return (
|
||||||
<section
|
<section
|
||||||
className={`rounded-lg border border-[#ded8cc] bg-white shadow-[0_18px_60px_rgba(23,32,27,0.07)] ${className}`}
|
className={`rounded-lg border border-[#19192d]/10 bg-white shadow-[0_18px_60px_rgba(23,32,27,0.07)] ${className}`}
|
||||||
>
|
>
|
||||||
{children}
|
{children}
|
||||||
</section>
|
</section>
|
||||||
@ -54,11 +54,11 @@ function OutputBlock({
|
|||||||
children: React.ReactNode;
|
children: React.ReactNode;
|
||||||
}) {
|
}) {
|
||||||
return (
|
return (
|
||||||
<div className='rounded-lg border border-[#ded8cc] bg-[#fbfaf6] p-5'>
|
<div className='rounded-lg border border-[#19192d]/10 bg-[#fffdf9] p-5'>
|
||||||
<p className='text-xs font-semibold uppercase tracking-[0.2em] text-[#9a6a2f]'>
|
<p className='text-xs font-semibold uppercase tracking-[0.2em] text-[#b17a1e]'>
|
||||||
{title}
|
{title}
|
||||||
</p>
|
</p>
|
||||||
<div className='mt-3 leading-6 text-[#4f5a53]'>{children}</div>
|
<div className='mt-3 leading-6 text-[#72798a]'>{children}</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -107,8 +107,8 @@ const SessionMemory = () => {
|
|||||||
</Head>
|
</Head>
|
||||||
<SectionMain>
|
<SectionMain>
|
||||||
<div className='mx-auto max-w-7xl'>
|
<div className='mx-auto max-w-7xl'>
|
||||||
<div className='mb-4 rounded-lg bg-[#17201b] p-5 text-white'>
|
<div className='mb-4 rounded-lg bg-[#19192d] p-5 text-white'>
|
||||||
<div className='flex items-center gap-3 text-[#d8b15e]'>
|
<div className='flex items-center gap-3 text-[#b17a1e]'>
|
||||||
<BaseIcon path={mdiFileDocumentEditOutline} size={18} />
|
<BaseIcon path={mdiFileDocumentEditOutline} size={18} />
|
||||||
<span className='text-xs font-semibold uppercase tracking-[0.22em]'>
|
<span className='text-xs font-semibold uppercase tracking-[0.22em]'>
|
||||||
Session Memory
|
Session Memory
|
||||||
@ -118,7 +118,7 @@ const SessionMemory = () => {
|
|||||||
Turn rough notes into follow-up, commitments, and next-session
|
Turn rough notes into follow-up, commitments, and next-session
|
||||||
prep.
|
prep.
|
||||||
</h1>
|
</h1>
|
||||||
<p className='mt-2 max-w-3xl text-sm leading-6 text-[#d9d5ca]'>
|
<p className='mt-2 max-w-3xl text-sm leading-6 text-[#fffdf9]'>
|
||||||
Paste session notes or a transcript, generate structured output,
|
Paste session notes or a transcript, generate structured output,
|
||||||
then review and save the result before sharing anything with a
|
then review and save the result before sharing anything with a
|
||||||
client.
|
client.
|
||||||
@ -127,20 +127,20 @@ const SessionMemory = () => {
|
|||||||
|
|
||||||
<div className='grid gap-4 xl:grid-cols-[0.85fr_1.15fr]'>
|
<div className='grid gap-4 xl:grid-cols-[0.85fr_1.15fr]'>
|
||||||
<Panel className='p-4'>
|
<Panel className='p-4'>
|
||||||
<p className='text-xs font-semibold uppercase tracking-[0.22em] text-[#9a6a2f]'>
|
<p className='text-xs font-semibold uppercase tracking-[0.22em] text-[#b17a1e]'>
|
||||||
Raw session input
|
Raw session input
|
||||||
</p>
|
</p>
|
||||||
<h2 className='mt-2 text-lg font-semibold text-[#17201b]'>
|
<h2 className='mt-2 text-lg font-semibold text-[#19192d]'>
|
||||||
Extract a session
|
Extract a session
|
||||||
</h2>
|
</h2>
|
||||||
|
|
||||||
<label className='mb-2 mt-4 block text-sm font-semibold text-[#526159]'>
|
<label className='mb-2 mt-4 block text-sm font-semibold text-[#72798a]'>
|
||||||
Client
|
Client
|
||||||
</label>
|
</label>
|
||||||
<select
|
<select
|
||||||
value={clientId}
|
value={clientId}
|
||||||
onChange={(event) => setClientId(event.target.value)}
|
onChange={(event) => setClientId(event.target.value)}
|
||||||
className='w-full rounded-lg border border-[#d8d1c2] bg-white px-3 py-2 text-[#17201b] outline-none focus:border-[#245c4c] focus:ring-2 focus:ring-[#245c4c]/15'
|
className='w-full rounded-lg border border-[#19192d]/10 bg-white px-3 py-2 text-[#19192d] outline-none focus:border-[#35b7a5] focus:ring-2 focus:ring-[#35b7a5]/15'
|
||||||
>
|
>
|
||||||
{clients.map((client) => (
|
{clients.map((client) => (
|
||||||
<option key={client.id} value={client.id}>
|
<option key={client.id} value={client.id}>
|
||||||
@ -149,13 +149,13 @@ const SessionMemory = () => {
|
|||||||
))}
|
))}
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<label className='mb-2 mt-5 block text-sm font-semibold text-[#526159]'>
|
<label className='mb-2 mt-5 block text-sm font-semibold text-[#72798a]'>
|
||||||
Transcript or raw notes
|
Transcript or raw notes
|
||||||
</label>
|
</label>
|
||||||
<textarea
|
<textarea
|
||||||
value={transcript}
|
value={transcript}
|
||||||
onChange={(event) => setTranscript(event.target.value)}
|
onChange={(event) => setTranscript(event.target.value)}
|
||||||
className='min-h-[220px] w-full rounded-lg border border-[#d8d1c2] bg-[#fbfaf6] px-3 py-2 leading-6 text-[#17201b] outline-none focus:border-[#245c4c] focus:ring-2 focus:ring-[#245c4c]/15'
|
className='min-h-[220px] w-full rounded-lg border border-[#19192d]/10 bg-[#fffdf9] px-3 py-2 leading-6 text-[#19192d] outline-none focus:border-[#35b7a5] focus:ring-2 focus:ring-[#35b7a5]/15'
|
||||||
placeholder='Paste session transcript, coach notes, commitments, blockers, or a rough debrief...'
|
placeholder='Paste session transcript, coach notes, commitments, blockers, or a rough debrief...'
|
||||||
/>
|
/>
|
||||||
<div className='mt-5'>
|
<div className='mt-5'>
|
||||||
@ -172,14 +172,14 @@ const SessionMemory = () => {
|
|||||||
<Panel className='p-4'>
|
<Panel className='p-4'>
|
||||||
<div className='flex items-start justify-between gap-4'>
|
<div className='flex items-start justify-between gap-4'>
|
||||||
<div>
|
<div>
|
||||||
<p className='text-xs font-semibold uppercase tracking-[0.22em] text-[#9a6a2f]'>
|
<p className='text-xs font-semibold uppercase tracking-[0.22em] text-[#b17a1e]'>
|
||||||
AI draft
|
AI draft
|
||||||
</p>
|
</p>
|
||||||
<h2 className='mt-2 text-lg font-semibold text-[#17201b]'>
|
<h2 className='mt-2 text-lg font-semibold text-[#19192d]'>
|
||||||
Review before sharing
|
Review before sharing
|
||||||
</h2>
|
</h2>
|
||||||
</div>
|
</div>
|
||||||
<span className='rounded-full bg-[#e8f1ec] px-3 py-1 text-xs font-semibold text-[#245c4c]'>
|
<span className='rounded-full bg-[#f3fbf8] px-3 py-1 text-xs font-semibold text-[#35b7a5]'>
|
||||||
Coach approved
|
Coach approved
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
@ -200,14 +200,14 @@ const SessionMemory = () => {
|
|||||||
<div className='flex flex-wrap gap-3'>
|
<div className='flex flex-wrap gap-3'>
|
||||||
<button
|
<button
|
||||||
type='button'
|
type='button'
|
||||||
className='inline-flex items-center gap-2 rounded-full bg-[#245c4c] px-3 py-1.5 text-sm font-semibold text-white'
|
className='inline-flex items-center gap-2 rounded-full bg-[#35b7a5] px-3 py-1.5 text-sm font-semibold text-white'
|
||||||
>
|
>
|
||||||
<BaseIcon path={mdiCheckCircleOutline} size={18} />
|
<BaseIcon path={mdiCheckCircleOutline} size={18} />
|
||||||
Save final memory
|
Save final memory
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
type='button'
|
type='button'
|
||||||
className='inline-flex items-center gap-2 rounded-full border border-[#ded8cc] bg-white px-3 py-1.5 text-sm font-semibold text-[#17201b]'
|
className='inline-flex items-center gap-2 rounded-full border border-[#19192d]/10 bg-white px-3 py-1.5 text-sm font-semibold text-[#19192d]'
|
||||||
>
|
>
|
||||||
<BaseIcon path={mdiContentCopy} size={18} />
|
<BaseIcon path={mdiContentCopy} size={18} />
|
||||||
Copy follow-up
|
Copy follow-up
|
||||||
@ -215,13 +215,13 @@ const SessionMemory = () => {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<div className='mt-4 rounded-lg border border-dashed border-[#d8d1c2] bg-[#fbfaf6] p-4'>
|
<div className='mt-4 rounded-lg border border-dashed border-[#19192d]/10 bg-[#fffdf9] p-4'>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
path={mdiLightbulbOnOutline}
|
path={mdiLightbulbOnOutline}
|
||||||
size={22}
|
size={22}
|
||||||
className='text-[#d8b15e]'
|
className='text-[#b17a1e]'
|
||||||
/>
|
/>
|
||||||
<p className='mt-4 leading-6 text-[#68736c]'>
|
<p className='mt-4 leading-6 text-[#72798a]'>
|
||||||
Generate a structured memory through the AppWizzy AI
|
Generate a structured memory through the AppWizzy AI
|
||||||
proxy. The result should stay reviewable: summary,
|
proxy. The result should stay reviewable: summary,
|
||||||
commitments, blockers, homework, follow-up, and prep for
|
commitments, blockers, homework, follow-up, and prep for
|
||||||
@ -232,33 +232,33 @@ const SessionMemory = () => {
|
|||||||
</Panel>
|
</Panel>
|
||||||
|
|
||||||
<Panel>
|
<Panel>
|
||||||
<div className='border-b border-[#ded8cc] p-5'>
|
<div className='border-b border-[#19192d]/10 p-5'>
|
||||||
<h2 className='text-lg font-semibold text-[#17201b]'>
|
<h2 className='text-lg font-semibold text-[#19192d]'>
|
||||||
Recent memories
|
Recent memories
|
||||||
</h2>
|
</h2>
|
||||||
</div>
|
</div>
|
||||||
<div className='divide-y divide-[#eee8dc]'>
|
<div className='divide-y divide-[#19192d]/10'>
|
||||||
{sessions.map((session) => (
|
{sessions.map((session) => (
|
||||||
<div key={session.id} className='p-5'>
|
<div key={session.id} className='p-5'>
|
||||||
<div className='flex items-start justify-between gap-4'>
|
<div className='flex items-start justify-between gap-4'>
|
||||||
<div>
|
<div>
|
||||||
<p className='font-semibold text-[#17201b]'>
|
<p className='font-semibold text-[#19192d]'>
|
||||||
{session.title}
|
{session.title}
|
||||||
</p>
|
</p>
|
||||||
<p className='mt-1 text-sm text-[#68736c]'>
|
<p className='mt-1 text-sm text-[#72798a]'>
|
||||||
{session.client?.name}
|
{session.client?.name}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
path={mdiSendOutline}
|
path={mdiSendOutline}
|
||||||
size={18}
|
size={18}
|
||||||
className='text-[#245c4c]'
|
className='text-[#35b7a5]'
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<p className='mt-3 leading-6 text-[#4f5a53]'>
|
<p className='mt-3 leading-6 text-[#72798a]'>
|
||||||
{session.ai_summary}
|
{session.ai_summary}
|
||||||
</p>
|
</p>
|
||||||
<p className='mt-3 text-sm font-semibold text-[#245c4c]'>
|
<p className='mt-3 text-sm font-semibold text-[#35b7a5]'>
|
||||||
{session.key_topics}
|
{session.key_topics}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user