@rcnr/theme 4.0.0 → 4.0.2

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.js CHANGED
@@ -109,7 +109,7 @@ function RCNRHeader({
109
109
  return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("header", { className: "glass-card border-b border-brand/15 px-6 py-4", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center justify-between", children: [
110
110
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-4", children: [
111
111
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(RCNRMountainLogo_default, { href: dashboardUrl }),
112
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-xl font-serif text-brand", children: toolName })
112
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-xl font-serif", style: { color: "var(--rcnr-logo-fill)" }, children: toolName })
113
113
  ] }),
114
114
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-2", children: [
115
115
  extraNavItems?.map((item) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
@@ -265,6 +265,7 @@ function getInitialTheme() {
265
265
  if (typeof window === "undefined") return "dark";
266
266
  const stored = localStorage.getItem(STORAGE_KEY);
267
267
  if (stored === "light" || stored === "dark") return stored;
268
+ if (window.matchMedia("(prefers-color-scheme: light)").matches) return "light";
268
269
  return "dark";
269
270
  }
270
271
  function ThemeToggle() {
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/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"]}
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\" style={{ color: 'var(--rcnr-logo-fill)' }}>{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 // Default to system preference\r\n if (window.matchMedia('(prefers-color-scheme: light)').matches) return 'light'\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"]}
package/dist/index.mjs CHANGED
@@ -77,7 +77,7 @@ function RCNRHeader({
77
77
  return /* @__PURE__ */ jsx2("header", { className: "glass-card border-b border-brand/15 px-6 py-4", children: /* @__PURE__ */ jsxs2("div", { className: "flex items-center justify-between", children: [
78
78
  /* @__PURE__ */ jsxs2("div", { className: "flex items-center gap-4", children: [
79
79
  /* @__PURE__ */ jsx2(RCNRMountainLogo_default, { href: dashboardUrl }),
80
- /* @__PURE__ */ jsx2("span", { className: "text-xl font-serif text-brand", children: toolName })
80
+ /* @__PURE__ */ jsx2("span", { className: "text-xl font-serif", style: { color: "var(--rcnr-logo-fill)" }, children: toolName })
81
81
  ] }),
82
82
  /* @__PURE__ */ jsxs2("div", { className: "flex items-center gap-2", children: [
83
83
  extraNavItems?.map((item) => /* @__PURE__ */ jsx2(
@@ -233,6 +233,7 @@ function getInitialTheme() {
233
233
  if (typeof window === "undefined") return "dark";
234
234
  const stored = localStorage.getItem(STORAGE_KEY);
235
235
  if (stored === "light" || stored === "dark") return stored;
236
+ if (window.matchMedia("(prefers-color-scheme: light)").matches) return "light";
236
237
  return "dark";
237
238
  }
238
239
  function ThemeToggle() {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/RCNRMountainLogo.tsx","../src/RCNRHeader.tsx","../src/RCNRSubNav.tsx","../src/RCNRFooter.tsx","../src/ThemeToggle.tsx","../src/ReportIssueModal.tsx","../src/RequestToolModal.tsx"],"sourcesContent":["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":["jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","useState","useEffect","jsx","jsxs","useState","useEffect","useCallback","Fragment","jsx","jsxs"]}
1
+ {"version":3,"sources":["../src/RCNRMountainLogo.tsx","../src/RCNRHeader.tsx","../src/RCNRSubNav.tsx","../src/RCNRFooter.tsx","../src/ThemeToggle.tsx","../src/ReportIssueModal.tsx","../src/RequestToolModal.tsx"],"sourcesContent":["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\" style={{ color: 'var(--rcnr-logo-fill)' }}>{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 // Default to system preference\r\n if (window.matchMedia('(prefers-color-scheme: light)').matches) return 'light'\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":["jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","useState","useEffect","jsx","jsxs","useState","useEffect","useCallback","Fragment","jsx","jsxs"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rcnr/theme",
3
- "version": "4.0.0",
3
+ "version": "4.0.2",
4
4
  "description": "RCNR design system: CSS tokens, shared React components (header, footer, subnav), glass cards, buttons, grid",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",