diff --git a/CHANGELOG.md b/CHANGELOG.md index a9cb0da..f98b55b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,10 +7,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [1.1.4] - 2026-02-05 + ### Changed - Rethought Data Security +### Documentation + +- Version bumped to 1.1.4 in `package.json` and sidebar (AppShell). +- Root layout: documented PrivacyNotice, Toaster (sonner), metadata (title template, OG, Twitter), and ld+json WebApplication schema in layout and routes docs. +- Route pages: documented inline `metadata` export and `skeleton` prop pattern for feature components (StudentForm, QuizEditor, QuizPlayCard, GeneratorCard). +- Components: added PrivacyNotice and Toaster to layout section; Toaster (sonner) to UI primitives; sonner to dependencies. +- Structure: added `privacy-notice.tsx`, `robots.ts`, `sitemap.ts`, and Sonner/Toaster in folder structure and key files. +- Routes: updated App Layout and Route Metadata to reflect current layout content and route-level metadata; Route Components updated for skeleton prop usage. + ## [1.1.3] - 2026-02-05 ### Added diff --git a/app/breakout-rooms/page.tsx b/app/breakout-rooms/page.tsx index e0331b1..2b2ac2f 100644 --- a/app/breakout-rooms/page.tsx +++ b/app/breakout-rooms/page.tsx @@ -2,34 +2,10 @@ import { Metadata } from 'next'; import BreakoutGroupsCard from '@/components/breakout/breakout-groups-card'; -/** - * Builds SEO metadata for the breakout room generator route. - */ export const metadata: Metadata = { - title: 'Breakout Rooms | TeacherBuddy', - description: 'Create randomized student groups for breakout sessions.', - openGraph: { - title: 'Breakout Rooms | TeacherBuddy', - description: 'Create randomized student groups for breakout sessions.', - siteName: 'TeacherBuddy', - images: [ - { - url: 'https://teacherbuddy.mrbubbles-src.dev/api/og', - width: 1200, - height: 630, - alt: 'TeacherBuddy Logo', - }, - ], - type: 'website', - locale: 'en_GB', - }, - twitter: { - card: 'summary_large_image', - title: 'Breakout Rooms | TeacherBuddy', - description: 'Create randomized student groups for breakout sessions.', - images: ['https://teacherbuddy.mrbubbles-src.dev/api/og'], - creator: '@_MstrBubbles', - }, + title: 'Breakout Rooms', + description: + 'Instantly create randomised student groups for breakout sessions, discussions, or team activities.', }; /** diff --git a/app/generator/page.tsx b/app/generator/page.tsx index 54ff66c..0263e42 100644 --- a/app/generator/page.tsx +++ b/app/generator/page.tsx @@ -3,34 +3,10 @@ import { Metadata } from 'next'; import GeneratorCard from '@/components/generator/generator-card'; import GeneratorCardSkeleton from '@/components/loading/generator-card-skeleton'; -/** - * Builds SEO metadata for the random generator route. - */ export const metadata: Metadata = { - title: 'Student Generator | TeacherBuddy', - description: 'Pick a random student without repeats.', - openGraph: { - title: 'Student Generator | TeacherBuddy', - description: 'Pick a random student without repeats.', - siteName: 'TeacherBuddy', - images: [ - { - url: 'https://teacherbuddy.mrbubbles-src.dev/api/og', - width: 1200, - height: 630, - alt: 'TeacherBuddy Logo', - }, - ], - type: 'website', - locale: 'en_GB', - }, - twitter: { - card: 'summary_large_image', - title: 'Student Generator | TeacherBuddy', - description: 'Pick a random student without repeats.', - images: ['https://teacherbuddy.mrbubbles-src.dev/api/og'], - creator: '@_MstrBubbles', - }, + title: 'Student Generator', + description: + 'Randomly pick students from your roster without repeats — perfect for fair participation in class.', }; /** diff --git a/app/globals.css b/app/globals.css index 83cfc04..9ca1d49 100644 --- a/app/globals.css +++ b/app/globals.css @@ -384,3 +384,48 @@ [data-description] { color: inherit; } + +/* Timer volume slider — filled track with --primary color */ +.timer-volume-slider { + --slider-pct: 0%; + accent-color: var(--primary); +} +.timer-volume-slider::-webkit-slider-runnable-track { + height: 0.5rem; + border-radius: 9999px; + background: linear-gradient( + to right, + var(--primary) var(--slider-pct), + var(--muted) var(--slider-pct) + ); +} +.timer-volume-slider::-moz-range-track { + height: 0.5rem; + border-radius: 9999px; + background: linear-gradient( + to right, + var(--primary) var(--slider-pct), + var(--muted) var(--slider-pct) + ); +} +.timer-volume-slider::-webkit-slider-thumb { + -webkit-appearance: none; + appearance: none; + width: 1rem; + height: 1rem; + border-radius: 9999px; + background: var(--primary); + border: 2px solid var(--background); + box-shadow: 0 1px 3px oklch(0 0 0 / 0.2); + margin-top: -0.25rem; + cursor: pointer; +} +.timer-volume-slider::-moz-range-thumb { + width: 1rem; + height: 1rem; + border-radius: 9999px; + background: var(--primary); + border: 2px solid var(--background); + box-shadow: 0 1px 3px oklch(0 0 0 / 0.2); + cursor: pointer; +} diff --git a/app/layout.tsx b/app/layout.tsx index 18537f1..40f8491 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -21,41 +21,37 @@ const geistMono = Geist_Mono({ subsets: ['latin'], }); -export async function generateMetadata(): Promise { - return { - metadataBase: new URL( - process.env.NEXT_PUBLIC_SITE_URL ?? 'http://localhost:3000', - ), - title: 'TeacherBuddy', - description: - 'Manage students, run quizzes, and organize class activities in one place.', - openGraph: { - title: 'TeacherBuddy', - description: - 'Manage students, run quizzes, and organize class activities in one place.', - siteName: 'TeacherBuddy', - images: [ - { - url: 'https://teacherbuddy.mrbubbles-src.dev/api/og', - width: 1200, - height: 630, - alt: 'TeacherBuddy Logo', - }, - ], - type: 'website', - locale: 'en_GB', - }, - twitter: { - card: 'summary_large_image', - title: 'TeacherBuddy', - description: - 'Manage students, run quizzes, and organize class activities in one place.', - images: ['https://teacherbuddy.mrbubbles-src.dev/api/og'], - creator: '@_MstrBubbles', - }, - other: { 'apple-mobile-web-app-title': 'teacherbuddy.mrbubbles-src.dev' }, - }; -} +export const metadata: Metadata = { + metadataBase: new URL( + process.env.NEXT_PUBLIC_SITE_URL ?? + 'https://teacherbuddy.mrbubbles-src.dev', + ), + title: { + template: '%s | TeacherBuddy', + default: 'TeacherBuddy — Free Classroom Tools for Teachers', + }, + description: + 'Manage students, run quizzes, and organize class activities in one place.', + openGraph: { + siteName: 'TeacherBuddy', + images: [ + { + url: '/api/og', + width: 1200, + height: 630, + alt: 'TeacherBuddy — free classroom management dashboard', + }, + ], + type: 'website', + locale: 'en_GB', + }, + twitter: { + card: 'summary_large_image', + images: ['/api/og'], + creator: '@_MstrBubbles', + }, + other: { 'apple-mobile-web-app-title': 'TeacherBuddy' }, +}; /** * Renders the shared HTML shell and providers for all application routes. @@ -67,13 +63,8 @@ export default function RootLayout({ children: React.ReactNode; }) { return ( - + - -