@synqauth/react 0.0.0-stage → 0.0.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.
@@ -0,0 +1,244 @@
1
+ /*
2
+ * @synqauth/react's components, styled. Import it once:
3
+ *
4
+ * import '@synqauth/react/styles.css'
5
+ *
6
+ * A theme is a few variables, set on :root or any element above the
7
+ * components. Every rule is inside :where(), so the app's own CSS wins over
8
+ * any of them without fighting specificity. A component with `unstyled`
9
+ * carries none of these classes.
10
+ */
11
+
12
+ :where(.synq) {
13
+ --synq-font-family: inherit;
14
+ --synq-font-size: 0.9375rem;
15
+ --synq-color-text: #0f172a;
16
+ --synq-color-muted: #64748b;
17
+ --synq-color-background: #ffffff;
18
+ --synq-color-surface: #f8fafc;
19
+ --synq-color-border: #e2e8f0;
20
+ --synq-color-primary: #4f46e5;
21
+ --synq-color-primary-text: #ffffff;
22
+ --synq-color-danger: #dc2626;
23
+ --synq-radius: 0.5rem;
24
+ --synq-spacing: 0.75rem;
25
+ --synq-shadow: 0 8px 24px rgb(15 23 42 / 0.12);
26
+
27
+ font-family: var(--synq-font-family);
28
+ font-size: var(--synq-font-size);
29
+ color: var(--synq-color-text);
30
+ }
31
+
32
+ @media (prefers-color-scheme: dark) {
33
+ :where(.synq) {
34
+ --synq-color-text: #e2e8f0;
35
+ --synq-color-muted: #94a3b8;
36
+ --synq-color-background: #0f172a;
37
+ --synq-color-surface: #1e293b;
38
+ --synq-color-border: #334155;
39
+ --synq-color-primary: #818cf8;
40
+ --synq-color-primary-text: #0f172a;
41
+ --synq-color-danger: #f87171;
42
+ --synq-shadow: 0 8px 24px rgb(0 0 0 / 0.4);
43
+ }
44
+ }
45
+
46
+ :where(.synq-sign-in-button, .synq-button) {
47
+ display: inline-flex;
48
+ align-items: center;
49
+ gap: 0.375rem;
50
+ padding: 0.5rem 0.875rem;
51
+ border: 1px solid var(--synq-color-border);
52
+ border-radius: var(--synq-radius);
53
+ background: var(--synq-color-background);
54
+ color: var(--synq-color-text);
55
+ font: inherit;
56
+ font-weight: 500;
57
+ cursor: pointer;
58
+ }
59
+
60
+ :where(.synq-sign-in-button, .synq-button-primary) {
61
+ border-color: var(--synq-color-primary);
62
+ background: var(--synq-color-primary);
63
+ color: var(--synq-color-primary-text);
64
+ }
65
+
66
+ :where(.synq-sign-in-button, .synq-button):disabled {
67
+ opacity: 0.55;
68
+ cursor: not-allowed;
69
+ }
70
+
71
+ :where(
72
+ .synq-sign-in-button,
73
+ .synq-button,
74
+ .synq-user-button-trigger,
75
+ .synq-menu-item,
76
+ .synq-input
77
+ ):focus-visible {
78
+ outline: 2px solid var(--synq-color-primary);
79
+ outline-offset: 2px;
80
+ }
81
+
82
+ :where(.synq-user-button) {
83
+ position: relative;
84
+ display: inline-block;
85
+ }
86
+
87
+ :where(.synq-user-button-trigger) {
88
+ display: inline-flex;
89
+ align-items: center;
90
+ gap: 0.5rem;
91
+ padding: 0.25rem 0.625rem 0.25rem 0.25rem;
92
+ border: 1px solid var(--synq-color-border);
93
+ border-radius: 999px;
94
+ background: var(--synq-color-background);
95
+ color: inherit;
96
+ font: inherit;
97
+ cursor: pointer;
98
+ }
99
+
100
+ :where(.synq-avatar) {
101
+ display: inline-grid;
102
+ place-items: center;
103
+ width: 2rem;
104
+ height: 2rem;
105
+ border-radius: 999px;
106
+ background: var(--synq-color-primary);
107
+ color: var(--synq-color-primary-text);
108
+ font-size: 0.8125rem;
109
+ font-weight: 600;
110
+ object-fit: cover;
111
+ }
112
+
113
+ :where(.synq-menu) {
114
+ position: absolute;
115
+ right: 0;
116
+ z-index: 50;
117
+ display: grid;
118
+ min-width: 12rem;
119
+ margin-top: 0.375rem;
120
+ padding: 0.25rem;
121
+ border: 1px solid var(--synq-color-border);
122
+ border-radius: var(--synq-radius);
123
+ background: var(--synq-color-background);
124
+ box-shadow: var(--synq-shadow);
125
+ }
126
+
127
+ :where(.synq-menu-item) {
128
+ display: block;
129
+ padding: 0.5rem 0.75rem;
130
+ border: 0;
131
+ border-radius: calc(var(--synq-radius) - 0.125rem);
132
+ background: none;
133
+ color: inherit;
134
+ font: inherit;
135
+ text-align: left;
136
+ text-decoration: none;
137
+ cursor: pointer;
138
+ }
139
+
140
+ :where(.synq-menu-item):hover {
141
+ background: var(--synq-color-surface);
142
+ }
143
+
144
+ :where(.synq-account-manager) {
145
+ display: grid;
146
+ gap: calc(var(--synq-spacing) * 2);
147
+ }
148
+
149
+ :where(.synq-section, .synq-wallet-manager) {
150
+ display: grid;
151
+ gap: var(--synq-spacing);
152
+ padding: calc(var(--synq-spacing) * 1.5);
153
+ border: 1px solid var(--synq-color-border);
154
+ border-radius: var(--synq-radius);
155
+ background: var(--synq-color-background);
156
+ }
157
+
158
+ :where(.synq-heading) {
159
+ margin: 0;
160
+ font-size: 1rem;
161
+ font-weight: 600;
162
+ }
163
+
164
+ :where(.synq-form) {
165
+ display: grid;
166
+ gap: var(--synq-spacing);
167
+ }
168
+
169
+ :where(.synq-form-inline) {
170
+ display: flex;
171
+ flex-wrap: wrap;
172
+ align-items: end;
173
+ gap: 0.5rem;
174
+ }
175
+
176
+ :where(.synq-field) {
177
+ display: grid;
178
+ gap: 0.25rem;
179
+ }
180
+
181
+ :where(.synq-label) {
182
+ color: var(--synq-color-muted);
183
+ font-size: 0.8125rem;
184
+ }
185
+
186
+ :where(.synq-input) {
187
+ padding: 0.5rem 0.625rem;
188
+ border: 1px solid var(--synq-color-border);
189
+ border-radius: var(--synq-radius);
190
+ background: var(--synq-color-background);
191
+ color: inherit;
192
+ font: inherit;
193
+ }
194
+
195
+ :where(.synq-actions) {
196
+ display: flex;
197
+ align-items: center;
198
+ gap: var(--synq-spacing);
199
+ }
200
+
201
+ :where(.synq-list) {
202
+ display: grid;
203
+ margin: 0;
204
+ padding: 0;
205
+ list-style: none;
206
+ }
207
+
208
+ :where(.synq-row) {
209
+ display: flex;
210
+ flex-wrap: wrap;
211
+ align-items: center;
212
+ gap: 0.5rem;
213
+ padding: 0.625rem 0;
214
+ border-top: 1px solid var(--synq-color-border);
215
+ }
216
+
217
+ :where(.synq-row):first-child {
218
+ border-top: 0;
219
+ }
220
+
221
+ :where(.synq-row-title) {
222
+ flex: 1 1 auto;
223
+ font-weight: 500;
224
+ }
225
+
226
+ :where(.synq-badge) {
227
+ padding: 0.125rem 0.5rem;
228
+ border-radius: 999px;
229
+ background: var(--synq-color-surface);
230
+ color: var(--synq-color-primary);
231
+ font-size: 0.75rem;
232
+ font-weight: 600;
233
+ }
234
+
235
+ :where(.synq-muted) {
236
+ margin: 0;
237
+ color: var(--synq-color-muted);
238
+ }
239
+
240
+ :where(.synq-error) {
241
+ flex-basis: 100%;
242
+ margin: 0;
243
+ color: var(--synq-color-danger);
244
+ }
package/package.json CHANGED
@@ -1,6 +1,56 @@
1
1
  {
2
2
  "name": "@synqauth/react",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.0.0",
4
+ "description": "React hooks and components for Synq.",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/aerosol-build/synq.git",
9
+ "directory": "packages/react"
10
+ },
11
+ "type": "module",
12
+ "sideEffects": [
13
+ "*.css"
14
+ ],
15
+ "engines": {
16
+ "node": ">=22"
17
+ },
18
+ "exports": {
19
+ ".": {
20
+ "types": "./dist/index.d.ts",
21
+ "default": "./dist/index.js"
22
+ },
23
+ "./styles.css": "./dist/styles.css",
24
+ "./package.json": "./package.json"
25
+ },
26
+ "files": [
27
+ "dist"
28
+ ],
29
+ "publishConfig": {
30
+ "access": "public"
31
+ },
32
+ "dependencies": {
33
+ "@synqauth/js": "0.0.0"
34
+ },
35
+ "peerDependencies": {
36
+ "react": ">=19.0.0"
37
+ },
38
+ "devDependencies": {
39
+ "@testing-library/dom": "10.4.2",
40
+ "@testing-library/react": "16.3.3",
41
+ "@testing-library/user-event": "14.6.7",
42
+ "@types/react": "19.3.0",
43
+ "@types/react-dom": "19.3.0",
44
+ "@vitest/coverage-v8": "5.0.2",
45
+ "jsdom": "30.1.1",
46
+ "react": "19.3.0",
47
+ "react-dom": "19.3.0",
48
+ "vitest": "5.0.2"
49
+ },
50
+ "scripts": {
51
+ "build": "tsdown",
52
+ "lint": "eslint .",
53
+ "typecheck": "tsc",
54
+ "test": "vitest run --coverage"
55
+ }
6
56
  }