@cloudgrid-io/ui 0.23.0 → 0.25.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/dist/tokens.css CHANGED
@@ -44,6 +44,39 @@
44
44
  --cg-primary: #5a47f0;
45
45
  --cg-secondary: #b6de68;
46
46
  --cg-tertiary: #60e9f0;
47
+ /*
48
+ SOURCE: the founder's 2026-09-10 draft, "Accent", RETUNED. The draft value is
49
+ #086FFF and this is #0061f0.
50
+
51
+ The blue is the fourth brand hue and it has one job the other three do not: the
52
+ draft spends it on WORDS. "View All", "Explore All", "+ New" are 15px links, so
53
+ the bar is 4.5:1 (WCAG 1.4.3) and not the 3:1 an indicator gets.
54
+
55
+ #086FFF on the page ground #f1f1f6 : 3.94:1 <-- under the text floor
56
+ #086FFF on the card #ffffff : 4.44:1 <-- also under it
57
+ #0061f0 on the page ground : 4.70:1
58
+ #0061f0 on the card : 5.29:1
59
+ white on #0061f0 : 5.29:1
60
+
61
+ Derived rather than picked: the draft value in OKLCH is L 0.581 C 0.230 h -1.749,
62
+ and this is the same hue and chroma walked down in lightness until the page
63
+ ground clears the floor. The nearest passing value on that ray is #0064f4 at
64
+ 4.5089:1, which clears by 0.009 — a margin a later ground retune would erase in
65
+ silence — so it is taken one step further to 4.70:1. That margin practice is
66
+ --cg-neutral-500's, which holds 3.27:1 against a 3:1 bar for the same reason.
67
+
68
+ DECLARED AT :root ONLY, like every other value in this group. A brand hue is not
69
+ a semantic and does not flip; the semantics that SPEND it do. Measured, so the
70
+ next person does not have to:
71
+
72
+ #0061f0 on the purple panel #5a47f0 : 1.10:1 invisible
73
+ #0061f0 on ink #222222 : 3.00:1 an indicator, never a word
74
+
75
+ which is why --cg-link is #ffffff inside both surface scopes rather than this
76
+ value. On the ink surface --cg-text-accent is already the lime, and on the panel
77
+ it is white; the accent role has an on-surface answer in both places and none of
78
+ them is this blue. Do not "fix" that by copying this value into a dark scope. */
79
+ --cg-accent: #0061f0;
47
80
 
48
81
  /* ---- danger ----
49
82
  danger (PLACEHOLDER, not a brand value)
@@ -356,6 +389,16 @@
356
389
  --cg-primary-tint: #eeecfe;
357
390
  --cg-secondary-press: #a6cf57;
358
391
  --cg-tertiary-press: #4dd8e0;
392
+ /*
393
+ The pressed and hovered rung of the accent, and --cg-link-hover.
394
+
395
+ Derived with the step --cg-primary-press takes from --cg-primary rather than
396
+ chosen: OKLCH L -0.0494, C -0.0078, hue held. One recipe for all four brand
397
+ hues means a retune of any one of them moves its press with it.
398
+
399
+ 5.79:1 on the page ground and 6.52:1 on the card, so a link that darkens on
400
+ hover never crosses a floor on the way. */
401
+ --cg-accent-press: #0052da;
359
402
 
360
403
  /* ---- neutrals ---- */
361
404
  --cg-neutral-0: #ffffff;
@@ -448,24 +491,70 @@
448
491
  --cg-focus-ring: rgba(90, 71, 240, 0.28);
449
492
 
450
493
  /* ---- link ---- */
451
- --cg-link: var(--cg-text-primary);
452
- --cg-link-hover: var(--cg-primary);
494
+ /*
495
+ The blue, not the ink. The founder's 2026-09-10 draft paints "View All",
496
+ "Explore All" and "+ New" in the accent, which is the role the fourth brand hue
497
+ was added for.
498
+
499
+ Was {semantic-text.text-primary}: an ink link with a purple hover, which is a
500
+ link that is invisible as a link until the pointer is over it. 4.70:1 on the
501
+ page ground.
502
+
503
+ Both surface scopes override it to #ffffff and keep the lime hover, unchanged by
504
+ this. The accent is a light-surface value and says so in its own note. */
505
+ --cg-link: var(--cg-accent);
506
+ /*
507
+ A darkening of the link's own hue rather than a jump to another one. Was
508
+ {brand.primary}, which read as a visited-link colour change once the resting
509
+ state stopped being ink. */
510
+ --cg-link-hover: var(--cg-accent-press);
453
511
 
454
512
  /* ---- type-families ----
455
- H1 is Futura Condensed Extra Bold where it is installed. It is a licensed
456
- face, NOT a webfont, so Saira Semi Condensed 800 is the self-hosted
457
- fallback that keeps every H1 heavy and condensed everywhere else. Drop the
458
- licensed woff2 in and it takes over with no other change. */
459
- --cg-font-display: 'Futura Condensed ExtraBold', 'Futura Condensed', 'Saira Semi Condensed Variable', 'Saira Semi Condensed', 'Arial Narrow', sans-serif;
513
+ One face. The founder's 2026-09-10 draft (#197) is set in Manrope throughout
514
+ its only text styles are Manrope Medium 22, SemiBold 15 and Regular 13 so the
515
+ display rung is Manrope too and the condensed face is retired.
516
+
517
+ What that replaced: Futura Condensed Extra Bold where it was installed, with
518
+ Saira Semi Condensed 800 self-hosted as the stand-in everywhere else. Neither is
519
+ loaded any more. --cg-font-display is still its OWN stack rather than an alias of
520
+ the body one, so a future display face is a one-value edit here and not a
521
+ re-plumbing.
522
+
523
+ The mono face is untouched: it is used only inside prompt and terminal surfaces
524
+ and the draft says nothing about it. */
525
+ /*
526
+ The display rung, now Manrope (#197). Identical to --cg-font-body today and
527
+ deliberately still a separate token.
528
+
529
+ A consumer that wants the licensed Futura back puts it in front of this stack in
530
+ its own :root and changes nothing else. Note that the blocks reading this rung
531
+ also set `uppercase` and --cg-display-tracking, which were tuned for a condensed
532
+ 800; they still render, in Manrope, and whether the lockups keep the uppercase is
533
+ a block decision rather than a token one (#203). */
534
+ --cg-font-display: 'Manrope Variable', 'Manrope', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
460
535
  --cg-font-body: 'Manrope Variable', 'Manrope', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
461
536
  --cg-font-mono: 'JetBrains Mono Variable', 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
462
537
 
463
538
  /* ---- weights ----
464
- weights (Manrope ships 400/500/700) */
539
+ weights. Manrope Variable carries the whole 200-800 axis; the brand uses four of
540
+ them — 400 / 500 / 600 / 700 (#197). */
465
541
  --cg-weight-regular: 400;
466
542
  --cg-weight-medium: 500;
467
- --cg-weight-bold: 700;
468
- --cg-weight-display: 800;
543
+ /*
544
+ SemiBold, not Bold. The draft's "Body Bold" style is Manrope SemiBold 600 at
545
+ 15/1.46, and 600 is what this rung has to be for `font-bold` to render it (#197).
546
+
547
+ Was 700. Manrope at 700 next to the draft's 600 reads a weight heavier than the
548
+ design everywhere the token is spent, and the alternative — a new
549
+ --cg-weight-semibold that no component reads, beside a --cg-weight-bold that is
550
+ now wrong — would have left the wrong value reachable under the obvious name. */
551
+ --cg-weight-bold: 600;
552
+ /*
553
+ The display rung, reachable as `font-heavy` (`font-display` is the family; see
554
+ theme.css). 700 rather than 800 since the face became Manrope (#197): the brand
555
+ loads 400/500/600/700 and the 800 end of the axis belonged to the condensed
556
+ face's own weight. */
557
+ --cg-weight-display: 700;
469
558
 
470
559
  /* ---- h1-display-ramp ----
471
560
  H1 display ramp: uppercase, condensed, Primary or white
@@ -481,12 +570,25 @@
481
570
  --cg-display-tracking: 0.012em;
482
571
 
483
572
  /* ---- manrope-ramp ---- */
484
- --cg-heading-lg: 24px;
573
+ /*
574
+ SOURCE: the founder's 2026-09-10 draft, "H4" — Manrope Medium 22/1.2 (#197).
575
+
576
+ Was 24px. This is the section-heading rung: CardGrid, Carousel and PricingTiers
577
+ each render an h2 as `text-heading-lg font-medium text-ink`, which is the draft's
578
+ H4 exactly ("My Creations", "Most Popular", "On the Grid"). */
579
+ --cg-heading-lg: 22px;
485
580
  /* SOURCE: card title */
486
581
  --cg-heading-md: 20px;
487
582
  /* SOURCE: step title */
488
583
  --cg-heading-sm: 17px;
489
- --cg-heading-line: 1.3;
584
+ /*
585
+ SOURCE: the draft's H4 line height (#197). Was 1.3.
586
+
587
+ One leading serves all three heading rungs, so the 17px and 20px rungs tighten
588
+ with the 22px one. That is the draft's own proportion rather than an
589
+ extrapolation, and a heading is short enough that 1.2 does not cost a line its
590
+ descenders. */
591
+ --cg-heading-line: 1.2;
490
592
  /* SOURCE: H1 subline */
491
593
  --cg-body-lg: 19px;
492
594
  /* SOURCE: default UI text */
@@ -495,7 +597,13 @@
495
597
  --cg-body-sm: 15px;
496
598
  /* SOURCE: footer, helper */
497
599
  --cg-caption: 13px;
498
- --cg-body-line: 1.5;
600
+ /*
601
+ SOURCE: the draft's "Body Bold" and "Small" both carry 1.46 (#197). Was 1.5.
602
+
603
+ It serves every body rung and the caption, which is what makes the draft's two
604
+ body styles land whole: Body Bold is --cg-body-sm at 15/1.46 and Small is
605
+ --cg-caption at 13/1.46, both already the right size. */
606
+ --cg-body-line: 1.46;
499
607
  --cg-body-tracking: 0em;
500
608
  --cg-mono-size: 14px;
501
609
  --cg-mono-line: 1.7;
@@ -611,26 +719,38 @@
611
719
  The live/current INDICATOR — the dot in its halo, and the brand mark. Never
612
720
  decorative, never a fill.
613
721
 
614
- MEASURED 1.21:1 on white, which is below every bar there is. It works on the
615
- panel (4.82:1) and on ink (13.13:1); on the page ground it reads only because
616
- it is paired with volt-ink in a pill. Recorded rather than
617
- silently corrected: darkening it would change the Console's appearance, which
618
- is a design decision and not a contrast fix.
722
+ AN ALIAS of --cg-secondary as of the 2026-09-10 re-skin (#197), which is the
723
+ answer to the question this note used to hold open. It was #b6ff2e, a SECOND
724
+ lime 36 dE from the brand's own, and the note asked which one the brand owns.
725
+ The founder's draft carries exactly one lime, #b6de68, and it is --cg-secondary:
726
+ the Most Popular bars are painted in it and #b6ff2e appears nowhere.
727
+
728
+ So the hue is retired and the NAME is kept. Every surface that draws a live mark
729
+ keeps writing --cg-volt, --cg-live-halo follows through the color-mix it already
730
+ had, and nothing downstream has to know the value moved. The alias is deliberate
731
+ in the same way --cg-pending's is: one value today, two names, so the mark and
732
+ the brand hue can part later with a one-line edit here.
619
733
 
620
- Note it is a SECOND lime beside --cg-secondary (#b6de68), 36 dE away. Which one
621
- the brand owns is the open question here.
734
+ Measured, on both sides of the move:
622
735
 
623
- It is also a second LIVE. state.online (#00a05c) is the same idea in the state
624
- scale, and EntityStatus (#116) already paints the live dot with it. They are not
625
- interchangeable at any bar — online is 3.40:1 on white, volt is 1.21:1 — so a
626
- surface must not swap one for the other on the assumption that both mean
627
- 'serving'. Which name the brand keeps for live belongs to the same open question,
628
- and until it is answered volt is the Console's brand mark and online is the
629
- entity's state. */
630
- --cg-volt: #b6ff2e;
736
+ #b6ff2e on white : 1.21:1 #b6de68 on white : 1.53:1
737
+ --cg-volt-ink on it : 9.94:1 --cg-volt-ink on it : 7.82:1
738
+
739
+ Still below every text bar on white, and still recorded rather than corrected:
740
+ it reads because it is paired with --cg-volt-ink in a pill, it works on the panel
741
+ and on ink, and darkening it would be a design decision rather than a contrast
742
+ fix. The halo lightens with it, from #e8ffbc to #e8f4cf composited over white.
743
+
744
+ It is still a second LIVE beside state.online (#00a05c), and they are still not
745
+ interchangeable — online is 3.40:1 on white and this is 1.53:1. volt is the
746
+ brand mark; online is the entity's state. */
747
+ --cg-volt: var(--cg-secondary);
631
748
  /*
632
- Text and glyphs ON volt. 9.95:1 against it the one part of the volt family that
633
- is comfortably legible.
749
+ Text and glyphs ON volt. 7.82:1 against it, re-measured for the 2026-09-10
750
+ re-skin (#197) when volt became an alias of --cg-secondary: it was 9.94:1
751
+ against the old #b6ff2e. Unchanged in value, because 7.82:1 is comfortably over
752
+ the 4.5:1 text floor and re-deriving a value that still holds would move a
753
+ colour for arithmetic's sake.
634
754
 
635
755
  This is NOT the state -ink that EntityStatus (#116) says the library lacks. That
636
756
  note wants a foreground for the WORD on a state chip, and the arrangement it
@@ -734,7 +854,21 @@
734
854
 
735
855
  /* ---- link ---- */
736
856
  --cg-link: #ffffff;
737
- --cg-link-hover: var(--cg-secondary);
857
+ /*
858
+ A lightened lime, not the brand one. #197 extended the contrast guardrail to the
859
+ link rungs and the panel is where it went red:
860
+
861
+ {brand.secondary} #b6de68 on the panel #5a47f0 : 3.79:1 <-- under AA
862
+ #caf37d on the panel : 4.62:1
863
+
864
+ Same hue and chroma in OKLCH, lifted in lightness until a hovered link on purple
865
+ is readable. A hover state is still normal text and gets no exemption, and the
866
+ panel is the one surface where the lime is a foreground rather than a mark.
867
+
868
+ The rest rung above stays #ffffff, so hovering still moves the colour rather than
869
+ only adding the underline the block draws. On ink the brand lime is left alone:
870
+ it measures 10.33:1 there and needs nothing. */
871
+ --cg-link-hover: #caf37d;
738
872
 
739
873
  /* ---- semantic-surfaces ---- */
740
874
  --cg-surface-card: transparent;
package/dist/tokens.json CHANGED
@@ -7,6 +7,7 @@
7
7
  "--cg-primary": "#5a47f0",
8
8
  "--cg-secondary": "#b6de68",
9
9
  "--cg-tertiary": "#60e9f0",
10
+ "--cg-accent": "#0061f0",
10
11
  "--cg-danger": "#E53935",
11
12
  "--cg-online": "#00a05c",
12
13
  "--cg-offline": "var(--cg-neutral-500)",
@@ -32,6 +33,7 @@
32
33
  "--cg-primary-tint": "#eeecfe",
33
34
  "--cg-secondary-press": "#a6cf57",
34
35
  "--cg-tertiary-press": "#4dd8e0",
36
+ "--cg-accent-press": "#0052da",
35
37
  "--cg-neutral-0": "#ffffff",
36
38
  "--cg-neutral-25": "#f1f1f6",
37
39
  "--cg-lavender-50": "#f2f1f7",
@@ -64,30 +66,30 @@
64
66
  "--cg-border-strong": "var(--cg-ink)",
65
67
  "--cg-border-accent": "var(--cg-primary)",
66
68
  "--cg-focus-ring": "rgba(90, 71, 240, 0.28)",
67
- "--cg-link": "var(--cg-text-primary)",
68
- "--cg-link-hover": "var(--cg-primary)",
69
- "--cg-font-display": "'Futura Condensed ExtraBold', 'Futura Condensed', 'Saira Semi Condensed Variable', 'Saira Semi Condensed', 'Arial Narrow', sans-serif",
69
+ "--cg-link": "var(--cg-accent)",
70
+ "--cg-link-hover": "var(--cg-accent-press)",
71
+ "--cg-font-display": "'Manrope Variable', 'Manrope', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif",
70
72
  "--cg-font-body": "'Manrope Variable', 'Manrope', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif",
71
73
  "--cg-font-mono": "'JetBrains Mono Variable', 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, monospace",
72
74
  "--cg-weight-regular": "400",
73
75
  "--cg-weight-medium": "500",
74
- "--cg-weight-bold": "700",
75
- "--cg-weight-display": "800",
76
+ "--cg-weight-bold": "600",
77
+ "--cg-weight-display": "700",
76
78
  "--cg-display-xl": "56px",
77
79
  "--cg-display-lg": "44px",
78
80
  "--cg-display-md": "38px",
79
81
  "--cg-display-sm": "30px",
80
82
  "--cg-display-line": "1.06",
81
83
  "--cg-display-tracking": "0.012em",
82
- "--cg-heading-lg": "24px",
84
+ "--cg-heading-lg": "22px",
83
85
  "--cg-heading-md": "20px",
84
86
  "--cg-heading-sm": "17px",
85
- "--cg-heading-line": "1.3",
87
+ "--cg-heading-line": "1.2",
86
88
  "--cg-body-lg": "19px",
87
89
  "--cg-body-md": "16px",
88
90
  "--cg-body-sm": "15px",
89
91
  "--cg-caption": "13px",
90
- "--cg-body-line": "1.5",
92
+ "--cg-body-line": "1.46",
91
93
  "--cg-body-tracking": "0em",
92
94
  "--cg-mono-size": "14px",
93
95
  "--cg-mono-line": "1.7",
@@ -142,7 +144,7 @@
142
144
  "--cg-transition-control": "background-color var(--cg-duration) var(--cg-ease-out), border-color var(--cg-duration) var(--cg-ease-out), color var(--cg-duration) var(--cg-ease-out), box-shadow var(--cg-duration) var(--cg-ease-out)",
143
145
  "--cg-lift-hover": "translateY(-1px)",
144
146
  "--cg-press-scale": "0.985",
145
- "--cg-volt": "#b6ff2e",
147
+ "--cg-volt": "var(--cg-secondary)",
146
148
  "--cg-volt-ink": "#243d00",
147
149
  "--cg-live-halo": "color-mix(in srgb, var(--cg-volt) 32%, transparent)",
148
150
  "--cg-scrim": "rgba(34, 34, 34, 0.4)",
@@ -162,7 +164,7 @@
162
164
  "--cg-border-strong": "#ffffff",
163
165
  "--cg-focus-ring": "rgba(255, 255, 255, 0.5)",
164
166
  "--cg-link": "#ffffff",
165
- "--cg-link-hover": "var(--cg-secondary)",
167
+ "--cg-link-hover": "#caf37d",
166
168
  "--cg-surface-card": "transparent",
167
169
  "--cg-danger": "#FFDAD6",
168
170
  "--cg-online": "#C8F5DC",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cloudgrid-io/ui",
3
- "version": "0.23.0",
3
+ "version": "0.25.0",
4
4
  "description": "CloudGrid design system: React components, brand design tokens, Tailwind theme, self-hosted fonts.",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/",
@@ -32,7 +32,6 @@
32
32
  "@base-ui/react": "^1.7.0",
33
33
  "@fontsource-variable/jetbrains-mono": "^5.3.0",
34
34
  "@fontsource-variable/manrope": "^5.3.0",
35
- "@fontsource/saira-semi-condensed": "^5.3.0",
36
35
  "class-variance-authority": "^0.7.1",
37
36
  "clsx": "^2.1.1",
38
37
  "sonner": "^2.0.8",