@possibleworlds/tender 0.1.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/NOTICE.md +68 -0
- package/assets/builtin-user-guide.md +1206 -0
- package/dist/cli.js +6339 -0
- package/dist/preview-ui/assets/JetBrainsMono-Bold.woff2 +0 -0
- package/dist/preview-ui/assets/JetBrainsMono-Medium.woff2 +0 -0
- package/dist/preview-ui/assets/JetBrainsMono-Regular.woff2 +0 -0
- package/dist/preview-ui/assets/LibreBaskerville-Bold.woff2 +0 -0
- package/dist/preview-ui/assets/LibreBaskerville-Italic.woff2 +0 -0
- package/dist/preview-ui/assets/LibreBaskerville-Regular.woff2 +0 -0
- package/dist/preview-ui/assets/Reglo-Bold.otf +0 -0
- package/dist/preview-ui/assets/index.css +1 -0
- package/dist/preview-ui/assets/index.js +4 -0
- package/dist/preview-ui/index.html +13 -0
- package/package.json +82 -0
- package/skill/SKILL.md +442 -0
- package/skill/examples/callout.tender +15 -0
- package/skill/examples/content-restructure-after.md +13 -0
- package/skill/examples/content-restructure-before.md +9 -0
- package/skill/examples/row.tender +12 -0
- package/skill/examples/synthetic-project/components/callout.tender +15 -0
- package/skill/examples/synthetic-project/components/row.tender +12 -0
- package/skill/examples/synthetic-project/content.md +15 -0
- package/skill/examples/synthetic-project/project.yaml +7 -0
- package/skill/examples/synthetic-project/styles.css +14 -0
- package/templates/default/components/README.md +32 -0
- package/templates/default/content.md +13 -0
- package/templates/default/project.yaml +27 -0
- package/templates/default/styles.css +39 -0
- package/templates/open-circle/assets/images/check.png +0 -0
- package/templates/open-circle/assets/images/clock.png +0 -0
- package/templates/open-circle/assets/images/pointer.png +0 -0
- package/templates/open-circle/assets/images/speaker.png +0 -0
- package/templates/open-circle/assets/images/spiral.png +0 -0
- package/templates/open-circle/components/ad-lib.tender +8 -0
- package/templates/open-circle/components/cover-byline.tender +1 -0
- package/templates/open-circle/components/cover-spiral.tender +1 -0
- package/templates/open-circle/components/cover-tagline.tender +1 -0
- package/templates/open-circle/components/margin-label.tender +5 -0
- package/templates/open-circle/components/participant-name.tender +5 -0
- package/templates/open-circle/components/row.tender +12 -0
- package/templates/open-circle/components/spanning-row.tender +1 -0
- package/templates/open-circle/components/speaker-name.tender +5 -0
- package/templates/open-circle/components/stage-direction.tender +5 -0
- package/templates/open-circle/components/yellow-tag.tender +5 -0
- package/templates/open-circle/content.md +157 -0
- package/templates/open-circle/project.yaml +40 -0
- package/templates/open-circle/styles.css +216 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/* Base typography. */
|
|
2
|
+
body {
|
|
3
|
+
font-family: Georgia, serif;
|
|
4
|
+
font-size: 11pt;
|
|
5
|
+
line-height: 1.5;
|
|
6
|
+
}
|
|
7
|
+
h1 { font-size: 22pt; margin: 0 0 0.6em; }
|
|
8
|
+
h2 { font-size: 18pt; margin: 0 0 0.5em; }
|
|
9
|
+
h3 { font-size: 14pt; margin: 0 0 0.4em; }
|
|
10
|
+
p { margin: 0 0 0.6em; }
|
|
11
|
+
|
|
12
|
+
/* Markdown tables (GFM `| a | b |` syntax → <table>/<th>/<td>).
|
|
13
|
+
No `text-align` here: GFM column alignment rides on the cells'
|
|
14
|
+
presentational `align` attribute, which a stylesheet rule would clobber. */
|
|
15
|
+
table {
|
|
16
|
+
border-collapse: collapse;
|
|
17
|
+
width: 100%;
|
|
18
|
+
margin: 0 0 0.8em;
|
|
19
|
+
font-size: 0.95em;
|
|
20
|
+
}
|
|
21
|
+
th, td {
|
|
22
|
+
padding: 0.3em 0.6em;
|
|
23
|
+
vertical-align: top;
|
|
24
|
+
border-bottom: 0.5pt solid #ccc;
|
|
25
|
+
}
|
|
26
|
+
thead th { border-bottom-width: 1pt; }
|
|
27
|
+
caption { margin-bottom: 0.3em; font-style: italic; }
|
|
28
|
+
|
|
29
|
+
/* Running-head bookkeeping: lets `{chapter}` in project.yaml's
|
|
30
|
+
header config resolve to the most recent <h1>. */
|
|
31
|
+
.margin-label, h1, h2, h3 {
|
|
32
|
+
string-set: chapter content(text);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/* Add component-specific styles below as you create components, or
|
|
36
|
+
keep them in each component's <style> block for tighter coupling.
|
|
37
|
+
Either pattern works; the cascade order is project.yaml-generated
|
|
38
|
+
first, then component <style> blocks (alphabetical), then this
|
|
39
|
+
file last — so styles.css always wins source-order conflicts. */
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<div class="cover-byline">{{{body}}}</div>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<div class="cover-spiral"><img src="assets/images/spiral.png" alt=""></div>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<div class="cover-tagline">{{{body}}}</div>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
params: [label, icon, speaker, no-break]
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
<div class="row{{#if no-break}} no-break{{/if}}">
|
|
6
|
+
<div class="col-l">
|
|
7
|
+
{{#if speaker}}<span class="speaker-name">{{speaker}}</span>{{/if}}
|
|
8
|
+
{{#if label}}<span class="margin-label">{{label}}</span>{{/if}}
|
|
9
|
+
{{#if icon}}<img src="assets/images/{{icon}}.png" alt="" class="margin-icon">{{/if}}
|
|
10
|
+
</div>
|
|
11
|
+
<div class="col-r">{{{body}}}</div>
|
|
12
|
+
</div>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<div class="spanning-row">{{{body}}}<hr class="spanning-rule"></div>
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
=== page{template=cover}
|
|
2
|
+
|
|
3
|
+
<div class="cover-title">
|
|
4
|
+
|
|
5
|
+
# Open Circle
|
|
6
|
+
|
|
7
|
+
</div>
|
|
8
|
+
|
|
9
|
+
<div class="cover-tags">
|
|
10
|
+
<div><span class="yellow-tag">A facilitator's playbook for<br>community story workshops</span></div>
|
|
11
|
+
<div><span class="yellow-tag">By Mara Ellison and Devin Park</span></div>
|
|
12
|
+
</div>
|
|
13
|
+
|
|
14
|
+
<row>
|
|
15
|
+
|
|
16
|
+
Open Circle is a participatory workshop format for groups of 15–20 people. Over three hours, participants share short stories from their neighbourhood, listen attentively to each other, and weave threads from one telling into the next — building a portrait of a place that no single voice could draw alone.
|
|
17
|
+
|
|
18
|
+
The workshop sits somewhere between a sharing circle and a writing exercise. Participants do most of the talking; facilitators hold the time, the prompts, and the rhythm.
|
|
19
|
+
|
|
20
|
+
The form is open, attentive, and unhurried. Make room for silence. Let stories find each other. Trust the circle.
|
|
21
|
+
|
|
22
|
+
</row>
|
|
23
|
+
|
|
24
|
+
<cover-spiral />
|
|
25
|
+
|
|
26
|
+
=== page
|
|
27
|
+
|
|
28
|
+
<spanning-row>
|
|
29
|
+
|
|
30
|
+
## Introducing The Four Workshop Stages
|
|
31
|
+
|
|
32
|
+
</spanning-row>
|
|
33
|
+
|
|
34
|
+
<row>
|
|
35
|
+
|
|
36
|
+
The session is shaped around four stages. The time allocations below are guidance, not law — a circle that's finding its rhythm is worth more than a stage finished on the clock. Keep an eye on the whole arc.
|
|
37
|
+
|
|
38
|
+
</row>
|
|
39
|
+
|
|
40
|
+
<row label="Approx 30 minutes" icon=clock no-break>
|
|
41
|
+
|
|
42
|
+
#### Stage 1. Arrival, Names, and Setting the Circle
|
|
43
|
+
|
|
44
|
+
People arrive, write their name on a label, and find a seat in the circle. Facilitators offer a short welcome, name the agreement of the room, and lead a one-breath check-in so every voice has been heard once.
|
|
45
|
+
|
|
46
|
+
</row>
|
|
47
|
+
|
|
48
|
+
<row label="Approx 30 minutes" icon=clock no-break>
|
|
49
|
+
|
|
50
|
+
#### Stage 2. Preparation for the Sharing
|
|
51
|
+
|
|
52
|
+
Each participant takes a prompt card and five minutes of quiet to jot down notes for the story they'd like to bring. Prompts point at place — a corner, a building, a route, a season — not at biography.
|
|
53
|
+
|
|
54
|
+
</row>
|
|
55
|
+
|
|
56
|
+
<row label="90 minutes" icon=clock no-break>
|
|
57
|
+
|
|
58
|
+
#### Stage 3. The Sharing
|
|
59
|
+
|
|
60
|
+
The circle takes turns. Each person speaks for up to three minutes, holding a small stone while it is their turn. The stone passes left. Listeners do not interrupt; the only response, between turns, is a moment of held quiet.
|
|
61
|
+
|
|
62
|
+
</row>
|
|
63
|
+
|
|
64
|
+
<row label="30 minutes" icon=clock no-break>
|
|
65
|
+
|
|
66
|
+
#### Stage 4. Reflection and Threads
|
|
67
|
+
|
|
68
|
+
Once the circle has completed, facilitators invite participants to name a thread they noticed running between stories. The aim is recognition, not summary — the work of weaving belongs to the room.
|
|
69
|
+
|
|
70
|
+
</row>
|
|
71
|
+
|
|
72
|
+
=== page
|
|
73
|
+
|
|
74
|
+
<spanning-row>
|
|
75
|
+
|
|
76
|
+
## Stage 1. Arrival
|
|
77
|
+
|
|
78
|
+
</spanning-row>
|
|
79
|
+
|
|
80
|
+
<row label="5 minutes" icon=clock no-break>
|
|
81
|
+
|
|
82
|
+
Participants arrive and are welcomed at the door. <span class="stage-direction">Facilitator A stands near the entrance with the name labels. Facilitator B sets out the prompt cards and the stone on the central table.</span> A small bowl of pebbles by the door doubles as a tally — one in the bowl per person seated.
|
|
83
|
+
|
|
84
|
+
</row>
|
|
85
|
+
|
|
86
|
+
<row speaker="Facilitator A" icon=speaker no-break>
|
|
87
|
+
|
|
88
|
+
<p class="stage-direction">Speaking to the room as people settle.</p>
|
|
89
|
+
|
|
90
|
+
Welcome, everyone. We're glad you're here. We're going to spend the next three hours in a circle together — telling, listening, and noticing the threads that run between our stories about this place.
|
|
91
|
+
|
|
92
|
+
</row>
|
|
93
|
+
|
|
94
|
+
<ad-lib>
|
|
95
|
+
|
|
96
|
+
@@ suggested
|
|
97
|
+
|
|
98
|
+
"Before we begin, a few words about where we are and why we're gathered. [Name your location.] This is a place with its own long story — of the people who have lived and worked here, of the buildings and routes and corners that hold the years, of the seasons and weather that have shaped it. Tonight we're adding to that record, one telling at a time…"
|
|
99
|
+
|
|
100
|
+
</ad-lib>
|
|
101
|
+
|
|
102
|
+
<row speaker="Facilitator B" icon=speaker no-break>
|
|
103
|
+
|
|
104
|
+
I'll be keeping a soft eye on the time so you don't have to. <span class="stage-direction">Holds up the small stone.</span> And this is the talking stone — it's how we'll know whose turn it is.
|
|
105
|
+
|
|
106
|
+
</row>
|
|
107
|
+
|
|
108
|
+
<row label="Note" icon=pointer no-break>
|
|
109
|
+
|
|
110
|
+
The warmth here is intentional. A short, slightly playful opening eases tension at the start of the sharing and models a dynamic of care between the two facilitators — making the circle feel inviting rather than procedural.
|
|
111
|
+
|
|
112
|
+
</row>
|
|
113
|
+
|
|
114
|
+
=== page
|
|
115
|
+
|
|
116
|
+
<spanning-row>
|
|
117
|
+
|
|
118
|
+
## What You Need to Run the Workshop
|
|
119
|
+
|
|
120
|
+
</spanning-row>
|
|
121
|
+
|
|
122
|
+
<row label="The Prompt Cards" icon=check no-break>
|
|
123
|
+
|
|
124
|
+
Print one set of prompt cards per workshop — short questions pointing at place, not biography. Download Prompt Card Template, or write your own to suit the location.
|
|
125
|
+
|
|
126
|
+
</row>
|
|
127
|
+
|
|
128
|
+
<row label="The Talking Stone" icon=check no-break>
|
|
129
|
+
|
|
130
|
+
Any small object that fits the palm will do; the function is ceremonial, not technical. A river-smoothed stone or a wooden bead works well — heavy enough to feel deliberate when it passes.
|
|
131
|
+
|
|
132
|
+
</row>
|
|
133
|
+
|
|
134
|
+
<row label="Stationery" icon=check no-break>
|
|
135
|
+
|
|
136
|
+
- Index cards or postcards (one per participant)
|
|
137
|
+
- Soft pencils or felt-tip pens
|
|
138
|
+
- Name labels and a marker pen
|
|
139
|
+
- A small bowl of pebbles by the door (for the seated-person tally)
|
|
140
|
+
|
|
141
|
+
</row>
|
|
142
|
+
|
|
143
|
+
<row label="Furniture & Room Setup" icon=check no-break>
|
|
144
|
+
|
|
145
|
+
- Chairs arranged in a single circle, no table in the middle
|
|
146
|
+
- A side table for the prompt cards, the stone, and the bowl of pebbles
|
|
147
|
+
- Soft lighting if you can; overhead fluorescents tend to flatten the room
|
|
148
|
+
- A clock visible to facilitators only
|
|
149
|
+
|
|
150
|
+
</row>
|
|
151
|
+
|
|
152
|
+
<row label="Refreshments" icon=check no-break>
|
|
153
|
+
|
|
154
|
+
- Water, tea, and coffee on a side table
|
|
155
|
+
- Something simple to share — flatbread, fruit, biscuits
|
|
156
|
+
|
|
157
|
+
</row>
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
page-templates:
|
|
2
|
+
default:
|
|
3
|
+
size: A4
|
|
4
|
+
margin: { top: 12mm, bottom: 12mm, inner: 12mm, outer: 12mm }
|
|
5
|
+
cover:
|
|
6
|
+
size: A4
|
|
7
|
+
margin: { top: 12mm, bottom: 12mm, inner: 12mm, outer: 12mm }
|
|
8
|
+
|
|
9
|
+
design-tokens:
|
|
10
|
+
font:
|
|
11
|
+
display: "'P22 Mackinac', Georgia, serif"
|
|
12
|
+
body: "'Inter', system-ui, sans-serif"
|
|
13
|
+
mono: "'JetBrains Mono', monospace"
|
|
14
|
+
color:
|
|
15
|
+
ink: '#1a1a1a'
|
|
16
|
+
page: '#ffffff'
|
|
17
|
+
accent: '#FFE600'
|
|
18
|
+
size:
|
|
19
|
+
h1: 24pt
|
|
20
|
+
h2: 20pt
|
|
21
|
+
h3: 16pt
|
|
22
|
+
h4: 12pt
|
|
23
|
+
body: 12pt
|
|
24
|
+
mono: 10pt
|
|
25
|
+
tag: 9pt
|
|
26
|
+
leading:
|
|
27
|
+
body: 1.6
|
|
28
|
+
head: 1.2
|
|
29
|
+
col:
|
|
30
|
+
gap: 8mm
|
|
31
|
+
space:
|
|
32
|
+
baseline-offset: 0px
|
|
33
|
+
|
|
34
|
+
typography:
|
|
35
|
+
lang: en
|
|
36
|
+
hyphenation:
|
|
37
|
+
enabled: true
|
|
38
|
+
min-word-length: 6
|
|
39
|
+
min-chars-before: 3
|
|
40
|
+
min-chars-after: 3
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&family=JetBrains+Mono:wght@400;600&display=swap');
|
|
2
|
+
|
|
3
|
+
/* ── Tokens ──
|
|
4
|
+
Design tokens live in project.yaml under `design-tokens:` and compile
|
|
5
|
+
to a :root { --token: value; } block prepended to this stylesheet.
|
|
6
|
+
See docs for the full token list; --space-baseline-offset is the
|
|
7
|
+
baseline offset between JetBrains Mono and Inter (start at 0, tune
|
|
8
|
+
in 0.5px increments after loading real fonts).
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
html, body {
|
|
12
|
+
margin: 0;
|
|
13
|
+
padding: 0;
|
|
14
|
+
background: var(--color-page);
|
|
15
|
+
color: var(--color-ink);
|
|
16
|
+
font-family: var(--font-body);
|
|
17
|
+
font-size: var(--size-body);
|
|
18
|
+
line-height: var(--leading-body);
|
|
19
|
+
-webkit-print-color-adjust: exact;
|
|
20
|
+
print-color-adjust: exact;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/* ── Base Type ── */
|
|
24
|
+
h1, h2, h3 {
|
|
25
|
+
font-family: var(--font-display);
|
|
26
|
+
font-weight: 400;
|
|
27
|
+
line-height: var(--leading-head);
|
|
28
|
+
margin: 0;
|
|
29
|
+
}
|
|
30
|
+
h1 { font-size: var(--size-h1); }
|
|
31
|
+
h2 { font-size: var(--size-h2); }
|
|
32
|
+
h3 { font-size: var(--size-h3); }
|
|
33
|
+
|
|
34
|
+
h4 {
|
|
35
|
+
font-family: var(--font-body);
|
|
36
|
+
font-size: var(--size-h4);
|
|
37
|
+
font-weight: 600;
|
|
38
|
+
line-height: var(--leading-head);
|
|
39
|
+
margin: 0 0 0.3em 0;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
p {
|
|
43
|
+
font-size: var(--size-body);
|
|
44
|
+
line-height: var(--leading-body);
|
|
45
|
+
margin: 0 0 0.75em 0;
|
|
46
|
+
orphans: 3;
|
|
47
|
+
widows: 3;
|
|
48
|
+
}
|
|
49
|
+
p:last-child { margin-bottom: 0; }
|
|
50
|
+
|
|
51
|
+
ul {
|
|
52
|
+
margin: 0 0 0.75em 0;
|
|
53
|
+
padding-left: 1.2em;
|
|
54
|
+
}
|
|
55
|
+
ul li {
|
|
56
|
+
font-size: var(--size-body);
|
|
57
|
+
line-height: var(--leading-body);
|
|
58
|
+
margin-bottom: 0.2em;
|
|
59
|
+
}
|
|
60
|
+
ul li:last-child { margin-bottom: 0; }
|
|
61
|
+
|
|
62
|
+
strong { font-weight: 600; }
|
|
63
|
+
|
|
64
|
+
/* ── Page Breaks ── */
|
|
65
|
+
.no-break { break-inside: avoid; }
|
|
66
|
+
.break-before { break-before: page; }
|
|
67
|
+
|
|
68
|
+
/* ── Two-Column Row ── */
|
|
69
|
+
/*
|
|
70
|
+
.row is the core layout unit.
|
|
71
|
+
Each row: l-col (3fr) + r-col (5fr), baseline-aligned.
|
|
72
|
+
align-items: first baseline aligns the mono label
|
|
73
|
+
with the first line of body copy in r-col.
|
|
74
|
+
*/
|
|
75
|
+
.row {
|
|
76
|
+
display: grid;
|
|
77
|
+
grid-template-columns: 3fr 5fr;
|
|
78
|
+
column-gap: var(--col-gap);
|
|
79
|
+
align-items: first baseline;
|
|
80
|
+
margin-bottom: 1.5em;
|
|
81
|
+
}
|
|
82
|
+
.row:last-child { margin-bottom: 0; }
|
|
83
|
+
|
|
84
|
+
/* l-col inner: label left, icon right */
|
|
85
|
+
.col-l {
|
|
86
|
+
display: flex;
|
|
87
|
+
justify-content: space-between;
|
|
88
|
+
align-items: first baseline;
|
|
89
|
+
margin-top: var(--space-baseline-offset);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/* ── Spanning Header ── */
|
|
93
|
+
.spanning-row {
|
|
94
|
+
margin-bottom: 1.5em;
|
|
95
|
+
}
|
|
96
|
+
.spanning-row h1,
|
|
97
|
+
.spanning-row h2,
|
|
98
|
+
.spanning-row h3 {
|
|
99
|
+
margin-bottom: 0.2em;
|
|
100
|
+
}
|
|
101
|
+
.spanning-rule {
|
|
102
|
+
border: none;
|
|
103
|
+
border-top: 0.5px solid var(--color-ink);
|
|
104
|
+
margin: 0.3em 0 0 0;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/* ── Margin Label ── */
|
|
108
|
+
.margin-label {
|
|
109
|
+
font-family: var(--font-mono);
|
|
110
|
+
font-size: var(--size-mono);
|
|
111
|
+
font-weight: 400;
|
|
112
|
+
letter-spacing: 0.02em;
|
|
113
|
+
line-height: var(--leading-body);
|
|
114
|
+
color: var(--color-ink);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/* All l-col icons: same size as label text, baseline-offset */
|
|
118
|
+
.margin-icon {
|
|
119
|
+
width: 1em;
|
|
120
|
+
height: 1em;
|
|
121
|
+
flex-shrink: 0;
|
|
122
|
+
margin-left: 0.5em;
|
|
123
|
+
position: relative;
|
|
124
|
+
top: 0.15em; /* optical baseline correction */
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/* ── Speaker ── */
|
|
128
|
+
.speaker-name {
|
|
129
|
+
font-family: var(--font-mono);
|
|
130
|
+
font-size: var(--size-mono);
|
|
131
|
+
font-weight: 600;
|
|
132
|
+
letter-spacing: 0.02em;
|
|
133
|
+
line-height: var(--leading-body);
|
|
134
|
+
color: var(--color-ink);
|
|
135
|
+
}
|
|
136
|
+
/* speaker icon inherits .margin-icon */
|
|
137
|
+
|
|
138
|
+
/* ── Inline Text Styles ── */
|
|
139
|
+
|
|
140
|
+
/* block — sits between paragraphs as its own <p> */
|
|
141
|
+
p.stage-direction { font-style: italic; }
|
|
142
|
+
|
|
143
|
+
/* inline — <span> within a body paragraph */
|
|
144
|
+
span.stage-direction { font-style: italic; }
|
|
145
|
+
|
|
146
|
+
/* inline semibold within body copy */
|
|
147
|
+
.participant-name { font-weight: 600; }
|
|
148
|
+
|
|
149
|
+
/* ── Ad-lib ── */
|
|
150
|
+
/*
|
|
151
|
+
L-col: suggested script text, italic.
|
|
152
|
+
R-col: ruled boxout for handwriting.
|
|
153
|
+
Box height = l-col height (set by content) × 1.5.
|
|
154
|
+
Achieved by making the grid row stretch, then adding
|
|
155
|
+
50% extra via padding-bottom on the box.
|
|
156
|
+
*/
|
|
157
|
+
.ad-lib {
|
|
158
|
+
display: grid;
|
|
159
|
+
grid-template-columns: 3fr 5fr;
|
|
160
|
+
column-gap: var(--col-gap);
|
|
161
|
+
align-items: stretch;
|
|
162
|
+
margin-bottom: 1.5em;
|
|
163
|
+
}
|
|
164
|
+
.ad-lib__suggested {
|
|
165
|
+
font-style: italic;
|
|
166
|
+
font-size: var(--size-body);
|
|
167
|
+
line-height: var(--leading-body);
|
|
168
|
+
}
|
|
169
|
+
.ad-lib__box {
|
|
170
|
+
border: 1.5px solid var(--color-ink);
|
|
171
|
+
padding: 0.5em 0.75em;
|
|
172
|
+
/* stretch to grid row height, then add 50% more via padding */
|
|
173
|
+
padding-bottom: 50%;
|
|
174
|
+
box-sizing: border-box;
|
|
175
|
+
}
|
|
176
|
+
.ad-lib__label {
|
|
177
|
+
font-family: var(--font-body);
|
|
178
|
+
font-size: var(--size-body);
|
|
179
|
+
line-height: var(--leading-body);
|
|
180
|
+
color: #aaaaaa;
|
|
181
|
+
display: block;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/* ── Yellow Tag ── */
|
|
185
|
+
.yellow-tag {
|
|
186
|
+
display: inline-block;
|
|
187
|
+
background: var(--color-accent);
|
|
188
|
+
color: var(--color-ink);
|
|
189
|
+
font-family: var(--font-body);
|
|
190
|
+
font-size: var(--size-tag);
|
|
191
|
+
font-weight: 700;
|
|
192
|
+
letter-spacing: 0.08em;
|
|
193
|
+
text-transform: uppercase;
|
|
194
|
+
padding: 3px 7px;
|
|
195
|
+
line-height: 1.3;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/* ── Cover layout ── */
|
|
199
|
+
/*
|
|
200
|
+
Cover page is a flex column filling the printable area, so we can push
|
|
201
|
+
the spiral to the bottom-left with margin-top: auto.
|
|
202
|
+
*/
|
|
203
|
+
.page[data-page-template="cover"] {
|
|
204
|
+
display: flex;
|
|
205
|
+
flex-direction: column;
|
|
206
|
+
height: 100%;
|
|
207
|
+
}
|
|
208
|
+
.cover-title { margin-bottom: 2em; }
|
|
209
|
+
.cover-tags {
|
|
210
|
+
display: grid;
|
|
211
|
+
grid-template-columns: 3fr 5fr;
|
|
212
|
+
column-gap: var(--col-gap);
|
|
213
|
+
margin-bottom: 3em;
|
|
214
|
+
}
|
|
215
|
+
.cover-spiral { margin-top: auto; }
|
|
216
|
+
.cover-spiral img { width: 25%; }
|