mirror of https://github.com/langgenius/dify.git
feat: explore sidebar
This commit is contained in:
parent
878ee6ef22
commit
32d2888628
|
|
@ -1,5 +1,6 @@
|
|||
import type { FC } from 'react'
|
||||
import React from 'react'
|
||||
import Sidebar from '@/app/components/explore/sidebar'
|
||||
|
||||
export type IAppDetail = {
|
||||
children: React.ReactNode
|
||||
|
|
@ -7,9 +8,12 @@ export type IAppDetail = {
|
|||
|
||||
const AppDetail: FC<IAppDetail> = ({ children }) => {
|
||||
return (
|
||||
<>
|
||||
<div className='flex h-full bg-gray-100 border-t border-gray-200'>
|
||||
<Sidebar />
|
||||
<div className='grow'>
|
||||
{children}
|
||||
</>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,41 @@
|
|||
'use client'
|
||||
import { useSelectedLayoutSegment } from 'next/navigation'
|
||||
import cn from 'classnames'
|
||||
import Link from 'next/link'
|
||||
|
||||
import s from './style.module.css'
|
||||
|
||||
export default function NavLink({
|
||||
name,
|
||||
id,
|
||||
}: {
|
||||
name: string
|
||||
id: string
|
||||
}) {
|
||||
const segment = useSelectedLayoutSegment()
|
||||
const url = `/explore/installed/${id}`
|
||||
const isActive = id === segment?.toLowerCase()
|
||||
|
||||
return (
|
||||
<Link
|
||||
prefetch
|
||||
key={name}
|
||||
href={url}
|
||||
className={cn(
|
||||
s.item,
|
||||
isActive && s.itemActive,
|
||||
'flex h-8 items-center px-2 rounded-lg text-sm font-normal',
|
||||
)}
|
||||
>
|
||||
<div
|
||||
className={cn(
|
||||
'shrink-0 mr-2 h-6 w-6 rounded-md border bg-[#D5F5F6]',
|
||||
)}
|
||||
style={{
|
||||
borderColor: '0.5px solid rgba(0, 0, 0, 0.05)'
|
||||
}}
|
||||
/>
|
||||
<div className='overflow-hidden text-ellipsis whitespace-nowrap'>{name}</div>
|
||||
</Link>
|
||||
)
|
||||
}
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
.item:hover,
|
||||
.item.active {
|
||||
border: 0.5px solid #EAECF0;
|
||||
box-shadow: 0px 1px 2px rgba(16, 24, 40, 0.05);
|
||||
border-radius: 8px;
|
||||
background: #FFFFFF;
|
||||
color: #344054;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
|
@ -1,14 +1,48 @@
|
|||
'use client'
|
||||
import React, { FC } from 'react'
|
||||
import s from './style.module.css'
|
||||
export interface ISideBarProps {
|
||||
|
||||
}
|
||||
const SideBar: FC<ISideBarProps> = ({
|
||||
}) => {
|
||||
import Item from './app-nav-item'
|
||||
|
||||
const list = [
|
||||
{
|
||||
id: '1',
|
||||
name: 'Story Bot',
|
||||
},
|
||||
{
|
||||
id: '2',
|
||||
name: 'Fancy title'
|
||||
}
|
||||
]
|
||||
|
||||
const DiscoveryIcon = () => (
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fillRule="evenodd" clipRule="evenodd" d="M13.4135 1.11725C13.5091 1.09983 13.6483 1.08355 13.8078 1.11745C14.0143 1.16136 14.2017 1.26953 14.343 1.42647C14.4521 1.54766 14.5076 1.67634 14.5403 1.76781C14.5685 1.84673 14.593 1.93833 14.6136 2.01504L15.5533 5.5222C15.5739 5.5989 15.5985 5.69049 15.6135 5.77296C15.6309 5.86852 15.6472 6.00771 15.6133 6.16722C15.5694 6.37378 15.4612 6.56114 15.3043 6.70245C15.1831 6.81157 15.0544 6.86706 14.9629 6.89975C14.884 6.92796 14.7924 6.95247 14.7157 6.97299L14.676 6.98364C14.3365 7.07461 14.0437 7.15309 13.7972 7.19802C13.537 7.24543 13.2715 7.26736 12.9946 7.20849C12.7513 7.15677 12.5213 7.06047 12.3156 6.92591L9.63273 7.64477C9.86399 7.97104 9.99992 8.36965 9.99992 8.80001C9.99992 9.2424 9.85628 9.65124 9.6131 9.98245L12.5508 14.291C12.7582 14.5952 12.6797 15.01 12.3755 15.2174C12.0713 15.4248 11.6566 15.3464 11.4492 15.0422L8.51171 10.7339C8.34835 10.777 8.17682 10.8 7.99992 10.8C7.82305 10.8 7.65155 10.777 7.48823 10.734L4.5508 15.0422C4.34338 15.3464 3.92863 15.4248 3.62442 15.2174C3.32021 15.01 3.24175 14.5952 3.44916 14.291L6.3868 9.98254C6.14358 9.65132 5.99992 9.24244 5.99992 8.80001C5.99992 8.73795 6.00274 8.67655 6.00827 8.61594L4.59643 8.99424C4.51973 9.01483 4.42813 9.03941 4.34567 9.05444C4.25011 9.07185 4.11092 9.08814 3.95141 9.05423C3.74485 9.01033 3.55748 8.90215 3.41618 8.74522C3.38535 8.71097 3.3588 8.67614 3.33583 8.64171L2.49206 8.8678C2.41536 8.88838 2.32376 8.91296 2.2413 8.92799C2.14574 8.94541 2.00655 8.96169 1.84704 8.92779C1.64048 8.88388 1.45311 8.77571 1.31181 8.61877C1.20269 8.49759 1.1472 8.3689 1.1145 8.27744C1.08629 8.1985 1.06177 8.10689 1.04125 8.03018L0.791701 7.09885C0.771119 7.02215 0.746538 6.93055 0.731508 6.84809C0.714092 6.75253 0.697808 6.61334 0.731712 6.45383C0.775619 6.24726 0.883793 6.0599 1.04073 5.9186C1.16191 5.80948 1.2906 5.75399 1.38206 5.72129C1.461 5.69307 1.55261 5.66856 1.62932 5.64804L2.47318 5.42193C2.47586 5.38071 2.48143 5.33735 2.49099 5.29237C2.5349 5.08581 2.64307 4.89844 2.80001 4.75714C2.92119 4.64802 3.04988 4.59253 3.14134 4.55983C3.22027 4.53162 3.31189 4.50711 3.3886 4.48658L11.1078 2.41824C11.2186 2.19888 11.3697 2.00049 11.5545 1.83406C11.7649 1.64462 12.0058 1.53085 12.2548 1.44183C12.4907 1.35749 12.7836 1.27904 13.123 1.18809L13.1628 1.17744C13.2395 1.15686 13.3311 1.13228 13.4135 1.11725ZM13.3642 2.5039C13.0648 2.58443 12.8606 2.64126 12.7036 2.69735C12.5325 2.75852 12.4742 2.80016 12.4467 2.82492C12.3421 2.91912 12.2699 3.04403 12.2407 3.18174C12.233 3.21793 12.2261 3.28928 12.2587 3.46805C12.2927 3.6545 12.3564 3.89436 12.4559 4.26563L12.5594 4.652C12.6589 5.02328 12.7236 5.26287 12.7874 5.44133C12.8486 5.61244 12.8902 5.67079 12.915 5.69829C13.0092 5.80291 13.1341 5.87503 13.2718 5.9043C13.308 5.91199 13.3793 5.91887 13.5581 5.88629C13.7221 5.85641 13.9273 5.80352 14.2269 5.72356L13.3642 2.5039Z" fill="#155EEF"/>
|
||||
</svg>
|
||||
)
|
||||
|
||||
const SideBar: FC = () => {
|
||||
return (
|
||||
<div>
|
||||
111
|
||||
<div className='w-[216px] shrink-0 pt-6 px-4 border-r border-gray-200'>
|
||||
<div>
|
||||
<div
|
||||
className='flex items-center h-9 pl-3 space-x-2 rounded-lg bg-white'
|
||||
style={{boxShadow: '0px 1px 2px rgba(16, 24, 40, 0.05)'}}
|
||||
>
|
||||
<DiscoveryIcon />
|
||||
<div className='text-sm text-primary-600 font-semibold'>Discovery</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className='mt-10'>
|
||||
<div className='pl-2 text-xs text-gray-500 font-medium'>Workspace</div>
|
||||
<div className='mt-1 space-y-1'>
|
||||
{list.map(({id, name}) => {
|
||||
return (
|
||||
<Item key={id} name={name} id={id} />
|
||||
)
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
export default React.memo(SideBar)
|
||||
|
|
|
|||
Loading…
Reference in New Issue