@rnine/nineos 0.0.0-stage → 0.1.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.
Files changed (92) hide show
  1. package/README.md +93 -2
  2. package/dist/_variables.scss +199 -0
  3. package/dist/components/Chrome/Chrome.d.ts +27 -0
  4. package/dist/components/Chrome/Chrome.js +45 -0
  5. package/dist/components/Chrome/Chrome.js.map +1 -0
  6. package/dist/components/Chrome/Chrome.module.js +14 -0
  7. package/dist/components/Chrome/Chrome.module.js.map +1 -0
  8. package/dist/components/CommandLine/ChipBar.d.ts +20 -0
  9. package/dist/components/CommandLine/ChipBar.js +25 -0
  10. package/dist/components/CommandLine/ChipBar.js.map +1 -0
  11. package/dist/components/CommandLine/ChipBar.module.js +9 -0
  12. package/dist/components/CommandLine/ChipBar.module.js.map +1 -0
  13. package/dist/components/CommandLine/CommandLine.d.ts +38 -0
  14. package/dist/components/CommandLine/CommandLine.js +121 -0
  15. package/dist/components/CommandLine/CommandLine.js.map +1 -0
  16. package/dist/components/CommandLine/CommandLine.module.js +13 -0
  17. package/dist/components/CommandLine/CommandLine.module.js.map +1 -0
  18. package/dist/components/Hint/Hint.d.ts +22 -0
  19. package/dist/components/Hint/Hint.js +52 -0
  20. package/dist/components/Hint/Hint.js.map +1 -0
  21. package/dist/components/Hint/Hint.module.js +11 -0
  22. package/dist/components/Hint/Hint.module.js.map +1 -0
  23. package/dist/components/Panel/PanelStage.d.ts +19 -0
  24. package/dist/components/Panel/PanelStage.js +67 -0
  25. package/dist/components/Panel/PanelStage.js.map +1 -0
  26. package/dist/components/Panel/PanelStage.module.js +10 -0
  27. package/dist/components/Panel/PanelStage.module.js.map +1 -0
  28. package/dist/components.css +2 -0
  29. package/dist/index.d.ts +10 -0
  30. package/dist/index.js +9 -0
  31. package/dist/motion/DecryptText.d.ts +9 -0
  32. package/dist/motion/DecryptText.js +87 -0
  33. package/dist/motion/DecryptText.js.map +1 -0
  34. package/dist/motion/DecryptText.module.js +12 -0
  35. package/dist/motion/DecryptText.module.js.map +1 -0
  36. package/dist/motion/DotField.d.ts +8 -0
  37. package/dist/motion/DotField.js +116 -0
  38. package/dist/motion/DotField.js.map +1 -0
  39. package/dist/motion/DotField.module.js +8 -0
  40. package/dist/motion/DotField.module.js.map +1 -0
  41. package/dist/motion/Monogram.d.ts +7 -0
  42. package/dist/motion/Monogram.js +40 -0
  43. package/dist/motion/Monogram.js.map +1 -0
  44. package/dist/motion/Monogram.module.js +10 -0
  45. package/dist/motion/Monogram.module.js.map +1 -0
  46. package/dist/motion/PageEffects.d.ts +2 -0
  47. package/dist/motion/PageEffects.js +45 -0
  48. package/dist/motion/PageEffects.js.map +1 -0
  49. package/dist/motion/PageEffects.module.js +8 -0
  50. package/dist/motion/PageEffects.module.js.map +1 -0
  51. package/dist/motion/Terminal.d.ts +12 -0
  52. package/dist/motion/Terminal.js +57 -0
  53. package/dist/motion/Terminal.js.map +1 -0
  54. package/dist/motion/Terminal.module.js +12 -0
  55. package/dist/motion/Terminal.module.js.map +1 -0
  56. package/dist/motion/VelocityStrip.d.ts +7 -0
  57. package/dist/motion/VelocityStrip.js +46 -0
  58. package/dist/motion/VelocityStrip.js.map +1 -0
  59. package/dist/motion/VelocityStrip.module.js +9 -0
  60. package/dist/motion/VelocityStrip.module.js.map +1 -0
  61. package/dist/motion/signal.d.ts +15 -0
  62. package/dist/motion/signal.js +78 -0
  63. package/dist/motion/signal.js.map +1 -0
  64. package/dist/motion/useDecrypt.d.ts +21 -0
  65. package/dist/motion/useDecrypt.js +45 -0
  66. package/dist/motion/useDecrypt.js.map +1 -0
  67. package/dist/motion.d.ts +10 -0
  68. package/dist/motion.js +10 -0
  69. package/dist/nineos-base.css +54 -0
  70. package/dist/provider/ThemeProvider.d.ts +25 -0
  71. package/dist/provider/ThemeProvider.js +44 -0
  72. package/dist/provider/ThemeProvider.js.map +1 -0
  73. package/dist/styles.css +637 -0
  74. package/dist/tokens.css +470 -0
  75. package/dist/tokens.d.ts +2446 -0
  76. package/dist/tokens.js +2446 -0
  77. package/fonts.css +9 -0
  78. package/package.json +114 -4
  79. package/scss/_glitch.scss +23 -0
  80. package/scss/_index.scss +6 -0
  81. package/scss/base.scss +24 -0
  82. package/theme.json +9 -0
  83. package/tokens/color.json +46 -0
  84. package/tokens/layout.json +29 -0
  85. package/tokens/motion.json +18 -0
  86. package/tokens/palettes/acid.json +65 -0
  87. package/tokens/palettes/volt.json +65 -0
  88. package/tokens/shape.json +26 -0
  89. package/tokens/space.json +19 -0
  90. package/tokens/themes/dark.json +81 -0
  91. package/tokens/themes/light.json +106 -0
  92. package/tokens/typography.json +58 -0
package/fonts.css ADDED
@@ -0,0 +1,9 @@
1
+ /* NineOS fonts, self-hosted through Fontsource (all open-licensed, SIL OFL).
2
+ Import once in the app, before styles.css:
3
+ import "@rnine/nineos/fonts.css";
4
+ import "@rnine/nineos/styles.css"; */
5
+ @import "@fontsource/chakra-petch/latin-500.css";
6
+ @import "@fontsource/chakra-petch/latin-600.css";
7
+ @import "@fontsource/chakra-petch/latin-700.css";
8
+ @import "@fontsource-variable/hanken-grotesk/index.css";
9
+ @import "@fontsource/share-tech-mono/latin-400.css";
package/package.json CHANGED
@@ -1,6 +1,116 @@
1
1
  {
2
2
  "name": "@rnine/nineos",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.0",
4
+ "license": "MIT",
5
+ "description": "NineOS: a design system library with two moods (Clear and Cipher), cut corners, a command-line-plus-panels shell and its motion layer. Built on @rnine/core",
6
+ "keywords": [
7
+ "react",
8
+ "design-system",
9
+ "component-library",
10
+ "ui",
11
+ "scss",
12
+ "nineos",
13
+ "cli",
14
+ "terminal"
15
+ ],
16
+ "homepage": "https://github.com/rNineTheFirst/rnine-ui/tree/main/packages/nineos#readme",
17
+ "bugs": {
18
+ "url": "https://github.com/rNineTheFirst/rnine-ui/issues"
19
+ },
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "git+https://github.com/rNineTheFirst/rnine-ui.git",
23
+ "directory": "packages/nineos"
24
+ },
25
+ "type": "module",
26
+ "sideEffects": [
27
+ "*.css"
28
+ ],
29
+ "exports": {
30
+ ".": {
31
+ "types": "./dist/index.d.ts",
32
+ "default": "./dist/index.js"
33
+ },
34
+ "./motion": {
35
+ "types": "./dist/motion.d.ts",
36
+ "default": "./dist/motion.js"
37
+ },
38
+ "./styles.css": "./dist/styles.css",
39
+ "./fonts.css": "./fonts.css",
40
+ "./scss": {
41
+ "sass": "./scss/_index.scss",
42
+ "default": "./scss/_index.scss"
43
+ },
44
+ "./tokens": {
45
+ "types": "./dist/tokens.d.ts",
46
+ "default": "./dist/tokens.js"
47
+ },
48
+ "./theme.json": "./theme.json",
49
+ "./package.json": "./package.json"
50
+ },
51
+ "files": [
52
+ "dist",
53
+ "scss",
54
+ "tokens",
55
+ "fonts.css",
56
+ "theme.json"
57
+ ],
58
+ "publishConfig": {
59
+ "access": "public",
60
+ "provenance": true
61
+ },
62
+ "scripts": {
63
+ "build": "node scripts/build.mjs && vite build && tsc -p tsconfig.build.json && node scripts/build.mjs --bundle",
64
+ "dev": "storybook dev -p 6006 --no-open",
65
+ "storybook": "storybook dev -p 6006",
66
+ "build-storybook": "storybook build -o storybook-static --quiet",
67
+ "lint": "eslint .",
68
+ "test": "vitest run && node --test \"test/**/*.test.mjs\"",
69
+ "clean": "rimraf dist storybook-static node_modules"
70
+ },
71
+ "peerDependencies": {
72
+ "react": "^19.0.0",
73
+ "react-dom": "^19.0.0",
74
+ "sass": "^1.80.0"
75
+ },
76
+ "peerDependenciesMeta": {
77
+ "sass": {
78
+ "optional": true
79
+ }
80
+ },
81
+ "dependencies": {
82
+ "@rnine/core": "0.1.0",
83
+ "@fontsource-variable/hanken-grotesk": "^5.3.0",
84
+ "@fontsource/chakra-petch": "^5.3.0",
85
+ "@fontsource/share-tech-mono": "^5.3.0",
86
+ "lucide-react": "1.61.0"
87
+ },
88
+ "devDependencies": {
89
+ "@eslint/js": "^10.0.1",
90
+ "@storybook/addon-a11y": "10.6.3",
91
+ "@storybook/addon-docs": "10.6.3",
92
+ "@storybook/addon-themes": "10.6.3",
93
+ "@storybook/react-vite": "10.6.3",
94
+ "@testing-library/jest-dom": "^6.9.1",
95
+ "@testing-library/react": "^16.3.2",
96
+ "@testing-library/user-event": "^14.6.1",
97
+ "@types/node": "^24.12.3",
98
+ "@types/react": "^19.2.14",
99
+ "@types/react-dom": "^19.2.3",
100
+ "@vitejs/plugin-react": "^6.0.1",
101
+ "eslint": "^10.3.0",
102
+ "eslint-plugin-react-hooks": "^7.1.1",
103
+ "eslint-plugin-react-refresh": "^0.5.2",
104
+ "globals": "^17.6.0",
105
+ "jsdom": "^29.1.1",
106
+ "react": "^19.2.6",
107
+ "react-dom": "^19.2.6",
108
+ "rimraf": "^6.1.3",
109
+ "sass": "1.106.1",
110
+ "storybook": "10.6.3",
111
+ "typescript": "~6.0.2",
112
+ "typescript-eslint": "^8.59.2",
113
+ "vite": "^8.0.12",
114
+ "vitest": "^3.2.4"
115
+ }
116
+ }
@@ -0,0 +1,23 @@
1
+ // NineOS-only mixins. Output nothing until included.
2
+ @use "@rnine/core/scss" as r9;
3
+
4
+ /// Slice glitch on text: give the element data-text="<its text>" and add the
5
+ /// class you pass in $trigger (default .is-glitching) to play it once.
6
+ /// For use inside a CSS module (see keyframes()).
7
+ @mixin glitch-text($trigger: ".is-glitching", $duration: r9.$duration-slow) {
8
+ position: relative;
9
+ &::before,
10
+ &::after {
11
+ content: attr(data-text);
12
+ position: absolute;
13
+ inset: 0;
14
+ pointer-events: none;
15
+ opacity: 0;
16
+ }
17
+ &::before { color: r9.$signal; }
18
+ &::after { color: r9.$accent; }
19
+ @include r9.motion-safe {
20
+ &#{$trigger}::before { animation: r9.keyframes(slice-a) $duration steps(1) 1; }
21
+ &#{$trigger}::after { animation: r9.keyframes(slice-b) $duration steps(1) 1; }
22
+ }
23
+ }
@@ -0,0 +1,6 @@
1
+ // NineOS for SCSS: the shared API (tokens, corner, ornament, texture, ...)
2
+ // plus NineOS's own mixins. Outputs no CSS:
3
+ //
4
+ // @use "@rnine/nineos/scss" as r9;
5
+ @forward "@rnine/core/scss";
6
+ @forward "glitch";
package/scss/base.scss ADDED
@@ -0,0 +1,24 @@
1
+ // NineOS's own global CSS, after core's base.css in styles.css: the keyframes
2
+ // only NineOS uses (the slice glitch, scanline drift, the light band).
3
+ @keyframes r9-slice-a {
4
+ 0% { opacity: 1; clip-path: inset(12% 0 68% 0); transform: translateX(-4%); }
5
+ 25% { clip-path: inset(52% 0 26% 0); transform: translateX(3%); }
6
+ 50% { clip-path: inset(30% 0 52% 0); transform: translateX(-2%); }
7
+ 75% { clip-path: inset(78% 0 6% 0); transform: translateX(2%); }
8
+ 100% { opacity: 0; }
9
+ }
10
+
11
+ @keyframes r9-slice-b {
12
+ 0% { opacity: 1; clip-path: inset(62% 0 14% 0); transform: translateX(4%); }
13
+ 33% { clip-path: inset(18% 0 62% 0); transform: translateX(-3%); }
14
+ 66% { clip-path: inset(40% 0 42% 0); transform: translateX(2%); }
15
+ 100% { opacity: 0; }
16
+ }
17
+
18
+ @keyframes r9-drift { to { transform: translateY(3px); } }
19
+
20
+ // Moved with transform, not top: no layout work, no layout shift
21
+ @keyframes r9-band {
22
+ 0% { transform: translateY(-140px); }
23
+ 60%, 100% { transform: translateY(110vh); }
24
+ }
package/theme.json ADDED
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "NineOS",
3
+ "moods": {
4
+ "light": { "id": "clear", "label": "Clear", "description": "The light mood: white, ink, magenta." },
5
+ "dark": { "id": "cipher", "label": "Cipher", "description": "The dark mood: near-black, neon magenta, scanlines." }
6
+ },
7
+ "auto": "night",
8
+ "palette": { "id": "magenta", "label": "Magenta", "description": "Magenta accent, cyan signal: the default." }
9
+ }
@@ -0,0 +1,46 @@
1
+ {
2
+ "$description": "NineOS primitive colors (accent and signal are the default Magenta palette; tokens/palettes/ swaps them). Never use these directly in components: use the semantic roles in themes/*.json.",
3
+ "color": {
4
+ "$type": "color",
5
+ "gray": {
6
+ "0": { "$value": "#FFFFFF" },
7
+ "10": { "$value": "#F4F4F6" },
8
+ "25": { "$value": "#F5F5F7" },
9
+ "50": { "$value": "#EDEDF1" },
10
+ "100": { "$value": "#DBDBE1" },
11
+ "300": { "$value": "#A2A2AD" },
12
+ "500": { "$value": "#6E6F7A" },
13
+ "600": { "$value": "#4E4F57" },
14
+ "800": { "$value": "#26262C" },
15
+ "850": { "$value": "#18181C" },
16
+ "900": { "$value": "#111114" },
17
+ "950": { "$value": "#0A0A0C" },
18
+ "975": { "$value": "#050506" }
19
+ },
20
+ "accent": {
21
+ "300": { "$value": "#FF4FB0" },
22
+ "400": { "$value": "#FF1F9A" },
23
+ "500": { "$value": "#E6007E" },
24
+ "600": { "$value": "#D4006F" },
25
+ "700": { "$value": "#C20066" },
26
+ "800": { "$value": "#9E0052" }
27
+ },
28
+ "signal": {
29
+ "300": { "$value": "#1FE0FF" },
30
+ "500": { "$value": "#0098C7" },
31
+ "700": { "$value": "#00779C" }
32
+ },
33
+ "green": {
34
+ "400": { "$value": "#3DDC84" },
35
+ "700": { "$value": "#14804A" }
36
+ },
37
+ "amber": {
38
+ "400": { "$value": "#FFB020" },
39
+ "700": { "$value": "#9A5B00" }
40
+ },
41
+ "red": {
42
+ "400": { "$value": "#FF6B4A" },
43
+ "700": { "$value": "#C2361A" }
44
+ }
45
+ }
46
+ }
@@ -0,0 +1,29 @@
1
+ {
2
+ "breakpoint": {
3
+ "$type": "dimension",
4
+ "$description": "Mobile first: styles are for phones, these widths add layout.",
5
+ "sm": { "$value": "640px" },
6
+ "md": { "$value": "900px" },
7
+ "lg": { "$value": "1200px" }
8
+ },
9
+ "container": {
10
+ "$type": "dimension",
11
+ "max": { "$value": "1120px" },
12
+ "text": { "$value": "65ch", "$description": "Longest comfortable line of running text" },
13
+ "gutter": { "$value": "16px", "$description": "Minimum side padding at every width" }
14
+ },
15
+ "header": {
16
+ "$type": "dimension",
17
+ "height": { "$value": "64px" }
18
+ },
19
+ "z": {
20
+ "$type": "number",
21
+ "base": { "$value": 0 },
22
+ "raised": { "$value": 10 },
23
+ "sticky": { "$value": 30 },
24
+ "overlay": { "$value": 40 },
25
+ "modal": { "$value": 50 },
26
+ "toast": { "$value": 60 },
27
+ "fx": { "$value": 70, "$description": "Scanlines and click sparks: above everything, never interactive" }
28
+ }
29
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "duration": {
3
+ "$type": "duration",
4
+ "$description": "Interactions answer within 'fast'; ambient loops are slow enough to ignore.",
5
+ "instant": { "$value": "90ms", "$description": "Press, toggle" },
6
+ "fast": { "$value": "160ms", "$description": "Hover color, small fades" },
7
+ "base": { "$value": "260ms", "$description": "Underlines, arrows, lifts" },
8
+ "slow": { "$value": "420ms", "$description": "Glitch, magnet release, tilt release" },
9
+ "slower": { "$value": "700ms", "$description": "Scroll reveals, decrypt" },
10
+ "ambient": { "$value": "9000ms", "$description": "Sheen, scanline drift, idle ripples" }
11
+ },
12
+ "easing": {
13
+ "$type": "cubicBezier",
14
+ "out": { "$value": [0.2, 0.7, 0.2, 1], "$description": "Default. Things arrive fast and settle" },
15
+ "in-out": { "$value": [0.6, 0, 0.2, 1], "$description": "Things that move across the screen" },
16
+ "linear": { "$value": [0, 0, 1, 1], "$description": "Pointer-following (magnet, tilt) and loops" }
17
+ }
18
+ }
@@ -0,0 +1,65 @@
1
+ {
2
+ "$description": "NineOS Acid palette: overrides the accent and signal primitives and the tints made from them. Picked with data-palette=\"acid\".",
3
+ "label": "Acid",
4
+ "description": "Lime accent, violet signal.",
5
+ "color": {
6
+ "$type": "color",
7
+ "accent": {
8
+ "300": {
9
+ "$value": "#C4FB56"
10
+ },
11
+ "400": {
12
+ "$value": "#ABF910"
13
+ },
14
+ "500": {
15
+ "$value": "#649404"
16
+ },
17
+ "600": {
18
+ "$value": "#567F03"
19
+ },
20
+ "700": {
21
+ "$value": "#4D7103"
22
+ },
23
+ "800": {
24
+ "$value": "#3C5902"
25
+ }
26
+ },
27
+ "signal": {
28
+ "300": {
29
+ "$value": "#BC8CFC"
30
+ },
31
+ "500": {
32
+ "$value": "#AB6EFB"
33
+ },
34
+ "700": {
35
+ "$value": "#8831FA"
36
+ }
37
+ }
38
+ },
39
+ "themes": {
40
+ "light": {
41
+ "$type": "color",
42
+ "accent-soft": {
43
+ "$value": "#567F031F"
44
+ },
45
+ "selection": {
46
+ "$value": "#567F0333"
47
+ },
48
+ "sheen": {
49
+ "$value": "#AB6EFB12"
50
+ }
51
+ },
52
+ "dark": {
53
+ "$type": "color",
54
+ "accent-soft": {
55
+ "$value": "#ABF91029"
56
+ },
57
+ "selection": {
58
+ "$value": "#ABF9104D"
59
+ },
60
+ "sheen": {
61
+ "$value": "#BC8CFC0D"
62
+ }
63
+ }
64
+ }
65
+ }
@@ -0,0 +1,65 @@
1
+ {
2
+ "$description": "NineOS Volt palette: overrides the accent and signal primitives and the tints made from them. Picked with data-palette=\"volt\".",
3
+ "label": "Volt",
4
+ "description": "Cobalt accent, yellow signal.",
5
+ "color": {
6
+ "$type": "color",
7
+ "accent": {
8
+ "300": {
9
+ "$value": "#88A4FF"
10
+ },
11
+ "400": {
12
+ "$value": "#6287FF"
13
+ },
14
+ "500": {
15
+ "$value": "#567DFF"
16
+ },
17
+ "600": {
18
+ "$value": "#3665FF"
19
+ },
20
+ "700": {
21
+ "$value": "#1D51FF"
22
+ },
23
+ "800": {
24
+ "$value": "#0035E3"
25
+ }
26
+ },
27
+ "signal": {
28
+ "300": {
29
+ "$value": "#FFF71A"
30
+ },
31
+ "500": {
32
+ "$value": "#969100"
33
+ },
34
+ "700": {
35
+ "$value": "#706C00"
36
+ }
37
+ }
38
+ },
39
+ "themes": {
40
+ "light": {
41
+ "$type": "color",
42
+ "accent-soft": {
43
+ "$value": "#3665FF1F"
44
+ },
45
+ "selection": {
46
+ "$value": "#3665FF33"
47
+ },
48
+ "sheen": {
49
+ "$value": "#96910012"
50
+ }
51
+ },
52
+ "dark": {
53
+ "$type": "color",
54
+ "accent-soft": {
55
+ "$value": "#6287FF29"
56
+ },
57
+ "selection": {
58
+ "$value": "#6287FF4D"
59
+ },
60
+ "sheen": {
61
+ "$value": "#FFF71A0D"
62
+ }
63
+ }
64
+ }
65
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "corner": {
3
+ "$type": "dimension",
4
+ "$description": "Corner sizes. NineOS objects have cut corners instead of rounded ones (shape.cut 1, shape.round 0).",
5
+ "sm": { "$value": "6px", "$description": "Chips, small buttons, inputs" },
6
+ "md": { "$value": "10px", "$description": "Buttons, terminals, panels" },
7
+ "lg": { "$value": "18px", "$description": "Cards (single top-right cut)" }
8
+ },
9
+ "shape": {
10
+ "$type": "number",
11
+ "$description": "How corner() draws a corner: the cut (a 45° chamfer) and the rounding, each a multiple of the corner size.",
12
+ "cut": { "$value": 1, "$description": "NineOS: corners are cut" },
13
+ "round": { "$value": 0, "$description": "NineOS: no rounding" }
14
+ },
15
+ "radius": {
16
+ "$type": "dimension",
17
+ "none": { "$value": "0px" },
18
+ "xs": { "$value": "2px", "$description": "Only for tiny things a corner cut can't fit: checkboxes, dots" },
19
+ "full": { "$value": "999px", "$description": "Status dots and avatars only" }
20
+ },
21
+ "border": {
22
+ "$type": "dimension",
23
+ "hair": { "$value": "1px" },
24
+ "strong": { "$value": "2px" }
25
+ }
26
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "space": {
3
+ "$type": "dimension",
4
+ "$description": "4px grid. Gaps between siblings use these; never margins.",
5
+ "0": { "$value": "0rem" },
6
+ "1": { "$value": "0.25rem" },
7
+ "2": { "$value": "0.5rem" },
8
+ "3": { "$value": "0.75rem" },
9
+ "4": { "$value": "1rem" },
10
+ "5": { "$value": "1.25rem" },
11
+ "6": { "$value": "1.5rem" },
12
+ "8": { "$value": "2rem" },
13
+ "10": { "$value": "2.5rem" },
14
+ "12": { "$value": "3rem" },
15
+ "16": { "$value": "4rem" },
16
+ "20": { "$value": "5rem" },
17
+ "24": { "$value": "6rem" }
18
+ }
19
+ }
@@ -0,0 +1,81 @@
1
+ {
2
+ "$description": "Cipher: the dark mood. Near-black, neon magenta, scanlines; the same layout and type as Clear.",
3
+ "theme": {
4
+ "$type": "color",
5
+ "bg": {
6
+ "$value": "{color.gray.975}"
7
+ },
8
+ "surface": {
9
+ "$value": "{color.gray.900}"
10
+ },
11
+ "surface-raised": {
12
+ "$value": "{color.gray.850}"
13
+ },
14
+ "glass": {
15
+ "$value": "#050506C7"
16
+ },
17
+ "fg": {
18
+ "$value": "{color.gray.10}"
19
+ },
20
+ "fg-muted": {
21
+ "$value": "{color.gray.300}"
22
+ },
23
+ "fg-subtle": {
24
+ "$value": "{color.gray.500}"
25
+ },
26
+ "line": {
27
+ "$value": "{color.gray.800}"
28
+ },
29
+ "line-strong": {
30
+ "$value": "{color.gray.600}"
31
+ },
32
+ "accent": {
33
+ "$value": "{color.accent.400}"
34
+ },
35
+ "accent-hover": {
36
+ "$value": "{color.accent.300}"
37
+ },
38
+ "accent-text": {
39
+ "$value": "{color.accent.300}"
40
+ },
41
+ "on-accent": {
42
+ "$value": "{color.gray.975}"
43
+ },
44
+ "accent-soft": {
45
+ "$value": "#FF1F9A29"
46
+ },
47
+ "signal": {
48
+ "$value": "{color.signal.300}"
49
+ },
50
+ "signal-text": {
51
+ "$value": "{color.signal.300}"
52
+ },
53
+ "inverse-bg": {
54
+ "$value": "{color.gray.10}"
55
+ },
56
+ "inverse-fg": {
57
+ "$value": "{color.gray.975}"
58
+ },
59
+ "success": {
60
+ "$value": "{color.green.400}"
61
+ },
62
+ "warning": {
63
+ "$value": "{color.amber.400}"
64
+ },
65
+ "danger": {
66
+ "$value": "{color.red.400}"
67
+ },
68
+ "dot": {
69
+ "$value": "#F4F4F621"
70
+ },
71
+ "scan": {
72
+ "$value": "#FFFFFF08"
73
+ },
74
+ "sheen": {
75
+ "$value": "#1FE0FF0D"
76
+ },
77
+ "selection": {
78
+ "$value": "#FF1F9A4D"
79
+ }
80
+ }
81
+ }
@@ -0,0 +1,106 @@
1
+ {
2
+ "$description": "Clear: the light mood. Calm and clinical, lots of white, hairlines, magenta for the one thing that matters.",
3
+ "theme": {
4
+ "$type": "color",
5
+ "bg": {
6
+ "$value": "{color.gray.0}",
7
+ "$description": "Page background"
8
+ },
9
+ "surface": {
10
+ "$value": "{color.gray.25}",
11
+ "$description": "Cards, panels, inputs"
12
+ },
13
+ "surface-raised": {
14
+ "$value": "{color.gray.0}",
15
+ "$description": "Menus, popovers, toasts"
16
+ },
17
+ "glass": {
18
+ "$value": "#FFFFFFD1",
19
+ "$description": "Translucent surface for UI floating over the dot field (panels, dock, HUD), with a backdrop blur"
20
+ },
21
+ "fg": {
22
+ "$value": "{color.gray.950}",
23
+ "$description": "Main text and icons"
24
+ },
25
+ "fg-muted": {
26
+ "$value": "{color.gray.600}",
27
+ "$description": "Secondary text"
28
+ },
29
+ "fg-subtle": {
30
+ "$value": "{color.gray.500}",
31
+ "$description": "Placeholders, disabled text (large text only)"
32
+ },
33
+ "line": {
34
+ "$value": "{color.gray.100}",
35
+ "$description": "Hairline borders and dividers"
36
+ },
37
+ "line-strong": {
38
+ "$value": "{color.gray.300}",
39
+ "$description": "Input borders, hovered hairlines"
40
+ },
41
+ "accent": {
42
+ "$value": "{color.accent.600}",
43
+ "$description": "Magenta: primary actions, the one mark on every component"
44
+ },
45
+ "accent-hover": {
46
+ "$value": "{color.accent.700}",
47
+ "$description": "Hovered and pressed accent fills"
48
+ },
49
+ "accent-text": {
50
+ "$value": "{color.accent.700}",
51
+ "$description": "Magenta text and icons on bg or surface"
52
+ },
53
+ "on-accent": {
54
+ "$value": "{color.gray.0}",
55
+ "$description": "Text on accent fills"
56
+ },
57
+ "accent-soft": {
58
+ "$value": "#D4006F1F",
59
+ "$description": "Tinted backgrounds, focus glow"
60
+ },
61
+ "signal": {
62
+ "$value": "{color.signal.500}",
63
+ "$description": "Cyan: live states, cursor light, data. Never a second brand color"
64
+ },
65
+ "signal-text": {
66
+ "$value": "{color.signal.700}",
67
+ "$description": "Cyan text on bg or surface"
68
+ },
69
+ "inverse-bg": {
70
+ "$value": "{color.gray.950}",
71
+ "$description": "Index chips, inverted tags"
72
+ },
73
+ "inverse-fg": {
74
+ "$value": "{color.gray.0}",
75
+ "$description": "Text on inverse-bg"
76
+ },
77
+ "success": {
78
+ "$value": "{color.green.700}",
79
+ "$description": "Success status text and icons. Always with an icon or a word, never color alone"
80
+ },
81
+ "warning": {
82
+ "$value": "{color.amber.700}",
83
+ "$description": "Warning status text and icons. Always with an icon or a word"
84
+ },
85
+ "danger": {
86
+ "$value": "{color.red.700}",
87
+ "$description": "Errors and destructive actions. Always with an icon or a word"
88
+ },
89
+ "dot": {
90
+ "$value": "#0A0A0C29",
91
+ "$description": "Dot field and dotted grid"
92
+ },
93
+ "scan": {
94
+ "$value": "#00000000",
95
+ "$description": "Scanlines (off in Clear)"
96
+ },
97
+ "sheen": {
98
+ "$value": "#0098C712",
99
+ "$description": "Light band that crosses heroes"
100
+ },
101
+ "selection": {
102
+ "$value": "#D4006F33",
103
+ "$description": "Text selection"
104
+ }
105
+ }
106
+ }