all repos

tyess @ 3e5d02242460a2d2359ff700bbbdd56c76483869

chess in typst
1 files changed, 29 insertions(+), 10 deletions(-)
make banners better looking
Author: Oleksandr Smirnov olexsmir@gmail.com
Committed at: 2026-07-05 22:28:00 +0300
Authored at: 2026-07-04 16:37:27 +0300
Change ID: xvwpxpynqvmzuwoznqssxtmxltrrmszv
Parent: 8691552
M game.typ
···
        167
        167
         #let render(state) = {

      
        168
        168
           let banner(body) = text(fill: rgb("#0a7e8c"), weight: "bold", size: 1.2em, body)

      
        169
        169
         

      
        170
        
        -  let out = ()

      
        171
        
        -  if state.at("checkmate", default: false)      { out.push(banner[Checkmate!]) }

      
        172
        
        -  else if state.at("stalemate", default: false) { out.push(banner[Stalemate!]) }

      
        173
        
        -  else {

      
        
        170
        +  let label = none

      
        
        171
        +  let label-fill = none

      
        
        172
        +  if state.at("checkmate", default: false) {

      
        
        173
        +    label = banner[Checkmate!]

      
        
        174
        +    label-fill = rgb("#0a7e8c").transparentize(75%)

      
        
        175
        +  } else if state.at("stalemate", default: false) {

      
        
        176
        +    label = banner[Stalemate!]

      
        
        177
        +    label-fill = rgb("#0a7e8c").transparentize(75%)

      
        
        178
        +  } else {

      
        174
        179
             let err = state.at("error", default: none)

      
        175
        
        -    if err != none                              { out.push(text(fill: red, weight: "bold", err)) }

      
        176
        
        -    else if is-in-check(state.grid, state.turn) { out.push(text(fill: yellow, weight: "bold")[Check!]) }

      
        
        180
        +    if err != none {

      
        
        181
        +      label = text(fill: red, weight: "bold", err)

      
        
        182
        +      label-fill = red.transparentize(75%)

      
        
        183
        +    } else if is-in-check(state.grid, state.turn) {

      
        
        184
        +      label = text(fill: yellow, weight: "bold")[Check!]

      
        
        185
        +      label-fill = yellow.transparentize(75%)

      
        
        186
        +    }

      
        177
        187
           }

      
        178
        
        -  out.push(v(0.3em))

      
        179
        
        -  out.push(render-board(state.grid))

      
        180
        
        -  out.join()

      
        
        188
        +

      
        
        189
        +  block(height: 1.8em, width: 100%, inset: 0pt, above: 0pt, below: 0pt,

      
        
        190
        +    align(center, {

      
        
        191
        +      if label != none { box(fill: label-fill, inset: 0.3em, label) }

      
        
        192
        +    }))

      
        
        193
        +  v(0.15em)

      
        
        194
        +  render-board(state.grid)

      
        181
        195
         }

      
        182
        196
         

      
        183
        197
         // Usage:

      ···
        185
        199
         //   g4 d5 Bg5 Bxg4 c4 c6 cxd5 cxd5 Qb3

      
        186
        200
         //

      
        187
        201
         #let chess(body) = {

      
        188
        
        -  set page(height: auto, width: auto, margin: (top: 0.5in, bottom: 0.5in, rest: 0.5in))

      
        
        202
        +  // Fixed page size: board (8 × 2.8em) + label area (1.8em) + spacing (0.15em) + margins

      
        
        203
        +  set page(

      
        
        204
        +    width: 22.4em + 1in,

      
        
        205
        +    height: 24.65em + 1in,

      
        
        206
        +    margin: 0.5in,

      
        
        207
        +  )

      
        189
        208
           let moves = parse-moves(body)

      
        190
        209
           let states = apply-moves(moves)

      
        191
        210
           render(states.last())