@astryx-vue/themes 0.0.0-stage → 0.1.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.
Files changed (56) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +14 -2
  3. package/THIRD_PARTY_NOTICES.md +41 -0
  4. package/css.d.ts +3 -0
  5. package/fonts.css +6 -0
  6. package/neutral/alert-dialog.css +9 -0
  7. package/neutral/avatar-group.css +10 -0
  8. package/neutral/avatar.css +16 -0
  9. package/neutral/badge.css +36 -0
  10. package/neutral/banner.css +16 -0
  11. package/neutral/base.css +254 -0
  12. package/neutral/bottom-sheet.css +17 -0
  13. package/neutral/button.css +34 -0
  14. package/neutral/card.css +33 -0
  15. package/neutral/center.css +8 -0
  16. package/neutral/chat.css +28 -0
  17. package/neutral/checkbox.css +13 -0
  18. package/neutral/citation.css +16 -0
  19. package/neutral/code.css +36 -0
  20. package/neutral/collapsible.css +11 -0
  21. package/neutral/context-menu.css +19 -0
  22. package/neutral/dialog.css +14 -0
  23. package/neutral/divider.css +10 -0
  24. package/neutral/dropdown-menu.css +18 -0
  25. package/neutral/empty-state.css +10 -0
  26. package/neutral/field.css +1 -0
  27. package/neutral/grid.css +8 -0
  28. package/neutral/heading.css +24 -0
  29. package/neutral/hover-card.css +14 -0
  30. package/neutral/icon.css +24 -0
  31. package/neutral/input.css +22 -0
  32. package/neutral/kbd.css +10 -0
  33. package/neutral/link.css +10 -0
  34. package/neutral/list.css +13 -0
  35. package/neutral/mobile-nav.css +8 -0
  36. package/neutral/more-menu.css +20 -0
  37. package/neutral/nav-menu.css +8 -0
  38. package/neutral/overlay.css +9 -0
  39. package/neutral/popover.css +13 -0
  40. package/neutral/progress-bar.css +16 -0
  41. package/neutral/radio.css +9 -0
  42. package/neutral/segmented-control.css +19 -0
  43. package/neutral/side-nav.css +9 -0
  44. package/neutral/skeleton.css +8 -0
  45. package/neutral/slider.css +10 -0
  46. package/neutral/spinner.css +22 -0
  47. package/neutral/status-dot.css +12 -0
  48. package/neutral/switch.css +30 -0
  49. package/neutral/text-area.css +10 -0
  50. package/neutral/text.css +26 -0
  51. package/neutral/toast.css +13 -0
  52. package/neutral/toggle-button.css +10 -0
  53. package/neutral/token.css +29 -0
  54. package/neutral/tooltip.css +10 -0
  55. package/neutral.css +51 -0
  56. package/package.json +51 -3
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 astryx-vue contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,15 @@
1
- # Temporary Holding Version
1
+ # @astryx-vue/themes
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Themes for astryx-vue.
4
+
5
+ Docs: <https://astryx-vue.pages.dev>
6
+
7
+ ```bash
8
+ pnpm add @astryx-vue/core @astryx-vue/themes
9
+ ```
10
+
11
+ ```ts
12
+ import '@astryx-vue/themes/neutral.css'
13
+ ```
14
+
15
+ That entry loads JetBrains Mono at 400, 500, 600, 700, and 400 italic. Component styles come from `@astryx-vue/core`; import `@astryx-vue/core/styles.css` once if you want the full structural sheet.
@@ -0,0 +1,41 @@
1
+ # Third-party notices
2
+
3
+ ## Astryx
4
+
5
+ This project is an unofficial community Vue port based on the public Astryx project:
6
+
7
+ - Repository: <https://github.com/facebook/astryx>
8
+ - Version used for the first round: `v0.4.1`
9
+ - Commit: `96f9917fe013a7062a403c58e54dfd47f482d89f`
10
+ - License: MIT
11
+ - Copyright: (c) 2026 Meta Platforms, Inc.
12
+
13
+ The TextInput, CheckboxInput, CheckboxIndicator, Slider, Banner and Field family added in October 2026 also references the upstream implementation at commit `92779d3fbd0f12e659203c7d719d5bb00935060c`, including TextInput, CheckboxInput, CheckboxIndicator, Slider, Banner, Field, FieldLabel, FieldStatus and the shared input styles. Their public behavior and visual structure are adapted into native Vue components under the same MIT license. The Vue model/events, scoped slots and async-state implementation are local adaptations.
14
+
15
+ When files or substantial portions are copied or adapted, their original copyright and license notices must be kept here or alongside the adapted files.
16
+
17
+ No Meta trademarks, logos, or endorsement are granted by the Astryx software license.
18
+
19
+ ## Astryx license text
20
+
21
+ MIT License
22
+
23
+ Copyright (c) 2026 Meta Platforms, Inc.
24
+
25
+ Permission is hereby granted, free of charge, to any person obtaining a copy
26
+ of this software and associated documentation files (the "Software"), to deal
27
+ in the Software without restriction, including without limitation the rights
28
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
29
+ copies of the Software, and to permit persons to whom the Software is
30
+ furnished to do so, subject to the following conditions:
31
+
32
+ The above copyright notice and this permission notice shall be included in all
33
+ copies or substantial portions of the Software.
34
+
35
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
36
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
37
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
38
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
39
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
40
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
41
+ SOFTWARE.
package/css.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ declare const stylesheet: string
2
+
3
+ export default stylesheet
package/fonts.css ADDED
@@ -0,0 +1,6 @@
1
+ /* 各主题共用的等宽字形。主题入口在内部引入,使用方不要单独 import 这个文件。 */
2
+ @import '@fontsource/jetbrains-mono/400.css';
3
+ @import '@fontsource/jetbrains-mono/400-italic.css';
4
+ @import '@fontsource/jetbrains-mono/500.css';
5
+ @import '@fontsource/jetbrains-mono/600.css';
6
+ @import '@fontsource/jetbrains-mono/700.css';
@@ -0,0 +1,9 @@
1
+ @layer astryx.reset, astryx.tokens, astryx.base, astryx.components, astryx.overrides;
2
+
3
+ @layer astryx.tokens {
4
+ :root,
5
+ [data-astryx-theme='neutral'] {
6
+ --astryx-alert-dialog-title-foreground: light-dark(#171717, #fafafa);
7
+ --astryx-alert-dialog-description-foreground: light-dark(#525252, #a3a3a3);
8
+ }
9
+ }
@@ -0,0 +1,10 @@
1
+ @layer astryx.reset, astryx.tokens, astryx.base, astryx.components, astryx.overrides;
2
+
3
+ @layer astryx.tokens {
4
+ :root,
5
+ [data-astryx-theme='neutral'] {
6
+ --astryx-avatar-group-border-color: light-dark(#fff, #171717);
7
+ --astryx-avatar-group-overflow-background: light-dark(#e5e5e5, #525252);
8
+ --astryx-avatar-group-overflow-foreground: light-dark(#525252, #e5e5e5);
9
+ }
10
+ }
@@ -0,0 +1,16 @@
1
+ @layer astryx.reset, astryx.tokens, astryx.base, astryx.components, astryx.overrides;
2
+
3
+ @layer astryx.tokens {
4
+ :root,
5
+ [data-astryx-theme='neutral'] {
6
+ --astryx-avatar-fallback-background: light-dark(#e5e5e5, #525252);
7
+ --astryx-avatar-fallback-foreground: light-dark(#525252, #e5e5e5);
8
+ --astryx-avatar-status-dot-border-color: light-dark(#fff, #171717);
9
+
10
+ --astryx-avatar-status-dot-neutral-background: light-dark(#a3a3a3, #737373);
11
+ --astryx-avatar-status-dot-info-background: light-dark(#0074e2, #6d9cfe);
12
+ --astryx-avatar-status-dot-success-background: light-dark(#198100, #64af4c);
13
+ --astryx-avatar-status-dot-warning-background: #ffce2f;
14
+ --astryx-avatar-status-dot-error-background: light-dark(#e33f4a, #ff705d);
15
+ }
16
+ }
@@ -0,0 +1,36 @@
1
+ @layer astryx.reset, astryx.tokens, astryx.base, astryx.components, astryx.overrides;
2
+
3
+ @layer astryx.tokens {
4
+ :root,
5
+ [data-astryx-theme='neutral'] {
6
+ --astryx-badge-neutral-background: light-dark(#e5e5e5, #ffffff1a);
7
+ --astryx-badge-neutral-foreground: light-dark(#262626, #e5e5e5);
8
+ --astryx-badge-info-background: light-dark(#0074e2, #6d9cfe);
9
+ --astryx-badge-info-foreground: light-dark(#ffffff, #171717);
10
+ --astryx-badge-success-background: light-dark(#198100, #64af4c);
11
+ --astryx-badge-success-foreground: light-dark(#ffffff, #171717);
12
+ --astryx-badge-warning-background: #ffce2f;
13
+ --astryx-badge-warning-foreground: #171717;
14
+ --astryx-badge-error-background: light-dark(#e33f4a, #ff705d);
15
+ --astryx-badge-error-foreground: light-dark(#ffffff, #171717);
16
+
17
+ --astryx-badge-blue-background: light-dark(#c4ddfb, #9eb7ff3d);
18
+ --astryx-badge-blue-foreground: light-dark(#00458c, #c7d3ff);
19
+ --astryx-badge-cyan-background: light-dark(#a3e0ef, #83c2d43d);
20
+ --astryx-badge-cyan-foreground: light-dark(#00505f, #9edef0);
21
+ --astryx-badge-green-background: light-dark(#c5e5c0, #84c9803d);
22
+ --astryx-badge-green-foreground: light-dark(#0c5700, #9fe59b);
23
+ --astryx-badge-orange-background: light-dark(#fad0b5, #ffa2583d);
24
+ --astryx-badge-orange-foreground: light-dark(#6e3500, #ffc9a2);
25
+ --astryx-badge-pink-background: light-dark(#fccadc, #ff99c33d);
26
+ --astryx-badge-pink-foreground: light-dark(#83004b, #ffc3da);
27
+ --astryx-badge-purple-background: light-dark(#eccef3, #f297ff3d);
28
+ --astryx-badge-purple-foreground: light-dark(#700084, #fac1ff);
29
+ --astryx-badge-red-background: light-dark(#facecb, #ff9e973d);
30
+ --astryx-badge-red-foreground: light-dark(#89001a, #ffc6c1);
31
+ --astryx-badge-teal-background: light-dark(#a5e3d6, #7ec6b83d);
32
+ --astryx-badge-teal-foreground: light-dark(#005348, #99e2d3);
33
+ --astryx-badge-yellow-background: light-dark(#f8da9d, #deb4333d);
34
+ --astryx-badge-yellow-foreground: light-dark(#584400, #fdcf4f);
35
+ }
36
+ }
@@ -0,0 +1,16 @@
1
+ @layer astryx.reset, astryx.tokens, astryx.base, astryx.components, astryx.overrides;
2
+ @layer astryx.tokens {
3
+ :root,
4
+ [data-astryx-theme='neutral'] {
5
+ --astryx-banner-info-background: light-dark(#f5f5f5, #262626);
6
+ --astryx-banner-info-foreground: light-dark(#262626, #ebebeb);
7
+ --astryx-banner-error-background: light-dark(#facecb, #ff9e973d);
8
+ --astryx-banner-error-foreground: light-dark(#89001a, #ffc6c1);
9
+ --astryx-banner-warning-background: light-dark(#f8da9d, #deb4333d);
10
+ --astryx-banner-warning-foreground: light-dark(#584400, #fdcf4f);
11
+ --astryx-banner-success-background: light-dark(#c5e5c0, #84c9803d);
12
+ --astryx-banner-success-foreground: light-dark(#0c5700, #9fe59b);
13
+ --astryx-banner-content-background: light-dark(#fff, #171717);
14
+ --astryx-banner-border: light-dark(#e5e5e5, #404040);
15
+ }
16
+ }
@@ -0,0 +1,254 @@
1
+ /**
2
+ * Neutral semantic tokens.
3
+ *
4
+ * Names follow upstream theme/tokens.stylex.ts, with an --astryx- prefix.
5
+ * When packages/themes/neutral overrides a token, that value is used.
6
+ * Otherwise the value is the default from tokens.stylex.ts.
7
+ * Both stops are written with light-dark().
8
+ *
9
+ * Durations are the neutral motion scale:
10
+ * { fast: 125, medium: 300, slow: 700, ratio: 0.75 }, rounded to 5ms.
11
+ *
12
+ * Two values stay as this package already shipped them, so existing
13
+ * components do not change appearance:
14
+ * - radius-none stays 0. Upstream neutral uses 0.25rem, which would round
15
+ * square avatars and skeletons that treat this token as a square corner.
16
+ * - color-text-secondary's light stop stays #525252. Upstream neutral uses
17
+ * #737373. Inputs, selectors, and supporting text already use this value.
18
+ */
19
+ @layer astryx.reset, astryx.tokens, astryx.base, astryx.components, astryx.overrides;
20
+
21
+ @layer astryx.tokens {
22
+ :root,
23
+ [data-astryx-theme='neutral'] {
24
+ color-scheme: light dark;
25
+
26
+ --astryx-color-accent: light-dark(#262626, #ebebeb);
27
+ --astryx-color-accent-muted: light-dark(#f1f1f1, #262626);
28
+ --astryx-color-on-accent: light-dark(#ffffff, #171717);
29
+ --astryx-color-neutral: light-dark(#0000000f, #ffffff1a);
30
+ --astryx-color-background-surface: light-dark(#ffffff, #262626);
31
+ --astryx-color-background-body: light-dark(#f1f1f1, #1b1b1b);
32
+ --astryx-color-overlay: light-dark(#00000080, #000000cc);
33
+ --astryx-color-overlay-hover: light-dark(#0000000d, #ffffff0d);
34
+ --astryx-color-overlay-pressed: light-dark(#0000001a, #ffffff1a);
35
+ --astryx-color-background-muted: light-dark(#f1f1f1, #1b1b1b);
36
+
37
+ --astryx-color-text-primary: light-dark(#171717, #fafafa);
38
+ --astryx-color-text-secondary: light-dark(#525252, #a3a3a3);
39
+ --astryx-color-text-disabled: light-dark(#a3a3a3, #525252);
40
+ --astryx-color-text-accent: light-dark(#262626, #ebebeb);
41
+ --astryx-color-on-dark: light-dark(#ffffff, #ffffff);
42
+ --astryx-color-on-light: light-dark(#171717, #171717);
43
+
44
+ --astryx-color-icon-accent: light-dark(#262626, #ebebeb);
45
+ --astryx-color-icon-primary: light-dark(#171717, #fafafa);
46
+ --astryx-color-icon-secondary: light-dark(#737373, #a3a3a3);
47
+ --astryx-color-icon-disabled: light-dark(#a3a3a3, #525252);
48
+
49
+ --astryx-color-background-card: light-dark(#ffffff, #1b1b1b);
50
+ --astryx-color-background-popover: light-dark(#ffffff, #1b1b1b);
51
+ --astryx-color-background-inverted: light-dark(#0a1317, #ffffff);
52
+ --astryx-color-background-error-inverted: light-dark(#aa071e, #e3193b);
53
+
54
+ --astryx-color-success: light-dark(#007004, #9fe59b);
55
+ --astryx-color-success-muted: light-dark(#c5e5c0, #84c9803d);
56
+ --astryx-color-on-success: light-dark(#ffffff, #171717);
57
+ --astryx-color-error: light-dark(#a50c25, #ffc6c1);
58
+ --astryx-color-error-muted: light-dark(#facecb, #ff9e973d);
59
+ --astryx-color-on-error: light-dark(#ffffff, #171717);
60
+ --astryx-color-warning: light-dark(#745b00, #fdcf4f);
61
+ --astryx-color-warning-muted: light-dark(#f8da9d, #deb4333d);
62
+ --astryx-color-on-warning: light-dark(#171717, #171717);
63
+
64
+ --astryx-color-border: light-dark(#ebebeb, #ffffff1a);
65
+ --astryx-color-border-emphasized: light-dark(#d4d4d4, #525252);
66
+
67
+ --astryx-color-skeleton: light-dark(#ebebeb, #525252);
68
+ --astryx-color-track: light-dark(#ccd3db, #5a5e66);
69
+ --astryx-color-shadow: light-dark(#0000001a, #0000004d);
70
+ --astryx-color-tint-hover: light-dark(black, white);
71
+
72
+ --astryx-color-background-blue: light-dark(#c4ddfb, #9eb7ff3d);
73
+ --astryx-color-border-blue: light-dark(#b1c9e7, #6d9cfe);
74
+ --astryx-color-icon-blue: light-dark(#00458c, #9eb7ff);
75
+ --astryx-color-text-blue: light-dark(#00458c, #c7d3ff);
76
+
77
+ --astryx-color-background-cyan: light-dark(#a3e0ef, #83c2d43d);
78
+ --astryx-color-border-cyan: light-dark(#91d3e3, #67a7b8);
79
+ --astryx-color-icon-cyan: light-dark(#00505f, #83c2d4);
80
+ --astryx-color-text-cyan: light-dark(#00505f, #9edef0);
81
+
82
+ --astryx-color-background-gray: light-dark(#e5e5e5, var(--astryx-color-neutral));
83
+ --astryx-color-border-gray: light-dark(#d4d4d4, #262626);
84
+ --astryx-color-icon-gray: light-dark(#525252, #a3a3a3);
85
+ --astryx-color-text-gray: light-dark(#262626, #e5e5e5);
86
+
87
+ --astryx-color-background-green: light-dark(#c5e5c0, #84c9803d);
88
+ --astryx-color-border-green: light-dark(#b2d1ac, #69ad67);
89
+ --astryx-color-icon-green: light-dark(#0c5700, #84c980);
90
+ --astryx-color-text-green: light-dark(#0c5700, #9fe59b);
91
+
92
+ --astryx-color-background-orange: light-dark(#fad0b5, #ffa2583d);
93
+ --astryx-color-border-orange: light-dark(#e6bda2, #e2883e);
94
+ --astryx-color-icon-orange: light-dark(#6e3500, #ffa258);
95
+ --astryx-color-text-orange: light-dark(#6e3500, #ffc9a2);
96
+
97
+ --astryx-color-background-pink: light-dark(#fccadc, #ff99c33d);
98
+ --astryx-color-border-pink: light-dark(#e7b7c8, #f273aa);
99
+ --astryx-color-icon-pink: light-dark(#83004b, #ff99c3);
100
+ --astryx-color-text-pink: light-dark(#83004b, #ffc3da);
101
+
102
+ --astryx-color-background-purple: light-dark(#eccef3, #f297ff3d);
103
+ --astryx-color-border-purple: light-dark(#d8bbdf, #dd74f0);
104
+ --astryx-color-icon-purple: light-dark(#700084, #f297ff);
105
+ --astryx-color-text-purple: light-dark(#700084, #fac1ff);
106
+
107
+ --astryx-color-background-red: light-dark(#facecb, #ff9e973d);
108
+ --astryx-color-border-red: light-dark(#e6bab8, #ff6f6c);
109
+ --astryx-color-icon-red: light-dark(#89001a, #ff9e97);
110
+ --astryx-color-text-red: light-dark(#89001a, #ffc6c1);
111
+
112
+ --astryx-color-background-teal: light-dark(#a5e3d6, #7ec6b83d);
113
+ --astryx-color-border-teal: light-dark(#94d6c8, #63ab9d);
114
+ --astryx-color-icon-teal: light-dark(#005348, #7ec6b8);
115
+ --astryx-color-text-teal: light-dark(#005348, #99e2d3);
116
+
117
+ --astryx-color-background-yellow: light-dark(#f8da9d, #deb4333d);
118
+ --astryx-color-border-yellow: light-dark(#e4c279, #c0990e);
119
+ --astryx-color-icon-yellow: light-dark(#584400, #deb433);
120
+ --astryx-color-text-yellow: light-dark(#584400, #fdcf4f);
121
+
122
+ --astryx-spacing-0: 0;
123
+ --astryx-spacing-0-5: 2px;
124
+ --astryx-spacing-1: 4px;
125
+ --astryx-spacing-1-5: 6px;
126
+ --astryx-spacing-2: 8px;
127
+ --astryx-spacing-3: 12px;
128
+ --astryx-spacing-4: 16px;
129
+ --astryx-spacing-5: 20px;
130
+ --astryx-spacing-6: 24px;
131
+ --astryx-spacing-7: 28px;
132
+ --astryx-spacing-8: 32px;
133
+ --astryx-spacing-9: 36px;
134
+ --astryx-spacing-10: 40px;
135
+ --astryx-spacing-11: 44px;
136
+ --astryx-spacing-12: 48px;
137
+
138
+ --astryx-size-element-sm: 28px;
139
+ --astryx-size-element-md: 32px;
140
+ --astryx-size-element-lg: 36px;
141
+
142
+ --astryx-border-width: 1px;
143
+
144
+ --astryx-focus-outline-width: 2px;
145
+ --astryx-focus-outline-style: solid;
146
+ --astryx-focus-outline-color: var(--astryx-color-accent);
147
+ --astryx-focus-outline-offset: 3px;
148
+
149
+ --astryx-radius-none: 0;
150
+ --astryx-radius-inner: 0.375rem;
151
+ --astryx-radius-element: 0.625rem;
152
+ --astryx-radius-container: 0.75rem;
153
+ --astryx-radius-page: 1.75rem;
154
+ --astryx-radius-chat: 28px;
155
+ --astryx-radius-full: 9999px;
156
+
157
+ --astryx-shadow-low: 0 2px 4px light-dark(oklch(0 0 0 / 5%), oklch(0 0 0 / 25%)), 0 4px 8px light-dark(oklch(0 0 0 / 10%), oklch(0 0 0 / 40%)), inset 0 0 0 1px light-dark(transparent, oklch(1 0 0 / 8%));
158
+ --astryx-shadow-med: 0 2px 4px light-dark(oklch(0 0 0 / 5%), oklch(0 0 0 / 35%)), 0 4px 12px light-dark(oklch(0 0 0 / 10%), oklch(0 0 0 / 50%)), inset 0 0 0 1px light-dark(transparent, oklch(1 0 0 / 12%));
159
+ --astryx-shadow-high: 0 4px 6px light-dark(oklch(0 0 0 / 10%), oklch(0 0 0 / 50%)), 0 12px 24px light-dark(oklch(0 0 0 / 15%), oklch(0 0 0 / 70%)), inset 0 0 0 1px light-dark(transparent, oklch(1 0 0 / 15%));
160
+ --astryx-shadow-inset-hover: inset 0px 0px 0px 2px #0074e24d;
161
+ --astryx-shadow-inset-selected: inset 0px 0px 0px 2px #0074e280;
162
+ --astryx-shadow-inset-success: inset 0px 0px 0px 2px #1981004d;
163
+ --astryx-shadow-inset-warning: inset 0px 0px 0px 2px #ffce2f4d;
164
+ --astryx-shadow-inset-error: inset 0px 0px 0px 2px #e33f4a4d;
165
+
166
+ --astryx-duration-fast-min: 95ms;
167
+ --astryx-duration-fast: 125ms;
168
+ --astryx-duration-fast-max: 165ms;
169
+ --astryx-duration-medium-min: 225ms;
170
+ --astryx-duration-medium: 300ms;
171
+ --astryx-duration-medium-max: 400ms;
172
+ --astryx-duration-slow-min: 525ms;
173
+ --astryx-duration-slow: 700ms;
174
+ --astryx-duration-slow-max: 935ms;
175
+
176
+ --astryx-ease-standard: cubic-bezier(0.24, 1, 0.4, 1);
177
+
178
+ --astryx-font-family-body: Figtree, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
179
+ --astryx-font-family-code: 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
180
+ --astryx-font-family-heading: Figtree, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
181
+
182
+ --astryx-font-size-4xs: 0.375rem;
183
+ --astryx-font-size-3xs: 0.4375rem;
184
+ --astryx-font-size-2xs: 0.5rem;
185
+ --astryx-font-size-xs: 0.625rem;
186
+ --astryx-font-size-sm: 0.75rem;
187
+ --astryx-font-size-base: 0.875rem;
188
+ --astryx-font-size-lg: 1.0625rem;
189
+ --astryx-font-size-xl: 1.25rem;
190
+ --astryx-font-size-2xl: 1.5rem;
191
+ --astryx-font-size-3xl: 1.8125rem;
192
+ --astryx-font-size-4xl: 2.1875rem;
193
+ --astryx-font-size-5xl: 2.625rem;
194
+
195
+ --astryx-font-weight-normal: 400;
196
+ --astryx-font-weight-regular: var(--astryx-font-weight-normal);
197
+ --astryx-font-weight-medium: 500;
198
+ --astryx-font-weight-semibold: 600;
199
+ --astryx-font-weight-bold: 700;
200
+
201
+ --astryx-text-heading-1-size: var(--astryx-font-size-2xl);
202
+ --astryx-text-heading-1-weight: var(--astryx-font-weight-semibold);
203
+ --astryx-text-heading-1-leading: 1.3333;
204
+ --astryx-text-heading-2-size: var(--astryx-font-size-xl);
205
+ --astryx-text-heading-2-weight: var(--astryx-font-weight-semibold);
206
+ --astryx-text-heading-2-leading: 1.4;
207
+ --astryx-text-heading-3-size: var(--astryx-font-size-lg);
208
+ --astryx-text-heading-3-weight: var(--astryx-font-weight-semibold);
209
+ --astryx-text-heading-3-leading: 1.4118;
210
+ --astryx-text-heading-4-size: var(--astryx-font-size-base);
211
+ --astryx-text-heading-4-weight: var(--astryx-font-weight-semibold);
212
+ --astryx-text-heading-4-leading: 1.4286;
213
+ --astryx-text-heading-5-size: var(--astryx-font-size-sm);
214
+ --astryx-text-heading-5-weight: var(--astryx-font-weight-semibold);
215
+ --astryx-text-heading-5-leading: 1.6667;
216
+ --astryx-text-heading-6-size: var(--astryx-font-size-xs);
217
+ --astryx-text-heading-6-weight: var(--astryx-font-weight-semibold);
218
+ --astryx-text-heading-6-leading: 1.6;
219
+
220
+ --astryx-text-body-size: var(--astryx-font-size-base);
221
+ --astryx-text-body-weight: var(--astryx-font-weight-normal);
222
+ --astryx-text-body-leading: 1.4286;
223
+ --astryx-text-large-size: var(--astryx-font-size-lg);
224
+ --astryx-text-large-weight: var(--astryx-font-weight-semibold);
225
+ --astryx-text-large-leading: 1.4118;
226
+ --astryx-text-label-size: var(--astryx-font-size-base);
227
+ --astryx-text-label-weight: var(--astryx-font-weight-medium);
228
+ --astryx-text-label-leading: 1.4286;
229
+ --astryx-text-code-size: var(--astryx-font-size-base);
230
+ --astryx-text-code-weight: var(--astryx-font-weight-normal);
231
+ --astryx-text-code-leading: 1.4286;
232
+ --astryx-text-supporting-size: var(--astryx-font-size-sm);
233
+ --astryx-text-supporting-weight: var(--astryx-font-weight-normal);
234
+ --astryx-text-supporting-leading: 1.6667;
235
+
236
+ --astryx-text-display-1-size: var(--astryx-font-size-5xl);
237
+ --astryx-text-display-1-weight: var(--astryx-font-weight-normal);
238
+ --astryx-text-display-1-leading: 1.2381;
239
+ --astryx-text-display-2-size: var(--astryx-font-size-4xl);
240
+ --astryx-text-display-2-weight: var(--astryx-font-weight-normal);
241
+ --astryx-text-display-2-leading: 1.2571;
242
+ --astryx-text-display-3-size: var(--astryx-font-size-3xl);
243
+ --astryx-text-display-3-weight: var(--astryx-font-weight-normal);
244
+ --astryx-text-display-3-leading: 1.2414;
245
+ }
246
+
247
+ [data-astryx-color-mode='light'] {
248
+ color-scheme: light;
249
+ }
250
+
251
+ [data-astryx-color-mode='dark'] {
252
+ color-scheme: dark;
253
+ }
254
+ }
@@ -0,0 +1,17 @@
1
+ @layer astryx.reset, astryx.tokens, astryx.base, astryx.components, astryx.overrides;
2
+
3
+ @layer astryx.tokens {
4
+ :root,
5
+ [data-astryx-theme='neutral'] {
6
+ --astryx-bottom-sheet-background: light-dark(#ffffff, #262626);
7
+ --astryx-bottom-sheet-foreground: light-dark(#171717, #fafafa);
8
+ --astryx-bottom-sheet-border: light-dark(#d4d4d4, #525252);
9
+ --astryx-bottom-sheet-scrim: light-dark(#00000080, #000000cc);
10
+ --astryx-bottom-sheet-handle-background: light-dark(#d4d4d4, #525252);
11
+ --astryx-bottom-sheet-focus: light-dark(#171717, #fafafa);
12
+ --astryx-bottom-sheet-shadow:
13
+ 0 -4px 6px light-dark(oklch(0 0 0 / 10%), oklch(0 0 0 / 50%)),
14
+ 0 -12px 24px light-dark(oklch(0 0 0 / 15%), oklch(0 0 0 / 70%)),
15
+ inset 0 0 0 1px light-dark(transparent, oklch(1 0 0 / 15%));
16
+ }
17
+ }
@@ -0,0 +1,34 @@
1
+ @layer astryx.reset, astryx.tokens, astryx.base, astryx.components, astryx.overrides;
2
+
3
+ @layer astryx.tokens {
4
+ :root,
5
+ [data-astryx-theme='neutral'] {
6
+ --astryx-button-primary-background: light-dark(#262626, #ebebeb);
7
+ --astryx-button-primary-foreground: light-dark(#ffffff, #171717);
8
+ --astryx-button-secondary-background: light-dark(#0000000f, #ffffff1a);
9
+ --astryx-button-secondary-foreground: light-dark(#171717, #fafafa);
10
+ --astryx-button-ghost-background: transparent;
11
+ --astryx-button-ghost-foreground: light-dark(#171717, #fafafa);
12
+ --astryx-button-destructive-background: light-dark(#facecb, #ff9e973d);
13
+ --astryx-button-destructive-foreground: light-dark(#a50c25, #ffc6c1);
14
+ --astryx-button-hover-overlay: light-dark(#0000000d, #ffffff0d);
15
+ --astryx-button-pressed-overlay: light-dark(#0000001a, #ffffff1a);
16
+ --astryx-button-focus: light-dark(#262626, #ebebeb);
17
+ --astryx-button-separator: light-dark(#00000014, #ffffff1a);
18
+ --astryx-button-solid-separator: light-dark(#ffffff, #171717);
19
+ --astryx-button-tooltip-background: light-dark(#171717, #262626);
20
+ --astryx-button-tooltip-foreground: light-dark(#ffffff, #fafafa);
21
+ --astryx-button-shadow-low:
22
+ 0 2px 4px light-dark(oklch(0 0 0 / 5%), oklch(0 0 0 / 25%)),
23
+ 0 4px 8px light-dark(oklch(0 0 0 / 10%), oklch(0 0 0 / 40%)),
24
+ inset 0 0 0 1px light-dark(transparent, oklch(1 0 0 / 8%));
25
+ --astryx-button-shadow-med:
26
+ 0 2px 4px light-dark(oklch(0 0 0 / 5%), oklch(0 0 0 / 35%)),
27
+ 0 4px 12px light-dark(oklch(0 0 0 / 10%), oklch(0 0 0 / 50%)),
28
+ inset 0 0 0 1px light-dark(transparent, oklch(1 0 0 / 12%));
29
+ --astryx-button-shadow-high:
30
+ 0 4px 6px light-dark(oklch(0 0 0 / 10%), oklch(0 0 0 / 50%)),
31
+ 0 12px 24px light-dark(oklch(0 0 0 / 15%), oklch(0 0 0 / 70%)),
32
+ inset 0 0 0 1px light-dark(transparent, oklch(1 0 0 / 15%));
33
+ }
34
+ }
@@ -0,0 +1,33 @@
1
+ @layer astryx.reset, astryx.tokens, astryx.base, astryx.components, astryx.overrides;
2
+
3
+ @layer astryx.tokens {
4
+ :root,
5
+ [data-astryx-theme='neutral'] {
6
+ --astryx-card-background: light-dark(#fff, #1f1f22);
7
+ --astryx-card-muted-background: light-dark(#f5f5f5, #171717);
8
+ --astryx-card-border: light-dark(#00000014, #ffffff1a);
9
+ --astryx-card-shadow-low:
10
+ 0 2px 4px light-dark(oklch(0 0 0 / 5%), oklch(0 0 0 / 25%)),
11
+ 0 4px 8px light-dark(oklch(0 0 0 / 10%), oklch(0 0 0 / 40%)),
12
+ inset 0 0 0 1px light-dark(transparent, oklch(1 0 0 / 8%));
13
+ --astryx-card-shadow-med:
14
+ 0 2px 4px light-dark(oklch(0 0 0 / 5%), oklch(0 0 0 / 35%)),
15
+ 0 4px 12px light-dark(oklch(0 0 0 / 10%), oklch(0 0 0 / 50%)),
16
+ inset 0 0 0 1px light-dark(transparent, oklch(1 0 0 / 12%));
17
+ --astryx-card-shadow-high:
18
+ 0 4px 6px light-dark(oklch(0 0 0 / 10%), oklch(0 0 0 / 50%)),
19
+ 0 12px 24px light-dark(oklch(0 0 0 / 15%), oklch(0 0 0 / 70%)),
20
+ inset 0 0 0 1px light-dark(transparent, oklch(1 0 0 / 15%));
21
+
22
+ --astryx-card-blue-background: light-dark(#c4ddfb, #9eb7ff3d);
23
+ --astryx-card-cyan-background: light-dark(#a3e0ef, #83c2d43d);
24
+ --astryx-card-gray-background: light-dark(#e5e5e5, #ffffff1a);
25
+ --astryx-card-green-background: light-dark(#c5e5c0, #84c9803d);
26
+ --astryx-card-orange-background: light-dark(#fad0b5, #ffa2583d);
27
+ --astryx-card-pink-background: light-dark(#fccadc, #ff99c33d);
28
+ --astryx-card-purple-background: light-dark(#eccef3, #f297ff3d);
29
+ --astryx-card-red-background: light-dark(#facecb, #ff9e973d);
30
+ --astryx-card-teal-background: light-dark(#a5e3d6, #7ec6b83d);
31
+ --astryx-card-yellow-background: light-dark(#f8da9d, #deb4333d);
32
+ }
33
+ }
@@ -0,0 +1,8 @@
1
+ @layer astryx.reset, astryx.tokens, astryx.base, astryx.components, astryx.overrides;
2
+
3
+ @layer astryx.tokens {
4
+ :root,
5
+ [data-astryx-theme='neutral'] {
6
+ --astryx-center-default-padding: var(--astryx-spacing-0);
7
+ }
8
+ }
@@ -0,0 +1,28 @@
1
+ @layer astryx.reset, astryx.tokens, astryx.base, astryx.components, astryx.overrides;
2
+
3
+ @layer astryx.tokens {
4
+ :root,
5
+ [data-astryx-theme='neutral'] {
6
+ --astryx-chat-foreground: var(--astryx-color-text-primary);
7
+ /* Docs secondary text measures rgb(71, 71, 71). The shared text-secondary
8
+ token stays lighter, so chat supporting copy uses this darker stop. */
9
+ --astryx-chat-foreground-secondary: light-dark(#474747, #a3a3a3);
10
+ --astryx-chat-foreground-muted: var(--astryx-color-text-disabled);
11
+ --astryx-chat-bubble-background: var(--astryx-color-neutral);
12
+ --astryx-chat-error: var(--astryx-color-error);
13
+ --astryx-chat-success: var(--astryx-color-success);
14
+ --astryx-chat-accent: var(--astryx-color-accent);
15
+ --astryx-chat-unread-color: var(--astryx-color-border-red);
16
+ --astryx-chat-scroll-background: var(--astryx-color-background-popover);
17
+ --astryx-chat-scroll-shadow: var(--astryx-shadow-med);
18
+ --astryx-chat-hover: var(--astryx-color-overlay-hover);
19
+ --astryx-chat-focus: var(--astryx-focus-outline-color);
20
+ --astryx-chat-radius: var(--astryx-radius-chat);
21
+ --astryx-chat-radius-compact: var(--astryx-radius-container);
22
+ --astryx-chat-radius-group: var(--astryx-radius-inner);
23
+ --astryx-chat-font-weight-regular: var(--astryx-font-weight-regular);
24
+ --astryx-chat-font-weight-medium: var(--astryx-font-weight-medium);
25
+ --astryx-chat-font-weight-semibold: var(--astryx-font-weight-semibold);
26
+ --astryx-chat-font-weight-bold: var(--astryx-font-weight-bold);
27
+ }
28
+ }
@@ -0,0 +1,13 @@
1
+ @layer astryx.reset, astryx.tokens, astryx.base, astryx.components, astryx.overrides;
2
+
3
+ @layer astryx.tokens {
4
+ :root,
5
+ [data-astryx-theme='neutral'] {
6
+ --astryx-checkbox-background: light-dark(#fff, #262626);
7
+ --astryx-checkbox-border: light-dark(#d4d4d4, #525252);
8
+ --astryx-checkbox-accent: light-dark(#262626, #ebebeb);
9
+ --astryx-checkbox-on-accent: light-dark(#fff, #171717);
10
+ --astryx-checkbox-focus: light-dark(#262626, #ebebeb);
11
+ --astryx-checkbox-disabled-background: light-dark(#f5f5f5, #171717);
12
+ }
13
+ }
@@ -0,0 +1,16 @@
1
+ @layer astryx.reset, astryx.tokens, astryx.base, astryx.components, astryx.overrides;
2
+
3
+ @layer astryx.tokens {
4
+ :root,
5
+ [data-astryx-theme='neutral'] {
6
+ --astryx-citation-foreground: var(--astryx-color-text-secondary);
7
+ --astryx-citation-foreground-hover: var(--astryx-color-text-primary);
8
+ --astryx-citation-border: var(--astryx-color-border);
9
+ --astryx-citation-hover: var(--astryx-color-overlay-hover);
10
+ --astryx-citation-number-background: var(--astryx-color-accent-muted);
11
+ --astryx-citation-icon-background: var(--astryx-color-background-surface);
12
+ --astryx-citation-focus: var(--astryx-focus-outline-color);
13
+ --astryx-citation-font-weight: var(--astryx-font-weight-regular);
14
+ --astryx-citation-number-font-weight: var(--astryx-font-weight-semibold);
15
+ }
16
+ }
@@ -0,0 +1,36 @@
1
+ @layer astryx.reset, astryx.tokens, astryx.base, astryx.components, astryx.overrides;
2
+
3
+ @layer astryx.tokens {
4
+ :root,
5
+ [data-astryx-theme='neutral'] {
6
+ --astryx-text-code-size: 0.875rem;
7
+ --astryx-text-code-leading: 1.4286;
8
+
9
+ --astryx-code-background: light-dark(#f5f5f5, #262626);
10
+ --astryx-code-primary-foreground: light-dark(#171717, #fafafa);
11
+ --astryx-code-secondary-foreground: light-dark(#525252, #a3a3a3);
12
+
13
+ /* CodeBlock card: white surface and a hairline border, matching the
14
+ original block. Inline code keeps the muted chip above. */
15
+ --astryx-code-block-background: light-dark(#ffffff, #111111);
16
+ --astryx-code-block-border: light-dark(#00000014, #ffffff1a);
17
+ --astryx-code-block-focus: light-dark(#262626, #ebebeb);
18
+ --astryx-code-block-highlight-background: light-dark(#0074e233, #6d9cfe33);
19
+
20
+ /* Syntax colors from the original CodeBlock theme: keyword and type share
21
+ the same purple, strings stay green. */
22
+ --astryx-code-syntax-keyword: light-dark(#6b187c, #efa8ff);
23
+ --astryx-code-syntax-string: light-dark(#0b5615, #a4d6a3);
24
+ --astryx-code-syntax-comment: light-dark(#6a6a6a, #9e9e9e);
25
+ --astryx-code-syntax-number: light-dark(#733100, #ffb37e);
26
+ --astryx-code-syntax-function: light-dark(#00458c, #a1caff);
27
+ --astryx-code-syntax-type: light-dark(#6b187c, #efa8ff);
28
+ --astryx-code-syntax-variable: light-dark(#111111, #e2e2e2);
29
+ --astryx-code-syntax-operator: light-dark(#6a6a6a, #9e9e9e);
30
+ --astryx-code-syntax-constant: light-dark(#733100, #ffb37e);
31
+ --astryx-code-syntax-tag: light-dark(#8a0011, #ffaea7);
32
+ --astryx-code-syntax-attribute: light-dark(#584400, #eec448);
33
+ --astryx-code-syntax-property: light-dark(#005348, #90d7c8);
34
+ --astryx-code-syntax-punctuation: light-dark(#6a6a6a, #9e9e9e);
35
+ }
36
+ }
@@ -0,0 +1,11 @@
1
+ @layer astryx.reset, astryx.tokens, astryx.base, astryx.components, astryx.overrides;
2
+
3
+ @layer astryx.tokens {
4
+ :root,
5
+ [data-astryx-theme='neutral'] {
6
+ --astryx-collapsible-trigger-foreground: light-dark(#171717, #fafafa);
7
+ --astryx-collapsible-content-foreground: light-dark(#171717, #fafafa);
8
+ --astryx-collapsible-pressed-overlay: light-dark(#0000001a, #ffffff1a);
9
+ --astryx-collapsible-focus: light-dark(#262626, #ebebeb);
10
+ }
11
+ }