Spaces:
Running
Running
Commit History
-
fix(ui): close the gap above the project name Running
Reported 2026-09-15 with a screenshot. The row that carries the expand button was rendered at all times so that toggling the sidebar would not shift the page. With the sidebar open it had nothing in it, which left an empty strip above the project name and set the heading a few pixels below the logo across the divider, where the eye reads them as a pair. It renders only while the sidebar is collapsed now, and the main pane's top padding is 7px rather than 12px, which puts the project name on exactly the same line as the logo (measured: 5px out before, 0 now). The cost is that toggling shifts the content by one row, which is the cheaper of the two.cdc4d17
-
feat(ui): account chip and menu at the foot of the sidebar
Asked for with ChatGPT's sidebar as the reference (2026-09-15). When the banner came off, its contents landed in the sidebar as a loose row of links with the account beside them. They now hang off one chip: avatar, name, and the kind of account, opening upward into About, Guide, the lab-only pages, the admin link, and sign in or out. The line under the name is ChatGPT's plan slot; ours says lab member, external user, maintainer or PI, which is what actually changes what you can do here. Signed out it reads "Not signed in / Sign in to keep your work", so the chip still makes the case the old Sign in button did. Escape closes the menu and stops there, deliberately: the drawer also closes on Escape, and one key dismissing both would leave a phone user staring at a workspace they did not ask for. Verified at 1280 and 390 px, signed in and out: the menu opens upward, stays inside the viewport, closes on Escape and on an outside click, and the drawer stays open underneath.ecf3b3a -
feat(ui): drop the dark banner; the sidebar is the chrome now
"Every modern website doesn't have an explicit header these days, ours looks old school" (2026-09-15). The banner sat on every screen, carried the product's full name, and cost vertical space on a phone to say something the landing page already says. The dashboard now has no top chrome at all, the way ChatGPT and Claude have none: the sidebar holds the logo, the guides, the admin link and the account, and the content area starts at the content. The landing page and /admin have no sidebar, so they keep a bar, but a light and quiet one with no tagline. The three static doc pages get the same treatment, and their inline logo strokes with currentColor, which is what lets one mark serve both their light and dark themes. Two things this forced, both right anyway. The dashboard became a real app shell (100vh, each pane scrolling inside it): stretched by a long page, the sidebar's account row and New project button had drifted to the bottom of the document instead of sitting at the bottom of…3967e32 -
feat(ui): the project sidebar closes, and is a drawer on phones
Asked for 2026-09-15: closable like ChatGPT or Claude. A panel button at the left of the header hides and shows it, aria-expanded and all, and the choice is remembered. It only renders where a sidebar exists, so not on the landing page and not on /admin. Wide screens: the sidebar slides out of the flex row on a negative margin rather than animating to width 0, so nothing inside it reflows on the way out and the workspace takes the space. Content sitting off-screen to the LEFT adds no page scroll, which a width animation on the inner content would have risked. Phones: it becomes a drawer over the workspace and starts closed regardless of the remembered choice. It used to be a full-width block stacked ABOVE the workspace, so every phone visit began by scrolling past the project list to reach the analysis. Three ways out, because the drawer covers the header's own toggle: tapping a project (you picked it to look at it), tapping the backdrop, or Escape. Crossing from wide to narrow close…e360d80
-
feat(ui): "Cite this platform" in the landing-page footer
Ali Hajian, 2026-09-09: somewhere inconspicuous to get a citation, the way Google Scholar's Cite button works. The footer of the landing page is that place - there for anyone writing a paper, invisible to anyone who is not. The dialog mirrors Scholar's panel in this app's language: five styles, each row a copy button, then BibTeX and RIS for reference managers. Under the styles it names the two CCR papers, because results from here rest on them and a methods section needs all three. Every string comes from GET /api/citation, so the component formats nothing. Two things measured rather than assumed. The clipboard: it needs a secure context and a focused document, so a failure selects the reference instead and says which keys to press, rather than leaving the click doing nothing. And the phone rules had to move BELOW the base .cite-* rules instead of joining the 700px block above them: same specificity, last one in the file wins, and from up there they silently lost (the row kept a 74p…61bbb51
-
fix(ui): show the site identity footer on the welcome view only
The footer rendered on every view. It now renders only on the public welcome/landing page, so the dashboard and results views are uncluttered. Site identity for scanners already lives in the served HTML (da069b3).59b268b
-
fix(site): put lab identity into the served HTML, not just the JS bundle
The SPA served a 506-byte shell: a title, a script tag, and an empty root div. Every word identifying the lab lived in WelcomePage.jsx, which a crawler never executes. A scanner therefore saw a newly registered domain offering Google sign-in and file upload with no statement of who runs it, which reads as a deceptive-site fingerprint and contributed to a Safe Browsing flag. - frontend/index.html: meta description, Open Graph tags, and a <noscript> block naming the lab, the institution, the PI, contact, and source repo. - App.jsx: a site footer on every page carrying the same identity. - styles.css: .site-footer, plain text by design so it stays readable to clients that do not run the bundle. Served HTML goes from 506 to 2026 bytes.da069b3
-
feat(guide): public how-to guide + live AI model details
Split the guides so the public gets a plain how-to page and the lab keeps its click-through testing guide: - /guide now serves a new public how-to guide (public_guide.html): the upload -> construct -> run -> export flow, the four ways to add a construct (library, typed, uploaded, AI drafting), a models table, and a reproducibility section covering the results CSV, run metadata, and the offline reproduction script. - /testing serves the original testing guide, gated to lab and above (same gate as /product); the 403 explainer points to the public guide. Header shows a lab-only Testing link. - Landing page links the PI's name (Mohammad Atari) to mohammadatari.com. - AI construct path shows "Drafted by <model>" with a hover/focus info bubble (model, provider, prompt version, item rules, daily cap). Model identity is read live from the API: new item_generation.public_info() surfaced as a `generation` block on /api/auth/me, so the tooltip and guide never hardcode a model that…8586c1b
-
feat: put invite links on hold; single brand header everywhere
Invite links are dormant behind CCR_INVITES_ENABLED (default off): creation 409s, existing tokens stop redeeming with a clear message, /admin hides the section. Pre-assigned roles remain the onboarding path; machinery and audit history stay intact for re-enabling. Header: the CCR logo (which already reads 'CCR') stands alone with the tagline 'Psychological Text Analysis with Contextualized Construct Representation' - app, guide, and product topbars now identical.6a6c7cf -
feat: CAML lab branding - CCR logo, ink+teal theme, favicon, attribution
Palette derived from the lab's CCR logo: ink (#151515) header bars with the white logo variant, darkened logo teal (#26736f) for links/buttons (AA on white), pure logo teal (#339B98) for data fills. Correlation matrix now diverges teal (positive) vs copper (negative). Applied across the React app, guide, and product pages with 'Culture & Morality Lab, UMass Amherst' attribution.4e87534
-
refactor: enhance AdminPage overview display and improve navigation
- Added a Stat component to better visualize user statistics on the AdminPage. - Updated the overview section to use the new Stat component for a cleaner layout. - Improved the header navigation in App component for better user experience. - Changed the brand header to a link for easier navigation back to the dashboard. - Enhanced styling for header elements and added hover effects for links. - Updated empty state messaging and layout in the App component for clarity. - Refined CSS styles for better visual consistency and responsiveness.54bd1cf -
feat: add welcome page for first-time users and update routing
- Introduced a new WelcomePage component to guide first-time visitors through the platform's features and usage. - Updated App component to conditionally render the WelcomePage based on user navigation and localStorage state. - Modified test cases to include the new /welcome route. - Updated styles to accommodate the new welcome page layout and design. - Changed asset references in index.html for updated frontend build.8ed8f32 -
Four-tier access model: self-governing admin, pre-login access, audit trail
PI decisions 2026-07-22: - Roles: pi | maintainer | lab | external (legacy "member" reads as external). Lab members and above: unlimited saved runs. - PI role holds escalation rights in-app (grant/revoke staff, act on staff accounts, audit view); ADMIN_EMAILS is bootstrap + break-glass only. Maintainers get the operational surface. Nobody can change their own role. - Construct verification is maintainer-only (the RA's job); PI/admin keep a read-only queue. - Access before sign-in: email-bound pre-assigned roles (staff-capable, claimed on first password/Google sign-in) and signed 7-day invite links (lab/external only, ?invite= signup flow). - Append-only admin_audit table records every admin action; visible to PI/env admins. - Docs split: /guide = navigate-and-test; new /product page = access model + capability matrix + architecture (moved from guide).bfb6467
-
Admin page v1: user roles (lab tier), password resets, failed-run requeue, verification queue
Synced from lab mainline. /admin gated by ADMIN_EMAILS env allowlist. Lab-role accounts get unlimited saved runs (replaces the global env hack). 72 tests passing.b633038
-
Sync platform from lab mainline: dev instance ready to deploy
Full feature set: accounts (email/password + feature-flagged Google via Supabase PKCE), anonymous tiers (3 runs/day, delete-after-analysis, 24h purge), saved-run cap, construct upload from CSV/XLSX, structured warnings + language detection, model registry (MiniLM/E5), per-run reproduction scripts, corpus-embedding cache, storage interface (local/ R2), sample-data test kit, MANUAL_TESTING.md. Rights guard: only the 5 original seed constructs ship in this public repo; the imported lab collection stays out pending the redistribution decision. HF remote URL detokenized. 64 tests passing.4b09d2d
-
CCR Platform: web platform for Contextualized Construct Representations
Upload a corpus, select or define a validated psychological construct, run CCR analysis with locally-hosted sentence embeddings, inspect per-item loadings and score distributions, export results with a reproducibility record. - FastAPI backend, SQLite, worker-queue jobs with orphan recovery - React dashboard (prebuilt; no Node needed to run) - Tolerant corpus ingestion (encodings, delimiters, caps, warnings) - Seeded construct library with citations; custom constructs - 17 tests via a deterministic embedding backend (no ML deps needed) - Docker deploy for Hugging Face Spaces / Cloud Rund69ace5