@astryxdesign/theme-gothic 0.0.0-bootstrap.0 → 0.0.15

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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Meta Platforms, Inc.
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,104 @@
1
1
  # @astryxdesign/theme-gothic
2
2
 
3
- This is a `0.0.0-bootstrap.0` placeholder published only to claim the npm name while configuring npm trusted publishing. Do not install it; it will be superseded by the first real release.
3
+ **Dark-only** atmospheric gothic theme for Astryx — deep blue-gray surfaces, distressed display heading, and pastel categorical accents that glow against the dark page like illuminated panels. Uses Manufacturing Consent for headings, Fustat for body text, and [Lucide](https://lucide.dev) icons.
4
+
5
+ > Gothic is a single-mode theme: it always renders dark, regardless of the user's system color preference. For best browser-chrome integration (scrollbars, native form controls), pass `mode="dark"` to your `XDSTheme` provider.
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ npm install @astryxdesign/theme-gothic
11
+ ```
12
+
13
+ ## Usage
14
+
15
+ Wrap your app with `XDSTheme` and pass the theme:
16
+
17
+ ```tsx
18
+ import {XDSTheme} from '@astryxdesign/core/theme';
19
+ import {gothicTheme} from '@astryxdesign/theme-gothic/built';
20
+
21
+ function App() {
22
+ return (
23
+ <XDSTheme theme={gothicTheme} mode="dark">
24
+ {/* your app */}
25
+ </XDSTheme>
26
+ );
27
+ }
28
+ ```
29
+
30
+ ### Import paths
31
+
32
+ | Path | Use case |
33
+ | ----------------------------- | ------------------------------------------------------ |
34
+ | `@astryxdesign/theme-gothic` | Source build (StyleX compilation via `@astryxdesign/build`) |
35
+ | `@astryxdesign/theme-gothic/built` | Pre-built dist (Tailwind, plain CSS, or no build step) |
36
+ | `@astryxdesign/theme-gothic/theme.css` | Pre-built CSS file (import in your stylesheet) |
37
+
38
+ If you're using `@astryxdesign/build` for StyleX source compilation, import from the bare path. Otherwise, use `/built`.
39
+
40
+ ### CSS import
41
+
42
+ Add the theme CSS to your stylesheet:
43
+
44
+ ```css
45
+ @import '@astryxdesign/theme-gothic/theme.css';
46
+ ```
47
+
48
+ ## Aesthetic
49
+
50
+ Gothic is dark-only by design: every token is a single value, and the
51
+ output CSS contains no `light-dark()`, so the theme renders identically
52
+ whether the user prefers light or dark.
53
+
54
+ | Aspect | Choice |
55
+ | ------------ | ------------------------------------------------------ |
56
+ | Mode | Dark only, no light variant |
57
+ | Neutral | Cool blue-gray (#101314 → #E8F1F6) |
58
+ | Status | Forest moss, blood crimson, candlelight amber |
59
+ | Categorical | Pastel-on-dark: light backgrounds, dark text |
60
+ | Radius | Subtle rounding (2–24px) |
61
+ | Motion | Slower / theatrical (150ms → 800ms, 0.75 ratio) |
62
+ | Type scale | 14px base, 1.2 ratio |
63
+
64
+ ## Fonts
65
+
66
+ This theme uses custom typefaces:
67
+
68
+ | Role | Font | Vibe |
69
+ | ------- | --------------------- | -------------------------- |
70
+ | Body | Fustat | Clean modern sans |
71
+ | Heading | Manufacturing Consent | Distressed display |
72
+ | Code | JetBrains Mono | Crisp, monospaced |
73
+
74
+ **These fonts must be loaded separately.** The theme references them by name but does not bundle the font files.
75
+
76
+ Add this to your HTML `<head>`:
77
+
78
+ ```html
79
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
80
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
81
+ <link
82
+ rel="stylesheet"
83
+ href="https://fonts.googleapis.com/css2?family=Fustat:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600;700&family=Manufacturing+Consent&display=swap" />
84
+ ```
85
+
86
+ Without this, the theme falls back to system fonts (heading falls through Manufacturing Consent → UnifrakturMaguntia → Old English Text MT → serif).
87
+
88
+ ## Tonal palettes
89
+
90
+ The theme exports raw tonal palettes for custom components or data
91
+ visualization. Each palette has 21 tone steps (0–100 in 5s):
92
+
93
+ ```tsx
94
+ import {gothicPalettes} from '@astryxdesign/theme-gothic';
95
+
96
+ // e.g. cathedral plum at tone 50
97
+ const plum = gothicPalettes.purple[50]; // '#a363bd'
98
+
99
+ // or use the metadata for derived tools
100
+ const {hue, chroma} = gothicPalettes.neutral; // {hue: 210, chroma: 4}
101
+ ```
102
+
103
+ Available palettes: `neutral`, `blue`, `cyan`, `green`, `orange`, `pink`,
104
+ `purple`, `red`, `teal`, `yellow`.
@@ -0,0 +1,66 @@
1
+ // src/icons.tsx
2
+ import {
3
+ X,
4
+ ChevronDown,
5
+ ChevronLeft,
6
+ ChevronRight,
7
+ Check,
8
+ CheckCircle,
9
+ XCircle,
10
+ AlertTriangle,
11
+ Info,
12
+ Calendar,
13
+ Clock,
14
+ ExternalLink,
15
+ Menu,
16
+ MoreHorizontal,
17
+ Search,
18
+ ArrowUp,
19
+ ArrowDown,
20
+ ArrowUpDown,
21
+ Filter,
22
+ EyeOff,
23
+ Columns,
24
+ Copy,
25
+ CheckCheck,
26
+ Wrench,
27
+ Square,
28
+ Mic
29
+ } from "lucide-react";
30
+ import { jsx } from "react/jsx-runtime";
31
+ var iconProps = {
32
+ size: "1em",
33
+ "aria-hidden": true
34
+ };
35
+ var gothicIconRegistry = {
36
+ close: /* @__PURE__ */ jsx(X, { ...iconProps }),
37
+ chevronDown: /* @__PURE__ */ jsx(ChevronDown, { ...iconProps }),
38
+ chevronLeft: /* @__PURE__ */ jsx(ChevronLeft, { ...iconProps }),
39
+ chevronRight: /* @__PURE__ */ jsx(ChevronRight, { ...iconProps }),
40
+ check: /* @__PURE__ */ jsx(Check, { ...iconProps }),
41
+ success: /* @__PURE__ */ jsx(CheckCircle, { ...iconProps }),
42
+ error: /* @__PURE__ */ jsx(XCircle, { ...iconProps }),
43
+ warning: /* @__PURE__ */ jsx(AlertTriangle, { ...iconProps }),
44
+ info: /* @__PURE__ */ jsx(Info, { ...iconProps }),
45
+ calendar: /* @__PURE__ */ jsx(Calendar, { ...iconProps }),
46
+ clock: /* @__PURE__ */ jsx(Clock, { ...iconProps }),
47
+ externalLink: /* @__PURE__ */ jsx(ExternalLink, { ...iconProps }),
48
+ menu: /* @__PURE__ */ jsx(Menu, { ...iconProps }),
49
+ moreHorizontal: /* @__PURE__ */ jsx(MoreHorizontal, { ...iconProps }),
50
+ search: /* @__PURE__ */ jsx(Search, { ...iconProps }),
51
+ arrowUp: /* @__PURE__ */ jsx(ArrowUp, { ...iconProps }),
52
+ arrowDown: /* @__PURE__ */ jsx(ArrowDown, { ...iconProps }),
53
+ arrowsUpDown: /* @__PURE__ */ jsx(ArrowUpDown, { ...iconProps }),
54
+ funnel: /* @__PURE__ */ jsx(Filter, { ...iconProps }),
55
+ eyeSlash: /* @__PURE__ */ jsx(EyeOff, { ...iconProps }),
56
+ viewColumns: /* @__PURE__ */ jsx(Columns, { ...iconProps }),
57
+ copy: /* @__PURE__ */ jsx(Copy, { ...iconProps }),
58
+ checkDouble: /* @__PURE__ */ jsx(CheckCheck, { ...iconProps }),
59
+ wrench: /* @__PURE__ */ jsx(Wrench, { ...iconProps }),
60
+ stop: /* @__PURE__ */ jsx(Square, { ...iconProps }),
61
+ microphone: /* @__PURE__ */ jsx(Mic, { ...iconProps })
62
+ };
63
+
64
+ export {
65
+ gothicIconRegistry
66
+ };
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @generated by `astryx theme build` — do not edit manually.
3
+ * Source: src/gothicTheme.ts
4
+ * Command: astryx theme build src/gothicTheme.ts --out dist/theme.css
5
+ * Generated: 2026-06-24T18:16:16.708Z
6
+ */
7
+
8
+ import type { DefinedTheme } from '@astryxdesign/core/theme';
9
+ import type { IconRegistry } from '@astryxdesign/core/Icon';
10
+ export declare const gothicIconRegistry: IconRegistry;
11
+ export declare const gothicTheme: DefinedTheme;
package/dist/gothic.js ADDED
@@ -0,0 +1,195 @@
1
+ /**
2
+ * @generated by `astryx theme build` — do not edit manually.
3
+ * Source: src/gothicTheme.ts
4
+ * Command: astryx theme build src/gothicTheme.ts --out dist/theme.css
5
+ * Generated: 2026-06-24T18:16:16.707Z
6
+ */
7
+
8
+ import { gothicIconRegistry } from './icons';
9
+ /**
10
+ * gothic theme — built by `pnpm exec astryx theme build`
11
+ * Import the CSS file alongside this module:
12
+ *
13
+ * import { gothicTheme } from './gothic';
14
+ * import './gothic.css';
15
+ */
16
+ export const gothicTheme = {
17
+ name: 'gothic',
18
+ __built: true,
19
+ tokens: {
20
+ "--font-size-4xs": "0.3125rem",
21
+ "--font-size-3xs": "0.4375rem",
22
+ "--font-size-2xs": "0.5rem",
23
+ "--font-size-xs": "0.625rem",
24
+ "--font-size-sm": "0.8125rem",
25
+ "--font-size-base": "1rem",
26
+ "--font-size-lg": "1.25rem",
27
+ "--font-size-xl": "1.5625rem",
28
+ "--font-size-2xl": "1.9375rem",
29
+ "--font-size-3xl": "2.4375rem",
30
+ "--font-size-4xl": "3.0625rem",
31
+ "--font-size-5xl": "3.8125rem",
32
+ "--text-heading-1-size": "var(--font-size-2xl)",
33
+ "--text-heading-1-weight": "var(--font-weight-semibold)",
34
+ "--text-heading-1-leading": "1.4194",
35
+ "--text-heading-2-size": "var(--font-size-xl)",
36
+ "--text-heading-2-weight": "var(--font-weight-semibold)",
37
+ "--text-heading-2-leading": "1.44",
38
+ "--text-heading-3-size": "var(--font-size-lg)",
39
+ "--text-heading-3-weight": "var(--font-weight-bold)",
40
+ "--text-heading-3-leading": "1.4",
41
+ "--text-heading-4-size": "var(--font-size-base)",
42
+ "--text-heading-4-weight": "var(--font-weight-bold)",
43
+ "--text-heading-4-leading": "1.5",
44
+ "--text-heading-5-size": "var(--font-size-sm)",
45
+ "--text-heading-5-weight": "var(--font-weight-semibold)",
46
+ "--text-heading-5-leading": "1.5385",
47
+ "--text-heading-6-size": "var(--font-size-xs)",
48
+ "--text-heading-6-weight": "var(--font-weight-semibold)",
49
+ "--text-heading-6-leading": "1.6",
50
+ "--text-body-size": "var(--font-size-base)",
51
+ "--text-body-weight": "var(--font-weight-normal)",
52
+ "--text-body-leading": "1.5",
53
+ "--text-large-size": "var(--font-size-lg)",
54
+ "--text-large-weight": "var(--font-weight-semibold)",
55
+ "--text-large-leading": "1.4",
56
+ "--text-label-size": "var(--font-size-base)",
57
+ "--text-label-weight": "var(--font-weight-medium)",
58
+ "--text-label-leading": "1.5",
59
+ "--text-code-size": "var(--font-size-base)",
60
+ "--text-code-weight": "var(--font-weight-normal)",
61
+ "--text-code-leading": "1.5",
62
+ "--text-supporting-size": "var(--font-size-sm)",
63
+ "--text-supporting-weight": "var(--font-weight-normal)",
64
+ "--text-supporting-leading": "1.5385",
65
+ "--text-display-1-size": "var(--font-size-5xl)",
66
+ "--text-display-1-weight": "var(--font-weight-normal)",
67
+ "--text-display-1-leading": "1.2459",
68
+ "--text-display-2-size": "var(--font-size-4xl)",
69
+ "--text-display-2-weight": "var(--font-weight-normal)",
70
+ "--text-display-2-leading": "1.2245",
71
+ "--text-display-3-size": "var(--font-size-3xl)",
72
+ "--text-display-3-weight": "var(--font-weight-normal)",
73
+ "--text-display-3-leading": "1.2308",
74
+ "--duration-fast-min": "115ms",
75
+ "--duration-fast": "150ms",
76
+ "--duration-fast-max": "200ms",
77
+ "--duration-medium-min": "265ms",
78
+ "--duration-medium": "350ms",
79
+ "--duration-medium-max": "465ms",
80
+ "--duration-slow-min": "600ms",
81
+ "--duration-slow": "800ms",
82
+ "--duration-slow-max": "1065ms",
83
+ "--font-family-body": "Fustat, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif",
84
+ "--font-family-heading": "Fustat, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif",
85
+ "--font-family-code": "\"JetBrains Mono\", \"SF Mono\", Monaco, Consolas, monospace",
86
+ "--color-syntax-keyword": "#c39adb",
87
+ "--color-syntax-string": "#a3c987",
88
+ "--color-syntax-comment": "#6b7079",
89
+ "--color-syntax-number": "#dec074",
90
+ "--color-syntax-function": "#8aa1d8",
91
+ "--color-syntax-type": "#c39adb",
92
+ "--color-syntax-variable": "#E8F1F6",
93
+ "--color-syntax-operator": "#96A0AB",
94
+ "--color-syntax-constant": "#e6b85e",
95
+ "--color-syntax-tag": "#d97580",
96
+ "--color-syntax-attribute": "#dec074",
97
+ "--color-syntax-property": "#7cc5b3",
98
+ "--color-syntax-punctuation": "#7a8290",
99
+ "--color-syntax-background": "#101314",
100
+ "--color-accent": "#E8F1F6",
101
+ "--color-accent-muted": "#E8F1F620",
102
+ "--color-neutral": "#E8F1F61A",
103
+ "--color-background-surface": "#101314",
104
+ "--color-background-body": "#101314",
105
+ "--color-overlay": "#101314CC",
106
+ "--color-overlay-hover": "#E8F1F60D",
107
+ "--color-overlay-pressed": "#E8F1F61A",
108
+ "--color-background-muted": "#24292D",
109
+ "--color-text-primary": "#E8F1F6",
110
+ "--color-text-secondary": "#96A0AB",
111
+ "--color-text-disabled": "#495056",
112
+ "--color-text-accent": "#E8F1F6",
113
+ "--color-on-dark": "#E8F1F6",
114
+ "--color-on-light": "#101314",
115
+ "--color-on-accent": "#101314",
116
+ "--color-on-success": "#101314",
117
+ "--color-on-error": "#101314",
118
+ "--color-on-warning": "#101314",
119
+ "--color-icon-accent": "#E8F1F6",
120
+ "--color-icon-primary": "#E8F1F6",
121
+ "--color-icon-secondary": "#96A0AB",
122
+ "--color-icon-disabled": "#495056",
123
+ "--color-background-card": "#1a1d20",
124
+ "--color-background-popover": "#24292D",
125
+ "--color-background-inverted": "#E8F1F6",
126
+ "--color-success": "#b3c79a",
127
+ "--color-success-muted": "#b3c79a",
128
+ "--color-error": "#c6a6a2",
129
+ "--color-error-muted": "#c6a6a2",
130
+ "--color-warning": "#d3c490",
131
+ "--color-warning-muted": "#d3c490",
132
+ "--color-border": "#E8F1F61A",
133
+ "--color-border-emphasized": "#495056",
134
+ "--color-skeleton": "#495056",
135
+ "--color-shadow": "#0000004D",
136
+ "--color-tint-hover": "white",
137
+ "--color-background-blue": "#a3b5d6",
138
+ "--color-border-blue": "#8696b8",
139
+ "--color-icon-blue": "#2a3b6e",
140
+ "--color-text-blue": "#1f2c54",
141
+ "--color-background-cyan": "#a3c2cf",
142
+ "--color-border-cyan": "#86a4b1",
143
+ "--color-icon-cyan": "#2a5e75",
144
+ "--color-text-cyan": "#204858",
145
+ "--color-background-gray": "#3d4248",
146
+ "--color-border-gray": "#5d646b",
147
+ "--color-icon-gray": "#E8F1F6",
148
+ "--color-text-gray": "#E8F1F6",
149
+ "--color-background-green": "#b3c79a",
150
+ "--color-border-green": "#96a880",
151
+ "--color-icon-green": "#3a5e2c",
152
+ "--color-text-green": "#244023",
153
+ "--color-background-orange": "#d3b89a",
154
+ "--color-border-orange": "#b6987d",
155
+ "--color-icon-orange": "#8a4818",
156
+ "--color-text-orange": "#6e3812",
157
+ "--color-background-pink": "#c89aab",
158
+ "--color-border-pink": "#aa7d8e",
159
+ "--color-icon-pink": "#8d2d4c",
160
+ "--color-text-pink": "#71223c",
161
+ "--color-background-purple": "#b29bc4",
162
+ "--color-border-purple": "#947da6",
163
+ "--color-icon-purple": "#5a2370",
164
+ "--color-text-purple": "#481b58",
165
+ "--color-background-red": "#c6a6a2",
166
+ "--color-border-red": "#a48581",
167
+ "--color-icon-red": "#5e3a35",
168
+ "--color-text-red": "#4a2520",
169
+ "--color-background-teal": "#a3c2b6",
170
+ "--color-border-teal": "#86a499",
171
+ "--color-icon-teal": "#1f5e52",
172
+ "--color-text-teal": "#174a40",
173
+ "--color-background-yellow": "#d3c490",
174
+ "--color-border-yellow": "#b6a775",
175
+ "--color-icon-yellow": "#876515",
176
+ "--color-text-yellow": "#6c5010",
177
+ "--radius-none": "0.125rem",
178
+ "--radius-inner": "0.25rem",
179
+ "--radius-element": "0.5rem",
180
+ "--radius-container": "0.75rem",
181
+ "--radius-page": "1.5rem",
182
+ "--radius-full": "9999px",
183
+ "--shadow-low": "0 2px 4px #00000033, 0 4px 8px #00000040",
184
+ "--shadow-med": "0 2px 4px #00000033, 0 4px 12px #00000040",
185
+ "--shadow-high": "0 4px 6px #00000040, 0 12px 24px #0000004D",
186
+ "--shadow-inset-hover": "inset 0px 0px 0px 1px #96A0AB30",
187
+ "--shadow-inset-selected": "inset 0px 0px 0px 2px #96A0AB50",
188
+ "--shadow-inset-success": "inset 0px 0px 0px 1px #87b06a50",
189
+ "--shadow-inset-warning": "inset 0px 0px 0px 1px #d6b56a50",
190
+ "--shadow-inset-error": "inset 0px 0px 0px 1px #d4485150"
191
+ },
192
+ icons: gothicIconRegistry,
193
+ };
194
+
195
+ export { gothicIconRegistry };
@@ -0,0 +1,35 @@
1
+ /**
2
+ * @generated by `astryx theme build` — do not edit manually.
3
+ * Source: src/gothicTheme.ts
4
+ * Command: astryx theme build src/gothicTheme.ts --out dist/theme.css
5
+ * Generated: 2026-06-24T18:16:16.714Z
6
+ */
7
+
8
+ // Generated by astryx theme build
9
+ export {};
10
+
11
+ declare module '@astryxdesign/core/Heading' {
12
+ interface XDSHeadingLevelMap {
13
+ '1': true;
14
+ '2': true;
15
+ '3': true;
16
+ '4': true;
17
+ '5': true;
18
+ '6': true;
19
+ }
20
+ }
21
+
22
+ declare module '@astryxdesign/core/Card' {
23
+ interface XDSCardVariantMap {
24
+ 'blue': true;
25
+ 'cyan': true;
26
+ 'gray': true;
27
+ 'green': true;
28
+ 'orange': true;
29
+ 'pink': true;
30
+ 'purple': true;
31
+ 'red': true;
32
+ 'teal': true;
33
+ 'yellow': true;
34
+ }
35
+ }