figura-cli 0.24.1 → 0.26.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.
@@ -8,21 +8,41 @@ so it can't drift). This page is only orientation + one worked example.
8
8
 
9
9
  Two halves:
10
10
  - **`identity`** — the SHARED brand (same on every platform): `colors`
11
- (`[{ name, hex, role?, meaning? }]`), `gradient?`, `type?`
12
- (`{ families?: { slot: fontName }, ramp?: number[], rules? }`), `spacing?`,
13
- `radius?`, `voice?` (`{ nouns?, promise?, lines?, tone? }`), `forbidden?`
14
- (`[{ id?, rule }]`).
11
+ (`[{ name, hex, role?, meaning? }]`), `gradient?`,
12
+ `signature?` (`{ kind: "solid" | "gradient" | "iridescent", stops?: hex[] }`),
13
+ `type?` (`{ families?: { slot: fontName }, ramp?: number[], rules? }`), `spacing?`,
14
+ `radius?`, `voice?` (`{ nouns?, promise?, lines?, tone? }`), `locales?`
15
+ (`[{ tag, script, direction, fonts?: { display?, body?, mono? } }]` — the
16
+ languages the product ships: BCP-47 `tag` ("en", "ar", "ckb"), ISO 15924
17
+ `script` ("Latn", "Arab"), `direction` `ltr`|`rtl`; the FIRST entry is the
18
+ default; per-locale `fonts` override the shared type families for that
19
+ script), `forbidden?` (`[{ id?, rule }]`).
20
+
21
+ `signature` is the brand page's hero treatment. The rule: **solid unless the
22
+ repo's tokens define a gradient identity** — a signature gradient named in the
23
+ design system, not a stray mention of the word (a "avoid gradients" guardrail is
24
+ a solid brand). `gradient`/`iridescent` require 2–5 `stops` (the gradient's own
25
+ hexes, in order). Omit the field entirely for a plain solid-accent brand.
15
26
  - **`platforms`** — a map keyed by `mobile` / `web` / `desktop`. Include ONLY the
16
27
  platforms the product targets. Each surface: `components?` (`[{ name, spec }]`),
17
28
  `icons?`, `layout?`, `surfaces?` (this product's real areas), `bans?`,
18
29
  `tokensBlock?` (the prose ESCAPE HATCH for guidance that genuinely doesn't fit a
19
- structured field — use sparingly).
30
+ structured field — use sparingly). `mobile` also takes `os?` (`"ios"` |
31
+ `"android"`), which drives the fig's device frame and OS chrome geometry;
32
+ unset means iOS. `os` on `web`/`desktop` is rejected.
20
33
 
21
34
  Validation the schema enforces (a violation is a 400 at `PUT /brand`): **strict
22
35
  keys** (an unknown/misspelled key is rejected); **hex** = `#` + exactly 3/4/6/8
23
36
  digits; **no blank** array entries; platform keys exactly `mobile`/`web`/`desktop`;
24
- caps on array lengths + string lengths (the fetched schema carries the exact
25
- numbers). Author against the fetched schema, not these prose notes.
37
+ `locales` when present needs >= 1 entry with unique tags; caps on array lengths +
38
+ string lengths (the fetched schema carries the exact numbers). Author against the
39
+ fetched schema, not these prose notes.
40
+
41
+ Locales drive fig generation: the scaffold states them, `fig create --locale ar`
42
+ (or the `locale` param on `figura_create_fig`/`figura_revise_fig`) stamps
43
+ `<html lang dir>` and loads a per-script font — a family that does not cover the
44
+ script (Inter has no Arabic) resolves to a recorded fallback instead of a silent
45
+ browser substitute.
26
46
 
27
47
  ## Worked example — a web/desktop brand ("Ledgerline")
28
48
 
@@ -36,6 +56,7 @@ numbers). Author against the fetched schema, not these prose notes.
36
56
  { "name": "Ink", "hex": "#101312", "role": "ground", "meaning": "near-black base background" }
37
57
  ],
38
58
  "gradient": "linear-gradient(90deg, #1F6F54, #C9A227)",
59
+ "signature": { "kind": "gradient", "stops": ["#1F6F54", "#C9A227"] },
39
60
  "type": {
40
61
  "families": { "display": "Fraunces", "body": "Inter", "mono": "JetBrains Mono" },
41
62
  "ramp": [12, 14, 16, 18, 20, 24, 30, 36, 48],
@@ -43,6 +64,10 @@ numbers). Author against the fetched schema, not these prose notes.
43
64
  },
44
65
  "spacing": [4, 8, 12, 16, 20, 24, 32, 40, 48, 64],
45
66
  "radius": [4, 8, 12, 999],
67
+ "locales": [
68
+ { "tag": "en", "script": "Latn", "direction": "ltr" },
69
+ { "tag": "ar", "script": "Arab", "direction": "rtl", "fonts": { "body": "IBM Plex Sans Arabic" } }
70
+ ],
46
71
  "voice": {
47
72
  "nouns": ["ledger", "balance", "month-end"],
48
73
  "promise": "Books, balanced.",
@@ -1,13 +1,13 @@
1
1
  {
2
- "$comment": "Skill version manifest (#752) the source of truth for each Figura skill's OWN version line, DECOUPLED from the figura-cli package version. A release bumps the version here when a skill's content changes, then regenerates the engine seed (bun packages/core/scripts/build-skill-seed.mjs) and re-seeds. Version is a date tag (YYYY.MM.DD[.n]); releasedAt is ISO-8601. The CLI/MCP stamp this version into .figura-version at install; the engine seeds the registry from it.",
2
+ "$comment": "Skill version manifest (#752) \u2014 the source of truth for each Figura skill's OWN version line, DECOUPLED from the figura-cli package version. A release bumps the version here when a skill's content changes, then regenerates the engine seed (bun packages/core/scripts/build-skill-seed.mjs) and re-seeds. Version is a date tag (YYYY.MM.DD[.n]); releasedAt is ISO-8601. The CLI/MCP stamp this version into .figura-version at install; the engine seeds the registry from it.",
3
3
  "skills": {
4
4
  "fig": {
5
- "version": "2026.08.04",
6
- "releasedAt": "2026-08-04T17:44:19.938Z"
5
+ "version": "2026.08.27",
6
+ "releasedAt": "2026-08-27T00:00:00.000Z"
7
7
  },
8
8
  "figura-brand": {
9
- "version": "2026.07.26",
10
- "releasedAt": "2026-07-26T00:00:00.000Z"
9
+ "version": "2026.08.25.2",
10
+ "releasedAt": "2026-08-26T00:00:00.000Z"
11
11
  }
12
12
  }
13
13
  }