Files
MujicaUI/heading.go
T
ZacharyZhang-NY 0651debf9d Refactor: internal.RuleDiamond and internal.Frame ornaments
RuleDiamond draws the rule-diamond-rule of Heading, Dialog, Result, Card
titles and the ornament Divider; Frame draws the inset line with corner
diamonds of Card and decorated Dialog. Both snap the diamonds, and the
rule's diamond sits on the pixel-aligned line.

Snapshots: card (all densities, light and dark) moves the title rule's
diamond onto the rule's pixel row, an 8x8 region. Decorated dialog
(both densities, light and dark) loses the surface-colored halo under
each corner diamond, so the frame line now runs into the diamond as on
Card and the panel border is no longer notched at the corners.
Heading, Divider and Result render unchanged.
2026-10-05 13:44:59 -04:00

52 lines
1.3 KiB
Go

package mujica
import (
"github.com/egoist/mygo/ui"
"mujicaui/internal"
"mujicaui/theme"
)
// HeadingOptions configure a Heading; zero is level 1.
type HeadingOptions struct {
// Level is 1, 2 or 3; zero means 1.
Level int
// Subtitle shows below the title in muted text.
Subtitle string
// Divider draws an ornament rule with a center diamond below.
Divider bool
}
// Heading shows a serif title scaled with desktop text.
func Heading(c *ui.Context, title string, opts HeadingOptions) *ui.Element {
k := Tokens(c)
size := headingSize(opts.Level)
u := Density(c).Unit()
col := ui.Column(c).Gap(u).Shrink(0)
col.Children(func() {
ui.Text(c, title).Font(theme.SerifFont).FontSize(FontSize(c, size)).FontWeight(600).
LineHeight(1.25).TextColor(k.Text)
if opts.Subtitle != "" {
ui.Text(c, opts.Subtitle).FontSize(FontSize(c, theme.BodySize)).LineHeight(theme.LineHeight).TextColor(k.TextMuted)
}
if opts.Divider {
ui.Box(c).FillWidth().Height(9).Margin(u, 0, 0, 0).Draw(func(p *ui.Painter, r ui.Rect) {
internal.RuleDiamond(p, r, 6, 7, k.Ornament)
})
}
})
return col
}
func headingSize(level int) float32 {
switch level {
case 0, 1:
return theme.H1Size
case 2:
return theme.H2Size
case 3:
return theme.H3Size
}
panic("mujica: Heading Level must be 1, 2 or 3")
}