@signal9/era-ui 3.6.0 → 3.8.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",
@@ -44,7 +44,19 @@
44
44
  * the UA sheet regardless of specificity, so this still wins by default.
45
45
  *
46
46
  * Engines without the property keep their own dots — masking never degrades to
47
- * plaintext, only to a different glyph. */
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. */
48
60
  :where(input[type='password']) {
49
61
  -webkit-text-security: var(--era-mask-glyph, disc);
50
62
  }
@@ -13,8 +13,10 @@
13
13
  * dark/light the same way the default neutral scale does.
14
14
  * - Add data-theme="sand" for a cooler sandstone palette with
15
15
  * mint contrast.
16
- * - Add data-theme="signalnine" for a Yahoo! JAPAN x imageboard
17
- * palette whose scale deliberately lurches hue mid-ramp.
16
+ * - Add data-theme="signalnine" for a palette that refuses a clean
17
+ * gradient: dark lurches hue twice (imageboard at night), light is
18
+ * sampled off the live www.yahoo.co.jp. Both keep lightness
19
+ * monotonic — only hue and chroma misbehave.
18
20
  */
19
21
 
20
22
  /* -------------------------------------------------- */
@@ -425,83 +427,109 @@
425
427
  }
426
428
 
427
429
  /* -------------------------------------------------- */
428
- /* Signalnine — light */
430
+ /* Signalnine — light (yahoo.co.jp, measured) */
429
431
  /* */
430
- /* Yotsuba by day: cream paper, tan post boxes, dusty */
431
- /* rose rules, maroon body text. Same two-seam trick */
432
- /* as the dark variant, mirrored */
433
- /* */
434
- /* 1–3 cream and tan paper */
435
- /* 4–7 rose rules, chroma climbing */
436
- /* 8–10 swerve to Yahoo violet for muted text */
437
- /* 11–12 land on maroon for body copy */
432
+ /* Not eyeballed: the ramp was sampled off the live */
433
+ /* www.yahoo.co.jp in a headless browser, walking every */
434
+ /* element and weighting each computed colour by its */
435
+ /* rendered area (backgrounds), glyph area (text), and */
436
+ /* edge length (borders). The winners by weight became */
437
+ /* the anchors below; only 6, 8 and 9 are interpolated, */
438
+ /* and every other step reproduces a real site colour */
439
+ /* exactly: */
440
+ /* */
441
+ /* 1 #FFFFFF the page */
442
+ /* 2 #F1F5FF palest panel (--color-surface) */
443
+ /* 3 #E6ECFE the signature panel blue */
444
+ /* 4 #CEDAF3 light rule */
445
+ /* 5 #A2B3D8 rgb(162,179,216) (--color-border) */
446
+ /* 7 #698AC1 soft link blue */
447
+ /* 10 #666666 secondary text (--color-muted) */
448
+ /* 12 #000000 body text */
449
+ /* */
450
+ /* Chroma is the story: it peaks in the pale blues and */
451
+ /* decays to exactly zero by step 10, because that is */
452
+ /* what the site does — blue-tinted chrome resolving to */
453
+ /* neutral grey and black type. So the scale still is */
454
+ /* not a clean gradient, but now for a measured reason */
455
+ /* rather than an invented one. */
456
+ /* */
457
+ /* Accents are measured too: primary is the CTA blue */
458
+ /* rgb(64,112,255), destructive the Yahoo red */
459
+ /* rgb(235,0,19). Success and warning have no clear */
460
+ /* counterpart on the page and are harmonised, not */
461
+ /* sampled. */
462
+ /* */
463
+ /* Border contrast is 2.11:1 against the page — below */
464
+ /* the 2.49–4.05 the other light themes sit at, but */
465
+ /* that IS Yahoo's rule colour, specified exactly. */
438
466
  /* -------------------------------------------------- */
439
467
  @media (prefers-color-scheme: light) {
440
468
  :root[data-theme='signalnine']:not(.dark) {
441
469
  color-scheme: light;
442
470
 
443
- --color-1: oklch(0.972 0.022 96);
444
- --color-2: oklch(0.925 0.028 52);
445
- --color-3: oklch(0.855 0.038 32);
446
- --color-4: oklch(0.78 0.055 28);
447
- --color-5: oklch(0.7 0.072 25);
448
- --color-6: oklch(0.6 0.1 20);
449
- --color-7: oklch(0.52 0.12 18);
450
- --color-8: oklch(0.47 0.09 305);
451
- --color-9: oklch(0.42 0.125 300);
452
- --color-10: oklch(0.37 0.1 296);
453
- --color-11: oklch(0.32 0.13 32);
454
- --color-12: oklch(0.25 0.145 33);
471
+ --color-1: oklch(1 0 0); /* #ffffff */
472
+ --color-2: oklch(0.97 0.014 268.5); /* #f1f5ff */
473
+ --color-3: oklch(0.944 0.025 271.1); /* #e6ecfe */
474
+ --color-4: oklch(0.887 0.037 265.1); /* #cedaf3 */
475
+ --color-5: oklch(0.766 0.0565 265.7); /* #a2b3d8 — rgb(162,179,216) */
476
+ --color-6: oklch(0.7 0.074 263);
477
+ --color-7: oklch(0.631 0.0915 260.3); /* #698ac1 */
478
+ --color-8: oklch(0.585 0.062 261);
479
+ --color-9: oklch(0.548 0.031 261);
480
+ --color-10: oklch(0.51 0 0); /* #666666 */
481
+ --color-11: oklch(0.16 0.008 266);
482
+ --color-12: oklch(0 0 0); /* #000000 */
455
483
 
456
484
  --color-border: var(--color-5);
457
485
  --color-surface: var(--color-2);
458
- --color-hover: oklch(0.888 0.034 44);
486
+ --color-hover: oklch(0.955 0.02 270);
459
487
  --color-fg: var(--color-11);
460
488
  --color-bright: var(--color-12);
461
489
  --color-muted: var(--color-10);
462
490
 
463
- --color-primary: oklch(0.42 0.21 315);
464
- --color-primary-fg: oklch(0.972 0.022 96);
465
- --color-primary-hover: color-mix(in oklch, var(--color-primary) 82%, var(--color-destructive));
466
- --color-destructive: oklch(0.53 0.24 27);
467
- --color-destructive-fg: oklch(0.972 0.022 96);
468
- --color-success: oklch(0.5 0.11 158);
469
- --color-success-fg: oklch(0.972 0.022 96);
470
- --color-warning: oklch(0.72 0.14 78);
471
- --color-warning-fg: oklch(0.25 0.145 33);
491
+ --color-primary: oklch(0.596 0.22 265.8); /* #4070ff */
492
+ --color-primary-fg: oklch(1 0 0);
493
+ --color-primary-hover: color-mix(in oklch, var(--color-primary) 85%, black);
494
+ --color-destructive: oklch(0.59 0.242 27.7); /* #eb0013 */
495
+ --color-destructive-fg: oklch(1 0 0);
496
+ --color-success: oklch(0.58 0.15 152);
497
+ --color-success-fg: oklch(1 0 0);
498
+ --color-warning: oklch(0.76 0.145 80);
499
+ --color-warning-fg: oklch(0.16 0.008 266);
472
500
  }
473
501
  }
474
502
 
475
503
  [data-theme='signalnine'].light {
476
504
  color-scheme: light;
477
505
 
478
- --color-1: oklch(0.972 0.022 96);
479
- --color-2: oklch(0.925 0.028 52);
480
- --color-3: oklch(0.855 0.038 32);
481
- --color-4: oklch(0.78 0.055 28);
482
- --color-5: oklch(0.7 0.072 25);
483
- --color-6: oklch(0.6 0.1 20);
484
- --color-7: oklch(0.52 0.12 18);
485
- --color-8: oklch(0.47 0.09 305);
486
- --color-9: oklch(0.42 0.125 300);
487
- --color-10: oklch(0.37 0.1 296);
488
- --color-11: oklch(0.32 0.13 32);
489
- --color-12: oklch(0.25 0.145 33);
506
+ --color-1: oklch(1 0 0); /* #ffffff */
507
+ --color-2: oklch(0.97 0.014 268.5); /* #f1f5ff */
508
+ --color-3: oklch(0.944 0.025 271.1); /* #e6ecfe */
509
+ --color-4: oklch(0.887 0.037 265.1); /* #cedaf3 */
510
+ --color-5: oklch(0.766 0.0565 265.7); /* #a2b3d8 — rgb(162,179,216) */
511
+ --color-6: oklch(0.7 0.074 263);
512
+ --color-7: oklch(0.631 0.0915 260.3); /* #698ac1 */
513
+ --color-8: oklch(0.585 0.062 261);
514
+ --color-9: oklch(0.548 0.031 261);
515
+ --color-10: oklch(0.51 0 0); /* #666666 */
516
+ --color-11: oklch(0.16 0.008 266);
517
+ --color-12: oklch(0 0 0); /* #000000 */
490
518
 
491
519
  --color-border: var(--color-5);
492
520
  --color-surface: var(--color-2);
493
- --color-hover: oklch(0.888 0.034 44);
521
+ --color-hover: oklch(0.955 0.02 270);
494
522
  --color-fg: var(--color-11);
495
523
  --color-bright: var(--color-12);
496
524
  --color-muted: var(--color-10);
497
525
 
498
- --color-primary: oklch(0.42 0.21 315);
499
- --color-primary-fg: oklch(0.972 0.022 96);
500
- --color-primary-hover: color-mix(in oklch, var(--color-primary) 82%, var(--color-destructive));
501
- --color-destructive: oklch(0.53 0.24 27);
502
- --color-destructive-fg: oklch(0.972 0.022 96);
503
- --color-success: oklch(0.5 0.11 158);
504
- --color-success-fg: oklch(0.972 0.022 96);
505
- --color-warning: oklch(0.72 0.14 78);
506
- --color-warning-fg: oklch(0.25 0.145 33);
526
+ --color-primary: oklch(0.596 0.22 265.8); /* #4070ff */
527
+ --color-primary-fg: oklch(1 0 0);
528
+ --color-primary-hover: color-mix(in oklch, var(--color-primary) 85%, black);
529
+ --color-destructive: oklch(0.59 0.242 27.7); /* #eb0013 */
530
+ --color-destructive-fg: oklch(1 0 0);
531
+ --color-success: oklch(0.58 0.15 152);
532
+ --color-success-fg: oklch(1 0 0);
533
+ --color-warning: oklch(0.76 0.145 80);
534
+ --color-warning-fg: oklch(0.16 0.008 266);
507
535
  }
@@ -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';