@notambourine/brand-kit 1.5.0 → 1.7.0

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/README.md CHANGED
@@ -12,6 +12,7 @@ Correct a brand value here. Every other copy is downstream.
12
12
  | `vars.css` | The values alone, for a surface with its own faces and base layer. |
13
13
  | `components.css` | `.nt-btn`, `.nt-card`, `.nt-nav`, and the rest, all `var()`-based. |
14
14
  | `deck.css` | The Marpit slide theme, 1280x720. Load `vars.css` on the page too. |
15
+ | `prose.css` | `.nt-prose` for rendered markdown, on screen and on paper. |
15
16
  | `logo/` | The mark, the lockup, the icons, and the rasters cut from them. |
16
17
 
17
18
  ## Logo
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@notambourine/brand-kit",
3
- "version": "1.5.0",
3
+ "version": "1.7.0",
4
4
  "description": "NoTambourine brand assets and guidance for design, decks, and copy",
5
5
  "license": "MIT",
6
6
  "repository": {
package/prose.css ADDED
@@ -0,0 +1,139 @@
1
+ /* =========================================================
2
+ NoTambourine: long-form documents
3
+ ---------------------------------------------------------
4
+ Part of the golden set. Wrap rendered markdown in .nt-prose
5
+ and load vars.css (or tokens.css) on the page. Every length
6
+ is em or ch, so the container's font-size and line-height
7
+ are the only knobs: the golden set's body on screen, about
8
+ 10.5pt and 1.55 on paper.
9
+ ========================================================= */
10
+
11
+ .nt-prose {
12
+ font-family: var(--font-body);
13
+ color: var(--fg2);
14
+ line-height: var(--lh-body);
15
+ letter-spacing: var(--ls-body);
16
+ max-width: 40em;
17
+ }
18
+ /* elements.css pins p, code, and pre to rem; inside prose they follow the
19
+ container, or a PDF paragraph prints larger than its own list items. */
20
+ .nt-prose :is(p, li, td, th, blockquote) { font-size: inherit; line-height: inherit; }
21
+ .nt-prose > * { margin: 0; }
22
+ .nt-prose > * + * { margin-top: 1em; }
23
+
24
+ /* Space above a heading outweighs space below, so it binds to what it opens. */
25
+ .nt-prose :is(h1, h2, h3) {
26
+ font-family: var(--font-display);
27
+ color: var(--fg1);
28
+ font-weight: var(--fw-bold);
29
+ letter-spacing: var(--ls-tight);
30
+ line-height: 1.2;
31
+ text-wrap: balance;
32
+ }
33
+ .nt-prose h1 { font-size: 2em; line-height: 1.15; }
34
+ .nt-prose h2 { font-size: 1.5em; }
35
+ .nt-prose h3 { font-size: 1.25em; }
36
+ /* At body size a grotesk h4 barely differs from the h3; the mono does. */
37
+ .nt-prose h4 {
38
+ font-family: var(--font-body);
39
+ font-size: 1em;
40
+ font-weight: var(--fw-semibold);
41
+ letter-spacing: 0;
42
+ color: var(--fg1);
43
+ }
44
+ .nt-prose > * + h2 { margin-top: 1.75em; padding-top: 0.75em; border-top: 1px solid var(--line); }
45
+ .nt-prose > * + h3 { margin-top: 1.6em; }
46
+ .nt-prose > * + h4 { margin-top: 1.75em; }
47
+ .nt-prose > :is(h1, h2, h3, h4) + * { margin-top: 0.5em; }
48
+ /* The line under the title is the document's purpose: brightest, not biggest. */
49
+ .nt-prose > h1 + p { color: var(--fg1); }
50
+
51
+ /* Markers sit flush with the text column and nested markers land under the
52
+ parent's text. ch is exact in a mono face, so the indent is the marker. */
53
+ .nt-prose ul { padding-left: 2ch; list-style-type: "\2022 "; }
54
+ .nt-prose ol { padding-left: 3ch; }
55
+ .nt-prose :is(ul, ol) :is(ul, ol) { margin-top: 0.25em; }
56
+ .nt-prose li + li { margin-top: 0.375em; }
57
+ .nt-prose li::marker { color: var(--fg3); font-variant-numeric: tabular-nums; }
58
+ .nt-prose li > p { margin: 0; }
59
+ .nt-prose li > p + p { margin-top: 0.5em; }
60
+
61
+ /* The box takes the marker's slot, so a checklist aligns with the bullets. */
62
+ .nt-prose li:has(> input[type="checkbox"]) { list-style: none; }
63
+ .nt-prose li > input[type="checkbox"] {
64
+ width: 0.9em;
65
+ height: 0.9em;
66
+ vertical-align: -0.1em;
67
+ margin: 0 calc(2ch - 0.9em) 0 -2ch;
68
+ accent-color: var(--support);
69
+ }
70
+ .nt-prose li:has(> input:checked) { color: var(--fg3); }
71
+
72
+ /* Pink is for links alone, and the underline means a link never rests on hue:
73
+ pink against body grey is about 2:1. */
74
+ .nt-prose a {
75
+ color: var(--accent-text);
76
+ border-bottom: 0;
77
+ text-decoration: underline;
78
+ text-decoration-thickness: 1px;
79
+ text-underline-offset: 0.2em;
80
+ text-decoration-color: color-mix(in srgb, currentColor 45%, transparent);
81
+ }
82
+ .nt-prose a:hover { text-decoration-color: currentColor; }
83
+ .nt-prose strong { color: var(--fg1); font-weight: var(--fw-semibold); }
84
+ .nt-prose :is(del, s) { color: var(--fg3); }
85
+
86
+ /* A file name in a document is reference, not alarm. */
87
+ .nt-prose :not(pre) > code {
88
+ font-size: 0.875em;
89
+ color: var(--fg1);
90
+ background: var(--bg-raised);
91
+ border: 1px solid var(--line);
92
+ border-radius: var(--r-xs);
93
+ padding: 0.05em 0.35em;
94
+ }
95
+ /* A renderer that draws a diagram into a `<pre>` (a mermaid fence, say) wants
96
+ none of the code-block box. */
97
+ .nt-prose pre:not(:has(> svg)) {
98
+ font-size: 0.8125em;
99
+ line-height: 1.6;
100
+ background: var(--bg-card);
101
+ border: 1px solid var(--line);
102
+ border-radius: var(--r-sm);
103
+ padding: 0.9em 1.1em;
104
+ overflow-x: auto;
105
+ }
106
+ .nt-prose pre code { font-size: 1em; background: none; color: var(--fg2); padding: 0; }
107
+
108
+ .nt-prose blockquote {
109
+ padding-left: 1em;
110
+ border-left: 2px solid var(--support);
111
+ color: var(--fg2);
112
+ }
113
+
114
+ /* `display: block` lets a wide table scroll itself: the render emits no wrapper
115
+ to hang the overflow on, and the page must never scroll sideways. */
116
+ .nt-prose table {
117
+ display: block;
118
+ width: max-content;
119
+ max-width: 100%;
120
+ overflow-x: auto;
121
+ border-collapse: collapse;
122
+ font-size: 0.875em;
123
+ font-variant-numeric: tabular-nums;
124
+ }
125
+ .nt-prose :is(th, td) { padding: 0.45em 0.9em; border-bottom: 1px solid var(--line); }
126
+ .nt-prose :is(th, td):first-child { padding-left: 0; }
127
+ /* Only unaligned cells: a stylesheet beats the `align` a `---:` column emits. */
128
+ .nt-prose :is(th, td):not([align]) { text-align: start; }
129
+ .nt-prose th { color: var(--fg1); font-weight: var(--fw-semibold); border-bottom-color: var(--fg3); }
130
+
131
+ .nt-prose hr { border: 0; border-top: 1px solid var(--line); margin-block: 2em; }
132
+ .nt-prose img { max-width: 100%; border-radius: var(--r-sm); }
133
+
134
+ @media print {
135
+ .nt-prose :is(h1, h2, h3, h4) { break-after: avoid; break-inside: avoid; }
136
+ .nt-prose :is(p, li) { orphans: 2; widows: 2; }
137
+ .nt-prose :is(pre, table, blockquote, img) { break-inside: avoid; }
138
+ .nt-prose pre:not(:has(> svg)) { white-space: pre-wrap; word-break: break-word; }
139
+ }
@@ -26,6 +26,9 @@ Read exact values and component behavior from the CSS.
26
26
  - Keep body copy in one column, at most about 640px wide. Use two or three
27
27
  columns for card grids, one on mobile, never four. Leave generous space
28
28
  between blocks.
29
+ - Wrap long-form documents in `.nt-prose` from `prose.css`. In a document, pink
30
+ marks links alone, and links carry an underline. Set density on the container:
31
+ the body tokens on screen, about 10.5pt on paper.
29
32
  - Make nav the only sticky element. No sticky CTAs, chat bubbles, or cookie
30
33
  banners.
31
34
 
@@ -18,6 +18,10 @@ throughout delivery, and own the work from business goal to shipped system. Name
18
18
  the software, data, or infrastructure needed to reach that goal. Keep the time
19
19
  between a decision and working software short.
20
20
 
21
+ Work inside the client's process: their repos, rituals, approvals, and way of
22
+ buying. Push back when work stalls quietly. Name what a wait is costing and
23
+ treat each request for more certainty as work someone has to do.
24
+
21
25
  Treat AI as a working capability. Explain where it speeds up delivery, automates
22
26
  work, improves a product, or helps a team use its information. Name the result,
23
27
  not the novelty. Do not make broad claims about transformation or intelligence.
@@ -53,15 +57,11 @@ what the client wants to accomplish, why now, and what will change after it
53
57
  ships. In proposals, connect each constraint to its business consequence and the
54
58
  work required.
55
59
 
56
- Use these offer names:
57
-
58
- - **Assessment:** Choose what to build or change next. Review the systems,
59
- workflows, and priorities, then set the delivery plan.
60
- - **Embedded:** Add senior engineers who build with AI to your team. We own
61
- delivery and ship the systems your business needs next.
60
+ Shape the engagement around how the client already buys and works. Do not
61
+ publish fixed offers, deal terms, or scope guarantees.
62
62
 
63
63
  Use "Start a conversation" for the primary invitation. Ask what the reader wants
64
- to ship and when. Discuss fit before asking them to choose an engagement.
64
+ to ship and when. Discuss fit before shaping an engagement.
65
65
 
66
66
  ## Register and evidence
67
67
 
@@ -73,8 +73,7 @@ to ship and when. Discuss fit before asking them to choose an engagement.
73
73
  - Show the objective, what shipped, and what the client can now do. Use client
74
74
  numbers when available. Otherwise use a verifiable before and after. Share
75
75
  client evidence only with permission.
76
- - Name who joins and owns delivery. Promise direct access to that person. Cover
77
- our estimating mistakes within the agreed scope.
76
+ - Name who joins and owns delivery.
78
77
  - Describe constraints without blaming the people who built the system.
79
78
 
80
79
  ## Names and mechanics