@putdotio/design 5.0.0 → 5.0.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/DESIGN.md +2 -2
- package/package.json +1 -1
- package/system/README.md +1 -0
- package/system/components.css +21 -0
package/DESIGN.md
CHANGED
|
@@ -137,12 +137,12 @@ Default radius `6px`; `4px` for tight controls, `8px` or `10px` for panels, pill
|
|
|
137
137
|
- Sign in, sign up, password reset, and two-factor pages have no card or panel: the form sits on `--bg`. Recipe: `.auth-page`, `.auth-header`, `.auth-main`, `.auth-column`, `.auth-title`, `.auth-note`, `.auth-links`, `.auth-footer`.
|
|
138
138
|
- The logo sits top-left in the header, in a `30.33px` box (26px ink × 7/6). The top right stays empty by default.
|
|
139
139
|
- One left-aligned column, up to `340px`, is centred horizontally and optically centred vertically: the form's middle sits near 45% of the viewport height, never below the true middle.
|
|
140
|
-
- A quiet centred footer links Terms of Service, Privacy Policy, and Help in muted `--fs-ui
|
|
140
|
+
- A quiet centred footer links Terms of Service, Privacy Policy, and Help in muted `--fs-ui`, separated by middots.
|
|
141
141
|
- Text is one size: everything except the title and fields is `--fs-ui`. That covers labels, hints, `.auth-note` lines, errors, the link row, and the footer. Fields take `--fs-field`.
|
|
142
142
|
- One title per screen: `--fs-title` (`22px`), medium, `--tracking-snug` (`-0.01em`). No subtitles, taglines, or marketing lines; copy stays short.
|
|
143
143
|
- Fields and buttons keep the standard 36px box: the filled field and a full-width default-size primary.
|
|
144
144
|
- Labels are small, muted, and above the field.
|
|
145
|
-
- The primary button is full-width yellow. Secondary actions sit under the form as muted text links: “Forgot password?”, “New to put.io? Sign up”, “Wrong account? Sign out”.
|
|
145
|
+
- The primary button is full-width yellow. Secondary actions sit under the form as muted text links: “Forgot password?”, “New to put.io? Sign up”, “Wrong account? Sign out”. Two links split to the edges; a lone link or prompt centres. A back link leads with Phosphor's arrow-left as inline SVG. A legal line under the submit button centres on it.
|
|
146
146
|
- Tab order runs fields, submit, then secondary links; DOM order follows visual order, with no positive `tabindex`. Two-factor runs the code, Verify, then its links. The reveal-password toggle takes `tabindex="-1"` and keeps its accessible name: keyboard-only users can't toggle visibility, screen-reader users still can in browse mode. No link leaves the tab order.
|
|
147
147
|
- Form errors: one message in a `.form-reveal` row right above the submit button, in red `--fs-ui` text, 8px under the fields. Invalid fields turn red. Auth forms never use the boxed `.form-callout`.
|
|
148
148
|
- Copy: “Sign in”, “Sign up”, and “That username or password doesn't look right.”
|
package/package.json
CHANGED
package/system/README.md
CHANGED
|
@@ -87,6 +87,7 @@ its cards use itself.
|
|
|
87
87
|
- **Yellow as text on light** uses `--yellow-text-secondary` (≈5:1, AA); `--yellow-solid` is fill-only on light backgrounds.
|
|
88
88
|
- **Labels on yellow** use `--primary-foreground`, a warm dark that passes AA on the yellow fill.
|
|
89
89
|
- **One design, two modes.** Light and dark are the same markup and components with different token values. Toggle `.dark` on `<html>`; one page serves both modes. Components consume semantic tokens (`--bg`, `--text`, `--border`, `--accent`, …) instead of raw `#hex` or `hsl()`.
|
|
90
|
+
- **Text sizes are tokens.** The guide, the web previews, and their shared CSS (`_tier.css`, `_frame.css`, `_element.css`) set text with a role (`--fs-ui`, `--fs-body`, `--fs-caption`, `--fs-field`) or a heading step, per [Typography](../DESIGN.md#typography). Icon glyphs keep px, rules under `.tv` keep the TV grid, and native and TV previews keep platform px. `pnpm verify` fails on any other literal font size.
|
|
90
91
|
- **Wordmarks are optically pre-centred.** All three logo SVGs carry built-in top padding in the viewBox (retro pair `0 -16 376 112`, `logo.svg` `0 -24.44 621.79 176.055`). Flex-centre them as-is, with no `translateY` nudge. Height-set placements size boxes at 7/6 of the ink height.
|
|
91
92
|
|
|
92
93
|
Icons, fields and panels, and raw filenames follow the root
|
package/system/components.css
CHANGED
|
@@ -632,6 +632,8 @@ input, textarea, select { text-transform: none; letter-spacing: normal; }
|
|
|
632
632
|
.auth-note a { color: var(--text); text-underline-offset: 3px; }
|
|
633
633
|
.auth-column form > .form-reveal .form-callout { padding-top: 8px; }
|
|
634
634
|
.auth-column form > .form-reveal + .btn-block { margin-top: 16px; }
|
|
635
|
+
/* A legal line under the submit button centres on it. */
|
|
636
|
+
.auth-column form > .btn-block + .auth-note { margin-top: 16px; text-align: center; }
|
|
635
637
|
.auth-links {
|
|
636
638
|
margin: 24px 0 0;
|
|
637
639
|
display: flex;
|
|
@@ -649,6 +651,12 @@ input, textarea, select { text-transform: none; letter-spacing: normal; }
|
|
|
649
651
|
.auth-links a { color: var(--text); text-underline-offset: 3px; }
|
|
650
652
|
.auth-links > a { color: var(--text-secondary); text-decoration: none; }
|
|
651
653
|
.auth-links > a:hover { color: var(--text); }
|
|
654
|
+
/* Two items split to the edges; a lone link or prompt centres. */
|
|
655
|
+
.auth-links > :only-child { margin-inline: auto; text-align: center; }
|
|
656
|
+
/* A back link leads with Phosphor's arrow-left, an inline SVG (or the icon font). */
|
|
657
|
+
.auth-links > a:has(> :is(svg, i)) { display: inline-flex; align-items: center; gap: 4px; }
|
|
658
|
+
.auth-links > a > svg { width: 16px; height: 16px; flex-shrink: 0; }
|
|
659
|
+
.auth-links > a > i { font-size: 16px; }
|
|
652
660
|
.auth-footer {
|
|
653
661
|
display: flex;
|
|
654
662
|
flex-wrap: wrap;
|
|
@@ -659,6 +667,19 @@ input, textarea, select { text-transform: none; letter-spacing: normal; }
|
|
|
659
667
|
}
|
|
660
668
|
.auth-footer a { color: var(--text-secondary); text-decoration: none; }
|
|
661
669
|
.auth-footer a:hover { color: var(--text); }
|
|
670
|
+
/* A middot centres in the gap before each link after the first. The empty
|
|
671
|
+
alt keeps it out of the link's accessible name. */
|
|
672
|
+
.auth-footer > * + * { position: relative; }
|
|
673
|
+
.auth-footer > * + *::before {
|
|
674
|
+
content: "·";
|
|
675
|
+
content: "·" / "";
|
|
676
|
+
position: absolute;
|
|
677
|
+
right: 100%;
|
|
678
|
+
width: 16px;
|
|
679
|
+
text-align: center;
|
|
680
|
+
color: var(--text-secondary);
|
|
681
|
+
pointer-events: none;
|
|
682
|
+
}
|
|
662
683
|
@media (max-width: 640px) {
|
|
663
684
|
.auth-header { padding: 24px; }
|
|
664
685
|
.auth-footer { padding: 24px; }
|