Baltimore Classical Guitar Society · Design system v2.0
A light system that keeps the concert hall inside the photograph.
This replaces the dark v1.0. The page, every reading surface, and every screen that touches money are warm off-white. Darkness is a material used only inside photographic containers, where it does the work it was always doing: making the stage feel like a stage.
Every text-on-background pairing below carries its measured contrast ratio, computed from the token hex values with the WCAG 2.1 relative-luminance formula. Body copy is held to 7:1, not 4.5:1.
Hard constraints
01Warm off-white, never #FFFFFF
02Body 19px / 1.65, 7:1 minimum
03No grey-on-grey secondary text
0456px ticketing & checkout targets
05Wordmark is a swappable slot
I.
The four page archetypes
Every other page on bcgs.org is a variation of one of these four, so they carry the review. Each is shown at full width in the tokens defined further down; nothing here is drawn outside the system.
PAGE 01
Homepage
The only dark blocks on the page are the hero plate and the footer. Season cards, prices and calls to action all sit on warm off-white.
The 2026–27 season is on sale. Members save 15% on every ticket.Join or renew
Parents write a lullaby. A guitarist helps them finish it.
Since 2019 BCGS has run the Carnegie Hall Lullaby Project across Baltimore with expectant and new parents, pairing each family with a teaching artist. Every session ends with a recording the family keeps.
The commercial heart. The ticket panel never sits on a dark ground and never sits over a photograph. Steppers and the add-to-cart control are 56px and 60px tall.
Bach, Barrios, Tárrega, and the Baltimore premiere of a new work written for her by Gulli Björnsson.
Meng Su at the Kennedy Center, 2024. Photograph by Tianjiao Wang. Captions sit on the light surface below the plate, never over the image.
Programme
Suite BWV 997J. S. Bach
Recuerdos de la AlhambraFrancisco Tárrega
Hlíð (premiere)Gulli Björnsson
La CatedralAgustín Barrios
About the artist
Meng Su was born in Qingdao and came to Baltimore to study with Manuel Barrueco at the Peabody Conservatory, where she now teaches. She has won the Vienna Youth Guitar Competition, the Christopher Parkening International Competition, and, with Yameng Wang as the Beijing Guitar Duo, a Grammy nomination alongside her teacher.
This is her fourth appearance on the BCGS series and her first solo programme here since 2019.
Getting there, and getting in
Venue
UMBC Concert Hall 1000 Hilltop Circle, Baltimore MD 21250
Parking
Free in Lot 8, a four-minute level walk. Accessible spaces at the hall entrance.
Access
Step-free throughout. Hearing loop in rows A–F. Call the box office and we will hold a seat.
Sat 17 Oct 2026
7:30 pm · UMBC Concert Hall
Reserved seating by section
MSigned in as a Sustaining member. 15% off is applied below.
A mixed cart: two concerts, a membership and a restricted gift. No photography, no dark ground, no decoration. Switch to the confirmation state in Tweaks.
!This address is missing its domain. Tickets cannot be delivered without it.
Your tickets arrive here within a minute of ordering.
Payment
Processed by Stripe. We never see your card.
By ordering you agree to the exchange policy. Membership benefits are intangible, so {{ deductibleText }} of this order is tax-deductible; the itemised split appears on your receipt.
Order summary
Tickets{{ ticketsSubText }}
Member discount, 15%{{ discountText }}
Membership and gifts{{ giftsSubText }}
Total{{ totalText }}
Tax-deductible portion{{ deductibleText }}
✓
You are going. Order 2026-1174.
A receipt and your tickets are on the way to asgerdur@bcgs.org. Print them or show them on your phone; either works at the door.
What you bought
{{ totalText }}
{{ line.title }} × {{ line.qty }}
{{ line.meta }}
{{ line.totalText }}
Tax-deductible portion of this order{{ deductibleText }}
Two things before October
Student tickets are held at will-call. Bring a student ID; we cannot release them in advance.
Your Sustaining membership starts on 1 September and renews each season. You can cancel it in one click from your account, the same way you started it.
PAGE 04
Lullaby Project
The programme archetype: a page that grows every season. Photography for this programme has not been cleared yet, so the plates show the empty-slot state.
Expectant and new parents in Baltimore write a lullaby for their child. A teaching artist sits with them, helps finish it, and records it. The family keeps the song.
Photo slot · 4:3Session at Mercy Medical Center. Needs a signed release from every parent in frame before it ships.
What actually happens in a session
A parent arrives with nothing prepared. Over two hours they talk with a teaching artist about the child they are expecting or have just met, and out of that conversation comes a set of words. The artist finds a melody underneath them, plays it back, changes it until the parent recognises it as theirs.
A second session records it, sometimes with the parent singing and sometimes not. Both versions go home. Nothing is published without written permission, and many families choose to keep the song private, which is a perfectly good outcome.
BCGS runs the project under licence from Carnegie Hall's Weill Music Institute, which originated it in 2011. We work with six partner sites across the city and the programme is free to every family.
Songs the families released
14 of 41 from the 2025–26 season
Sleep Now, Little River
Written by Dana W. with Nathan Chandler · Mercy Medical Center
2:41
Every Small Thing
Written by Tenika B. with Adrienne Park · Baltimore Healthy Start
3:08
Morning Comes Anyway
Written by Rosalie M. with Nathan Chandler · House of Ruth Maryland
2:15
Photo slot · 3:2Session, spring 2026
Photo slot · 3:2Recording day, Bayview
Photo slot · 3:2Teaching artists, 2026
$180 covers one family, start to finish
Two sessions with a teaching artist, studio time, and the recording the family takes home. Gifts made here are restricted to the Lullaby Project fund and are fully tax-deductible.
Ratios below were computed from these hex values with the WCAG 2.1 relative-luminance formula, against the surface each colour is actually permitted on. Where a pairing falls short it is marked and restricted, not quietly published.
I.
Colour
Two families. A warm off-white ramp that carries all reading and all commerce, and a stage-ink ramp that exists only inside photographic containers, the hero plate, and the footer.
Surfaces
surface-page
#FAF7F1
Default ground. Never #FFFFFF.
surface-raised
#FFFDF8
Cards, panels, headers.
surface-sunken
#F1EAE0
Totals rows, wells, this page.
surface-brass
#F3EAD6
Notices, member strips, bands.
stage-ink
#16120D
Photo plates, hero, footer only.
stage-ink-soft
#241C14
Inset fields inside stage blocks.
Text on light surfaces
Every cell is the real token on the real surface. The floor for running copy is 7:1; the two cells that fall under it are marked and the token is restricted from those surfaces.
Text token
on page
on raised
on sunken
on brass
text-primary
#1F1912 · body, headings
Six concerts
16.28:1
Six concerts
17.13:1
Six concerts
14.58:1
Six concerts
14.55:1
text-secondary
#4A3F32 · supporting copy
Six concerts
9.59:1
Six concerts
10.09:1
Six concerts
8.59:1
Six concerts
8.57:1
text-meta
#5C5044 · dates, captions
Six concerts
7.31:1
Six concerts
7.69:1
Six concerts
6.55:1 · not allowed
Six concerts
6.53:1 · not allowed
text-link
#5E4514 · links, eyebrows
Six concerts
8.40:1
Six concerts
8.84:1
Six concerts
7.52:1
Six concerts
7.51:1
Rule. text-meta is permitted on surface-page and surface-raised only. On sunken and brass grounds it drops below 7:1, so metadata there uses text-secondary at 8.59:1 — which is why the totals rows and member strips in the page examples above are set in #4A3F32, not #5C5044.
Text on stage ink
stage-text · #FBF7EF
Headings and body inside plates.
17.45:1 on stage-ink
stage-text-soft · #DCD2C0
Secondary copy. Still 12:1, so it is not grey-on-grey.
12.45:1 on stage-ink
brass-500 · #C9A96E
Eyebrows, rules, dates. Dark grounds only.
8.33:1 on stage-ink
Brand and functional colour
Brass is the brand. Red is only ever failure, so the primary action can never be mistaken for a warning. Each swatch states what it may and may not be used for.
hall-red · #990000
8.77:1 with #FFFDF8 text8.34:1 as text on page
Carried over from v1.0 unchanged, and it survives the move to light untouched. The primary action, once per view. Hover #7A0000, active #5E0000.
brass-500 · #C9A96E
8.26:1 with #17130E text2.10:1 as text on page · never
A fill and a rule, never a letterform on light. Reserved for giving, and for the six-string rule on ink.
brass-800 · #5E4514
8.84:1 with #FFFDF8 text8.40:1 as text on page
Primary button fill, link text, focus ring. The one colour that means "act".
brass-600 · #8A6C36
4.59:1 as text on page
Prohibited for body copy. Rules, icons, borders, and text at 24px or above only.
error · #9B1C1C
7.62:1 as text on page8.02:1 with #FFFDF8 text
Field errors, removal, sold-out. Red as text or edge is always a warning; red as a fill is always the primary action. The two never take the same shape, so the hue can carry the institution’s voice without ambiguity.
success · #1F5C3D
7.39:1 as text on page
Money saved, order placed, deductible amounts. Also the "secure checkout" mark.
info · #1D4E6B
8.34:1 as text on page
Policy notes, will-call instructions, seat-hold timers. The only cool colour in the system.
border-control · #8F7F66
3.64:1 against page · WCAG 1.4.11
Every input, stepper and secondary button edge. Separators (#E4DACA) are decorative and carry no meaning.
Prohibitions
✕No pure white (#FFFFFF) as a page or card ground. It glares under the fluorescent lighting most of our audience reads in.
✕No dark ground behind running copy, prices, forms, or any step of checkout. Stage ink is for photographs, the hero, and the footer.
✕No red fill that is not a primary action, and no brass fill that is not a gift. A filled control names its own consequence before the label is read.
✕No new grey. There is no neutral grey in this system; every "muted" colour is a warm brown that stands on its own at 7:1 or better.
✕No colour as the sole carrier of meaning. Discounts, errors and sold-out states each say so in words.
II.
Typography
Libre Caslon Text for anything that names something — the organisation, a concert, an artist, a section. Libre Franklin for everything a reader has to work through. Body is 19px at 1.65, one step above the 18px floor, because that is where the paragraph spacing stops feeling tight.
Display and headings
Aa Bb Cc
Libre Caslon Text · 400, 400 italic, 700
A text-weight Caslon, not a display cut. It holds up at 26px on a concert card and does not thin out at 54px in a hero.
Body and interface
Aa Bb Cc
Libre Franklin · 400, 500, 600, 700
Large x-height and open apertures, which is what keeps 19px readable for eyes that no longer accommodate quickly.
Token
Size / leading
Specimen
display-1
54 / 1.06 / −0.015em Caslon 400
Meng Su
display-2
38 / 1.12 Caslon 400
You are going.
heading-1
32 / 1.18 Caslon 400
What happens in a session
heading-2
25 / 1.2 Caslon 400
Order summary
heading-3
19 / 1.35 Franklin 600
Orchestra, rows A–M
body-lead
21 / 1.55 Franklin 400
Bach, Barrios, and a Baltimore premiere.
body · default
19 / 1.65 Franklin 400 · 20px below
A parent arrives with nothing prepared. Over two hours they talk with a teaching artist, and out of that conversation comes a set of words.
body-small
17 / 1.55 Franklin 400
Captions, help text, venue lines. The floor for anything written as a sentence.
eyebrow
12 / 1 / 0.22em Franklin 700 caps
2026–27 Season
Typesetting rules
·Measure caps at 68 characters for body, 52 for lead. Long lines are the other half of the legibility problem.
·Paragraph spacing is 20px, slightly more than one line. Never rely on indents.
·17px is the absolute floor for anything phrased as a sentence. Below it: single-word labels, table headers, and the eyebrow only.
·No italic body copy and no all-caps sentences. Caps are for the eyebrow, at 12px with 0.22em tracking, and nowhere else.
·Prices and totals are Franklin 600, not Caslon, except the one grand total on the order summary, which is Caslon 30px because it should feel like the end of the sentence.
III.
Spacing, radius, elevation
A 4px base. Anything under 16px is spacing inside a component; 24px and above separates components. The scale is deliberately loose at the top — an older reader benefits more from air between blocks than from a tighter grid.
space-14pxIcon to label
space-28pxLabel to field
space-312pxButton to button
space-416pxField to field in a row
space-520pxParagraph to paragraph
space-626pxCard padding
space-740pxBetween cards
space-864pxSection padding
space-996pxHero padding, desktop
Radius
5px
6px
8px
pill
5px inputs, 6px buttons and controls, 8px cards and photo plates, pill for counts and status marks only. Nothing softer — this is a 39-year-old institution, not an app.
Elevation
flat
raised
overlay
Shadows are warm-tinted (rgba of #1F1912) and never the only cue: every raised surface also changes colour or gains a border.
IV.
The six-string rule
Six brass hairlines of graduated weight, thinnest at the top: the six courses of a classical guitar, from the high E down to the low. It replaces every generic divider in the system. Height is fixed at 21px; only the width changes. The geometry is unchanged from v1.0 — the string positions and thicknesses are identical — and only the weights are re-tuned so the courses hold on a warm off-white ground the way they held on ink.
Rule, horizontal — on light
46px beside an eyebrow, 96px under a section label, full width as a section break. Weights run 0.38 → 1.0 of #8A6C36, closing on solid #6E5219.
Rule, horizontal — on stage ink
Unchanged from v1.0: weights 0.28 → 1.0 of #C9A96E. Inside a stage plate the original values are correct as drawn.
Rule, vertical
Rotated, it becomes the leading edge of a quote, a featured card, or a notice. The sixth string sits closest to the content it holds. This is the only decorative left edge the system permits — no plain accent bars.
Masthead strings
Descending 40px courses fading from the top edge of any stage plate. Under 4 percent opacity at the point of fade, so they never compete with the photograph beneath.
VII.Fret markers number sections, doors, and form steps.
Where it does not go
✕Never inside a form, a cart line, or a total. Commerce is unornamented.
✕Never more than once per screenful. It is a signature, not a texture.
✕Never scaled. 21px tall, always; a stretched rule stops reading as strings.
✕Never load-bearing. It is aria-hidden everywhere and carries no meaning a reader needs.
III.
Components
Hover and active states are shown as static replicas so they can be reviewed on paper. The live controls in the page examples above use the same values.
V.
Buttons
Hall red fills the primary action and appears once per view, including navigational primaries. Brass fill is reserved for giving, so a donation never competes with ticketing for the same slot. Labels are uppercase at 0.05em — a programme-note voice, not an app voice. Sizes are set by consequence, not by hierarchy: anything that moves money is 60px tall, ordinary actions are 52px, and 44px is the floor nothing goes below.
Variant
Default
Hover
Active
Focus
Disabled
Primary
#5E4514 fill
Add to cart
Add to cart
Add to cart
Add to cart
Secondary
1.5px #6E5219 edge
Compare
Compare
Compare
Compare
Tertiary
Text only, 44px target
Keep browsing
Keep browsing
Keep browsing
Keep browsing
Destructive
#9B1C1C, never filled
Remove
Remove
Remove
Remove
Inside stage blocks
8.26:1 · #17130E on #C9A96E8.33:1 · focus ring #C9A96E
Sizes and targets
Place order60px · anything that charges a card
Add to cart52px · standard action
Tickets48px · in cards and headers
+56 × 56px · quantity steppers, both halves
The focus ring, and why it is two-tone
The ring is 3px of the surface colour, then 3px of #5E4514. Brass alone would vanish against a brass-filled primary button; the surface-coloured gap gives the ring an edge to contrast with in both directions — 8.40:1 against the page and 8.84:1 against the button fill. Inside stage blocks the ring inverts to #C9A96E with a #16120D gap, 8.33:1. It is never removed, and it is never the only difference between a focused and unfocused control.
VI.
Form fields
Labels are always visible and always above the field — placeholder-as-label fails the moment someone starts typing, and it fails worst for the readers this system is built for. Fields are 56px tall with 18px text.
Rest, focus, filled
Help text sits under the field at 17px, never inside it.
asgerdur@bcgs.org
Locked after payment
4.34:1 — above AA even though it need not be.
Error state, anatomy
!This card number is four digits short.
1Border thickens to 2px and turns #9B1C1C — shape changes, not just colour.
2Field ground shifts to #FDF6F5, a warm blush that still reads at 15:1.
3Message carries an icon and says what is wrong, in plain words, at 7.62:1.
4aria-invalid plus aria-describedby, and role="alert" on the message.
Select and textarea
Choice controls
Checkboxes and radios are 24–26px with the whole row as the target, so a 52px-tall label is clickable end to end.
VII.
Photograph handling
This is where the dark version's quality survives. A photograph is never dropped onto the page ground; it sits in a stage plate — a #16120D container that behaves like the darkness around a lit stage. The page stays light; the picture gets the room.
Plate, no text
The default. Ink ground, 8px radius, saturate(0.9) contrast(1.05) brightness(0.96). The grade is subtle on purpose — it unifies photographs shot across four decades without looking filtered.
Caption goes here, on the light surface below.
Guitar OrchestraThirty players, one instrument
Plate with text
Text is only permitted over an image when a directional scrim holds the ink at 0.92 or higher behind the text block, and the image is dropped to brightness 0.82. Measured at the text: 17.45:1.
Not permitted
✕ Prohibited
No text on bare photography
A text-shadow is not a contrast strategy. Contrast here varies from about 2:1 to 14:1 depending on where the letterform lands, which is exactly the condition that makes reading tiring.
✓Faces sit in the upper third; object-position is set per image, not left at centre.
✓Alt text describes what is happening, not who commissioned it. Decorative plates get alt="".
✓An empty plate is a legitimate published state: ink ground, dashed brass outline, and a line saying what belongs there.
✕No photograph behind a form, a price, or any checkout step.
✕No duotone, no sepia, no heavy grade. The concert-hall feeling comes from the ink around the picture, not from wrecking the picture.
✕No stage plate taller than about 62vh. Past that the page starts to read as a dark page.
✕Never more than two stage blocks between the header and the footer.
VIII.
Ticketing and checkout
The rule for every component here: light ground, large targets, and the number the person is about to be charged always visible without scrolling.
Quantity stepper
−2+
56 × 56px per half, 156px overall. The count is aria-live="polite" so screen readers hear the new number, and each button's label names the ticket type rather than saying "plus".
Seat section chips
Orchestra$50 · 34 leftMezzanine$38 · 91 leftBoxSold out
Selected is a 2px brass edge and a brass ground — two cues. Sold out says the words; it is never conveyed by dimming alone.
Summary rows
Tickets$176.00
Member discount, 15%−$26.40
Membership and gifts$325.00
Total$474.60
Tax-deductible portion$325.00
Seats held for 14:32
Hold timers are info blue, announced politely, and never flash or turn red. Running out extends once automatically before it releases.
Order placed
Success is stated in words with a mark, not with a colour change alone.
Card declined
Failure keeps the whole cart intact, says what to try, and gives the box office number. It never clears a form.
Commerce rules
·A mixed cart shows the deductible split before payment, not only on the receipt. Membership benefits are intangible, so the whole contribution qualifies — and saying so is part of why people give.
·Member pricing is applied automatically and shown as its own line. No promo code stands in for a discount someone has already paid for.
·Recurring gifts state the cadence at the point of commitment and cancel in one click, with the same effort it took to start.
·The box office number appears on every checkout screen. A phone call is a supported path, not a failure.
·Checkout uses a reduced header with no navigation. Nothing competes with finishing.
IX.
Logo slot
The identity is a slot, not an asset. Nothing in this system depends on the current wordmark, and the word "Society" is set on its own line precisely so it can be dropped without redrawing anything.
Default, on light
Baltimore Classical GuitarSociety · founded 1987
Caslon 22px over Franklin 11px caps. Clear space equals the cap height of the first line on all four sides.
Inverse, on stage ink
Baltimore Classical GuitarSociety · founded 1987
17.45:1 and 10.35:1. The only two variants that exist. There is no colour-on-colour lockup.
If "Society" is dropped
Baltimore Classical GuitarFounded 1987
Same box, same clear space, same vertical rhythm. No layout above changes.
On the existing asset
The current wordmark is a white PNG, which means it can only ever appear on a dark ground — it disappears on every reading surface in this system. That alone would force the page dark, which is the problem we are undoing.
So no page example uses it. When the rebrand lands, the deliverable that unblocks everything is a single-colour vector that can be recoloured to #1F1912 and #FBF7EF. Until then the typographic slot is the identity, and it is doing the job.
X.
What was measured
Computed from the token hex values, against every surface each token is permitted on — not only the default one. Two pairings failed and were restricted rather than published.
7.31:1
Lowest ratio of any text actually shipped on a light surface — text-meta on the page ground. The 7:1 floor holds.
8.33:1
Lowest ratio inside a stage block — brass eyebrows and the six-string rule on stage ink.
3.64:1
Input and control borders against the page, clearing the 3:1 required by WCAG 1.4.11.
4.34:1
Disabled controls. Exempt from 1.4.3, measured anyway, and above AA regardless.
2
Failures found: text-meta on sunken (6.55:1) and on brass (6.53:1). Both restricted; text-secondary is used there instead.
0
Reading surfaces, prices, or checkout steps on a dark ground.