unipo-ui 1.0.2 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-SVRTAYZW.cjs → chunk-DEF5CA7C.cjs} +22 -2
- package/dist/chunk-DEF5CA7C.cjs.map +1 -0
- package/dist/{chunk-2FW3QITF.js → chunk-SJ4DJOMZ.js} +21 -3
- package/dist/chunk-SJ4DJOMZ.js.map +1 -0
- package/dist/{content-f6eK74xx.d.cts → content-DaJPx5LX.d.cts} +6 -1
- package/dist/{content-f6eK74xx.d.ts → content-DaJPx5LX.d.ts} +6 -1
- package/dist/index.cjs +208 -175
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +17 -2
- package/dist/index.d.ts +17 -2
- package/dist/index.js +31 -6
- package/dist/index.js.map +1 -1
- package/dist/registry.json +103 -9
- package/dist/scss/components/_display.scss +46 -0
- package/dist/scss/components/_layout.scss +20 -0
- package/dist/scss/components/_overlays.scss +14 -1
- package/dist/siakad.cjs +1195 -783
- package/dist/siakad.cjs.map +1 -1
- package/dist/siakad.d.cts +306 -4
- package/dist/siakad.d.ts +306 -4
- package/dist/siakad.js +426 -23
- package/dist/siakad.js.map +1 -1
- package/dist/ui-unipo.css +77 -1
- package/dist/ui-unipo.min.css +1 -1
- package/package.json +2 -2
- package/src/components/galat.tsx +33 -0
- package/src/components/layout.tsx +42 -4
- package/src/index.ts +1 -0
- package/src/siakad/akademik.tsx +2 -1
- package/src/siakad/aplikasi.tsx +4 -2
- package/src/siakad/berkas.tsx +203 -0
- package/src/siakad/dasbor.tsx +4 -2
- package/src/siakad/galat.tsx +48 -0
- package/src/siakad/index.ts +3 -0
- package/src/siakad/kalender.tsx +3 -1
- package/src/siakad/kelengkapan.tsx +3 -1
- package/src/siakad/kurikulum.tsx +2 -1
- package/src/siakad/lms.tsx +2 -1
- package/src/siakad/log.tsx +7 -3
- package/src/siakad/pilih.tsx +321 -0
- package/src/siakad/provider.tsx +12 -3
- package/dist/chunk-2FW3QITF.js.map +0 -1
- package/dist/chunk-SVRTAYZW.cjs.map +0 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/layout.tsx"],"names":["jsxs","Fragment","jsx","dataFlag","Tooltip","React","Menu","BaseCollapsible","ChevronDown","cn","Button","PanelLeftOpen","PanelLeftClose","Avatar","ChevronsUpDown","MenuIcon","Dialog","Search","Kbd"],"mappings":"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","file":"index.cjs","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { Collapsible as BaseCollapsible } from '@base-ui/react/collapsible';\nimport { ChevronDown, ChevronsUpDown, Menu as MenuIcon, PanelLeftClose, PanelLeftOpen, Search } from 'lucide-react';\nimport { cn, dataFlag } from '../lib/cn';\nimport { Button, Kbd } from './actions';\nimport { Avatar } from './display';\nimport { Dialog, Menu, Tooltip, type MenuEntry } from './overlays';\n\n// ================================================================ Sidebar dasbor aplikasi\nexport interface NavItem {\n /** Kunci unik; dicocokkan dengan `activeKey`. */\n key: string;\n label: React.ReactNode;\n icon?: React.ReactNode;\n href?: string;\n onClick?: () => void;\n /** Angka/teks kecil di kanan (mis. jumlah KRS menunggu). */\n badge?: React.ReactNode;\n /** Sub-menu (satu tingkat). */\n children?: NavItem[];\n disabled?: boolean;\n}\nexport interface NavGroup {\n label?: React.ReactNode;\n items: NavItem[];\n}\n\nexport interface SidebarUser {\n name: string;\n /** Baris kedua: NIM/NIDN/peran. */\n subtitle?: string;\n avatar?: string | null;\n menu?: MenuEntry[];\n}\n\nexport interface SidebarProps {\n /** Logo + nama aplikasi (gunakan <AppLogo />). */\n brand: React.ReactNode;\n groups: NavGroup[];\n activeKey?: string;\n /** Konten tepat di bawah brand, mis. pemilih prodi/periode atau pencarian. */\n header?: React.ReactNode;\n /** Konten di atas profil, mis. kartu \"Periode KRS dibuka\". */\n footer?: React.ReactNode;\n user?: SidebarUser;\n /** Mode ikon saja (rail). */\n collapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n /** Renderer tautan kustom, mis. <Link> Next.js/React Router. */\n renderLink?: (item: NavItem, props: React.AnchorHTMLAttributes<HTMLAnchorElement> & { children: React.ReactNode }) => React.ReactElement;\n className?: string;\n}\n\nfunction containsActive(item: NavItem, key?: string): boolean {\n return item.key === key || Boolean(item.children?.some((c) => containsActive(c, key)));\n}\n\nfunction NavLink({ item, active, collapsed, renderLink, depth }: { item: NavItem; active: boolean; collapsed?: boolean; renderLink?: SidebarProps['renderLink']; depth: number }) {\n const content = (\n <>\n {depth === 0 && <span className=\"u-nav-icon\">{item.icon}</span>}\n <span className=\"u-nav-label\">{item.label}</span>\n {item.badge != null && <span className=\"u-nav-badge\">{item.badge}</span>}\n </>\n );\n const props = {\n className: 'u-nav-item',\n 'data-active': dataFlag(active),\n 'data-depth': depth,\n 'aria-current': active ? ('page' as const) : undefined,\n 'aria-disabled': item.disabled || undefined,\n onClick: item.onClick,\n };\n let el: React.ReactElement;\n if (item.href) el = renderLink ? renderLink(item, { ...props, href: item.href, children: content }) : <a {...props} href={item.href}>{content}</a>;\n else el = <button type=\"button\" {...props}>{content}</button>;\n return collapsed && depth === 0 ? (\n <Tooltip content={item.label} side=\"right\">\n {el}\n </Tooltip>\n ) : (\n el\n );\n}\n\nfunction NavTree({ item, activeKey, collapsed, renderLink }: { item: NavItem; activeKey?: string; collapsed?: boolean; renderLink?: SidebarProps['renderLink'] }) {\n const [open, setOpen] = React.useState(() => containsActive(item, activeKey));\n if (!item.children?.length) return <NavLink item={item} active={item.key === activeKey} collapsed={collapsed} renderLink={renderLink} depth={0} />;\n const childActive = containsActive(item, activeKey);\n if (collapsed) {\n // Saat rail, sub-menu dibuka sebagai menu melayang.\n return (\n <Menu\n side=\"right\"\n align=\"start\"\n trigger={\n <button type=\"button\" className=\"u-nav-item\" data-active={dataFlag(childActive)} aria-label={typeof item.label === 'string' ? item.label : undefined}>\n <span className=\"u-nav-icon\">{item.icon}</span>\n </button>\n }\n items={[{ type: 'label', label: item.label }, ...item.children.map((c) => ({ label: c.label, href: c.href, onSelect: c.onClick }))]}\n />\n );\n }\n return (\n <BaseCollapsible.Root open={open} onOpenChange={setOpen}>\n <BaseCollapsible.Trigger className=\"u-nav-item\" data-parent-active={dataFlag(childActive)}>\n <span className=\"u-nav-icon\">{item.icon}</span>\n <span className=\"u-nav-label\">{item.label}</span>\n <ChevronDown className=\"u-nav-chevron\" />\n </BaseCollapsible.Trigger>\n <BaseCollapsible.Panel className=\"u-collapsible-panel\">\n <div className=\"u-nav-sub\">\n {item.children.map((c) => (\n <NavLink key={c.key} item={c} active={c.key === activeKey} renderLink={renderLink} depth={1} />\n ))}\n </div>\n </BaseCollapsible.Panel>\n </BaseCollapsible.Root>\n );\n}\n\n/** Sidebar aplikasi dasbor (SIAKAD, Pustikom, LMS, fakultas): grup menu, sub-menu, lencana, profil, mode rail. */\nexport function Sidebar({ brand, groups, activeKey, header, footer, user, collapsed, onCollapsedChange, renderLink, className }: SidebarProps) {\n return (\n <aside className={cn('u-sidebar', className)} data-collapsed={dataFlag(collapsed)}>\n <div className=\"u-sidebar-brand\">\n {brand}\n {onCollapsedChange && (\n <Tooltip content={collapsed ? 'Lebarkan menu' : 'Ciutkan menu'} side=\"right\">\n <Button variant=\"ghost\" size=\"xs\" iconOnly className=\"u-sidebar-toggle\" aria-label={collapsed ? 'Lebarkan menu' : 'Ciutkan menu'} onClick={() => onCollapsedChange(!collapsed)}>\n {collapsed ? <PanelLeftOpen /> : <PanelLeftClose />}\n </Button>\n </Tooltip>\n )}\n </div>\n {header && !collapsed && <div className=\"u-sidebar-header\">{header}</div>}\n <nav className=\"u-sidebar-nav\" aria-label=\"Menu utama\">\n {groups.map((g, gi) => (\n <div key={gi} className=\"u-nav-group\">\n {g.label && !collapsed && <div className=\"u-nav-group-label\">{g.label}</div>}\n {g.items.map((it) => (\n <NavTree key={it.key} item={it} activeKey={activeKey} collapsed={collapsed} renderLink={renderLink} />\n ))}\n </div>\n ))}\n </nav>\n {footer && !collapsed && <div className=\"u-sidebar-footer\">{footer}</div>}\n {user && (\n <div className=\"u-sidebar-user\">\n <Menu\n side={collapsed ? 'right' : 'top'}\n align=\"start\"\n trigger={\n <button type=\"button\" className=\"u-sidebar-user-button\">\n <Avatar name={user.name} src={user.avatar} size=\"sm\" />\n {!collapsed && (\n <>\n <span className=\"u-sidebar-user-text\">\n <span>{user.name}</span>\n {user.subtitle && <span>{user.subtitle}</span>}\n </span>\n <ChevronsUpDown className=\"u-nav-chevron\" />\n </>\n )}\n </button>\n }\n items={user.menu ?? []}\n />\n </div>\n )}\n </aside>\n );\n}\n\n// ================================================================ App shell\nexport interface AppShellProps {\n sidebar: React.ReactElement<SidebarProps>;\n /** Isi bilah atas (breadcrumb, pencarian, notifikasi). */\n topbar?: React.ReactNode;\n children: React.ReactNode;\n className?: string;\n}\n/** Kerangka halaman dasbor: sidebar tetap di desktop, laci (sheet) di ponsel. */\nexport function AppShell({ sidebar, topbar, children, className }: AppShellProps) {\n const [mobileOpen, setMobileOpen] = React.useState(false);\n return (\n <div className={cn('u-app-shell', className)} data-collapsed={dataFlag(sidebar.props.collapsed)}>\n <div className=\"u-app-shell-sidebar\">{sidebar}</div>\n <div className=\"u-app-shell-main\">\n <header className=\"u-topbar\">\n <Button variant=\"ghost\" size=\"sm\" iconOnly className=\"u-topbar-menu\" aria-label=\"Buka menu\" onClick={() => setMobileOpen(true)}>\n <MenuIcon />\n </Button>\n {topbar}\n </header>\n <main className=\"u-app-shell-content\">{children}</main>\n </div>\n <Dialog open={mobileOpen} onOpenChange={setMobileOpen} side=\"left\" title={<span className=\"u-sr-only\">Menu</span>} className=\"u-app-shell-drawer\">\n {React.cloneElement(sidebar, { collapsed: false, onCollapsedChange: undefined })}\n </Dialog>\n </div>\n );\n}\n\n/** Tombol pencarian ala command palette di bilah atas. */\nexport function SearchTrigger({ placeholder = 'Cari menu, mahasiswa, dosen…', shortcut = '⌘K', onClick, className }: { placeholder?: string; shortcut?: string; onClick?: () => void; className?: string }) {\n return (\n <button type=\"button\" className={cn('u-search-trigger', className)} onClick={onClick}>\n <Search />\n <span>{placeholder}</span>\n {shortcut && <Kbd>{shortcut}</Kbd>}\n </button>\n );\n}\n\n// ================================================================ Sidebar dokumentasi\nexport interface DocsNavSection {\n title: React.ReactNode;\n items: Array<{ key: string; label: React.ReactNode; href?: string; onClick?: () => void; badge?: React.ReactNode }>;\n}\nexport interface DocsSidebarProps {\n sections: DocsNavSection[];\n activeKey?: string;\n /** Pencarian di dalam daftar (penyaringan klien). */\n searchable?: boolean;\n header?: React.ReactNode;\n className?: string;\n renderLink?: SidebarProps['renderLink'];\n}\n/** Sidebar halaman dokumentasi (API, panduan, pustaka komponen): seksi bertajuk, penanda aktif, saringan. */\nexport function DocsSidebar({ sections, activeKey, searchable = true, header, className, renderLink }: DocsSidebarProps) {\n const [q, setQ] = React.useState('');\n const norm = q.trim().toLowerCase();\n const filtered = sections\n .map((s) => ({ ...s, items: norm ? s.items.filter((i) => String(i.label).toLowerCase().includes(norm)) : s.items }))\n .filter((s) => s.items.length);\n return (\n <aside className={cn('u-docs-sidebar', className)}>\n {header}\n {searchable && (\n <div className=\"u-input-group\" data-size=\"sm\">\n <span className=\"u-input-addon\" data-align=\"start\">\n <Search />\n </span>\n <input placeholder=\"Saring…\" value={q} onChange={(e) => setQ(e.target.value)} aria-label=\"Saring menu dokumentasi\" />\n </div>\n )}\n <nav className=\"u-docs-nav\" aria-label=\"Dokumentasi\">\n {filtered.map((s, i) => (\n <div key={i} className=\"u-docs-section\">\n <div className=\"u-docs-section-title\">{s.title}</div>\n <ul>\n {s.items.map((it) => {\n const active = it.key === activeKey;\n const props = { className: 'u-docs-link', 'data-active': dataFlag(active), 'aria-current': active ? ('page' as const) : undefined, onClick: it.onClick };\n const inner = (\n <>\n {it.label}\n {it.badge && <span className=\"u-docs-badge\">{it.badge}</span>}\n </>\n );\n return (\n <li key={it.key}>\n {it.href ? (\n renderLink ? (\n renderLink(it as NavItem, { ...props, href: it.href, children: inner })\n ) : (\n <a {...props} href={it.href}>\n {inner}\n </a>\n )\n ) : (\n <button type=\"button\" {...props}>\n {inner}\n </button>\n )}\n </li>\n );\n })}\n </ul>\n </div>\n ))}\n {!filtered.length && <p className=\"u-field-description\" style={{ padding: '0.5rem' }}>Tidak ada yang cocok dengan “{q}”.</p>}\n </nav>\n </aside>\n );\n}\n\n/** Daftar isi \"Di halaman ini\" dengan penanda bagian yang sedang dibaca (scroll-spy). */\nexport function TableOfContents({ items, title = 'Di halaman ini', className }: { items: Array<{ id: string; label: React.ReactNode; level?: 2 | 3 }>; title?: string; className?: string }) {\n const [active, setActive] = React.useState<string | undefined>(items[0]?.id);\n React.useEffect(() => {\n const els = items.map((i) => document.getElementById(i.id)).filter(Boolean) as HTMLElement[];\n if (!els.length) return;\n const io = new IntersectionObserver(\n (entries) => {\n const vis = entries.filter((e) => e.isIntersecting).sort((a, b) => a.boundingClientRect.top - b.boundingClientRect.top);\n if (vis[0]) setActive(vis[0].target.id);\n },\n { rootMargin: '0px 0px -70% 0px' },\n );\n els.forEach((e) => io.observe(e));\n return () => io.disconnect();\n }, [items]);\n return (\n <nav className={cn('u-toc', className)} aria-label={title}>\n <div className=\"u-docs-section-title\">{title}</div>\n <ul>\n {items.map((i) => (\n <li key={i.id} data-level={i.level ?? 2}>\n <a href={`#${i.id}`} data-active={dataFlag(active === i.id)} onClick={(e) => (e.preventDefault(), document.getElementById(i.id)?.scrollIntoView({ behavior: 'smooth', block: 'start' }), setActive(i.id))}>\n {i.label}\n </a>\n </li>\n ))}\n </ul>\n </nav>\n );\n}\n\n// ================================================================ Sidebar portal/media\nexport interface SidebarWidgetProps extends Omit<React.ComponentProps<'section'>, 'title'> {\n title: React.ReactNode;\n /** Tautan \"Lihat semua\" di kanan judul. */\n action?: React.ReactNode;\n variant?: 'plain' | 'card';\n}\n/** Satu blok di kolom samping portal (Terpopuler, Agenda, Pengumuman, Kategori, ...). */\nexport function SidebarWidget({ title, action, variant = 'plain', className, children, ...props }: SidebarWidgetProps) {\n return (\n <section className={cn('u-side-widget', className)} data-variant={variant} {...props}>\n <header className=\"u-side-widget-header\">\n <h3>{title}</h3>\n {action}\n </header>\n {children}\n </section>\n );\n}\n/** Kolom samping portal berita/media: tumpukan SidebarWidget, lengket saat digulir. */\nexport function PortalSidebar({ sticky = true, className, children }: { sticky?: boolean; className?: string; children: React.ReactNode }) {\n return (\n <aside className={cn('u-portal-sidebar', className)} data-sticky={dataFlag(sticky)}>\n {children}\n </aside>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/layout.tsx"],"names":["jsxs","Fragment","jsx","dataFlag","Tooltip","React","Menu","BaseCollapsible","ChevronDown","cn","Button","PanelLeftOpen","PanelLeftClose","Avatar","ChevronsUpDown","MenuIcon","Dialog","Search","Kbd"],"mappings":"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","file":"index.cjs","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { Collapsible as BaseCollapsible } from '@base-ui/react/collapsible';\nimport { ChevronDown, ChevronsUpDown, Menu as MenuIcon, PanelLeftClose, PanelLeftOpen, Search } from 'lucide-react';\nimport { cn, dataFlag } from '../lib/cn';\nimport { Button, Kbd } from './actions';\nimport { Avatar } from './display';\nimport { Dialog, Menu, Tooltip, type MenuEntry } from './overlays';\n\n// ================================================================ Sidebar dasbor aplikasi\nexport interface NavItem {\n /** Kunci unik; dicocokkan dengan `activeKey`. */\n key: string;\n label: React.ReactNode;\n icon?: React.ReactNode;\n href?: string;\n onClick?: () => void;\n /** Angka/teks kecil di kanan (mis. jumlah KRS menunggu). */\n badge?: React.ReactNode;\n /** Sub-menu (satu tingkat). */\n children?: NavItem[];\n disabled?: boolean;\n}\nexport interface NavGroup {\n label?: React.ReactNode;\n items: NavItem[];\n}\n\nexport interface SidebarUser {\n name: string;\n /** Baris kedua: NIM/NIDN/peran. */\n subtitle?: string;\n avatar?: string | null;\n menu?: MenuEntry[];\n}\n\nexport interface SidebarProps {\n /** Logo + nama aplikasi (gunakan <AppLogo />). */\n brand: React.ReactNode;\n groups: NavGroup[];\n activeKey?: string;\n /** Konten tepat di bawah brand, mis. pemilih prodi/periode atau pencarian. */\n header?: React.ReactNode;\n /** Konten di atas profil, mis. kartu \"Periode KRS dibuka\". */\n footer?: React.ReactNode;\n user?: SidebarUser;\n /** Mode ikon saja (rail). */\n collapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n /** Renderer tautan kustom, mis. <Link> Next.js/React Router. */\n renderLink?: (item: NavItem, props: React.AnchorHTMLAttributes<HTMLAnchorElement> & { children: React.ReactNode }) => React.ReactElement;\n /**\n * Hanya satu sub-menu terbuka dalam satu waktu: membuka satu menutup yang lain. Bawaan `true`.\n * Isi `false` agar setiap sub-menu bisa dibuka bersamaan.\n */\n accordion?: boolean;\n className?: string;\n}\n\nfunction containsActive(item: NavItem, key?: string): boolean {\n return item.key === key || Boolean(item.children?.some((c) => containsActive(c, key)));\n}\n\nfunction NavLink({ item, active, collapsed, renderLink, depth }: { item: NavItem; active: boolean; collapsed?: boolean; renderLink?: SidebarProps['renderLink']; depth: number }) {\n const content = (\n <>\n {depth === 0 && <span className=\"u-nav-icon\">{item.icon}</span>}\n <span className=\"u-nav-label\">{item.label}</span>\n {item.badge != null && <span className=\"u-nav-badge\">{item.badge}</span>}\n </>\n );\n const props = {\n className: 'u-nav-item',\n 'data-active': dataFlag(active),\n 'data-depth': depth,\n 'aria-current': active ? ('page' as const) : undefined,\n 'aria-disabled': item.disabled || undefined,\n onClick: item.onClick,\n };\n let el: React.ReactElement;\n if (item.href) el = renderLink ? renderLink(item, { ...props, href: item.href, children: content }) : <a {...props} href={item.href}>{content}</a>;\n else el = <button type=\"button\" {...props}>{content}</button>;\n return collapsed && depth === 0 ? (\n <Tooltip content={item.label} side=\"right\">\n {el}\n </Tooltip>\n ) : (\n el\n );\n}\n\nfunction NavTree({\n item,\n activeKey,\n collapsed,\n renderLink,\n open: openProp,\n onOpenChange,\n}: {\n item: NavItem;\n activeKey?: string;\n collapsed?: boolean;\n renderLink?: SidebarProps['renderLink'];\n /** Dikendalikan Sidebar saat mode accordion. */\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}) {\n const [openInner, setOpenInner] = React.useState(() => containsActive(item, activeKey));\n const open = openProp ?? openInner;\n const setOpen = (o: boolean) => (onOpenChange ? onOpenChange(o) : setOpenInner(o));\n if (!item.children?.length) return <NavLink item={item} active={item.key === activeKey} collapsed={collapsed} renderLink={renderLink} depth={0} />;\n const childActive = containsActive(item, activeKey);\n if (collapsed) {\n // Saat rail, sub-menu dibuka sebagai menu melayang.\n return (\n <Menu\n side=\"right\"\n align=\"start\"\n trigger={\n <button type=\"button\" className=\"u-nav-item\" data-active={dataFlag(childActive)} aria-label={typeof item.label === 'string' ? item.label : undefined}>\n <span className=\"u-nav-icon\">{item.icon}</span>\n </button>\n }\n items={[{ type: 'label', label: item.label }, ...item.children.map((c) => ({ label: c.label, href: c.href, onSelect: c.onClick }))]}\n />\n );\n }\n return (\n <BaseCollapsible.Root open={open} onOpenChange={setOpen}>\n <BaseCollapsible.Trigger className=\"u-nav-item\" data-parent-active={dataFlag(childActive)}>\n <span className=\"u-nav-icon\">{item.icon}</span>\n <span className=\"u-nav-label\">{item.label}</span>\n <ChevronDown className=\"u-nav-chevron\" />\n </BaseCollapsible.Trigger>\n <BaseCollapsible.Panel className=\"u-collapsible-panel\">\n <div className=\"u-nav-sub\">\n {item.children.map((c) => (\n <NavLink key={c.key} item={c} active={c.key === activeKey} renderLink={renderLink} depth={1} />\n ))}\n </div>\n </BaseCollapsible.Panel>\n </BaseCollapsible.Root>\n );\n}\n\n/** Sidebar aplikasi dasbor (SIAKAD, Pustikom, LMS, fakultas): grup menu, sub-menu, lencana, profil, mode rail. */\nexport function Sidebar({ brand, groups, activeKey, header, footer, user, collapsed, onCollapsedChange, renderLink, accordion = true, className }: SidebarProps) {\n // Mode accordion: simpan satu kunci sub-menu yang terbuka. Awalnya sub-menu yang memuat halaman aktif,\n // dan ikut berpindah saat halaman aktif pindah ke sub-menu lain.\n const induk = (key?: string) => groups.flatMap((g) => g.items).find((it) => it.children?.length && containsActive(it, key))?.key ?? null;\n const [openKey, setOpenKey] = React.useState<string | null>(() => induk(activeKey));\n React.useEffect(() => {\n const k = induk(activeKey);\n if (k) setOpenKey(k);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activeKey]);\n return (\n <aside className={cn('u-sidebar', className)} data-collapsed={dataFlag(collapsed)}>\n <div className=\"u-sidebar-brand\">\n {brand}\n {onCollapsedChange && (\n <Tooltip content={collapsed ? 'Lebarkan menu' : 'Ciutkan menu'} side=\"right\">\n <Button variant=\"ghost\" size=\"xs\" iconOnly className=\"u-sidebar-toggle\" aria-label={collapsed ? 'Lebarkan menu' : 'Ciutkan menu'} onClick={() => onCollapsedChange(!collapsed)}>\n {collapsed ? <PanelLeftOpen /> : <PanelLeftClose />}\n </Button>\n </Tooltip>\n )}\n </div>\n {header && !collapsed && <div className=\"u-sidebar-header\">{header}</div>}\n <nav className=\"u-sidebar-nav\" aria-label=\"Menu utama\">\n {groups.map((g, gi) => (\n <div key={gi} className=\"u-nav-group\">\n {g.label && !collapsed && <div className=\"u-nav-group-label\">{g.label}</div>}\n {g.items.map((it) => (\n <NavTree\n key={it.key}\n item={it}\n activeKey={activeKey}\n collapsed={collapsed}\n renderLink={renderLink}\n {...(accordion && it.children?.length ? { open: openKey === it.key, onOpenChange: (o: boolean) => setOpenKey(o ? it.key : openKey === it.key ? null : openKey) } : {})}\n />\n ))}\n </div>\n ))}\n </nav>\n {footer && !collapsed && <div className=\"u-sidebar-footer\">{footer}</div>}\n {user && (\n <div className=\"u-sidebar-user\">\n <Menu\n side={collapsed ? 'right' : 'top'}\n align=\"start\"\n trigger={\n <button type=\"button\" className=\"u-sidebar-user-button\">\n <Avatar name={user.name} src={user.avatar} size=\"sm\" />\n {!collapsed && (\n <>\n <span className=\"u-sidebar-user-text\">\n <span>{user.name}</span>\n {user.subtitle && <span>{user.subtitle}</span>}\n </span>\n <ChevronsUpDown className=\"u-nav-chevron\" />\n </>\n )}\n </button>\n }\n items={user.menu ?? []}\n />\n </div>\n )}\n </aside>\n );\n}\n\n// ================================================================ App shell\nexport interface AppShellProps {\n sidebar: React.ReactElement<SidebarProps>;\n /** Isi bilah atas (breadcrumb, pencarian, notifikasi). */\n topbar?: React.ReactNode;\n children: React.ReactNode;\n className?: string;\n}\n/** Kerangka halaman dasbor: sidebar tetap di desktop, laci (sheet) di ponsel. */\nexport function AppShell({ sidebar, topbar, children, className }: AppShellProps) {\n const [mobileOpen, setMobileOpen] = React.useState(false);\n return (\n <div className={cn('u-app-shell', className)} data-collapsed={dataFlag(sidebar.props.collapsed)}>\n <div className=\"u-app-shell-sidebar\">{sidebar}</div>\n <div className=\"u-app-shell-main\">\n <header className=\"u-topbar\">\n <Button variant=\"ghost\" size=\"sm\" iconOnly className=\"u-topbar-menu\" aria-label=\"Buka menu\" onClick={() => setMobileOpen(true)}>\n <MenuIcon />\n </Button>\n {topbar}\n </header>\n <main className=\"u-app-shell-content\">{children}</main>\n </div>\n <Dialog open={mobileOpen} onOpenChange={setMobileOpen} side=\"left\" title={<span className=\"u-sr-only\">Menu</span>} className=\"u-app-shell-drawer\">\n {React.cloneElement(sidebar, { collapsed: false, onCollapsedChange: undefined })}\n </Dialog>\n </div>\n );\n}\n\n/** Tombol pencarian ala command palette di bilah atas. */\nexport function SearchTrigger({ placeholder = 'Cari menu, mahasiswa, dosen…', shortcut = '⌘K', onClick, className }: { placeholder?: string; shortcut?: string; onClick?: () => void; className?: string }) {\n return (\n <button type=\"button\" className={cn('u-search-trigger', className)} onClick={onClick}>\n <Search />\n <span>{placeholder}</span>\n {shortcut && <Kbd>{shortcut}</Kbd>}\n </button>\n );\n}\n\n// ================================================================ Sidebar dokumentasi\nexport interface DocsNavSection {\n title: React.ReactNode;\n items: Array<{ key: string; label: React.ReactNode; href?: string; onClick?: () => void; badge?: React.ReactNode }>;\n}\nexport interface DocsSidebarProps {\n sections: DocsNavSection[];\n activeKey?: string;\n /** Pencarian di dalam daftar (penyaringan klien). */\n searchable?: boolean;\n header?: React.ReactNode;\n className?: string;\n renderLink?: SidebarProps['renderLink'];\n}\n/** Sidebar halaman dokumentasi (API, panduan, pustaka komponen): seksi bertajuk, penanda aktif, saringan. */\nexport function DocsSidebar({ sections, activeKey, searchable = true, header, className, renderLink }: DocsSidebarProps) {\n const [q, setQ] = React.useState('');\n const norm = q.trim().toLowerCase();\n const filtered = sections\n .map((s) => ({ ...s, items: norm ? s.items.filter((i) => String(i.label).toLowerCase().includes(norm)) : s.items }))\n .filter((s) => s.items.length);\n return (\n <aside className={cn('u-docs-sidebar', className)}>\n {header}\n {searchable && (\n <div className=\"u-input-group\" data-size=\"sm\">\n <span className=\"u-input-addon\" data-align=\"start\">\n <Search />\n </span>\n <input placeholder=\"Saring…\" value={q} onChange={(e) => setQ(e.target.value)} aria-label=\"Saring menu dokumentasi\" />\n </div>\n )}\n <nav className=\"u-docs-nav\" aria-label=\"Dokumentasi\">\n {filtered.map((s, i) => (\n <div key={i} className=\"u-docs-section\">\n <div className=\"u-docs-section-title\">{s.title}</div>\n <ul>\n {s.items.map((it) => {\n const active = it.key === activeKey;\n const props = { className: 'u-docs-link', 'data-active': dataFlag(active), 'aria-current': active ? ('page' as const) : undefined, onClick: it.onClick };\n const inner = (\n <>\n {it.label}\n {it.badge && <span className=\"u-docs-badge\">{it.badge}</span>}\n </>\n );\n return (\n <li key={it.key}>\n {it.href ? (\n renderLink ? (\n renderLink(it as NavItem, { ...props, href: it.href, children: inner })\n ) : (\n <a {...props} href={it.href}>\n {inner}\n </a>\n )\n ) : (\n <button type=\"button\" {...props}>\n {inner}\n </button>\n )}\n </li>\n );\n })}\n </ul>\n </div>\n ))}\n {!filtered.length && <p className=\"u-field-description\" style={{ padding: '0.5rem' }}>Tidak ada yang cocok dengan “{q}”.</p>}\n </nav>\n </aside>\n );\n}\n\n/** Daftar isi \"Di halaman ini\" dengan penanda bagian yang sedang dibaca (scroll-spy). */\nexport function TableOfContents({ items, title = 'Di halaman ini', className }: { items: Array<{ id: string; label: React.ReactNode; level?: 2 | 3 }>; title?: string; className?: string }) {\n const [active, setActive] = React.useState<string | undefined>(items[0]?.id);\n React.useEffect(() => {\n const els = items.map((i) => document.getElementById(i.id)).filter(Boolean) as HTMLElement[];\n if (!els.length) return;\n const io = new IntersectionObserver(\n (entries) => {\n const vis = entries.filter((e) => e.isIntersecting).sort((a, b) => a.boundingClientRect.top - b.boundingClientRect.top);\n if (vis[0]) setActive(vis[0].target.id);\n },\n { rootMargin: '0px 0px -70% 0px' },\n );\n els.forEach((e) => io.observe(e));\n return () => io.disconnect();\n }, [items]);\n return (\n <nav className={cn('u-toc', className)} aria-label={title}>\n <div className=\"u-docs-section-title\">{title}</div>\n <ul>\n {items.map((i) => (\n <li key={i.id} data-level={i.level ?? 2}>\n <a href={`#${i.id}`} data-active={dataFlag(active === i.id)} onClick={(e) => (e.preventDefault(), document.getElementById(i.id)?.scrollIntoView({ behavior: 'smooth', block: 'start' }), setActive(i.id))}>\n {i.label}\n </a>\n </li>\n ))}\n </ul>\n </nav>\n );\n}\n\n// ================================================================ Sidebar portal/media\nexport interface SidebarWidgetProps extends Omit<React.ComponentProps<'section'>, 'title'> {\n title: React.ReactNode;\n /** Tautan \"Lihat semua\" di kanan judul. */\n action?: React.ReactNode;\n variant?: 'plain' | 'card';\n}\n/** Satu blok di kolom samping portal (Terpopuler, Agenda, Pengumuman, Kategori, ...). */\nexport function SidebarWidget({ title, action, variant = 'plain', className, children, ...props }: SidebarWidgetProps) {\n return (\n <section className={cn('u-side-widget', className)} data-variant={variant} {...props}>\n <header className=\"u-side-widget-header\">\n <h3>{title}</h3>\n {action}\n </header>\n {children}\n </section>\n );\n}\n/** Kolom samping portal berita/media: tumpukan SidebarWidget, lengket saat digulir. */\nexport function PortalSidebar({ sticky = true, className, children }: { sticky?: boolean; className?: string; children: React.ReactNode }) {\n return (\n <aside className={cn('u-portal-sidebar', className)} data-sticky={dataFlag(sticky)}>\n {children}\n </aside>\n );\n}\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { A as APP_COLORS, a as APP_GLYPHS, b as AgendaList, c as AgendaListProps, d as AnnouncementItem, e as AnnouncementList, f as AppLogo, g as AppLogoProps, h as AppShell, i as AppShellProps, B as Badge, j as BadgeProps, k as BadgeVariant, l as Button, m as ButtonGroup, n as ButtonProps, o as ButtonSize, p as ButtonVariant, C as CalendarEvent, q as Checkbox, r as CheckboxGroup, s as CheckboxGroupProps, t as Choice, u as ChoiceCard, v as ChoiceOption, w as ChoiceProps, x as Combobox, y as ComboboxProps, z as ConfirmDialog, D as ConfirmDialogProps, E as ControlSize, F as DataColumn, G as DataTable, H as DataTableProps, I as DateRangeValue, J as DateTile, K as Dialog, L as DialogClose, M as DialogProps, N as DocsNavSection, O as DocsSidebar, P as DocsSidebarProps, Q as EVENT_COLORS, R as EventCalendar, S as EventCalendarProps, T as EventCard, U as EventCardItem, V as EventLegend, W as FacetFilter, X as FacetFilterProps, Y as Faq, Z as FaqItem, _ as FaqProps, $ as Field, a0 as FieldControl, a1 as FieldDescription, a2 as FieldError, a3 as FieldProps, a4 as Fieldset, a5 as FilterBar, a6 as FilterBarProps, a7 as FilterField, a8 as FilterOption, a9 as FilterValues, aa as Hero, ab as HeroProps, ac as Input, ad as InputGroup, ae as InputGroupProps, af as InputProps, ag as Kbd, ah as Label, ai as LabelProps, aj as LogoTone, ak as MarkShape, al as Menu, am as MenuEntry, an as MenuProps, ao as NavGroup, ap as NavItem, aq as Navbar, ar as NavbarColumn, as as NavbarFeatured, at as NavbarLink, au as NavbarMenu, av as NavbarProps, aw as NewsCard, ax as NewsCardProps, ay as NewsCardSkeleton, az as NewsGrid, aA as NewsGridProps, aB as NewsItem, aC as NumberField, aD as OptionContent, aE as OtpField, aF as OtpFieldProps, aG as Popover, aH as PopoverProps, aI as PortalSidebar, aJ as Radio, aK as RadioGroup, aL as RadioGroupProps, aM as RankedList, aN as SearchTrigger, aO as Section, aP as SectionProps, aQ as SegmentedControl, aR as SegmentedControlProps, aS as Select, aT as SelectOption, aU as SelectProps, aV as Separator, aW as Sheet, aX as Sidebar, aY as SidebarProps, aZ as SidebarUser, a_ as SidebarWidget, a$ as SidebarWidgetProps, b0 as Skeleton, b1 as Slider, b2 as SortState, b3 as Spinner, b4 as Switch, b5 as TableOfContents, b6 as Tag, b7 as TagProps, b8 as Textarea, b9 as Toaster, ba as Toggle, bb as ToggleGroup, bc as Tooltip, bd as TooltipProps, be as TooltipProvider, bf as UnipoApp, bg as UnipoAppLogo, bh as UnipoMark, bi as UnipoMarkProps, bj as VisuallyHidden, bk as eventColor, bl as eventsByDay, bm as filterToQuery, bn as formatEventRange, bo as useFilterParams, bp as useToast } from './content-
|
|
1
|
+
export { A as APP_COLORS, a as APP_GLYPHS, b as AgendaList, c as AgendaListProps, d as AnnouncementItem, e as AnnouncementList, f as AppLogo, g as AppLogoProps, h as AppShell, i as AppShellProps, B as Badge, j as BadgeProps, k as BadgeVariant, l as Button, m as ButtonGroup, n as ButtonProps, o as ButtonSize, p as ButtonVariant, C as CalendarEvent, q as Checkbox, r as CheckboxGroup, s as CheckboxGroupProps, t as Choice, u as ChoiceCard, v as ChoiceOption, w as ChoiceProps, x as Combobox, y as ComboboxProps, z as ConfirmDialog, D as ConfirmDialogProps, E as ControlSize, F as DataColumn, G as DataTable, H as DataTableProps, I as DateRangeValue, J as DateTile, K as Dialog, L as DialogClose, M as DialogProps, N as DocsNavSection, O as DocsSidebar, P as DocsSidebarProps, Q as EVENT_COLORS, R as EventCalendar, S as EventCalendarProps, T as EventCard, U as EventCardItem, V as EventLegend, W as FacetFilter, X as FacetFilterProps, Y as Faq, Z as FaqItem, _ as FaqProps, $ as Field, a0 as FieldControl, a1 as FieldDescription, a2 as FieldError, a3 as FieldProps, a4 as Fieldset, a5 as FilterBar, a6 as FilterBarProps, a7 as FilterField, a8 as FilterOption, a9 as FilterValues, aa as Hero, ab as HeroProps, ac as Input, ad as InputGroup, ae as InputGroupProps, af as InputProps, ag as Kbd, ah as Label, ai as LabelProps, aj as LogoTone, ak as MarkShape, al as Menu, am as MenuEntry, an as MenuProps, ao as NavGroup, ap as NavItem, aq as Navbar, ar as NavbarColumn, as as NavbarFeatured, at as NavbarLink, au as NavbarMenu, av as NavbarProps, aw as NewsCard, ax as NewsCardProps, ay as NewsCardSkeleton, az as NewsGrid, aA as NewsGridProps, aB as NewsItem, aC as NumberField, aD as OptionContent, aE as OtpField, aF as OtpFieldProps, aG as Popover, aH as PopoverProps, aI as PortalSidebar, aJ as Radio, aK as RadioGroup, aL as RadioGroupProps, aM as RankedList, aN as SearchTrigger, aO as Section, aP as SectionProps, aQ as SegmentedControl, aR as SegmentedControlProps, aS as Select, aT as SelectOption, aU as SelectProps, aV as Separator, aW as Sheet, aX as Sidebar, aY as SidebarProps, aZ as SidebarUser, a_ as SidebarWidget, a$ as SidebarWidgetProps, b0 as Skeleton, b1 as Slider, b2 as SortState, b3 as Spinner, b4 as Switch, b5 as TableOfContents, b6 as Tag, b7 as TagProps, b8 as Textarea, b9 as Toaster, ba as Toggle, bb as ToggleGroup, bc as Tooltip, bd as TooltipProps, be as TooltipProvider, bf as UnipoApp, bg as UnipoAppLogo, bh as UnipoMark, bi as UnipoMarkProps, bj as VisuallyHidden, bk as eventColor, bl as eventsByDay, bm as filterToQuery, bn as formatEventRange, bo as useFilterParams, bp as useToast } from './content-DaJPx5LX.cjs';
|
|
2
2
|
import * as _base_ui_react from '@base-ui/react';
|
|
3
3
|
import * as React from 'react';
|
|
4
4
|
import { Avatar as Avatar$1 } from '@base-ui/react/avatar';
|
|
@@ -350,6 +350,21 @@ declare function InlineCode({ children, copyable, className }: {
|
|
|
350
350
|
className?: string;
|
|
351
351
|
}): React.JSX.Element;
|
|
352
352
|
|
|
353
|
+
/**
|
|
354
|
+
* Ambil ID permintaan (request_id) dari galat API: `requestId` di SiakadError (unipo-siakad-sdk),
|
|
355
|
+
* `request_id` di jawaban JSON, atau `details.request_id`. Kosong bila tidak ada.
|
|
356
|
+
*/
|
|
357
|
+
declare function requestIdDari(e: unknown): string | null;
|
|
358
|
+
/**
|
|
359
|
+
* Baris "Kode laporan: abc123 [salin]" untuk ditaruh di bawah pesan galat. Tidak tampil apa pun bila
|
|
360
|
+
* galat tidak membawa request_id. Pengguna cukup menyalin kode ini saat melapor ke Pustikom.
|
|
361
|
+
*/
|
|
362
|
+
declare function KodeLaporan({ error, id, className }: {
|
|
363
|
+
error?: unknown; /** Isi langsung bila sudah tahu ID-nya. */
|
|
364
|
+
id?: string | null;
|
|
365
|
+
className?: string;
|
|
366
|
+
}): React.JSX.Element | null;
|
|
367
|
+
|
|
353
368
|
/** ok = normal, degraded = lambat/sebagian, down = gangguan, maintenance = pemeliharaan, off = tidak aktif, checking = sedang diperiksa. */
|
|
354
369
|
type ServiceState = 'ok' | 'degraded' | 'down' | 'maintenance' | 'off' | 'checking';
|
|
355
370
|
interface ServiceInfo {
|
|
@@ -723,4 +738,4 @@ declare function ActivityFeed({ items, loading, empty, className }: {
|
|
|
723
738
|
className?: string;
|
|
724
739
|
}): React.JSX.Element;
|
|
725
740
|
|
|
726
|
-
export { Accordion, type AccordionItem, type ActionItem, ActionList, ActivityFeed, Alert, type AlertProps, type AlertVariant, Avatar, AvatarGroup, type AvatarProps, type AvatarSize, BarChart, type BarChartProps, BarList, type BarListItem, Breadcrumb, BudgetMeter, CHART_COLORS, Calendar, type CalendarMarker, type CalendarProps, Card, CardContent, CardFooter, CardHeader, type CardProps, CellPrimary, type ChartSeries, CodeBlock, type CodeBlockProps, type CodeLanguage, type CodeSnippet, Collapsible, CollapsiblePanel, CollapsibleTrigger, CopyButton, type CycleStep, CycleSteps, DashboardGrid, DatePicker, type DatePickerProps, DescriptionList, DonutChart, type DonutSegment, Dropzone, type DropzoneProps, Empty, type FeedItem, FileList, FormGrid, Funnel, type FunnelStage, GroupedBarChart, InlineCode, LatencyIndicator, LineChart, Pagination, type PaginationProps, Panel, Progress, type ProgressProps, ProgressRing, type ReviewSection, ScrollArea, SegmentBar, type ServiceCheck, type ServiceInfo, ServiceList, type ServiceListProps, type ServiceState, ServiceStatusBadge, ServiceStatusPanel, type ServiceStatusPanelProps, SortButton, Sparkline, StatCard, type StatCardProps, StatGrid, StatusBanner, type StatusBannerProps, type StepItem, Stepper, type StepperProps, type TabItem, Table, TableContainer, Tabs, type TabsProps, type Tone, type UploadedFile, UptimeBar, Wizard, type WizardProps, WizardReview, type WizardStep, chartColor, cn, dataFlag, formatBytes, formatCompact, formatDate, formatNumber, formatPersen, formatRelative, formatRupiah, formatRupiahRingkas, formatTime, hueFromString, initials, monthMatrix, overallStatus, parseISODate, toISODate, tokenize, useCopy, useServiceChecks };
|
|
741
|
+
export { Accordion, type AccordionItem, type ActionItem, ActionList, ActivityFeed, Alert, type AlertProps, type AlertVariant, Avatar, AvatarGroup, type AvatarProps, type AvatarSize, BarChart, type BarChartProps, BarList, type BarListItem, Breadcrumb, BudgetMeter, CHART_COLORS, Calendar, type CalendarMarker, type CalendarProps, Card, CardContent, CardFooter, CardHeader, type CardProps, CellPrimary, type ChartSeries, CodeBlock, type CodeBlockProps, type CodeLanguage, type CodeSnippet, Collapsible, CollapsiblePanel, CollapsibleTrigger, CopyButton, type CycleStep, CycleSteps, DashboardGrid, DatePicker, type DatePickerProps, DescriptionList, DonutChart, type DonutSegment, Dropzone, type DropzoneProps, Empty, type FeedItem, FileList, FormGrid, Funnel, type FunnelStage, GroupedBarChart, InlineCode, KodeLaporan, LatencyIndicator, LineChart, Pagination, type PaginationProps, Panel, Progress, type ProgressProps, ProgressRing, type ReviewSection, ScrollArea, SegmentBar, type ServiceCheck, type ServiceInfo, ServiceList, type ServiceListProps, type ServiceState, ServiceStatusBadge, ServiceStatusPanel, type ServiceStatusPanelProps, SortButton, Sparkline, StatCard, type StatCardProps, StatGrid, StatusBanner, type StatusBannerProps, type StepItem, Stepper, type StepperProps, type TabItem, Table, TableContainer, Tabs, type TabsProps, type Tone, type UploadedFile, UptimeBar, Wizard, type WizardProps, WizardReview, type WizardStep, chartColor, cn, dataFlag, formatBytes, formatCompact, formatDate, formatNumber, formatPersen, formatRelative, formatRupiah, formatRupiahRingkas, formatTime, hueFromString, initials, monthMatrix, overallStatus, parseISODate, requestIdDari, toISODate, tokenize, useCopy, useServiceChecks };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { A as APP_COLORS, a as APP_GLYPHS, b as AgendaList, c as AgendaListProps, d as AnnouncementItem, e as AnnouncementList, f as AppLogo, g as AppLogoProps, h as AppShell, i as AppShellProps, B as Badge, j as BadgeProps, k as BadgeVariant, l as Button, m as ButtonGroup, n as ButtonProps, o as ButtonSize, p as ButtonVariant, C as CalendarEvent, q as Checkbox, r as CheckboxGroup, s as CheckboxGroupProps, t as Choice, u as ChoiceCard, v as ChoiceOption, w as ChoiceProps, x as Combobox, y as ComboboxProps, z as ConfirmDialog, D as ConfirmDialogProps, E as ControlSize, F as DataColumn, G as DataTable, H as DataTableProps, I as DateRangeValue, J as DateTile, K as Dialog, L as DialogClose, M as DialogProps, N as DocsNavSection, O as DocsSidebar, P as DocsSidebarProps, Q as EVENT_COLORS, R as EventCalendar, S as EventCalendarProps, T as EventCard, U as EventCardItem, V as EventLegend, W as FacetFilter, X as FacetFilterProps, Y as Faq, Z as FaqItem, _ as FaqProps, $ as Field, a0 as FieldControl, a1 as FieldDescription, a2 as FieldError, a3 as FieldProps, a4 as Fieldset, a5 as FilterBar, a6 as FilterBarProps, a7 as FilterField, a8 as FilterOption, a9 as FilterValues, aa as Hero, ab as HeroProps, ac as Input, ad as InputGroup, ae as InputGroupProps, af as InputProps, ag as Kbd, ah as Label, ai as LabelProps, aj as LogoTone, ak as MarkShape, al as Menu, am as MenuEntry, an as MenuProps, ao as NavGroup, ap as NavItem, aq as Navbar, ar as NavbarColumn, as as NavbarFeatured, at as NavbarLink, au as NavbarMenu, av as NavbarProps, aw as NewsCard, ax as NewsCardProps, ay as NewsCardSkeleton, az as NewsGrid, aA as NewsGridProps, aB as NewsItem, aC as NumberField, aD as OptionContent, aE as OtpField, aF as OtpFieldProps, aG as Popover, aH as PopoverProps, aI as PortalSidebar, aJ as Radio, aK as RadioGroup, aL as RadioGroupProps, aM as RankedList, aN as SearchTrigger, aO as Section, aP as SectionProps, aQ as SegmentedControl, aR as SegmentedControlProps, aS as Select, aT as SelectOption, aU as SelectProps, aV as Separator, aW as Sheet, aX as Sidebar, aY as SidebarProps, aZ as SidebarUser, a_ as SidebarWidget, a$ as SidebarWidgetProps, b0 as Skeleton, b1 as Slider, b2 as SortState, b3 as Spinner, b4 as Switch, b5 as TableOfContents, b6 as Tag, b7 as TagProps, b8 as Textarea, b9 as Toaster, ba as Toggle, bb as ToggleGroup, bc as Tooltip, bd as TooltipProps, be as TooltipProvider, bf as UnipoApp, bg as UnipoAppLogo, bh as UnipoMark, bi as UnipoMarkProps, bj as VisuallyHidden, bk as eventColor, bl as eventsByDay, bm as filterToQuery, bn as formatEventRange, bo as useFilterParams, bp as useToast } from './content-
|
|
1
|
+
export { A as APP_COLORS, a as APP_GLYPHS, b as AgendaList, c as AgendaListProps, d as AnnouncementItem, e as AnnouncementList, f as AppLogo, g as AppLogoProps, h as AppShell, i as AppShellProps, B as Badge, j as BadgeProps, k as BadgeVariant, l as Button, m as ButtonGroup, n as ButtonProps, o as ButtonSize, p as ButtonVariant, C as CalendarEvent, q as Checkbox, r as CheckboxGroup, s as CheckboxGroupProps, t as Choice, u as ChoiceCard, v as ChoiceOption, w as ChoiceProps, x as Combobox, y as ComboboxProps, z as ConfirmDialog, D as ConfirmDialogProps, E as ControlSize, F as DataColumn, G as DataTable, H as DataTableProps, I as DateRangeValue, J as DateTile, K as Dialog, L as DialogClose, M as DialogProps, N as DocsNavSection, O as DocsSidebar, P as DocsSidebarProps, Q as EVENT_COLORS, R as EventCalendar, S as EventCalendarProps, T as EventCard, U as EventCardItem, V as EventLegend, W as FacetFilter, X as FacetFilterProps, Y as Faq, Z as FaqItem, _ as FaqProps, $ as Field, a0 as FieldControl, a1 as FieldDescription, a2 as FieldError, a3 as FieldProps, a4 as Fieldset, a5 as FilterBar, a6 as FilterBarProps, a7 as FilterField, a8 as FilterOption, a9 as FilterValues, aa as Hero, ab as HeroProps, ac as Input, ad as InputGroup, ae as InputGroupProps, af as InputProps, ag as Kbd, ah as Label, ai as LabelProps, aj as LogoTone, ak as MarkShape, al as Menu, am as MenuEntry, an as MenuProps, ao as NavGroup, ap as NavItem, aq as Navbar, ar as NavbarColumn, as as NavbarFeatured, at as NavbarLink, au as NavbarMenu, av as NavbarProps, aw as NewsCard, ax as NewsCardProps, ay as NewsCardSkeleton, az as NewsGrid, aA as NewsGridProps, aB as NewsItem, aC as NumberField, aD as OptionContent, aE as OtpField, aF as OtpFieldProps, aG as Popover, aH as PopoverProps, aI as PortalSidebar, aJ as Radio, aK as RadioGroup, aL as RadioGroupProps, aM as RankedList, aN as SearchTrigger, aO as Section, aP as SectionProps, aQ as SegmentedControl, aR as SegmentedControlProps, aS as Select, aT as SelectOption, aU as SelectProps, aV as Separator, aW as Sheet, aX as Sidebar, aY as SidebarProps, aZ as SidebarUser, a_ as SidebarWidget, a$ as SidebarWidgetProps, b0 as Skeleton, b1 as Slider, b2 as SortState, b3 as Spinner, b4 as Switch, b5 as TableOfContents, b6 as Tag, b7 as TagProps, b8 as Textarea, b9 as Toaster, ba as Toggle, bb as ToggleGroup, bc as Tooltip, bd as TooltipProps, be as TooltipProvider, bf as UnipoApp, bg as UnipoAppLogo, bh as UnipoMark, bi as UnipoMarkProps, bj as VisuallyHidden, bk as eventColor, bl as eventsByDay, bm as filterToQuery, bn as formatEventRange, bo as useFilterParams, bp as useToast } from './content-DaJPx5LX.js';
|
|
2
2
|
import * as _base_ui_react from '@base-ui/react';
|
|
3
3
|
import * as React from 'react';
|
|
4
4
|
import { Avatar as Avatar$1 } from '@base-ui/react/avatar';
|
|
@@ -350,6 +350,21 @@ declare function InlineCode({ children, copyable, className }: {
|
|
|
350
350
|
className?: string;
|
|
351
351
|
}): React.JSX.Element;
|
|
352
352
|
|
|
353
|
+
/**
|
|
354
|
+
* Ambil ID permintaan (request_id) dari galat API: `requestId` di SiakadError (unipo-siakad-sdk),
|
|
355
|
+
* `request_id` di jawaban JSON, atau `details.request_id`. Kosong bila tidak ada.
|
|
356
|
+
*/
|
|
357
|
+
declare function requestIdDari(e: unknown): string | null;
|
|
358
|
+
/**
|
|
359
|
+
* Baris "Kode laporan: abc123 [salin]" untuk ditaruh di bawah pesan galat. Tidak tampil apa pun bila
|
|
360
|
+
* galat tidak membawa request_id. Pengguna cukup menyalin kode ini saat melapor ke Pustikom.
|
|
361
|
+
*/
|
|
362
|
+
declare function KodeLaporan({ error, id, className }: {
|
|
363
|
+
error?: unknown; /** Isi langsung bila sudah tahu ID-nya. */
|
|
364
|
+
id?: string | null;
|
|
365
|
+
className?: string;
|
|
366
|
+
}): React.JSX.Element | null;
|
|
367
|
+
|
|
353
368
|
/** ok = normal, degraded = lambat/sebagian, down = gangguan, maintenance = pemeliharaan, off = tidak aktif, checking = sedang diperiksa. */
|
|
354
369
|
type ServiceState = 'ok' | 'degraded' | 'down' | 'maintenance' | 'off' | 'checking';
|
|
355
370
|
interface ServiceInfo {
|
|
@@ -723,4 +738,4 @@ declare function ActivityFeed({ items, loading, empty, className }: {
|
|
|
723
738
|
className?: string;
|
|
724
739
|
}): React.JSX.Element;
|
|
725
740
|
|
|
726
|
-
export { Accordion, type AccordionItem, type ActionItem, ActionList, ActivityFeed, Alert, type AlertProps, type AlertVariant, Avatar, AvatarGroup, type AvatarProps, type AvatarSize, BarChart, type BarChartProps, BarList, type BarListItem, Breadcrumb, BudgetMeter, CHART_COLORS, Calendar, type CalendarMarker, type CalendarProps, Card, CardContent, CardFooter, CardHeader, type CardProps, CellPrimary, type ChartSeries, CodeBlock, type CodeBlockProps, type CodeLanguage, type CodeSnippet, Collapsible, CollapsiblePanel, CollapsibleTrigger, CopyButton, type CycleStep, CycleSteps, DashboardGrid, DatePicker, type DatePickerProps, DescriptionList, DonutChart, type DonutSegment, Dropzone, type DropzoneProps, Empty, type FeedItem, FileList, FormGrid, Funnel, type FunnelStage, GroupedBarChart, InlineCode, LatencyIndicator, LineChart, Pagination, type PaginationProps, Panel, Progress, type ProgressProps, ProgressRing, type ReviewSection, ScrollArea, SegmentBar, type ServiceCheck, type ServiceInfo, ServiceList, type ServiceListProps, type ServiceState, ServiceStatusBadge, ServiceStatusPanel, type ServiceStatusPanelProps, SortButton, Sparkline, StatCard, type StatCardProps, StatGrid, StatusBanner, type StatusBannerProps, type StepItem, Stepper, type StepperProps, type TabItem, Table, TableContainer, Tabs, type TabsProps, type Tone, type UploadedFile, UptimeBar, Wizard, type WizardProps, WizardReview, type WizardStep, chartColor, cn, dataFlag, formatBytes, formatCompact, formatDate, formatNumber, formatPersen, formatRelative, formatRupiah, formatRupiahRingkas, formatTime, hueFromString, initials, monthMatrix, overallStatus, parseISODate, toISODate, tokenize, useCopy, useServiceChecks };
|
|
741
|
+
export { Accordion, type AccordionItem, type ActionItem, ActionList, ActivityFeed, Alert, type AlertProps, type AlertVariant, Avatar, AvatarGroup, type AvatarProps, type AvatarSize, BarChart, type BarChartProps, BarList, type BarListItem, Breadcrumb, BudgetMeter, CHART_COLORS, Calendar, type CalendarMarker, type CalendarProps, Card, CardContent, CardFooter, CardHeader, type CardProps, CellPrimary, type ChartSeries, CodeBlock, type CodeBlockProps, type CodeLanguage, type CodeSnippet, Collapsible, CollapsiblePanel, CollapsibleTrigger, CopyButton, type CycleStep, CycleSteps, DashboardGrid, DatePicker, type DatePickerProps, DescriptionList, DonutChart, type DonutSegment, Dropzone, type DropzoneProps, Empty, type FeedItem, FileList, FormGrid, Funnel, type FunnelStage, GroupedBarChart, InlineCode, KodeLaporan, LatencyIndicator, LineChart, Pagination, type PaginationProps, Panel, Progress, type ProgressProps, ProgressRing, type ReviewSection, ScrollArea, SegmentBar, type ServiceCheck, type ServiceInfo, ServiceList, type ServiceListProps, type ServiceState, ServiceStatusBadge, ServiceStatusPanel, type ServiceStatusPanelProps, SortButton, Sparkline, StatCard, type StatCardProps, StatGrid, StatusBanner, type StatusBannerProps, type StepItem, Stepper, type StepperProps, type TabItem, Table, TableContainer, Tabs, type TabsProps, type Tone, type UploadedFile, UptimeBar, Wizard, type WizardProps, WizardReview, type WizardStep, chartColor, cn, dataFlag, formatBytes, formatCompact, formatDate, formatNumber, formatPersen, formatRelative, formatRupiah, formatRupiahRingkas, formatTime, hueFromString, initials, monthMatrix, overallStatus, parseISODate, requestIdDari, toISODate, tokenize, useCopy, useServiceChecks };
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { Tooltip, Button, Menu, Avatar, dataFlag, cn, Dialog, Kbd } from './chunk-
|
|
3
|
-
export { APP_COLORS, APP_GLYPHS, Accordion, ActionList, ActivityFeed, AgendaList, Alert, AnnouncementList, AppLogo, Avatar, AvatarGroup, Badge, BarChart, BarList, Breadcrumb, BudgetMeter, Button, ButtonGroup, CHART_COLORS, Calendar, Card, CardContent, CardFooter, CardHeader, CellPrimary, Checkbox, CheckboxGroup, Choice, ChoiceCard, CodeBlock, Collapsible, CollapsiblePanel, CollapsibleTrigger, Combobox, ConfirmDialog, CopyButton, CycleSteps, DashboardGrid, DataTable, DatePicker, DateTile, DescriptionList, Dialog, DialogClose, DonutChart, Dropzone, EVENT_COLORS, Empty, EventCalendar, EventCard, EventLegend, FacetFilter, Faq, Field, FieldControl, FieldDescription, FieldError, Fieldset, FileList, FilterBar, FormGrid, Funnel, GroupedBarChart, Hero, InlineCode, Input, InputGroup, Kbd, Label, LatencyIndicator, LineChart, Menu, Navbar, NewsCard, NewsCardSkeleton, NewsGrid, NumberField, OptionContent, OtpField, Pagination, Panel, Popover, Progress, ProgressRing, Radio, RadioGroup, RankedList, ScrollArea, Section, SegmentBar, SegmentedControl, Select, Separator, ServiceList, ServiceStatusBadge, ServiceStatusPanel, Sheet, Skeleton, Slider, SortButton, Sparkline, Spinner, StatCard, StatGrid, StatusBanner, Stepper, Switch, Table, TableContainer, Tabs, Tag, Textarea, Toaster, Toggle, ToggleGroup, Tooltip, TooltipProvider, UnipoAppLogo, UnipoMark, UptimeBar, VisuallyHidden, Wizard, WizardReview, chartColor, cn, dataFlag, eventColor, eventsByDay, filterToQuery, formatBytes, formatCompact, formatDate, formatEventRange, formatNumber, formatPersen, formatRelative, formatRupiah, formatRupiahRingkas, formatTime, hueFromString, initials, monthMatrix, overallStatus, parseISODate, toISODate, tokenize, useCopy, useFilterParams, useServiceChecks, useToast } from './chunk-
|
|
2
|
+
import { Tooltip, Button, Menu, Avatar, dataFlag, cn, Dialog, Kbd } from './chunk-SJ4DJOMZ.js';
|
|
3
|
+
export { APP_COLORS, APP_GLYPHS, Accordion, ActionList, ActivityFeed, AgendaList, Alert, AnnouncementList, AppLogo, Avatar, AvatarGroup, Badge, BarChart, BarList, Breadcrumb, BudgetMeter, Button, ButtonGroup, CHART_COLORS, Calendar, Card, CardContent, CardFooter, CardHeader, CellPrimary, Checkbox, CheckboxGroup, Choice, ChoiceCard, CodeBlock, Collapsible, CollapsiblePanel, CollapsibleTrigger, Combobox, ConfirmDialog, CopyButton, CycleSteps, DashboardGrid, DataTable, DatePicker, DateTile, DescriptionList, Dialog, DialogClose, DonutChart, Dropzone, EVENT_COLORS, Empty, EventCalendar, EventCard, EventLegend, FacetFilter, Faq, Field, FieldControl, FieldDescription, FieldError, Fieldset, FileList, FilterBar, FormGrid, Funnel, GroupedBarChart, Hero, InlineCode, Input, InputGroup, Kbd, KodeLaporan, Label, LatencyIndicator, LineChart, Menu, Navbar, NewsCard, NewsCardSkeleton, NewsGrid, NumberField, OptionContent, OtpField, Pagination, Panel, Popover, Progress, ProgressRing, Radio, RadioGroup, RankedList, ScrollArea, Section, SegmentBar, SegmentedControl, Select, Separator, ServiceList, ServiceStatusBadge, ServiceStatusPanel, Sheet, Skeleton, Slider, SortButton, Sparkline, Spinner, StatCard, StatGrid, StatusBanner, Stepper, Switch, Table, TableContainer, Tabs, Tag, Textarea, Toaster, Toggle, ToggleGroup, Tooltip, TooltipProvider, UnipoAppLogo, UnipoMark, UptimeBar, VisuallyHidden, Wizard, WizardReview, chartColor, cn, dataFlag, eventColor, eventsByDay, filterToQuery, formatBytes, formatCompact, formatDate, formatEventRange, formatNumber, formatPersen, formatRelative, formatRupiah, formatRupiahRingkas, formatTime, hueFromString, initials, monthMatrix, overallStatus, parseISODate, requestIdDari, toISODate, tokenize, useCopy, useFilterParams, useServiceChecks, useToast } from './chunk-SJ4DJOMZ.js';
|
|
4
4
|
import * as React from 'react';
|
|
5
5
|
import { Collapsible } from '@base-ui/react/collapsible';
|
|
6
6
|
import { PanelLeftOpen, PanelLeftClose, ChevronsUpDown, Menu as Menu$1, Search, ChevronDown } from 'lucide-react';
|
|
@@ -28,8 +28,17 @@ function NavLink({ item, active, collapsed, renderLink, depth }) {
|
|
|
28
28
|
else el = /* @__PURE__ */ jsx("button", { type: "button", ...props, children: content });
|
|
29
29
|
return collapsed && depth === 0 ? /* @__PURE__ */ jsx(Tooltip, { content: item.label, side: "right", children: el }) : el;
|
|
30
30
|
}
|
|
31
|
-
function NavTree({
|
|
32
|
-
|
|
31
|
+
function NavTree({
|
|
32
|
+
item,
|
|
33
|
+
activeKey,
|
|
34
|
+
collapsed,
|
|
35
|
+
renderLink,
|
|
36
|
+
open: openProp,
|
|
37
|
+
onOpenChange
|
|
38
|
+
}) {
|
|
39
|
+
const [openInner, setOpenInner] = React.useState(() => containsActive(item, activeKey));
|
|
40
|
+
const open = openProp ?? openInner;
|
|
41
|
+
const setOpen = (o) => onOpenChange ? onOpenChange(o) : setOpenInner(o);
|
|
33
42
|
if (!item.children?.length) return /* @__PURE__ */ jsx(NavLink, { item, active: item.key === activeKey, collapsed, renderLink, depth: 0 });
|
|
34
43
|
const childActive = containsActive(item, activeKey);
|
|
35
44
|
if (collapsed) {
|
|
@@ -52,7 +61,13 @@ function NavTree({ item, activeKey, collapsed, renderLink }) {
|
|
|
52
61
|
/* @__PURE__ */ jsx(Collapsible.Panel, { className: "u-collapsible-panel", children: /* @__PURE__ */ jsx("div", { className: "u-nav-sub", children: item.children.map((c) => /* @__PURE__ */ jsx(NavLink, { item: c, active: c.key === activeKey, renderLink, depth: 1 }, c.key)) }) })
|
|
53
62
|
] });
|
|
54
63
|
}
|
|
55
|
-
function Sidebar({ brand, groups, activeKey, header, footer, user, collapsed, onCollapsedChange, renderLink, className }) {
|
|
64
|
+
function Sidebar({ brand, groups, activeKey, header, footer, user, collapsed, onCollapsedChange, renderLink, accordion = true, className }) {
|
|
65
|
+
const induk = (key) => groups.flatMap((g) => g.items).find((it) => it.children?.length && containsActive(it, key))?.key ?? null;
|
|
66
|
+
const [openKey, setOpenKey] = React.useState(() => induk(activeKey));
|
|
67
|
+
React.useEffect(() => {
|
|
68
|
+
const k = induk(activeKey);
|
|
69
|
+
if (k) setOpenKey(k);
|
|
70
|
+
}, [activeKey]);
|
|
56
71
|
return /* @__PURE__ */ jsxs("aside", { className: cn("u-sidebar", className), "data-collapsed": dataFlag(collapsed), children: [
|
|
57
72
|
/* @__PURE__ */ jsxs("div", { className: "u-sidebar-brand", children: [
|
|
58
73
|
brand,
|
|
@@ -61,7 +76,17 @@ function Sidebar({ brand, groups, activeKey, header, footer, user, collapsed, on
|
|
|
61
76
|
header && !collapsed && /* @__PURE__ */ jsx("div", { className: "u-sidebar-header", children: header }),
|
|
62
77
|
/* @__PURE__ */ jsx("nav", { className: "u-sidebar-nav", "aria-label": "Menu utama", children: groups.map((g, gi) => /* @__PURE__ */ jsxs("div", { className: "u-nav-group", children: [
|
|
63
78
|
g.label && !collapsed && /* @__PURE__ */ jsx("div", { className: "u-nav-group-label", children: g.label }),
|
|
64
|
-
g.items.map((it) => /* @__PURE__ */ jsx(
|
|
79
|
+
g.items.map((it) => /* @__PURE__ */ jsx(
|
|
80
|
+
NavTree,
|
|
81
|
+
{
|
|
82
|
+
item: it,
|
|
83
|
+
activeKey,
|
|
84
|
+
collapsed,
|
|
85
|
+
renderLink,
|
|
86
|
+
...accordion && it.children?.length ? { open: openKey === it.key, onOpenChange: (o) => setOpenKey(o ? it.key : openKey === it.key ? null : openKey) } : {}
|
|
87
|
+
},
|
|
88
|
+
it.key
|
|
89
|
+
))
|
|
65
90
|
] }, gi)) }),
|
|
66
91
|
footer && !collapsed && /* @__PURE__ */ jsx("div", { className: "u-sidebar-footer", children: footer }),
|
|
67
92
|
user && /* @__PURE__ */ jsx("div", { className: "u-sidebar-user", children: /* @__PURE__ */ jsx(
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/layout.tsx"],"names":["BaseCollapsible","MenuIcon"],"mappings":"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","file":"index.js","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { Collapsible as BaseCollapsible } from '@base-ui/react/collapsible';\nimport { ChevronDown, ChevronsUpDown, Menu as MenuIcon, PanelLeftClose, PanelLeftOpen, Search } from 'lucide-react';\nimport { cn, dataFlag } from '../lib/cn';\nimport { Button, Kbd } from './actions';\nimport { Avatar } from './display';\nimport { Dialog, Menu, Tooltip, type MenuEntry } from './overlays';\n\n// ================================================================ Sidebar dasbor aplikasi\nexport interface NavItem {\n /** Kunci unik; dicocokkan dengan `activeKey`. */\n key: string;\n label: React.ReactNode;\n icon?: React.ReactNode;\n href?: string;\n onClick?: () => void;\n /** Angka/teks kecil di kanan (mis. jumlah KRS menunggu). */\n badge?: React.ReactNode;\n /** Sub-menu (satu tingkat). */\n children?: NavItem[];\n disabled?: boolean;\n}\nexport interface NavGroup {\n label?: React.ReactNode;\n items: NavItem[];\n}\n\nexport interface SidebarUser {\n name: string;\n /** Baris kedua: NIM/NIDN/peran. */\n subtitle?: string;\n avatar?: string | null;\n menu?: MenuEntry[];\n}\n\nexport interface SidebarProps {\n /** Logo + nama aplikasi (gunakan <AppLogo />). */\n brand: React.ReactNode;\n groups: NavGroup[];\n activeKey?: string;\n /** Konten tepat di bawah brand, mis. pemilih prodi/periode atau pencarian. */\n header?: React.ReactNode;\n /** Konten di atas profil, mis. kartu \"Periode KRS dibuka\". */\n footer?: React.ReactNode;\n user?: SidebarUser;\n /** Mode ikon saja (rail). */\n collapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n /** Renderer tautan kustom, mis. <Link> Next.js/React Router. */\n renderLink?: (item: NavItem, props: React.AnchorHTMLAttributes<HTMLAnchorElement> & { children: React.ReactNode }) => React.ReactElement;\n className?: string;\n}\n\nfunction containsActive(item: NavItem, key?: string): boolean {\n return item.key === key || Boolean(item.children?.some((c) => containsActive(c, key)));\n}\n\nfunction NavLink({ item, active, collapsed, renderLink, depth }: { item: NavItem; active: boolean; collapsed?: boolean; renderLink?: SidebarProps['renderLink']; depth: number }) {\n const content = (\n <>\n {depth === 0 && <span className=\"u-nav-icon\">{item.icon}</span>}\n <span className=\"u-nav-label\">{item.label}</span>\n {item.badge != null && <span className=\"u-nav-badge\">{item.badge}</span>}\n </>\n );\n const props = {\n className: 'u-nav-item',\n 'data-active': dataFlag(active),\n 'data-depth': depth,\n 'aria-current': active ? ('page' as const) : undefined,\n 'aria-disabled': item.disabled || undefined,\n onClick: item.onClick,\n };\n let el: React.ReactElement;\n if (item.href) el = renderLink ? renderLink(item, { ...props, href: item.href, children: content }) : <a {...props} href={item.href}>{content}</a>;\n else el = <button type=\"button\" {...props}>{content}</button>;\n return collapsed && depth === 0 ? (\n <Tooltip content={item.label} side=\"right\">\n {el}\n </Tooltip>\n ) : (\n el\n );\n}\n\nfunction NavTree({ item, activeKey, collapsed, renderLink }: { item: NavItem; activeKey?: string; collapsed?: boolean; renderLink?: SidebarProps['renderLink'] }) {\n const [open, setOpen] = React.useState(() => containsActive(item, activeKey));\n if (!item.children?.length) return <NavLink item={item} active={item.key === activeKey} collapsed={collapsed} renderLink={renderLink} depth={0} />;\n const childActive = containsActive(item, activeKey);\n if (collapsed) {\n // Saat rail, sub-menu dibuka sebagai menu melayang.\n return (\n <Menu\n side=\"right\"\n align=\"start\"\n trigger={\n <button type=\"button\" className=\"u-nav-item\" data-active={dataFlag(childActive)} aria-label={typeof item.label === 'string' ? item.label : undefined}>\n <span className=\"u-nav-icon\">{item.icon}</span>\n </button>\n }\n items={[{ type: 'label', label: item.label }, ...item.children.map((c) => ({ label: c.label, href: c.href, onSelect: c.onClick }))]}\n />\n );\n }\n return (\n <BaseCollapsible.Root open={open} onOpenChange={setOpen}>\n <BaseCollapsible.Trigger className=\"u-nav-item\" data-parent-active={dataFlag(childActive)}>\n <span className=\"u-nav-icon\">{item.icon}</span>\n <span className=\"u-nav-label\">{item.label}</span>\n <ChevronDown className=\"u-nav-chevron\" />\n </BaseCollapsible.Trigger>\n <BaseCollapsible.Panel className=\"u-collapsible-panel\">\n <div className=\"u-nav-sub\">\n {item.children.map((c) => (\n <NavLink key={c.key} item={c} active={c.key === activeKey} renderLink={renderLink} depth={1} />\n ))}\n </div>\n </BaseCollapsible.Panel>\n </BaseCollapsible.Root>\n );\n}\n\n/** Sidebar aplikasi dasbor (SIAKAD, Pustikom, LMS, fakultas): grup menu, sub-menu, lencana, profil, mode rail. */\nexport function Sidebar({ brand, groups, activeKey, header, footer, user, collapsed, onCollapsedChange, renderLink, className }: SidebarProps) {\n return (\n <aside className={cn('u-sidebar', className)} data-collapsed={dataFlag(collapsed)}>\n <div className=\"u-sidebar-brand\">\n {brand}\n {onCollapsedChange && (\n <Tooltip content={collapsed ? 'Lebarkan menu' : 'Ciutkan menu'} side=\"right\">\n <Button variant=\"ghost\" size=\"xs\" iconOnly className=\"u-sidebar-toggle\" aria-label={collapsed ? 'Lebarkan menu' : 'Ciutkan menu'} onClick={() => onCollapsedChange(!collapsed)}>\n {collapsed ? <PanelLeftOpen /> : <PanelLeftClose />}\n </Button>\n </Tooltip>\n )}\n </div>\n {header && !collapsed && <div className=\"u-sidebar-header\">{header}</div>}\n <nav className=\"u-sidebar-nav\" aria-label=\"Menu utama\">\n {groups.map((g, gi) => (\n <div key={gi} className=\"u-nav-group\">\n {g.label && !collapsed && <div className=\"u-nav-group-label\">{g.label}</div>}\n {g.items.map((it) => (\n <NavTree key={it.key} item={it} activeKey={activeKey} collapsed={collapsed} renderLink={renderLink} />\n ))}\n </div>\n ))}\n </nav>\n {footer && !collapsed && <div className=\"u-sidebar-footer\">{footer}</div>}\n {user && (\n <div className=\"u-sidebar-user\">\n <Menu\n side={collapsed ? 'right' : 'top'}\n align=\"start\"\n trigger={\n <button type=\"button\" className=\"u-sidebar-user-button\">\n <Avatar name={user.name} src={user.avatar} size=\"sm\" />\n {!collapsed && (\n <>\n <span className=\"u-sidebar-user-text\">\n <span>{user.name}</span>\n {user.subtitle && <span>{user.subtitle}</span>}\n </span>\n <ChevronsUpDown className=\"u-nav-chevron\" />\n </>\n )}\n </button>\n }\n items={user.menu ?? []}\n />\n </div>\n )}\n </aside>\n );\n}\n\n// ================================================================ App shell\nexport interface AppShellProps {\n sidebar: React.ReactElement<SidebarProps>;\n /** Isi bilah atas (breadcrumb, pencarian, notifikasi). */\n topbar?: React.ReactNode;\n children: React.ReactNode;\n className?: string;\n}\n/** Kerangka halaman dasbor: sidebar tetap di desktop, laci (sheet) di ponsel. */\nexport function AppShell({ sidebar, topbar, children, className }: AppShellProps) {\n const [mobileOpen, setMobileOpen] = React.useState(false);\n return (\n <div className={cn('u-app-shell', className)} data-collapsed={dataFlag(sidebar.props.collapsed)}>\n <div className=\"u-app-shell-sidebar\">{sidebar}</div>\n <div className=\"u-app-shell-main\">\n <header className=\"u-topbar\">\n <Button variant=\"ghost\" size=\"sm\" iconOnly className=\"u-topbar-menu\" aria-label=\"Buka menu\" onClick={() => setMobileOpen(true)}>\n <MenuIcon />\n </Button>\n {topbar}\n </header>\n <main className=\"u-app-shell-content\">{children}</main>\n </div>\n <Dialog open={mobileOpen} onOpenChange={setMobileOpen} side=\"left\" title={<span className=\"u-sr-only\">Menu</span>} className=\"u-app-shell-drawer\">\n {React.cloneElement(sidebar, { collapsed: false, onCollapsedChange: undefined })}\n </Dialog>\n </div>\n );\n}\n\n/** Tombol pencarian ala command palette di bilah atas. */\nexport function SearchTrigger({ placeholder = 'Cari menu, mahasiswa, dosen…', shortcut = '⌘K', onClick, className }: { placeholder?: string; shortcut?: string; onClick?: () => void; className?: string }) {\n return (\n <button type=\"button\" className={cn('u-search-trigger', className)} onClick={onClick}>\n <Search />\n <span>{placeholder}</span>\n {shortcut && <Kbd>{shortcut}</Kbd>}\n </button>\n );\n}\n\n// ================================================================ Sidebar dokumentasi\nexport interface DocsNavSection {\n title: React.ReactNode;\n items: Array<{ key: string; label: React.ReactNode; href?: string; onClick?: () => void; badge?: React.ReactNode }>;\n}\nexport interface DocsSidebarProps {\n sections: DocsNavSection[];\n activeKey?: string;\n /** Pencarian di dalam daftar (penyaringan klien). */\n searchable?: boolean;\n header?: React.ReactNode;\n className?: string;\n renderLink?: SidebarProps['renderLink'];\n}\n/** Sidebar halaman dokumentasi (API, panduan, pustaka komponen): seksi bertajuk, penanda aktif, saringan. */\nexport function DocsSidebar({ sections, activeKey, searchable = true, header, className, renderLink }: DocsSidebarProps) {\n const [q, setQ] = React.useState('');\n const norm = q.trim().toLowerCase();\n const filtered = sections\n .map((s) => ({ ...s, items: norm ? s.items.filter((i) => String(i.label).toLowerCase().includes(norm)) : s.items }))\n .filter((s) => s.items.length);\n return (\n <aside className={cn('u-docs-sidebar', className)}>\n {header}\n {searchable && (\n <div className=\"u-input-group\" data-size=\"sm\">\n <span className=\"u-input-addon\" data-align=\"start\">\n <Search />\n </span>\n <input placeholder=\"Saring…\" value={q} onChange={(e) => setQ(e.target.value)} aria-label=\"Saring menu dokumentasi\" />\n </div>\n )}\n <nav className=\"u-docs-nav\" aria-label=\"Dokumentasi\">\n {filtered.map((s, i) => (\n <div key={i} className=\"u-docs-section\">\n <div className=\"u-docs-section-title\">{s.title}</div>\n <ul>\n {s.items.map((it) => {\n const active = it.key === activeKey;\n const props = { className: 'u-docs-link', 'data-active': dataFlag(active), 'aria-current': active ? ('page' as const) : undefined, onClick: it.onClick };\n const inner = (\n <>\n {it.label}\n {it.badge && <span className=\"u-docs-badge\">{it.badge}</span>}\n </>\n );\n return (\n <li key={it.key}>\n {it.href ? (\n renderLink ? (\n renderLink(it as NavItem, { ...props, href: it.href, children: inner })\n ) : (\n <a {...props} href={it.href}>\n {inner}\n </a>\n )\n ) : (\n <button type=\"button\" {...props}>\n {inner}\n </button>\n )}\n </li>\n );\n })}\n </ul>\n </div>\n ))}\n {!filtered.length && <p className=\"u-field-description\" style={{ padding: '0.5rem' }}>Tidak ada yang cocok dengan “{q}”.</p>}\n </nav>\n </aside>\n );\n}\n\n/** Daftar isi \"Di halaman ini\" dengan penanda bagian yang sedang dibaca (scroll-spy). */\nexport function TableOfContents({ items, title = 'Di halaman ini', className }: { items: Array<{ id: string; label: React.ReactNode; level?: 2 | 3 }>; title?: string; className?: string }) {\n const [active, setActive] = React.useState<string | undefined>(items[0]?.id);\n React.useEffect(() => {\n const els = items.map((i) => document.getElementById(i.id)).filter(Boolean) as HTMLElement[];\n if (!els.length) return;\n const io = new IntersectionObserver(\n (entries) => {\n const vis = entries.filter((e) => e.isIntersecting).sort((a, b) => a.boundingClientRect.top - b.boundingClientRect.top);\n if (vis[0]) setActive(vis[0].target.id);\n },\n { rootMargin: '0px 0px -70% 0px' },\n );\n els.forEach((e) => io.observe(e));\n return () => io.disconnect();\n }, [items]);\n return (\n <nav className={cn('u-toc', className)} aria-label={title}>\n <div className=\"u-docs-section-title\">{title}</div>\n <ul>\n {items.map((i) => (\n <li key={i.id} data-level={i.level ?? 2}>\n <a href={`#${i.id}`} data-active={dataFlag(active === i.id)} onClick={(e) => (e.preventDefault(), document.getElementById(i.id)?.scrollIntoView({ behavior: 'smooth', block: 'start' }), setActive(i.id))}>\n {i.label}\n </a>\n </li>\n ))}\n </ul>\n </nav>\n );\n}\n\n// ================================================================ Sidebar portal/media\nexport interface SidebarWidgetProps extends Omit<React.ComponentProps<'section'>, 'title'> {\n title: React.ReactNode;\n /** Tautan \"Lihat semua\" di kanan judul. */\n action?: React.ReactNode;\n variant?: 'plain' | 'card';\n}\n/** Satu blok di kolom samping portal (Terpopuler, Agenda, Pengumuman, Kategori, ...). */\nexport function SidebarWidget({ title, action, variant = 'plain', className, children, ...props }: SidebarWidgetProps) {\n return (\n <section className={cn('u-side-widget', className)} data-variant={variant} {...props}>\n <header className=\"u-side-widget-header\">\n <h3>{title}</h3>\n {action}\n </header>\n {children}\n </section>\n );\n}\n/** Kolom samping portal berita/media: tumpukan SidebarWidget, lengket saat digulir. */\nexport function PortalSidebar({ sticky = true, className, children }: { sticky?: boolean; className?: string; children: React.ReactNode }) {\n return (\n <aside className={cn('u-portal-sidebar', className)} data-sticky={dataFlag(sticky)}>\n {children}\n </aside>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/layout.tsx"],"names":["BaseCollapsible","MenuIcon"],"mappings":"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","file":"index.js","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { Collapsible as BaseCollapsible } from '@base-ui/react/collapsible';\nimport { ChevronDown, ChevronsUpDown, Menu as MenuIcon, PanelLeftClose, PanelLeftOpen, Search } from 'lucide-react';\nimport { cn, dataFlag } from '../lib/cn';\nimport { Button, Kbd } from './actions';\nimport { Avatar } from './display';\nimport { Dialog, Menu, Tooltip, type MenuEntry } from './overlays';\n\n// ================================================================ Sidebar dasbor aplikasi\nexport interface NavItem {\n /** Kunci unik; dicocokkan dengan `activeKey`. */\n key: string;\n label: React.ReactNode;\n icon?: React.ReactNode;\n href?: string;\n onClick?: () => void;\n /** Angka/teks kecil di kanan (mis. jumlah KRS menunggu). */\n badge?: React.ReactNode;\n /** Sub-menu (satu tingkat). */\n children?: NavItem[];\n disabled?: boolean;\n}\nexport interface NavGroup {\n label?: React.ReactNode;\n items: NavItem[];\n}\n\nexport interface SidebarUser {\n name: string;\n /** Baris kedua: NIM/NIDN/peran. */\n subtitle?: string;\n avatar?: string | null;\n menu?: MenuEntry[];\n}\n\nexport interface SidebarProps {\n /** Logo + nama aplikasi (gunakan <AppLogo />). */\n brand: React.ReactNode;\n groups: NavGroup[];\n activeKey?: string;\n /** Konten tepat di bawah brand, mis. pemilih prodi/periode atau pencarian. */\n header?: React.ReactNode;\n /** Konten di atas profil, mis. kartu \"Periode KRS dibuka\". */\n footer?: React.ReactNode;\n user?: SidebarUser;\n /** Mode ikon saja (rail). */\n collapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n /** Renderer tautan kustom, mis. <Link> Next.js/React Router. */\n renderLink?: (item: NavItem, props: React.AnchorHTMLAttributes<HTMLAnchorElement> & { children: React.ReactNode }) => React.ReactElement;\n /**\n * Hanya satu sub-menu terbuka dalam satu waktu: membuka satu menutup yang lain. Bawaan `true`.\n * Isi `false` agar setiap sub-menu bisa dibuka bersamaan.\n */\n accordion?: boolean;\n className?: string;\n}\n\nfunction containsActive(item: NavItem, key?: string): boolean {\n return item.key === key || Boolean(item.children?.some((c) => containsActive(c, key)));\n}\n\nfunction NavLink({ item, active, collapsed, renderLink, depth }: { item: NavItem; active: boolean; collapsed?: boolean; renderLink?: SidebarProps['renderLink']; depth: number }) {\n const content = (\n <>\n {depth === 0 && <span className=\"u-nav-icon\">{item.icon}</span>}\n <span className=\"u-nav-label\">{item.label}</span>\n {item.badge != null && <span className=\"u-nav-badge\">{item.badge}</span>}\n </>\n );\n const props = {\n className: 'u-nav-item',\n 'data-active': dataFlag(active),\n 'data-depth': depth,\n 'aria-current': active ? ('page' as const) : undefined,\n 'aria-disabled': item.disabled || undefined,\n onClick: item.onClick,\n };\n let el: React.ReactElement;\n if (item.href) el = renderLink ? renderLink(item, { ...props, href: item.href, children: content }) : <a {...props} href={item.href}>{content}</a>;\n else el = <button type=\"button\" {...props}>{content}</button>;\n return collapsed && depth === 0 ? (\n <Tooltip content={item.label} side=\"right\">\n {el}\n </Tooltip>\n ) : (\n el\n );\n}\n\nfunction NavTree({\n item,\n activeKey,\n collapsed,\n renderLink,\n open: openProp,\n onOpenChange,\n}: {\n item: NavItem;\n activeKey?: string;\n collapsed?: boolean;\n renderLink?: SidebarProps['renderLink'];\n /** Dikendalikan Sidebar saat mode accordion. */\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}) {\n const [openInner, setOpenInner] = React.useState(() => containsActive(item, activeKey));\n const open = openProp ?? openInner;\n const setOpen = (o: boolean) => (onOpenChange ? onOpenChange(o) : setOpenInner(o));\n if (!item.children?.length) return <NavLink item={item} active={item.key === activeKey} collapsed={collapsed} renderLink={renderLink} depth={0} />;\n const childActive = containsActive(item, activeKey);\n if (collapsed) {\n // Saat rail, sub-menu dibuka sebagai menu melayang.\n return (\n <Menu\n side=\"right\"\n align=\"start\"\n trigger={\n <button type=\"button\" className=\"u-nav-item\" data-active={dataFlag(childActive)} aria-label={typeof item.label === 'string' ? item.label : undefined}>\n <span className=\"u-nav-icon\">{item.icon}</span>\n </button>\n }\n items={[{ type: 'label', label: item.label }, ...item.children.map((c) => ({ label: c.label, href: c.href, onSelect: c.onClick }))]}\n />\n );\n }\n return (\n <BaseCollapsible.Root open={open} onOpenChange={setOpen}>\n <BaseCollapsible.Trigger className=\"u-nav-item\" data-parent-active={dataFlag(childActive)}>\n <span className=\"u-nav-icon\">{item.icon}</span>\n <span className=\"u-nav-label\">{item.label}</span>\n <ChevronDown className=\"u-nav-chevron\" />\n </BaseCollapsible.Trigger>\n <BaseCollapsible.Panel className=\"u-collapsible-panel\">\n <div className=\"u-nav-sub\">\n {item.children.map((c) => (\n <NavLink key={c.key} item={c} active={c.key === activeKey} renderLink={renderLink} depth={1} />\n ))}\n </div>\n </BaseCollapsible.Panel>\n </BaseCollapsible.Root>\n );\n}\n\n/** Sidebar aplikasi dasbor (SIAKAD, Pustikom, LMS, fakultas): grup menu, sub-menu, lencana, profil, mode rail. */\nexport function Sidebar({ brand, groups, activeKey, header, footer, user, collapsed, onCollapsedChange, renderLink, accordion = true, className }: SidebarProps) {\n // Mode accordion: simpan satu kunci sub-menu yang terbuka. Awalnya sub-menu yang memuat halaman aktif,\n // dan ikut berpindah saat halaman aktif pindah ke sub-menu lain.\n const induk = (key?: string) => groups.flatMap((g) => g.items).find((it) => it.children?.length && containsActive(it, key))?.key ?? null;\n const [openKey, setOpenKey] = React.useState<string | null>(() => induk(activeKey));\n React.useEffect(() => {\n const k = induk(activeKey);\n if (k) setOpenKey(k);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activeKey]);\n return (\n <aside className={cn('u-sidebar', className)} data-collapsed={dataFlag(collapsed)}>\n <div className=\"u-sidebar-brand\">\n {brand}\n {onCollapsedChange && (\n <Tooltip content={collapsed ? 'Lebarkan menu' : 'Ciutkan menu'} side=\"right\">\n <Button variant=\"ghost\" size=\"xs\" iconOnly className=\"u-sidebar-toggle\" aria-label={collapsed ? 'Lebarkan menu' : 'Ciutkan menu'} onClick={() => onCollapsedChange(!collapsed)}>\n {collapsed ? <PanelLeftOpen /> : <PanelLeftClose />}\n </Button>\n </Tooltip>\n )}\n </div>\n {header && !collapsed && <div className=\"u-sidebar-header\">{header}</div>}\n <nav className=\"u-sidebar-nav\" aria-label=\"Menu utama\">\n {groups.map((g, gi) => (\n <div key={gi} className=\"u-nav-group\">\n {g.label && !collapsed && <div className=\"u-nav-group-label\">{g.label}</div>}\n {g.items.map((it) => (\n <NavTree\n key={it.key}\n item={it}\n activeKey={activeKey}\n collapsed={collapsed}\n renderLink={renderLink}\n {...(accordion && it.children?.length ? { open: openKey === it.key, onOpenChange: (o: boolean) => setOpenKey(o ? it.key : openKey === it.key ? null : openKey) } : {})}\n />\n ))}\n </div>\n ))}\n </nav>\n {footer && !collapsed && <div className=\"u-sidebar-footer\">{footer}</div>}\n {user && (\n <div className=\"u-sidebar-user\">\n <Menu\n side={collapsed ? 'right' : 'top'}\n align=\"start\"\n trigger={\n <button type=\"button\" className=\"u-sidebar-user-button\">\n <Avatar name={user.name} src={user.avatar} size=\"sm\" />\n {!collapsed && (\n <>\n <span className=\"u-sidebar-user-text\">\n <span>{user.name}</span>\n {user.subtitle && <span>{user.subtitle}</span>}\n </span>\n <ChevronsUpDown className=\"u-nav-chevron\" />\n </>\n )}\n </button>\n }\n items={user.menu ?? []}\n />\n </div>\n )}\n </aside>\n );\n}\n\n// ================================================================ App shell\nexport interface AppShellProps {\n sidebar: React.ReactElement<SidebarProps>;\n /** Isi bilah atas (breadcrumb, pencarian, notifikasi). */\n topbar?: React.ReactNode;\n children: React.ReactNode;\n className?: string;\n}\n/** Kerangka halaman dasbor: sidebar tetap di desktop, laci (sheet) di ponsel. */\nexport function AppShell({ sidebar, topbar, children, className }: AppShellProps) {\n const [mobileOpen, setMobileOpen] = React.useState(false);\n return (\n <div className={cn('u-app-shell', className)} data-collapsed={dataFlag(sidebar.props.collapsed)}>\n <div className=\"u-app-shell-sidebar\">{sidebar}</div>\n <div className=\"u-app-shell-main\">\n <header className=\"u-topbar\">\n <Button variant=\"ghost\" size=\"sm\" iconOnly className=\"u-topbar-menu\" aria-label=\"Buka menu\" onClick={() => setMobileOpen(true)}>\n <MenuIcon />\n </Button>\n {topbar}\n </header>\n <main className=\"u-app-shell-content\">{children}</main>\n </div>\n <Dialog open={mobileOpen} onOpenChange={setMobileOpen} side=\"left\" title={<span className=\"u-sr-only\">Menu</span>} className=\"u-app-shell-drawer\">\n {React.cloneElement(sidebar, { collapsed: false, onCollapsedChange: undefined })}\n </Dialog>\n </div>\n );\n}\n\n/** Tombol pencarian ala command palette di bilah atas. */\nexport function SearchTrigger({ placeholder = 'Cari menu, mahasiswa, dosen…', shortcut = '⌘K', onClick, className }: { placeholder?: string; shortcut?: string; onClick?: () => void; className?: string }) {\n return (\n <button type=\"button\" className={cn('u-search-trigger', className)} onClick={onClick}>\n <Search />\n <span>{placeholder}</span>\n {shortcut && <Kbd>{shortcut}</Kbd>}\n </button>\n );\n}\n\n// ================================================================ Sidebar dokumentasi\nexport interface DocsNavSection {\n title: React.ReactNode;\n items: Array<{ key: string; label: React.ReactNode; href?: string; onClick?: () => void; badge?: React.ReactNode }>;\n}\nexport interface DocsSidebarProps {\n sections: DocsNavSection[];\n activeKey?: string;\n /** Pencarian di dalam daftar (penyaringan klien). */\n searchable?: boolean;\n header?: React.ReactNode;\n className?: string;\n renderLink?: SidebarProps['renderLink'];\n}\n/** Sidebar halaman dokumentasi (API, panduan, pustaka komponen): seksi bertajuk, penanda aktif, saringan. */\nexport function DocsSidebar({ sections, activeKey, searchable = true, header, className, renderLink }: DocsSidebarProps) {\n const [q, setQ] = React.useState('');\n const norm = q.trim().toLowerCase();\n const filtered = sections\n .map((s) => ({ ...s, items: norm ? s.items.filter((i) => String(i.label).toLowerCase().includes(norm)) : s.items }))\n .filter((s) => s.items.length);\n return (\n <aside className={cn('u-docs-sidebar', className)}>\n {header}\n {searchable && (\n <div className=\"u-input-group\" data-size=\"sm\">\n <span className=\"u-input-addon\" data-align=\"start\">\n <Search />\n </span>\n <input placeholder=\"Saring…\" value={q} onChange={(e) => setQ(e.target.value)} aria-label=\"Saring menu dokumentasi\" />\n </div>\n )}\n <nav className=\"u-docs-nav\" aria-label=\"Dokumentasi\">\n {filtered.map((s, i) => (\n <div key={i} className=\"u-docs-section\">\n <div className=\"u-docs-section-title\">{s.title}</div>\n <ul>\n {s.items.map((it) => {\n const active = it.key === activeKey;\n const props = { className: 'u-docs-link', 'data-active': dataFlag(active), 'aria-current': active ? ('page' as const) : undefined, onClick: it.onClick };\n const inner = (\n <>\n {it.label}\n {it.badge && <span className=\"u-docs-badge\">{it.badge}</span>}\n </>\n );\n return (\n <li key={it.key}>\n {it.href ? (\n renderLink ? (\n renderLink(it as NavItem, { ...props, href: it.href, children: inner })\n ) : (\n <a {...props} href={it.href}>\n {inner}\n </a>\n )\n ) : (\n <button type=\"button\" {...props}>\n {inner}\n </button>\n )}\n </li>\n );\n })}\n </ul>\n </div>\n ))}\n {!filtered.length && <p className=\"u-field-description\" style={{ padding: '0.5rem' }}>Tidak ada yang cocok dengan “{q}”.</p>}\n </nav>\n </aside>\n );\n}\n\n/** Daftar isi \"Di halaman ini\" dengan penanda bagian yang sedang dibaca (scroll-spy). */\nexport function TableOfContents({ items, title = 'Di halaman ini', className }: { items: Array<{ id: string; label: React.ReactNode; level?: 2 | 3 }>; title?: string; className?: string }) {\n const [active, setActive] = React.useState<string | undefined>(items[0]?.id);\n React.useEffect(() => {\n const els = items.map((i) => document.getElementById(i.id)).filter(Boolean) as HTMLElement[];\n if (!els.length) return;\n const io = new IntersectionObserver(\n (entries) => {\n const vis = entries.filter((e) => e.isIntersecting).sort((a, b) => a.boundingClientRect.top - b.boundingClientRect.top);\n if (vis[0]) setActive(vis[0].target.id);\n },\n { rootMargin: '0px 0px -70% 0px' },\n );\n els.forEach((e) => io.observe(e));\n return () => io.disconnect();\n }, [items]);\n return (\n <nav className={cn('u-toc', className)} aria-label={title}>\n <div className=\"u-docs-section-title\">{title}</div>\n <ul>\n {items.map((i) => (\n <li key={i.id} data-level={i.level ?? 2}>\n <a href={`#${i.id}`} data-active={dataFlag(active === i.id)} onClick={(e) => (e.preventDefault(), document.getElementById(i.id)?.scrollIntoView({ behavior: 'smooth', block: 'start' }), setActive(i.id))}>\n {i.label}\n </a>\n </li>\n ))}\n </ul>\n </nav>\n );\n}\n\n// ================================================================ Sidebar portal/media\nexport interface SidebarWidgetProps extends Omit<React.ComponentProps<'section'>, 'title'> {\n title: React.ReactNode;\n /** Tautan \"Lihat semua\" di kanan judul. */\n action?: React.ReactNode;\n variant?: 'plain' | 'card';\n}\n/** Satu blok di kolom samping portal (Terpopuler, Agenda, Pengumuman, Kategori, ...). */\nexport function SidebarWidget({ title, action, variant = 'plain', className, children, ...props }: SidebarWidgetProps) {\n return (\n <section className={cn('u-side-widget', className)} data-variant={variant} {...props}>\n <header className=\"u-side-widget-header\">\n <h3>{title}</h3>\n {action}\n </header>\n {children}\n </section>\n );\n}\n/** Kolom samping portal berita/media: tumpukan SidebarWidget, lengket saat digulir. */\nexport function PortalSidebar({ sticky = true, className, children }: { sticky?: boolean; className?: string; children: React.ReactNode }) {\n return (\n <aside className={cn('u-portal-sidebar', className)} data-sticky={dataFlag(sticky)}>\n {children}\n </aside>\n );\n}\n"]}
|