@@ -24,12 +24,6 @@ const governanceResources = [
2424 "Read the formal scope, decision model, and operating rules for the Technical Steering Committee." ,
2525 href : TECHNICAL_CHARTER_URL ,
2626 } ,
27- {
28- title : "Meeting Calendar" ,
29- description :
30- "Join upcoming open TSC and project meetings and follow recurring governance discussions." ,
31- href : MEETING_CALENDAR_URL ,
32- } ,
3327 {
3428 title : "Governance Repository" ,
3529 description :
@@ -99,9 +93,8 @@ export default function TSCSection() {
9993 The Technical Steering Committee of Hiero
10094 </ h1 >
10195 < p className = "text-base sm:text-lg max-w-150 mx-auto" >
102- The Hiero Technical Steering Committee (TSC) guides technical
103- direction, stewarding open governance and cross-project alignment
104- for the ecosystem.
96+ The Hiero Technical Steering Committee (TSC) is the committee
97+ responsible for technical governance within the Hiero project.
10598 </ p >
10699 < div className = "mt-7 flex flex-wrap justify-center gap-3" >
107100 < a
@@ -133,16 +126,28 @@ export default function TSCSection() {
133126 < h2 id = "tsc-about-heading" className = "text-2xl sm:text-4xl mb-5" >
134127 About the TSC
135128 </ h2 >
136- < p className = "text-lg mb-4" >
137- The TSC oversees technical governance for Hiero, helps prioritize
138- architectural decisions, and coordinates implementation direction
139- across maintainers and working groups.
140- </ p >
141- < p className = "text-lg text-gray" >
142- Its role is to keep project evolution transparent, practical, and
143- aligned with open-source collaboration principles while preserving
144- quality, security, and long-term maintainability.
145- </ p >
129+ < div className = "space-y-4 text-lg text-gray" >
130+ < p >
131+ The Hiero Technical Steering Committee (TSC) is a committee of
132+ members who serve the project's technical governance.
133+ </ p >
134+ < p >
135+ The duties, goals, and rights of the TSC are defined in the{ " " }
136+ < a
137+ href = { TECHNICAL_CHARTER_URL }
138+ target = "_blank"
139+ rel = "noreferrer noopener"
140+ className = "text-red underline hover:text-red-dark focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-red-light focus-visible:ring-offset-2"
141+ aria-label = "Read the technical charter (opens in new tab)" >
142+ technical charter
143+ </ a > { " " }
144+ of the Hiero project.
145+ </ p >
146+ < p >
147+ This page provides an overview of the current committee members
148+ and links to the core governance resources used by the project.
149+ </ p >
150+ </ div >
146151 </ div >
147152 </ div >
148153 </ section >
@@ -154,7 +159,7 @@ export default function TSCSection() {
154159 Committee Members
155160 </ h2 >
156161 < p className = "text-lg max-w-205" >
157- The committee includes contributors from across the Hiero
162+ The committee is composed of contributors from across the Hiero
158163 ecosystem. Member bios reflect their current roles and ongoing
159164 work in open-source governance and technical delivery.
160165 </ p >
@@ -238,15 +243,15 @@ export default function TSCSection() {
238243 < h2
239244 id = "tsc-resources-heading"
240245 className = "text-2xl sm:text-4xl mb-5" >
241- Participation and Resources
246+ Governance Resources
242247 </ h2 >
243248 < p className = "text-lg" >
244- Follow governance activity, review source documents, and join open
245- meetings to participate in shaping Hiero technical direction .
249+ Review the charter and follow governance activity through the
250+ project's primary source materials .
246251 </ p >
247252 </ div >
248253
249- < div className = "grid grid-cols-1 md:grid-cols-3 gap-6 sm:gap-8" >
254+ < div className = "grid grid-cols-1 md:grid-cols-2 gap-6 sm:gap-8" >
250255 { governanceResources . map ( resource => (
251256 < a
252257 key = { resource . title }
@@ -337,9 +342,15 @@ export default function TSCSection() {
337342 </ a >
338343 ) : null }
339344
340- < p className = "mt-5 text-base sm:text-lg" >
341- { selectedMember . bio ?? "Biography not available." }
342- </ p >
345+ < div className = "mt-5 space-y-4 text-base text-gray sm:text-lg sm:leading-relaxed" >
346+ { getBioParagraphs (
347+ selectedMember . bio ?? "Biography not available." ,
348+ ) . map ( ( paragraph , index ) => (
349+ < p key = { `${ selectedMember . lastName } -${ index } ` } >
350+ { paragraph }
351+ </ p >
352+ ) ) }
353+ </ div >
343354 </ div >
344355 </ div >
345356 </ div >
@@ -359,6 +370,37 @@ function getBioPreview(bio: string, maxLength = 170): string {
359370 return `${ trimmedBio . slice ( 0 , maxLength ) } ...` ;
360371}
361372
373+ function getBioParagraphs ( bio : string ) : string [ ] {
374+ const trimmedBio = bio . trim ( ) ;
375+
376+ if ( ! trimmedBio ) {
377+ return [ ] ;
378+ }
379+
380+ const explicitParagraphs = trimmedBio
381+ . split ( / \n \s * \n / )
382+ . map ( paragraph => paragraph . trim ( ) )
383+ . filter ( Boolean ) ;
384+
385+ if ( explicitParagraphs . length > 1 ) {
386+ return explicitParagraphs ;
387+ }
388+
389+ const sentences = trimmedBio . split ( / (?< = [ . ! ? ] ) \s + / ) . filter ( Boolean ) ;
390+
391+ if ( sentences . length <= 2 ) {
392+ return [ trimmedBio ] ;
393+ }
394+
395+ const paragraphs : string [ ] = [ ] ;
396+
397+ for ( let index = 0 ; index < sentences . length ; index += 2 ) {
398+ paragraphs . push ( sentences . slice ( index , index + 2 ) . join ( " " ) ) ;
399+ }
400+
401+ return paragraphs ;
402+ }
403+
362404function getFocusableElements ( container : HTMLDivElement | null ) : HTMLElement [ ] {
363405 if ( ! container ) {
364406 return [ ] ;
0 commit comments