diff --git a/CHANGELOG.md b/CHANGELOG.md
index f98b55b..518c192 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,37 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
+## [1.1.5] - 2026-02-09
+
+### Added
+
+- Class-aware state foundations: `Classroom` model support, class utilities (`lib/classes.ts`), and class-focused storage/test coverage.
+- Shared `ClassSelector` component for class selection across students, generator, play, breakout rooms, and projects.
+- Unified quiz editor test coverage for form + import workflows (`components/quizzes/__tests__/quiz-editor-form.test.tsx`).
+- Shared select wrapper tests for popup alignment defaults (`components/ui/__tests__/select.test.tsx`).
+
+### Changed
+
+- Student workflow expanded to class-first management: create/select classes, import full class rosters, and manage students in the active class.
+- Generator, quiz play, breakout groups, and project lists now run with active-class scoping.
+- Quiz editing/import flow consolidated into `QuizEditorForm`; legacy `quiz-import-card` removed.
+- Quiz question list card behavior refined for better overflow/height handling.
+- Shared `SelectContent` now defaults to popper-style content-fit behavior and supports explicit trigger-aligned positioning via `alignItemWithTrigger={true}` where needed.
+- App version updated to `1.1.5` in `package.json`.
+- Sidebar version label now reads version dynamically from `package.json` via server layout prop wiring.
+- Dependency/version refresh from the `main..HEAD` baseline commits (including `package.json` and `bun.lock` updates from `e9d61c2`).
+
+### Tests
+
+- Expanded reducer/storage/type-guard coverage for class-aware persistence and migration paths.
+- Added class utility tests (`lib/__tests__/classes.test.ts`) and updated student/reducer expectations.
+- Added select alignment behavior tests in `components/ui/__tests__/select.test.tsx`.
+
+### Documentation
+
+- Updated README and project docs for class-scoped workflows and unified quiz editing/import.
+- Updated component docs to describe select popup auto-sizing defaults and trigger-alignment override.
+
## [1.1.4] - 2026-02-05
### Changed
diff --git a/app/breakout-rooms/page.tsx b/app/breakout-rooms/page.tsx
index 2b2ac2f..c317ad4 100644
--- a/app/breakout-rooms/page.tsx
+++ b/app/breakout-rooms/page.tsx
@@ -14,7 +14,7 @@ export const metadata: Metadata = {
*/
export default function Page() {
return (
-
+
);
diff --git a/app/generator/page.tsx b/app/generator/page.tsx
index 0263e42..b2bbe4c 100644
--- a/app/generator/page.tsx
+++ b/app/generator/page.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import { Metadata } from 'next';
import GeneratorCard from '@/components/generator/generator-card';
@@ -15,7 +17,7 @@ export const metadata: Metadata = {
*/
export default function Page() {
return (
-
+
} />
);
diff --git a/app/layout.tsx b/app/layout.tsx
index 40f8491..28c4285 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -1,8 +1,10 @@
import type { Metadata } from 'next';
import { Geist, Geist_Mono } from 'next/font/google';
+import { cookies } from 'next/headers';
import './globals.css';
+import packageJson from '@/package.json';
import AppShell from '@/components/app-shell';
import Footer from '@/components/footer';
@@ -57,11 +59,20 @@ export const metadata: Metadata = {
* Renders the shared HTML shell and providers for all application routes.
* Wrap page content in this layout so theme, state, sidebar, and footer stay consistent.
*/
-export default function RootLayout({
+export default async function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
+ const appVersion = packageJson.version;
+ const cookieStore = await cookies();
+ const sidebarCookieValue =
+ cookieStore.get('teacherbuddy_sidebar_state')?.value ??
+ cookieStore.get('sidebar_state')?.value ??
+ cookieStore.get('teacherbuddy:sidebar_state')?.value;
+ const defaultSidebarOpen =
+ sidebarCookieValue === undefined ? true : sidebarCookieValue === 'true';
+
return (
@@ -91,7 +102,12 @@ export default function RootLayout({
className={`${geistSans.variable} ${geistMono.variable} antialiased`}>
- }>{children}
+ }>
+ {children}
+
diff --git a/app/play/page.tsx b/app/play/page.tsx
index d146b70..b28287a 100644
--- a/app/play/page.tsx
+++ b/app/play/page.tsx
@@ -14,7 +14,7 @@ export const metadata: Metadata = {
*/
export default function Page() {
return (
-
);
}
diff --git a/app/quizzes/page.tsx b/app/quizzes/page.tsx
index 43197d2..7c9fa91 100644
--- a/app/quizzes/page.tsx
+++ b/app/quizzes/page.tsx
@@ -13,9 +13,5 @@ export const metadata: Metadata = {
* Provides the editor workflow with a skeleton shown before hydration.
*/
export default function Page() {
- return (
-
- } />
-
- );
+ return } />;
}
diff --git a/components/app-shell.tsx b/components/app-shell.tsx
index acda6d1..088bc76 100644
--- a/components/app-shell.tsx
+++ b/components/app-shell.tsx
@@ -30,11 +30,17 @@ import Header from './header';
/**
* Global app shell that renders the sidebar, header, and page content.
* Styled to match the design-6 command center aesthetic with phase-colored navigation.
+ * Provide `appVersion` from server layout so the sidebar version stays in sync with package metadata.
+ * Provide `defaultSidebarOpen` from server cookie state so refreshes preserve sidebar preference.
*/
export default function AppShell({
+ appVersion,
+ defaultSidebarOpen,
children,
footer,
}: {
+ appVersion: string;
+ defaultSidebarOpen: boolean;
children: React.ReactNode;
footer?: React.ReactNode;
}) {
@@ -46,7 +52,7 @@ export default function AppShell({
};
return (
-
+
@@ -86,7 +92,7 @@ export default function AppShell({