@guard-rail/core 0.9.1 → 0.11.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 +253 -36
- package/dist/adapters/supabase/auth.js +1 -2
- package/dist/adapters/supabase/auth.js.map +1 -1
- package/dist/adapters/supabase/client.js +6 -1
- package/dist/adapters/supabase/client.js.map +1 -1
- package/dist/adapters/supabase/confirm.d.ts +11 -11
- package/dist/adapters/supabase/confirm.js +14 -18
- package/dist/adapters/supabase/confirm.js.map +1 -1
- package/dist/adapters/supabase/index.d.ts +3 -1
- package/dist/adapters/supabase/index.js +5 -0
- package/dist/adapters/supabase/index.js.map +1 -1
- package/dist/adapters/supabase/rateLimit.d.ts +24 -0
- package/dist/adapters/supabase/rateLimit.js +37 -0
- package/dist/adapters/supabase/rateLimit.js.map +1 -0
- package/dist/cli/doctor.d.ts +1 -0
- package/dist/cli/doctor.js +1046 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/init-db.js +23 -5
- package/dist/cli/init-db.js.map +1 -1
- package/dist/core/adapter-types.d.ts +71 -1
- package/dist/core/config.d.ts +12 -1
- package/dist/core/config.js +29 -1
- package/dist/core/config.js.map +1 -1
- package/dist/core/csp.d.ts +32 -0
- package/dist/core/csp.js +26 -0
- package/dist/core/csp.js.map +1 -0
- package/dist/core/validate.d.ts +47 -0
- package/dist/core/validate.js +118 -0
- package/dist/core/validate.js.map +1 -0
- package/dist/index.client.d.ts +2 -1
- package/dist/index.client.js +3 -0
- package/dist/index.client.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/react/Admin.d.ts +5 -3
- package/dist/react/Admin.js +29 -41
- package/dist/react/Admin.js.map +1 -1
- package/dist/react/AuthDrawer.js +22 -34
- package/dist/react/AuthDrawer.js.map +1 -1
- package/dist/react/AuthRedirectSync.js +28 -22
- package/dist/react/AuthRedirectSync.js.map +1 -1
- package/dist/react/GRail/client.js +27 -47
- package/dist/react/GRail/client.js.map +1 -1
- package/dist/react/GRail/render.js +3 -2
- package/dist/react/GRail/render.js.map +1 -1
- package/dist/react/MediaPicker.js +12 -16
- package/dist/react/MediaPicker.js.map +1 -1
- package/dist/react/Repeater/client.js +12 -13
- package/dist/react/Repeater/client.js.map +1 -1
- package/dist/react/Team.d.ts +1 -7
- package/dist/react/Team.js +21 -46
- package/dist/react/Team.js.map +1 -1
- package/dist/react/guardrail.css +563 -0
- package/dist/server/actions.js +52 -31
- package/dist/server/actions.js.map +1 -1
- package/dist/server/loader.js +4 -4
- package/dist/server/loader.js.map +1 -1
- package/dist/server/rateLimit.d.ts +21 -0
- package/dist/server/rateLimit.js +94 -0
- package/dist/server/rateLimit.js.map +1 -0
- package/dist/server/repeaterActions.js +9 -1
- package/dist/server/repeaterActions.js.map +1 -1
- package/dist/server/wrapper.js +18 -1
- package/dist/server/wrapper.js.map +1 -1
- package/package.json +11 -9
- package/supabase/admin/check-grants.sql +41 -0
- package/supabase/migrations/20261028000000_require_confirmed_email.sql +53 -0
- package/supabase/migrations/20261028010000_rate_limits.sql +67 -0
- package/supabase/migrations/20261028020000_member_and_bucket_guards.sql +96 -0
- package/dist/react/styles.d.ts +0 -504
- package/dist/react/styles.js +0 -500
- package/dist/react/styles.js.map +0 -1
- package/scripts/postinstall.mjs +0 -48
package/dist/react/styles.js
DELETED
|
@@ -1,500 +0,0 @@
|
|
|
1
|
-
const LIGHT = {
|
|
2
|
-
bg: "#ffffff",
|
|
3
|
-
"bg-glass": "rgba(255,255,255,0.97)",
|
|
4
|
-
fg: "#111827",
|
|
5
|
-
fg2: "#4b5563",
|
|
6
|
-
muted: "#6b7280",
|
|
7
|
-
subtle: "#9ca3af",
|
|
8
|
-
border: "#e5e7eb",
|
|
9
|
-
"border-strong": "#d1d5db",
|
|
10
|
-
"border-soft": "#f3f4f6",
|
|
11
|
-
"input-bg": "#ffffff",
|
|
12
|
-
soft: "#f3f4f6",
|
|
13
|
-
accent: "#2563eb",
|
|
14
|
-
"accent-soft": "#eff6ff",
|
|
15
|
-
"accent-text": "#1d4ed8",
|
|
16
|
-
"primary-bg": "#111827",
|
|
17
|
-
"primary-fg": "#ffffff",
|
|
18
|
-
danger: "#dc2626",
|
|
19
|
-
label: "#1e3a8a",
|
|
20
|
-
shadow: "rgba(0,0,0,0.25)"
|
|
21
|
-
};
|
|
22
|
-
const DARK = {
|
|
23
|
-
bg: "#0f1b2d",
|
|
24
|
-
"bg-glass": "rgba(15,27,45,0.97)",
|
|
25
|
-
fg: "#e6edf7",
|
|
26
|
-
fg2: "#b6c4d8",
|
|
27
|
-
muted: "#9fb0c7",
|
|
28
|
-
subtle: "#7d8ea6",
|
|
29
|
-
border: "rgba(148,163,184,0.22)",
|
|
30
|
-
"border-strong": "rgba(148,163,184,0.35)",
|
|
31
|
-
"border-soft": "rgba(148,163,184,0.14)",
|
|
32
|
-
"input-bg": "#14243b",
|
|
33
|
-
soft: "#1a2d49",
|
|
34
|
-
accent: "#3b82f6",
|
|
35
|
-
"accent-soft": "rgba(59,130,246,0.16)",
|
|
36
|
-
"accent-text": "#93c5fd",
|
|
37
|
-
"primary-bg": "#3b82f6",
|
|
38
|
-
"primary-fg": "#ffffff",
|
|
39
|
-
danger: "#f87171",
|
|
40
|
-
label: "#dbeafe",
|
|
41
|
-
shadow: "rgba(0,0,0,0.5)"
|
|
42
|
-
};
|
|
43
|
-
const v = (name) => `var(--gr-${name}, ${LIGHT[name]})`;
|
|
44
|
-
const declare = (t) => Object.entries(t).map(([k, val]) => `--gr-${k}: ${val};`).join(" ");
|
|
45
|
-
const THEME_CSS = `:root { ${declare(LIGHT)} }
|
|
46
|
-
[data-guardrail] { color-scheme: light; }
|
|
47
|
-
@media (prefers-color-scheme: dark) {
|
|
48
|
-
:root { ${declare(DARK)} }
|
|
49
|
-
[data-guardrail] { color-scheme: dark; }
|
|
50
|
-
}`;
|
|
51
|
-
const S = {
|
|
52
|
-
banner: {
|
|
53
|
-
position: "fixed",
|
|
54
|
-
bottom: 0,
|
|
55
|
-
left: 0,
|
|
56
|
-
width: "100%",
|
|
57
|
-
background: v("bg"),
|
|
58
|
-
color: v("fg"),
|
|
59
|
-
padding: "12px 16px",
|
|
60
|
-
zIndex: 1e4,
|
|
61
|
-
borderTop: `1px solid ${v("border")}`,
|
|
62
|
-
fontFamily: "system-ui, -apple-system, sans-serif"
|
|
63
|
-
},
|
|
64
|
-
bannerForm: {
|
|
65
|
-
display: "flex",
|
|
66
|
-
gap: 12,
|
|
67
|
-
justifyContent: "center",
|
|
68
|
-
alignItems: "center",
|
|
69
|
-
flexWrap: "wrap"
|
|
70
|
-
},
|
|
71
|
-
brand: {
|
|
72
|
-
fontWeight: 900,
|
|
73
|
-
letterSpacing: "0.15em",
|
|
74
|
-
fontSize: 12,
|
|
75
|
-
textTransform: "uppercase"
|
|
76
|
-
},
|
|
77
|
-
/** Brand plus any status/error text under it, stacked instead of sharing
|
|
78
|
-
* the form's row — otherwise a login error reads as if it's labeling the
|
|
79
|
-
* next field over, not feedback about the brand's own sign-in attempt. */
|
|
80
|
-
brandStack: {
|
|
81
|
-
display: "flex",
|
|
82
|
-
flexDirection: "column",
|
|
83
|
-
alignItems: "flex-start",
|
|
84
|
-
gap: 2
|
|
85
|
-
},
|
|
86
|
-
error: { color: v("danger"), fontSize: 12, fontWeight: 700 },
|
|
87
|
-
input: {
|
|
88
|
-
border: `1px solid ${v("border-strong")}`,
|
|
89
|
-
borderRadius: 4,
|
|
90
|
-
padding: "6px 8px",
|
|
91
|
-
fontSize: 13,
|
|
92
|
-
color: v("fg"),
|
|
93
|
-
background: v("input-bg"),
|
|
94
|
-
outline: "none"
|
|
95
|
-
},
|
|
96
|
-
primaryBtn: {
|
|
97
|
-
background: v("primary-bg"),
|
|
98
|
-
color: v("primary-fg"),
|
|
99
|
-
padding: "7px 16px",
|
|
100
|
-
borderRadius: 4,
|
|
101
|
-
fontSize: 12,
|
|
102
|
-
fontWeight: 700,
|
|
103
|
-
border: "none",
|
|
104
|
-
cursor: "pointer"
|
|
105
|
-
},
|
|
106
|
-
toolbar: {
|
|
107
|
-
position: "fixed",
|
|
108
|
-
bottom: 24,
|
|
109
|
-
left: "50%",
|
|
110
|
-
transform: "translateX(-50%)",
|
|
111
|
-
zIndex: 9999,
|
|
112
|
-
background: v("bg-glass"),
|
|
113
|
-
backdropFilter: "blur(8px)",
|
|
114
|
-
color: v("fg"),
|
|
115
|
-
padding: "12px 20px",
|
|
116
|
-
borderRadius: 9999,
|
|
117
|
-
boxShadow: `0 20px 40px ${v("shadow")}`,
|
|
118
|
-
display: "flex",
|
|
119
|
-
alignItems: "center",
|
|
120
|
-
gap: 20,
|
|
121
|
-
border: `1px solid ${v("border")}`,
|
|
122
|
-
fontFamily: "system-ui, -apple-system, sans-serif"
|
|
123
|
-
},
|
|
124
|
-
dot: {
|
|
125
|
-
display: "inline-block",
|
|
126
|
-
width: 8,
|
|
127
|
-
height: 8,
|
|
128
|
-
borderRadius: "50%",
|
|
129
|
-
background: v("accent")
|
|
130
|
-
},
|
|
131
|
-
toolbarLabel: {
|
|
132
|
-
fontSize: 10,
|
|
133
|
-
fontWeight: 900,
|
|
134
|
-
textTransform: "uppercase",
|
|
135
|
-
letterSpacing: "0.2em",
|
|
136
|
-
color: v("label")
|
|
137
|
-
},
|
|
138
|
-
divider: { width: 1, height: 16, background: v("border-strong") },
|
|
139
|
-
linkBtn: {
|
|
140
|
-
fontSize: 10,
|
|
141
|
-
fontWeight: 700,
|
|
142
|
-
textTransform: "uppercase",
|
|
143
|
-
letterSpacing: "0.15em",
|
|
144
|
-
color: v("muted"),
|
|
145
|
-
background: "none",
|
|
146
|
-
border: "none",
|
|
147
|
-
cursor: "pointer"
|
|
148
|
-
},
|
|
149
|
-
popover: {
|
|
150
|
-
position: "fixed",
|
|
151
|
-
bottom: 90,
|
|
152
|
-
left: "50%",
|
|
153
|
-
transform: "translateX(-50%)",
|
|
154
|
-
zIndex: 10001,
|
|
155
|
-
background: v("bg"),
|
|
156
|
-
color: v("fg"),
|
|
157
|
-
padding: 16,
|
|
158
|
-
borderRadius: 8,
|
|
159
|
-
boxShadow: `0 20px 40px ${v("shadow")}`,
|
|
160
|
-
border: `1px solid ${v("border")}`,
|
|
161
|
-
minWidth: 300,
|
|
162
|
-
cursor: "default",
|
|
163
|
-
fontFamily: "system-ui, -apple-system, sans-serif"
|
|
164
|
-
},
|
|
165
|
-
label: {
|
|
166
|
-
display: "block",
|
|
167
|
-
fontSize: 10,
|
|
168
|
-
fontWeight: 700,
|
|
169
|
-
color: v("subtle"),
|
|
170
|
-
marginBottom: 4,
|
|
171
|
-
textTransform: "uppercase"
|
|
172
|
-
},
|
|
173
|
-
field: {
|
|
174
|
-
border: `1px solid ${v("border-strong")}`,
|
|
175
|
-
borderRadius: 4,
|
|
176
|
-
padding: "6px 8px",
|
|
177
|
-
fontSize: 13,
|
|
178
|
-
color: v("fg"),
|
|
179
|
-
background: v("input-bg"),
|
|
180
|
-
width: "100%",
|
|
181
|
-
marginBottom: 8,
|
|
182
|
-
boxSizing: "border-box"
|
|
183
|
-
},
|
|
184
|
-
row: {
|
|
185
|
-
display: "flex",
|
|
186
|
-
gap: 8,
|
|
187
|
-
marginTop: 8,
|
|
188
|
-
paddingTop: 8,
|
|
189
|
-
borderTop: `1px solid ${v("border-soft")}`
|
|
190
|
-
},
|
|
191
|
-
cancelBtn: {
|
|
192
|
-
background: v("soft"),
|
|
193
|
-
color: v("fg2"),
|
|
194
|
-
padding: "7px 14px",
|
|
195
|
-
borderRadius: 4,
|
|
196
|
-
fontSize: 12,
|
|
197
|
-
border: "none",
|
|
198
|
-
cursor: "pointer"
|
|
199
|
-
},
|
|
200
|
-
/** Anchored to the element's rect at runtime; top/left are set inline. */
|
|
201
|
-
anchoredBar: {
|
|
202
|
-
position: "fixed",
|
|
203
|
-
zIndex: 10001,
|
|
204
|
-
display: "flex",
|
|
205
|
-
alignItems: "center",
|
|
206
|
-
gap: 4,
|
|
207
|
-
background: v("bg-glass"),
|
|
208
|
-
color: v("fg"),
|
|
209
|
-
backdropFilter: "blur(8px)",
|
|
210
|
-
padding: 4,
|
|
211
|
-
borderRadius: 8,
|
|
212
|
-
boxShadow: `0 8px 24px ${v("shadow")}`,
|
|
213
|
-
border: `1px solid ${v("border")}`,
|
|
214
|
-
fontFamily: "system-ui, -apple-system, sans-serif"
|
|
215
|
-
},
|
|
216
|
-
anchoredPanel: {
|
|
217
|
-
position: "fixed",
|
|
218
|
-
zIndex: 10001,
|
|
219
|
-
maxHeight: "calc(100vh - 24px)",
|
|
220
|
-
overflowY: "auto",
|
|
221
|
-
background: v("bg"),
|
|
222
|
-
color: v("fg"),
|
|
223
|
-
padding: 12,
|
|
224
|
-
borderRadius: 8,
|
|
225
|
-
boxShadow: `0 12px 32px ${v("shadow")}`,
|
|
226
|
-
border: `1px solid ${v("border")}`,
|
|
227
|
-
minWidth: 260,
|
|
228
|
-
maxWidth: "min(340px, calc(100vw - 16px))",
|
|
229
|
-
cursor: "default",
|
|
230
|
-
fontFamily: "system-ui, -apple-system, sans-serif"
|
|
231
|
-
},
|
|
232
|
-
iconBtn: {
|
|
233
|
-
display: "inline-flex",
|
|
234
|
-
alignItems: "center",
|
|
235
|
-
justifyContent: "center",
|
|
236
|
-
width: 26,
|
|
237
|
-
height: 26,
|
|
238
|
-
borderRadius: 6,
|
|
239
|
-
border: "none",
|
|
240
|
-
background: "transparent",
|
|
241
|
-
color: v("fg"),
|
|
242
|
-
cursor: "pointer",
|
|
243
|
-
padding: 0
|
|
244
|
-
},
|
|
245
|
-
iconBtnPrimary: {
|
|
246
|
-
display: "inline-flex",
|
|
247
|
-
alignItems: "center",
|
|
248
|
-
justifyContent: "center",
|
|
249
|
-
width: 26,
|
|
250
|
-
height: 26,
|
|
251
|
-
borderRadius: 6,
|
|
252
|
-
border: "none",
|
|
253
|
-
background: v("accent"),
|
|
254
|
-
color: "#fff",
|
|
255
|
-
cursor: "pointer",
|
|
256
|
-
padding: 0
|
|
257
|
-
},
|
|
258
|
-
scrim: {
|
|
259
|
-
position: "fixed",
|
|
260
|
-
inset: 0,
|
|
261
|
-
background: "rgba(0,0,0,0.4)",
|
|
262
|
-
zIndex: 10002
|
|
263
|
-
},
|
|
264
|
-
drawer: {
|
|
265
|
-
position: "fixed",
|
|
266
|
-
top: 0,
|
|
267
|
-
right: 0,
|
|
268
|
-
height: "100%",
|
|
269
|
-
width: "min(420px, 100vw)",
|
|
270
|
-
background: v("bg"),
|
|
271
|
-
color: v("fg"),
|
|
272
|
-
zIndex: 10003,
|
|
273
|
-
boxShadow: `-12px 0 32px ${v("shadow")}`,
|
|
274
|
-
display: "flex",
|
|
275
|
-
flexDirection: "column",
|
|
276
|
-
fontFamily: "system-ui, -apple-system, sans-serif"
|
|
277
|
-
},
|
|
278
|
-
drawerHead: {
|
|
279
|
-
display: "flex",
|
|
280
|
-
alignItems: "center",
|
|
281
|
-
justifyContent: "space-between",
|
|
282
|
-
padding: "16px 20px",
|
|
283
|
-
borderBottom: `1px solid ${v("border")}`
|
|
284
|
-
},
|
|
285
|
-
drawerTitle: { fontSize: 14, fontWeight: 800, margin: 0 },
|
|
286
|
-
drawerBody: { padding: 20, overflowY: "auto", flex: 1 },
|
|
287
|
-
memberRow: {
|
|
288
|
-
display: "flex",
|
|
289
|
-
alignItems: "center",
|
|
290
|
-
gap: 8,
|
|
291
|
-
padding: "10px 0",
|
|
292
|
-
borderBottom: `1px solid ${v("border-soft")}`
|
|
293
|
-
},
|
|
294
|
-
memberEmail: {
|
|
295
|
-
flex: 1,
|
|
296
|
-
fontSize: 13,
|
|
297
|
-
overflow: "hidden",
|
|
298
|
-
textOverflow: "ellipsis",
|
|
299
|
-
whiteSpace: "nowrap"
|
|
300
|
-
},
|
|
301
|
-
select: {
|
|
302
|
-
border: `1px solid ${v("border-strong")}`,
|
|
303
|
-
borderRadius: 4,
|
|
304
|
-
padding: "4px 6px",
|
|
305
|
-
fontSize: 12,
|
|
306
|
-
background: v("input-bg"),
|
|
307
|
-
color: v("fg")
|
|
308
|
-
},
|
|
309
|
-
badge: {
|
|
310
|
-
fontSize: 9,
|
|
311
|
-
fontWeight: 800,
|
|
312
|
-
textTransform: "uppercase",
|
|
313
|
-
letterSpacing: "0.1em",
|
|
314
|
-
padding: "2px 6px",
|
|
315
|
-
borderRadius: 999,
|
|
316
|
-
background: "#fef3c7",
|
|
317
|
-
color: "#92400e"
|
|
318
|
-
},
|
|
319
|
-
sectionLabel: {
|
|
320
|
-
fontSize: 10,
|
|
321
|
-
fontWeight: 800,
|
|
322
|
-
textTransform: "uppercase",
|
|
323
|
-
letterSpacing: "0.15em",
|
|
324
|
-
color: v("subtle"),
|
|
325
|
-
margin: "20px 0 8px"
|
|
326
|
-
},
|
|
327
|
-
pickerScrim: {
|
|
328
|
-
position: "fixed",
|
|
329
|
-
inset: 0,
|
|
330
|
-
background: "rgba(0,0,0,0.5)",
|
|
331
|
-
zIndex: 10010
|
|
332
|
-
},
|
|
333
|
-
picker: {
|
|
334
|
-
position: "fixed",
|
|
335
|
-
top: "50%",
|
|
336
|
-
left: "50%",
|
|
337
|
-
transform: "translate(-50%, -50%)",
|
|
338
|
-
width: "min(720px, calc(100vw - 32px))",
|
|
339
|
-
maxHeight: "min(640px, calc(100vh - 32px))",
|
|
340
|
-
background: v("bg"),
|
|
341
|
-
color: v("fg"),
|
|
342
|
-
borderRadius: 12,
|
|
343
|
-
zIndex: 10011,
|
|
344
|
-
boxShadow: `0 24px 64px ${v("shadow")}`,
|
|
345
|
-
display: "flex",
|
|
346
|
-
flexDirection: "column",
|
|
347
|
-
overflow: "hidden",
|
|
348
|
-
fontFamily: "system-ui, -apple-system, sans-serif"
|
|
349
|
-
},
|
|
350
|
-
pickerGrid: {
|
|
351
|
-
display: "grid",
|
|
352
|
-
gridTemplateColumns: "repeat(auto-fill, minmax(120px, 1fr))",
|
|
353
|
-
gap: 10
|
|
354
|
-
},
|
|
355
|
-
pickerTile: {
|
|
356
|
-
position: "relative",
|
|
357
|
-
aspectRatio: "1",
|
|
358
|
-
borderRadius: 8,
|
|
359
|
-
overflow: "hidden",
|
|
360
|
-
border: "2px solid transparent",
|
|
361
|
-
background: v("soft"),
|
|
362
|
-
cursor: "pointer",
|
|
363
|
-
padding: 0
|
|
364
|
-
},
|
|
365
|
-
pickerTileActive: { borderColor: v("accent") },
|
|
366
|
-
pickerThumb: {
|
|
367
|
-
width: "100%",
|
|
368
|
-
height: "100%",
|
|
369
|
-
objectFit: "cover",
|
|
370
|
-
display: "block"
|
|
371
|
-
},
|
|
372
|
-
dropzone: {
|
|
373
|
-
border: `1.5px dashed ${v("border-strong")}`,
|
|
374
|
-
borderRadius: 8,
|
|
375
|
-
padding: 16,
|
|
376
|
-
textAlign: "center",
|
|
377
|
-
fontSize: 13,
|
|
378
|
-
color: v("muted"),
|
|
379
|
-
marginBottom: 14,
|
|
380
|
-
cursor: "pointer"
|
|
381
|
-
},
|
|
382
|
-
dropzoneActive: {
|
|
383
|
-
borderColor: v("accent"),
|
|
384
|
-
background: v("accent-soft"),
|
|
385
|
-
color: v("accent-text")
|
|
386
|
-
},
|
|
387
|
-
previewThumb: {
|
|
388
|
-
// maxWidth also caps what the image contributes to the panel's width. The
|
|
389
|
-
// panel shrink-wraps its content, so an uncapped width: 100% image grew
|
|
390
|
-
// the whole panel to the picture's natural size.
|
|
391
|
-
width: "100%",
|
|
392
|
-
maxWidth: 300,
|
|
393
|
-
height: "auto",
|
|
394
|
-
maxHeight: 200,
|
|
395
|
-
objectFit: "contain",
|
|
396
|
-
background: v("soft"),
|
|
397
|
-
borderRadius: 6,
|
|
398
|
-
display: "block",
|
|
399
|
-
marginBottom: 8
|
|
400
|
-
},
|
|
401
|
-
secondaryBtn: {
|
|
402
|
-
background: v("soft"),
|
|
403
|
-
color: v("fg"),
|
|
404
|
-
padding: "7px 12px",
|
|
405
|
-
borderRadius: 4,
|
|
406
|
-
fontSize: 12,
|
|
407
|
-
fontWeight: 600,
|
|
408
|
-
border: "none",
|
|
409
|
-
cursor: "pointer",
|
|
410
|
-
width: "100%",
|
|
411
|
-
marginBottom: 10
|
|
412
|
-
},
|
|
413
|
-
/**
|
|
414
|
-
* Edit affordance for image fields, drawn as separate fixed elements instead
|
|
415
|
-
* of styling the <img> itself. Backgrounds (next/image `fill` behind
|
|
416
|
-
* overlaid content) can't take an in-place affordance: it either sits under
|
|
417
|
-
* the content and can't be clicked, or gets lifted over it and hides it.
|
|
418
|
-
* The outline ignores the pointer so overlaid content stays interactive;
|
|
419
|
-
* the handle is the one clickable piece.
|
|
420
|
-
*/
|
|
421
|
-
markerOutline: {
|
|
422
|
-
position: "fixed",
|
|
423
|
-
zIndex: 9990,
|
|
424
|
-
pointerEvents: "none",
|
|
425
|
-
boxSizing: "border-box",
|
|
426
|
-
borderRadius: 2
|
|
427
|
-
},
|
|
428
|
-
markerHandle: {
|
|
429
|
-
position: "fixed",
|
|
430
|
-
zIndex: 9991,
|
|
431
|
-
display: "inline-flex",
|
|
432
|
-
alignItems: "center",
|
|
433
|
-
gap: 5,
|
|
434
|
-
padding: "4px 9px 4px 7px",
|
|
435
|
-
borderRadius: 6,
|
|
436
|
-
border: "none",
|
|
437
|
-
background: v("accent"),
|
|
438
|
-
color: "#fff",
|
|
439
|
-
fontSize: 11,
|
|
440
|
-
fontWeight: 700,
|
|
441
|
-
fontFamily: "system-ui, -apple-system, sans-serif",
|
|
442
|
-
cursor: "pointer",
|
|
443
|
-
boxShadow: `0 4px 12px ${v("shadow")}`
|
|
444
|
-
},
|
|
445
|
-
repeaterItem: {
|
|
446
|
-
position: "relative",
|
|
447
|
-
outline: "1px dashed #60a5fa",
|
|
448
|
-
outlineOffset: 2
|
|
449
|
-
},
|
|
450
|
-
repeaterToolbar: {
|
|
451
|
-
position: "absolute",
|
|
452
|
-
top: 4,
|
|
453
|
-
right: 4,
|
|
454
|
-
zIndex: 20,
|
|
455
|
-
display: "flex",
|
|
456
|
-
gap: 2,
|
|
457
|
-
background: v("bg-glass"),
|
|
458
|
-
color: v("fg"),
|
|
459
|
-
backdropFilter: "blur(6px)",
|
|
460
|
-
padding: 3,
|
|
461
|
-
borderRadius: 6,
|
|
462
|
-
boxShadow: `0 4px 12px ${v("shadow")}`,
|
|
463
|
-
border: `1px solid ${v("border")}`
|
|
464
|
-
},
|
|
465
|
-
repeaterAddRow: {
|
|
466
|
-
display: "flex",
|
|
467
|
-
gap: 8,
|
|
468
|
-
alignItems: "center",
|
|
469
|
-
marginTop: 8,
|
|
470
|
-
fontFamily: "system-ui, -apple-system, sans-serif"
|
|
471
|
-
},
|
|
472
|
-
repeaterAddBtn: {
|
|
473
|
-
display: "inline-flex",
|
|
474
|
-
alignItems: "center",
|
|
475
|
-
gap: 6,
|
|
476
|
-
padding: "8px 14px",
|
|
477
|
-
borderRadius: 6,
|
|
478
|
-
border: `1.5px dashed ${v("accent")}`,
|
|
479
|
-
background: "transparent",
|
|
480
|
-
color: v("accent"),
|
|
481
|
-
fontSize: 12,
|
|
482
|
-
fontWeight: 700,
|
|
483
|
-
cursor: "pointer"
|
|
484
|
-
},
|
|
485
|
-
repeaterSlugInput: {
|
|
486
|
-
border: `1px solid ${v("border-strong")}`,
|
|
487
|
-
borderRadius: 4,
|
|
488
|
-
padding: "7px 9px",
|
|
489
|
-
fontSize: 13,
|
|
490
|
-
color: v("fg"),
|
|
491
|
-
background: v("input-bg"),
|
|
492
|
-
minWidth: 180
|
|
493
|
-
}
|
|
494
|
-
};
|
|
495
|
-
export {
|
|
496
|
-
S,
|
|
497
|
-
THEME_CSS,
|
|
498
|
-
v
|
|
499
|
-
};
|
|
500
|
-
//# sourceMappingURL=styles.js.map
|
package/dist/react/styles.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/react/styles.ts"],"sourcesContent":["import type { CSSProperties } from \"react\";\n\n/**\n * Guardrail's own chrome is styled with inline styles on purpose. Utility\n * classes would make the package depend on the consumer having Tailwind *and*\n * adding node_modules/guardrail to their content globs — it would render\n * unstyled on a clean install. Developer-authored content is never touched.\n *\n * Colors are CSS variables so the chrome can follow the visitor's OS light/dark\n * preference — inline styles can't express a media query, but they can read a\n * variable that one defines. THEME_CSS (rendered once by <GRailAdmin>) sets the\n * variables; every use below carries the light value as its fallback, so the\n * chrome still renders correctly if that stylesheet is ever absent.\n */\nconst LIGHT = {\n bg: \"#ffffff\",\n \"bg-glass\": \"rgba(255,255,255,0.97)\",\n fg: \"#111827\",\n fg2: \"#4b5563\",\n muted: \"#6b7280\",\n subtle: \"#9ca3af\",\n border: \"#e5e7eb\",\n \"border-strong\": \"#d1d5db\",\n \"border-soft\": \"#f3f4f6\",\n \"input-bg\": \"#ffffff\",\n soft: \"#f3f4f6\",\n accent: \"#2563eb\",\n \"accent-soft\": \"#eff6ff\",\n \"accent-text\": \"#1d4ed8\",\n \"primary-bg\": \"#111827\",\n \"primary-fg\": \"#ffffff\",\n danger: \"#dc2626\",\n label: \"#1e3a8a\",\n shadow: \"rgba(0,0,0,0.25)\",\n} as const;\n\nconst DARK: Record<keyof typeof LIGHT, string> = {\n bg: \"#0f1b2d\",\n \"bg-glass\": \"rgba(15,27,45,0.97)\",\n fg: \"#e6edf7\",\n fg2: \"#b6c4d8\",\n muted: \"#9fb0c7\",\n subtle: \"#7d8ea6\",\n border: \"rgba(148,163,184,0.22)\",\n \"border-strong\": \"rgba(148,163,184,0.35)\",\n \"border-soft\": \"rgba(148,163,184,0.14)\",\n \"input-bg\": \"#14243b\",\n soft: \"#1a2d49\",\n accent: \"#3b82f6\",\n \"accent-soft\": \"rgba(59,130,246,0.16)\",\n \"accent-text\": \"#93c5fd\",\n \"primary-bg\": \"#3b82f6\",\n \"primary-fg\": \"#ffffff\",\n danger: \"#f87171\",\n label: \"#dbeafe\",\n shadow: \"rgba(0,0,0,0.5)\",\n};\n\n/** A themed color: reads the variable, falls back to the light value. */\nexport const v = (name: keyof typeof LIGHT) => `var(--gr-${name}, ${LIGHT[name]})`;\n\nconst declare = (t: Record<string, string>) =>\n Object.entries(t).map(([k, val]) => `--gr-${k}: ${val};`).join(\" \");\n\n/**\n * Rendered once by <GRailAdmin>. Variables go on :root so portaled chrome\n * inherits them. `color-scheme` is deliberately scoped to Guardrail's own\n * elements, never :root — that would flip the host site's form controls and\n * scrollbars too. It's what makes native controls inside the chrome (the\n * team drawer's role <select>, its dropdown list) match the palette.\n */\nexport const THEME_CSS = `:root { ${declare(LIGHT)} }\n[data-guardrail] { color-scheme: light; }\n@media (prefers-color-scheme: dark) {\n :root { ${declare(DARK)} }\n [data-guardrail] { color-scheme: dark; }\n}`;\n\nexport const S = {\n banner: {\n position: \"fixed\",\n bottom: 0,\n left: 0,\n width: \"100%\",\n background: v(\"bg\"),\n color: v(\"fg\"),\n padding: \"12px 16px\",\n zIndex: 10000,\n borderTop: `1px solid ${v(\"border\")}`,\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n },\n bannerForm: {\n display: \"flex\",\n gap: 12,\n justifyContent: \"center\",\n alignItems: \"center\",\n flexWrap: \"wrap\",\n },\n brand: {\n fontWeight: 900,\n letterSpacing: \"0.15em\",\n fontSize: 12,\n textTransform: \"uppercase\",\n },\n /** Brand plus any status/error text under it, stacked instead of sharing\n * the form's row — otherwise a login error reads as if it's labeling the\n * next field over, not feedback about the brand's own sign-in attempt. */\n brandStack: {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"flex-start\",\n gap: 2,\n },\n error: { color: v(\"danger\"), fontSize: 12, fontWeight: 700 },\n input: {\n border: `1px solid ${v(\"border-strong\")}`,\n borderRadius: 4,\n padding: \"6px 8px\",\n fontSize: 13,\n color: v(\"fg\"),\n background: v(\"input-bg\"),\n outline: \"none\",\n },\n primaryBtn: {\n background: v(\"primary-bg\"),\n color: v(\"primary-fg\"),\n padding: \"7px 16px\",\n borderRadius: 4,\n fontSize: 12,\n fontWeight: 700,\n border: \"none\",\n cursor: \"pointer\",\n },\n toolbar: {\n position: \"fixed\",\n bottom: 24,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n zIndex: 9999,\n background: v(\"bg-glass\"),\n backdropFilter: \"blur(8px)\",\n color: v(\"fg\"),\n padding: \"12px 20px\",\n borderRadius: 9999,\n boxShadow: `0 20px 40px ${v(\"shadow\")}`,\n display: \"flex\",\n alignItems: \"center\",\n gap: 20,\n border: `1px solid ${v(\"border\")}`,\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n },\n dot: {\n display: \"inline-block\",\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n background: v(\"accent\"),\n },\n toolbarLabel: {\n fontSize: 10,\n fontWeight: 900,\n textTransform: \"uppercase\",\n letterSpacing: \"0.2em\",\n color: v(\"label\"),\n },\n divider: { width: 1, height: 16, background: v(\"border-strong\") },\n linkBtn: {\n fontSize: 10,\n fontWeight: 700,\n textTransform: \"uppercase\",\n letterSpacing: \"0.15em\",\n color: v(\"muted\"),\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n },\n popover: {\n position: \"fixed\",\n bottom: 90,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n zIndex: 10001,\n background: v(\"bg\"),\n color: v(\"fg\"),\n padding: 16,\n borderRadius: 8,\n boxShadow: `0 20px 40px ${v(\"shadow\")}`,\n border: `1px solid ${v(\"border\")}`,\n minWidth: 300,\n cursor: \"default\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n },\n label: {\n display: \"block\",\n fontSize: 10,\n fontWeight: 700,\n color: v(\"subtle\"),\n marginBottom: 4,\n textTransform: \"uppercase\",\n },\n field: {\n border: `1px solid ${v(\"border-strong\")}`,\n borderRadius: 4,\n padding: \"6px 8px\",\n fontSize: 13,\n color: v(\"fg\"),\n background: v(\"input-bg\"),\n width: \"100%\",\n marginBottom: 8,\n boxSizing: \"border-box\",\n },\n row: {\n display: \"flex\",\n gap: 8,\n marginTop: 8,\n paddingTop: 8,\n borderTop: `1px solid ${v(\"border-soft\")}`,\n },\n cancelBtn: {\n background: v(\"soft\"),\n color: v(\"fg2\"),\n padding: \"7px 14px\",\n borderRadius: 4,\n fontSize: 12,\n border: \"none\",\n cursor: \"pointer\",\n },\n\n /** Anchored to the element's rect at runtime; top/left are set inline. */\n anchoredBar: {\n position: \"fixed\",\n zIndex: 10001,\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n background: v(\"bg-glass\"),\n color: v(\"fg\"),\n backdropFilter: \"blur(8px)\",\n padding: 4,\n borderRadius: 8,\n boxShadow: `0 8px 24px ${v(\"shadow\")}`,\n border: `1px solid ${v(\"border\")}`,\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n },\n anchoredPanel: {\n position: \"fixed\",\n zIndex: 10001,\n maxHeight: \"calc(100vh - 24px)\",\n overflowY: \"auto\",\n background: v(\"bg\"),\n color: v(\"fg\"),\n padding: 12,\n borderRadius: 8,\n boxShadow: `0 12px 32px ${v(\"shadow\")}`,\n border: `1px solid ${v(\"border\")}`,\n minWidth: 260,\n maxWidth: \"min(340px, calc(100vw - 16px))\",\n cursor: \"default\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n },\n iconBtn: {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 26,\n height: 26,\n borderRadius: 6,\n border: \"none\",\n background: \"transparent\",\n color: v(\"fg\"),\n cursor: \"pointer\",\n padding: 0,\n },\n iconBtnPrimary: {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 26,\n height: 26,\n borderRadius: 6,\n border: \"none\",\n background: v(\"accent\"),\n color: \"#fff\",\n cursor: \"pointer\",\n padding: 0,\n },\n\n scrim: {\n position: \"fixed\",\n inset: 0,\n background: \"rgba(0,0,0,0.4)\",\n zIndex: 10002,\n },\n drawer: {\n position: \"fixed\",\n top: 0,\n right: 0,\n height: \"100%\",\n width: \"min(420px, 100vw)\",\n background: v(\"bg\"),\n color: v(\"fg\"),\n zIndex: 10003,\n boxShadow: `-12px 0 32px ${v(\"shadow\")}`,\n display: \"flex\",\n flexDirection: \"column\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n },\n drawerHead: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"16px 20px\",\n borderBottom: `1px solid ${v(\"border\")}`,\n },\n drawerTitle: { fontSize: 14, fontWeight: 800, margin: 0 },\n drawerBody: { padding: 20, overflowY: \"auto\", flex: 1 },\n memberRow: {\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"10px 0\",\n borderBottom: `1px solid ${v(\"border-soft\")}`,\n },\n memberEmail: {\n flex: 1,\n fontSize: 13,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n },\n select: {\n border: `1px solid ${v(\"border-strong\")}`,\n borderRadius: 4,\n padding: \"4px 6px\",\n fontSize: 12,\n background: v(\"input-bg\"),\n color: v(\"fg\"),\n },\n badge: {\n fontSize: 9,\n fontWeight: 800,\n textTransform: \"uppercase\",\n letterSpacing: \"0.1em\",\n padding: \"2px 6px\",\n borderRadius: 999,\n background: \"#fef3c7\",\n color: \"#92400e\",\n },\n sectionLabel: {\n fontSize: 10,\n fontWeight: 800,\n textTransform: \"uppercase\",\n letterSpacing: \"0.15em\",\n color: v(\"subtle\"),\n margin: \"20px 0 8px\",\n },\n\n pickerScrim: {\n position: \"fixed\",\n inset: 0,\n background: \"rgba(0,0,0,0.5)\",\n zIndex: 10010,\n },\n picker: {\n position: \"fixed\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n width: \"min(720px, calc(100vw - 32px))\",\n maxHeight: \"min(640px, calc(100vh - 32px))\",\n background: v(\"bg\"),\n color: v(\"fg\"),\n borderRadius: 12,\n zIndex: 10011,\n boxShadow: `0 24px 64px ${v(\"shadow\")}`,\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n },\n pickerGrid: {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fill, minmax(120px, 1fr))\",\n gap: 10,\n },\n pickerTile: {\n position: \"relative\",\n aspectRatio: \"1\",\n borderRadius: 8,\n overflow: \"hidden\",\n border: \"2px solid transparent\",\n background: v(\"soft\"),\n cursor: \"pointer\",\n padding: 0,\n },\n pickerTileActive: { borderColor: v(\"accent\") },\n pickerThumb: {\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n display: \"block\",\n },\n dropzone: {\n border: `1.5px dashed ${v(\"border-strong\")}`,\n borderRadius: 8,\n padding: 16,\n textAlign: \"center\",\n fontSize: 13,\n color: v(\"muted\"),\n marginBottom: 14,\n cursor: \"pointer\",\n },\n dropzoneActive: {\n borderColor: v(\"accent\"),\n background: v(\"accent-soft\"),\n color: v(\"accent-text\"),\n },\n previewThumb: {\n // maxWidth also caps what the image contributes to the panel's width. The\n // panel shrink-wraps its content, so an uncapped width: 100% image grew\n // the whole panel to the picture's natural size.\n width: \"100%\",\n maxWidth: 300,\n height: \"auto\",\n maxHeight: 200,\n objectFit: \"contain\",\n background: v(\"soft\"),\n borderRadius: 6,\n display: \"block\",\n marginBottom: 8,\n },\n secondaryBtn: {\n background: v(\"soft\"),\n color: v(\"fg\"),\n padding: \"7px 12px\",\n borderRadius: 4,\n fontSize: 12,\n fontWeight: 600,\n border: \"none\",\n cursor: \"pointer\",\n width: \"100%\",\n marginBottom: 10,\n },\n\n /**\n * Edit affordance for image fields, drawn as separate fixed elements instead\n * of styling the <img> itself. Backgrounds (next/image `fill` behind\n * overlaid content) can't take an in-place affordance: it either sits under\n * the content and can't be clicked, or gets lifted over it and hides it.\n * The outline ignores the pointer so overlaid content stays interactive;\n * the handle is the one clickable piece.\n */\n markerOutline: {\n position: \"fixed\",\n zIndex: 9990,\n pointerEvents: \"none\",\n boxSizing: \"border-box\",\n borderRadius: 2,\n },\n markerHandle: {\n position: \"fixed\",\n zIndex: 9991,\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 5,\n padding: \"4px 9px 4px 7px\",\n borderRadius: 6,\n border: \"none\",\n background: v(\"accent\"),\n color: \"#fff\",\n fontSize: 11,\n fontWeight: 700,\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n cursor: \"pointer\",\n boxShadow: `0 4px 12px ${v(\"shadow\")}`,\n },\n\n repeaterItem: {\n position: \"relative\",\n outline: \"1px dashed #60a5fa\",\n outlineOffset: 2,\n },\n repeaterToolbar: {\n position: \"absolute\",\n top: 4,\n right: 4,\n zIndex: 20,\n display: \"flex\",\n gap: 2,\n background: v(\"bg-glass\"),\n color: v(\"fg\"),\n backdropFilter: \"blur(6px)\",\n padding: 3,\n borderRadius: 6,\n boxShadow: `0 4px 12px ${v(\"shadow\")}`,\n border: `1px solid ${v(\"border\")}`,\n },\n repeaterAddRow: {\n display: \"flex\",\n gap: 8,\n alignItems: \"center\",\n marginTop: 8,\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n },\n repeaterAddBtn: {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"8px 14px\",\n borderRadius: 6,\n border: `1.5px dashed ${v(\"accent\")}`,\n background: \"transparent\",\n color: v(\"accent\"),\n fontSize: 12,\n fontWeight: 700,\n cursor: \"pointer\",\n },\n repeaterSlugInput: {\n border: `1px solid ${v(\"border-strong\")}`,\n borderRadius: 4,\n padding: \"7px 9px\",\n fontSize: 13,\n color: v(\"fg\"),\n background: v(\"input-bg\"),\n minWidth: 180,\n },\n} satisfies Record<string, CSSProperties>;\n"],"mappings":"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","names":[]}
|
package/scripts/postinstall.mjs
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
// Plain, already-final JS — deliberately NOT part of the tsup build. A
|
|
2
|
-
// postinstall script has to exist the instant npm/pnpm/yarn extracts the
|
|
3
|
-
// package, with no dependency on a build step having run yet, which would
|
|
4
|
-
// otherwise race tsup during this very monorepo's own installs (lifecycle
|
|
5
|
-
// script ordering between "postinstall" and "prepare" isn't a guarantee
|
|
6
|
-
// worth relying on).
|
|
7
|
-
//
|
|
8
|
-
// Runs after `npm install @guard-rail/core` in a consuming project — just
|
|
9
|
-
// onboarding guidance, easy to miss otherwise among the rest of an install's
|
|
10
|
-
// output.
|
|
11
|
-
//
|
|
12
|
-
// Deliberately silent in two cases:
|
|
13
|
-
// - CI: this is guidance for a human at a keyboard, not something that
|
|
14
|
-
// belongs in build logs.
|
|
15
|
-
// - Running inside this very monorepo: pnpm runs a workspace package's own
|
|
16
|
-
// lifecycle scripts too (already visible via the "prepare" build step on
|
|
17
|
-
// every `pnpm install`), which would otherwise print this on every
|
|
18
|
-
// contributor's install of this repo, not just a real consumer's. Resolved
|
|
19
|
-
// through the pnpm workspace symlink, this file's own real path sits under
|
|
20
|
-
// packages/guardrail/ — never inside a node_modules/ — which a real
|
|
21
|
-
// consumer's install always does.
|
|
22
|
-
import { fileURLToPath } from "node:url";
|
|
23
|
-
|
|
24
|
-
const isRealInstall = fileURLToPath(import.meta.url).includes("node_modules");
|
|
25
|
-
|
|
26
|
-
if (isRealInstall && !process.env.CI) {
|
|
27
|
-
console.log(`
|
|
28
|
-
Guardrail installed. Next steps:
|
|
29
|
-
|
|
30
|
-
1. Set up the database (skip both if this Supabase project already has
|
|
31
|
-
Guardrail applied for another site — see "Many sites, one Supabase
|
|
32
|
-
project" in the README):
|
|
33
|
-
- pnpm exec guardrail-init-db --push
|
|
34
|
-
- If that project is hosted (not local Docker), also add "guardrail"
|
|
35
|
-
under Settings > API > Exposed schemas in the Supabase dashboard —
|
|
36
|
-
config.toml only covers local dev.
|
|
37
|
-
|
|
38
|
-
2. Wrap your root layout with withGuardrail and mark fields with <GRail>.
|
|
39
|
-
Full guide: https://www.npmjs.com/package/@guard-rail/core
|
|
40
|
-
|
|
41
|
-
3. Once SUPABASE_URL / SUPABASE_ANON_KEY are set, seed yourself as the
|
|
42
|
-
first admin on a site (needs the service_role key, not the anon key —
|
|
43
|
-
Settings > API in the dashboard; pass it inline, don't store it):
|
|
44
|
-
|
|
45
|
-
SERVICE_KEY=... pnpm exec guardrail-seed-user \\
|
|
46
|
-
--email=you@example.com --password=... --site-id=my-site
|
|
47
|
-
`);
|
|
48
|
-
}
|