2929 line-height : 1.6 ;
3030 }
3131
32+ /* Font loading: show card backgrounds immediately, text after fonts load */
33+ .vertical-panel { color : transparent; transition : color 0.2s ; }
34+ .vertical-panel > * { opacity : 0 ; transition : opacity 0.2s ; }
35+ .playground-output > * { opacity : 0 ; transition : opacity 0.2s ; }
36+ .fonts-ready .vertical-panel { color : var (--color-text ); }
37+ .fonts-ready .vertical-panel > * { opacity : 1 ; }
38+ .fonts-ready .playground-output > * { opacity : 1 ; }
39+
3240 /* Hero */
3341 .hero {
3442 text-align : center;
185193 margin-top : 0.5rem ;
186194 }
187195
188- /* Vertical showcase */
189- .vertical-showcase {
196+ /* Vertical panels (shared by vertical showcase + budoux demo) */
197+ .panel-row {
190198 display : flex;
191199 gap : 2rem ;
192200 justify-content : center;
193201 }
194- .vertical -col {
202+ .panel -col {
195203 text-align : center;
196204 }
197- .vertical-col -label {
205+ .panel -label {
198206 font-family : monospace;
199207 font-size : 0.75rem ;
200208 color : var (--color-text-muted );
258266 color : var (--color-text-muted );
259267 }
260268
269+ /* BudouX code block */
270+ .budoux-code pre {
271+ background : var (--color-accent );
272+ color : # e0e0e0 ;
273+ padding : 1.25rem ;
274+ border-radius : 8px ;
275+ font-size : 0.85rem ;
276+ line-height : 1.6 ;
277+ overflow-x : auto;
278+ }
279+
261280 /* Footer */
262281 footer {
263282 text-align : center;
272291 }
273292 footer a : hover { border-color : var (--color-text ); }
274293
275- /* BudouX demo */
276- .budoux-demo {
277- display : flex;
278- gap : 2rem ;
279- justify-content : center;
280- margin-bottom : 1.5rem ;
281- }
282- .budoux-col { text-align : center; }
283- .budoux-label {
284- font-family : monospace;
285- font-size : 0.75rem ;
286- color : var (--color-text-muted );
287- text-transform : uppercase;
288- letter-spacing : 0.05em ;
289- margin-bottom : 0.75rem ;
290- }
291- .budoux-code pre {
292- background : var (--color-accent );
293- color : # e0e0e0 ;
294- padding : 1.25rem ;
295- border-radius : 8px ;
296- font-size : 0.85rem ;
297- line-height : 1.6 ;
298- overflow-x : auto;
299- }
300-
301294 @media (max-width : 768px ) {
302295 .hero { padding : 3rem 1.5rem 2rem ; }
303296 .hero h1 { font-size : 1.8rem ; }
304297 .container { padding : 0 1.5rem ; }
305298 .playground { grid-template-columns : 1fr ; }
306299 .mode-grid { grid-template-columns : 1fr 1fr ; }
307300 .usecases { grid-template-columns : 1fr ; }
308- .vertical-showcase { flex-wrap : wrap; }
309- .budoux-demo { flex-wrap : wrap; }
301+ .panel-row { flex-wrap : wrap; }
310302 }
311303 </ style >
312304 < script type ="module " src ="./dist/webcomponent.js "> </ script >
@@ -377,21 +369,21 @@ <h2>変換モード</h2>
377369 < section >
378370 < h2 > 縦書き表示</ h2 >
379371 < p class ="subtitle "> writing-mode: vertical-rl と組み合わせた実際の表示</ p >
380- < div class ="vertical-showcase ">
381- < div class ="vertical -col ">
382- < div class ="vertical-col -label "> tcy (縦中横)</ div >
372+ < div class ="panel-row ">
373+ < div class ="panel -col ">
374+ < div class ="panel -label "> tcy (縦中横)</ div >
383375 < div class ="vertical-panel ">
384376 < kandachi-ja tcy > 令和8年3月20日、第42回全国大会が開催される。参加費は12500円。参加者は1500人を超え、会場の収容人数3000人の半数に達した。</ kandachi-ja >
385377 </ div >
386378 </ div >
387- < div class ="vertical -col ">
388- < div class ="vertical-col -label "> standard</ div >
379+ < div class ="panel -col ">
380+ < div class ="panel -label "> standard</ div >
389381 < div class ="vertical-panel ">
390382 < kandachi-ja mode ="standard "> 令和8年3月20日、第42回全国大会が開催される。参加費は12500円。参加者は1500人を超え、会場の収容人数3000人の半数に達した。</ kandachi-ja >
391383 </ div >
392384 </ div >
393- < div class ="vertical -col ">
394- < div class ="vertical-col -label "> positional</ div >
385+ < div class ="panel -col ">
386+ < div class ="panel -label "> positional</ div >
395387 < div class ="vertical-panel ">
396388 < kandachi-ja mode ="positional "> 令和8年3月20日、第42回全国大会が開催される。参加費は12500円。参加者は1500人を超え、会場の収容人数3000人の半数に達した。</ kandachi-ja >
397389 </ div >
@@ -431,18 +423,22 @@ <h3>契約書・領収書</h3>
431423 </ div >
432424 </ section >
433425
434- <!-- budoux integration -->
426+ <!-- BudouX integration -->
435427 < section >
436428 < h2 > BudouX 連携</ h2 >
437429 < p class ="subtitle "> kandachi × < a href ="https://github.com/google/budoux " style ="color: var(--color-text); border-bottom: 1px solid var(--color-border); "> BudouX</ a > — 漢数字変換 + 自然な改行位置で、本格的な縦書きWebを実現</ p >
438- < div class ="budoux-demo ">
439- < div class ="budoux-col ">
440- < div class ="budoux-label "> kandachi only</ div >
441- < div class ="vertical-panel " id ="budoux-kandachi-only "> </ div >
430+ < div class ="panel-row " style ="margin-bottom: 1.5rem; ">
431+ < div class ="panel-col ">
432+ < div class ="panel-label "> kandachi only</ div >
433+ < div class ="vertical-panel ">
434+ < kandachi-ja tcy > 令和8年3月20日、第42回全国大会が開催される。参加費は12500円。参加者は1500人を超え、会場の収容人数3000人の半数に達した。</ kandachi-ja >
435+ </ div >
442436 </ div >
443- < div class ="budoux-col ">
444- < div class ="budoux-label "> kandachi + BudouX</ div >
445- < div class ="vertical-panel " id ="budoux-combined "> </ div >
437+ < div class ="panel-col ">
438+ < div class ="panel-label "> kandachi + BudouX</ div >
439+ < div class ="vertical-panel " id ="budoux-combined ">
440+ < kandachi-ja tcy > 令和8年3月20日、第42回全国大会が開催される。参加費は12500円。参加者は1500人を超え、会場の収容人数3000人の半数に達した。</ kandachi-ja >
441+ </ div >
446442 </ div >
447443 </ div >
448444 < div class ="budoux-code ">
@@ -466,6 +462,10 @@ <h2>BudouX 連携</h2>
466462 import { format } from './dist/index.js' ;
467463 import { toKanji } from './dist/index.js' ;
468464
465+ // Wait for fonts before rendering to prevent TCY layout shift
466+ await document . fonts . ready ;
467+ document . body . classList . add ( 'fonts-ready' ) ;
468+
469469 // Mode comparison
470470 document . getElementById ( 'mc-standard' ) . textContent = toKanji ( 12500 , 'standard' ) ;
471471 document . getElementById ( 'mc-positional' ) . textContent = toKanji ( 2026 , 'positional' ) ;
@@ -500,21 +500,16 @@ <h2>BudouX 連携</h2>
500500
501501 update ( ) ;
502502
503- // BudouX integration demo
504- const budouxText = '令和8年3月20日、第42回全国縦書き大会が開催される。参加費は12500円。参加者は1500人を超え、会場の収容人数3000人の半数に達した。' ;
505- const kandachiOnly = document . getElementById ( 'budoux-kandachi-only' ) ;
503+ // BudouX integration demo - upgrade right panel when loaded
504+ const budouxText = '令和8年3月20日、第42回全国大会が開催される。参加費は12500円。参加者は1500人を超え、会場の収容人数3000人の半数に達した。' ;
506505 const combined = document . getElementById ( 'budoux-combined' ) ;
507506
508- // kandachi only
509- kandachiOnly . innerHTML = `<kandachi-ja tcy>${ budouxText } </kandachi-ja>` ;
510-
511- // kandachi + budoux
512- import ( 'https://esm.sh/budoux' ) . then ( async ( mod ) => {
507+ import ( 'https://esm.sh/budoux' ) . then ( ( mod ) => {
513508 const parser = mod . loadDefaultJapaneseParser ( ) ;
514509 const converted = format ( budouxText , { tcy : true } ) ;
515510 combined . innerHTML = parser . translateHTMLString ( converted ) ;
516511 } ) . catch ( ( ) => {
517- combined . innerHTML = '<span style="font-size:0.85rem;color:var(--color-text-muted);">BudouX の読み込みに失敗しました</span>' ;
512+ // Keep kandachi-only output as fallback
518513 } ) ;
519514 </ script >
520515</ body >
0 commit comments