@resq-systems/constants 0.3.0 → 0.4.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.
package/README.md CHANGED
@@ -30,8 +30,9 @@ bun add @resq-systems/constants
30
30
  | Import | Contents |
31
31
  | --- | --- |
32
32
  | `@resq-systems/constants` | everything below |
33
- | `@resq-systems/constants/tokens` | `colors` (oklch source + email-safe hex), `fonts` (stacks + webfont href), `radii`, `themeColor` (light/dark PWA + viewport `theme-color`) |
34
- | `@resq-systems/constants/brand` | `brand` — name, legal name, tagline, domains, email addresses, postal address |
33
+ | `@resq-systems/constants/tokens` | `colors` (`oklch` source + email-safe `hex` snapshot, incl. `info`/`success`/`warning`/`danger` status roles), `fonts` (stacks + webfont href), `radii`, `themeColor` (light/dark PWA + viewport `theme-color`), plus the color-role types `ColorRole`, `StatusRole`, `OklchColorRole`, `ColorTokenName` |
34
+ | `@resq-systems/constants/brand` | `brand` — name, product name, legal name, tagline, description, domains, email addresses, legal URLs, socials, company info, logo, postal address |
35
+ | `@resq-systems/constants/tokens.css` | Stylesheet mirroring `./tokens`: the `oklch` color roles, `--resq-chart-1..5` palette, `--resq-radius-*`, and `--resq-font-*` stacks as CSS custom properties on `:root`. `@import` it directly. |
35
36
 
36
37
  Everything is `as const`, so values are literal-typed and tree-shakeable.
37
38
 
@@ -57,7 +58,7 @@ place by being reused across apps, not by being convenient to dump here.
57
58
  ## Rules
58
59
 
59
60
  - **Zero runtime dependencies.** This package must stay dependency-free.
60
- - Values are data only — no logic, no side effects (`sideEffects: false`).
61
+ - Values are data only — no logic; the JS is side-effect-free. Only the stylesheet (`tokens.css`) is a side-effectful import, declared via `sideEffects`.
61
62
  - A change here ripples to every dependent; prefer additive, stable edits.
62
63
 
63
64
  ## Prerequisites
@@ -67,21 +68,25 @@ place by being reused across apps, not by being convenient to dump here.
67
68
 
68
69
  ## Consuming in CSS
69
70
 
70
- This package ships **TypeScript token objects, not a stylesheet** there is no
71
- `tokens.css` export. To expose the palette as CSS custom properties, generate them
72
- from the tokens at build time, or reference the hex values directly:
71
+ Import the ready-made stylesheet it declares the `oklch` color roles, the
72
+ `--resq-chart-1..5` palette, `--resq-radius-*`, and `--resq-font-*` stacks as CSS
73
+ custom properties on `:root`:
73
74
 
74
- ```ts
75
- import { colors, radii } from "@resq-systems/constants/tokens";
75
+ ```css
76
+ @import "@resq-systems/constants/tokens.css";
76
77
 
77
- const rootVars = `:root {
78
- --color-background: ${colors.hex.background}; /* #0A0E1A */
79
- --radius-md: ${radii.md}; /* 8px */
80
- }`;
78
+ .panel {
79
+ background: var(--resq-color-surface);
80
+ border: 1px solid var(--resq-color-border);
81
+ border-radius: var(--resq-radius-lg);
82
+ font-family: var(--resq-font-body);
83
+ }
81
84
  ```
82
85
 
83
- For Tailwind v4, map the tokens into your `@theme` block (or a generated file) so
84
- utilities resolve against the same source of truth as the rest of the platform.
86
+ The stylesheet mirrors `./tokens` (a test fails if the two drift). For Tailwind
87
+ v4, alias these custom properties inside your `@theme` block so utilities resolve
88
+ against the same source of truth. If you need the raw values in TypeScript — or
89
+ the email-safe `hex` snapshot — import the objects from `./tokens` instead.
85
90
 
86
91
  ## Testing
87
92
 
package/lib/tokens.d.ts CHANGED
@@ -37,7 +37,7 @@ type StatusRole = "info" | "success" | "warning" | "danger";
37
37
  declare const colors: {
38
38
  readonly oklch: {
39
39
  readonly background: "oklch(16.63% 0.0262 269.37)";
40
- readonly surface: "oklch(22.90% 0.0302 269.75)";
40
+ readonly surface: "oklch(19.72% 0.0231 268.80)";
41
41
  readonly border: "oklch(26.45% 0.0386 270.81)";
42
42
  readonly foreground: "oklch(96.19% 0.0109 274.89)";
43
43
  readonly muted: "oklch(64.00% 0.0535 266.82)";
@@ -55,6 +55,12 @@ declare const colors: {
55
55
  readonly warning: "#E0A100";
56
56
  readonly danger: "#D43E3F";
57
57
  };
58
+ /**
59
+ * Categorical data-visualization palette — the five `--chart-1..5` oklch
60
+ * values shipped by `@resq-systems/ui` (canonical dark `:root` scale). Charts
61
+ * cycle these in order for series colors. `oklch` only (not email-safe).
62
+ */
63
+ readonly chart: readonly ["oklch(58.50% 0.1877 24.72)", "oklch(64.20% 0.1560 252.61)", "oklch(73.39% 0.1538 161.68)", "oklch(78.37% 0.1587 72.99)", "oklch(68.62% 0.0471 261.10)"];
58
64
  };
59
65
  /**
60
66
  * Roles indexable on `colors.oklch` — exactly {@link ColorRole}. Type any
@@ -84,12 +90,16 @@ declare const fonts: {
84
90
  };
85
91
  readonly googleFontsHref: "https://fonts.googleapis.com/css2?family=Syne:wght@700;800&family=DM+Sans:wght@400;500&family=DM+Mono:wght@500&display=swap";
86
92
  };
87
- /** Border radius scale (px, email-safe). */
93
+ /**
94
+ * Border radius scale (px, email-safe). Mirrors the shipped `@resq-systems/ui`
95
+ * `--radius-*` scale: `sm`→token (3px), `md`→control (4px), `lg`→panel (6px),
96
+ * `xl` (panel + 4px = 10px). `full` is the pill radius (no UI counterpart).
97
+ */
88
98
  declare const radii: {
89
- readonly sm: "6px";
90
- readonly md: "8px";
91
- readonly lg: "12px";
92
- readonly xl: "14px";
99
+ readonly sm: "3px";
100
+ readonly md: "4px";
101
+ readonly lg: "6px";
102
+ readonly xl: "10px";
93
103
  readonly full: "999px";
94
104
  };
95
105
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.d.ts","names":[],"sources":["../src/tokens.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA6BY;;;;;;KAOA;cAEC;;aAEX;aACA;aACA;aACA;aACA;aACA;;;aAGA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;;;;;;;;KAYU,8BAA8B,OAAO;;KAGrC,8BAA8B,OAAO;;;;;cAMpC;WACZ;WACA;;;cAIY;WACZ;WACA;WACA;WACA;aACC;aACA;aAUA;;WAED;;;cAKY;WACZ;WACA;WACA;WACA;WACA"}
1
+ {"version":3,"file":"tokens.d.ts","names":[],"sources":["../src/tokens.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA6BY;;;;;;KAOA;cAEC;;aAEX;aACA;aACA;aACA;aACA;aACA;;;aAGA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;;;;;;;;;;;;;;KAyBU,8BAA8B,OAAO;;KAGrC,8BAA8B,OAAO;;;;;cAMpC;WACZ;WACA;;;cAIY;WACZ;WACA;WACA;WACA;aACC;aACA;aAUA;;WAED;;;;;;;cASY;WACZ;WACA;WACA;WACA;WACA"}
package/lib/tokens.js CHANGED
@@ -2,7 +2,7 @@
2
2
  const colors = {
3
3
  oklch: {
4
4
  background: "oklch(16.63% 0.0262 269.37)",
5
- surface: "oklch(22.90% 0.0302 269.75)",
5
+ surface: "oklch(19.72% 0.0231 268.80)",
6
6
  border: "oklch(26.45% 0.0386 270.81)",
7
7
  foreground: "oklch(96.19% 0.0109 274.89)",
8
8
  muted: "oklch(64.00% 0.0535 266.82)",
@@ -19,7 +19,19 @@ const colors = {
19
19
  success: "#3FB984",
20
20
  warning: "#E0A100",
21
21
  danger: "#D43E3F"
22
- }
22
+ },
23
+ /**
24
+ * Categorical data-visualization palette — the five `--chart-1..5` oklch
25
+ * values shipped by `@resq-systems/ui` (canonical dark `:root` scale). Charts
26
+ * cycle these in order for series colors. `oklch` only (not email-safe).
27
+ */
28
+ chart: [
29
+ "oklch(58.50% 0.1877 24.72)",
30
+ "oklch(64.20% 0.1560 252.61)",
31
+ "oklch(73.39% 0.1538 161.68)",
32
+ "oklch(78.37% 0.1587 72.99)",
33
+ "oklch(68.62% 0.0471 261.10)"
34
+ ]
23
35
  };
24
36
  /**
25
37
  * Browser + PWA `theme-color` / viewport meta colors. `dark` tracks the
@@ -62,12 +74,16 @@ const fonts = {
62
74
  },
63
75
  googleFontsHref: "https://fonts.googleapis.com/css2?family=Syne:wght@700;800&family=DM+Sans:wght@400;500&family=DM+Mono:wght@500&display=swap"
64
76
  };
65
- /** Border radius scale (px, email-safe). */
77
+ /**
78
+ * Border radius scale (px, email-safe). Mirrors the shipped `@resq-systems/ui`
79
+ * `--radius-*` scale: `sm`→token (3px), `md`→control (4px), `lg`→panel (6px),
80
+ * `xl` (panel + 4px = 10px). `full` is the pill radius (no UI counterpart).
81
+ */
66
82
  const radii = {
67
- sm: "6px",
68
- md: "8px",
69
- lg: "12px",
70
- xl: "14px",
83
+ sm: "3px",
84
+ md: "4px",
85
+ lg: "6px",
86
+ xl: "10px",
71
87
  full: "999px"
72
88
  };
73
89
  //#endregion
package/lib/tokens.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.js","names":[],"sources":["../src/tokens.ts"],"sourcesContent":["/**\n * Copyright 2026 ResQ Systems, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * ResQ Systems design tokens — the single source of truth shared by `@resq-systems/ui`,\n * `@resq-systems/email-templates`, and app surfaces.\n *\n * `oklch` is the design-system source of truth; `hex` is the email/legacy-safe\n * snapshot (email clients and older targets do not support `oklch()`). Keep the\n * two representations in sync when the palette changes.\n */\n/**\n * The six canonical color roles present in **both** representations. `oklch`\n * (the design-system source of truth) and `hex` (the email-safe snapshot) must\n * each define every one of these.\n */\nexport type ColorRole = \"background\" | \"surface\" | \"border\" | \"foreground\" | \"muted\" | \"primary\";\n\n/**\n * Status roles that exist only in the email-safe `hex` snapshot. `oklch` does\n * not define these, so they are indexable on `colors.hex` but never on\n * `colors.oklch`.\n */\nexport type StatusRole = \"info\" | \"success\" | \"warning\" | \"danger\";\n\nexport const colors = {\n\toklch: {\n\t\tbackground: \"oklch(16.63% 0.0262 269.37)\",\n\t\tsurface: \"oklch(22.90% 0.0302 269.75)\",\n\t\tborder: \"oklch(26.45% 0.0386 270.81)\",\n\t\tforeground: \"oklch(96.19% 0.0109 274.89)\",\n\t\tmuted: \"oklch(64.00% 0.0535 266.82)\",\n\t\tprimary: \"oklch(58.50% 0.1877 24.72)\",\n\t},\n\thex: {\n\t\tbackground: \"#0A0E1A\",\n\t\tsurface: \"#171C2B\",\n\t\tborder: \"#1E2438\",\n\t\tforeground: \"#F0F2FA\",\n\t\tmuted: \"#7D8CAE\",\n\t\tprimary: \"#D43E3F\",\n\t\tinfo: \"#7D8CAE\",\n\t\tsuccess: \"#3FB984\",\n\t\twarning: \"#E0A100\",\n\t\tdanger: \"#D43E3F\",\n\t},\n} as const satisfies {\n\toklch: Record<ColorRole, string>;\n\thex: Record<ColorRole | StatusRole, string>;\n};\n\n/**\n * Roles indexable on `colors.oklch` — exactly {@link ColorRole}. Type any\n * lookup into the oklch source with this so a hex-only {@link StatusRole} can\n * never index it (which would type as `string` yet be `undefined` at runtime).\n */\nexport type OklchColorRole = keyof typeof colors.oklch;\n\n/** Every token name present on the email-safe `hex` snapshot. */\nexport type ColorTokenName = keyof typeof colors.hex;\n\n/**\n * Browser + PWA `theme-color` / viewport meta colors. `dark` tracks the\n * canonical page background; `light` is the light-mode chrome color.\n */\nexport const themeColor = {\n\tlight: \"#E8EAF0\",\n\tdark: colors.hex.background,\n} as const;\n\n/** Brand typefaces, ready-to-use CSS font stacks, and the webfont stylesheet. */\nexport const fonts = {\n\tdisplay: \"Syne\",\n\tbody: \"DM Sans\",\n\tmono: \"DM Mono\",\n\tstacks: {\n\t\tdisplay: [\"Syne\", \"'Helvetica Neue'\", \"Arial\", \"sans-serif\"],\n\t\tbody: [\n\t\t\t\"'DM Sans'\",\n\t\t\t\"-apple-system\",\n\t\t\t\"BlinkMacSystemFont\",\n\t\t\t\"'Segoe UI'\",\n\t\t\t\"Roboto\",\n\t\t\t\"Helvetica\",\n\t\t\t\"Arial\",\n\t\t\t\"sans-serif\",\n\t\t],\n\t\tmono: [\"'DM Mono'\", \"ui-monospace\", \"'SF Mono'\", \"Menlo\", \"Consolas\", \"monospace\"],\n\t},\n\tgoogleFontsHref:\n\t\t\"https://fonts.googleapis.com/css2?family=Syne:wght@700;800&family=DM+Sans:wght@400;500&family=DM+Mono:wght@500&display=swap\",\n} as const;\n\n/** Border radius scale (px, email-safe). */\nexport const radii = {\n\tsm: \"6px\",\n\tmd: \"8px\",\n\tlg: \"12px\",\n\txl: \"14px\",\n\tfull: \"999px\",\n} as const;\n"],"mappings":";AAsCA,MAAa,SAAS;CACrB,OAAO;EACN,YAAY;EACZ,SAAS;EACT,QAAQ;EACR,YAAY;EACZ,OAAO;EACP,SAAS;CACV;CACA,KAAK;EACJ,YAAY;EACZ,SAAS;EACT,QAAQ;EACR,YAAY;EACZ,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;EACT,SAAS;EACT,QAAQ;CACT;AACD;;;;;AAmBA,MAAa,aAAa;CACzB,OAAO;CACP,MAAM,OAAO,IAAI;AAClB;;AAGA,MAAa,QAAQ;CACpB,SAAS;CACT,MAAM;CACN,MAAM;CACN,QAAQ;EACP,SAAS;GAAC;GAAQ;GAAoB;GAAS;EAAY;EAC3D,MAAM;GACL;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACD;EACA,MAAM;GAAC;GAAa;GAAgB;GAAa;GAAS;GAAY;EAAW;CAClF;CACA,iBACC;AACF;;AAGA,MAAa,QAAQ;CACpB,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,MAAM;AACP"}
1
+ {"version":3,"file":"tokens.js","names":[],"sources":["../src/tokens.ts"],"sourcesContent":["/**\n * Copyright 2026 ResQ Systems, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * ResQ Systems design tokens — the single source of truth shared by `@resq-systems/ui`,\n * `@resq-systems/email-templates`, and app surfaces.\n *\n * `oklch` is the design-system source of truth; `hex` is the email/legacy-safe\n * snapshot (email clients and older targets do not support `oklch()`). Keep the\n * two representations in sync when the palette changes.\n */\n/**\n * The six canonical color roles present in **both** representations. `oklch`\n * (the design-system source of truth) and `hex` (the email-safe snapshot) must\n * each define every one of these.\n */\nexport type ColorRole = \"background\" | \"surface\" | \"border\" | \"foreground\" | \"muted\" | \"primary\";\n\n/**\n * Status roles that exist only in the email-safe `hex` snapshot. `oklch` does\n * not define these, so they are indexable on `colors.hex` but never on\n * `colors.oklch`.\n */\nexport type StatusRole = \"info\" | \"success\" | \"warning\" | \"danger\";\n\nexport const colors = {\n\toklch: {\n\t\tbackground: \"oklch(16.63% 0.0262 269.37)\",\n\t\tsurface: \"oklch(19.72% 0.0231 268.80)\",\n\t\tborder: \"oklch(26.45% 0.0386 270.81)\",\n\t\tforeground: \"oklch(96.19% 0.0109 274.89)\",\n\t\tmuted: \"oklch(64.00% 0.0535 266.82)\",\n\t\tprimary: \"oklch(58.50% 0.1877 24.72)\",\n\t},\n\thex: {\n\t\tbackground: \"#0A0E1A\",\n\t\tsurface: \"#171C2B\",\n\t\tborder: \"#1E2438\",\n\t\tforeground: \"#F0F2FA\",\n\t\tmuted: \"#7D8CAE\",\n\t\tprimary: \"#D43E3F\",\n\t\tinfo: \"#7D8CAE\",\n\t\tsuccess: \"#3FB984\",\n\t\twarning: \"#E0A100\",\n\t\tdanger: \"#D43E3F\",\n\t},\n\t/**\n\t * Categorical data-visualization palette — the five `--chart-1..5` oklch\n\t * values shipped by `@resq-systems/ui` (canonical dark `:root` scale). Charts\n\t * cycle these in order for series colors. `oklch` only (not email-safe).\n\t */\n\tchart: [\n\t\t\"oklch(58.50% 0.1877 24.72)\",\n\t\t\"oklch(64.20% 0.1560 252.61)\",\n\t\t\"oklch(73.39% 0.1538 161.68)\",\n\t\t\"oklch(78.37% 0.1587 72.99)\",\n\t\t\"oklch(68.62% 0.0471 261.10)\",\n\t],\n} as const satisfies {\n\toklch: Record<ColorRole, `oklch(${string})`>;\n\thex: Record<ColorRole | StatusRole, `#${string}`>;\n\tchart: readonly `oklch(${string})`[];\n};\n\n/**\n * Roles indexable on `colors.oklch` — exactly {@link ColorRole}. Type any\n * lookup into the oklch source with this so a hex-only {@link StatusRole} can\n * never index it (which would type as `string` yet be `undefined` at runtime).\n */\nexport type OklchColorRole = keyof typeof colors.oklch;\n\n/** Every token name present on the email-safe `hex` snapshot. */\nexport type ColorTokenName = keyof typeof colors.hex;\n\n/**\n * Browser + PWA `theme-color` / viewport meta colors. `dark` tracks the\n * canonical page background; `light` is the light-mode chrome color.\n */\nexport const themeColor = {\n\tlight: \"#E8EAF0\",\n\tdark: colors.hex.background,\n} as const;\n\n/** Brand typefaces, ready-to-use CSS font stacks, and the webfont stylesheet. */\nexport const fonts = {\n\tdisplay: \"Syne\",\n\tbody: \"DM Sans\",\n\tmono: \"DM Mono\",\n\tstacks: {\n\t\tdisplay: [\"Syne\", \"'Helvetica Neue'\", \"Arial\", \"sans-serif\"],\n\t\tbody: [\n\t\t\t\"'DM Sans'\",\n\t\t\t\"-apple-system\",\n\t\t\t\"BlinkMacSystemFont\",\n\t\t\t\"'Segoe UI'\",\n\t\t\t\"Roboto\",\n\t\t\t\"Helvetica\",\n\t\t\t\"Arial\",\n\t\t\t\"sans-serif\",\n\t\t],\n\t\tmono: [\"'DM Mono'\", \"ui-monospace\", \"'SF Mono'\", \"Menlo\", \"Consolas\", \"monospace\"],\n\t},\n\tgoogleFontsHref:\n\t\t\"https://fonts.googleapis.com/css2?family=Syne:wght@700;800&family=DM+Sans:wght@400;500&family=DM+Mono:wght@500&display=swap\",\n} as const;\n\n/**\n * Border radius scale (px, email-safe). Mirrors the shipped `@resq-systems/ui`\n * `--radius-*` scale: `sm`→token (3px), `md`→control (4px), `lg`→panel (6px),\n * `xl` (panel + 4px = 10px). `full` is the pill radius (no UI counterpart).\n */\nexport const radii = {\n\tsm: \"3px\",\n\tmd: \"4px\",\n\tlg: \"6px\",\n\txl: \"10px\",\n\tfull: \"999px\",\n} as const;\n"],"mappings":";AAsCA,MAAa,SAAS;CACrB,OAAO;EACN,YAAY;EACZ,SAAS;EACT,QAAQ;EACR,YAAY;EACZ,OAAO;EACP,SAAS;CACV;CACA,KAAK;EACJ,YAAY;EACZ,SAAS;EACT,QAAQ;EACR,YAAY;EACZ,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;EACT,SAAS;EACT,QAAQ;CACT;;;;;;CAMA,OAAO;EACN;EACA;EACA;EACA;EACA;CACD;AACD;;;;;AAoBA,MAAa,aAAa;CACzB,OAAO;CACP,MAAM,OAAO,IAAI;AAClB;;AAGA,MAAa,QAAQ;CACpB,SAAS;CACT,MAAM;CACN,MAAM;CACN,QAAQ;EACP,SAAS;GAAC;GAAQ;GAAoB;GAAS;EAAY;EAC3D,MAAM;GACL;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACD;EACA,MAAM;GAAC;GAAa;GAAgB;GAAa;GAAS;GAAY;EAAW;CAClF;CACA,iBACC;AACF;;;;;;AAOA,MAAa,QAAQ;CACpB,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,MAAM;AACP"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@resq-systems/constants",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "Shared, zero-dependency constants for ResQ Systems apps: design tokens (oklch + email-safe hex), brand identity, and cross-app values",
5
5
  "license": "Apache-2.0",
6
6
  "author": {
@@ -22,14 +22,18 @@
22
22
  "types": "./lib/brand.d.ts",
23
23
  "import": "./lib/brand.js",
24
24
  "default": "./lib/brand.js"
25
- }
25
+ },
26
+ "./tokens.css": "./src/tokens.css"
26
27
  },
27
28
  "main": "lib/index.js",
28
29
  "module": "lib/index.js",
29
30
  "types": "lib/index.d.ts",
30
- "sideEffects": false,
31
+ "sideEffects": [
32
+ "**/*.css"
33
+ ],
31
34
  "files": [
32
35
  "lib",
36
+ "src/tokens.css",
33
37
  "README.md"
34
38
  ],
35
39
  "scripts": {
package/src/tokens.css ADDED
@@ -0,0 +1,55 @@
1
+ /*!
2
+ * Copyright 2026 ResQ Systems, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ /*
18
+ * ResQ Systems design tokens as CSS custom properties — the CSS-consumable
19
+ * mirror of `src/tokens.ts` (`colors.oklch`, `colors.chart`, `radii`, `fonts`).
20
+ * The `--resq-*` prefix avoids collisions with app-local custom properties.
21
+ *
22
+ * `@import "@resq-systems/constants/tokens.css";`
23
+ *
24
+ * Values are the `oklch` design-system source of truth. `tests/tokens-css.test.ts`
25
+ * fails if any value here drifts from `src/tokens.ts` — keep them in sync.
26
+ */
27
+ :root {
28
+ /* Canonical color roles (oklch — design-system source of truth) */
29
+ --resq-color-background: oklch(16.63% 0.0262 269.37);
30
+ --resq-color-surface: oklch(19.72% 0.0231 268.8);
31
+ --resq-color-border: oklch(26.45% 0.0386 270.81);
32
+ --resq-color-foreground: oklch(96.19% 0.0109 274.89);
33
+ --resq-color-muted: oklch(64.00% 0.0535 266.82);
34
+ --resq-color-primary: oklch(58.50% 0.1877 24.72);
35
+
36
+ /* Categorical data-visualization palette (--resq-chart-1..5) */
37
+ --resq-chart-1: oklch(58.50% 0.1877 24.72);
38
+ --resq-chart-2: oklch(64.20% 0.156 252.61);
39
+ --resq-chart-3: oklch(73.39% 0.1538 161.68);
40
+ --resq-chart-4: oklch(78.37% 0.1587 72.99);
41
+ --resq-chart-5: oklch(68.62% 0.0471 261.1);
42
+
43
+ /* Border radius scale */
44
+ --resq-radius-sm: 3px;
45
+ --resq-radius-md: 4px;
46
+ --resq-radius-lg: 6px;
47
+ --resq-radius-xl: 10px;
48
+ --resq-radius-full: 999px;
49
+
50
+ /* Font stacks */
51
+ --resq-font-display: Syne, "Helvetica Neue", Arial, sans-serif;
52
+ --resq-font-body:
53
+ "DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
54
+ --resq-font-mono: "DM Mono", ui-monospace, "SF Mono", Menlo, Consolas, monospace;
55
+ }