backspec 0.0.1__tar.gz
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.
- backspec-0.0.1/.gitignore +6 -0
- backspec-0.0.1/AGENTS.md +21 -0
- backspec-0.0.1/CLAUDE.md +1 -0
- backspec-0.0.1/DESIGN.md +282 -0
- backspec-0.0.1/LICENSE +21 -0
- backspec-0.0.1/PKG-INFO +430 -0
- backspec-0.0.1/README.md +410 -0
- backspec-0.0.1/docs/pipeline.svg +117 -0
- backspec-0.0.1/pyproject.toml +31 -0
- backspec-0.0.1/src/backspec/__init__.py +16 -0
- backspec-0.0.1/src/backspec/host/__init__.py +0 -0
- backspec-0.0.1/src/backspec/host/adapters/__init__.py +0 -0
- backspec-0.0.1/src/backspec/host/adapters/cache.py +103 -0
- backspec-0.0.1/src/backspec/host/adapters/cache_admin.py +64 -0
- backspec-0.0.1/src/backspec/host/adapters/capabilities_file.py +39 -0
- backspec-0.0.1/src/backspec/host/adapters/claude_code.py +77 -0
- backspec-0.0.1/src/backspec/host/adapters/codex.py +67 -0
- backspec-0.0.1/src/backspec/host/adapters/fake.py +39 -0
- backspec-0.0.1/src/backspec/host/adapters/filesystem.py +50 -0
- backspec-0.0.1/src/backspec/host/adapters/review_yaml.py +33 -0
- backspec-0.0.1/src/backspec/host/adapters/treesitter.py +130 -0
- backspec-0.0.1/src/backspec/host/cli.py +313 -0
- backspec-0.0.1/src/backspec/host/composition.py +211 -0
- backspec-0.0.1/src/backspec/kernel/__init__.py +0 -0
- backspec-0.0.1/src/backspec/kernel/llm.py +64 -0
- backspec-0.0.1/src/backspec/kernel/prompts.py +10 -0
- backspec-0.0.1/src/backspec/kernel/templates.py +12 -0
- backspec-0.0.1/src/backspec/kernel/text.py +23 -0
- backspec-0.0.1/src/backspec/kernel/usage.py +50 -0
- backspec-0.0.1/src/backspec/modules/__init__.py +0 -0
- backspec-0.0.1/src/backspec/modules/capabilities/__init__.py +0 -0
- backspec-0.0.1/src/backspec/modules/capabilities/domain.py +108 -0
- backspec-0.0.1/src/backspec/modules/capabilities/facade.py +48 -0
- backspec-0.0.1/src/backspec/modules/capabilities/ports.py +21 -0
- backspec-0.0.1/src/backspec/modules/capabilities/use_cases.py +63 -0
- backspec-0.0.1/src/backspec/modules/discovery/__init__.py +0 -0
- backspec-0.0.1/src/backspec/modules/discovery/domain.py +87 -0
- backspec-0.0.1/src/backspec/modules/discovery/facade.py +16 -0
- backspec-0.0.1/src/backspec/modules/discovery/ports.py +14 -0
- backspec-0.0.1/src/backspec/modules/discovery/use_cases.py +19 -0
- backspec-0.0.1/src/backspec/modules/evidence/__init__.py +0 -0
- backspec-0.0.1/src/backspec/modules/evidence/domain.py +276 -0
- backspec-0.0.1/src/backspec/modules/evidence/facade.py +24 -0
- backspec-0.0.1/src/backspec/modules/evidence/ports.py +12 -0
- backspec-0.0.1/src/backspec/modules/evidence/use_cases.py +128 -0
- backspec-0.0.1/src/backspec/modules/extraction/__init__.py +0 -0
- backspec-0.0.1/src/backspec/modules/extraction/facade.py +6 -0
- backspec-0.0.1/src/backspec/modules/extraction/use_cases.py +228 -0
- backspec-0.0.1/src/backspec/modules/lint/__init__.py +0 -0
- backspec-0.0.1/src/backspec/modules/lint/domain.py +152 -0
- backspec-0.0.1/src/backspec/modules/lint/facade.py +7 -0
- backspec-0.0.1/src/backspec/modules/lint/use_cases.py +16 -0
- backspec-0.0.1/src/backspec/modules/report/__init__.py +0 -0
- backspec-0.0.1/src/backspec/modules/report/domain.py +128 -0
- backspec-0.0.1/src/backspec/modules/report/dto.py +92 -0
- backspec-0.0.1/src/backspec/modules/report/facade.py +11 -0
- backspec-0.0.1/src/backspec/modules/report/renderers.py +220 -0
- backspec-0.0.1/src/backspec/modules/report/use_cases.py +127 -0
- backspec-0.0.1/src/backspec/modules/requirements/__init__.py +0 -0
- backspec-0.0.1/src/backspec/modules/requirements/domain.py +272 -0
- backspec-0.0.1/src/backspec/modules/requirements/facade.py +26 -0
- backspec-0.0.1/src/backspec/modules/requirements/use_cases.py +135 -0
- backspec-0.0.1/src/backspec/modules/review/__init__.py +0 -0
- backspec-0.0.1/src/backspec/modules/review/domain.py +129 -0
- backspec-0.0.1/src/backspec/modules/review/facade.py +32 -0
- backspec-0.0.1/src/backspec/modules/review/ports.py +15 -0
- backspec-0.0.1/src/backspec/modules/review/use_cases.py +89 -0
- backspec-0.0.1/src/backspec/modules/staleness/__init__.py +0 -0
- backspec-0.0.1/src/backspec/modules/staleness/domain.py +75 -0
- backspec-0.0.1/src/backspec/modules/staleness/facade.py +17 -0
- backspec-0.0.1/src/backspec/modules/staleness/ports.py +7 -0
- backspec-0.0.1/src/backspec/modules/staleness/use_cases.py +39 -0
- backspec-0.0.1/src/backspec/modules/triage/__init__.py +0 -0
- backspec-0.0.1/src/backspec/modules/triage/domain.py +144 -0
- backspec-0.0.1/src/backspec/modules/triage/facade.py +24 -0
- backspec-0.0.1/src/backspec/modules/triage/use_cases.py +79 -0
- backspec-0.0.1/src/backspec/prompts/assess.md +32 -0
- backspec-0.0.1/src/backspec/prompts/assign.md +18 -0
- backspec-0.0.1/src/backspec/prompts/consolidate.md +52 -0
- backspec-0.0.1/src/backspec/prompts/observe.md +52 -0
- backspec-0.0.1/src/backspec/prompts/orient.md +33 -0
- backspec-0.0.1/src/backspec/prompts/synthesise.md +97 -0
- backspec-0.0.1/src/backspec/prompts/triage.md +34 -0
- backspec-0.0.1/src/backspec/py.typed +0 -0
- backspec-0.0.1/src/backspec/templates/libre-baskerville-400.woff2 +0 -0
- backspec-0.0.1/src/backspec/templates/libre-baskerville-700.woff2 +0 -0
- backspec-0.0.1/src/backspec/templates/libre-baskerville-OFL.txt +93 -0
- backspec-0.0.1/src/backspec/templates/report.html +336 -0
- backspec-0.0.1/tests/test_architecture.py +65 -0
- backspec-0.0.1/tests/test_budget.py +225 -0
- backspec-0.0.1/tests/test_cache_command.py +84 -0
- backspec-0.0.1/tests/test_capabilities_file.py +159 -0
- backspec-0.0.1/tests/test_codex.py +109 -0
- backspec-0.0.1/tests/test_consolidate.py +108 -0
- backspec-0.0.1/tests/test_coverage_command.py +97 -0
- backspec-0.0.1/tests/test_discovery.py +46 -0
- backspec-0.0.1/tests/test_evidence.py +79 -0
- backspec-0.0.1/tests/test_html.py +74 -0
- backspec-0.0.1/tests/test_lint.py +163 -0
- backspec-0.0.1/tests/test_pipeline.py +173 -0
- backspec-0.0.1/tests/test_renderers.py +239 -0
- backspec-0.0.1/tests/test_reuse.py +222 -0
- backspec-0.0.1/tests/test_review.py +232 -0
- backspec-0.0.1/tests/test_status.py +105 -0
- backspec-0.0.1/tests/test_syntax.py +351 -0
- backspec-0.0.1/tests/test_triage.py +296 -0
backspec-0.0.1/AGENTS.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Working on backspec
|
|
2
|
+
|
|
3
|
+
backspec reads a codebase and writes down the requirements it implements, with citations that are
|
|
4
|
+
checked in code. Read `README.md` first.
|
|
5
|
+
|
|
6
|
+
- One module per capability under `src/backspec/modules/<capability>/`: `domain.py` (rules and
|
|
7
|
+
models, no I/O), `ports.py` (what it needs from outside, as Protocols), `use_cases.py`, and a
|
|
8
|
+
small `facade.py`. Models that combine several modules go in `dto.py`.
|
|
9
|
+
- A domain imports only `backspec.kernel` and its own domain. A module reaches another module only
|
|
10
|
+
through that module's `facade`. Nothing under `modules/` or `kernel/` imports `backspec.host`.
|
|
11
|
+
- Adapters (file system, model backends, cache, YAML files) and wiring live in `src/backspec/host/`.
|
|
12
|
+
`host/cli.py` holds no logic: it turns flags into a `Config` and prints what comes back.
|
|
13
|
+
- The program drives and the model only reads and writes statements. Anything that can be
|
|
14
|
+
checked or computed in code is, never asked of a model. A model never writes a citation that
|
|
15
|
+
the program could copy.
|
|
16
|
+
- Nothing is dropped silently. What is rejected, skipped, unmatched or failed is recorded in the
|
|
17
|
+
result with its reason.
|
|
18
|
+
- Tests live flat in `tests/` as `test_*.py` and run against `backspec.host.adapters.fake.FakeLLM`.
|
|
19
|
+
Name a test for the behaviour it shows.
|
|
20
|
+
- Change `PROMPT_VERSION` in `src/backspec/kernel/prompts.py` whenever a prompt changes.
|
|
21
|
+
- Run `python3 -m pytest -q` before you finish. It must pass, including `tests/test_architecture.py`.
|
backspec-0.0.1/CLAUDE.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@AGENTS.md
|
backspec-0.0.1/DESIGN.md
ADDED
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
<!-- Source: https://designmd.ai/chef/thoughtstream (downloaded 2026-11-13). The HTML report in
|
|
2
|
+
src/backspec/templates/report.html follows this file. The report adds a dark palette, which this file does not define. -->
|
|
3
|
+
|
|
4
|
+
# ThoughtStream
|
|
5
|
+
|
|
6
|
+
Minimal, zen, distraction-free.
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
ThoughtStream is a contemplative design system built for minimalist personal blogs and newsletters. It embraces generous white space as a design element, letting words breathe and ideas settle. The warm, neutral palette recedes behind content, creating a reading experience that feels like a well-set page in a quiet room. Every decision prioritizes reading flow and typographic clarity over ornament.
|
|
11
|
+
|
|
12
|
+
## Colors
|
|
13
|
+
|
|
14
|
+
### Brand Palette
|
|
15
|
+
|
|
16
|
+
| Token | Hex | Role |
|
|
17
|
+
|-----------|-----------|--------------------------------------------|
|
|
18
|
+
| Primary | `#78716C` | Stone — anchors UI elements, links, icons |
|
|
19
|
+
| Secondary | `#A8A29E` | Sage — supporting accents, dividers |
|
|
20
|
+
| Tertiary | `#1C1917` | Warm Black — emphasis, strong headings |
|
|
21
|
+
|
|
22
|
+
### Surface Palette
|
|
23
|
+
|
|
24
|
+
| Token | Hex | Role |
|
|
25
|
+
|----------------|-----------|----------------------------------------|
|
|
26
|
+
| Background | `#FAFAF9` | Warm white page background |
|
|
27
|
+
| Surface | `#F5F5F4` | Card and section backgrounds |
|
|
28
|
+
| Surface Raised | `#EFEDEB` | Hover states, subtle callout blocks |
|
|
29
|
+
|
|
30
|
+
### Content Palette
|
|
31
|
+
|
|
32
|
+
| Token | Hex | Role |
|
|
33
|
+
|----------------|-----------|---------------------------------------|
|
|
34
|
+
| Text Primary | `#1C1917` | Body copy, headings |
|
|
35
|
+
| Text Secondary | `#57534E` | Bylines, metadata, captions |
|
|
36
|
+
| Text Tertiary | `#A8A29E` | Placeholders, disabled labels |
|
|
37
|
+
|
|
38
|
+
### Border Palette
|
|
39
|
+
|
|
40
|
+
| Token | Hex |
|
|
41
|
+
|---------------|-----------|
|
|
42
|
+
| Border Subtle | `#E7E5E4` |
|
|
43
|
+
| Border Medium | `#D6D3D1` |
|
|
44
|
+
| Border Strong | `#A8A29E` |
|
|
45
|
+
|
|
46
|
+
### Semantic Colors
|
|
47
|
+
|
|
48
|
+
| Token | Hex |
|
|
49
|
+
|---------|-----------|
|
|
50
|
+
| Success | `#65A30D` |
|
|
51
|
+
| Warning | `#CA8A04` |
|
|
52
|
+
| Error | `#DC2626` |
|
|
53
|
+
| Info | `#78716C` |
|
|
54
|
+
|
|
55
|
+
## Typography
|
|
56
|
+
|
|
57
|
+
### Font Stack
|
|
58
|
+
|
|
59
|
+
| Role | Font |
|
|
60
|
+
|------------------|---------------------------------------------------|
|
|
61
|
+
| Display/Headings | Libre Baskerville, Georgia, 'Times New Roman', serif |
|
|
62
|
+
| UI/Body | Inter, -apple-system, 'Segoe UI', Helvetica, sans-serif |
|
|
63
|
+
| Mono/Code | Source Code Pro, 'Fira Code', Consolas, monospace |
|
|
64
|
+
|
|
65
|
+
### Type Scale
|
|
66
|
+
|
|
67
|
+
| Level | Font | Size | Weight | Line Height | Letter Spacing | Usage |
|
|
68
|
+
|--------------|-------------------|--------|--------|-------------|----------------|------------------------------|
|
|
69
|
+
| Display | Libre Baskerville | 40px | 700 | 1.2 | -0.02em | Hero article titles |
|
|
70
|
+
| Headline | Libre Baskerville | 30px | 700 | 1.3 | -0.015em | Post titles |
|
|
71
|
+
| Subhead | Libre Baskerville | 22px | 400 | 1.4 | -0.01em | Section headings |
|
|
72
|
+
| Body Large | Inter | 20px | 400 | 1.75 | 0 | Featured paragraph, lede |
|
|
73
|
+
| Body | Inter | 17px | 400 | 1.8 | 0 | Default reading text |
|
|
74
|
+
| Body Small | Inter | 15px | 400 | 1.7 | 0 | Sidebar text, footnotes |
|
|
75
|
+
| Caption | Inter | 13px | 400 | 1.5 | 0.01em | Image captions, dates |
|
|
76
|
+
| Overline | Inter | 11px | 600 | 1.4 | 0.08em | Category labels |
|
|
77
|
+
| Code | Source Code Pro | 15px | 400 | 1.7 | 0 | Inline code, code blocks |
|
|
78
|
+
|
|
79
|
+
## Spacing
|
|
80
|
+
|
|
81
|
+
| Property | Value |
|
|
82
|
+
|-----------------------------|---------|
|
|
83
|
+
| Base unit | 12px |
|
|
84
|
+
| Scale | 12, 24, 36, 48, 60, 72, 96, 120 |
|
|
85
|
+
| Component padding — small | 12px |
|
|
86
|
+
| Component padding — medium | 24px |
|
|
87
|
+
| Component padding — large | 48px |
|
|
88
|
+
| Section spacing — mobile | 60px |
|
|
89
|
+
| Section spacing — tablet | 84px |
|
|
90
|
+
| Section spacing — desktop | 120px |
|
|
91
|
+
|
|
92
|
+
## Border Radius
|
|
93
|
+
|
|
94
|
+
| Token | Value | Usage |
|
|
95
|
+
|--------|--------|----------------------------------|
|
|
96
|
+
| None | 0px | All elements — default |
|
|
97
|
+
| Small | 0px | Not used |
|
|
98
|
+
| Medium | 0px | Not used |
|
|
99
|
+
| Large | 0px | Not used |
|
|
100
|
+
| XL | 0px | Not used |
|
|
101
|
+
| Full | 9999px | Avatars only |
|
|
102
|
+
|
|
103
|
+
All interactive and container elements use sharp, geometric edges (0px radius). Only avatars use full rounding.
|
|
104
|
+
|
|
105
|
+
## Shadows
|
|
106
|
+
|
|
107
|
+
**Philosophy:** ThoughtStream is completely flat. No shadows are used. Separation is achieved exclusively through borders and white space.
|
|
108
|
+
|
|
109
|
+
| Level | CSS Value | Usage |
|
|
110
|
+
|---------|-----------|---------------------------------|
|
|
111
|
+
| Subtle | `none` | — |
|
|
112
|
+
| Medium | `none` | — |
|
|
113
|
+
| Large | `none` | — |
|
|
114
|
+
| Overlay | `none` | — |
|
|
115
|
+
|
|
116
|
+
**Special — Focus Ring:** `0 0 0 2px #FAFAF9, 0 0 0 4px #78716C` — used for keyboard focus indicators.
|
|
117
|
+
|
|
118
|
+
## Components
|
|
119
|
+
|
|
120
|
+
### Buttons
|
|
121
|
+
|
|
122
|
+
**Primary**
|
|
123
|
+
- Background: `#78716C`
|
|
124
|
+
- Text: `#FAFAF9`
|
|
125
|
+
- Border: `1px solid #78716C`
|
|
126
|
+
- Padding: 12px 24px
|
|
127
|
+
- Font: Inter, 15px, weight 600
|
|
128
|
+
- Radius: 0px
|
|
129
|
+
- Hover: Background `#57534E`
|
|
130
|
+
- Active: Background `#44403C`
|
|
131
|
+
|
|
132
|
+
**Secondary**
|
|
133
|
+
- Background: transparent
|
|
134
|
+
- Text: `#78716C`
|
|
135
|
+
- Border: `1px solid #D6D3D1`
|
|
136
|
+
- Padding: 12px 24px
|
|
137
|
+
- Font: Inter, 15px, weight 600
|
|
138
|
+
- Radius: 0px
|
|
139
|
+
- Hover: Background `#F5F5F4`
|
|
140
|
+
- Active: Background `#E7E5E4`
|
|
141
|
+
|
|
142
|
+
**Ghost**
|
|
143
|
+
- Background: transparent
|
|
144
|
+
- Text: `#78716C`
|
|
145
|
+
- Border: none
|
|
146
|
+
- Padding: 12px 24px
|
|
147
|
+
- Font: Inter, 15px, weight 600
|
|
148
|
+
- Radius: 0px
|
|
149
|
+
- Hover: Background `#F5F5F4`
|
|
150
|
+
- Active: Background `#E7E5E4`
|
|
151
|
+
|
|
152
|
+
**Destructive**
|
|
153
|
+
- Background: `#DC2626`
|
|
154
|
+
- Text: `#FAFAF9`
|
|
155
|
+
- Border: `1px solid #DC2626`
|
|
156
|
+
- Padding: 12px 24px
|
|
157
|
+
- Font: Inter, 15px, weight 600
|
|
158
|
+
- Radius: 0px
|
|
159
|
+
- Hover: Background `#B91C1C`
|
|
160
|
+
- Active: Background `#991B1B`
|
|
161
|
+
|
|
162
|
+
**Sizes:** Small 8px 16px / 13px, Medium 12px 24px / 15px, Large 16px 36px / 17px
|
|
163
|
+
|
|
164
|
+
**Disabled:** Opacity 0.4, cursor not-allowed, no hover change.
|
|
165
|
+
|
|
166
|
+
### Cards
|
|
167
|
+
|
|
168
|
+
**Default**
|
|
169
|
+
- Background: `#FAFAF9`
|
|
170
|
+
- Border: `1px solid #E7E5E4`
|
|
171
|
+
- Radius: 0px
|
|
172
|
+
- Padding: 36px
|
|
173
|
+
- Shadow: none
|
|
174
|
+
- Hover: Border `#D6D3D1`
|
|
175
|
+
|
|
176
|
+
**Elevated**
|
|
177
|
+
- Background: `#F5F5F4`
|
|
178
|
+
- Border: `1px solid #D6D3D1`
|
|
179
|
+
- Radius: 0px
|
|
180
|
+
- Padding: 36px
|
|
181
|
+
- Shadow: none
|
|
182
|
+
|
|
183
|
+
### Inputs
|
|
184
|
+
|
|
185
|
+
**Text Input**
|
|
186
|
+
- Height: 48px
|
|
187
|
+
- Background: `#FAFAF9`
|
|
188
|
+
- Border: `1px solid #D6D3D1`
|
|
189
|
+
- Radius: 0px
|
|
190
|
+
- Padding: 12px 16px
|
|
191
|
+
- Font: Inter, 15px, weight 400
|
|
192
|
+
- Text color: `#1C1917`
|
|
193
|
+
- Placeholder color: `#A8A29E`
|
|
194
|
+
- Focus: Border `#78716C`, ring `0 0 0 2px #FAFAF9, 0 0 0 4px #78716C`
|
|
195
|
+
- Error: Border `#DC2626`
|
|
196
|
+
- Disabled: Background `#F5F5F4`, opacity 0.5
|
|
197
|
+
|
|
198
|
+
**Label:** Inter, 13px, weight 600, color `#57534E`, margin-bottom 8px.
|
|
199
|
+
|
|
200
|
+
**Helper Text:** Inter, 13px, weight 400, color `#A8A29E`, margin-top 6px. Error helper color `#DC2626`.
|
|
201
|
+
|
|
202
|
+
### Chips
|
|
203
|
+
|
|
204
|
+
**Filter Chip**
|
|
205
|
+
- Background: transparent
|
|
206
|
+
- Border: `1px solid #D6D3D1`
|
|
207
|
+
- Radius: 0px
|
|
208
|
+
- Padding: 6px 14px
|
|
209
|
+
- Font: Inter, 13px, weight 500
|
|
210
|
+
- Text: `#57534E`
|
|
211
|
+
- Selected: Background `#78716C`, text `#FAFAF9`, border `#78716C`
|
|
212
|
+
|
|
213
|
+
**Status Chip**
|
|
214
|
+
- Padding: 4px 12px
|
|
215
|
+
- Font: Inter, 11px, weight 600, uppercase
|
|
216
|
+
- Radius: 0px
|
|
217
|
+
- Success: Background `#F0FDF4`, text `#65A30D`, border `1px solid #BBF7D0`
|
|
218
|
+
- Warning: Background `#FEFCE8`, text `#CA8A04`, border `1px solid #FEF08A`
|
|
219
|
+
- Error: Background `#FEF2F2`, text `#DC2626`, border `1px solid #FECACA`
|
|
220
|
+
|
|
221
|
+
### Lists
|
|
222
|
+
|
|
223
|
+
**Default List Item**
|
|
224
|
+
- Padding: 16px 0
|
|
225
|
+
- Border bottom: `1px solid #E7E5E4`
|
|
226
|
+
- Font: Inter, 15px, weight 400
|
|
227
|
+
- Text: `#1C1917`
|
|
228
|
+
- Secondary text: `#A8A29E`, 13px
|
|
229
|
+
- Hover: Background `#F5F5F4`
|
|
230
|
+
- Active: Background `#EFEDEB`
|
|
231
|
+
- Leading element: 20px icon, color `#78716C`
|
|
232
|
+
|
|
233
|
+
### Checkboxes
|
|
234
|
+
|
|
235
|
+
- Size: 18px
|
|
236
|
+
- Border: `1.5px solid #D6D3D1`
|
|
237
|
+
- Radius: 0px
|
|
238
|
+
- Background: `#FAFAF9`
|
|
239
|
+
- Checked: Background `#78716C`, border `#78716C`, checkmark `#FAFAF9`
|
|
240
|
+
- Indeterminate: Background `#78716C`, dash `#FAFAF9`
|
|
241
|
+
- Hover: Border `#78716C`
|
|
242
|
+
- Focus: Ring `0 0 0 2px #FAFAF9, 0 0 0 4px #78716C`
|
|
243
|
+
- Disabled: Opacity 0.4
|
|
244
|
+
- Label: Inter, 15px, weight 400, margin-left 10px
|
|
245
|
+
|
|
246
|
+
### Radio Buttons
|
|
247
|
+
|
|
248
|
+
- Size: 18px
|
|
249
|
+
- Border: `1.5px solid #D6D3D1`
|
|
250
|
+
- Radius: 9999px
|
|
251
|
+
- Background: `#FAFAF9`
|
|
252
|
+
- Selected: Border `#78716C`, inner dot `#78716C` (8px)
|
|
253
|
+
- Hover: Border `#78716C`
|
|
254
|
+
- Focus: Ring `0 0 0 2px #FAFAF9, 0 0 0 4px #78716C`
|
|
255
|
+
- Disabled: Opacity 0.4
|
|
256
|
+
- Label: Inter, 15px, weight 400, margin-left 10px
|
|
257
|
+
|
|
258
|
+
### Tooltips
|
|
259
|
+
|
|
260
|
+
- Background: `#1C1917`
|
|
261
|
+
- Text: `#FAFAF9`
|
|
262
|
+
- Font: Inter, 13px, weight 500
|
|
263
|
+
- Padding: 8px 14px
|
|
264
|
+
- Radius: 0px
|
|
265
|
+
- Max width: 240px
|
|
266
|
+
- Arrow: 6px, same background
|
|
267
|
+
- Delay: 300ms enter, 0ms leave
|
|
268
|
+
- Shadow: none
|
|
269
|
+
|
|
270
|
+
## Do's and Don'ts
|
|
271
|
+
|
|
272
|
+
1. **Do** let white space dominate — margins and padding should feel generous and contemplative.
|
|
273
|
+
2. **Do** keep headlines in Libre Baskerville for literary warmth; never use it for UI labels.
|
|
274
|
+
3. **Do** use `#E7E5E4` hairline borders to separate sections instead of shadows or color blocks.
|
|
275
|
+
4. **Don't** add decorative elements, gradients, or illustrations that compete with the text.
|
|
276
|
+
5. **Don't** use more than two font weights on a single screen — restraint is the ethos.
|
|
277
|
+
6. **Do** set body text at 17px or above with 1.8 line height for comfortable long-form reading.
|
|
278
|
+
7. **Don't** use color to convey meaning alone — pair with text or icons for accessibility.
|
|
279
|
+
8. **Do** maintain a maximum content width of 680px for body text to preserve optimal reading measure.
|
|
280
|
+
9. **Don't** introduce rounded corners — sharp edges reinforce the clean geometric identity.
|
|
281
|
+
10. **Do** favor vertical rhythm aligned to the 12px base unit across all spacing decisions.
|
|
282
|
+
|
backspec-0.0.1/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Adi Eyal
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|