Bon-po Counter
Design system for the calm prototype. The same tokens and components power this page and the practice screens: quiet book typography, muted maroon, complete images and a fine double rule.
Foundations
Roles come from the current calm source. Changing the theme changes these shared values everywhere; text and actions keep their meaning.
Required font families
Use only the existing calm fonts, through shared tokens. A different family or role requires the owner's explicit design decision before implementation.
| Role | Font & token |
|---|---|
| Controls, labels, dates, metadata | Platform system UI; SF on Applefont.ui / --font-ui |
| Reading in Cyrillic/Latin, titles and book roles | Gentium Book Plus; local alias Bookfont.book / --font-book |
| Tibetan source text and names | Jomolhari; local alias Uchenfont.tibetan / --font-tibetan |
Token source, values and provenance
Actions
+N remains the main counting action. A compact visual control can have a larger touch area. Every example below is a call to the shared component library.
Buttons
Speed & Loop
The visible cycling button is accepted. 1x → 1.5x → 1.2x is the owner's example; the final multiplier list is still open.
The examples do not add to practice history.
Spacing & form actions
One owner per space: the container supplies the outer inset, the component supplies its inner padding, and the group supplies the gap. Compact forms share 12px between groups, 6px from label to field and 8px from field to suggestions. Cancel and Save share equal columns, target size, padding and typography; Save keeps the primary action colour.
8px · illustrated chip inset
16px · action / compact player inset
8px · suggestions
12px · fields and actions
18px · section / footer separation
Equal actions · long labels
Forms
A label names the value; the error sits beside its field. All quick-fill chips share a light contour, including material, date, Count and Step. Chip labels use neutral text in both themes: selection is shown by fill, a stronger contour or a check, never red lettering. Disabled quick values use secondary text. This rule covers material, date, Count, Step and sound choices through the shared components. This example exercises presentation and validation feedback without storing an entry.
Add count
Disabled & selected
Material choice
The Diary entry form and this specimen share MaterialChoice: whole artwork, full source name with a personal display name, and whole-row single selection without radio circles. A check marks only the current value. MaterialSelect retains that same whole preview after selection. Four MaterialSuggestions reuse the Date/Count quick-fill treatment. Each chip follows its name width: short names share a row, long names wrap naturally without an ellipsis. MaterialSelect and MaterialChoice keep the full name, a whole preview and a separate trailing control. The anchored MaterialPicker keeps name search and a single scrolling result list.
Collapsed field → choose → return
Errors & recovery
ErrorState owns error codes and field state. ErrorMessage owns presentation, accessibility and placement. These are explicit fixtures: no data is saved and no network request is made.
Independent field errors
Save failure
Recording & image recovery
CoverImage
Full covers fill their own column with natural proportions. Portrait, square and landscape sources share the same component; thumbnails retain their compact slot. A tall cover scrolls inside a short player while its transport stays fixed. No crop or distortion.
Practice & dates
Opening a material, recording a step and opening its menu are separate actions. Today and Total stay light. A prayer never acquires a +N button. Display Name follows the original title in parentheses and replaces the Tibetan duplicate in that row.
Practice rows
Tibetan row titles are approved at 15 pt. A personal Display Name replaces the Tibetan duplicate in that row.
Selected day
Open Day count to read the full composition.
Diary row
Audio
One source identity, Play/Pause, timeline, visible speed and Loop. Photographs are used only for verified sources; missing photos have initials.
Compact player · 2×2 controls
Open interactive stand →Recording sources
Source grouping and identity are accepted. Selecting a source here only inspects its selected state; each recording launches on its material page with its own Play/Pause.
Recording launch
On a material page, every recording has its own Play/Pause. Teachers use portraits; song versions show the material artwork with title and performer below it. The same RecordingLaunch factory renders this specimen and the interactive stand.
Material recordings
Loading & error
Panels
Reusable containers and action rows. These specimens are shown in the document so their contents remain easy to inspect.
Practice actions
Audio panel
Now playing above practice and explicit Play after picker selection are accepted. Additional-screen visibility and Close remain open. This specimen does not navigate.
Entry sheet
Diary opens a partial-height sheet above the list. Date, a collapsed mantra choice and Count stay compact; the same BottomSheet shell keeps the header and actions outside the scrollable body. The controller owns yesterday, ranking and Save.
Reading
Approved 4 November: one 44 px row with independent languages and a neutral numeric font size between minus/plus. No size caption or additional line; settings disclose to the left without moving the source text.
Icon controls and the material title stay outside the double rule. The rule contains only the source text, including its original headings. Tibetan, Transliteration and Russian are independent layers.
Ngo Wa Monlam
Reading icons
Text and layers
Reading size is shared; languages are remembered per prayer, with available text as fallback. Source-edition questions remain open. This page keeps only temporary specimen state.
Shared component imports
<link rel="stylesheet" href="system/tokens.css"> <link rel="stylesheet" href="system/components.css"> <script src="system/tokens.js"></script> <script src="system/icons.js"></script> <script src="system/components.js"></script>
Reuse & native
The catalogue imports the library used by calm. It never imports the prototype's counters, accounts or audio state machine. HTML is a visual and interaction reference, not ready-to-ship TSX.
| Shared part | Current React Native starting point | Adaptation still needed |
|---|---|---|
| Tokens, type & themes | src/theme/tokens.ts · global.css · ui/Text | Theme adapter, native fonts and glyph/licence verification. |
| Buttons & fields | ui/Button · Input · Label · Switch · Icon | Variants, native targets, state and text scaling. |
| Rows & dates | My Practice · Diary · existing repositories | Shared rows, selected date and genuine local counts. |
| Panels & reading | ui/Dialog · DropdownMenu · catalogue/[id] | Native focus/return behaviour, Aa, layers and scroll. |
| Audio | AudioPlayer · audio-cache service | One real session owner, rate/loop callbacks, offline and OS behaviour. |
Example of a shared call
CalmSystem.incrementButton({ count: 100 });
CalmSystem.speedButton({ value: "1x", next: "1.5x" });
CalmSystem.practiceRow({ name, displayName, image, today, total, step });PracticeSkeleton
Initial account load, accepted 9 November 2026. Static placeholders use PracticeRow columns and keep unknown totals hidden. Date and tabs are paused; Profile stays available. Three decorative rows do not predict the number of practices.
ContentSkeleton / LoadingRegion
Accepted 10 November 2026. Unknown content only; known controls and email stay visible. Ready uses the control crossfade; Reduced Motion is immediate. These are live shared factories.
Diary
Source text — no ReadingFrame
Unknown Profile name
Account delivery & review
Author’s account steps 1–8, accepted 11 November 2026. These specimens call the shared templates. Data and account results remain with the host.