@signal9/era-ui 3.5.1 → 3.7.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.
@@ -0,0 +1,24 @@
1
+ # Logo
2
+
3
+ The signalnine dish mark, reactive to a state preset.
4
+
5
+ ## Import
6
+
7
+ ```ts
8
+ import { Logo } from "$lib/ui/logo";
9
+ ```
10
+
11
+ ## Props
12
+
13
+ | Prop | Type | Default | Notes |
14
+ |------|------|---------|-------|
15
+ | `depth?` | `number` | `52` | — |
16
+ | `tilt?` | `number` | `55` | — |
17
+ | `aim?` | `number` | `0` | — |
18
+ | `light?` | `number` | `REST_LIGHT` | — |
19
+ | `inset?` | `number` | `100` | — |
20
+ | `palette?` | `LogoPalette` | `'amber'` | — |
21
+ | `state?` | `LogoState` | `'manual'` | 'manual' renders a static pose; any other state animates its preset. |
22
+ | `size?` | `number` | `272` | — |
23
+ | `pressable?` | `boolean` | `false` | Deepen the bowl while held, then spring back on release. |
24
+ | `class?` | `string` | — | — |
@@ -646,6 +646,17 @@
646
646
  ],
647
647
  "file": "label.md"
648
648
  },
649
+ {
650
+ "slug": "logo",
651
+ "title": "Logo",
652
+ "summary": "The signalnine dish mark, reactive to a state preset.",
653
+ "tokenEstimate": 176,
654
+ "sections": [
655
+ "Import",
656
+ "Props"
657
+ ],
658
+ "file": "logo.md"
659
+ },
649
660
  {
650
661
  "slug": "menu",
651
662
  "title": "Menu",
@@ -273,6 +273,11 @@
273
273
  * root while dense subtrees just inherit whatever corners are in force. */
274
274
  :root {
275
275
  --era-roundness-scale: 1;
276
+ /* The password mask glyph is a corner decision too — see the corners block
277
+ * below. Declared here on :root alone for the same reason as the scale: a
278
+ * data-mode subtree must not re-assert it and defeat an inherited
279
+ * data-corners="square". */
280
+ --era-mask-glyph: disc;
276
281
  }
277
282
  :root,
278
283
  [data-mode='dense'] {
@@ -313,6 +318,10 @@
313
318
  /* -------------------------------------------------- */
314
319
  [data-corners='square'] {
315
320
  --era-roundness-scale: 0;
321
+ /* Squares the password mask too, so the one glyph the UA picks for you
322
+ * follows the same corner language as every rendered box. Unlike the radius
323
+ * this can't tween — it's a keyword, so it flips at the end of the toggle. */
324
+ --era-mask-glyph: square;
316
325
  }
317
326
 
318
327
  /* Animate the roundness scale itself — not border-radius. sp changes snap
@@ -34,6 +34,33 @@
34
34
  stroke-width: var(--era-icon-stroke-width);
35
35
  }
36
36
 
37
+ /* The mask glyph is the one piece of type the UA picks for you, so era picks it
38
+ * instead — off the CORNERS axis, like every other corner in the system:
39
+ * rounded → disc, data-corners="square" → square. The token lives in
40
+ * density.css next to --era-roundness-scale.
41
+ *
42
+ * `:where()` holds specificity at 0, so a consumer opts out with a bare
43
+ * `input[type='password'] { -webkit-text-security: disc }`. Author origin beats
44
+ * the UA sheet regardless of specificity, so this still wins by default.
45
+ *
46
+ * Engines without the property keep their own dots — masking never degrades to
47
+ * plaintext, only to a different glyph.
48
+ *
49
+ * KNOWN LIMIT, verified in Chromium 1228: a real input[type=password] ignores
50
+ * this entirely and always draws disc. Author CSS does not win — square, circle
51
+ * and none all render dots — and CSS.supports() reports true for every one of
52
+ * them, so it fails silently. The property DOES apply to input[type=text], and
53
+ * the var() substitutes correctly, so this rule is live wiring rather than dead
54
+ * code: point it at a text input and the axis drives the glyph.
55
+ *
56
+ * Forcing squares on a password field therefore means rendering it as
57
+ * type="text" and masking it ourselves, which costs password-manager detection
58
+ * and the screen-reader "password" announcement. Deliberately not done — the
59
+ * semantics are worth more than the corner. */
60
+ :where(input[type='password']) {
61
+ -webkit-text-security: var(--era-mask-glyph, disc);
62
+ }
63
+
37
64
  /* Shared interactive-state recipe: quiet focus, disabled affordance.
38
65
  * Equivalent to `focus:outline-none disabled:cursor-not-allowed disabled:opacity-50`.
39
66
  *
@@ -48,6 +48,8 @@ export { Input, Textarea } from './input/index.js';
48
48
  export { KV } from './kv/index.js';
49
49
  export { Label } from './label/index.js';
50
50
  export * as LinkPreview from './link-preview/index.js';
51
+ export { Logo } from './logo/index.js';
52
+ export type { LogoPalette, LogoState, LogoParams } from './logo/index.js';
51
53
  export { Mode } from './mode/index.js';
52
54
  export { Pane, Root as PaneRoot, Handle as PaneHandle, Content as PaneContent, Close as PaneClose, Tabs as PaneTabs, TabList as PaneTabList, Tab as PaneTab, TabPanel as PaneTabPanel } from './pane/index.js';
53
55
  export * as Pagination from './pagination/index.js';
package/dist/ui/index.js CHANGED
@@ -48,6 +48,7 @@ export { Input, Textarea } from './input/index.js';
48
48
  export { KV } from './kv/index.js';
49
49
  export { Label } from './label/index.js';
50
50
  export * as LinkPreview from './link-preview/index.js';
51
+ export { Logo } from './logo/index.js';
51
52
  export { Mode } from './mode/index.js';
52
53
  export { Pane, Root as PaneRoot, Handle as PaneHandle, Content as PaneContent, Close as PaneClose, Tabs as PaneTabs, TabList as PaneTabList, Tab as PaneTab, TabPanel as PaneTabPanel } from './pane/index.js';
53
54
  export * as Pagination from './pagination/index.js';
@@ -0,0 +1,3 @@
1
+ export { default as Logo } from './logo.svelte';
2
+ export { LOGO_STATES, PAL, PALETTES, SPR, REST_LIGHT, FIXED_STEP, wrap, clamp, norm360, oklchToHex, renderLogoMarkup, logoSvgDocument, createSim, integrate, stateFrame } from './logo.svelte';
3
+ export type { LogoPalette, LogoState, LogoParams, LogoSim, HueOverride, Ring, Dof, Fx } from './logo.svelte';
@@ -0,0 +1,2 @@
1
+ export { default as Logo } from './logo.svelte';
2
+ export { LOGO_STATES, PAL, PALETTES, SPR, REST_LIGHT, FIXED_STEP, wrap, clamp, norm360, oklchToHex, renderLogoMarkup, logoSvgDocument, createSim, integrate, stateFrame } from './logo.svelte';