@brainfish-ai/components 0.26.0 → 0.26.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chat-search.d.ts +14 -1
- package/dist/esm/chunks/ChatSearch.Cqo4WF3n.js +95 -0
- package/dist/esm/chunks/ChatSearch.Cqo4WF3n.js.map +1 -0
- package/dist/esm/chunks/Conversation.UZ5rx7_0.js +22 -0
- package/dist/esm/chunks/{Conversation.BriXFYqU.js.map → Conversation.UZ5rx7_0.js.map} +1 -1
- package/dist/esm/chunks/FormattedMessage.D9xA6QsH.js +23 -0
- package/dist/esm/chunks/FormattedMessage.D9xA6QsH.js.map +1 -0
- package/dist/esm/chunks/MermaidDiagram.PRgXQ5Yh.js +2 -0
- package/dist/esm/chunks/{MermaidDiagram.xQ0CVFOI.js.map → MermaidDiagram.PRgXQ5Yh.js.map} +1 -1
- package/dist/esm/chunks/_commonjsHelpers.lGe4XDVY.js +2 -0
- package/dist/esm/chunks/_commonjsHelpers.lGe4XDVY.js.map +1 -0
- package/dist/esm/chunks/button.BYc5d6AZ.js +3 -0
- package/dist/esm/chunks/{button.DQL6gCAt.js.map → button.BYc5d6AZ.js.map} +1 -1
- package/dist/esm/chunks/chart.BDL2tf-S.js +10 -0
- package/dist/esm/chunks/{chart.4ZbtBMmR.js.map → chart.BDL2tf-S.js.map} +1 -1
- package/dist/esm/chunks/chat-logo.CqPppEb9.js +3 -0
- package/dist/esm/chunks/chat-logo.CqPppEb9.js.map +1 -0
- package/dist/esm/chunks/combobox.CxaWbDm9.js +6 -0
- package/dist/esm/chunks/{combobox.CJKym3Z1.js.map → combobox.CxaWbDm9.js.map} +1 -1
- package/dist/esm/chunks/dark.DuW7JuAk.js +2 -0
- package/dist/esm/chunks/{dark.Cq2RCgy4.js.map → dark.DuW7JuAk.js.map} +1 -1
- package/dist/esm/chunks/data-table.CJOR-1Kf.js +5 -0
- package/dist/esm/chunks/{data-table.DbcAYxMY.js.map → data-table.CJOR-1Kf.js.map} +1 -1
- package/dist/esm/chunks/date-picker.Bhplnvxn.js +4 -0
- package/dist/esm/chunks/{date-picker._cBTpdEK.js.map → date-picker.Bhplnvxn.js.map} +1 -1
- package/dist/esm/chunks/extends.DPdBf6DS.js +2 -0
- package/dist/esm/chunks/extends.DPdBf6DS.js.map +1 -0
- package/dist/esm/chunks/feature-flags.DOcVlPHk.js +3 -0
- package/dist/esm/chunks/{feature-flags.DeDEcnd1.js.map → feature-flags.DOcVlPHk.js.map} +1 -1
- package/dist/esm/chunks/feedback.BXKvlNz1.js +13 -0
- package/dist/esm/chunks/{feedback.W2OzN-5r.js.map → feedback.BXKvlNz1.js.map} +1 -1
- package/dist/esm/chunks/file-upload-status.4ukNFyi2.js +8 -0
- package/dist/esm/chunks/{file-upload-status.DP2iuttI.js.map → file-upload-status.4ukNFyi2.js.map} +1 -1
- package/dist/esm/chunks/filters.ita3UAnO.js +22 -0
- package/dist/esm/chunks/{filters.-7vSLEQ2.js.map → filters.ita3UAnO.js.map} +1 -1
- package/dist/esm/chunks/font-picker.BwEWBowG.js +6 -0
- package/dist/esm/chunks/{font-picker.DisEoE8a.js.map → font-picker.BwEWBowG.js.map} +1 -1
- package/dist/esm/chunks/formatDate.D2xEZm8f.js +2 -0
- package/dist/esm/chunks/{formatDate.CWN6IFKq.js.map → formatDate.D2xEZm8f.js.map} +1 -1
- package/dist/esm/chunks/formatNumber.DhVn228t.js +2 -0
- package/dist/esm/chunks/{formatNumber.Bm2k8QrT.js.map → formatNumber.DhVn228t.js.map} +1 -1
- package/dist/esm/chunks/generating-star.BN9p_FDu.js +7 -0
- package/dist/esm/chunks/generating-star.BN9p_FDu.js.map +1 -0
- package/dist/esm/chunks/header-nav.B4IJjted.js +10 -0
- package/dist/esm/chunks/{header-nav.b4hvOsKc.js.map → header-nav.B4IJjted.js.map} +1 -1
- package/dist/esm/chunks/header-pane.C1RWesOW.js +20 -0
- package/dist/esm/chunks/{header-pane.BFXHXxVn.js.map → header-pane.C1RWesOW.js.map} +1 -1
- package/dist/esm/chunks/hooks.BQTKhHSv.js +2 -0
- package/dist/esm/chunks/hooks.BQTKhHSv.js.map +1 -0
- package/dist/esm/chunks/index.uF4ME3WQ.js +4 -0
- package/dist/esm/chunks/{index.BqibIWDw.js.map → index.uF4ME3WQ.js.map} +1 -1
- package/dist/esm/chunks/input-with-tags.DrDDPxse.js +5 -0
- package/dist/esm/chunks/{input-with-tags.tg2nhPFv.js.map → input-with-tags.DrDDPxse.js.map} +1 -1
- package/dist/esm/chunks/logo.CketsPBx.js +5 -0
- package/dist/esm/chunks/{logo.D5BMN6Db.js.map → logo.CketsPBx.js.map} +1 -1
- package/dist/esm/chunks/primary.CMQbo1GJ.js +2 -0
- package/dist/esm/chunks/{primary.CtiRZbqq.js.map → primary.CMQbo1GJ.js.map} +1 -1
- package/dist/esm/chunks/review-list.qvxeqG9l.js +6 -0
- package/dist/esm/chunks/{review-list.BtSnfpSc.js.map → review-list.qvxeqG9l.js.map} +1 -1
- package/dist/esm/chunks/sidebar.IcJADYLR.js +25 -0
- package/dist/esm/chunks/sidebar.IcJADYLR.js.map +1 -0
- package/dist/esm/chunks/simpleSelect.DK1qZSXM.js +3 -0
- package/dist/esm/chunks/{simpleSelect.B1rktKkt.js.map → simpleSelect.DK1qZSXM.js.map} +1 -1
- package/dist/esm/chunks/status-badge.C-jt7Zs2.js +3 -0
- package/dist/esm/chunks/{status-badge.eFJ1PYeb.js.map → status-badge.C-jt7Zs2.js.map} +1 -1
- package/dist/esm/chunks/trend-value.BPBDBsk2.js +3 -0
- package/dist/esm/chunks/{trend-value.COSukPwk.js.map → trend-value.BPBDBsk2.js.map} +1 -1
- package/dist/esm/chunks/two-level-combobox.Bv2OQgjh.js +8 -0
- package/dist/esm/chunks/{two-level-combobox.BXs2z9u5.js.map → two-level-combobox.Bv2OQgjh.js.map} +1 -1
- package/dist/esm/chunks/useChartDateFormatters.Dx2h5AAm.js +2 -0
- package/dist/esm/chunks/{useChartDateFormatters.DS9ASgFO.js.map → useChartDateFormatters.Dx2h5AAm.js.map} +1 -1
- package/dist/esm/chunks/utils.C6Qu-kwd.js +2 -0
- package/dist/esm/chunks/{utils.Cwtlq8dh.js.map → utils.C6Qu-kwd.js.map} +1 -1
- package/dist/esm/colors.js +1 -169
- package/dist/esm/colors.js.map +1 -1
- package/dist/esm/components/article-suggestions-banner.js +4 -53
- package/dist/esm/components/article-suggestions-banner.js.map +1 -1
- package/dist/esm/components/articles-coverage.js +4 -116
- package/dist/esm/components/articles-coverage.js.map +1 -1
- package/dist/esm/components/articles-updated.js +4 -74
- package/dist/esm/components/articles-updated.js.map +1 -1
- package/dist/esm/components/breadcrumbs.js +3 -13
- package/dist/esm/components/breadcrumbs.js.map +1 -1
- package/dist/esm/components/chart-area-linear.js +6 -66
- package/dist/esm/components/chart-area-linear.js.map +1 -1
- package/dist/esm/components/chart-radial-stacked.js +2 -48
- package/dist/esm/components/chart-radial-stacked.js.map +1 -1
- package/dist/esm/components/chat-search.js +1 -1
- package/dist/esm/components/combobox.js +1 -1
- package/dist/esm/components/confirm-dialog.js +2 -47
- package/dist/esm/components/confirm-dialog.js.map +1 -1
- package/dist/esm/components/conversation.js +1 -1
- package/dist/esm/components/convos.js +27 -607
- package/dist/esm/components/convos.js.map +1 -1
- package/dist/esm/components/data-table.js +1 -1
- package/dist/esm/components/date-picker.js +1 -1
- package/dist/esm/components/discoveries-created.js +4 -64
- package/dist/esm/components/discoveries-created.js.map +1 -1
- package/dist/esm/components/feedback.js +1 -1
- package/dist/esm/components/file-upload.js +1 -1
- package/dist/esm/components/filter.js +1 -1
- package/dist/esm/components/font-picker.js +1 -1
- package/dist/esm/components/generating-star.js +1 -1
- package/dist/esm/components/input-with-tags.js +1 -1
- package/dist/esm/components/logo.js +1 -1
- package/dist/esm/components/markdown.js +1 -2
- package/dist/esm/components/markdown.js.map +1 -1
- package/dist/esm/components/metric-card.js +3 -29
- package/dist/esm/components/metric-card.js.map +1 -1
- package/dist/esm/components/select.js +1 -1
- package/dist/esm/components/trend-value.js +1 -1
- package/dist/esm/components/two-level-combobox.js +1 -1
- package/dist/esm/components/ui/accordion.js +7 -46
- package/dist/esm/components/ui/accordion.js.map +1 -1
- package/dist/esm/components/ui/alert-dialog.js +3 -114
- package/dist/esm/components/ui/alert-dialog.js.map +1 -1
- package/dist/esm/components/ui/alert.js +4 -103
- package/dist/esm/components/ui/alert.js.map +1 -1
- package/dist/esm/components/ui/avatar.js +7 -89
- package/dist/esm/components/ui/avatar.js.map +1 -1
- package/dist/esm/components/ui/badge.js +2 -26
- package/dist/esm/components/ui/badge.js.map +1 -1
- package/dist/esm/components/ui/breadcrumb.js +4 -60
- package/dist/esm/components/ui/breadcrumb.js.map +1 -1
- package/dist/esm/components/ui/button-group.js +4 -88
- package/dist/esm/components/ui/button-group.js.map +1 -1
- package/dist/esm/components/ui/button.js +1 -5
- package/dist/esm/components/ui/button.js.map +1 -1
- package/dist/esm/components/ui/calendar.js +2 -20
- package/dist/esm/components/ui/calendar.js.map +1 -1
- package/dist/esm/components/ui/card.js +1 -55
- package/dist/esm/components/ui/card.js.map +1 -1
- package/dist/esm/components/ui/collapsible.js +1 -33
- package/dist/esm/components/ui/collapsible.js.map +1 -1
- package/dist/esm/components/ui/combobox.js +1 -1
- package/dist/esm/components/ui/command.js +2 -79
- package/dist/esm/components/ui/command.js.map +1 -1
- package/dist/esm/components/ui/dialog.js +4 -60
- package/dist/esm/components/ui/dialog.js.map +1 -1
- package/dist/esm/components/ui/div-button.js +2 -61
- package/dist/esm/components/ui/div-button.js.map +1 -1
- package/dist/esm/components/ui/dropdown-menu.js +3 -114
- package/dist/esm/components/ui/dropdown-menu.js.map +1 -1
- package/dist/esm/components/ui/icon.js +2 -25
- package/dist/esm/components/ui/icon.js.map +1 -1
- package/dist/esm/components/ui/input.js +4 -47
- package/dist/esm/components/ui/input.js.map +1 -1
- package/dist/esm/components/ui/item.js +11 -140
- package/dist/esm/components/ui/item.js.map +1 -1
- package/dist/esm/components/ui/label.js +1 -19
- package/dist/esm/components/ui/label.js.map +1 -1
- package/dist/esm/components/ui/popover.js +1 -31
- package/dist/esm/components/ui/popover.js.map +1 -1
- package/dist/esm/components/ui/progress.js +2 -22
- package/dist/esm/components/ui/progress.js.map +1 -1
- package/dist/esm/components/ui/scroll-area.js +2 -32
- package/dist/esm/components/ui/scroll-area.js.map +1 -1
- package/dist/esm/components/ui/select.js +5 -66
- package/dist/esm/components/ui/select.js.map +1 -1
- package/dist/esm/components/ui/separator.js +1 -23
- package/dist/esm/components/ui/separator.js.map +1 -1
- package/dist/esm/components/ui/sheet.js +3 -62
- package/dist/esm/components/ui/sheet.js.map +1 -1
- package/dist/esm/components/ui/spinner.js +2 -17
- package/dist/esm/components/ui/spinner.js.map +1 -1
- package/dist/esm/components/ui/switch.js +2 -26
- package/dist/esm/components/ui/switch.js.map +1 -1
- package/dist/esm/components/ui/table.js +1 -82
- package/dist/esm/components/ui/table.js.map +1 -1
- package/dist/esm/components/ui/textarea.js +1 -33
- package/dist/esm/components/ui/textarea.js.map +1 -1
- package/dist/esm/components/ui/tooltip.js +3 -31
- package/dist/esm/components/ui/tooltip.js.map +1 -1
- package/dist/esm/global.css +1 -1
- package/dist/esm/index.js +1 -53
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/layouts/full-layout.js +1 -1
- package/dist/esm/layouts/header-nav.js +1 -1
- package/dist/esm/layouts/sidebar.js +1 -1
- package/dist/esm/logos/microsoft-logo.js +6 -66
- package/dist/esm/logos/microsoft-logo.js.map +1 -1
- package/dist/esm/logos/microsoft-teams-logo.js +12 -112
- package/dist/esm/logos/microsoft-teams-logo.js.map +1 -1
- package/dist/esm/logos/slack-logo.js +3 -39
- package/dist/esm/logos/slack-logo.js.map +1 -1
- package/dist/esm/scenes/knowledge-review.js +17 -380
- package/dist/esm/scenes/knowledge-review.js.map +1 -1
- package/dist/esm/tailwind.preset.js +1 -1526
- package/dist/esm/tailwind.preset.js.map +1 -1
- package/dist/index.d.ts +22 -1
- package/dist/logo.d.ts +9 -0
- package/dist/stats.html +47 -46
- package/package.json +17 -18
- package/tailwind.preset.ts +1 -0
- package/dist/esm/chunks/ChatSearch.CeQrTOVx.js +0 -6825
- package/dist/esm/chunks/ChatSearch.CeQrTOVx.js.map +0 -1
- package/dist/esm/chunks/Conversation.BriXFYqU.js +0 -831
- package/dist/esm/chunks/FormattedMessage.CRbM-hF6.js +0 -39715
- package/dist/esm/chunks/FormattedMessage.CRbM-hF6.js.map +0 -1
- package/dist/esm/chunks/MermaidDiagram.xQ0CVFOI.js +0 -50
- package/dist/esm/chunks/_commonjsHelpers.BFTU3MAI.js +0 -8
- package/dist/esm/chunks/_commonjsHelpers.BFTU3MAI.js.map +0 -1
- package/dist/esm/chunks/button.DQL6gCAt.js +0 -48
- package/dist/esm/chunks/chart.4ZbtBMmR.js +0 -199
- package/dist/esm/chunks/combobox.CJKym3Z1.js +0 -95
- package/dist/esm/chunks/dark.Cq2RCgy4.js +0 -18
- package/dist/esm/chunks/data-table.DbcAYxMY.js +0 -102
- package/dist/esm/chunks/date-picker._cBTpdEK.js +0 -26
- package/dist/esm/chunks/extends.mO86zOh3.js +0 -12
- package/dist/esm/chunks/extends.mO86zOh3.js.map +0 -1
- package/dist/esm/chunks/feature-flags.DeDEcnd1.js +0 -22
- package/dist/esm/chunks/feedback.W2OzN-5r.js +0 -214
- package/dist/esm/chunks/file-upload-status.DP2iuttI.js +0 -141
- package/dist/esm/chunks/filters.-7vSLEQ2.js +0 -565
- package/dist/esm/chunks/font-picker.DisEoE8a.js +0 -181
- package/dist/esm/chunks/formatDate.CWN6IFKq.js +0 -952
- package/dist/esm/chunks/formatNumber.Bm2k8QrT.js +0 -10
- package/dist/esm/chunks/generating-star.DMDPNTaM.js +0 -1501
- package/dist/esm/chunks/generating-star.DMDPNTaM.js.map +0 -1
- package/dist/esm/chunks/header-nav.b4hvOsKc.js +0 -197
- package/dist/esm/chunks/header-pane.BFXHXxVn.js +0 -559
- package/dist/esm/chunks/hooks.BWVaVAT-.js +0 -343
- package/dist/esm/chunks/hooks.BWVaVAT-.js.map +0 -1
- package/dist/esm/chunks/index.BqibIWDw.js +0 -137
- package/dist/esm/chunks/input-with-tags.tg2nhPFv.js +0 -110
- package/dist/esm/chunks/logo.D5BMN6Db.js +0 -191
- package/dist/esm/chunks/primary.CtiRZbqq.js +0 -18
- package/dist/esm/chunks/review-list.BtSnfpSc.js +0 -117
- package/dist/esm/chunks/sidebar.BamKohb5.js +0 -803
- package/dist/esm/chunks/sidebar.BamKohb5.js.map +0 -1
- package/dist/esm/chunks/simpleSelect.B1rktKkt.js +0 -23
- package/dist/esm/chunks/status-badge.eFJ1PYeb.js +0 -18
- package/dist/esm/chunks/trend-value.COSukPwk.js +0 -51
- package/dist/esm/chunks/two-level-combobox.BXs2z9u5.js +0 -132
- package/dist/esm/chunks/useChartDateFormatters.DS9ASgFO.js +0 -11
- package/dist/esm/chunks/utils.Cwtlq8dh.js +0 -45
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sidebar.BamKohb5.js","sources":["../../../src/layouts/sidebar/context.tsx","../../../src/layouts/sidebar/app-nav/app-nav.tsx","../../../src/layouts/sidebar/article-nav/article-search.tsx","../../../src/layouts/sidebar/article-nav/article-item.tsx","../../../src/layouts/sidebar/article-nav/expansion.ts","../../../src/layouts/sidebar/article-nav/tree-sync.ts","../../../src/layouts/sidebar/article-nav/article-tree.tsx","../../../src/layouts/sidebar/article-nav/article-nav.tsx","../../../src/layouts/sidebar/section-nav/section-nav.tsx","../../../src/layouts/sidebar/sidebar.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { ArticleNavItem, ItemLinkComponent } from './types';\n\nexport interface SidebarContextProps {\n collapsed: boolean;\n ItemLinkComponent: ItemLinkComponent;\n activeArticleId?: string;\n onSelectArticle?: (id: string) => void;\n onExpandArticle?: (id: string) => void;\n onSearchArticles?: (value: string) => void;\n onAddArticle?: (parentId: string | null) => Promise<ArticleNavItem>;\n onMoreActions?: (articleId: string) => void;\n canMoveArticle?: (move: { id: string; parentId: string | null; index: number }) => boolean;\n onMoveArticle?: (moved: { id: string; parentId: string | null; index: number }) => void | Promise<void>;\n}\n\nexport interface SidebarContextValue extends SidebarContextProps {\n handleSearchArticles: (value: string) => void;\n isSearching: boolean;\n searchValue: string;\n setSearchValue: React.Dispatch<React.SetStateAction<string>>;\n /** Set when user selects from search results; tree uses this until activeArticleId catches up */\n lastSelectedArticleId: string | null;\n setLastSelectedArticleId: React.Dispatch<React.SetStateAction<string | null>>;\n}\n\nconst SidebarContext = React.createContext<SidebarContextValue | null>(null);\n\nexport function SidebarProvider({\n collapsed,\n ItemLinkComponent,\n activeArticleId,\n onSelectArticle,\n onExpandArticle,\n onSearchArticles,\n onAddArticle,\n onMoreActions,\n canMoveArticle,\n onMoveArticle,\n children,\n}: React.PropsWithChildren<SidebarContextProps>) {\n const [isSearching, setIsSearching] = React.useState<boolean>(false);\n const [searchValue, setSearchValue] = React.useState<string>('');\n const [lastSelectedArticleId, setLastSelectedArticleId] = React.useState<string | null>(null);\n\n const handleSearchArticles = React.useCallback(\n (value: string) => {\n const trimmedValue = value.trim();\n setIsSearching(trimmedValue !== '');\n onSearchArticles?.(value);\n },\n [onSearchArticles],\n );\n\n const contextValue = React.useMemo<SidebarContextValue>(\n () => ({\n collapsed,\n ItemLinkComponent,\n activeArticleId,\n onSearchArticles,\n onSelectArticle,\n onExpandArticle,\n onAddArticle,\n onMoreActions,\n canMoveArticle,\n onMoveArticle,\n isSearching,\n searchValue,\n setSearchValue,\n lastSelectedArticleId,\n setLastSelectedArticleId,\n handleSearchArticles,\n }),\n [\n isSearching,\n searchValue,\n lastSelectedArticleId,\n collapsed,\n ItemLinkComponent,\n activeArticleId,\n onSelectArticle,\n onExpandArticle,\n onSearchArticles,\n onAddArticle,\n onMoreActions,\n canMoveArticle,\n onMoveArticle,\n handleSearchArticles,\n ],\n );\n\n return <SidebarContext.Provider value={contextValue}>{children}</SidebarContext.Provider>;\n}\n\nexport function useSidebar() {\n const sidebarContext = React.useContext(SidebarContext);\n\n if (!sidebarContext) throw new Error('useSidebar must be used within SidebarProvider');\n\n return sidebarContext;\n}\n","import * as React from 'react';\nimport { ArrowBendUpLeft } from '@phosphor-icons/react';\n\nimport type { SidebarNavItem } from '../types';\nimport { useSidebar } from '../context';\n\nimport { Button } from '@/components/ui/button';\nimport { ScrollArea } from '@/components/ui/scroll-area';\nimport { cn } from '@/lib/utils';\n\nexport interface AppNavProps {\n className?: string;\n items?: SidebarNavItem[];\n activeId?: string;\n showBack?: boolean;\n onBack?: () => void;\n}\n\nexport function AppNav({ className, items, activeId, showBack, onBack }: AppNavProps) {\n const { collapsed, ItemLinkComponent } = useSidebar();\n\n const hasBack = !!showBack && !!onBack;\n\n return (\n <nav className={cn('flex flex-col gap-2', className)} aria-label=\"App navigation\">\n {hasBack && (\n <Button\n variant=\"link\"\n className={cn('py-2 text-base text-default w-full mx-4', collapsed ? 'justify-center' : 'justify-start')}\n size=\"icon\"\n onClick={onBack}\n >\n <ArrowBendUpLeft aria-hidden=\"true\" />\n <span className={cn(collapsed && 'sr-only')}>back to Brainfish</span>\n </Button>\n )}\n <ScrollArea className=\"min-h-0 max-h-[calc(100dvh-var(--header-nav-height)-5rem)]\">\n <div className=\"flex flex-col gap-2 mx-4\">\n {items?.map((item) => (\n <ItemLinkComponent\n key={item.id}\n className={cn(\n 'flex p-2 rounded-lg gap-1 text-base text-default items-center hover:text-primary-foreground focus:text-primary-foreground',\n item.id === activeId\n ? 'bg-primary text-primary-foreground font-bold'\n : 'hover:bg-lime-100 focus:bg-lime-100',\n )}\n href={item.href}\n data-sidebar-item-id={item.id}\n data-sidebar-item-type=\"app\"\n data-sidebar-app-nav-item-selected={item.id === activeId}\n >\n {item.Icon ? <item.Icon weight={item.id === activeId ? 'fill' : 'regular'} size={16} /> : null}\n <span className={cn('transition-opacity duration-200', collapsed && 'opacity-0 sr-only')}>\n {item.label}\n </span>\n </ItemLinkComponent>\n ))}\n </div>\n </ScrollArea>\n </nav>\n );\n}\n","import * as React from 'react';\nimport { MagnifyingGlass, X } from '@phosphor-icons/react';\nimport { useToggle } from 'usehooks-ts';\n\nimport { useSidebar } from '../context';\n\nimport { Input } from '@/components/ui/input';\n\nexport function ArticleSearch() {\n const { handleSearchArticles, searchValue, setSearchValue } = useSidebar();\n const [searchInteracted, , setSearchInteracted] = useToggle(false);\n const searchInputRef = React.useRef<HTMLInputElement>(null);\n\n React.useEffect(() => {\n if (searchInteracted) handleSearchArticles?.(searchValue);\n }, [searchValue, handleSearchArticles, searchInteracted]);\n\n return (\n <div className=\"mb-2\">\n <Input\n ref={searchInputRef}\n className=\"h-auto text-subtlest border-border-subtle\"\n startIcon={MagnifyingGlass}\n endIcon={searchValue ? X : undefined}\n onEndIconClick={() => {\n setSearchValue('');\n handleSearchArticles?.('');\n }}\n value={searchValue}\n onChange={(e) => {\n const value = e.target.value;\n if (!searchInteracted) {\n setSearchInteracted(true);\n }\n setSearchValue(value);\n if (value.trim() === '') {\n handleSearchArticles('');\n setSearchInteracted(false);\n }\n }}\n placeholder=\"Find an article\"\n aria-label=\"Find an article\"\n type=\"search\"\n />\n </div>\n );\n}\n","import * as React from 'react';\nimport { Folder, FolderDashed, FolderOpen, File, FileDashed, DotsThree, Lightning, Plus } from '@phosphor-icons/react';\nimport { Key, TreeItemContentRenderProps, TreeStateContext, Button as AriaButton } from 'react-aria-components';\n\nimport { ArticleNavItem, ItemLinkComponent } from '../types';\nimport { useSidebar } from '../context';\n\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/components/ui/button';\nimport { ButtonGroup } from '@/components/ui/button-group';\nimport { Spinner } from '@/components/ui/spinner';\n\ntype ArticleItemTreeNode = {\n key: Key;\n value: ArticleNavItem;\n children: ArticleItemTreeNode[] | null;\n};\n\nfunction FolderSlotButton({ children }: { children: React.ReactNode }) {\n return (\n <AriaButton slot=\"chevron\" className=\"relative z-30 flex p-0\">\n <span className=\"relative inline-flex size-3 items-center justify-center\">{children}</span>\n </AriaButton>\n );\n}\n\nexport interface ArticleItemProps extends TreeItemContentRenderProps {\n ItemLinkComponent: ItemLinkComponent;\n item: ArticleItemTreeNode;\n onAddArticle?: (parentId: string) => void;\n isAddingArticle?: boolean;\n isLoadingChildren?: boolean;\n onMoreActions?: (articleId: string) => void;\n}\n\nexport function ArticleItem({\n item,\n hasChildItems,\n isSelected,\n isExpanded,\n ItemLinkComponent,\n onAddArticle,\n isAddingArticle,\n isLoadingChildren,\n onMoreActions,\n level,\n}: ArticleItemProps) {\n const { isSearching } = useSidebar();\n const treeState = React.useContext(TreeStateContext);\n const shouldPreventNavigation = Boolean(isSelected);\n\n const handleAddClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n onAddArticle?.(item.value.id);\n };\n\n const handleMoreClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n onMoreActions?.(item.value.id);\n };\n\n const handleItemClick = (e: React.MouseEvent) => {\n if (shouldPreventNavigation) {\n e.preventDefault();\n e.stopPropagation();\n }\n\n if (hasChildItems && treeState) {\n treeState.toggleKey(item.key);\n }\n };\n\n const showActions = !!((onAddArticle && !isAddingArticle) || onMoreActions);\n\n const isDraft = item.value.status === 'draft';\n\n let statusLabel: string;\n switch (item.value.status) {\n case 'draft':\n statusLabel = '(draft)';\n break;\n case 'unpublished':\n statusLabel = '(unpublished changes)';\n break;\n default:\n statusLabel = '';\n }\n\n const folderIcon = (\n <FolderSlotButton>\n <Folder\n aria-hidden=\"true\"\n weight=\"fill\"\n className={cn(\n 'absolute size-3 transition-opacity duration-200 ease-out',\n isExpanded ? 'opacity-0' : 'opacity-100',\n )}\n />\n <FolderOpen\n aria-hidden=\"true\"\n weight=\"fill\"\n className={cn(\n 'absolute size-3 transition-opacity duration-200 ease-out',\n isExpanded ? 'opacity-100' : 'opacity-0',\n )}\n />\n </FolderSlotButton>\n );\n\n const folderWithChangesIcon = (\n <FolderSlotButton>\n <FolderDashed\n aria-hidden=\"true\"\n weight=\"fill\"\n className={cn(\n 'absolute size-3 transition-opacity duration-200 ease-out',\n isExpanded ? 'opacity-0' : 'opacity-100',\n )}\n />\n <FolderOpen\n aria-hidden=\"true\"\n weight=\"fill\"\n className={cn(\n 'absolute size-3 transition-opacity duration-200 ease-out',\n isExpanded ? 'opacity-100' : 'opacity-0',\n )}\n />\n </FolderSlotButton>\n );\n\n const discoveryIconContent = (\n <>\n <span className=\"sr-only\">Knowledge Discovery</span>\n <Lightning aria-hidden=\"true\" weight=\"fill\" className=\"size-3 shrink-0 text-blue-600\" />\n </>\n );\n\n const discoveryIcon = hasChildItems ? (\n <FolderSlotButton>\n <span className=\"text-blue-600\">{discoveryIconContent}</span>\n </FolderSlotButton>\n ) : (\n <span className=\"flex size-3 shrink-0 items-center justify-center text-blue-600\">{discoveryIconContent}</span>\n );\n\n const fileIcon = (\n <span className=\"flex size-3 shrink-0 items-center justify-center\">\n <File aria-hidden=\"true\" className=\"size-3\" />\n </span>\n );\n\n const fileWithChangesIcon = (\n <span className=\"flex size-3 shrink-0 items-center justify-center\">\n <span className=\"sr-only\">Unpublished Changes</span>\n <FileDashed aria-hidden=\"true\" className=\"size-3\" />\n </span>\n );\n\n const loadingFolderIcon = (\n <span\n className=\"flex size-3 shrink-0 items-center justify-center\"\n role=\"status\"\n aria-label={`Loading nested articles for ${item.value.label}`}\n >\n <Spinner aria-hidden=\"true\" className=\"size-3 text-current\" />\n <span className=\"sr-only\">Loading nested articles for {item.value.label}</span>\n </span>\n );\n\n const renderStatusIcon = (status: ArticleNavItem['status'], hasChildItems: boolean) => {\n if (status === 'discovery') {\n return discoveryIcon;\n }\n\n const hasChanges = status === 'unpublished' || status === 'draft';\n\n if (hasChildItems) {\n return hasChanges ? folderWithChangesIcon : folderIcon;\n } else {\n return hasChanges ? fileWithChangesIcon : fileIcon;\n }\n };\n\n return (\n <div\n style={{ ['--line-offset' as string]: '0.875rem' }}\n aria-busy={isLoadingChildren || undefined}\n className={cn(\n 'group relative flex items-center gap-1 rounded-md py-1 pl-1 ml-[calc((var(--tree-item-level)-1)*var(--line-offset))] pr-4 h-9',\n isDraft && 'text-subtlest italic',\n isSelected\n ? 'bg-lime-100 text-primary-foreground font-bold after:absolute after:-right-0.5 after:top-1/2 after:h-1/2 after:w-1 after:-translate-y-1/2 after:bg-lime-400'\n : 'hover:bg-dark-200 hover:text-accent-foreground',\n )}\n >\n {Array.from({ length: level - 1 }, (_, i) => (\n <span\n key={`${item.value.label}-${i + 1}`}\n style={{ ['--item-line-level' as string]: i + 1 }}\n // Don't mess with the calc: forumula for multiple lines.\n className=\"absolute w-[1px] bg-dark-400 -top-2 h-9 left-[calc(-4px-var(--line-offset)*(var(--item-line-level)-1))]\"\n aria-hidden={true}\n />\n ))}\n\n <AriaButton slot=\"drag\" className=\"sr-only\">\n Drag {item.value.label}\n </AriaButton>\n\n {isSearching ? null : isLoadingChildren ? loadingFolderIcon : renderStatusIcon(item.value.status, hasChildItems)}\n\n <ItemLinkComponent\n href={item.value.href}\n title={`${item.value.label} ${statusLabel}`}\n data-sidebar-item-id={item.value.id}\n data-sidebar-item-type=\"article\"\n className={cn(\n 'min-w-0 text-inherit text-sm truncate flex-1 after:absolute after:inset-0 after:z-10 pr-1',\n isSelected && 'text-primary-foreground',\n )}\n onClick={handleItemClick}\n >\n {item.value.label}\n </ItemLinkComponent>\n\n {showActions && (\n <ButtonGroup\n orientation=\"horizontal\"\n className={cn(\n 'absolute h-4 my-auto right-0.5 top-0 bottom-0 z-20 hidden items-center rounded-xl',\n 'group-hover:flex group-focus-within:flex',\n isSelected ? 'bg-lime-100 text-primary-foreground' : 'bg-dark-200',\n )}\n >\n {onMoreActions && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={`More actions for ${item.value.label}`}\n className=\"size-4 [&_svg]:size-3.5\"\n onClick={handleMoreClick}\n >\n <DotsThree aria-hidden=\"true\" weight=\"bold\" />\n </Button>\n )}\n\n {onAddArticle && !isAddingArticle && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={`Add article to ${item.value.label}`}\n className=\"size-4 [&_svg]:size-3.5\"\n onClick={handleAddClick}\n >\n <Plus aria-hidden=\"true\" />\n </Button>\n )}\n </ButtonGroup>\n )}\n </div>\n );\n}\n","import type { Key } from 'react-aria-components';\n\nexport function getNewlyExpandedKeys(previous: Iterable<Key>, next: Iterable<Key>): string[] {\n const previousKeys = new Set(Array.from(previous, (key) => key.toString()));\n\n return Array.from(next, (key) => key.toString()).filter((key) => !previousKeys.has(key));\n}\n","import type { ArticleNavItem } from '../types';\n\ntype TreeEntry = {\n item: ArticleNavItem;\n parentId: string | null;\n index: number;\n depth: number;\n};\n\nexport type TreeSyncOperation =\n | { type: 'remove'; id: string }\n | { type: 'insert'; parentId: string | null; index: number; item: ArticleNavItem }\n | { type: 'move'; id: string; parentId: string | null; index: number }\n | { type: 'update'; id: string; item: ArticleNavItem };\n\nfunction flattenArticles(items: ArticleNavItem[], parentId: string | null = null, depth = 0, result: TreeEntry[] = []): TreeEntry[] {\n items.forEach((item, index) => {\n result.push({ item, parentId, index, depth });\n if (item.items?.length) {\n flattenArticles(item.items, item.id, depth + 1, result);\n }\n });\n\n return result;\n}\n\nfunction haveSameValue(a: ArticleNavItem, b: ArticleNavItem) {\n return (\n a.label === b.label &&\n a.href === b.href &&\n a.status === b.status &&\n a.hasChildren === b.hasChildren &&\n a.isLoadingChildren === b.isLoadingChildren\n );\n}\n\nexport function buildArticleTreeSyncOperations(currentArticles: ArticleNavItem[], nextArticles: ArticleNavItem[]): TreeSyncOperation[] {\n const currentEntries = flattenArticles(currentArticles);\n const nextEntries = flattenArticles(nextArticles);\n\n const currentMap = new Map(currentEntries.map((entry) => [entry.item.id, entry]));\n const nextMap = new Map(nextEntries.map((entry) => [entry.item.id, entry]));\n const operations: TreeSyncOperation[] = [];\n\n currentEntries\n .filter((entry) => !nextMap.has(entry.item.id))\n .sort((a, b) => b.depth - a.depth)\n .forEach((entry) => {\n operations.push({ type: 'remove', id: entry.item.id });\n });\n\n nextEntries.forEach((entry) => {\n const currentEntry = currentMap.get(entry.item.id);\n\n if (!currentEntry) {\n operations.push({\n type: 'insert',\n parentId: entry.parentId,\n index: entry.index,\n item: entry.item,\n });\n\n return;\n }\n\n if (currentEntry.parentId !== entry.parentId || currentEntry.index !== entry.index) {\n operations.push({\n type: 'move',\n id: entry.item.id,\n parentId: entry.parentId,\n index: entry.index,\n });\n }\n\n if (!haveSameValue(currentEntry.item, entry.item)) {\n operations.push({\n type: 'update',\n id: entry.item.id,\n item: entry.item,\n });\n }\n });\n\n return operations;\n}\n","import * as React from 'react';\nimport {\n useDragAndDrop,\n useTreeData,\n Tree,\n TreeItem,\n TreeItemContent,\n Collection,\n DropIndicator,\n type Key,\n} from 'react-aria-components';\n\nimport { ArticleNavItem } from '../types';\nimport { ArticleItem } from './article-item';\nimport { useSidebar } from '../context';\nimport { getNewlyExpandedKeys } from './expansion';\nimport { buildArticleTreeSyncOperations } from './tree-sync';\n\nlet placeholderCounter = 0;\n\ninterface ArticleTreeProps {\n articles: ArticleNavItem[];\n isSearching?: boolean;\n renderEmptyState?: () => React.ReactNode;\n}\n\nexport function getParentKeys(items: ArticleNavItem[], targetId: string, parents: string[] = []): string[] | null {\n for (const item of items) {\n if (item.id === targetId) {\n return parents;\n }\n if (item.items && item.items.length > 0) {\n const result = getParentKeys(item.items, targetId, [...parents, item.id]);\n if (result) return result;\n }\n }\n\n return null;\n}\n\ntype ArticleTreeNode = {\n value: ArticleNavItem;\n children: ArticleTreeNode[] | null;\n};\n\nfunction treeNodesToArticleNavItems(items: ArticleTreeNode[]): ArticleNavItem[] {\n return items.map((item) => ({\n ...item.value,\n items: item.children?.length ? treeNodesToArticleNavItems(item.children) : item.value.items,\n }));\n}\n\nexport function ArticleTree({ articles, isSearching, renderEmptyState }: ArticleTreeProps) {\n const {\n ItemLinkComponent,\n activeArticleId,\n lastSelectedArticleId,\n setLastSelectedArticleId,\n onSelectArticle,\n onExpandArticle,\n handleSearchArticles,\n setSearchValue,\n canMoveArticle,\n onMoveArticle,\n onAddArticle,\n onMoreActions,\n } = useSidebar();\n\n const effectiveActiveId = activeArticleId ?? lastSelectedArticleId ?? undefined;\n\n const articlesTree = useTreeData({\n initialItems: articles,\n getKey: (articleItem) => articleItem.id,\n getChildren: (articleItem) => articleItem.items ?? [],\n });\n\n const prevArticlesRef = React.useRef(articles);\n React.useEffect(() => {\n if (prevArticlesRef.current === articles) return;\n\n prevArticlesRef.current = articles;\n\n const currentArticles = treeNodesToArticleNavItems(articlesTree.items);\n const operations = buildArticleTreeSyncOperations(currentArticles, articles);\n\n if (operations.length === 0) return;\n\n operations.forEach((operation) => {\n switch (operation.type) {\n case 'remove':\n articlesTree.remove(operation.id);\n break;\n case 'insert':\n articlesTree.insert(operation.parentId, operation.index, operation.item);\n break;\n case 'move':\n articlesTree.move(operation.id, operation.parentId, operation.index);\n break;\n case 'update':\n articlesTree.update(operation.id, operation.item);\n break;\n }\n });\n }, [articles, articlesTree]);\n\n const { dragAndDropHooks } = useDragAndDrop({\n getItems: (_keys, items: typeof articlesTree.items) =>\n items.map((item) => ({\n 'text/plain': item.value.label,\n })),\n onMove: (e) => {\n if (isSearching) return;\n const movedArticleId = Array.from(e.keys)[0];\n if (!movedArticleId) return;\n\n const targetItem = articlesTree.getItem(e.target.key);\n if (!targetItem) return;\n\n let movedToParentId: string | null;\n let movedToIndex: number;\n\n if (e.target.dropPosition === 'on') {\n movedToParentId = e.target.key.toString();\n movedToIndex = targetItem.children?.length ?? 0;\n } else {\n movedToParentId = targetItem.parentKey?.toString() ?? null;\n const siblings = movedToParentId ? (articlesTree.getItem(movedToParentId)?.children ?? []) : articlesTree.items;\n const targetIndex = siblings.findIndex((i) => i.key === e.target.key);\n movedToIndex = e.target.dropPosition === 'before' ? targetIndex : targetIndex + 1;\n }\n\n const moveDetails = {\n id: movedArticleId.toString(),\n parentId: movedToParentId,\n index: movedToIndex,\n };\n\n if (canMoveArticle && !canMoveArticle(moveDetails)) {\n return;\n }\n\n const movedItem = articlesTree.getItem(movedArticleId);\n const originalParentId = movedItem?.parentKey?.toString() ?? null;\n const originalSiblings = originalParentId\n ? (articlesTree.getItem(originalParentId)?.children ?? [])\n : articlesTree.items;\n const originalIndex = originalSiblings.findIndex((i) => i.key === movedArticleId);\n\n if (e.target.dropPosition === 'on') {\n articlesTree.move(movedArticleId, movedToParentId, movedToIndex);\n } else if (e.target.dropPosition === 'before') {\n articlesTree.moveBefore(e.target.key, e.keys);\n } else {\n articlesTree.moveAfter(e.target.key, e.keys);\n }\n\n const result = onMoveArticle?.(moveDetails);\n\n if (result && typeof result.then === 'function') {\n result.catch(() => {\n articlesTree.move(movedArticleId, originalParentId, originalIndex);\n });\n }\n },\n renderDropIndicator: (target) => (\n <DropIndicator\n target={target}\n className=\"outline outline-1 outline-lime-200 ml-[calc(var(--tree-item-level)*0.5rem)]\"\n />\n ),\n });\n\n // Selection when there's no active article from URL/context; used so the tree can show a selection before navigation.\n const [localSelectedKeys, setLocalSelectedKeys] = React.useState<Set<Key>>(new Set());\n const selectedKeys = React.useMemo(\n () => (effectiveActiveId != null ? new Set<Key>([effectiveActiveId]) : localSelectedKeys),\n [effectiveActiveId, localSelectedKeys],\n );\n\n const pathToActive = React.useMemo(() => {\n if (!effectiveActiveId || isSearching || !articles.length) return [];\n const path = getParentKeys(articles, effectiveActiveId);\n\n return path ?? [];\n }, [articles, effectiveActiveId, isSearching]);\n\n const [expandedKeysState, setExpandedKeysState] = React.useState<Set<Key>>(new Set());\n const expandedKeys = React.useMemo(\n () => new Set<Key>([...pathToActive, ...expandedKeysState]),\n [pathToActive, expandedKeysState],\n );\n\n React.useEffect(() => {\n if (!activeArticleId) return;\n setLastSelectedArticleId(null);\n }, [activeArticleId, lastSelectedArticleId, setLastSelectedArticleId]);\n\n const pendingAddIdsRef = React.useRef<Set<string>>(new Set());\n const [pendingAddIds, setPendingAddIds] = React.useState<Set<string>>(new Set());\n\n const handleAddArticle = React.useCallback(\n (parentId: string) => {\n if (isSearching || !onAddArticle || pendingAddIdsRef.current.has(parentId)) return;\n\n pendingAddIdsRef.current.add(parentId);\n setPendingAddIds(new Set(pendingAddIdsRef.current));\n\n const tempId = `__placeholder_${++placeholderCounter}`;\n const placeholder: ArticleNavItem = { id: tempId, label: 'Untitled', href: '', status: 'draft' };\n\n articlesTree.append(parentId, placeholder);\n setExpandedKeysState((prev) => new Set([...prev, parentId]));\n\n onAddArticle(parentId).then(\n (created) => {\n articlesTree.remove(tempId);\n articlesTree.append(parentId, created);\n // Highlight the newly created article in the tree.\n setLocalSelectedKeys(new Set([created.id]));\n onSelectArticle?.(created.id);\n pendingAddIdsRef.current.delete(parentId);\n setPendingAddIds(new Set(pendingAddIdsRef.current));\n },\n () => {\n articlesTree.remove(tempId);\n pendingAddIdsRef.current.delete(parentId);\n setPendingAddIds(new Set(pendingAddIdsRef.current));\n },\n );\n },\n [isSearching, onAddArticle, articlesTree, onSelectArticle],\n );\n\n const navigateToArticleId = React.useCallback(\n (articleId: string) => {\n onSelectArticle?.(articleId);\n // No URL/store id: keep highlight in sync for Storybook and other uncontrolled hosts.\n if (activeArticleId == null) {\n setLocalSelectedKeys(new Set<Key>([articleId]));\n }\n if (isSearching) {\n setLastSelectedArticleId(articleId);\n setSearchValue('');\n handleSearchArticles?.('');\n }\n },\n [activeArticleId, handleSearchArticles, isSearching, onSelectArticle, setLastSelectedArticleId, setSearchValue],\n );\n\n return (\n <Tree\n aria-label={isSearching ? 'Search results' : 'Articles tree'}\n items={articlesTree.items}\n renderEmptyState={renderEmptyState}\n dragAndDropHooks={isSearching ? undefined : dragAndDropHooks}\n className=\"flex flex-col\"\n // toggle → selectOnFocus off in React Aria, so ArrowUp/Down only move focus; Space updates selection → onSelectionChange.\n selectionBehavior=\"toggle\"\n selectionMode=\"single\"\n expandedKeys={expandedKeys}\n onExpandedChange={(nextExpandedKeys) => {\n const newlyExpandedKeys = getNewlyExpandedKeys(expandedKeys, nextExpandedKeys);\n\n newlyExpandedKeys.forEach((key) => {\n onExpandArticle?.(key);\n });\n\n setExpandedKeysState(nextExpandedKeys);\n }}\n selectedKeys={selectedKeys}\n disallowEmptySelection\n onSelectionChange={(selection) => {\n if (selection !== 'all') {\n // Keep local selection in sync when we're not driven by URL/active article.\n if (effectiveActiveId == null) setLocalSelectedKeys(selection);\n const selected = Array.from(selection)?.[0];\n\n if (selected) {\n navigateToArticleId(selected.toString());\n }\n }\n }}\n >\n {function renderItem(item) {\n return (\n <TreeItem\n className=\"list-none\"\n textValue={item.value.label}\n id={item.value.id}\n hasChildItems={item.value.hasChildren}\n >\n <TreeItemContent>\n {(props) => (\n <ArticleItem\n ItemLinkComponent={ItemLinkComponent}\n item={item}\n onAddArticle={!isSearching && onAddArticle ? handleAddArticle : undefined}\n isAddingArticle={!isSearching && pendingAddIds.has(item.value.id)}\n isLoadingChildren={!isSearching && item.value.isLoadingChildren}\n onMoreActions={onMoreActions ? (articleId) => onMoreActions(articleId) : undefined}\n {...props}\n />\n )}\n </TreeItemContent>\n\n {!isSearching && item.children && <Collection items={item.children}>{renderItem}</Collection>}\n </TreeItem>\n );\n }}\n </Tree>\n );\n}\n","import * as React from 'react';\nimport { Article } from '@phosphor-icons/react';\nimport { useDebounceValue } from 'usehooks-ts';\n\nimport { useSidebar } from '../context';\nimport { ArticleNavItem } from '../types';\nimport { ArticleSearch } from './article-search';\nimport { ArticleTree } from './article-tree';\n\nimport { Spinner } from '@/components/ui/spinner';\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/components/ui/button';\nimport { useSubstringFilter } from '@/lib/hooks';\n\n/** Debounce applied to the article tree filter + remount key while searching (avoids work every keystroke). */\nconst ARTICLE_TREE_SEARCH_DEBOUNCE_MS = 400;\n/** Stable ref for useDebounceValue options — inline objects reset debounce each render (usehooks-ts #703). */\nconst ARTICLE_TREE_SEARCH_DEBOUNCE_OPTIONS = { leading: true, trailing: true } as const;\n\nexport interface ArticleNavProps {\n className?: string;\n isLoadingArticles?: boolean;\n articles?: ArticleNavItem[];\n}\n\nexport function ArticleNav({ articles, className, isLoadingArticles }: ArticleNavProps) {\n const { isSearching, searchValue, onAddArticle } = useSidebar();\n const { contains } = useSubstringFilter();\n const trimmedQuery = searchValue.trim();\n const [debouncedTreeQuery] = useDebounceValue(\n isSearching ? trimmedQuery : '',\n isSearching ? ARTICLE_TREE_SEARCH_DEBOUNCE_MS : 0,\n isSearching ? ARTICLE_TREE_SEARCH_DEBOUNCE_OPTIONS : undefined,\n );\n\n const shouldShowLoadingState = !isSearching && (isLoadingArticles ?? articles === undefined);\n const renderLoadingEmptyState = React.useCallback(\n () => (\n <div\n className=\"flex min-h-20 items-center justify-center text-muted-foreground\"\n role=\"status\"\n aria-live=\"polite\"\n aria-label=\"Loading articles list\"\n >\n <Spinner className=\"size-5\" aria-hidden=\"true\" />\n <span className=\"sr-only\">Loading articles list</span>\n </div>\n ),\n [],\n );\n\n const noArticles = !shouldShowLoadingState && !isSearching && (!articles || articles.length === 0);\n\n const filteredArticles = React.useMemo(() => {\n if (isSearching) {\n // `includes('')` is true for every string; avoid showing the full tree with an empty query.\n if (trimmedQuery === '' || debouncedTreeQuery === '') {\n return [];\n }\n const result: ArticleNavItem[] = [];\n const query = debouncedTreeQuery;\n\n const traverse = (nodes: ArticleNavItem[]) => {\n for (const item of nodes) {\n if (contains(item.label, query)) {\n // Strip children so each hit is one row; otherwise the tree would render nested\n // items AND the same nodes again as separate roots (duplicates).\n result.push({ ...item, hasChildren: false, items: [] });\n }\n if (item.items?.length) {\n traverse(item.items);\n }\n }\n };\n\n traverse(articles ?? []);\n\n return result;\n }\n if (articles && articles.length > 0) {\n return articles;\n }\n\n return [];\n }, [articles, isSearching, trimmedQuery, debouncedTreeQuery, contains]);\n\n return (\n <div className={cn('flex flex-col gap-0.5 px-4', className)}>\n {noArticles && (\n <Button variant=\"ghost\" className=\"text-subtlest\" onClick={() => onAddArticle?.(null).catch(() => {})}>\n <Article aria-hidden=\"true\" />\n Create first article or folder\n </Button>\n )}\n\n {shouldShowLoadingState ? (\n <ArticleTree articles={[]} renderEmptyState={renderLoadingEmptyState} />\n ) : (\n <>\n <ArticleSearch />\n <nav aria-label=\"Articles navigation\">\n <ArticleTree\n key={isSearching ? (trimmedQuery === '' ? 'search:empty' : `search:${debouncedTreeQuery}`) : 'browse'}\n articles={filteredArticles ?? []}\n />\n </nav>\n </>\n )}\n </div>\n );\n}\n","import * as React from 'react';\n\nimport { SidebarNavItem } from '../types';\nimport { useSidebar } from '../context';\n\nimport { cn } from '@/lib/utils';\n\nexport interface SectionNavProps {\n className?: string;\n items: SidebarNavItem[];\n activeId?: string;\n}\n\nexport function SectionNav({ className, items, activeId }: SectionNavProps) {\n const { ItemLinkComponent } = useSidebar();\n\n return (\n <nav className={cn('flex flex-col', className)} aria-label=\"App section navigation\">\n {items.map((item) => (\n <ItemLinkComponent\n key={item.id}\n href={item.href}\n data-sidebar-item-id={item.id}\n data-sidebar-item-type=\"section\"\n data-sidebar-section-nav-item-selected={item.id === activeId}\n className={cn(\n 'flex p-2 mx-4 text-base text-default relative rounded-lg',\n 'after:transition-opacity after:absolute after:top-0 after:bottom-0 after:-right-4 after:w-2 after:bg-primary after:rounded-l-md after:opacity-0',\n 'hover:bg-lime-100 focus:bg-lime-100 hover:text-primary-foreground focus:text-primary-foreground',\n item.id === activeId && 'font-bold after:opacity-100',\n )}\n >\n {item.label}\n </ItemLinkComponent>\n ))}\n </nav>\n );\n}\n","import * as React from 'react';\n\nimport { SidebarNavItem, ArticleNavItem } from './types';\nimport { SidebarContextProps, SidebarProvider } from './context';\nimport { AppNav } from './app-nav';\nimport { ArticleNav } from './article-nav';\nimport { SectionNav } from './section-nav';\n\nimport { ScrollArea } from '@/components/ui/scroll-area';\nimport { cn } from '@/lib/utils';\n\nexport interface SidebarProps extends React.ComponentPropsWithoutRef<'aside'>, SidebarContextProps {\n showAppBack?: boolean;\n onAppBack?: () => void;\n appNavItems?: SidebarNavItem[];\n appNavActiveId?: string;\n showArticles?: boolean;\n isLoadingArticles?: boolean;\n articles?: ArticleNavItem[];\n sectionNavItems?: SidebarNavItem[];\n sectionNavActiveId?: string;\n}\n\nexport const Sidebar = React.forwardRef<HTMLElement, SidebarProps>(function Sidebar(\n {\n className,\n ItemLinkComponent,\n collapsed,\n showAppBack,\n onAppBack,\n appNavItems,\n appNavActiveId,\n isLoadingArticles,\n sectionNavItems,\n sectionNavActiveId,\n activeArticleId,\n showArticles,\n articles,\n onSelectArticle,\n onExpandArticle,\n onSearchArticles,\n onAddArticle,\n onMoreActions,\n canMoveArticle,\n onMoveArticle,\n ...props\n },\n ref,\n) {\n // indicates if the scroll area is at the bottom\n const [atScrollBottom, setAtScrollBottom] = React.useState(false);\n\n // detect if the scroll area is at the bottom\n const handleScroll = (event: React.UIEvent<HTMLDivElement>) => {\n const { scrollHeight, scrollTop, clientHeight } = event.currentTarget;\n setAtScrollBottom(scrollTop + clientHeight >= scrollHeight);\n };\n\n return (\n <SidebarProvider\n collapsed={!!collapsed}\n ItemLinkComponent={ItemLinkComponent}\n activeArticleId={activeArticleId}\n onSelectArticle={onSelectArticle}\n onExpandArticle={onExpandArticle}\n onSearchArticles={onSearchArticles}\n onAddArticle={onAddArticle}\n onMoreActions={onMoreActions}\n canMoveArticle={canMoveArticle}\n onMoveArticle={onMoveArticle}\n >\n <aside\n ref={ref}\n {...props}\n className={cn(\n 'py-4 transition-width duration-200 ease-in-out flex flex-col h-dvh',\n collapsed ? 'w-[64px]' : 'w-[260px]',\n className,\n )}\n aria-label=\"Application navigation\"\n >\n <AppNav\n className={cn(\n 'flex-shrink-0',\n appNavItems && appNavItems.length > 0 && 'pb-4',\n !collapsed && 'border-b border-border-subtle',\n )}\n showBack={showAppBack}\n items={appNavItems}\n activeId={appNavActiveId}\n onBack={onAppBack}\n />\n\n {!collapsed && (\n <>\n {showArticles && (\n <ScrollArea onScroll={handleScroll}>\n <ArticleNav\n className=\"py-4 max-w-[var(--left-nav-width,inherit)]\"\n articles={articles}\n isLoadingArticles={isLoadingArticles}\n />\n </ScrollArea>\n )}\n {sectionNavItems && sectionNavItems.length > 0 && (\n <SectionNav\n className={cn('pt-4 flex-shrink-0', !collapsed && !atScrollBottom && 'border-t border-subtle')}\n items={sectionNavItems}\n activeId={sectionNavActiveId}\n />\n )}\n </>\n )}\n </aside>\n </SidebarProvider>\n );\n});\n"],"names":["ItemLinkComponent","AriaButton","hasChildItems","Sidebar"],"mappings":"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"}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import * as React from 'react';
|
|
2
|
-
import { c as cn } from './utils.Cwtlq8dh.js';
|
|
3
|
-
import { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from '../components/ui/select.js';
|
|
4
|
-
|
|
5
|
-
function SimpleSelect({
|
|
6
|
-
options,
|
|
7
|
-
value,
|
|
8
|
-
onChange,
|
|
9
|
-
placeholder = "Select...",
|
|
10
|
-
disabled = false,
|
|
11
|
-
className,
|
|
12
|
-
appendToBody = false
|
|
13
|
-
}) {
|
|
14
|
-
const handleValueChange = (newValue) => {
|
|
15
|
-
if (onChange) {
|
|
16
|
-
onChange(newValue);
|
|
17
|
-
}
|
|
18
|
-
};
|
|
19
|
-
return /* @__PURE__ */ React.createElement(Select, { value, onValueChange: handleValueChange, disabled }, /* @__PURE__ */ React.createElement(SelectTrigger, { className: cn("w-full", className) }, /* @__PURE__ */ React.createElement(SelectValue, { placeholder })), /* @__PURE__ */ React.createElement(SelectContent, { appendToBody }, options.map((option) => /* @__PURE__ */ React.createElement(SelectItem, { key: option.value, value: option.value }, option.label))));
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export { SimpleSelect as S };
|
|
23
|
-
//# sourceMappingURL=simpleSelect.B1rktKkt.js.map
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import React__default from 'react';
|
|
2
|
-
import { Check, Circle } from '@phosphor-icons/react';
|
|
3
|
-
import { Badge } from '../components/ui/badge.js';
|
|
4
|
-
import { c as cn } from './utils.Cwtlq8dh.js';
|
|
5
|
-
|
|
6
|
-
const StatusBadge = React__default.forwardRef(
|
|
7
|
-
({ className, suffix, variant, children, ...props }, ref) => {
|
|
8
|
-
const Icon = variant === "accepted" ? Check : Circle;
|
|
9
|
-
const badgeVariant = variant === "accepted" ? "success" : variant;
|
|
10
|
-
const weight = variant === "accepted" ? "bold" : "fill";
|
|
11
|
-
const size = variant === "accepted" ? `!size-3` : `!size-2`;
|
|
12
|
-
return /* @__PURE__ */ React__default.createElement("span", { ref, className: cn("flex items-center gap-1 rounded-md p-1", suffix && "bg-dark-300", className) }, /* @__PURE__ */ React__default.createElement(Badge, { ...props, variant: badgeVariant }, /* @__PURE__ */ React__default.createElement("span", { className: "flex items-center gap-1" }, /* @__PURE__ */ React__default.createElement(Icon, { weight, size: 8, className: size }), children)), suffix && /* @__PURE__ */ React__default.createElement("span", { className: "text-xs text-default" }, suffix));
|
|
13
|
-
}
|
|
14
|
-
);
|
|
15
|
-
StatusBadge.displayName = "StatusBadge";
|
|
16
|
-
|
|
17
|
-
export { StatusBadge as S };
|
|
18
|
-
//# sourceMappingURL=status-badge.eFJ1PYeb.js.map
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import React__default, { forwardRef } from 'react';
|
|
2
|
-
import { ArrowFatUp, ArrowFatRight, ArrowFatDown } from '@phosphor-icons/react';
|
|
3
|
-
import { c as cn } from './utils.Cwtlq8dh.js';
|
|
4
|
-
|
|
5
|
-
var Trend = /* @__PURE__ */ ((Trend2) => {
|
|
6
|
-
Trend2["UP"] = "up";
|
|
7
|
-
Trend2["DOWN"] = "down";
|
|
8
|
-
Trend2["FLAT"] = "flat";
|
|
9
|
-
return Trend2;
|
|
10
|
-
})(Trend || {});
|
|
11
|
-
const TrendValue = forwardRef(
|
|
12
|
-
({ variant = "default", trend, trendValue, className, ...props }, ref) => {
|
|
13
|
-
let ArrowIcon = ArrowFatUp;
|
|
14
|
-
switch (trend) {
|
|
15
|
-
case "up" /* UP */:
|
|
16
|
-
ArrowIcon = ArrowFatUp;
|
|
17
|
-
break;
|
|
18
|
-
case "down" /* DOWN */:
|
|
19
|
-
ArrowIcon = ArrowFatDown;
|
|
20
|
-
break;
|
|
21
|
-
case "flat" /* FLAT */:
|
|
22
|
-
ArrowIcon = ArrowFatRight;
|
|
23
|
-
break;
|
|
24
|
-
}
|
|
25
|
-
let commentary = "";
|
|
26
|
-
let ariaLabel = "";
|
|
27
|
-
let color = "";
|
|
28
|
-
switch (trend) {
|
|
29
|
-
case "up" /* UP */:
|
|
30
|
-
ariaLabel = `Trending up by ${trendValue}`;
|
|
31
|
-
commentary = "Trending up by ";
|
|
32
|
-
color = "text-green-500";
|
|
33
|
-
break;
|
|
34
|
-
case "down" /* DOWN */:
|
|
35
|
-
ariaLabel = `Trending down by ${trendValue}`;
|
|
36
|
-
commentary = "Trending down by ";
|
|
37
|
-
color = "text-red-500";
|
|
38
|
-
break;
|
|
39
|
-
case "flat" /* FLAT */:
|
|
40
|
-
ariaLabel = `No change - ${trendValue}`;
|
|
41
|
-
commentary = "No change ";
|
|
42
|
-
color = "text-dark-600";
|
|
43
|
-
break;
|
|
44
|
-
}
|
|
45
|
-
return /* @__PURE__ */ React__default.createElement("div", { ref, className: cn("flex items-center gap-1", className), ...props }, variant === "long" && /* @__PURE__ */ React__default.createElement("span", { className: "text-sm" }, commentary), /* @__PURE__ */ React__default.createElement(ArrowIcon, { weight: "fill", className: cn("size-4", color) }), /* @__PURE__ */ React__default.createElement("span", { className: cn("text-sm font-bold", color), "aria-label": ariaLabel }, trendValue));
|
|
46
|
-
}
|
|
47
|
-
);
|
|
48
|
-
TrendValue.displayName = "TrendValue";
|
|
49
|
-
|
|
50
|
-
export { Trend as T, TrendValue as a };
|
|
51
|
-
//# sourceMappingURL=trend-value.COSukPwk.js.map
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
import * as React from 'react';
|
|
2
|
-
import { X, CaretUpDown, ArrowLeft, Spinner, Check } from '@phosphor-icons/react';
|
|
3
|
-
import { c as cn } from './utils.Cwtlq8dh.js';
|
|
4
|
-
import { B as Button } from './button.DQL6gCAt.js';
|
|
5
|
-
import { Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem } from '../components/ui/command.js';
|
|
6
|
-
import { Popover, PopoverTrigger, PopoverContent } from '../components/ui/popover.js';
|
|
7
|
-
import { DivButton } from '../components/ui/div-button.js';
|
|
8
|
-
|
|
9
|
-
function TwoLevelCombobox({
|
|
10
|
-
firstLevelItems,
|
|
11
|
-
fetchSecondLevelItems,
|
|
12
|
-
onSelectionChange,
|
|
13
|
-
firstLevelLabel = "First Level",
|
|
14
|
-
secondLevelLabel = "Second Level",
|
|
15
|
-
firstLevelPlaceholder = "Select first level...",
|
|
16
|
-
className,
|
|
17
|
-
debugMode = false,
|
|
18
|
-
displayLabel = true
|
|
19
|
-
}) {
|
|
20
|
-
const [open, setOpen] = React.useState(false);
|
|
21
|
-
const [view, setView] = React.useState("first");
|
|
22
|
-
const [selectedFirstLevel, setSelectedFirstLevel] = React.useState(null);
|
|
23
|
-
const [selectedSecondLevel, setSelectedSecondLevel] = React.useState(null);
|
|
24
|
-
const [secondLevelItems, setSecondLevelItems] = React.useState([]);
|
|
25
|
-
const [isLoadingSecondLevel, setIsLoadingSecondLevel] = React.useState(false);
|
|
26
|
-
const [searchValue, setSearchValue] = React.useState("");
|
|
27
|
-
const handleFirstLevelSelect = async (item) => {
|
|
28
|
-
setSelectedFirstLevel(item);
|
|
29
|
-
setSelectedSecondLevel(null);
|
|
30
|
-
setIsLoadingSecondLevel(true);
|
|
31
|
-
setView("second");
|
|
32
|
-
setSearchValue("");
|
|
33
|
-
try {
|
|
34
|
-
const fetchedItems = await fetchSecondLevelItems(item.value);
|
|
35
|
-
setSecondLevelItems(fetchedItems);
|
|
36
|
-
} catch (error) {
|
|
37
|
-
console.warn(error);
|
|
38
|
-
setSecondLevelItems([]);
|
|
39
|
-
} finally {
|
|
40
|
-
setIsLoadingSecondLevel(false);
|
|
41
|
-
}
|
|
42
|
-
onSelectionChange?.(item, null);
|
|
43
|
-
};
|
|
44
|
-
const handleSecondLevelSelect = (item) => {
|
|
45
|
-
setSelectedSecondLevel(item);
|
|
46
|
-
setOpen(false);
|
|
47
|
-
onSelectionChange?.(selectedFirstLevel, item);
|
|
48
|
-
};
|
|
49
|
-
const handleBackToFirstLevel = () => {
|
|
50
|
-
setView("first");
|
|
51
|
-
setSearchValue("");
|
|
52
|
-
};
|
|
53
|
-
const handleOpenChange = (isOpen) => {
|
|
54
|
-
setOpen(isOpen);
|
|
55
|
-
if (isOpen && !selectedFirstLevel) {
|
|
56
|
-
setView("first");
|
|
57
|
-
} else if (isOpen && selectedFirstLevel) {
|
|
58
|
-
setView("second");
|
|
59
|
-
}
|
|
60
|
-
};
|
|
61
|
-
const handleClearSelection = (e) => {
|
|
62
|
-
e.stopPropagation();
|
|
63
|
-
setSelectedFirstLevel(null);
|
|
64
|
-
setSelectedSecondLevel(null);
|
|
65
|
-
setSecondLevelItems([]);
|
|
66
|
-
setView("first");
|
|
67
|
-
onSelectionChange?.(null, null);
|
|
68
|
-
};
|
|
69
|
-
const getLabel = () => {
|
|
70
|
-
if (selectedSecondLevel) return `${firstLevelLabel} & ${secondLevelLabel}`;
|
|
71
|
-
if (selectedFirstLevel) return `Select ${secondLevelLabel}`;
|
|
72
|
-
return `Select ${firstLevelLabel}`;
|
|
73
|
-
};
|
|
74
|
-
return /* @__PURE__ */ React.createElement("div", { className: cn("space-y-4", className) }, /* @__PURE__ */ React.createElement("div", { className: "space-y-2" }, displayLabel && /* @__PURE__ */ React.createElement("label", { className: "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70" }, getLabel()), /* @__PURE__ */ React.createElement(Popover, { open, onOpenChange: handleOpenChange }, /* @__PURE__ */ React.createElement(PopoverTrigger, { asChild: true }, /* @__PURE__ */ React.createElement(
|
|
75
|
-
Button,
|
|
76
|
-
{
|
|
77
|
-
variant: "outline",
|
|
78
|
-
role: "combobox",
|
|
79
|
-
"aria-expanded": open,
|
|
80
|
-
className: "w-full justify-between bg-transparent"
|
|
81
|
-
},
|
|
82
|
-
/* @__PURE__ */ React.createElement("div", { className: "flex items-center gap-2 flex-1 min-w-0" }, selectedSecondLevel ? /* @__PURE__ */ React.createElement("div", { className: "truncate flex items-center gap-1" }, selectedFirstLevel.label, " → ", selectedSecondLevel.label) : selectedFirstLevel ? /* @__PURE__ */ React.createElement("div", { className: "truncate flex items-center" }, selectedFirstLevel.label) : /* @__PURE__ */ React.createElement("span", { className: "truncate" }, firstLevelPlaceholder)),
|
|
83
|
-
/* @__PURE__ */ React.createElement("div", { className: "flex items-center gap-1 shrink-0" }, (selectedFirstLevel || selectedSecondLevel) && // Render button as div to prevent button within button error
|
|
84
|
-
/* @__PURE__ */ React.createElement(
|
|
85
|
-
DivButton,
|
|
86
|
-
{
|
|
87
|
-
variant: "ghost",
|
|
88
|
-
size: "sm",
|
|
89
|
-
className: "size-6 p-0 hover:bg-muted rounded-sm",
|
|
90
|
-
onClick: handleClearSelection,
|
|
91
|
-
"aria-label": "Clear selection"
|
|
92
|
-
},
|
|
93
|
-
/* @__PURE__ */ React.createElement(X, { className: "size-3" })
|
|
94
|
-
), /* @__PURE__ */ React.createElement(CaretUpDown, { className: "size-4 shrink-0 opacity-50" }))
|
|
95
|
-
)), /* @__PURE__ */ React.createElement(PopoverContent, { className: "w-full p-0", align: "start" }, /* @__PURE__ */ React.createElement(Command, null, view === "second" && selectedFirstLevel && /* @__PURE__ */ React.createElement("div", { className: "flex items-center gap-2 p-2 border-b" }, /* @__PURE__ */ React.createElement(Button, { variant: "ghost", size: "sm", onClick: handleBackToFirstLevel, className: "h-8 w-8 p-0 shrink-0" }, /* @__PURE__ */ React.createElement(ArrowLeft, { className: "size-4" })), /* @__PURE__ */ React.createElement("div", { className: "text-sm font-medium truncate flex-1 min-w-0 flex items-center" }, selectedFirstLevel.label), /* @__PURE__ */ React.createElement(
|
|
96
|
-
DivButton,
|
|
97
|
-
{
|
|
98
|
-
variant: "ghost",
|
|
99
|
-
size: "sm",
|
|
100
|
-
className: "size-6 p-0 ml-auto hover:bg-muted rounded-sm shrink-0",
|
|
101
|
-
onClick: handleClearSelection,
|
|
102
|
-
"aria-label": "Clear selection"
|
|
103
|
-
},
|
|
104
|
-
/* @__PURE__ */ React.createElement(X, { className: "size-3" })
|
|
105
|
-
), isLoadingSecondLevel && /* @__PURE__ */ React.createElement(Spinner, { className: "size-4 animate-spin text-muted-foreground shrink-0" })), /* @__PURE__ */ React.createElement(
|
|
106
|
-
CommandInput,
|
|
107
|
-
{
|
|
108
|
-
value: searchValue,
|
|
109
|
-
onValueChange: setSearchValue,
|
|
110
|
-
placeholder: view === "first" ? `Search ${firstLevelLabel.toLowerCase()}...` : `Search ${secondLevelLabel.toLowerCase()}...`
|
|
111
|
-
}
|
|
112
|
-
), /* @__PURE__ */ React.createElement(CommandList, null, /* @__PURE__ */ React.createElement(CommandEmpty, null, view === "first" ? `No ${firstLevelLabel.toLowerCase()} found.` : `No ${secondLevelLabel.toLowerCase()} found.`), view === "first" && /* @__PURE__ */ React.createElement(CommandGroup, null, firstLevelItems.map((item) => /* @__PURE__ */ React.createElement(CommandItem, { key: item.value, value: item.label, onSelect: () => handleFirstLevelSelect(item) }, /* @__PURE__ */ React.createElement("span", { className: "flex items-center gap-2" }, item.icon, item.label), /* @__PURE__ */ React.createElement(
|
|
113
|
-
Check,
|
|
114
|
-
{
|
|
115
|
-
className: cn(
|
|
116
|
-
"ml-2 size-4",
|
|
117
|
-
selectedFirstLevel?.value === item.value ? "opacity-100" : "opacity-0"
|
|
118
|
-
)
|
|
119
|
-
}
|
|
120
|
-
)))), view === "second" && selectedFirstLevel && /* @__PURE__ */ React.createElement(CommandGroup, null, isLoadingSecondLevel ? /* @__PURE__ */ React.createElement("div", { className: "flex items-center justify-center py-6" }, /* @__PURE__ */ React.createElement(Spinner, { className: "size-4 animate-spin text-muted-foreground mr-2" }), /* @__PURE__ */ React.createElement("span", { className: "text-sm text-muted-foreground" }, "Loading ", secondLevelLabel.toLowerCase(), "...")) : secondLevelItems.map((item) => /* @__PURE__ */ React.createElement(CommandItem, { key: item.value, value: item.label, onSelect: () => handleSecondLevelSelect(item) }, /* @__PURE__ */ React.createElement("span", { className: "flex items-center gap-2" }, item.icon, item.label), /* @__PURE__ */ React.createElement(
|
|
121
|
-
Check,
|
|
122
|
-
{
|
|
123
|
-
className: cn(
|
|
124
|
-
"ml-2 size-4",
|
|
125
|
-
selectedSecondLevel?.value === item.value ? "opacity-100" : "opacity-0"
|
|
126
|
-
)
|
|
127
|
-
}
|
|
128
|
-
))))))))), (selectedFirstLevel || selectedSecondLevel) && debugMode && /* @__PURE__ */ React.createElement("div", { className: "mt-6 p-4 bg-muted/50 rounded-lg space-y-2" }, /* @__PURE__ */ React.createElement("h3", { className: "font-medium text-sm" }, "Selected Values:"), selectedFirstLevel && /* @__PURE__ */ React.createElement("div", { className: "text-sm text-muted-foreground flex items-center gap-1" }, /* @__PURE__ */ React.createElement("span", { className: "font-medium" }, firstLevelLabel, ":"), /* @__PURE__ */ React.createElement("div", { className: "flex items-center" }, selectedFirstLevel.label)), selectedSecondLevel && /* @__PURE__ */ React.createElement("div", { className: "text-sm text-muted-foreground flex items-center gap-1" }, /* @__PURE__ */ React.createElement("span", { className: "font-medium" }, secondLevelLabel, ":"), /* @__PURE__ */ React.createElement("div", { className: "flex items-center" }, selectedSecondLevel.label))));
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
export { TwoLevelCombobox as T };
|
|
132
|
-
//# sourceMappingURL=two-level-combobox.BXs2z9u5.js.map
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { useCallback } from 'react';
|
|
2
|
-
import { f as formatChartTick, a as formatChartLabel } from './formatDate.CWN6IFKq.js';
|
|
3
|
-
|
|
4
|
-
function useChartDateFormatters(locale) {
|
|
5
|
-
const tickFormatter = useCallback((value) => formatChartTick(value, locale ?? "en-US"), [locale]);
|
|
6
|
-
const formatXLabel = useCallback((label) => formatChartLabel(label, locale ?? "en-US"), [locale]);
|
|
7
|
-
return { tickFormatter, formatXLabel };
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export { useChartDateFormatters as u };
|
|
11
|
-
//# sourceMappingURL=useChartDateFormatters.DS9ASgFO.js.map
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import 'react';
|
|
2
|
-
import { clsx } from 'clsx';
|
|
3
|
-
import { twMerge } from 'tailwind-merge';
|
|
4
|
-
|
|
5
|
-
function cn(...inputs) {
|
|
6
|
-
return twMerge(clsx(inputs));
|
|
7
|
-
}
|
|
8
|
-
function isAnswerUncertain(response) {
|
|
9
|
-
const uncertaintyPatternsByLanguage = {
|
|
10
|
-
en: [
|
|
11
|
-
/i(?:\s|['\u2018\u2019])?m(?:\s+really)?\s+not\s+sure/i,
|
|
12
|
-
/i(?:\s+am)?(?:\s+really)?\s+not\s+sure/i,
|
|
13
|
-
/i\s+(?:really\s+)?don(?:['\u2018\u2019])?t\s+know/i,
|
|
14
|
-
/it(?:['\u2018\u2019]s| is) unclear/i,
|
|
15
|
-
/cannot determine/i,
|
|
16
|
-
/hard to say/i,
|
|
17
|
-
/difficult to determine/i
|
|
18
|
-
],
|
|
19
|
-
es: [/no (?:lo )?sé/i, /no estoy seguro/i, /no es claro/i, /desconocido/i],
|
|
20
|
-
fr: [/je ne sais pas/i, /je ne suis pas sûr/i, /ce n'est pas clair/i, /inconnu/i],
|
|
21
|
-
de: [/ich weiß nicht/i, /ich bin nicht sicher/i, /es ist unklar/i, /unbekannt/i],
|
|
22
|
-
it: [/non lo so/i, /non sono sicuro/i, /non è chiaro/i, /sconosciuto/i],
|
|
23
|
-
pt: [/não sei/i, /não tenho certeza/i, /não está claro/i, /desconhecido/i],
|
|
24
|
-
nl: [/ik weet het niet/i, /ik weet niet zeker/i, /het is onduidelijk/i, /onbekend/i],
|
|
25
|
-
pl: [/nie wiem/i, /nie jestem pewien/i, /to nie jest jasne/i, /nieznany/i],
|
|
26
|
-
ru: [/я не знаю/i, /я не уверен/i, /это не ясно/i, /неизвестно/i],
|
|
27
|
-
ja: [/知りません/i, /よくわからない/i, /不明です/i, /未知/i],
|
|
28
|
-
ko: [/모릅니다/i, /잘 모르겠습니다/i, /불확실합니다/i, /알 수 없음/i],
|
|
29
|
-
zh: [/我不知道/i, /我不确定/i, /不清楚/i, /未知/i],
|
|
30
|
-
"zh-TW": [/我不知道/i, /我不確定/i, /不清楚/i, /未知/i]
|
|
31
|
-
};
|
|
32
|
-
let earliestMatch = null;
|
|
33
|
-
for (const [language, patterns] of Object.entries(uncertaintyPatternsByLanguage)) {
|
|
34
|
-
for (const pattern of patterns) {
|
|
35
|
-
const match = response.match(pattern);
|
|
36
|
-
if (match && (earliestMatch === null || match.index < earliestMatch.index)) {
|
|
37
|
-
earliestMatch = { index: match.index, language };
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
return earliestMatch ? { uncertain: true, language: earliestMatch.language } : { uncertain: false, language: null };
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export { cn as c, isAnswerUncertain as i };
|
|
45
|
-
//# sourceMappingURL=utils.Cwtlq8dh.js.map
|