@rcnr/theme 2.0.6 → 4.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.
- package/dist/index.d.mts +3 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +125 -61
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +111 -48
- package/dist/index.mjs.map +1 -1
- package/index.css +301 -66
- package/package.json +3 -1
package/dist/index.d.mts
CHANGED
|
@@ -41,6 +41,8 @@ interface RCNRMountainLogoProps {
|
|
|
41
41
|
}
|
|
42
42
|
declare function RCNRMountainLogo({ href, className, }: RCNRMountainLogoProps): react_jsx_runtime.JSX.Element;
|
|
43
43
|
|
|
44
|
+
declare function ThemeToggle(): react_jsx_runtime.JSX.Element;
|
|
45
|
+
|
|
44
46
|
interface ReportIssueModalProps {
|
|
45
47
|
isOpen: boolean;
|
|
46
48
|
onClose: () => void;
|
|
@@ -59,4 +61,4 @@ interface RequestToolModalProps {
|
|
|
59
61
|
}
|
|
60
62
|
declare function RequestToolModal({ isOpen, onClose, toolName, apiBaseUrl, userEmail, }: RequestToolModalProps): react_jsx_runtime.JSX.Element | null;
|
|
61
63
|
|
|
62
|
-
export { RCNRFooter, type RCNRFooterProps, RCNRHeader, type RCNRHeaderProps, RCNRMountainLogo, RCNRSubNav, type RCNRSubNavProps, ReportIssueModal, RequestToolModal };
|
|
64
|
+
export { RCNRFooter, type RCNRFooterProps, RCNRHeader, type RCNRHeaderProps, RCNRMountainLogo, RCNRSubNav, type RCNRSubNavProps, ReportIssueModal, RequestToolModal, ThemeToggle };
|
package/dist/index.d.ts
CHANGED
|
@@ -41,6 +41,8 @@ interface RCNRMountainLogoProps {
|
|
|
41
41
|
}
|
|
42
42
|
declare function RCNRMountainLogo({ href, className, }: RCNRMountainLogoProps): react_jsx_runtime.JSX.Element;
|
|
43
43
|
|
|
44
|
+
declare function ThemeToggle(): react_jsx_runtime.JSX.Element;
|
|
45
|
+
|
|
44
46
|
interface ReportIssueModalProps {
|
|
45
47
|
isOpen: boolean;
|
|
46
48
|
onClose: () => void;
|
|
@@ -59,4 +61,4 @@ interface RequestToolModalProps {
|
|
|
59
61
|
}
|
|
60
62
|
declare function RequestToolModal({ isOpen, onClose, toolName, apiBaseUrl, userEmail, }: RequestToolModalProps): react_jsx_runtime.JSX.Element | null;
|
|
61
63
|
|
|
62
|
-
export { RCNRFooter, type RCNRFooterProps, RCNRHeader, type RCNRHeaderProps, RCNRMountainLogo, RCNRSubNav, type RCNRSubNavProps, ReportIssueModal, RequestToolModal };
|
|
64
|
+
export { RCNRFooter, type RCNRFooterProps, RCNRHeader, type RCNRHeaderProps, RCNRMountainLogo, RCNRSubNav, type RCNRSubNavProps, ReportIssueModal, RequestToolModal, ThemeToggle };
|
package/dist/index.js
CHANGED
|
@@ -25,7 +25,8 @@ __export(index_exports, {
|
|
|
25
25
|
RCNRMountainLogo: () => RCNRMountainLogo_default,
|
|
26
26
|
RCNRSubNav: () => RCNRSubNav_default,
|
|
27
27
|
ReportIssueModal: () => ReportIssueModal,
|
|
28
|
-
RequestToolModal: () => RequestToolModal
|
|
28
|
+
RequestToolModal: () => RequestToolModal,
|
|
29
|
+
ThemeToggle: () => ThemeToggle
|
|
29
30
|
});
|
|
30
31
|
module.exports = __toCommonJS(index_exports);
|
|
31
32
|
|
|
@@ -40,6 +41,7 @@ function RCNRMountainLogo({
|
|
|
40
41
|
{
|
|
41
42
|
href,
|
|
42
43
|
className: `flex items-center justify-center w-10 h-10 rounded-lg bg-brand/10 hover:bg-brand/20 transition-colors ${className}`,
|
|
44
|
+
style: { color: "var(--rcnr-logo-fill)" },
|
|
43
45
|
title: "Back to Dashboard",
|
|
44
46
|
children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
45
47
|
"svg",
|
|
@@ -54,14 +56,14 @@ function RCNRMountainLogo({
|
|
|
54
56
|
"path",
|
|
55
57
|
{
|
|
56
58
|
d: "M10,90l26.48-39.76h.31s4.54,5.02,4.54,5.02l.32-.16,23.06-37.14,17.34,28.63,3.65-4.61,30.22,48.03h-8.43c-7.17-12.26-15.51-24.35-23.06-36.26-1.43.52-2.03,3.6-3.49,3.97l-16.31-25.93-21.87,34.36-5.09-5.01-19.48,28.87h-8.19Z",
|
|
57
|
-
fill: "
|
|
59
|
+
fill: "currentColor"
|
|
58
60
|
}
|
|
59
61
|
),
|
|
60
62
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
61
63
|
"path",
|
|
62
64
|
{
|
|
63
65
|
d: "M89.84,90h-5.73c-6.34-8.18-12.93-16.89-19.64-24.65-6.66,8.19-13.04,16.6-19.89,24.65h-5.81l25.69-39.76,25.37,39.76Z",
|
|
64
|
-
fill: "
|
|
66
|
+
fill: "currentColor"
|
|
65
67
|
}
|
|
66
68
|
)
|
|
67
69
|
]
|
|
@@ -254,9 +256,49 @@ function RCNRFooter({
|
|
|
254
256
|
}
|
|
255
257
|
var RCNRFooter_default = RCNRFooter;
|
|
256
258
|
|
|
257
|
-
// src/
|
|
259
|
+
// src/ThemeToggle.tsx
|
|
258
260
|
var import_react = require("react");
|
|
261
|
+
var import_lucide_react = require("lucide-react");
|
|
259
262
|
var import_jsx_runtime5 = require("react/jsx-runtime");
|
|
263
|
+
var STORAGE_KEY = "rcnr-theme";
|
|
264
|
+
function getInitialTheme() {
|
|
265
|
+
if (typeof window === "undefined") return "dark";
|
|
266
|
+
const stored = localStorage.getItem(STORAGE_KEY);
|
|
267
|
+
if (stored === "light" || stored === "dark") return stored;
|
|
268
|
+
return "dark";
|
|
269
|
+
}
|
|
270
|
+
function ThemeToggle() {
|
|
271
|
+
const [theme, setTheme] = (0, import_react.useState)(getInitialTheme);
|
|
272
|
+
(0, import_react.useEffect)(() => {
|
|
273
|
+
document.documentElement.setAttribute("data-theme", theme);
|
|
274
|
+
localStorage.setItem(STORAGE_KEY, theme);
|
|
275
|
+
}, [theme]);
|
|
276
|
+
const toggle = () => setTheme((prev) => prev === "dark" ? "light" : "dark");
|
|
277
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
278
|
+
"button",
|
|
279
|
+
{
|
|
280
|
+
onClick: toggle,
|
|
281
|
+
"aria-label": `Switch to ${theme === "dark" ? "light" : "dark"} mode`,
|
|
282
|
+
style: {
|
|
283
|
+
background: "transparent",
|
|
284
|
+
border: "none",
|
|
285
|
+
cursor: "pointer",
|
|
286
|
+
padding: "6px",
|
|
287
|
+
borderRadius: "6px",
|
|
288
|
+
display: "inline-flex",
|
|
289
|
+
alignItems: "center",
|
|
290
|
+
justifyContent: "center",
|
|
291
|
+
color: "var(--rcnr-text2, #6888aa)",
|
|
292
|
+
transition: "color 0.2s ease"
|
|
293
|
+
},
|
|
294
|
+
children: theme === "dark" ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_lucide_react.Sun, { size: 18 }) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_lucide_react.Moon, { size: 18 })
|
|
295
|
+
}
|
|
296
|
+
);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
// src/ReportIssueModal.tsx
|
|
300
|
+
var import_react2 = require("react");
|
|
301
|
+
var import_jsx_runtime6 = require("react/jsx-runtime");
|
|
260
302
|
function ReportIssueModal({
|
|
261
303
|
isOpen,
|
|
262
304
|
onClose,
|
|
@@ -264,17 +306,17 @@ function ReportIssueModal({
|
|
|
264
306
|
apiBaseUrl = "https://api.rcnr.net",
|
|
265
307
|
userEmail
|
|
266
308
|
}) {
|
|
267
|
-
const [description, setDescription] = (0,
|
|
268
|
-
const [submitting, setSubmitting] = (0,
|
|
269
|
-
const [submitted, setSubmitted] = (0,
|
|
270
|
-
const [error, setError] = (0,
|
|
271
|
-
const handleClose = (0,
|
|
309
|
+
const [description, setDescription] = (0, import_react2.useState)("");
|
|
310
|
+
const [submitting, setSubmitting] = (0, import_react2.useState)(false);
|
|
311
|
+
const [submitted, setSubmitted] = (0, import_react2.useState)(false);
|
|
312
|
+
const [error, setError] = (0, import_react2.useState)("");
|
|
313
|
+
const handleClose = (0, import_react2.useCallback)(() => {
|
|
272
314
|
setDescription("");
|
|
273
315
|
setError("");
|
|
274
316
|
setSubmitted(false);
|
|
275
317
|
onClose();
|
|
276
318
|
}, [onClose]);
|
|
277
|
-
(0,
|
|
319
|
+
(0, import_react2.useEffect)(() => {
|
|
278
320
|
if (!isOpen) return;
|
|
279
321
|
const onKey = (e) => {
|
|
280
322
|
if (e.key === "Escape") handleClose();
|
|
@@ -306,50 +348,60 @@ function ReportIssueModal({
|
|
|
306
348
|
setSubmitting(false);
|
|
307
349
|
}
|
|
308
350
|
};
|
|
309
|
-
return /* @__PURE__ */ (0,
|
|
351
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
310
352
|
"div",
|
|
311
353
|
{
|
|
312
354
|
className: "fixed inset-0 z-50 flex items-center justify-center p-4",
|
|
313
|
-
style: { background: "
|
|
355
|
+
style: { background: "var(--rcnr-overlay)", backdropFilter: "blur(6px)" },
|
|
314
356
|
onClick: handleClose,
|
|
315
|
-
children: /* @__PURE__ */ (0,
|
|
357
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
|
|
316
358
|
"div",
|
|
317
359
|
{
|
|
318
360
|
className: "relative glass-card rounded-2xl w-full max-w-md p-8",
|
|
319
361
|
style: { animation: "fadeIn 0.15s ease" },
|
|
320
362
|
onClick: (e) => e.stopPropagation(),
|
|
321
363
|
children: [
|
|
322
|
-
/* @__PURE__ */ (0,
|
|
364
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
323
365
|
"button",
|
|
324
366
|
{
|
|
325
367
|
onClick: handleClose,
|
|
326
|
-
className: "absolute top-4 right-4 p-2
|
|
368
|
+
className: "absolute top-4 right-4 p-2 rounded-lg transition-colors",
|
|
369
|
+
style: { color: "var(--rcnr-text3)" },
|
|
370
|
+
onMouseOver: (e) => {
|
|
371
|
+
e.currentTarget.style.color = "var(--rcnr-text)";
|
|
372
|
+
e.currentTarget.style.background = "var(--rcnr-surface2)";
|
|
373
|
+
},
|
|
374
|
+
onMouseOut: (e) => {
|
|
375
|
+
e.currentTarget.style.color = "var(--rcnr-text3)";
|
|
376
|
+
e.currentTarget.style.background = "transparent";
|
|
377
|
+
},
|
|
327
378
|
"aria-label": "Close",
|
|
328
|
-
children: /* @__PURE__ */ (0,
|
|
379
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("path", { d: "M18 6L6 18M6 6l12 12" }) })
|
|
329
380
|
}
|
|
330
381
|
),
|
|
331
|
-
submitted ? /* @__PURE__ */ (0,
|
|
332
|
-
/* @__PURE__ */ (0,
|
|
333
|
-
/* @__PURE__ */ (0,
|
|
334
|
-
] }) : /* @__PURE__ */ (0,
|
|
335
|
-
/* @__PURE__ */ (0,
|
|
336
|
-
/* @__PURE__ */ (0,
|
|
337
|
-
/* @__PURE__ */ (0,
|
|
338
|
-
/* @__PURE__ */ (0,
|
|
339
|
-
/* @__PURE__ */ (0,
|
|
340
|
-
/* @__PURE__ */ (0,
|
|
382
|
+
submitted ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "text-center py-6", children: [
|
|
383
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "w-12 h-12 rounded-full bg-emerald-500/15 flex items-center justify-center mx-auto mb-4", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", className: "text-emerald-400", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("polyline", { points: "20 6 9 17 4 12" }) }) }),
|
|
384
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "font-semibold", style: { color: "var(--rcnr-text)" }, children: "Report sent. We'll fix it fast." })
|
|
385
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_jsx_runtime6.Fragment, { children: [
|
|
386
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("h2", { className: "text-xl font-bold font-serif mb-1", style: { color: "var(--rcnr-text)" }, children: "Report an Issue" }),
|
|
387
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "text-sm mb-6", style: { color: "var(--rcnr-text3)" }, children: "Found a bug or something broken? Let us know." }),
|
|
388
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("form", { onSubmit: handleSubmit, className: "space-y-4", children: [
|
|
389
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { children: [
|
|
390
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("label", { className: "block text-xs font-semibold uppercase tracking-wider mb-2", style: { color: "var(--rcnr-text3)" }, children: "Tool" }),
|
|
391
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
341
392
|
"input",
|
|
342
393
|
{
|
|
343
394
|
type: "text",
|
|
344
395
|
value: toolName,
|
|
345
396
|
disabled: true,
|
|
346
|
-
className: "w-full px-4 py-2.5 rounded-xl
|
|
397
|
+
className: "w-full px-4 py-2.5 rounded-xl text-sm",
|
|
398
|
+
style: { background: "var(--rcnr-surface2)", border: "1px solid var(--rcnr-border)", color: "var(--rcnr-text3)" }
|
|
347
399
|
}
|
|
348
400
|
)
|
|
349
401
|
] }),
|
|
350
|
-
/* @__PURE__ */ (0,
|
|
351
|
-
/* @__PURE__ */ (0,
|
|
352
|
-
/* @__PURE__ */ (0,
|
|
402
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { children: [
|
|
403
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("label", { className: "block text-xs font-semibold uppercase tracking-wider mb-2", style: { color: "var(--rcnr-text3)" }, children: "What went wrong?" }),
|
|
404
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
353
405
|
"textarea",
|
|
354
406
|
{
|
|
355
407
|
value: description,
|
|
@@ -357,12 +409,13 @@ function ReportIssueModal({
|
|
|
357
409
|
placeholder: "Describe the issue...",
|
|
358
410
|
rows: 4,
|
|
359
411
|
required: true,
|
|
360
|
-
className: "
|
|
412
|
+
className: "rcnr-input resize-none",
|
|
413
|
+
style: { paddingLeft: "1rem" }
|
|
361
414
|
}
|
|
362
415
|
)
|
|
363
416
|
] }),
|
|
364
|
-
error && /* @__PURE__ */ (0,
|
|
365
|
-
/* @__PURE__ */ (0,
|
|
417
|
+
error && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "text-red-400 text-sm", children: error }),
|
|
418
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
366
419
|
"button",
|
|
367
420
|
{
|
|
368
421
|
type: "submit",
|
|
@@ -381,8 +434,8 @@ function ReportIssueModal({
|
|
|
381
434
|
}
|
|
382
435
|
|
|
383
436
|
// src/RequestToolModal.tsx
|
|
384
|
-
var
|
|
385
|
-
var
|
|
437
|
+
var import_react3 = require("react");
|
|
438
|
+
var import_jsx_runtime7 = require("react/jsx-runtime");
|
|
386
439
|
function RequestToolModal({
|
|
387
440
|
isOpen,
|
|
388
441
|
onClose,
|
|
@@ -390,17 +443,17 @@ function RequestToolModal({
|
|
|
390
443
|
apiBaseUrl = "https://api.rcnr.net",
|
|
391
444
|
userEmail
|
|
392
445
|
}) {
|
|
393
|
-
const [description, setDescription] = (0,
|
|
394
|
-
const [submitting, setSubmitting] = (0,
|
|
395
|
-
const [submitted, setSubmitted] = (0,
|
|
396
|
-
const [error, setError] = (0,
|
|
397
|
-
const handleClose = (0,
|
|
446
|
+
const [description, setDescription] = (0, import_react3.useState)("");
|
|
447
|
+
const [submitting, setSubmitting] = (0, import_react3.useState)(false);
|
|
448
|
+
const [submitted, setSubmitted] = (0, import_react3.useState)(false);
|
|
449
|
+
const [error, setError] = (0, import_react3.useState)("");
|
|
450
|
+
const handleClose = (0, import_react3.useCallback)(() => {
|
|
398
451
|
setDescription("");
|
|
399
452
|
setError("");
|
|
400
453
|
setSubmitted(false);
|
|
401
454
|
onClose();
|
|
402
455
|
}, [onClose]);
|
|
403
|
-
(0,
|
|
456
|
+
(0, import_react3.useEffect)(() => {
|
|
404
457
|
if (!isOpen) return;
|
|
405
458
|
const onKey = (e) => {
|
|
406
459
|
if (e.key === "Escape") handleClose();
|
|
@@ -432,38 +485,47 @@ function RequestToolModal({
|
|
|
432
485
|
setSubmitting(false);
|
|
433
486
|
}
|
|
434
487
|
};
|
|
435
|
-
return /* @__PURE__ */ (0,
|
|
488
|
+
return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
|
|
436
489
|
"div",
|
|
437
490
|
{
|
|
438
491
|
className: "fixed inset-0 z-50 flex items-center justify-center p-4",
|
|
439
|
-
style: { background: "
|
|
492
|
+
style: { background: "var(--rcnr-overlay)", backdropFilter: "blur(6px)" },
|
|
440
493
|
onClick: handleClose,
|
|
441
|
-
children: /* @__PURE__ */ (0,
|
|
494
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
|
|
442
495
|
"div",
|
|
443
496
|
{
|
|
444
497
|
className: "relative glass-card rounded-2xl w-full max-w-md p-8",
|
|
445
498
|
style: { animation: "fadeIn 0.15s ease" },
|
|
446
499
|
onClick: (e) => e.stopPropagation(),
|
|
447
500
|
children: [
|
|
448
|
-
/* @__PURE__ */ (0,
|
|
501
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
|
|
449
502
|
"button",
|
|
450
503
|
{
|
|
451
504
|
onClick: handleClose,
|
|
452
|
-
className: "absolute top-4 right-4 p-2
|
|
505
|
+
className: "absolute top-4 right-4 p-2 rounded-lg transition-colors",
|
|
506
|
+
style: { color: "var(--rcnr-text3)" },
|
|
507
|
+
onMouseOver: (e) => {
|
|
508
|
+
e.currentTarget.style.color = "var(--rcnr-text)";
|
|
509
|
+
e.currentTarget.style.background = "var(--rcnr-surface2)";
|
|
510
|
+
},
|
|
511
|
+
onMouseOut: (e) => {
|
|
512
|
+
e.currentTarget.style.color = "var(--rcnr-text3)";
|
|
513
|
+
e.currentTarget.style.background = "transparent";
|
|
514
|
+
},
|
|
453
515
|
"aria-label": "Close",
|
|
454
|
-
children: /* @__PURE__ */ (0,
|
|
516
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("path", { d: "M18 6L6 18M6 6l12 12" }) })
|
|
455
517
|
}
|
|
456
518
|
),
|
|
457
|
-
submitted ? /* @__PURE__ */ (0,
|
|
458
|
-
/* @__PURE__ */ (0,
|
|
459
|
-
/* @__PURE__ */ (0,
|
|
460
|
-
] }) : /* @__PURE__ */ (0,
|
|
461
|
-
/* @__PURE__ */ (0,
|
|
462
|
-
/* @__PURE__ */ (0,
|
|
463
|
-
/* @__PURE__ */ (0,
|
|
464
|
-
/* @__PURE__ */ (0,
|
|
465
|
-
/* @__PURE__ */ (0,
|
|
466
|
-
/* @__PURE__ */ (0,
|
|
519
|
+
submitted ? /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "text-center py-6", children: [
|
|
520
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "w-12 h-12 rounded-full bg-brand/10 flex items-center justify-center mx-auto mb-4", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", className: "text-brand", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("polyline", { points: "20 6 9 17 4 12" }) }) }),
|
|
521
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { className: "font-semibold", style: { color: "var(--rcnr-text)" }, children: "Request received. Thanks!" })
|
|
522
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_jsx_runtime7.Fragment, { children: [
|
|
523
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("h2", { className: "text-xl font-bold font-serif mb-1", style: { color: "var(--rcnr-text)" }, children: "Request a Tool" }),
|
|
524
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { className: "text-sm mb-6", style: { color: "var(--rcnr-text3)" }, children: "Have an idea for something we should build?" }),
|
|
525
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("form", { onSubmit: handleSubmit, className: "space-y-4", children: [
|
|
526
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { children: [
|
|
527
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("label", { className: "block text-xs font-semibold uppercase tracking-wider mb-2", style: { color: "var(--rcnr-text3)" }, children: "Describe what you need" }),
|
|
528
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
|
|
467
529
|
"textarea",
|
|
468
530
|
{
|
|
469
531
|
value: description,
|
|
@@ -471,12 +533,13 @@ function RequestToolModal({
|
|
|
471
533
|
placeholder: "What problem would this tool solve? What would it do?",
|
|
472
534
|
rows: 5,
|
|
473
535
|
required: true,
|
|
474
|
-
className: "
|
|
536
|
+
className: "rcnr-input resize-none",
|
|
537
|
+
style: { paddingLeft: "1rem" }
|
|
475
538
|
}
|
|
476
539
|
)
|
|
477
540
|
] }),
|
|
478
|
-
error && /* @__PURE__ */ (0,
|
|
479
|
-
/* @__PURE__ */ (0,
|
|
541
|
+
error && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { className: "text-red-400 text-sm", children: error }),
|
|
542
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
|
|
480
543
|
"button",
|
|
481
544
|
{
|
|
482
545
|
type: "submit",
|
|
@@ -500,6 +563,7 @@ function RequestToolModal({
|
|
|
500
563
|
RCNRMountainLogo,
|
|
501
564
|
RCNRSubNav,
|
|
502
565
|
ReportIssueModal,
|
|
503
|
-
RequestToolModal
|
|
566
|
+
RequestToolModal,
|
|
567
|
+
ThemeToggle
|
|
504
568
|
});
|
|
505
569
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/RCNRMountainLogo.tsx","../src/RCNRHeader.tsx","../src/RCNRSubNav.tsx","../src/RCNRFooter.tsx","../src/ReportIssueModal.tsx","../src/RequestToolModal.tsx"],"sourcesContent":["export { default as RCNRHeader } from './RCNRHeader'\r\nexport { default as RCNRSubNav } from './RCNRSubNav'\r\nexport { default as RCNRFooter } from './RCNRFooter'\r\nexport { default as RCNRMountainLogo } from './RCNRMountainLogo'\r\nexport { ReportIssueModal } from './ReportIssueModal'\r\nexport { RequestToolModal } from './RequestToolModal'\r\n\r\nexport type {\r\n RCNRHeaderProps,\r\n RCNRSubNavProps,\r\n RCNRFooterProps,\r\n} from './types'\r\n","interface RCNRMountainLogoProps {\r\n href?: string\r\n className?: string\r\n}\r\n\r\nfunction RCNRMountainLogo({\r\n href = 'https://teacher.rcnr.net',\r\n className = '',\r\n}: RCNRMountainLogoProps) {\r\n return (\r\n <a\r\n href={href}\r\n className={`flex items-center justify-center w-10 h-10 rounded-lg bg-brand/10 hover:bg-brand/20 transition-colors ${className}`}\r\n title=\"Back to Dashboard\"\r\n >\r\n <svg\r\n width=\"28\"\r\n height=\"24\"\r\n viewBox=\"0 0 120 100\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M10,90l26.48-39.76h.31s4.54,5.02,4.54,5.02l.32-.16,23.06-37.14,17.34,28.63,3.65-4.61,30.22,48.03h-8.43c-7.17-12.26-15.51-24.35-23.06-36.26-1.43.52-2.03,3.6-3.49,3.97l-16.31-25.93-21.87,34.36-5.09-5.01-19.48,28.87h-8.19Z\"\r\n fill=\"#99D9D9\"\r\n />\r\n <path\r\n d=\"M89.84,90h-5.73c-6.34-8.18-12.93-16.89-19.64-24.65-6.66,8.19-13.04,16.6-19.89,24.65h-5.81l25.69-39.76,25.37,39.76Z\"\r\n fill=\"#99D9D9\"\r\n />\r\n </svg>\r\n </a>\r\n )\r\n}\r\n\r\nexport default RCNRMountainLogo\r\n","import type { ReactNode } from 'react'\r\nimport type { RCNRHeaderProps } from './types'\r\nimport RCNRMountainLogo from './RCNRMountainLogo'\r\n\r\nfunction NavButton({\r\n onClick,\r\n icon,\r\n label,\r\n title,\r\n}: {\r\n onClick: () => void\r\n icon: ReactNode\r\n label: string\r\n title?: string\r\n}) {\r\n return (\r\n <button\r\n onClick={onClick}\r\n className=\"flex items-center gap-2 px-3 py-2 text-brand/70 hover:text-brand hover:bg-brand/5 rounded-lg transition-colors\"\r\n title={title ?? label}\r\n >\r\n {icon}\r\n <span className=\"hidden md:inline text-sm\">{label}</span>\r\n </button>\r\n )\r\n}\r\n\r\nconst defaultReportIssue = () =>\r\n window.open('mailto:support@rcnr.net?subject=Bug%20Report', '_blank')\r\n\r\nconst defaultRequestTool = () =>\r\n window.open('mailto:support@rcnr.net?subject=Feature%20Request', '_blank')\r\n\r\nfunction RCNRHeader({\r\n toolName,\r\n dashboardUrl = 'https://teacher.rcnr.net',\r\n extraNavItems,\r\n userAvatar,\r\n onHowItWorks,\r\n onReportIssue = defaultReportIssue,\r\n onRequestTool = defaultRequestTool,\r\n}: RCNRHeaderProps) {\r\n return (\r\n <header className=\"glass-card border-b border-brand/15 px-6 py-4\">\r\n <div className=\"flex items-center justify-between\">\r\n {/* Left: Logo + Tool Name */}\r\n <div className=\"flex items-center gap-4\">\r\n <RCNRMountainLogo href={dashboardUrl} />\r\n <span className=\"text-xl font-serif text-brand\">{toolName}</span>\r\n </div>\r\n\r\n {/* Right: Nav Actions */}\r\n <div className=\"flex items-center gap-2\">\r\n {/* Tool-specific nav items first */}\r\n {extraNavItems?.map((item) => (\r\n <NavButton\r\n key={item.label}\r\n onClick={item.onClick}\r\n icon={item.icon}\r\n label={item.label}\r\n />\r\n ))}\r\n\r\n {/* Standard nav items in fixed order */}\r\n {onHowItWorks && (\r\n <NavButton\r\n onClick={onHowItWorks}\r\n label=\"How It Works\"\r\n icon={\r\n <svg\r\n className=\"w-[18px] h-[18px]\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n strokeWidth={2}\r\n >\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n d=\"M9.09 9a3 3 0 015.83 1c0 2-3 3-3 3\"\r\n />\r\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\r\n </svg>\r\n }\r\n />\r\n )}\r\n\r\n <NavButton\r\n onClick={onReportIssue}\r\n label=\"Report Issue\"\r\n icon={\r\n <svg\r\n className=\"w-[18px] h-[18px]\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n strokeWidth={2}\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\r\n />\r\n </svg>\r\n }\r\n />\r\n\r\n <NavButton\r\n onClick={onRequestTool}\r\n label=\"Request Tool\"\r\n icon={\r\n <svg\r\n className=\"w-[18px] h-[18px]\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n strokeWidth={2}\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n d=\"M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z\"\r\n />\r\n </svg>\r\n }\r\n />\r\n\r\n {userAvatar}\r\n </div>\r\n </div>\r\n </header>\r\n )\r\n}\r\n\r\nexport default RCNRHeader\r\n","import type { RCNRSubNavProps } from './types'\r\n\r\nfunction RCNRSubNav({ tabs }: RCNRSubNavProps) {\r\n return (\r\n <nav className=\"flex items-center gap-1 px-6 py-2 border-b border-brand/10 bg-surface/50\">\r\n {tabs.map((tab) => {\r\n const isWarning = tab.variant === 'warning'\r\n const activeClass = isWarning\r\n ? 'bg-warning/10 text-warning border border-warning/20'\r\n : 'bg-brand/15 text-brand'\r\n const inactiveClass = isWarning\r\n ? 'text-warning/70 hover:text-warning hover:bg-warning/5 border border-warning/10'\r\n : 'text-brand/50 hover:text-brand hover:bg-brand/5'\r\n\r\n const className = `flex items-center gap-2 px-4 py-2 rounded-lg text-sm transition-colors ${\r\n tab.active ? activeClass : inactiveClass\r\n }`\r\n\r\n if (tab.href) {\r\n return (\r\n <a key={tab.label} href={tab.href} className={className}>\r\n {tab.icon}\r\n <span>{tab.label}</span>\r\n </a>\r\n )\r\n }\r\n\r\n return (\r\n <button\r\n key={tab.label}\r\n onClick={tab.onClick}\r\n className={className}\r\n >\r\n {tab.icon}\r\n <span>{tab.label}</span>\r\n </button>\r\n )\r\n })}\r\n </nav>\r\n )\r\n}\r\n\r\nexport default RCNRSubNav\r\n","import type { RCNRFooterProps } from './types'\r\n\r\nfunction RCNRFooter({\r\n toolName,\r\n linkUrl = 'https://rcnr.net',\r\n}: RCNRFooterProps) {\r\n return (\r\n <footer className=\"mt-auto py-4 text-center text-sm text-brand-dark/50\">\r\n <a\r\n href={linkUrl}\r\n className=\"hover:text-brand transition-colors\"\r\n >\r\n {toolName} — Part of the RCNR Teacher Toolbox\r\n </a>\r\n </footer>\r\n )\r\n}\r\n\r\nexport default RCNRFooter\r\n","import { useState, useEffect, useCallback } from 'react'\n\ninterface ReportIssueModalProps {\n isOpen: boolean\n onClose: () => void\n toolName: string\n apiBaseUrl?: string\n userEmail?: string\n}\n\nexport function ReportIssueModal({\n isOpen,\n onClose,\n toolName,\n apiBaseUrl = 'https://api.rcnr.net',\n userEmail,\n}: ReportIssueModalProps) {\n const [description, setDescription] = useState('')\n const [submitting, setSubmitting] = useState(false)\n const [submitted, setSubmitted] = useState(false)\n const [error, setError] = useState('')\n\n const handleClose = useCallback(() => {\n setDescription('')\n setError('')\n setSubmitted(false)\n onClose()\n }, [onClose])\n\n useEffect(() => {\n if (!isOpen) return\n const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') handleClose() }\n document.addEventListener('keydown', onKey)\n return () => document.removeEventListener('keydown', onKey)\n }, [isOpen, handleClose])\n\n if (!isOpen) return null\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n if (!description.trim()) return\n setSubmitting(true)\n setError('')\n try {\n const res = await fetch(`${apiBaseUrl}/api/feedback/report`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ tool_name: toolName, description, user_email: userEmail }),\n })\n if (res.ok) {\n setSubmitted(true)\n setTimeout(handleClose, 2000)\n } else {\n setError('Something went wrong. Please try again.')\n }\n } catch {\n setError('Could not send report. Check your connection.')\n } finally {\n setSubmitting(false)\n }\n }\n\n return (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center p-4\"\n style={{ background: 'rgba(0,12,23,0.85)', backdropFilter: 'blur(6px)' }}\n onClick={handleClose}\n >\n <div\n className=\"relative glass-card rounded-2xl w-full max-w-md p-8\"\n style={{ animation: 'fadeIn 0.15s ease' }}\n onClick={(e) => e.stopPropagation()}\n >\n <button\n onClick={handleClose}\n className=\"absolute top-4 right-4 p-2 text-brand/50 hover:text-brand hover:bg-white/5 rounded-lg transition-colors\"\n aria-label=\"Close\"\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M18 6L6 18M6 6l12 12\" />\n </svg>\n </button>\n\n {submitted ? (\n <div className=\"text-center py-6\">\n <div className=\"w-12 h-12 rounded-full bg-emerald-500/15 flex items-center justify-center mx-auto mb-4\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" className=\"text-emerald-400\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n </div>\n <p className=\"text-white font-semibold\">Report sent. We'll fix it fast.</p>\n </div>\n ) : (\n <>\n <h2 className=\"text-xl font-bold text-white font-serif mb-1\">Report an Issue</h2>\n <p className=\"text-brand/50 text-sm mb-6\">Found a bug or something broken? Let us know.</p>\n\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n <div>\n <label className=\"block text-xs font-semibold text-brand/60 uppercase tracking-wider mb-2\">Tool</label>\n <input\n type=\"text\"\n value={toolName}\n disabled\n className=\"w-full px-4 py-2.5 rounded-xl bg-white/5 border border-brand/10 text-brand/40 text-sm\"\n />\n </div>\n\n <div>\n <label className=\"block text-xs font-semibold text-brand/60 uppercase tracking-wider mb-2\">\n What went wrong?\n </label>\n <textarea\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder=\"Describe the issue...\"\n rows={4}\n required\n className=\"w-full px-4 py-3 rounded-xl bg-white/5 border border-brand/15 text-white placeholder-brand/30 text-sm resize-none focus:outline-none focus:border-brand/40 transition-colors\"\n />\n </div>\n\n {error && <p className=\"text-red-400 text-sm\">{error}</p>}\n\n <button\n type=\"submit\"\n disabled={submitting || !description.trim()}\n className=\"btn-ice w-full py-3 text-sm font-semibold rounded-xl disabled:opacity-40 disabled:cursor-not-allowed\"\n >\n {submitting ? 'Sending...' : 'Submit Report'}\n </button>\n </form>\n </>\n )}\n </div>\n </div>\n )\n}\n","import { useState, useEffect, useCallback } from 'react'\n\ninterface RequestToolModalProps {\n isOpen: boolean\n onClose: () => void\n toolName: string\n apiBaseUrl?: string\n userEmail?: string\n}\n\nexport function RequestToolModal({\n isOpen,\n onClose,\n toolName,\n apiBaseUrl = 'https://api.rcnr.net',\n userEmail,\n}: RequestToolModalProps) {\n const [description, setDescription] = useState('')\n const [submitting, setSubmitting] = useState(false)\n const [submitted, setSubmitted] = useState(false)\n const [error, setError] = useState('')\n\n const handleClose = useCallback(() => {\n setDescription('')\n setError('')\n setSubmitted(false)\n onClose()\n }, [onClose])\n\n useEffect(() => {\n if (!isOpen) return\n const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') handleClose() }\n document.addEventListener('keydown', onKey)\n return () => document.removeEventListener('keydown', onKey)\n }, [isOpen, handleClose])\n\n if (!isOpen) return null\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n if (!description.trim()) return\n setSubmitting(true)\n setError('')\n try {\n const res = await fetch(`${apiBaseUrl}/api/feedback/request`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ tool_name: toolName, description, user_email: userEmail }),\n })\n if (res.ok) {\n setSubmitted(true)\n setTimeout(handleClose, 2000)\n } else {\n setError('Something went wrong. Please try again.')\n }\n } catch {\n setError('Could not send request. Check your connection.')\n } finally {\n setSubmitting(false)\n }\n }\n\n return (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center p-4\"\n style={{ background: 'rgba(0,12,23,0.85)', backdropFilter: 'blur(6px)' }}\n onClick={handleClose}\n >\n <div\n className=\"relative glass-card rounded-2xl w-full max-w-md p-8\"\n style={{ animation: 'fadeIn 0.15s ease' }}\n onClick={(e) => e.stopPropagation()}\n >\n <button\n onClick={handleClose}\n className=\"absolute top-4 right-4 p-2 text-brand/50 hover:text-brand hover:bg-white/5 rounded-lg transition-colors\"\n aria-label=\"Close\"\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M18 6L6 18M6 6l12 12\" />\n </svg>\n </button>\n\n {submitted ? (\n <div className=\"text-center py-6\">\n <div className=\"w-12 h-12 rounded-full bg-brand/10 flex items-center justify-center mx-auto mb-4\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" className=\"text-brand\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n </div>\n <p className=\"text-white font-semibold\">Request received. Thanks!</p>\n </div>\n ) : (\n <>\n <h2 className=\"text-xl font-bold text-white font-serif mb-1\">Request a Tool</h2>\n <p className=\"text-brand/50 text-sm mb-6\">Have an idea for something we should build?</p>\n\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n <div>\n <label className=\"block text-xs font-semibold text-brand/60 uppercase tracking-wider mb-2\">\n Describe what you need\n </label>\n <textarea\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder=\"What problem would this tool solve? What would it do?\"\n rows={5}\n required\n className=\"w-full px-4 py-3 rounded-xl bg-white/5 border border-brand/15 text-white placeholder-brand/30 text-sm resize-none focus:outline-none focus:border-brand/40 transition-colors\"\n />\n </div>\n\n {error && <p className=\"text-red-400 text-sm\">{error}</p>}\n\n <button\n type=\"submit\"\n disabled={submitting || !description.trim()}\n className=\"btn-ice w-full py-3 text-sm font-semibold rounded-xl disabled:opacity-40 disabled:cursor-not-allowed\"\n >\n {submitting ? 'Sending...' : 'Submit Request'}\n </button>\n </form>\n </>\n )}\n </div>\n </div>\n )\n}\n"],"mappings":"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","names":["import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/RCNRMountainLogo.tsx","../src/RCNRHeader.tsx","../src/RCNRSubNav.tsx","../src/RCNRFooter.tsx","../src/ThemeToggle.tsx","../src/ReportIssueModal.tsx","../src/RequestToolModal.tsx"],"sourcesContent":["export { default as RCNRHeader } from './RCNRHeader'\r\nexport { default as RCNRSubNav } from './RCNRSubNav'\r\nexport { default as RCNRFooter } from './RCNRFooter'\r\nexport { default as RCNRMountainLogo } from './RCNRMountainLogo'\r\nexport { default as ThemeToggle } from './ThemeToggle'\r\nexport { ReportIssueModal } from './ReportIssueModal'\r\nexport { RequestToolModal } from './RequestToolModal'\r\n\r\nexport type {\r\n RCNRHeaderProps,\r\n RCNRSubNavProps,\r\n RCNRFooterProps,\r\n} from './types'\r\n","interface RCNRMountainLogoProps {\r\n href?: string\r\n className?: string\r\n}\r\n\r\nfunction RCNRMountainLogo({\r\n href = 'https://teacher.rcnr.net',\r\n className = '',\r\n}: RCNRMountainLogoProps) {\r\n return (\r\n <a\r\n href={href}\r\n className={`flex items-center justify-center w-10 h-10 rounded-lg bg-brand/10 hover:bg-brand/20 transition-colors ${className}`}\r\n style={{ color: 'var(--rcnr-logo-fill)' }}\r\n title=\"Back to Dashboard\"\r\n >\r\n <svg\r\n width=\"28\"\r\n height=\"24\"\r\n viewBox=\"0 0 120 100\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M10,90l26.48-39.76h.31s4.54,5.02,4.54,5.02l.32-.16,23.06-37.14,17.34,28.63,3.65-4.61,30.22,48.03h-8.43c-7.17-12.26-15.51-24.35-23.06-36.26-1.43.52-2.03,3.6-3.49,3.97l-16.31-25.93-21.87,34.36-5.09-5.01-19.48,28.87h-8.19Z\"\r\n fill=\"currentColor\"\r\n />\r\n <path\r\n d=\"M89.84,90h-5.73c-6.34-8.18-12.93-16.89-19.64-24.65-6.66,8.19-13.04,16.6-19.89,24.65h-5.81l25.69-39.76,25.37,39.76Z\"\r\n fill=\"currentColor\"\r\n />\r\n </svg>\r\n </a>\r\n )\r\n}\r\n\r\nexport default RCNRMountainLogo\r\n","import type { ReactNode } from 'react'\r\nimport type { RCNRHeaderProps } from './types'\r\nimport RCNRMountainLogo from './RCNRMountainLogo'\r\n\r\nfunction NavButton({\r\n onClick,\r\n icon,\r\n label,\r\n title,\r\n}: {\r\n onClick: () => void\r\n icon: ReactNode\r\n label: string\r\n title?: string\r\n}) {\r\n return (\r\n <button\r\n onClick={onClick}\r\n className=\"flex items-center gap-2 px-3 py-2 text-brand/70 hover:text-brand hover:bg-brand/5 rounded-lg transition-colors\"\r\n title={title ?? label}\r\n >\r\n {icon}\r\n <span className=\"hidden md:inline text-sm\">{label}</span>\r\n </button>\r\n )\r\n}\r\n\r\nconst defaultReportIssue = () =>\r\n window.open('mailto:support@rcnr.net?subject=Bug%20Report', '_blank')\r\n\r\nconst defaultRequestTool = () =>\r\n window.open('mailto:support@rcnr.net?subject=Feature%20Request', '_blank')\r\n\r\nfunction RCNRHeader({\r\n toolName,\r\n dashboardUrl = 'https://teacher.rcnr.net',\r\n extraNavItems,\r\n userAvatar,\r\n onHowItWorks,\r\n onReportIssue = defaultReportIssue,\r\n onRequestTool = defaultRequestTool,\r\n}: RCNRHeaderProps) {\r\n return (\r\n <header className=\"glass-card border-b border-brand/15 px-6 py-4\">\r\n <div className=\"flex items-center justify-between\">\r\n {/* Left: Logo + Tool Name */}\r\n <div className=\"flex items-center gap-4\">\r\n <RCNRMountainLogo href={dashboardUrl} />\r\n <span className=\"text-xl font-serif text-brand\">{toolName}</span>\r\n </div>\r\n\r\n {/* Right: Nav Actions */}\r\n <div className=\"flex items-center gap-2\">\r\n {/* Tool-specific nav items first */}\r\n {extraNavItems?.map((item) => (\r\n <NavButton\r\n key={item.label}\r\n onClick={item.onClick}\r\n icon={item.icon}\r\n label={item.label}\r\n />\r\n ))}\r\n\r\n {/* Standard nav items in fixed order */}\r\n {onHowItWorks && (\r\n <NavButton\r\n onClick={onHowItWorks}\r\n label=\"How It Works\"\r\n icon={\r\n <svg\r\n className=\"w-[18px] h-[18px]\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n strokeWidth={2}\r\n >\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n d=\"M9.09 9a3 3 0 015.83 1c0 2-3 3-3 3\"\r\n />\r\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\r\n </svg>\r\n }\r\n />\r\n )}\r\n\r\n <NavButton\r\n onClick={onReportIssue}\r\n label=\"Report Issue\"\r\n icon={\r\n <svg\r\n className=\"w-[18px] h-[18px]\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n strokeWidth={2}\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\r\n />\r\n </svg>\r\n }\r\n />\r\n\r\n <NavButton\r\n onClick={onRequestTool}\r\n label=\"Request Tool\"\r\n icon={\r\n <svg\r\n className=\"w-[18px] h-[18px]\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n strokeWidth={2}\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n d=\"M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z\"\r\n />\r\n </svg>\r\n }\r\n />\r\n\r\n {userAvatar}\r\n </div>\r\n </div>\r\n </header>\r\n )\r\n}\r\n\r\nexport default RCNRHeader\r\n","import type { RCNRSubNavProps } from './types'\r\n\r\nfunction RCNRSubNav({ tabs }: RCNRSubNavProps) {\r\n return (\r\n <nav className=\"flex items-center gap-1 px-6 py-2 border-b border-brand/10 bg-surface/50\">\r\n {tabs.map((tab) => {\r\n const isWarning = tab.variant === 'warning'\r\n const activeClass = isWarning\r\n ? 'bg-warning/10 text-warning border border-warning/20'\r\n : 'bg-brand/15 text-brand'\r\n const inactiveClass = isWarning\r\n ? 'text-warning/70 hover:text-warning hover:bg-warning/5 border border-warning/10'\r\n : 'text-brand/50 hover:text-brand hover:bg-brand/5'\r\n\r\n const className = `flex items-center gap-2 px-4 py-2 rounded-lg text-sm transition-colors ${\r\n tab.active ? activeClass : inactiveClass\r\n }`\r\n\r\n if (tab.href) {\r\n return (\r\n <a key={tab.label} href={tab.href} className={className}>\r\n {tab.icon}\r\n <span>{tab.label}</span>\r\n </a>\r\n )\r\n }\r\n\r\n return (\r\n <button\r\n key={tab.label}\r\n onClick={tab.onClick}\r\n className={className}\r\n >\r\n {tab.icon}\r\n <span>{tab.label}</span>\r\n </button>\r\n )\r\n })}\r\n </nav>\r\n )\r\n}\r\n\r\nexport default RCNRSubNav\r\n","import type { RCNRFooterProps } from './types'\r\n\r\nfunction RCNRFooter({\r\n toolName,\r\n linkUrl = 'https://rcnr.net',\r\n}: RCNRFooterProps) {\r\n return (\r\n <footer className=\"mt-auto py-4 text-center text-sm text-brand-dark/50\">\r\n <a\r\n href={linkUrl}\r\n className=\"hover:text-brand transition-colors\"\r\n >\r\n {toolName} — Part of the RCNR Teacher Toolbox\r\n </a>\r\n </footer>\r\n )\r\n}\r\n\r\nexport default RCNRFooter\r\n","import { useEffect, useState } from 'react'\r\nimport { Sun, Moon } from 'lucide-react'\r\n\r\ntype Theme = 'light' | 'dark'\r\n\r\nconst STORAGE_KEY = 'rcnr-theme'\r\n\r\nfunction getInitialTheme(): Theme {\r\n if (typeof window === 'undefined') return 'dark'\r\n const stored = localStorage.getItem(STORAGE_KEY)\r\n if (stored === 'light' || stored === 'dark') return stored\r\n return 'dark'\r\n}\r\n\r\nexport default function ThemeToggle() {\r\n const [theme, setTheme] = useState<Theme>(getInitialTheme)\r\n\r\n useEffect(() => {\r\n document.documentElement.setAttribute('data-theme', theme)\r\n localStorage.setItem(STORAGE_KEY, theme)\r\n }, [theme])\r\n\r\n const toggle = () => setTheme(prev => (prev === 'dark' ? 'light' : 'dark'))\r\n\r\n return (\r\n <button\r\n onClick={toggle}\r\n aria-label={`Switch to ${theme === 'dark' ? 'light' : 'dark'} mode`}\r\n style={{\r\n background: 'transparent',\r\n border: 'none',\r\n cursor: 'pointer',\r\n padding: '6px',\r\n borderRadius: '6px',\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n color: 'var(--rcnr-text2, #6888aa)',\r\n transition: 'color 0.2s ease',\r\n }}\r\n >\r\n {theme === 'dark' ? <Sun size={18} /> : <Moon size={18} />}\r\n </button>\r\n )\r\n}\r\n","import { useState, useEffect, useCallback } from 'react'\n\ninterface ReportIssueModalProps {\n isOpen: boolean\n onClose: () => void\n toolName: string\n apiBaseUrl?: string\n userEmail?: string\n}\n\nexport function ReportIssueModal({\n isOpen,\n onClose,\n toolName,\n apiBaseUrl = 'https://api.rcnr.net',\n userEmail,\n}: ReportIssueModalProps) {\n const [description, setDescription] = useState('')\n const [submitting, setSubmitting] = useState(false)\n const [submitted, setSubmitted] = useState(false)\n const [error, setError] = useState('')\n\n const handleClose = useCallback(() => {\n setDescription('')\n setError('')\n setSubmitted(false)\n onClose()\n }, [onClose])\n\n useEffect(() => {\n if (!isOpen) return\n const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') handleClose() }\n document.addEventListener('keydown', onKey)\n return () => document.removeEventListener('keydown', onKey)\n }, [isOpen, handleClose])\n\n if (!isOpen) return null\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n if (!description.trim()) return\n setSubmitting(true)\n setError('')\n try {\n const res = await fetch(`${apiBaseUrl}/api/feedback/report`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ tool_name: toolName, description, user_email: userEmail }),\n })\n if (res.ok) {\n setSubmitted(true)\n setTimeout(handleClose, 2000)\n } else {\n setError('Something went wrong. Please try again.')\n }\n } catch {\n setError('Could not send report. Check your connection.')\n } finally {\n setSubmitting(false)\n }\n }\n\n return (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center p-4\"\n style={{ background: 'var(--rcnr-overlay)', backdropFilter: 'blur(6px)' }}\n onClick={handleClose}\n >\n <div\n className=\"relative glass-card rounded-2xl w-full max-w-md p-8\"\n style={{ animation: 'fadeIn 0.15s ease' }}\n onClick={(e) => e.stopPropagation()}\n >\n <button\n onClick={handleClose}\n className=\"absolute top-4 right-4 p-2 rounded-lg transition-colors\"\n style={{ color: 'var(--rcnr-text3)' }}\n onMouseOver={(e) => { e.currentTarget.style.color = 'var(--rcnr-text)'; e.currentTarget.style.background = 'var(--rcnr-surface2)' }}\n onMouseOut={(e) => { e.currentTarget.style.color = 'var(--rcnr-text3)'; e.currentTarget.style.background = 'transparent' }}\n aria-label=\"Close\"\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M18 6L6 18M6 6l12 12\" />\n </svg>\n </button>\n\n {submitted ? (\n <div className=\"text-center py-6\">\n <div className=\"w-12 h-12 rounded-full bg-emerald-500/15 flex items-center justify-center mx-auto mb-4\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" className=\"text-emerald-400\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n </div>\n <p className=\"font-semibold\" style={{ color: 'var(--rcnr-text)' }}>Report sent. We'll fix it fast.</p>\n </div>\n ) : (\n <>\n <h2 className=\"text-xl font-bold font-serif mb-1\" style={{ color: 'var(--rcnr-text)' }}>Report an Issue</h2>\n <p className=\"text-sm mb-6\" style={{ color: 'var(--rcnr-text3)' }}>Found a bug or something broken? Let us know.</p>\n\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n <div>\n <label className=\"block text-xs font-semibold uppercase tracking-wider mb-2\" style={{ color: 'var(--rcnr-text3)' }}>Tool</label>\n <input\n type=\"text\"\n value={toolName}\n disabled\n className=\"w-full px-4 py-2.5 rounded-xl text-sm\"\n style={{ background: 'var(--rcnr-surface2)', border: '1px solid var(--rcnr-border)', color: 'var(--rcnr-text3)' }}\n />\n </div>\n\n <div>\n <label className=\"block text-xs font-semibold uppercase tracking-wider mb-2\" style={{ color: 'var(--rcnr-text3)' }}>\n What went wrong?\n </label>\n <textarea\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder=\"Describe the issue...\"\n rows={4}\n required\n className=\"rcnr-input resize-none\"\n style={{ paddingLeft: '1rem' }}\n />\n </div>\n\n {error && <p className=\"text-red-400 text-sm\">{error}</p>}\n\n <button\n type=\"submit\"\n disabled={submitting || !description.trim()}\n className=\"btn-ice w-full py-3 text-sm font-semibold rounded-xl disabled:opacity-40 disabled:cursor-not-allowed\"\n >\n {submitting ? 'Sending...' : 'Submit Report'}\n </button>\n </form>\n </>\n )}\n </div>\n </div>\n )\n}\n","import { useState, useEffect, useCallback } from 'react'\n\ninterface RequestToolModalProps {\n isOpen: boolean\n onClose: () => void\n toolName: string\n apiBaseUrl?: string\n userEmail?: string\n}\n\nexport function RequestToolModal({\n isOpen,\n onClose,\n toolName,\n apiBaseUrl = 'https://api.rcnr.net',\n userEmail,\n}: RequestToolModalProps) {\n const [description, setDescription] = useState('')\n const [submitting, setSubmitting] = useState(false)\n const [submitted, setSubmitted] = useState(false)\n const [error, setError] = useState('')\n\n const handleClose = useCallback(() => {\n setDescription('')\n setError('')\n setSubmitted(false)\n onClose()\n }, [onClose])\n\n useEffect(() => {\n if (!isOpen) return\n const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') handleClose() }\n document.addEventListener('keydown', onKey)\n return () => document.removeEventListener('keydown', onKey)\n }, [isOpen, handleClose])\n\n if (!isOpen) return null\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n if (!description.trim()) return\n setSubmitting(true)\n setError('')\n try {\n const res = await fetch(`${apiBaseUrl}/api/feedback/request`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ tool_name: toolName, description, user_email: userEmail }),\n })\n if (res.ok) {\n setSubmitted(true)\n setTimeout(handleClose, 2000)\n } else {\n setError('Something went wrong. Please try again.')\n }\n } catch {\n setError('Could not send request. Check your connection.')\n } finally {\n setSubmitting(false)\n }\n }\n\n return (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center p-4\"\n style={{ background: 'var(--rcnr-overlay)', backdropFilter: 'blur(6px)' }}\n onClick={handleClose}\n >\n <div\n className=\"relative glass-card rounded-2xl w-full max-w-md p-8\"\n style={{ animation: 'fadeIn 0.15s ease' }}\n onClick={(e) => e.stopPropagation()}\n >\n <button\n onClick={handleClose}\n className=\"absolute top-4 right-4 p-2 rounded-lg transition-colors\"\n style={{ color: 'var(--rcnr-text3)' }}\n onMouseOver={(e) => { e.currentTarget.style.color = 'var(--rcnr-text)'; e.currentTarget.style.background = 'var(--rcnr-surface2)' }}\n onMouseOut={(e) => { e.currentTarget.style.color = 'var(--rcnr-text3)'; e.currentTarget.style.background = 'transparent' }}\n aria-label=\"Close\"\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M18 6L6 18M6 6l12 12\" />\n </svg>\n </button>\n\n {submitted ? (\n <div className=\"text-center py-6\">\n <div className=\"w-12 h-12 rounded-full bg-brand/10 flex items-center justify-center mx-auto mb-4\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" className=\"text-brand\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n </div>\n <p className=\"font-semibold\" style={{ color: 'var(--rcnr-text)' }}>Request received. Thanks!</p>\n </div>\n ) : (\n <>\n <h2 className=\"text-xl font-bold font-serif mb-1\" style={{ color: 'var(--rcnr-text)' }}>Request a Tool</h2>\n <p className=\"text-sm mb-6\" style={{ color: 'var(--rcnr-text3)' }}>Have an idea for something we should build?</p>\n\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n <div>\n <label className=\"block text-xs font-semibold uppercase tracking-wider mb-2\" style={{ color: 'var(--rcnr-text3)' }}>\n Describe what you need\n </label>\n <textarea\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder=\"What problem would this tool solve? What would it do?\"\n rows={5}\n required\n className=\"rcnr-input resize-none\"\n style={{ paddingLeft: '1rem' }}\n />\n </div>\n\n {error && <p className=\"text-red-400 text-sm\">{error}</p>}\n\n <button\n type=\"submit\"\n disabled={submitting || !description.trim()}\n className=\"btn-ice w-full py-3 text-sm font-semibold rounded-xl disabled:opacity-40 disabled:cursor-not-allowed\"\n >\n {submitting ? 'Sending...' : 'Submit Request'}\n </button>\n </form>\n </>\n )}\n </div>\n </div>\n )\n}\n"],"mappings":"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","names":["import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime"]}
|