@relements/core 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 (70) hide show
  1. package/dist/base.css +1 -0
  2. package/dist/behaviors/dialog.d.ts +39 -0
  3. package/dist/behaviors/dialog.js +1 -0
  4. package/dist/behaviors/dismissible.d.ts +37 -0
  5. package/dist/behaviors/dismissible.js +1 -0
  6. package/dist/behaviors/menu-button.d.ts +36 -0
  7. package/dist/behaviors/menu-button.js +1 -0
  8. package/dist/behaviors/popover.d.ts +28 -0
  9. package/dist/behaviors/popover.js +1 -0
  10. package/dist/behaviors/tabs.d.ts +37 -0
  11. package/dist/behaviors/tabs.js +1 -0
  12. package/dist/behaviors/toast.d.ts +42 -0
  13. package/dist/behaviors/toast.js +1 -0
  14. package/dist/chunk-GMICGIQW.js +149 -0
  15. package/dist/chunk-J4EGUBPP.js +68 -0
  16. package/dist/chunk-PIDPGDBZ.js +62 -0
  17. package/dist/chunk-PSODVT3V.js +67 -0
  18. package/dist/chunk-TC4TFP7Y.js +40 -0
  19. package/dist/chunk-ZHRJNWMH.js +174 -0
  20. package/dist/components/button.css +1 -0
  21. package/dist/components/dialog.css +1 -0
  22. package/dist/components/disclosure.css +1 -0
  23. package/dist/components/form.css +1 -0
  24. package/dist/components/link.css +1 -0
  25. package/dist/components/menu.css +1 -0
  26. package/dist/components/popover.css +1 -0
  27. package/dist/components/progress.css +1 -0
  28. package/dist/components/tabs.css +1 -0
  29. package/dist/components/toast.css +1 -0
  30. package/dist/elements/re-menu.d.ts +10 -0
  31. package/dist/elements/re-menu.js +36 -0
  32. package/dist/elements/re-popover.d.ts +12 -0
  33. package/dist/elements/re-popover.js +35 -0
  34. package/dist/elements/re-tabs.d.ts +20 -0
  35. package/dist/elements/re-tabs.js +60 -0
  36. package/dist/elements/re-toast.d.ts +15 -0
  37. package/dist/elements/re-toast.js +30 -0
  38. package/dist/index.css +1 -0
  39. package/dist/index.d.ts +6 -0
  40. package/dist/index.js +6 -0
  41. package/dist/reset.css +1 -0
  42. package/dist/themes/renascent.css +1 -0
  43. package/dist/tokens.css +1 -0
  44. package/package.json +84 -0
  45. package/src/base.css +129 -0
  46. package/src/behaviors/dialog.js +106 -0
  47. package/src/behaviors/dismissible.js +68 -0
  48. package/src/behaviors/menu-button.js +199 -0
  49. package/src/behaviors/popover.js +103 -0
  50. package/src/behaviors/tabs.js +171 -0
  51. package/src/behaviors/toast.js +97 -0
  52. package/src/components/button.css +141 -0
  53. package/src/components/dialog.css +106 -0
  54. package/src/components/disclosure.css +83 -0
  55. package/src/components/form.css +334 -0
  56. package/src/components/link.css +61 -0
  57. package/src/components/menu.css +78 -0
  58. package/src/components/popover.css +50 -0
  59. package/src/components/progress.css +112 -0
  60. package/src/components/tabs.css +86 -0
  61. package/src/components/toast.css +87 -0
  62. package/src/elements/re-menu.js +54 -0
  63. package/src/elements/re-popover.js +59 -0
  64. package/src/elements/re-tabs.js +92 -0
  65. package/src/elements/re-toast.js +46 -0
  66. package/src/index.css +30 -0
  67. package/src/index.js +13 -0
  68. package/src/reset.css +103 -0
  69. package/src/themes/renascent.css +198 -0
  70. package/src/tokens.css +196 -0
@@ -0,0 +1,198 @@
1
+ /**
2
+ * Renascent Elements brand theme.
3
+ *
4
+ * Sourced from renascentelements.hu — dark navy palette with electric blue,
5
+ * purple accent, and the signature "phoenix" orange.
6
+ *
7
+ * Usage (global dark):
8
+ * <link rel="stylesheet" href="/packages/core/src/index.css" />
9
+ * <link rel="stylesheet" href="/packages/core/src/themes/renascent.css" />
10
+ *
11
+ * Usage (scoped to a subtree):
12
+ * <div class="theme-renascent">…</div>
13
+ *
14
+ * Consumer overrides still win because this file is un-layered.
15
+ */
16
+
17
+ /* ============================================================
18
+ Global dark theme (matches the renascentelements.hu design)
19
+ ============================================================ */
20
+ :root {
21
+ color-scheme: dark;
22
+
23
+ /* ----- Backgrounds ---------------------------------------- */
24
+ --re-color-bg: #0f131a; /* hsl(220 27% 8%) — page background */
25
+ --re-color-bg-subtle: #171c26; /* hsl(220 25% 12%) — card / surface */
26
+ --re-color-bg-muted: #1f2430; /* hsl(220 20% 15%) — muted section */
27
+ --re-color-surface: #171c26;
28
+
29
+ /* ----- Text ----------------------------------------------- */
30
+ --re-color-text: #f8fafc; /* hsl(210 40% 98%) — primary text */
31
+ --re-color-text-muted: #97a3b4; /* hsl(215 16% 65%) — secondary text */
32
+ --re-color-text-subtle: #6b7a90; /* dimmer tertiary text */
33
+
34
+ /* ----- Border --------------------------------------------- */
35
+ --re-color-border: #29303d; /* hsl(220 20% 20%) */
36
+ --re-color-border-strong: #353d4d;
37
+
38
+ /* ----- Brand: electric blue (primary interactive) ---------
39
+ Their --primary is hsl(217 91% 60%) = #3c83f6.
40
+ Buttons use accent-600 as their base, so we anchor 600 = primary. */
41
+ --re-color-accent-50: #eff6ff;
42
+ --re-color-accent-100: #dbeafe;
43
+ --re-color-accent-200: #bdd6fe;
44
+ --re-color-accent-300: #93c3fd;
45
+ --re-color-accent-400: #60a5fa;
46
+ --re-color-accent-500: #60a5fa; /* tint — for backgrounds, indicators */
47
+ --re-color-accent-600: #3c83f6; /* hsl(217 91% 60%) — button base */
48
+ --re-color-accent-700: #2563eb; /* hover */
49
+ --re-color-accent-800: #1d4ed8; /* active / pressed */
50
+ --re-color-accent-900: #1e3a8a;
51
+
52
+ /* ----- Semantic role colors ------------------------------- */
53
+ --re-color-link: #3c83f6;
54
+ --re-color-link-hover: #60a5fa;
55
+ --re-color-link-visited: #a78bfa;
56
+ --re-color-focus-ring: #3c83f6;
57
+ --re-color-text-on-accent: #0f131a;
58
+
59
+ /* ----- Semantic feedback ---------------------------------- */
60
+ /* Success: teal (hsl(172 81% 55%) — their --success) */
61
+ --re-color-success-500: #2fe9d0;
62
+ --re-color-success-600: #0fd4bb;
63
+ --re-color-success-700: #0ab8a2;
64
+
65
+ /* Warning: amber (hsl(45 93% 65%) — their --warning) */
66
+ --re-color-warning-500: #f9cf53;
67
+ --re-color-warning-600: #f0b929;
68
+ --re-color-warning-700: #d4a020;
69
+
70
+ /* Danger: red (hsl(0 84% 60%) — their --destructive) */
71
+ --re-color-danger-500: #ef4444;
72
+ --re-color-danger-600: #dc2626;
73
+ --re-color-danger-700: #b91c1c;
74
+
75
+ /* ----- Focus ring on dark background ----------------------
76
+ Remove the offset gap: the "white gap" trick is for light
77
+ themes. On dark bg, offset + border = double blue line. */
78
+ --re-focus-ring-offset: 0px;
79
+ --re-shadow-focus: 0 0 0 2px var(--re-color-focus-ring);
80
+
81
+ /* ----- Selection ------------------------------------------ */
82
+ --re-color-selection-bg: rgba(60, 131, 246, 0.3);
83
+ --re-color-selection-text: #f8fafc;
84
+
85
+ /* ----- Text danger for validation messages ---------------- */
86
+ --re-color-text-danger: #f87171; /* lighter red for dark backgrounds */
87
+
88
+ /* ----- Border danger -------------------------------------- */
89
+ --re-color-border-danger: #ef4444;
90
+ }
91
+
92
+ /* ============================================================
93
+ Brand extras: phoenix orange + purple accent
94
+ Use these for decorative highlights, badges, gradients.
95
+ ============================================================ */
96
+ :root {
97
+ --re-color-phoenix: #f3753f; /* hsl(18 88% 60%) — brand orange */
98
+ --re-color-phoenix-light: #f9a07a;
99
+ --re-color-phoenix-dark: #d45a26;
100
+
101
+ --re-color-purple: #a855f7; /* hsl(271 91% 65%) — their --accent */
102
+ --re-color-purple-light: #c084fc;
103
+ --re-color-purple-dark: #7c3aed;
104
+
105
+ /* Gradients as custom properties (for use in CSS backgrounds) */
106
+ --re-gradient-brand: linear-gradient(135deg, #3c83f6, #a855f7);
107
+ --re-gradient-phoenix: linear-gradient(135deg, #f3753f, #f9cf53);
108
+ --re-gradient-hero: linear-gradient(135deg, #3c83f6 0%, #a855f7 50%, #f3753f 100%);
109
+ }
110
+
111
+ /* ============================================================
112
+ Scoped class — apply on any container instead of :root
113
+ ============================================================ */
114
+ .theme-renascent {
115
+ color-scheme: dark;
116
+
117
+ --re-color-bg: #0f131a;
118
+ --re-color-bg-subtle: #171c26;
119
+ --re-color-bg-muted: #1f2430;
120
+ --re-color-surface: #171c26;
121
+ --re-color-text: #f8fafc;
122
+ --re-color-text-muted: #97a3b4;
123
+ --re-color-text-subtle: #6b7a90;
124
+ --re-color-border: #29303d;
125
+ --re-color-border-strong: #353d4d;
126
+ --re-color-accent-500: #3c83f6;
127
+ --re-color-accent-600: #2563eb;
128
+ --re-color-accent-700: #1d4ed8;
129
+ --re-color-link: #3c83f6;
130
+ --re-color-link-hover: #60a5fa;
131
+ --re-color-focus-ring: #3c83f6;
132
+ --re-color-text-on-accent: #0f131a;
133
+ --re-color-text-danger: #f87171;
134
+ --re-color-border-danger: #ef4444;
135
+ --re-color-success-500: #2fe9d0;
136
+ --re-color-success-600: #0fd4bb;
137
+ --re-color-success-700: #0ab8a2;
138
+ --re-color-warning-500: #f9cf53;
139
+ --re-color-warning-600: #f0b929;
140
+ --re-color-warning-700: #d4a020;
141
+ --re-color-danger-500: #ef4444;
142
+ --re-color-danger-600: #dc2626;
143
+ --re-color-danger-700: #b91c1c;
144
+ --re-focus-ring-offset: 0px;
145
+ --re-shadow-focus: 0 0 0 2px var(--re-color-focus-ring);
146
+ --re-color-selection-bg: rgba(60, 131, 246, 0.3);
147
+ --re-color-selection-text: #f8fafc;
148
+
149
+ background-color: var(--re-color-bg);
150
+ color: var(--re-color-text);
151
+ }
152
+
153
+ /* ============================================================
154
+ Gradient button variants
155
+ Use data-variant="phoenix" or data-variant="brand" on .re-button.
156
+ Full hover / active / disabled / focus states included.
157
+ ============================================================ */
158
+ .re-button[data-variant="phoenix"] {
159
+ background: var(--re-gradient-phoenix);
160
+ color: #fff;
161
+ border-color: transparent;
162
+ }
163
+ .re-button[data-variant="phoenix"]:hover {
164
+ filter: brightness(1.12);
165
+ background: var(--re-gradient-phoenix);
166
+ }
167
+ .re-button[data-variant="phoenix"]:active {
168
+ filter: brightness(0.9);
169
+ }
170
+ .re-button[data-variant="phoenix"]:focus-visible {
171
+ border-color: transparent;
172
+ }
173
+ .re-button[data-variant="phoenix"]:disabled,
174
+ .re-button[data-variant="phoenix"][aria-disabled="true"] {
175
+ filter: none;
176
+ opacity: 0.55;
177
+ }
178
+
179
+ .re-button[data-variant="brand"] {
180
+ background: var(--re-gradient-brand);
181
+ color: #fff;
182
+ border-color: transparent;
183
+ }
184
+ .re-button[data-variant="brand"]:hover {
185
+ filter: brightness(1.12);
186
+ background: var(--re-gradient-brand);
187
+ }
188
+ .re-button[data-variant="brand"]:active {
189
+ filter: brightness(0.9);
190
+ }
191
+ .re-button[data-variant="brand"]:focus-visible {
192
+ border-color: transparent;
193
+ }
194
+ .re-button[data-variant="brand"]:disabled,
195
+ .re-button[data-variant="brand"][aria-disabled="true"] {
196
+ filter: none;
197
+ opacity: 0.55;
198
+ }
package/src/tokens.css ADDED
@@ -0,0 +1,196 @@
1
+ /**
2
+ * Relements design tokens.
3
+ *
4
+ * All tokens are exposed as CSS custom properties under the `--re-` prefix.
5
+ * Consumers override at `:root` (global) or any subtree (scoped theme).
6
+ *
7
+ * Naming: --re-<category>-<name>-<modifier>
8
+ * color: --re-color-{role}-{step} e.g. --re-color-text, --re-color-bg-subtle
9
+ * space: --re-space-{step} e.g. --re-space-2 (8 = 0.5rem)
10
+ * font: --re-font-{name} e.g. --re-font-sans
11
+ * size: --re-size-{name} e.g. --re-size-text-md
12
+ * radius: --re-radius-{name} e.g. --re-radius-md
13
+ * border: --re-border-{name} e.g. --re-border-default
14
+ * shadow: --re-shadow-{name} e.g. --re-shadow-focus
15
+ * duration: --re-duration-{name} e.g. --re-duration-fast
16
+ * z: --re-z-{name} e.g. --re-z-overlay
17
+ */
18
+
19
+ @layer re.tokens {
20
+ :root {
21
+ /* ----- Color: neutral scale (light) ---------------------------------- */
22
+ --re-color-neutral-0: #ffffff;
23
+ --re-color-neutral-50: #f8fafc;
24
+ --re-color-neutral-100: #f1f5f9;
25
+ --re-color-neutral-200: #e2e8f0;
26
+ --re-color-neutral-300: #cbd5e1;
27
+ --re-color-neutral-400: #94a3b8;
28
+ --re-color-neutral-500: #64748b;
29
+ --re-color-neutral-600: #475569;
30
+ --re-color-neutral-700: #334155;
31
+ --re-color-neutral-800: #1e293b;
32
+ --re-color-neutral-900: #0f172a;
33
+ --re-color-neutral-950: #020617;
34
+
35
+ /* ----- Color: accent (brand) ---------------------------------------- */
36
+ --re-color-accent-50: #eff6ff;
37
+ --re-color-accent-100: #dbeafe;
38
+ --re-color-accent-200: #bfdbfe;
39
+ --re-color-accent-300: #93c5fd;
40
+ --re-color-accent-400: #60a5fa;
41
+ --re-color-accent-500: #3b82f6;
42
+ --re-color-accent-600: #2563eb;
43
+ --re-color-accent-700: #1d4ed8;
44
+ --re-color-accent-800: #1e40af;
45
+ --re-color-accent-900: #1e3a8a;
46
+
47
+ /* ----- Color: semantic --------------------------------------------- */
48
+ --re-color-danger-500: #ef4444;
49
+ --re-color-danger-600: #dc2626;
50
+ --re-color-danger-700: #b91c1c;
51
+ --re-color-success-500: #10b981;
52
+ --re-color-success-600: #059669;
53
+ --re-color-success-700: #047857;
54
+ --re-color-warning-500: #f59e0b;
55
+ --re-color-warning-600: #d97706;
56
+ --re-color-warning-700: #b45309;
57
+
58
+ /* ----- Color: roles (resolve to neutral/accent above) -------------- */
59
+ --re-color-bg: var(--re-color-neutral-0);
60
+ --re-color-bg-subtle: var(--re-color-neutral-50);
61
+ --re-color-bg-muted: var(--re-color-neutral-100);
62
+ --re-color-surface: var(--re-color-neutral-0);
63
+ --re-color-text: var(--re-color-neutral-900);
64
+ --re-color-text-muted: var(--re-color-neutral-600);
65
+ --re-color-text-subtle: var(--re-color-neutral-500);
66
+ --re-color-text-on-accent: var(--re-color-neutral-0);
67
+ --re-color-text-danger: var(--re-color-danger-700);
68
+ --re-color-border: var(--re-color-neutral-200);
69
+ --re-color-border-strong: var(--re-color-neutral-300);
70
+ --re-color-border-danger: var(--re-color-danger-500);
71
+ --re-color-link: var(--re-color-accent-700);
72
+ --re-color-link-hover: var(--re-color-accent-800);
73
+ --re-color-link-visited: var(--re-color-accent-800);
74
+ --re-color-focus-ring: var(--re-color-accent-500);
75
+ --re-color-selection-bg: var(--re-color-accent-100);
76
+ --re-color-selection-text: var(--re-color-neutral-900);
77
+
78
+ /* ----- Typography -------------------------------------------------- */
79
+ --re-font-sans:
80
+ system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif;
81
+ --re-font-mono:
82
+ ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
83
+
84
+ --re-size-text-xs: 0.75rem; /* 12 */
85
+ --re-size-text-sm: 0.875rem; /* 14 */
86
+ --re-size-text-md: 1rem; /* 16 */
87
+ --re-size-text-lg: 1.125rem; /* 18 */
88
+ --re-size-text-xl: 1.25rem; /* 20 */
89
+ --re-size-text-2xl: 1.5rem; /* 24 */
90
+ --re-size-text-3xl: 1.875rem; /* 30 */
91
+ --re-size-text-4xl: 2.25rem; /* 36 */
92
+
93
+ --re-line-height-tight: 1.2;
94
+ --re-line-height-snug: 1.35;
95
+ --re-line-height-normal: 1.5;
96
+ --re-line-height-relaxed: 1.65;
97
+
98
+ --re-font-weight-regular: 400;
99
+ --re-font-weight-medium: 500;
100
+ --re-font-weight-semibold: 600;
101
+ --re-font-weight-bold: 700;
102
+
103
+ /* ----- Spacing (4px scale) ----------------------------------------- */
104
+ --re-space-0: 0;
105
+ --re-space-1: 0.25rem; /* 4 */
106
+ --re-space-2: 0.5rem; /* 8 */
107
+ --re-space-3: 0.75rem; /* 12 */
108
+ --re-space-4: 1rem; /* 16 */
109
+ --re-space-5: 1.25rem; /* 20 */
110
+ --re-space-6: 1.5rem; /* 24 */
111
+ --re-space-8: 2rem; /* 32 */
112
+ --re-space-10: 2.5rem; /* 40 */
113
+ --re-space-12: 3rem; /* 48 */
114
+ --re-space-16: 4rem; /* 64 */
115
+
116
+ /* ----- Radii ------------------------------------------------------- */
117
+ --re-radius-none: 0;
118
+ --re-radius-sm: 0.25rem;
119
+ --re-radius-md: 0.375rem;
120
+ --re-radius-lg: 0.5rem;
121
+ --re-radius-xl: 0.75rem;
122
+ --re-radius-pill: 9999px;
123
+
124
+ /* ----- Borders ----------------------------------------------------- */
125
+ --re-border-width: 1px;
126
+ --re-border-width-strong: 2px;
127
+ --re-border-default: var(--re-border-width) solid var(--re-color-border);
128
+ --re-border-strong: var(--re-border-width-strong) solid var(--re-color-border-strong);
129
+ --re-border-danger: var(--re-border-width) solid var(--re-color-border-danger);
130
+
131
+ /* ----- Focus ring -------------------------------------------------- */
132
+ --re-focus-ring-width: 2px;
133
+ --re-focus-ring-offset: 2px;
134
+ --re-focus-ring-color: var(--re-color-focus-ring);
135
+ --re-shadow-focus:
136
+ 0 0 0 var(--re-focus-ring-offset) var(--re-color-bg),
137
+ 0 0 0 calc(var(--re-focus-ring-offset) + var(--re-focus-ring-width))
138
+ var(--re-color-focus-ring);
139
+
140
+ /* ----- Elevation --------------------------------------------------- */
141
+ --re-shadow-sm: 0 1px 2px rgb(0 0 0 / 0.06);
142
+ --re-shadow-md: 0 4px 12px rgb(0 0 0 / 0.08);
143
+ --re-shadow-lg: 0 12px 32px rgb(0 0 0 / 0.12);
144
+
145
+ /* ----- Motion ------------------------------------------------------ */
146
+ --re-duration-instant: 0ms;
147
+ --re-duration-fast: 120ms;
148
+ --re-duration-normal: 200ms;
149
+ --re-duration-slow: 320ms;
150
+ --re-easing-standard: cubic-bezier(0.2, 0, 0, 1);
151
+ --re-easing-emphasized: cubic-bezier(0.3, 0, 0, 1);
152
+
153
+ /* ----- z-index ----------------------------------------------------- */
154
+ --re-z-base: 0;
155
+ --re-z-overlay: 100;
156
+ --re-z-popover: 200;
157
+ --re-z-dialog: 300;
158
+ --re-z-toast: 400;
159
+
160
+ /* ----- Layout sizing ---------------------------------------------- */
161
+ --re-control-height-sm: 1.75rem; /* 28 */
162
+ --re-control-height-md: 2.25rem; /* 36 */
163
+ --re-control-height-lg: 2.75rem; /* 44 — touch target */
164
+ --re-control-padding-x: var(--re-space-3);
165
+ --re-control-padding-y: var(--re-space-2);
166
+ }
167
+
168
+ /* Dark-scheme overrides: opt-in by setting `color-scheme: dark` on a
169
+ subtree, or trust the user-agent via prefers-color-scheme below. */
170
+ @media (prefers-color-scheme: dark) {
171
+ :root {
172
+ --re-color-bg: var(--re-color-neutral-950);
173
+ --re-color-bg-subtle: var(--re-color-neutral-900);
174
+ --re-color-bg-muted: var(--re-color-neutral-800);
175
+ --re-color-surface: var(--re-color-neutral-900);
176
+ --re-color-text: var(--re-color-neutral-50);
177
+ --re-color-text-muted: var(--re-color-neutral-300);
178
+ --re-color-text-subtle: var(--re-color-neutral-400);
179
+ --re-color-text-on-accent: var(--re-color-neutral-0);
180
+ --re-color-text-danger: var(--re-color-danger-500);
181
+ --re-color-border: var(--re-color-neutral-700);
182
+ --re-color-border-strong: var(--re-color-neutral-600);
183
+ --re-color-link: var(--re-color-accent-300);
184
+ --re-color-link-hover: var(--re-color-accent-200);
185
+ --re-color-link-visited: var(--re-color-accent-200);
186
+ --re-color-focus-ring: var(--re-color-accent-400);
187
+ --re-color-selection-bg: var(--re-color-accent-900);
188
+ --re-color-selection-text: var(--re-color-neutral-50);
189
+
190
+ /* On dark backgrounds the offset gap is invisible, so the border and
191
+ the outer ring appear as two separate blue lines. Remove the gap. */
192
+ --re-focus-ring-offset: 0px;
193
+ --re-shadow-focus: 0 0 0 2px var(--re-color-focus-ring);
194
+ }
195
+ }
196
+ }