@@ -527,6 +527,7 @@ export default function App() {
527527 const [ editingGroupId , setEditingGroupId ] = useState < string | undefined > ( ) ;
528528 const [ groupFormInitial , setGroupFormInitial ] = useState < Record < string , string > | undefined > ( ) ;
529529 const [ managingMembersGroupId , setManagingMembersGroupId ] = useState < string | undefined > ( ) ;
530+ const [ explainerExpanded , setExplainerExpanded ] = useState ( false ) ;
530531
531532 const row = useRow ( 'resources' , currentUrl , store ?? undefined ) as ResourceRow | undefined ;
532533 const isContainer = row ?. type === 'Container' ;
@@ -706,20 +707,45 @@ export default function App() {
706707 </ div >
707708 </ div >
708709
709- { /* Agent hint: point coding agents to AGENTS.md */ }
710+ { /* Agent hint bar: AGENTS.md link + explainer CTA */ }
710711 < div style = { styles . agentHint } >
711- Using a coding agent? Point it to{ ' ' }
712- < a
713- href = "https://github.com/devalbo/tb-solid-pod/blob/main/AGENTS.md"
714- target = "_blank"
715- rel = "noopener noreferrer"
716- style = { styles . agentHintLink }
712+ < span >
713+ Using a coding agent? Point it to{ ' ' }
714+ < a
715+ href = "https://github.com/devalbo/tb-solid-pod/blob/main/AGENTS.md"
716+ target = "_blank"
717+ rel = "noopener noreferrer"
718+ style = { styles . agentHintLink }
719+ >
720+ AGENTS.md
721+ </ a >
722+ { ' ' } for project context.
723+ </ span >
724+ < button
725+ type = "button"
726+ style = { styles . agentHintCta }
727+ onClick = { ( ) => setExplainerExpanded ( ( e ) => ! e ) }
728+ aria-expanded = { explainerExpanded }
717729 >
718- AGENTS.md
719- </ a >
720- { ' ' } for project context.
730+ What the library showcases and why it helps app authors
731+ < span style = { styles . explainerChevron } > { explainerExpanded ? ' ▲' : ' ▼' } </ span >
732+ </ button >
721733 </ div >
722734
735+ { /* Explainer detail (when expanded) */ }
736+ { explainerExpanded && (
737+ < div style = { styles . explainer } >
738+ < div style = { styles . explainerDetail } >
739+ < p style = { styles . explainerLead } >
740+ < strong > What this demo showcases:</ strong > Personas (WebID-style profiles), contacts, groups, and a virtual file browser; a CLI (Terminal tab); JSON Schemas. Data lives in the browser (LocalStorage) with Export/Import.
741+ </ p >
742+ < p style = { styles . explainerWhy } >
743+ < strong > Why it helps:</ strong > If you’re building an app and want Solid-style data without running a pod server, you can use this as a library—install from GitHub, add a TinyBase store, and plug in the components and schemas. You get a ready-made data model (Zod + TypeScript + JSON Schema), so you can focus on your UI and optional sync later. See the < a href = "https://github.com/devalbo/tb-solid-pod/blob/main/README.md" target = "_blank" rel = "noopener noreferrer" style = { styles . explainerLink } > README</ a > and < a href = "https://github.com/devalbo/tb-solid-pod/blob/main/docs/INTEGRATION_GUIDE.md" target = "_blank" rel = "noopener noreferrer" style = { styles . explainerLink } > Integration Guide</ a > for details.
744+ </ p >
745+ </ div >
746+ </ div >
747+ ) }
748+
723749 { /* Data Browser View */ }
724750 { activeView === 'data' && (
725751 < div style = { styles . dataViewContainer } >
@@ -1052,8 +1078,15 @@ tryToJsonSchema(SomeZodSchema);`}</pre>
10521078const styles : Record < string , CSSProperties > = {
10531079 app : { fontFamily : '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif' , margin : 0 , padding : 0 , width : '100%' , minHeight : '100vh' , boxSizing : 'border-box' , background : '#f8f9fa' , display : 'flex' , flexDirection : 'column' } ,
10541080 topNav : { background : '#1e1e1e' , padding : '0 24px' , borderBottom : '1px solid #333' , display : 'flex' , justifyContent : 'space-between' , alignItems : 'center' } ,
1055- agentHint : { padding : '8px 24px' , background : '#f5e6d3' , color : '#6b5344' , fontSize : 13 , borderBottom : '1px solid #e8d4bc' } ,
1081+ agentHint : { width : '100%' , boxSizing : 'border-box' , padding : '8px 24px' , background : '#f5e6d3' , color : '#6b5344' , fontSize : 13 , borderBottom : '1px solid #e8d4bc' , display : 'flex' , flexWrap : 'wrap' , alignItems : 'center' , justifyContent : 'space-between' , gap : 12 } ,
10561082 agentHintLink : { color : '#c45c26' , textDecoration : 'none' , fontWeight : 500 } ,
1083+ agentHintCta : { padding : 0 , border : 'none' , background : 'none' , color : '#6b5344' , fontSize : 13 , cursor : 'pointer' , font : 'inherit' , textAlign : 'left' , textDecoration : 'underline' , textUnderlineOffset : 2 } ,
1084+ explainerChevron : { fontSize : 12 , color : '#888' } ,
1085+ explainer : { width : '100%' , boxSizing : 'border-box' , background : '#fff' , borderBottom : '1px solid #eee' , margin : 0 } ,
1086+ explainerDetail : { padding : '16px 24px 20px' , borderTop : '1px solid #e8d4bc' , maxWidth : 900 } ,
1087+ explainerLead : { margin : '12px 0 10px' , fontSize : 14 , lineHeight : 1.5 , color : '#333' } ,
1088+ explainerWhy : { margin : 0 , fontSize : 14 , lineHeight : 1.5 , color : '#444' } ,
1089+ explainerLink : { color : '#c45c26' , textDecoration : 'none' , fontWeight : 500 } ,
10571090 topNavTabs : { display : 'flex' , gap : 0 } ,
10581091 topNavActions : { display : 'flex' , gap : 8 , alignItems : 'center' } ,
10591092 navExportBtn : { padding : '6px 12px' , cursor : 'pointer' , borderRadius : 4 , border : '1px solid #444' , background : '#2a2a2a' , color : '#ccc' , fontSize : 12 , fontWeight : 500 } ,
0 commit comments