@neuronection/assistant-ui 0.23.0 → 0.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +75 -0
- package/README.md +9 -0
- package/dist/about.js +1 -1
- package/dist/ai-magic-fill.js +1 -1
- package/dist/chat-branch-tree.d.ts +45 -0
- package/dist/chat-branch-tree.js +3 -0
- package/dist/chat-branch-tree.js.map +1 -0
- package/dist/chat-composer.d.ts +50 -0
- package/dist/chat-composer.js +3 -0
- package/dist/chat-composer.js.map +1 -0
- package/dist/chat-core.d.ts +154 -0
- package/dist/chat-core.js +4 -0
- package/dist/chat-core.js.map +1 -0
- package/dist/chat-drawer.d.ts +32 -0
- package/dist/chat-drawer.js +3 -0
- package/dist/chat-drawer.js.map +1 -0
- package/dist/chat-launcher.d.ts +28 -0
- package/dist/chat-launcher.js +3 -0
- package/dist/chat-launcher.js.map +1 -0
- package/dist/chat-markdown.d.ts +64 -0
- package/dist/chat-markdown.js +3 -0
- package/dist/chat-markdown.js.map +1 -0
- package/dist/chat-message.d.ts +108 -0
- package/dist/chat-message.js +3 -0
- package/dist/chat-message.js.map +1 -0
- package/dist/chat-panel.d.ts +28 -0
- package/dist/chat-panel.js +3 -0
- package/dist/chat-panel.js.map +1 -0
- package/dist/chat-reasoning.d.ts +27 -0
- package/dist/chat-reasoning.js +3 -0
- package/dist/chat-reasoning.js.map +1 -0
- package/dist/chat-session-list.d.ts +51 -0
- package/dist/chat-session-list.js +3 -0
- package/dist/chat-session-list.js.map +1 -0
- package/dist/chat-tool-card.d.ts +37 -0
- package/dist/chat-tool-card.js +3 -0
- package/dist/chat-tool-card.js.map +1 -0
- package/dist/chat-transcript.d.ts +33 -0
- package/dist/chat-transcript.js +3 -0
- package/dist/chat-transcript.js.map +1 -0
- package/dist/{chunk-CZ2BL2ZL.js → chunk-3JJ2WCPN.js} +2 -2
- package/dist/{chunk-CZ2BL2ZL.js.map → chunk-3JJ2WCPN.js.map} +1 -1
- package/dist/chunk-5IOLDMDY.js +3 -0
- package/dist/chunk-5IOLDMDY.js.map +1 -0
- package/dist/{chunk-EODV6JK7.js → chunk-5QTHDB3D.js} +3 -3
- package/dist/{chunk-EODV6JK7.js.map → chunk-5QTHDB3D.js.map} +1 -1
- package/dist/chunk-6E6RRLKU.js +3 -0
- package/dist/chunk-6E6RRLKU.js.map +1 -0
- package/dist/chunk-6GNLY2EB.js +272 -0
- package/dist/chunk-6GNLY2EB.js.map +1 -0
- package/dist/chunk-743FJDRA.js +184 -0
- package/dist/chunk-743FJDRA.js.map +1 -0
- package/dist/chunk-BSIWLVDX.js +217 -0
- package/dist/chunk-BSIWLVDX.js.map +1 -0
- package/dist/chunk-BVJT67B5.js +134 -0
- package/dist/chunk-BVJT67B5.js.map +1 -0
- package/dist/chunk-DZBTJZZV.js +201 -0
- package/dist/chunk-DZBTJZZV.js.map +1 -0
- package/dist/chunk-HQIYSW2D.js +131 -0
- package/dist/chunk-HQIYSW2D.js.map +1 -0
- package/dist/chunk-JPDD5AFN.js +119 -0
- package/dist/chunk-JPDD5AFN.js.map +1 -0
- package/dist/chunk-LSCWBNG3.js +3 -0
- package/dist/chunk-LSCWBNG3.js.map +1 -0
- package/dist/chunk-NKYPNEOX.js +198 -0
- package/dist/chunk-NKYPNEOX.js.map +1 -0
- package/dist/{chunk-INMAUGBK.js → chunk-OH7AJ3WY.js} +3 -3
- package/dist/{chunk-INMAUGBK.js.map → chunk-OH7AJ3WY.js.map} +1 -1
- package/dist/chunk-PAQ6YQ7Y.js +3 -0
- package/dist/chunk-PAQ6YQ7Y.js.map +1 -0
- package/dist/chunk-QVDCFZSE.js +72 -0
- package/dist/chunk-QVDCFZSE.js.map +1 -0
- package/dist/chunk-RPLEI6LQ.js +102 -0
- package/dist/chunk-RPLEI6LQ.js.map +1 -0
- package/dist/chunk-S62VJVWB.js +36 -0
- package/dist/chunk-S62VJVWB.js.map +1 -0
- package/dist/chunk-X3C2FBMR.js +141 -0
- package/dist/chunk-X3C2FBMR.js.map +1 -0
- package/dist/{chunk-7YLR4AGA.js → chunk-XZWLTTHA.js} +2 -2
- package/dist/{chunk-7YLR4AGA.js.map → chunk-XZWLTTHA.js.map} +1 -1
- package/dist/chunk-Z4IBQ53C.js +75 -0
- package/dist/chunk-Z4IBQ53C.js.map +1 -0
- package/dist/{chunk-7KD4MG75.js → chunk-ZK2V2LPA.js} +3 -3
- package/dist/chunk-ZK2V2LPA.js.map +1 -0
- package/dist/copy-button.js +1 -1
- package/dist/fonts/KaTeX_AMS-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_AMS-Regular.woff +0 -0
- package/dist/fonts/KaTeX_AMS-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
- package/dist/fonts/KaTeX_Fraktur-Bold.woff +0 -0
- package/dist/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
- package/dist/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Fraktur-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Main-Bold.ttf +0 -0
- package/dist/fonts/KaTeX_Main-Bold.woff +0 -0
- package/dist/fonts/KaTeX_Main-Bold.woff2 +0 -0
- package/dist/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
- package/dist/fonts/KaTeX_Main-BoldItalic.woff +0 -0
- package/dist/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
- package/dist/fonts/KaTeX_Main-Italic.ttf +0 -0
- package/dist/fonts/KaTeX_Main-Italic.woff +0 -0
- package/dist/fonts/KaTeX_Main-Italic.woff2 +0 -0
- package/dist/fonts/KaTeX_Main-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Main-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Main-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
- package/dist/fonts/KaTeX_Math-BoldItalic.woff +0 -0
- package/dist/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
- package/dist/fonts/KaTeX_Math-Italic.ttf +0 -0
- package/dist/fonts/KaTeX_Math-Italic.woff +0 -0
- package/dist/fonts/KaTeX_Math-Italic.woff2 +0 -0
- package/dist/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
- package/dist/fonts/KaTeX_SansSerif-Bold.woff +0 -0
- package/dist/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
- package/dist/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
- package/dist/fonts/KaTeX_SansSerif-Italic.woff +0 -0
- package/dist/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
- package/dist/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_SansSerif-Regular.woff +0 -0
- package/dist/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Script-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Script-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Script-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Size1-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Size1-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Size1-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Size2-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Size2-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Size2-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Size3-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Size3-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Size3-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Size4-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Size4-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Size4-Regular.woff2 +0 -0
- package/dist/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
- package/dist/fonts/KaTeX_Typewriter-Regular.woff +0 -0
- package/dist/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +39 -26
- package/dist/index.js.map +1 -1
- package/dist/portal.js +1 -1
- package/dist/settings-shell.js +1 -1
- package/dist/styles.css +1 -1
- package/dist/tree-YaIz73vo.d.ts +54 -0
- package/dist/types-DZwzmyKE.d.ts +44 -0
- package/package.json +56 -2
- package/dist/chunk-7KD4MG75.js.map +0 -1
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
type ChatRole = 'user' | 'assistant' | 'system';
|
|
2
|
+
type ChatMessageStatus = 'streaming' | 'done' | 'error' | 'interrupted';
|
|
3
|
+
interface ChatError {
|
|
4
|
+
code: string;
|
|
5
|
+
message: string;
|
|
6
|
+
retryable: boolean;
|
|
7
|
+
}
|
|
8
|
+
interface ChatMessageVariants {
|
|
9
|
+
/** 1-based position of this message among its siblings. */
|
|
10
|
+
index: number;
|
|
11
|
+
count: number;
|
|
12
|
+
siblingIds: string[];
|
|
13
|
+
}
|
|
14
|
+
interface ChatAttachmentView {
|
|
15
|
+
id: string;
|
|
16
|
+
name: string;
|
|
17
|
+
kind: 'image' | 'file';
|
|
18
|
+
/** Resolvable URL for previews (blob:, data:, or app API path). */
|
|
19
|
+
url?: string;
|
|
20
|
+
meta?: Record<string, unknown>;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* The normalized message every chat renderer in the library speaks. Apps map
|
|
24
|
+
* their persisted rows onto this shape; unknown extras survive in `meta`.
|
|
25
|
+
*/
|
|
26
|
+
interface ChatMessageView {
|
|
27
|
+
id: string;
|
|
28
|
+
role: ChatRole;
|
|
29
|
+
/** Markdown body. */
|
|
30
|
+
content: string;
|
|
31
|
+
/** Thinking-mode text (family `delta kind="reasoning"` accumulation). */
|
|
32
|
+
reasoning?: string;
|
|
33
|
+
status: ChatMessageStatus;
|
|
34
|
+
error?: ChatError;
|
|
35
|
+
createdAt?: string | number;
|
|
36
|
+
/** Branch-tree linkage (family branching contract). */
|
|
37
|
+
parentId?: string | null;
|
|
38
|
+
variants?: ChatMessageVariants;
|
|
39
|
+
attachments?: ChatAttachmentView[];
|
|
40
|
+
/** App extension bag (trace refs, citations, chips…). */
|
|
41
|
+
meta?: Record<string, unknown>;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export type { ChatRole as C, ChatAttachmentView as a, ChatError as b, ChatMessageStatus as c, ChatMessageVariants as d, ChatMessageView as e };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@neuronection/assistant-ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.24.0",
|
|
4
4
|
"description": "Shared React component library for the Assistant family (career-, study-, health-assistant). Family look by default, app-flavored via CSS-variable tokens.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -50,6 +50,54 @@
|
|
|
50
50
|
"types": "./dist/card.d.ts",
|
|
51
51
|
"import": "./dist/card.js"
|
|
52
52
|
},
|
|
53
|
+
"./chat-core": {
|
|
54
|
+
"types": "./dist/chat-core.d.ts",
|
|
55
|
+
"import": "./dist/chat-core.js"
|
|
56
|
+
},
|
|
57
|
+
"./chat-launcher": {
|
|
58
|
+
"types": "./dist/chat-launcher.d.ts",
|
|
59
|
+
"import": "./dist/chat-launcher.js"
|
|
60
|
+
},
|
|
61
|
+
"./chat-composer": {
|
|
62
|
+
"types": "./dist/chat-composer.d.ts",
|
|
63
|
+
"import": "./dist/chat-composer.js"
|
|
64
|
+
},
|
|
65
|
+
"./chat-panel": {
|
|
66
|
+
"types": "./dist/chat-panel.d.ts",
|
|
67
|
+
"import": "./dist/chat-panel.js"
|
|
68
|
+
},
|
|
69
|
+
"./chat-transcript": {
|
|
70
|
+
"types": "./dist/chat-transcript.d.ts",
|
|
71
|
+
"import": "./dist/chat-transcript.js"
|
|
72
|
+
},
|
|
73
|
+
"./chat-message": {
|
|
74
|
+
"types": "./dist/chat-message.d.ts",
|
|
75
|
+
"import": "./dist/chat-message.js"
|
|
76
|
+
},
|
|
77
|
+
"./chat-branch-tree": {
|
|
78
|
+
"types": "./dist/chat-branch-tree.d.ts",
|
|
79
|
+
"import": "./dist/chat-branch-tree.js"
|
|
80
|
+
},
|
|
81
|
+
"./chat-drawer": {
|
|
82
|
+
"types": "./dist/chat-drawer.d.ts",
|
|
83
|
+
"import": "./dist/chat-drawer.js"
|
|
84
|
+
},
|
|
85
|
+
"./chat-markdown": {
|
|
86
|
+
"types": "./dist/chat-markdown.d.ts",
|
|
87
|
+
"import": "./dist/chat-markdown.js"
|
|
88
|
+
},
|
|
89
|
+
"./chat-reasoning": {
|
|
90
|
+
"types": "./dist/chat-reasoning.d.ts",
|
|
91
|
+
"import": "./dist/chat-reasoning.js"
|
|
92
|
+
},
|
|
93
|
+
"./chat-session-list": {
|
|
94
|
+
"types": "./dist/chat-session-list.d.ts",
|
|
95
|
+
"import": "./dist/chat-session-list.js"
|
|
96
|
+
},
|
|
97
|
+
"./chat-tool-card": {
|
|
98
|
+
"types": "./dist/chat-tool-card.d.ts",
|
|
99
|
+
"import": "./dist/chat-tool-card.js"
|
|
100
|
+
},
|
|
53
101
|
"./connection-test-row": {
|
|
54
102
|
"types": "./dist/connection-test-row.d.ts",
|
|
55
103
|
"import": "./dist/connection-test-row.js"
|
|
@@ -290,6 +338,12 @@
|
|
|
290
338
|
"class-variance-authority": "^0.7.1",
|
|
291
339
|
"clsx": "^2.1.1",
|
|
292
340
|
"date-fns": "^4.4.0",
|
|
341
|
+
"katex": "^0.16.47",
|
|
342
|
+
"mermaid": "^11.17.2",
|
|
343
|
+
"react-markdown": "^10.1.0",
|
|
344
|
+
"rehype-katex": "^7.0.1",
|
|
345
|
+
"remark-gfm": "^4.0.1",
|
|
346
|
+
"remark-math": "^6.0.0",
|
|
293
347
|
"tailwind-merge": "^3.6.0",
|
|
294
348
|
"tiptap-markdown": "^0.9.0"
|
|
295
349
|
},
|
|
@@ -335,7 +389,7 @@
|
|
|
335
389
|
"playground:build": "ladle build",
|
|
336
390
|
"build": "NODE_OPTIONS=--max-old-space-size=8192 pnpm build:ts && pnpm build:css",
|
|
337
391
|
"build:ts": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\" && tsup",
|
|
338
|
-
"build:css": "tailwindcss -i src/tokens/tokens.css -o dist/styles.css --minify && node scripts/unwrap-layers.mjs",
|
|
392
|
+
"build:css": "tailwindcss -i src/tokens/tokens.css -o dist/styles.css --minify && node scripts/unwrap-layers.mjs && node scripts/copy-katex-fonts.mjs",
|
|
339
393
|
"test": "vitest run",
|
|
340
394
|
"test:watch": "vitest",
|
|
341
395
|
"test:visual": "playwright test",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/settings-shell/SettingsShell.tsx"],"names":["SettingsShell"],"mappings":";;;;AAyBO,IAAM,aAAA,GAAsB,KAAA,CAAA,UAAA;AAAA,EACjC,SAASA,cAAAA,CACP,EAAE,GAAA,EAAK,MAAA,EAAQ,UAAA,EAAY,MAAA,EAAQ,QAAA,EAAU,SAAA,EAAW,YAAA,EAAc,SAAA,EAAU,EAChF,GAAA,EACA;AACA,IAAA,MAAM,aAAa,MAAA,EAAQ,IAAA;AAC3B,IAAA,uBACE,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAQ,gBAAA;AAAA,QACR,SAAA,EAAW,EAAA,CAAG,uCAAA,EAAyC,SAAS,CAAA;AAAA,QAEhE,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,eAAA;AAAA,cACV,YAAA,EAAW,mBAAA;AAAA,cACX,aAAA,EAAa,SAAA;AAAA,cAEb,QAAA,kBAAA,IAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAW,EAAA;AAAA,oBACT,gIAAA;AAAA,oBACA;AAAA,mBACF;AAAA,kBAEC,QAAA,EAAA;AAAA,oBAAA,MAAA,mBACC,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6EAAA,EACZ,QAAA,EAAA;AAAA,sBAAA,UAAA,mBACC,GAAA;AAAA,wBAAC,UAAA;AAAA,wBAAA;AAAA,0BACC,SAAA,EAAU,0CAAA;AAAA,0BACV,aAAA,EAAW;AAAA;AAAA,uBACb,GACE,IAAA;AAAA,sCACJ,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gDAAA,EACb,iBAAO,KAAA,EACV;AAAA,qBAAA,EACF,CAAA,GACE,IAAA;AAAA,oBACH,GAAA,CAAI,GAAA,CAAI,CAAC,EAAE,EAAA,EAAI,OAAO,WAAA,EAAa,IAAA,EAAM,IAAA,EAAM,QAAA,EAAS,KAAM;AAC7D,sBAAA,MAAM,WAAW,EAAA,KAAO,MAAA;AACxB,sBAAA,uBACE,IAAA;AAAA,wBAAC,QAAA;AAAA,wBAAA;AAAA,0BAEC,IAAA,EAAK,QAAA;AAAA,0BACL,cAAA,EAAc,WAAW,MAAA,GAAS,MAAA;AAAA,0BAClC,OAAA,EAAS,MAAM,UAAA,CAAW,EAAE,CAAA;AAAA,0BAC5B,SAAA,EAAW,EAAA;AAAA,4BACT,uNAAA;AAAA,4BACA,WACI,8FAAA,GACA;AAAA,2BACN;AAAA,0BAEC,QAAA,EAAA;AAAA,4BAAA,IAAA,mBACC,GAAA;AAAA,8BAAC,IAAA;AAAA,8BAAA;AAAA,gCACC,SAAA,EAAU,6BAAA;AAAA,gCACV,aAAA,EAAW;AAAA;AAAA,6BACb,GACE,IAAA;AAAA,4CACJ,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EACd,QAAA,EAAA;AAAA,8CAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAY,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,8BACjC,8BACC,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mDAAA,EACb,uBACH,CAAA,GACE;AAAA,6BAAA,EACN,CAAA;AAAA,4BACC,2BACC,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4CAAA,EACb,oBACH,CAAA,GACE;AAAA;AAAA,yBAAA;AAAA,wBA7BC;AAAA,uBA8BP;AAAA,oBAEJ,CAAC;AAAA;AAAA;AAAA;AACH;AAAA,WACF;AAAA,0BACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EAAyB,QAAA,EAAS;AAAA;AAAA;AAAA,KACnD;AAAA,EAEJ;AACF","file":"chunk-7KD4MG75.js","sourcesContent":["import * as React from 'react'\nimport type { LucideIcon } from 'lucide-react'\nimport { cn } from '../../lib/utils'\n\nexport interface SettingsNavItem {\n id: string\n label: string\n description?: string\n icon?: LucideIcon\n /** Optional trailing node (status dot, count, badge) at the row edge. */\n trailing?: React.ReactNode\n}\n\nexport interface SettingsShellProps {\n nav: SettingsNavItem[]\n active: string\n onNavigate: (id: string) => void\n header?: { icon?: LucideIcon; title: string }\n children: React.ReactNode\n className?: string\n navClassName?: string\n /** Test hook: data-testid for the `<nav>` element. */\n navTestId?: string\n}\n\nexport const SettingsShell = React.forwardRef<HTMLDivElement, SettingsShellProps>(\n function SettingsShell(\n { nav, active, onNavigate, header, children, className, navClassName, navTestId },\n ref,\n ) {\n const HeaderIcon = header?.icon\n return (\n <div\n ref={ref}\n data-as=\"settings-shell\"\n className={cn('grid grid-cols-1 gap-8 lg:grid-cols-4', className)}\n >\n <nav\n className=\"lg:col-span-1\"\n aria-label=\"Settings sections\"\n data-testid={navTestId}\n >\n <div\n className={cn(\n 'space-y-1 rounded-[var(--as-radius-lg)] border border-[var(--as-border)] bg-[var(--as-surface-raised)] p-3 lg:sticky lg:top-24',\n navClassName,\n )}\n >\n {header ? (\n <div className=\"mb-2 flex items-center gap-2.5 border-b border-[var(--as-border)] px-3 py-2\">\n {HeaderIcon ? (\n <HeaderIcon\n className=\"size-5 shrink-0 text-[var(--as-primary)]\"\n aria-hidden\n />\n ) : null}\n <span className=\"truncate text-sm font-bold text-[var(--as-fg)]\">\n {header.title}\n </span>\n </div>\n ) : null}\n {nav.map(({ id, label, description, icon: Icon, trailing }) => {\n const isActive = id === active\n return (\n <button\n key={id}\n type=\"button\"\n aria-current={isActive ? 'page' : undefined}\n onClick={() => onNavigate(id)}\n className={cn(\n 'flex w-full cursor-pointer items-start rounded-[var(--as-radius)] px-3 py-2.5 text-left text-sm transition-colors focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)]',\n isActive\n ? 'bg-[color-mix(in_srgb,var(--as-primary)_12%,transparent)] font-bold text-[var(--as-primary)]'\n : 'font-medium text-[var(--as-fg)] hover:bg-[var(--as-muted)]',\n )}\n >\n {Icon ? (\n <Icon\n className=\"mr-3 mt-0.5 size-4 shrink-0\"\n aria-hidden\n />\n ) : null}\n <span className=\"flex min-w-0 flex-col\">\n <span className=\"truncate\">{label}</span>\n {description ? (\n <span className=\"text-[11px] font-normal text-[var(--as-muted-fg)]\">\n {description}\n </span>\n ) : null}\n </span>\n {trailing ? (\n <span className=\"ml-auto flex items-center self-center pl-2\">\n {trailing}\n </span>\n ) : null}\n </button>\n )\n })}\n </div>\n </nav>\n <div className=\"min-w-0 lg:col-span-3\">{children}</div>\n </div>\n )\n },\n)\n"]}
|