@signal9/era-ui 4.15.4 → 4.16.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.
@@ -39,6 +39,7 @@ Classes, not components — they need no import beyond the stylesheet. Reach for
39
39
  - `era-text-trim` — vertically center single-line control text (a label beside an icon, a button's own text) without a translateY nudge — fixed-height, non-editable elements only; see era-text-trim-caps for ALL-CAPS strings.
40
40
  - `truncate` — single-line horizontal truncation with an ellipsis — safe inside a trimmed or leading-none row; it will not clip ascenders or descenders.
41
41
  - `era-text-trim-caps` — the era-text-trim variant for ALL-CAPS single-line strings (kbd hints, acronym badges) — never use it for mixed-case text.
42
+ - `era-ink-center` — on a native single-line <input> (or the text layer that must mirror one) inside a fixed-height field — never alongside era-text-trim.
42
43
  - `era-shimmer` — the in-progress text treatment — put it on a "working…" / "thinking…" label while a task streams, instead of a spinner beside the text.
43
44
  - `era-collapse` — the height sweep for a bits-ui Collapsible.Content — put it on the Content element itself (it carries its own overflow: hidden).
44
45
  - `h-xs · h-xxs · h-sm · h-md · h-lg` — the tier-height ladder — h-xs (icon) · h-xxs (nested pill) · h-sm (standalone pill) · h-md (control) · h-lg (bar); the named form of h-(--era-h-*).
@@ -147,6 +148,7 @@ enough to stay var-form — `min-w-(--era-h-md)` etc. remain the escape hatch.
147
148
  | `era-text-trim` | vertically center single-line control text (a label beside an icon, a button's own text) without a translateY nudge — fixed-height, non-editable elements only; see era-text-trim-caps for ALL-CAPS strings. |
148
149
  | `truncate` | single-line horizontal truncation with an ellipsis — safe inside a trimmed or leading-none row; it will not clip ascenders or descenders. |
149
150
  | `era-text-trim-caps` | the era-text-trim variant for ALL-CAPS single-line strings (kbd hints, acronym badges) — never use it for mixed-case text. |
151
+ | `era-ink-center` | on a native single-line <input> (or the text layer that must mirror one) inside a fixed-height field — never alongside era-text-trim. |
150
152
  | `era-shimmer` | the in-progress text treatment — put it on a "working…" / "thinking…" label while a task streams, instead of a spinner beside the text. |
151
153
  | `era-collapse` | the height sweep for a bits-ui Collapsible.Content — put it on the Content element itself (it carries its own overflow: hidden). |
152
154
  | `h-xs` `h-xxs` `h-sm` `h-md` `h-lg` | the tier-height ladder — h-xs (icon) · h-xxs (nested pill) · h-sm (standalone pill) · h-md (control) · h-lg (bar); the named form of h-(--era-h-*). |
@@ -331,6 +333,37 @@ Declared in `index.css`.
331
333
  }
332
334
  ```
333
335
 
336
+ ## era-ink-center
337
+
338
+ **Use it for:** on a native single-line <input> (or the text layer that must mirror one) inside a fixed-height field — never alongside era-text-trim.
339
+
340
+ The EDITABLE counterpart of era-text-trim — for native <input>s, which the
341
+ trim is forbidden on (it collapses the UA's inner editor box and slices the
342
+ glyphs; see typography/collapsed-text-trim).
343
+
344
+ Without help, a tier-height input centres its text by FONT BOX, and the ui
345
+ stacks' font box is deeply asymmetric: ascent ≈1.07em against descent
346
+ ≈0.29em. Centring that box parks the visible band (caps, x-height) ~0.115em
347
+ LOW — measured: ((asc − desc) − x-height)/2 = 0.120em on the mono and sans
348
+ stacks, 0.105em on serif — so a field's text sat visibly below the trimmed
349
+ label right beside it in the same bar.
350
+
351
+ The lift is padding, not a translateY: an icon-less Input paints the field
352
+ chrome itself, and a transform would drag the field along with the ink.
353
+ padding-bottom shrinks the content box from below, and a single-line input
354
+ re-centres its line box in what remains — the ink rises by exactly half the
355
+ padding, the chrome doesn't move, and the caret and selection follow the
356
+ text. In em on purpose: the correction is a fraction of the type, so it
357
+ holds across every density and text size with one value.
358
+
359
+ Declared in `index.css`.
360
+
361
+ ```css
362
+ @utility era-ink-center {
363
+ padding-bottom: 0.23em;
364
+ }
365
+ ```
366
+
334
367
  ## era-shimmer
335
368
 
336
369
  **Use it for:** the in-progress text treatment — put it on a "working…" / "thinking…" label while a task streams, instead of a spinner beside the text.
@@ -43,6 +43,7 @@ Classes, not components — they need no import beyond the stylesheet. Reach for
43
43
  - `era-text-trim` — vertically center single-line control text (a label beside an icon, a button's own text) without a translateY nudge — fixed-height, non-editable elements only; see era-text-trim-caps for ALL-CAPS strings.
44
44
  - `truncate` — single-line horizontal truncation with an ellipsis — safe inside a trimmed or leading-none row; it will not clip ascenders or descenders.
45
45
  - `era-text-trim-caps` — the era-text-trim variant for ALL-CAPS single-line strings (kbd hints, acronym badges) — never use it for mixed-case text.
46
+ - `era-ink-center` — on a native single-line <input> (or the text layer that must mirror one) inside a fixed-height field — never alongside era-text-trim.
46
47
  - `era-shimmer` — the in-progress text treatment — put it on a "working…" / "thinking…" label while a task streams, instead of a spinner beside the text.
47
48
  - `era-collapse` — the height sweep for a bits-ui Collapsible.Content — put it on the Content element itself (it carries its own overflow: hidden).
48
49
  - `h-xs · h-xxs · h-sm · h-md · h-lg` — the tier-height ladder — h-xs (icon) · h-xxs (nested pill) · h-sm (standalone pill) · h-md (control) · h-lg (bar); the named form of h-(--era-h-*).
@@ -44,7 +44,7 @@
44
44
  "slug": "utilities",
45
45
  "title": "Utilities",
46
46
  "summary": "The CSS classes era ships alongside the components — links, ink-centred text, shimmer, hidden scrollbars.",
47
- "tokenEstimate": 5333,
47
+ "tokenEstimate": 5715,
48
48
  "sections": [
49
49
  "Overview",
50
50
  "era-interactive",
@@ -53,6 +53,7 @@
53
53
  "era-text-trim",
54
54
  "truncate",
55
55
  "era-text-trim-caps",
56
+ "era-ink-center",
56
57
  "era-shimmer",
57
58
  "era-collapse",
58
59
  "h-xs · h-xxs · h-sm · h-md · h-lg",
@@ -1021,6 +1022,16 @@
1021
1022
  "description": "ALL-CAPS single-line text (kbd hints, acronym badges): the x-height band\nmisjudges caps-only strings — cap/alphabetic edges are the right box.",
1022
1023
  "css": "@utility era-text-trim-caps {\n\tline-height: 1;\n\ttext-box: trim-both cap alphabetic;\n}"
1023
1024
  },
1025
+ {
1026
+ "name": "era-ink-center",
1027
+ "names": [
1028
+ "era-ink-center"
1029
+ ],
1030
+ "file": "index.css",
1031
+ "useCase": "on a native single-line <input> (or the text layer that must mirror one) inside a fixed-height field — never alongside era-text-trim.",
1032
+ "description": "The EDITABLE counterpart of era-text-trim — for native <input>s, which the\ntrim is forbidden on (it collapses the UA's inner editor box and slices the\nglyphs; see typography/collapsed-text-trim).\n\nWithout help, a tier-height input centres its text by FONT BOX, and the ui\nstacks' font box is deeply asymmetric: ascent ≈1.07em against descent\n≈0.29em. Centring that box parks the visible band (caps, x-height) ~0.115em\nLOW — measured: ((asc − desc) − x-height)/2 = 0.120em on the mono and sans\nstacks, 0.105em on serif — so a field's text sat visibly below the trimmed\nlabel right beside it in the same bar.\n\nThe lift is padding, not a translateY: an icon-less Input paints the field\nchrome itself, and a transform would drag the field along with the ink.\npadding-bottom shrinks the content box from below, and a single-line input\nre-centres its line box in what remains — the ink rises by exactly half the\npadding, the chrome doesn't move, and the caret and selection follow the\ntext. In em on purpose: the correction is a fraction of the type, so it\nholds across every density and text size with one value.",
1033
+ "css": "@utility era-ink-center {\n\tpadding-bottom: 0.23em;\n}"
1034
+ },
1024
1035
  {
1025
1036
  "name": "era-shimmer",
1026
1037
  "names": [
@@ -60,6 +60,16 @@
60
60
  "description": "ALL-CAPS single-line text (kbd hints, acronym badges): the x-height band\nmisjudges caps-only strings — cap/alphabetic edges are the right box.",
61
61
  "css": "@utility era-text-trim-caps {\n\tline-height: 1;\n\ttext-box: trim-both cap alphabetic;\n}"
62
62
  },
63
+ {
64
+ "name": "era-ink-center",
65
+ "names": [
66
+ "era-ink-center"
67
+ ],
68
+ "file": "index.css",
69
+ "useCase": "on a native single-line <input> (or the text layer that must mirror one) inside a fixed-height field — never alongside era-text-trim.",
70
+ "description": "The EDITABLE counterpart of era-text-trim — for native <input>s, which the\ntrim is forbidden on (it collapses the UA's inner editor box and slices the\nglyphs; see typography/collapsed-text-trim).\n\nWithout help, a tier-height input centres its text by FONT BOX, and the ui\nstacks' font box is deeply asymmetric: ascent ≈1.07em against descent\n≈0.29em. Centring that box parks the visible band (caps, x-height) ~0.115em\nLOW — measured: ((asc − desc) − x-height)/2 = 0.120em on the mono and sans\nstacks, 0.105em on serif — so a field's text sat visibly below the trimmed\nlabel right beside it in the same bar.\n\nThe lift is padding, not a translateY: an icon-less Input paints the field\nchrome itself, and a transform would drag the field along with the ink.\npadding-bottom shrinks the content box from below, and a single-line input\nre-centres its line box in what remains — the ink rises by exactly half the\npadding, the chrome doesn't move, and the caret and selection follow the\ntext. In em on purpose: the correction is a fraction of the type, so it\nholds across every density and text size with one value.",
71
+ "css": "@utility era-ink-center {\n\tpadding-bottom: 0.23em;\n}"
72
+ },
63
73
  {
64
74
  "name": "era-shimmer",
65
75
  "names": [
@@ -44,6 +44,7 @@ enough to stay var-form — `min-w-(--era-h-md)` etc. remain the escape hatch.
44
44
  | `era-text-trim` | vertically center single-line control text (a label beside an icon, a button's own text) without a translateY nudge — fixed-height, non-editable elements only; see era-text-trim-caps for ALL-CAPS strings. |
45
45
  | `truncate` | single-line horizontal truncation with an ellipsis — safe inside a trimmed or leading-none row; it will not clip ascenders or descenders. |
46
46
  | `era-text-trim-caps` | the era-text-trim variant for ALL-CAPS single-line strings (kbd hints, acronym badges) — never use it for mixed-case text. |
47
+ | `era-ink-center` | on a native single-line <input> (or the text layer that must mirror one) inside a fixed-height field — never alongside era-text-trim. |
47
48
  | `era-shimmer` | the in-progress text treatment — put it on a "working…" / "thinking…" label while a task streams, instead of a spinner beside the text. |
48
49
  | `era-collapse` | the height sweep for a bits-ui Collapsible.Content — put it on the Content element itself (it carries its own overflow: hidden). |
49
50
  | `h-xs` `h-xxs` `h-sm` `h-md` `h-lg` | the tier-height ladder — h-xs (icon) · h-xxs (nested pill) · h-sm (standalone pill) · h-md (control) · h-lg (bar); the named form of h-(--era-h-*). |
@@ -228,6 +229,37 @@ Declared in `index.css`.
228
229
  }
229
230
  ```
230
231
 
232
+ ## era-ink-center
233
+
234
+ **Use it for:** on a native single-line <input> (or the text layer that must mirror one) inside a fixed-height field — never alongside era-text-trim.
235
+
236
+ The EDITABLE counterpart of era-text-trim — for native <input>s, which the
237
+ trim is forbidden on (it collapses the UA's inner editor box and slices the
238
+ glyphs; see typography/collapsed-text-trim).
239
+
240
+ Without help, a tier-height input centres its text by FONT BOX, and the ui
241
+ stacks' font box is deeply asymmetric: ascent ≈1.07em against descent
242
+ ≈0.29em. Centring that box parks the visible band (caps, x-height) ~0.115em
243
+ LOW — measured: ((asc − desc) − x-height)/2 = 0.120em on the mono and sans
244
+ stacks, 0.105em on serif — so a field's text sat visibly below the trimmed
245
+ label right beside it in the same bar.
246
+
247
+ The lift is padding, not a translateY: an icon-less Input paints the field
248
+ chrome itself, and a transform would drag the field along with the ink.
249
+ padding-bottom shrinks the content box from below, and a single-line input
250
+ re-centres its line box in what remains — the ink rises by exactly half the
251
+ padding, the chrome doesn't move, and the caret and selection follow the
252
+ text. In em on purpose: the correction is a fraction of the type, so it
253
+ holds across every density and text size with one value.
254
+
255
+ Declared in `index.css`.
256
+
257
+ ```css
258
+ @utility era-ink-center {
259
+ padding-bottom: 0.23em;
260
+ }
261
+ ```
262
+
231
263
  ## era-shimmer
232
264
 
233
265
  **Use it for:** the in-progress text treatment — put it on a "working…" / "thinking…" label while a task streams, instead of a spinner beside the text.
@@ -196,6 +196,31 @@
196
196
  text-box: trim-both cap alphabetic;
197
197
  }
198
198
 
199
+ /* The EDITABLE counterpart of era-text-trim — for native <input>s, which the
200
+ * trim is forbidden on (it collapses the UA's inner editor box and slices the
201
+ * glyphs; see typography/collapsed-text-trim).
202
+ *
203
+ * Without help, a tier-height input centres its text by FONT BOX, and the ui
204
+ * stacks' font box is deeply asymmetric: ascent ≈1.07em against descent
205
+ * ≈0.29em. Centring that box parks the visible band (caps, x-height) ~0.115em
206
+ * LOW — measured: ((asc − desc) − x-height)/2 = 0.120em on the mono and sans
207
+ * stacks, 0.105em on serif — so a field's text sat visibly below the trimmed
208
+ * label right beside it in the same bar.
209
+ *
210
+ * The lift is padding, not a translateY: an icon-less Input paints the field
211
+ * chrome itself, and a transform would drag the field along with the ink.
212
+ * padding-bottom shrinks the content box from below, and a single-line input
213
+ * re-centres its line box in what remains — the ink rises by exactly half the
214
+ * padding, the chrome doesn't move, and the caret and selection follow the
215
+ * text. In em on purpose: the correction is a fraction of the type, so it
216
+ * holds across every density and text size with one value.
217
+ *
218
+ * @use on a native single-line <input> (or the text layer that must mirror
219
+ * one) inside a fixed-height field — never alongside era-text-trim. */
220
+ @utility era-ink-center {
221
+ padding-bottom: 0.23em;
222
+ }
223
+
199
224
  /* In-progress text shimmer — a bright sweep through muted text (the standard
200
225
  * "working…" label treatment in streaming UIs). Timing derives from the motion
201
226
  * axis (10× --era-duration ≈ 1.5s at normal, 2.6s at extra); at instant the
@@ -11,8 +11,8 @@
11
11
  data-input-field
12
12
  class={cn(
13
13
  inputVariants(),
14
- // The open list is docked to the field, so the seam between them opens up.
15
- 'data-[state=open]:rounded-b-none data-[state=open]:shadow-(--era-shadow-pressed)',
14
+ // era-ink-center: the same font-box-vs-ink correction Input documents.
15
+ 'era-ink-center data-[state=open]:rounded-b-none data-[state=open]:shadow-(--era-shadow-pressed)',
16
16
  className
17
17
  )}
18
18
  {...restProps}
@@ -36,9 +36,12 @@
36
36
 
37
37
  // No era-text-trim on the <input> itself, in either branch: an <input> clips to
38
38
  // a UA-owned inner editor box that IS the trimmed line box, so the trim slices
39
- // the ascenders and descenders off what you type (a "d" renders as an "o"). The
40
- // fixed tier height centres the text on its own. See styles/index.css.
41
- const textClass = 'text-body text-fg placeholder:text-muted';
39
+ // the ascenders and descenders off what you type (a "d" renders as an "o").
40
+ // era-ink-center is the editable's substitute the tier height centres the
41
+ // FONT BOX, which parks the visible band ~0.115em low (the stacks' ascent far
42
+ // outweighs their descent), and the padding lift re-centres the ink itself.
43
+ // See styles/index.css.
44
+ const textClass = 'text-body text-fg placeholder:text-muted era-ink-center';
42
45
 
43
46
  // The marker says WHICH field this is, not just that it is one. `bare` and
44
47
  // `reveal` both render chrome-less at rest, so a test that only sees "no
@@ -20,7 +20,10 @@
20
20
  {...restProps}
21
21
  >
22
22
  {#if cell.char !== null}
23
- <div>{cell.char}</div>
23
+ <!-- era-text-trim-caps, the numerals/caps variant: an OTP glyph is a digit
24
+ or a capital, and the x-height band misjudges both. On the CHAR, not
25
+ the cell — the cell is a flex box whose own line boxes hold no ink. -->
26
+ <div class="era-text-trim-caps">{cell.char}</div>
24
27
  {/if}
25
28
  {#if cell.hasFakeCaret}
26
29
  <div class="pointer-events-none absolute inset-0 flex items-center justify-center">
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@signal9/era-ui",
3
- "version": "4.15.4",
3
+ "version": "4.16.0",
4
4
  "scripts": {
5
5
  "dev": "vite dev --host",
6
6
  "build": "vite build && npm run prepack",