@brainfish-ai/components 0.19.3 → 0.19.5
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/convos.d.ts +4 -0
- package/dist/esm/chunks/{ChatSearch.C6nUXNy4.js → ChatSearch.DOH90EUx.js} +3 -306
- package/dist/esm/chunks/ChatSearch.DOH90EUx.js.map +1 -0
- package/dist/esm/chunks/blue.CNWYlAkf.js +17 -0
- package/dist/esm/chunks/blue.CNWYlAkf.js.map +1 -0
- package/dist/esm/chunks/{generating-star.CozjECmM.js → generating-star.BMQgTqs7.js} +13 -5
- package/dist/esm/chunks/{generating-star.CozjECmM.js.map → generating-star.BMQgTqs7.js.map} +1 -1
- package/dist/esm/chunks/hooks.B9tkXVNJ.js +309 -0
- package/dist/esm/chunks/hooks.B9tkXVNJ.js.map +1 -0
- package/dist/esm/colors.js +1 -15
- package/dist/esm/colors.js.map +1 -1
- package/dist/esm/components/chat-search.js +1 -1
- package/dist/esm/components/convos.js +14 -7
- package/dist/esm/components/convos.js.map +1 -1
- package/dist/esm/components/generating-star.js +1 -1
- package/dist/esm/components/metric-card.js +3 -1
- package/dist/esm/components/metric-card.js.map +1 -1
- package/dist/esm/components/sidebar.js +380 -0
- package/dist/esm/components/sidebar.js.map +1 -0
- package/dist/esm/components/ui/accordion.js +1 -1
- package/dist/esm/components/ui/accordion.js.map +1 -1
- package/dist/esm/convos.css +1 -1
- package/dist/esm/global.css +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/tailwind.preset.js +3 -1
- package/dist/esm/tailwind.preset.js.map +1 -1
- package/dist/generating-star.d.ts +1 -1
- package/dist/sidebar.d.ts +56 -0
- package/dist/stats.html +1 -1
- package/package.json +2 -1
- package/tailwind.preset.ts +2 -0
- package/dist/esm/chunks/ChatSearch.C6nUXNy4.js.map +0 -1
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { c as cn } from '../chunks/utils.Cwtlq8dh.js';
|
|
3
|
+
import { ArrowBendUpLeft, MagnifyingGlass, CaretRight, Dot, Circle, DotsThree, Plus, Article } from '@phosphor-icons/react';
|
|
4
|
+
import { Button } from './ui/button.js';
|
|
5
|
+
import { u as useDebounce } from '../chunks/hooks.B9tkXVNJ.js';
|
|
6
|
+
import { Input } from './ui/input.js';
|
|
7
|
+
import { Button as Button$1, useTreeData, useDragAndDrop, DropIndicator, Tree, TreeItem, TreeItemContent, Collection } from 'react-aria-components';
|
|
8
|
+
import { b as blue } from '../chunks/blue.CNWYlAkf.js';
|
|
9
|
+
import { d as dark } from '../chunks/dark.Cl9Z44CU.js';
|
|
10
|
+
import { ButtonGroup } from './ui/button-group.js';
|
|
11
|
+
|
|
12
|
+
const SidebarContext = React.createContext(null);
|
|
13
|
+
function SidebarProvider({
|
|
14
|
+
collapsed,
|
|
15
|
+
ItemLinkComponent: ItemLinkComponent2,
|
|
16
|
+
activeArticleId,
|
|
17
|
+
onSelectArticle,
|
|
18
|
+
onSearchArticles,
|
|
19
|
+
onAddArticle,
|
|
20
|
+
onMoveArticle,
|
|
21
|
+
children
|
|
22
|
+
}) {
|
|
23
|
+
const [isSearching, setIsSearching] = React.useState(false);
|
|
24
|
+
const handleSearchArticles = React.useCallback(
|
|
25
|
+
(value) => {
|
|
26
|
+
setIsSearching(value.trim() !== "");
|
|
27
|
+
onSearchArticles?.(value);
|
|
28
|
+
},
|
|
29
|
+
[onSearchArticles]
|
|
30
|
+
);
|
|
31
|
+
const contextValue = React.useMemo(
|
|
32
|
+
() => ({
|
|
33
|
+
collapsed,
|
|
34
|
+
ItemLinkComponent: ItemLinkComponent2,
|
|
35
|
+
activeArticleId,
|
|
36
|
+
onSearchArticles,
|
|
37
|
+
onSelectArticle,
|
|
38
|
+
onAddArticle,
|
|
39
|
+
onMoveArticle,
|
|
40
|
+
isSearching,
|
|
41
|
+
handleSearchArticles
|
|
42
|
+
}),
|
|
43
|
+
[
|
|
44
|
+
isSearching,
|
|
45
|
+
collapsed,
|
|
46
|
+
ItemLinkComponent2,
|
|
47
|
+
activeArticleId,
|
|
48
|
+
onSelectArticle,
|
|
49
|
+
onSearchArticles,
|
|
50
|
+
onAddArticle,
|
|
51
|
+
onMoveArticle,
|
|
52
|
+
handleSearchArticles
|
|
53
|
+
]
|
|
54
|
+
);
|
|
55
|
+
return /* @__PURE__ */ React.createElement(SidebarContext.Provider, { value: contextValue }, children);
|
|
56
|
+
}
|
|
57
|
+
function useSidebar() {
|
|
58
|
+
const sidebarContext = React.useContext(SidebarContext);
|
|
59
|
+
if (!sidebarContext) throw new Error("useSidebar must be used within SidebarProvider");
|
|
60
|
+
return sidebarContext;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function AppNav({ className, items, activeId, showBack, onBack }) {
|
|
64
|
+
const { collapsed, ItemLinkComponent } = useSidebar();
|
|
65
|
+
const hasBack = !!showBack && !!onBack;
|
|
66
|
+
return /* @__PURE__ */ React.createElement("nav", { className: cn("flex flex-col gap-2", className), "aria-label": "App navigation" }, hasBack && /* @__PURE__ */ React.createElement(
|
|
67
|
+
Button,
|
|
68
|
+
{
|
|
69
|
+
variant: "link",
|
|
70
|
+
className: cn("py-2 text-base text-default w-full", collapsed ? "justify-center" : "justify-start"),
|
|
71
|
+
size: "icon",
|
|
72
|
+
onClick: onBack
|
|
73
|
+
},
|
|
74
|
+
/* @__PURE__ */ React.createElement(ArrowBendUpLeft, { "aria-hidden": "true" }),
|
|
75
|
+
/* @__PURE__ */ React.createElement("span", { className: cn(collapsed && "sr-only") }, "back to Brainfish")
|
|
76
|
+
), items?.map((item) => /* @__PURE__ */ React.createElement(
|
|
77
|
+
ItemLinkComponent,
|
|
78
|
+
{
|
|
79
|
+
key: item.id,
|
|
80
|
+
className: cn(
|
|
81
|
+
"flex p-2 rounded-lg gap-1 text-base text-default items-center",
|
|
82
|
+
item.id === activeId ? "bg-primary font-bold" : "hover:bg-lime-100 focus:bg-lime-100"
|
|
83
|
+
),
|
|
84
|
+
href: item.href,
|
|
85
|
+
"data-sidebar-item-id": item.id,
|
|
86
|
+
"data-sidebar-item-type": "app",
|
|
87
|
+
"data-sidebar-app-nav-item-selected": item.id === activeId
|
|
88
|
+
},
|
|
89
|
+
item.Icon ? /* @__PURE__ */ React.createElement(item.Icon, { weight: item.id === activeId ? "fill" : "regular", size: 16 }) : null,
|
|
90
|
+
/* @__PURE__ */ React.createElement("span", { className: cn("transition-opacity duration-200", collapsed && "opacity-0 sr-only") }, item.label)
|
|
91
|
+
)));
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function ArticleSearch() {
|
|
95
|
+
const { handleSearchArticles } = useSidebar();
|
|
96
|
+
const [searchInteracted, setSearchInteracted] = React.useState(false);
|
|
97
|
+
const [searchValue, setSearchValue] = React.useState("");
|
|
98
|
+
const debouncedSearchValue = useDebounce(searchValue, 500);
|
|
99
|
+
React.useEffect(() => {
|
|
100
|
+
if (searchInteracted) handleSearchArticles?.(debouncedSearchValue);
|
|
101
|
+
}, [debouncedSearchValue, handleSearchArticles, searchInteracted]);
|
|
102
|
+
return /* @__PURE__ */ React.createElement(
|
|
103
|
+
Input,
|
|
104
|
+
{
|
|
105
|
+
className: "mb-2 h-auto text-subtlest border-border-subtle",
|
|
106
|
+
endIcon: MagnifyingGlass,
|
|
107
|
+
value: searchValue,
|
|
108
|
+
onChange: (e) => {
|
|
109
|
+
if (!searchInteracted) setSearchInteracted(true);
|
|
110
|
+
setSearchValue(e.target.value);
|
|
111
|
+
},
|
|
112
|
+
placeholder: "Find an article",
|
|
113
|
+
"aria-label": "Find an article"
|
|
114
|
+
}
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function ArticleItem({
|
|
119
|
+
item,
|
|
120
|
+
hasChildItems,
|
|
121
|
+
isSelected,
|
|
122
|
+
isExpanded,
|
|
123
|
+
ItemLinkComponent: ItemLinkComponent2,
|
|
124
|
+
onAddArticle
|
|
125
|
+
}) {
|
|
126
|
+
const handleArticleClick = (e) => {
|
|
127
|
+
e.stopPropagation();
|
|
128
|
+
onAddArticle(item.value.id);
|
|
129
|
+
};
|
|
130
|
+
return /* @__PURE__ */ React.createElement(
|
|
131
|
+
"div",
|
|
132
|
+
{
|
|
133
|
+
className: cn(
|
|
134
|
+
"group relative flex items-center gap-1 rounded-md p-1 pl-[calc(var(--tree-item-level)*0.5rem)]",
|
|
135
|
+
isSelected ? "bg-lime-100 font-bold before:absolute before:left-0 before:top-1/2 before:h-1/2 before:w-0.5 before:-translate-y-1/2 before:bg-lime-400" : "hover:bg-accent hover:text-accent-foreground"
|
|
136
|
+
)
|
|
137
|
+
},
|
|
138
|
+
hasChildItems ? /* @__PURE__ */ React.createElement(Button$1, { slot: "chevron", className: "relative z-30 flex p-0 h-auto w-auto [&_svg]:size-4" }, /* @__PURE__ */ React.createElement(CaretRight, { "aria-hidden": "true", className: cn("transition-transform", isExpanded && "rotate-90") })) : /* @__PURE__ */ React.createElement(Dot, { "aria-hidden": "true", weight: "bold", className: "scale-[2.5]" }),
|
|
139
|
+
/* @__PURE__ */ React.createElement(
|
|
140
|
+
ItemLinkComponent2,
|
|
141
|
+
{
|
|
142
|
+
href: item.value.href,
|
|
143
|
+
"data-sidebar-item-id": item.value.id,
|
|
144
|
+
"data-sidebar-item-type": "article",
|
|
145
|
+
className: "min-w-0 text-default text-sm truncate flex-1 after:absolute after:inset-0 after:z-10"
|
|
146
|
+
},
|
|
147
|
+
item.value.label
|
|
148
|
+
),
|
|
149
|
+
item.value.status && /* @__PURE__ */ React.createElement("div", { className: "ml-auto" }, item.value.status === "discovery" && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("span", { className: "sr-only" }, "Knowledge Discovery"), /* @__PURE__ */ React.createElement(Circle, { "aria-hidden": "true", fill: blue[600], weight: "fill", className: "size-2" })), item.value.status === "unpublished" && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("span", { className: "sr-only" }, "Unpublished Changes"), /* @__PURE__ */ React.createElement(Circle, { "aria-hidden": "true", fill: dark[600], weight: "bold", className: "size-2" }))),
|
|
150
|
+
/* @__PURE__ */ React.createElement(
|
|
151
|
+
ButtonGroup,
|
|
152
|
+
{
|
|
153
|
+
orientation: "horizontal",
|
|
154
|
+
className: cn(
|
|
155
|
+
"absolute right-0 top-0 bottom-0 z-20 hidden items-center rounded-xl",
|
|
156
|
+
"group-hover:flex group-focus-within:flex",
|
|
157
|
+
isSelected ? "bg-lime-100" : "bg-accent"
|
|
158
|
+
)
|
|
159
|
+
},
|
|
160
|
+
/* @__PURE__ */ React.createElement(
|
|
161
|
+
Button,
|
|
162
|
+
{
|
|
163
|
+
variant: "ghost",
|
|
164
|
+
size: "icon",
|
|
165
|
+
"aria-label": `More actions for ${item.value.label}`,
|
|
166
|
+
className: "size-4 [&_svg]:size-3.5"
|
|
167
|
+
},
|
|
168
|
+
/* @__PURE__ */ React.createElement(DotsThree, { "aria-hidden": "true", weight: "bold" })
|
|
169
|
+
),
|
|
170
|
+
/* @__PURE__ */ React.createElement(
|
|
171
|
+
Button,
|
|
172
|
+
{
|
|
173
|
+
variant: "ghost",
|
|
174
|
+
size: "icon",
|
|
175
|
+
"aria-label": `Add article to ${item.value.label}`,
|
|
176
|
+
className: "size-4 [&_svg]:size-3.5",
|
|
177
|
+
onClick: handleArticleClick
|
|
178
|
+
},
|
|
179
|
+
/* @__PURE__ */ React.createElement(Plus, { "aria-hidden": "true" })
|
|
180
|
+
)
|
|
181
|
+
)
|
|
182
|
+
);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
function getParentKeys(items, targetId, parents = []) {
|
|
186
|
+
for (const item of items) {
|
|
187
|
+
if (item.id === targetId) {
|
|
188
|
+
return parents;
|
|
189
|
+
}
|
|
190
|
+
if (item.items && item.items.length > 0) {
|
|
191
|
+
const result = getParentKeys(item.items, targetId, [...parents, item.id]);
|
|
192
|
+
if (result) return result;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
function ArticleTree({ articles }) {
|
|
198
|
+
const { ItemLinkComponent, activeArticleId, onSelectArticle, onMoveArticle, onAddArticle } = useSidebar();
|
|
199
|
+
const articlesTree = useTreeData({
|
|
200
|
+
initialItems: articles,
|
|
201
|
+
getKey: (articleItem) => articleItem.id,
|
|
202
|
+
getChildren: (articleItem) => articleItem.items ?? []
|
|
203
|
+
});
|
|
204
|
+
const { dragAndDropHooks } = useDragAndDrop({
|
|
205
|
+
getItems: (_keys, items) => items.map((item) => ({
|
|
206
|
+
"text/plain": item.value.label
|
|
207
|
+
})),
|
|
208
|
+
onMove: (e) => {
|
|
209
|
+
const movedArticleId = Array.from(e.keys)[0];
|
|
210
|
+
if (!movedArticleId) return;
|
|
211
|
+
const targetArticleId = articlesTree.getItem(e.target.key);
|
|
212
|
+
if (!targetArticleId) return;
|
|
213
|
+
let movedToParentId;
|
|
214
|
+
let movedToIndex;
|
|
215
|
+
if (e.target.dropPosition === "on") {
|
|
216
|
+
movedToParentId = e.target.key.toString();
|
|
217
|
+
movedToIndex = targetArticleId.children?.length ?? 0;
|
|
218
|
+
articlesTree.move(movedArticleId, movedToParentId, movedToIndex);
|
|
219
|
+
} else {
|
|
220
|
+
movedToParentId = targetArticleId.parentKey?.toString() ?? null;
|
|
221
|
+
const siblings = movedToParentId ? articlesTree.getItem(movedToParentId)?.children ?? [] : articlesTree.items;
|
|
222
|
+
const targetIndex = siblings.findIndex((i) => i.key === e.target.key);
|
|
223
|
+
movedToIndex = e.target.dropPosition === "before" ? targetIndex : targetIndex + 1;
|
|
224
|
+
if (e.target.dropPosition === "before") {
|
|
225
|
+
articlesTree.moveBefore(e.target.key, e.keys);
|
|
226
|
+
} else {
|
|
227
|
+
articlesTree.moveAfter(e.target.key, e.keys);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
onMoveArticle?.({
|
|
231
|
+
id: movedArticleId.toString(),
|
|
232
|
+
parentId: movedToParentId,
|
|
233
|
+
index: movedToIndex
|
|
234
|
+
});
|
|
235
|
+
},
|
|
236
|
+
renderDropIndicator: (target) => /* @__PURE__ */ React.createElement(
|
|
237
|
+
DropIndicator,
|
|
238
|
+
{
|
|
239
|
+
target,
|
|
240
|
+
className: "outline outline-1 outline-lime-200 ml-[calc(var(--tree-item-level)*0.5rem)]"
|
|
241
|
+
}
|
|
242
|
+
)
|
|
243
|
+
});
|
|
244
|
+
const initialExpandedKeys = React.useMemo(() => {
|
|
245
|
+
if (!activeArticleId || !articlesTree?.items) return /* @__PURE__ */ new Set();
|
|
246
|
+
const path = getParentKeys(
|
|
247
|
+
articlesTree.items.map((node) => node.value),
|
|
248
|
+
activeArticleId
|
|
249
|
+
);
|
|
250
|
+
return path ? new Set(path) : /* @__PURE__ */ new Set();
|
|
251
|
+
}, [articlesTree, activeArticleId]);
|
|
252
|
+
return /* @__PURE__ */ React.createElement(
|
|
253
|
+
Tree,
|
|
254
|
+
{
|
|
255
|
+
"aria-label": "Articles tree",
|
|
256
|
+
items: articlesTree.items,
|
|
257
|
+
dragAndDropHooks,
|
|
258
|
+
className: "flex flex-col gap-1",
|
|
259
|
+
selectionBehavior: "toggle",
|
|
260
|
+
selectionMode: "single",
|
|
261
|
+
defaultExpandedKeys: initialExpandedKeys,
|
|
262
|
+
defaultSelectedKeys: new Set(activeArticleId ? [activeArticleId] : []),
|
|
263
|
+
disallowEmptySelection: true,
|
|
264
|
+
onSelectionChange: (selection) => {
|
|
265
|
+
if (selection !== "all") {
|
|
266
|
+
const selected = Array.from(selection)?.[0];
|
|
267
|
+
selected && onSelectArticle?.(selected.toString());
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
},
|
|
271
|
+
function renderItem(item) {
|
|
272
|
+
return /* @__PURE__ */ React.createElement(TreeItem, { className: "list-none overflow-hidden", textValue: item.value.label, id: item.value.id }, /* @__PURE__ */ React.createElement(TreeItemContent, null, (props) => /* @__PURE__ */ React.createElement(
|
|
273
|
+
ArticleItem,
|
|
274
|
+
{
|
|
275
|
+
ItemLinkComponent,
|
|
276
|
+
item,
|
|
277
|
+
onAddArticle: (parentId) => onAddArticle?.(parentId),
|
|
278
|
+
...props
|
|
279
|
+
}
|
|
280
|
+
)), item.children && /* @__PURE__ */ React.createElement(Collection, { items: item.children }, renderItem));
|
|
281
|
+
}
|
|
282
|
+
);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
function ArticleNav({ articles, className }) {
|
|
286
|
+
const { isSearching, onAddArticle } = useSidebar();
|
|
287
|
+
return /* @__PURE__ */ React.createElement("div", { className: cn("flex flex-col gap-0.5 px-4", className) }, !isSearching && (!articles || articles.length === 0) ? /* @__PURE__ */ React.createElement(Button, { variant: "ghost", className: "text-subtlest", onClick: () => onAddArticle?.(null) }, /* @__PURE__ */ React.createElement(Article, { "aria-hidden": "true" }), "Create first article or folder") : /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(ArticleSearch, null), articles?.length ? /* @__PURE__ */ React.createElement("nav", { "aria-label": "Articles navigation", className: "max-h-[450px] overflow-y-auto" }, /* @__PURE__ */ React.createElement(ArticleTree, { articles })) : isSearching && articles?.length === 0 ? /* @__PURE__ */ React.createElement("span", null, "No articles found") : null));
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
function SectionNav({ className, items, activeId }) {
|
|
291
|
+
const { ItemLinkComponent } = useSidebar();
|
|
292
|
+
return /* @__PURE__ */ React.createElement("nav", { className: cn("flex flex-col", className), "aria-label": "App section navigation" }, items.map((item) => /* @__PURE__ */ React.createElement(
|
|
293
|
+
ItemLinkComponent,
|
|
294
|
+
{
|
|
295
|
+
key: item.id,
|
|
296
|
+
href: item.href,
|
|
297
|
+
"data-sidebar-item-id": item.id,
|
|
298
|
+
"data-sidebar-item-type": "section",
|
|
299
|
+
"data-sidebar-section-nav-item-selected": item.id === activeId,
|
|
300
|
+
className: cn(
|
|
301
|
+
"flex p-2 mx-4 text-base text-default relative rounded-lg",
|
|
302
|
+
"after:transition-opacity after:absolute after:top-0 after:bottom-0 after:-right-2 after:w-2 after:bg-primary after:rounded-l-md after:opacity-0",
|
|
303
|
+
"hover:bg-lime-100 focus:bg-lime-100",
|
|
304
|
+
item.id === activeId && "font-bold after:opacity-100"
|
|
305
|
+
)
|
|
306
|
+
},
|
|
307
|
+
item.label
|
|
308
|
+
)));
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
const Sidebar = React.forwardRef(function Sidebar2({
|
|
312
|
+
className,
|
|
313
|
+
ItemLinkComponent,
|
|
314
|
+
collapsed,
|
|
315
|
+
showAppBack,
|
|
316
|
+
onAppBack,
|
|
317
|
+
appNavItems,
|
|
318
|
+
appNavActiveId,
|
|
319
|
+
sectionNavItems,
|
|
320
|
+
sectionNavActiveId,
|
|
321
|
+
activeArticleId,
|
|
322
|
+
showArticles,
|
|
323
|
+
articles,
|
|
324
|
+
onSelectArticle,
|
|
325
|
+
onSearchArticles,
|
|
326
|
+
onAddArticle,
|
|
327
|
+
onMoveArticle,
|
|
328
|
+
...props
|
|
329
|
+
}, ref) {
|
|
330
|
+
return /* @__PURE__ */ React.createElement(
|
|
331
|
+
SidebarProvider,
|
|
332
|
+
{
|
|
333
|
+
collapsed: !!collapsed,
|
|
334
|
+
ItemLinkComponent,
|
|
335
|
+
activeArticleId,
|
|
336
|
+
onSelectArticle,
|
|
337
|
+
onSearchArticles,
|
|
338
|
+
onAddArticle,
|
|
339
|
+
onMoveArticle
|
|
340
|
+
},
|
|
341
|
+
/* @__PURE__ */ React.createElement(
|
|
342
|
+
"aside",
|
|
343
|
+
{
|
|
344
|
+
ref,
|
|
345
|
+
...props,
|
|
346
|
+
className: cn(
|
|
347
|
+
"py-4 transition-width duration-200 ease-in-out flex flex-col",
|
|
348
|
+
collapsed ? "w-[64px]" : "w-[260px]",
|
|
349
|
+
className
|
|
350
|
+
),
|
|
351
|
+
"aria-label": "Application navigation"
|
|
352
|
+
},
|
|
353
|
+
/* @__PURE__ */ React.createElement(
|
|
354
|
+
AppNav,
|
|
355
|
+
{
|
|
356
|
+
className: cn(
|
|
357
|
+
"px-4",
|
|
358
|
+
appNavItems && appNavItems.length > 0 && "pb-6",
|
|
359
|
+
!collapsed && "border-b border-border-subtle"
|
|
360
|
+
),
|
|
361
|
+
showBack: showAppBack,
|
|
362
|
+
items: appNavItems,
|
|
363
|
+
activeId: appNavActiveId,
|
|
364
|
+
onBack: onAppBack
|
|
365
|
+
}
|
|
366
|
+
),
|
|
367
|
+
!collapsed && /* @__PURE__ */ React.createElement(React.Fragment, null, showArticles && /* @__PURE__ */ React.createElement(ArticleNav, { className: "py-4", articles }), sectionNavItems && sectionNavItems.length > 0 && /* @__PURE__ */ React.createElement(
|
|
368
|
+
SectionNav,
|
|
369
|
+
{
|
|
370
|
+
className: cn("py-4", !collapsed && "border-t border-subtle"),
|
|
371
|
+
items: sectionNavItems,
|
|
372
|
+
activeId: sectionNavActiveId
|
|
373
|
+
}
|
|
374
|
+
))
|
|
375
|
+
)
|
|
376
|
+
);
|
|
377
|
+
});
|
|
378
|
+
|
|
379
|
+
export { Sidebar, useSidebar };
|
|
380
|
+
//# sourceMappingURL=sidebar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sidebar.js","sources":["../../../src/components/sidebar/context.tsx","../../../src/components/sidebar/app-nav/app-nav.tsx","../../../src/components/sidebar/article-nav/article-search.tsx","../../../src/components/sidebar/article-nav/article-item.tsx","../../../src/components/sidebar/article-nav/article-tree.tsx","../../../src/components/sidebar/article-nav/article-nav.tsx","../../../src/components/sidebar/section-nav/section-nav.tsx","../../../src/components/sidebar/sidebar.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { ItemLinkComponent } from './types';\n\nexport interface SidebarContextProps {\n collapsed: boolean;\n ItemLinkComponent: ItemLinkComponent;\n activeArticleId?: string;\n onSelectArticle?: (id: string) => void;\n onSearchArticles?: (value: string) => void;\n onAddArticle?: (parentId: string | null) => void;\n onMoveArticle?: (moved: { id: string; parentId: string | null; index: number }) => void;\n}\n\nexport interface SidebarContextValue extends SidebarContextProps {\n handleSearchArticles: (value: string) => void;\n isSearching: boolean;\n}\n\nconst SidebarContext = React.createContext<SidebarContextValue | null>(null);\n\nexport function SidebarProvider({\n collapsed,\n ItemLinkComponent,\n activeArticleId,\n onSelectArticle,\n onSearchArticles,\n onAddArticle,\n onMoveArticle,\n children,\n}: React.PropsWithChildren<SidebarContextProps>) {\n const [isSearching, setIsSearching] = React.useState<boolean>(false);\n\n const handleSearchArticles = React.useCallback(\n (value: string) => {\n setIsSearching(value.trim() !== '');\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 onAddArticle,\n onMoveArticle,\n isSearching,\n handleSearchArticles,\n }),\n [\n isSearching,\n collapsed,\n ItemLinkComponent,\n activeArticleId,\n onSelectArticle,\n onSearchArticles,\n onAddArticle,\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 { 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', 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 {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',\n item.id === activeId ? 'bg-primary font-bold' : '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')}>{item.label}</span>\n </ItemLinkComponent>\n ))}\n </nav>\n );\n}\n","import * as React from 'react';\nimport { MagnifyingGlass } from '@phosphor-icons/react';\n\nimport { useSidebar } from '../context';\n\nimport { useDebounce } from '@/lib/hooks';\nimport { Input } from '@/components/ui/input';\n\nexport function ArticleSearch() {\n const { handleSearchArticles } = useSidebar();\n const [searchInteracted, setSearchInteracted] = React.useState(false); // [!code ++]\n const [searchValue, setSearchValue] = React.useState<string>('');\n const debouncedSearchValue = useDebounce(searchValue, 500);\n\n React.useEffect(() => {\n if (searchInteracted) handleSearchArticles?.(debouncedSearchValue);\n }, [debouncedSearchValue, handleSearchArticles, searchInteracted]);\n\n return (\n <Input\n className=\"mb-2 h-auto text-subtlest border-border-subtle\"\n endIcon={MagnifyingGlass}\n value={searchValue}\n onChange={(e) => {\n if (!searchInteracted) setSearchInteracted(true);\n setSearchValue(e.target.value);\n }}\n placeholder=\"Find an article\"\n aria-label=\"Find an article\"\n />\n );\n}\n","import * as React from 'react';\nimport { CaretRight, Circle, Dot, DotsThree, Plus } from '@phosphor-icons/react';\nimport { Key, TreeItemContentRenderProps, Button as AriaButton } from 'react-aria-components';\n\nimport { ArticleNavItem, ItemLinkComponent } from '../types';\n\nimport { cn } from '@/lib/utils';\nimport { blue } from '@/colors/blue';\nimport { dark } from '@/colors/dark';\nimport { Button } from '@/components/ui/button';\nimport { ButtonGroup } from '@/components/ui/button-group';\n\ntype ArticleItemTreeNode = {\n key: Key;\n value: ArticleNavItem;\n children: ArticleItemTreeNode[] | null;\n};\n\nexport interface ArticleItemProps extends TreeItemContentRenderProps {\n ItemLinkComponent: ItemLinkComponent;\n item: ArticleItemTreeNode;\n onAddArticle: (parentId: string) => void;\n}\n\nexport function ArticleItem({\n item,\n hasChildItems,\n isSelected,\n isExpanded,\n ItemLinkComponent,\n onAddArticle,\n}: ArticleItemProps) {\n const handleArticleClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n onAddArticle(item.value.id);\n };\n\n return (\n <div\n className={cn(\n 'group relative flex items-center gap-1 rounded-md p-1 pl-[calc(var(--tree-item-level)*0.5rem)]',\n isSelected\n ? 'bg-lime-100 font-bold before:absolute before:left-0 before:top-1/2 before:h-1/2 before:w-0.5 before:-translate-y-1/2 before:bg-lime-400'\n : 'hover:bg-accent hover:text-accent-foreground',\n )}\n >\n {hasChildItems ? (\n <AriaButton slot=\"chevron\" className=\"relative z-30 flex p-0 h-auto w-auto [&_svg]:size-4\">\n <CaretRight aria-hidden=\"true\" className={cn('transition-transform', isExpanded && 'rotate-90')} />\n </AriaButton>\n ) : (\n <Dot aria-hidden=\"true\" weight=\"bold\" className=\"scale-[2.5]\" />\n )}\n\n <ItemLinkComponent\n href={item.value.href}\n data-sidebar-item-id={item.value.id}\n data-sidebar-item-type=\"article\"\n className=\"min-w-0 text-default text-sm truncate flex-1 after:absolute after:inset-0 after:z-10\"\n >\n {item.value.label}\n </ItemLinkComponent>\n\n {item.value.status && (\n <div className=\"ml-auto\">\n {item.value.status === 'discovery' && (\n <>\n <span className=\"sr-only\">Knowledge Discovery</span>\n <Circle aria-hidden=\"true\" fill={blue[600]} weight=\"fill\" className=\"size-2\" />\n </>\n )}\n {item.value.status === 'unpublished' && (\n <>\n <span className=\"sr-only\">Unpublished Changes</span>\n <Circle aria-hidden=\"true\" fill={dark[600]} weight=\"bold\" className=\"size-2\" />\n </>\n )}\n </div>\n )}\n\n <ButtonGroup\n orientation=\"horizontal\"\n className={cn(\n 'absolute right-0 top-0 bottom-0 z-20 hidden items-center rounded-xl',\n 'group-hover:flex group-focus-within:flex',\n isSelected ? 'bg-lime-100' : 'bg-accent',\n )}\n >\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 >\n <DotsThree aria-hidden=\"true\" weight=\"bold\" />\n </Button>\n\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={handleArticleClick}\n >\n <Plus aria-hidden=\"true\" />\n </Button>\n </ButtonGroup>\n </div>\n );\n}\n","import * as React from 'react';\nimport {\n useDragAndDrop,\n useTreeData,\n Tree,\n TreeItem,\n TreeItemContent,\n Collection,\n DropIndicator,\n} from 'react-aria-components';\n\nimport { ArticleNavItem } from '../types';\nimport { ArticleItem } from './article-item';\nimport { useSidebar } from '../context';\n\ninterface ArticleTreeProps {\n articles: ArticleNavItem[];\n}\n\nfunction 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\nexport function ArticleTree({ articles }: ArticleTreeProps) {\n const { ItemLinkComponent, activeArticleId, onSelectArticle, onMoveArticle, onAddArticle } = useSidebar();\n\n const articlesTree = useTreeData({\n initialItems: articles,\n getKey: (articleItem) => articleItem.id,\n getChildren: (articleItem) => articleItem.items ?? [],\n });\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 const movedArticleId = Array.from(e.keys)[0];\n if (!movedArticleId) return;\n\n const targetArticleId = articlesTree.getItem(e.target.key);\n if (!targetArticleId) 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 = targetArticleId.children?.length ?? 0;\n\n articlesTree.move(movedArticleId, movedToParentId, movedToIndex);\n } else {\n movedToParentId = targetArticleId.parentKey?.toString() ?? null;\n\n const siblings = movedToParentId ? articlesTree.getItem(movedToParentId)?.children ?? [] : articlesTree.items;\n\n const targetIndex = siblings.findIndex((i) => i.key === e.target.key);\n movedToIndex = e.target.dropPosition === 'before' ? targetIndex : targetIndex + 1;\n\n 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\n onMoveArticle?.({\n id: movedArticleId.toString(),\n parentId: movedToParentId,\n index: movedToIndex,\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 const initialExpandedKeys = React.useMemo(() => {\n if (!activeArticleId || !articlesTree?.items) return new Set<string>();\n\n const path = getParentKeys(\n articlesTree.items.map((node) => node.value),\n activeArticleId,\n );\n\n return path ? new Set(path) : new Set<string>();\n }, [articlesTree, activeArticleId]);\n\n return (\n <Tree\n aria-label=\"Articles tree\"\n items={articlesTree.items}\n dragAndDropHooks={dragAndDropHooks}\n className=\"flex flex-col gap-1\"\n selectionBehavior=\"toggle\"\n selectionMode=\"single\"\n defaultExpandedKeys={initialExpandedKeys}\n defaultSelectedKeys={new Set(activeArticleId ? [activeArticleId] : [])}\n disallowEmptySelection\n onSelectionChange={(selection) => {\n if (selection !== 'all') {\n const selected = Array.from(selection)?.[0];\n\n selected && onSelectArticle?.(selected.toString());\n }\n }}\n >\n {function renderItem(item) {\n return (\n <TreeItem className=\"list-none overflow-hidden\" textValue={item.value.label} id={item.value.id}>\n <TreeItemContent>\n {(props) => (\n <ArticleItem\n ItemLinkComponent={ItemLinkComponent}\n item={item}\n onAddArticle={(parentId) => onAddArticle?.(parentId)}\n {...props}\n />\n )}\n </TreeItemContent>\n\n {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';\n\nimport { useSidebar } from '../context';\nimport { ArticleNavItem } from '../types';\nimport { ArticleSearch } from './article-search';\nimport { ArticleTree } from './article-tree';\n\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/components/ui/button';\n\nexport interface ArticleNavProps {\n className?: string;\n articles?: ArticleNavItem[];\n}\n\nexport function ArticleNav({ articles, className }: ArticleNavProps) {\n const { isSearching, onAddArticle } = useSidebar();\n\n return (\n <div className={cn('flex flex-col gap-0.5 px-4', className)}>\n {!isSearching && (!articles || articles.length === 0) ? (\n <Button variant=\"ghost\" className=\"text-subtlest\" onClick={() => onAddArticle?.(null)}>\n <Article aria-hidden=\"true\" />\n Create first article or folder\n </Button>\n ) : (\n <>\n <ArticleSearch />\n {articles?.length ? (\n <nav aria-label=\"Articles navigation\" className=\"max-h-[450px] overflow-y-auto\">\n <ArticleTree articles={articles} />\n </nav>\n ) : isSearching && articles?.length === 0 ? (\n <span>No articles found</span>\n ) : null}\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-2 after:w-2 after:bg-primary after:rounded-l-md after:opacity-0',\n 'hover:bg-lime-100 focus:bg-lime-100',\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 { 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 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 sectionNavItems,\n sectionNavActiveId,\n activeArticleId,\n showArticles,\n articles,\n onSelectArticle,\n onSearchArticles,\n onAddArticle,\n onMoveArticle,\n ...props\n },\n ref,\n) {\n return (\n <SidebarProvider\n collapsed={!!collapsed}\n ItemLinkComponent={ItemLinkComponent}\n activeArticleId={activeArticleId}\n onSelectArticle={onSelectArticle}\n onSearchArticles={onSearchArticles}\n onAddArticle={onAddArticle}\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',\n collapsed ? 'w-[64px]' : 'w-[260px]',\n className,\n )}\n aria-label=\"Application navigation\"\n >\n <AppNav\n className={cn(\n 'px-4',\n appNavItems && appNavItems.length > 0 && 'pb-6',\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 && <ArticleNav className=\"py-4\" articles={articles} />}\n {sectionNavItems && sectionNavItems.length > 0 && (\n <SectionNav\n className={cn('py-4', !collapsed && 'border-t border-subtle')}\n items={sectionNavItems}\n activeId={sectionNavActiveId}\n />\n )}\n </>\n )}\n </aside>\n </SidebarProvider>\n );\n});\n"],"names":["ItemLinkComponent","AriaButton","Sidebar"],"mappings":"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"}
|
|
@@ -28,7 +28,7 @@ function AccordionTrigger({ className, children, ...props }) {
|
|
|
28
28
|
...props
|
|
29
29
|
},
|
|
30
30
|
children,
|
|
31
|
-
/* @__PURE__ */ React.createElement(CaretDown, { className: "text-muted-foreground
|
|
31
|
+
/* @__PURE__ */ React.createElement(CaretDown, { className: "text-muted-foreground size-4 shrink-0 translate-y-0.5 transition-transform duration-200 hover:bg-dark-300 hover:group-[&[data-state=open]]:bg-dark-200 rounded-sm group-hover:transition-colors hover:duration-300 hover:ease-in-out" })
|
|
32
32
|
));
|
|
33
33
|
}
|
|
34
34
|
function AccordionContent({ className, children, ...props }) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accordion.js","sources":["../../../../src/components/ui/accordion.tsx"],"sourcesContent":["import * as React from 'react';\nimport * as AccordionPrimitive from '@radix-ui/react-accordion';\nimport { CaretDown } from '@phosphor-icons/react';\n\nimport { cn } from '@/lib/utils';\n\nfunction Accordion({ ...props }: React.ComponentProps<typeof AccordionPrimitive.Root>) {\n return <AccordionPrimitive.Root data-slot=\"accordion\" {...props} />;\n}\n\nfunction AccordionItem({ className, ...props }: React.ComponentProps<typeof AccordionPrimitive.Item>) {\n return (\n <AccordionPrimitive.Item\n data-slot=\"accordion-item\"\n className={cn('border-b [&>h3]:my-0', className)}\n {...props}\n />\n );\n}\n\nfunction AccordionTrigger({ className, children, ...props }: React.ComponentProps<typeof AccordionPrimitive.Trigger>) {\n return (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n data-slot=\"accordion-trigger\"\n className={cn(\n 'focus-visible:border-ring focus-visible:ring-ring/50 flex flex-1 items-start justify-between gap-4 rounded-md py-4 text-left text-sm font-medium transition-all outline-none hover:no-underline focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&[data-state=open]>svg]:rotate-180 group',\n className,\n )}\n {...props}\n >\n {children}\n <CaretDown className=\"text-muted-foreground
|
|
1
|
+
{"version":3,"file":"accordion.js","sources":["../../../../src/components/ui/accordion.tsx"],"sourcesContent":["import * as React from 'react';\nimport * as AccordionPrimitive from '@radix-ui/react-accordion';\nimport { CaretDown } from '@phosphor-icons/react';\n\nimport { cn } from '@/lib/utils';\n\nfunction Accordion({ ...props }: React.ComponentProps<typeof AccordionPrimitive.Root>) {\n return <AccordionPrimitive.Root data-slot=\"accordion\" {...props} />;\n}\n\nfunction AccordionItem({ className, ...props }: React.ComponentProps<typeof AccordionPrimitive.Item>) {\n return (\n <AccordionPrimitive.Item\n data-slot=\"accordion-item\"\n className={cn('border-b [&>h3]:my-0', className)}\n {...props}\n />\n );\n}\n\nfunction AccordionTrigger({ className, children, ...props }: React.ComponentProps<typeof AccordionPrimitive.Trigger>) {\n return (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n data-slot=\"accordion-trigger\"\n className={cn(\n 'focus-visible:border-ring focus-visible:ring-ring/50 flex flex-1 items-start justify-between gap-4 rounded-md py-4 text-left text-sm font-medium transition-all outline-none hover:no-underline focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&[data-state=open]>svg]:rotate-180 group',\n className,\n )}\n {...props}\n >\n {children}\n <CaretDown className=\"text-muted-foreground size-4 shrink-0 translate-y-0.5 transition-transform duration-200 hover:bg-dark-300 hover:group-[&[data-state=open]]:bg-dark-200 rounded-sm group-hover:transition-colors hover:duration-300 hover:ease-in-out\" />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n );\n}\n\nfunction AccordionContent({ className, children, ...props }: React.ComponentProps<typeof AccordionPrimitive.Content>) {\n return (\n <AccordionPrimitive.Content\n data-slot=\"accordion-content\"\n className=\"data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down overflow-hidden text-sm\"\n {...props}\n >\n <div className={cn('pt-0 pb-4', className)}>{children}</div>\n </AccordionPrimitive.Content>\n );\n}\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent };\n"],"names":[],"mappings":";;;;;AAMA,SAAS,SAAA,CAAU,EAAE,GAAG,KAAA,EAAM,EAAyD;AACrF,EAAA,2CAAQ,kBAAA,CAAmB,IAAA,EAAnB,EAAwB,WAAA,EAAU,WAAA,EAAa,GAAG,KAAA,EAAO,CAAA;AACnE;AAEA,SAAS,aAAA,CAAc,EAAE,SAAA,EAAW,GAAG,OAAM,EAAyD;AACpG,EAAA,uBACE,KAAA,CAAA,aAAA;AAAA,IAAC,kBAAA,CAAmB,IAAA;AAAA,IAAnB;AAAA,MACC,WAAA,EAAU,gBAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,sBAAA,EAAwB,SAAS,CAAA;AAAA,MAC9C,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,iBAAiB,EAAE,SAAA,EAAW,QAAA,EAAU,GAAG,OAAM,EAA4D;AACpH,EAAA,uBACE,KAAA,CAAA,aAAA,CAAC,kBAAA,CAAmB,MAAA,EAAnB,EAA0B,WAAU,MAAA,EAAA,kBACnC,KAAA,CAAA,aAAA;AAAA,IAAC,kBAAA,CAAmB,OAAA;AAAA,IAAnB;AAAA,MACC,WAAA,EAAU,mBAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,qTAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA,KAAA;AAAA,IAEH,QAAA;AAAA,oBACD,KAAA,CAAA,aAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,sOAAA,EAAuO;AAAA,GAEhQ,CAAA;AAEJ;AAEA,SAAS,iBAAiB,EAAE,SAAA,EAAW,QAAA,EAAU,GAAG,OAAM,EAA4D;AACpH,EAAA,uBACE,KAAA,CAAA,aAAA;AAAA,IAAC,kBAAA,CAAmB,OAAA;AAAA,IAAnB;AAAA,MACC,WAAA,EAAU,mBAAA;AAAA,MACV,SAAA,EAAU,2GAAA;AAAA,MACT,GAAG;AAAA,KAAA;AAAA,wCAEH,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,WAAA,EAAa,SAAS,KAAI,QAAS;AAAA,GACxD;AAEJ;;;;"}
|
package/dist/esm/convos.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.before-line:before{position:absolute;top:-1rem;left:11px;display:block;height:.75rem;width:1px;background-color:var(--bfc-v2-color-mono-300, #E5E5E5);--tw-content: "";content:var(--tw-content)}.before-line--user:before{position:absolute;top:-1rem;left:11px;bottom:calc(50% + 18px);display:block;width:1px;background-color:var(--bfc-v2-color-mono-300, #E5E5E5);--tw-content: "";content:var(--tw-content)}.after-line:after{position:absolute;left:11px;bottom:-1rem;top:2.5rem;display:block;width:1px;background-color:var(--bfc-v2-color-mono-300, #E5E5E5);--tw-content: "";content:var(--tw-content)}.after-line:last-of-type:after{content:var(--tw-content);bottom:0}.after-line--user:not(:last-of-type):after{position:absolute;left:11px;bottom:-0px;top:calc(50% + 18px);display:block;width:1px;background-color:var(--bfc-v2-color-mono-300, #E5E5E5);--tw-content: "";content:var(--tw-content)}.after-line--user:not(:last-of-type):last-of-type:after{content:var(--tw-content);bottom:0}.message-item{position:relative;display:flex;flex-direction:row;gap:.5rem;padding:0}.message-header{display:flex;justify-content:space-between}.message-meta{display:flex;align-items:center;gap:.5rem}.message-timestamp{font-size:.75rem;line-height:1.5rem;color:var(--bfc-text-subtlest)}.message-timestamp-simple{font-size:.75rem;line-height:1rem;color:var(--bfc-text-subtlest)}.message-content-wrapper{padding-left:1.5rem;padding-right:1.5rem;font-size:1rem;line-height:1.5rem}.message-ai-content{position:relative;margin-left:1.75rem;gap:1.5rem;border-radius:.5rem;border-width:1px;border-color:var(--bfc-v2-color-mono-300, #E5E5E5);background-color:var(--bfc-white);padding-left:0;padding-right:0}.message-user-content{border-radius:.5rem;border-width:1px;border-color:var(--bfc-v2-color-mono-300, #E5E5E5);background-color:var(--bfc-v2-color-mono-100, #FAFAFA);padding:1.5rem;font-size:1rem;line-height:1.5rem}.message-article-link{display:flex;align-items:center;gap:.5rem}.message-article-link:focus-visible{outline:2px solid transparent;outline-offset:2px}.message-article-title{flex-grow:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.75rem;line-height:1rem}.message-article-list{list-style-type:none}.message-article-list>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.message-article-list{padding-left:1.5rem;padding-right:1.5rem}.message-feedback-text{font-size:.875rem;line-height:1.25rem;font-style:italic}[data-test-id=attributes-table],[data-test-id=attributes-table] thead,[data-test-id=attributes-table] tbody,[data-test-id=attributes-table] th,[data-test-id=attributes-table] tr{display:block}[data-test-id=attributes-table] td{display:flex;flex-direction:column;gap:.25rem}[data-test-id=attributes-table] thead tr{position:absolute;top:-9999px;left:-9999px}[data-test-id=attributes-table] tr:nth-child(2n){background-color:var(--bfc-v2-color-mono-200, #F5F5F5)}[data-test-id=attributes-table] td{border-bottom-width:1px;border-bottom-color:var(--bfc-v2-color-mono-300, #E5E5E5);position:relative;white-space:normal;text-align:left}[data-test-id=attributes-table] td:before{top:.5rem;left:.5rem;white-space:nowrap;padding-right:.5rem;text-align:left;font-weight:700}[data-test-id=attributes-table] td:before{content:attr(data-title)}
|
|
1
|
+
.before-line:before{position:absolute;top:-1rem;left:11px;display:block;height:.75rem;width:1px;background-color:var(--bfc-v2-color-mono-300, #E5E5E5);--tw-content: "";content:var(--tw-content)}.before-line--user:before{position:absolute;top:-1rem;left:11px;bottom:calc(50% + 18px);display:block;width:1px;background-color:var(--bfc-v2-color-mono-300, #E5E5E5);--tw-content: "";content:var(--tw-content)}.after-line:after{position:absolute;left:11px;bottom:-1rem;top:2.5rem;display:block;width:1px;background-color:var(--bfc-v2-color-mono-300, #E5E5E5);--tw-content: "";content:var(--tw-content)}.after-line:last-of-type:after{content:var(--tw-content);bottom:0}.after-line--user:not(:last-of-type):after{position:absolute;left:11px;bottom:-0px;top:calc(50% + 18px);display:block;width:1px;background-color:var(--bfc-v2-color-mono-300, #E5E5E5);--tw-content: "";content:var(--tw-content)}.after-line--user:not(:last-of-type):last-of-type:after{content:var(--tw-content);bottom:0}.message-item{position:relative;display:flex;flex-direction:row;gap:.5rem;padding:0}.message-header{display:flex;justify-content:space-between}.message-meta{display:flex;align-items:center;gap:.5rem}.message-timestamp{font-size:.75rem;line-height:1.5rem;color:var(--bfc-text-subtlest);font-weight:400}.message-timestamp-simple{font-size:.75rem;line-height:1rem;color:var(--bfc-text-subtlest);font-weight:400}.message-content-wrapper{padding-left:1.5rem;padding-right:1.5rem;font-size:1rem;line-height:1.5rem}.message-ai-content{position:relative;margin-left:1.75rem;gap:1.5rem;border-radius:.5rem;border-width:1px;border-color:var(--bfc-v2-color-mono-300, #E5E5E5);background-color:var(--bfc-white);padding-left:0;padding-right:0}.message-user-content{border-radius:.5rem;border-width:1px;border-color:var(--bfc-v2-color-mono-300, #E5E5E5);background-color:var(--bfc-v2-color-mono-100, #FAFAFA);padding:1.5rem;font-size:1rem;line-height:1.5rem}.message-article-link{display:flex;align-items:center;gap:.5rem}.message-article-link:focus-visible{outline:2px solid transparent;outline-offset:2px}.message-article-title{flex-grow:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.75rem;line-height:1rem}.message-article-list{list-style-type:none}.message-article-list>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.message-article-list{padding-left:1.5rem;padding-right:1.5rem}.message-feedback-text{font-size:.875rem;line-height:1.25rem;font-style:italic}[data-test-id=attributes-table],[data-test-id=attributes-table] thead,[data-test-id=attributes-table] tbody,[data-test-id=attributes-table] th,[data-test-id=attributes-table] tr{display:block}[data-test-id=attributes-table] td{display:flex;flex-direction:column;gap:.25rem}[data-test-id=attributes-table] thead tr{position:absolute;top:-9999px;left:-9999px}[data-test-id=attributes-table] tr:nth-child(2n){background-color:var(--bfc-v2-color-mono-200, #F5F5F5)}[data-test-id=attributes-table] td{border-bottom-width:1px;border-bottom-color:var(--bfc-v2-color-mono-300, #E5E5E5);position:relative;white-space:normal;text-align:left}[data-test-id=attributes-table] td:before{top:.5rem;left:.5rem;white-space:nowrap;padding-right:.5rem;text-align:left;font-weight:700}[data-test-id=attributes-table] td:before{content:attr(data-title)}
|