PageSourceSearch

https://www.teachconnect.in/_next/static/chunks/pages/admin/feature-map-fbbfb2956bc86ae2.js

js teachconnect.in collected 2026-10-08 18:35:46 UTC 97,092 bytes, 1 lines download raw bytes

1(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[43111],{748:e=>{e.exports={map:"FeatureMap_map__mEno6",creditStrip:"FeatureMap_creditStrip__95hE9",creditPill:"FeatureMap_creditPill__LdLna",atlas:"FeatureMap_atlas__VB2Ek",fmRise:"FeatureMap_fmRise__Hj8or",fmGlowA:"FeatureMap_fmGlowA__SDSyc",fmGlowB:"FeatureMap_fmGlowB__JVmk3",atlasHead:"FeatureMap_atlasHead__ArzSN",atlasBrand:"FeatureMap_atlasBrand__3jf0M",fmSpin:"FeatureMap_fmSpin__1rFiR",stat:"FeatureMap_stat__sd_ly",status:"FeatureMap_status__K_my_",fmBeacon:"FeatureMap_fmBeacon__z_Kbg",statusEdits:"FeatureMap_statusEdits__oRXED",ticker:"FeatureMap_ticker__1OpMr",fmSlideIn:"FeatureMap_fmSlideIn__8WawB",stage:"FeatureMap_stage___09vK",routeSvg:"FeatureMap_routeSvg__fwSUq",district:"FeatureMap_district__slkpl",fmPop:"FeatureMap_fmPop__RTBAp",districtOn:"FeatureMap_districtOn__xtx64",fmHalo:"FeatureMap_fmHalo__Yf7SV",districtIcon:"FeatureMap_districtIcon__9BEKZ",districtCount:"FeatureMap_districtCount__KT7zM",districtHits:"FeatureMap_districtHits__ShsTT",districtQuiet:"FeatureMap_districtQuiet___ddSF",districtLabel:"FeatureMap_districtLabel__td1pe",districtBlurb:"FeatureMap_districtBlurb___OasY",districtTrail:"FeatureMap_districtTrail__C3NGe",board:"FeatureMap_board__Gf_x_",tools:"FeatureMap_tools__ztGaZ",searchBox:"FeatureMap_searchBox__S9DGX",searchInput:"FeatureMap_searchInput__gmwJB",searchHits:"FeatureMap_searchHits__47AM9",searchKey:"FeatureMap_searchKey__52uzh",searchClear:"FeatureMap_searchClear__bjbeD",tool:"FeatureMap_tool__ltl0B",toolPrimary:"FeatureMap_toolPrimary__Kz5Jx",toolOn:"FeatureMap_toolOn__aX9BM",toolGap:"FeatureMap_toolGap__O_Yp3",fileInput:"FeatureMap_fileInput__eUqaK",districtIntro:"FeatureMap_districtIntro__3Aa5B",explore:"FeatureMap_explore__gz_vv",exploreBar:"FeatureMap_exploreBar__P7MGq",exploreDone:"FeatureMap_exploreDone__bGC09",editBanner:"FeatureMap_editBanner__mKWxK",route:"FeatureMap_route__OOg40",routeHead:"FeatureMap_routeHead__5CFTz",routeMark:"FeatureMap_routeMark__ibsx5",routeName:"FeatureMap_routeName__bH_9a",routeTally:"FeatureMap_routeTally__X2_Go",routeBlurb:"FeatureMap_routeBlurb__Ga0mU",stations:"FeatureMap_stations__dsD4J",station:"FeatureMap_station__fnBHX",stationCard:"FeatureMap_stationCard__XcwN7",stationOpen:"FeatureMap_stationOpen__euYyn",stationTop:"FeatureMap_stationTop__jq9fj",stationDot:"FeatureMap_stationDot__hetil",stationSeen:"FeatureMap_stationSeen__mX9VE",stationText:"FeatureMap_stationText__fjEMK",stationName:"FeatureMap_stationName__YbEVV",stationUrl:"FeatureMap_stationUrl___OIUz",stationMore:"FeatureMap_stationMore__7dP2u",stationBody:"FeatureMap_stationBody__oLYUu",fmUnfold:"FeatureMap_fmUnfold__65FCq",stationInner:"FeatureMap_stationInner__RJ06F",guide:"FeatureMap_guide__4Ill4",facet:"FeatureMap_facet__EK5id",facetWide:"FeatureMap_facetWide__GxWyY",facetHead:"FeatureMap_facetHead__MfhgR",purpose:"FeatureMap_purpose__QEl5x",steps:"FeatureMap_steps__Ruw74",bullets:"FeatureMap_bullets__MQNRT",plans:"FeatureMap_plans__rJzYi",plan:"FeatureMap_plan__PjU72",planYes:"FeatureMap_planYes__ISPyH",planTag:"FeatureMap_planTag__o9rEg",creditLine:"FeatureMap_creditLine__P9mfr",links:"FeatureMap_links__3_gJ3",link:"FeatureMap_link__6IeTo",facetTip:"FeatureMap_facetTip__tdHN1",source:"FeatureMap_source__Qwjsx",editGrid:"FeatureMap_editGrid__FYXHQ",field:"FeatureMap_field___Ke03",fieldWide:"FeatureMap_fieldWide__9Vq1H",fieldInput:"FeatureMap_fieldInput__x7PVH",fieldArea:"FeatureMap_fieldArea__xEM6m",empty:"FeatureMap_empty__AYfOl",gate:"FeatureMap_gate__1PbKc",facetCredits:"FeatureMap_facetCredits__08hLY",routeLine:"FeatureMap_routeLine__26e9N",fmDraw:"FeatureMap_fmDraw__rrMI6",routeGlow:"FeatureMap_routeGlow__enEbD",packet:"FeatureMap_packet__7IjUA",packetTail:"FeatureMap_packetTail__wlJci",here:"FeatureMap_here__Ed9Z5",hereRing:"FeatureMap_hereRing__fM2IY",fmRing:"FeatureMap_fmRing__0Uqaa",hereRing2:"FeatureMap_hereRing2__CifbC"}},49240:(e,t,r)=>{(window.__NEXT_P=window.__NEXT_P||[]).push(["/admin/feature-map",function(){return r(99200)}])},71096:(e,t,r)=>{"use strict";r.d(t,{Z$:()=>n,j3:()=>i,jS:()=>l,oO:()=>s,vf:()=>a});let a=[{key:"recruiter",label:"Recruiters",group:"audiences"},{key:"jobseeker",label:"Jobseekers",group:"audiences"},{key:"college",label:"Colleges",group:"audiences"},{key:"school",label:"Schools",group:"audiences"},{key:"lead",label:"Leads",group:"audiences"},{key:"queue",label:"My Queue",group:"queues"},{key:"due",label:"Due Today",group:"queues"},{key:"overdue",label:"Overdue",group:"queues"},{key:"tomorrow",label:"Tomorrow",group:"queues"},{key:"missed",label:"Missed",group:"queues"},{key:"reports",label:"Reports",group:"queues"}],o=new Set(a.map(e=>e.key)),n="due";function i(e){let t=String(e||"").toLowerCase();return o.has(t)?t:n}function s(e){if(!e)return n;if("function"==typeof e.get){let t=e.get("view")||e.get("tab");return t?i(t):n}let t=e.view||e.tab;return t?i(t):n}function l(e){return`/admin/crm?tab=${i(e)}`}},99200:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>eF}
1);var a=r(37876),o=r(14232),n=r(89099),i=r(70717),s=r(97194),l=r(17007),c=r(32241),d=r(82036),h=r.n(d),u=r(748),p=r.n(u),m=r(62142),w=r(23870),f=r(40589),b=r(37176),g=r(389),y=r(48711),k=r(4469),v=r(18226),j=r(11481),A=r(79009),_=r(71096),S=r(38967);function x(e){let t=String(e||"").trim();if(!t)return[];if(t.includes("→"))return t.split("→").map(e=>e.trim()).filter(Boolean).map((e,t)=>`${t+1}. ${e}`);let r=t.split(/(?<=[.!?])\s+/).map(e=>e.trim()).filter(Boolean);return r.length>1?r.map((e,t)=>`${t+1}. ${e}`):[`1. ${t}`]}let I=[{id:"dashboard",title:"Dashboard",lead:"Start-of-day numbers and live site health.",keys:["/admin/account","/admin/hotpot","/admin/feature-map"]},{id:"people",title:"People",lead:"Outreach and deep account management for humans and institutions.",keys:["/admin/crm","/admin/users","/admin/recruiters","/admin/colleges"]},{id:"schools",title:"Schools",lead:"TeachConnect Homeroom school-software product (platform view).",keys:["/admin/homeroom"]},{id:"growth",title:"Growth",lead:"Outbound messaging, discounts, content, and SEO.",keys:["/admin/email-hub","/admin/emails","/admin/whatsapp-hub","/admin/coupon-hub","/admin/feedback","/admin/advertising","/admin/blogs","/admin/seo"]},{id:"revenue",title:"Revenue",lead:"Money in, money out, and owner visibility.",keys:["/admin/shop","/admin/orders","/admin/refunds","/admin/data-monetization","/admin/owner-financials","/admin/owner-forecast","/admin/ai-costs"]},{id:"operations",title:"Operations",lead:"Production health, QA, and product access codes.",keys:["/admin/deploy","/admin/production-bugs","/admin/audits","/admin/activity","/admin/test-sessions","/admin/ai-studio","/admin/teachtree-access","/admin/timetable"]},{id:"system",title:"System",lead:"Who can open which admin tabs.",keys:["/admin/access"]}],C={"/admin/account":{who:"Every admin after login.",what:"Admin home. Live platform counts (users, jobseekers, recruiters, jobs, blogs), recovery or priority signals, and shortcut cards into People, Commerce, and Operations.",how:"Land here after /admin/login. Scan the pulse and recovery signals, then use search/lookup or a shortcut card. Jobseeker/recruiter slices and school demos are on HotPot → Dashboard Overview.",when:"First page of the day, or whenever you need a quick pulse of the business.",moreWho:"Every signed-in admin lands here after login — super, owner, developer, telemarketer-lead, and telemarketer-jobseeker. Your role still controls which shortcut cards and other tabs you can open next.",moreWhat:"Overview is the admin home dashboard. It shows live platform counts (users, jobseekers, recruiters, jobs, blogs), recovery or priority signals that need attention, and shortcut cards into People, Commerce, and Operations. It is for orientation, not deep editing.",moreHow:"1. Open /admin/account after login.\n2. Scan the counts and any recovery signals first.\n3. Use search/lookup to jump to a specific user or job.\n4. Click a shortcut card only when you are ready to work that tool.\n5. Come back here anytime you need a quick business pulse.",moreWhen:"Open Overview at the start of every admin day, after a big campaign, or whenever someone asks “how is the platform looking?” before you dig into CRM, Emails, or Ops tools."},"/admin/hotpot":{who:"Super, owner, developer, telemarketer-lead (by default).",what:"Live website analytics: who is online now, recent logins and sign-ups, session replays, heatmaps, Google Analytics, WeekWise product tracking (funnel + live bugs), and Dashboard Overview (jobseeker/recruiter counts, paid vs active plans, filters, school demos).",how:"Open to see real-time presence. Drill into a session replay if a user reports confusion. Use heatmaps to spot drop-offs. Open WeekWise after Google Analytics for that product’s dashboard, then Dashboard Overview for platform counts.",when:"Product questions, marketing campaigns, or debugging a reported UI path.",notes:"Treat session replays as sensitive visitor data."},"/admin/feature-map":{who:"Any admin who needs a product/feature reference.",what:"This page — TeachConnect Feature Map. Explains every admin, CRM, jobseeker, recruiter, and Homeroom tab. Editable and downloadable.",how:"Pick an area → expand a tab → read Who / What / How / When. Use Edit to update copy, then Download Markdown or JSON.",when:"Training new admins, writing SOPs, or checking what a screen is for."},"/admin/crm":{who:"Super, owner, telemarketer-lead, telemarketer-jobseeker — main telecaller workspace.",what:"Single sales desk for recruiters, jobseekers, colleges, schools, and freeform leads. Call, WhatsApp, SMS, email, log touches, set follow-ups, move pipeline.",how:"Pick an inner view → open a contact → Call/WhatsApp → log disposition → set follow-up → update status. Clear Due Today / Overdue first.",when:"Daily calling and lead nurturing. Prefer CRM over legacy people tabs for outreach.",notes:"Calling respects TRAI 9–9 window and do-not-call flags."},"/admin/users":{name:"Jobseekers (legacy deep edit)",who:"Super only by default.",what:"Full jobseeker account surgery: search, plans, fix data, merge duplicates, CSV import, cleanup.",how:"Search by name/email/phone → open row → edit profile or plan. Use import for bulk lists.",when:"Support tickets needing data fixes — not routine calling (use CRM)."},"/admin/recruiters":{name:"Recruiters (legacy deep edit)",who:"Super only by default.",what:"Full recruiter/school account management: plans, posted jobs, contacts, hiring access.",how:"Search school/recruiter → adjust plan → review jobs → fix contacts.",when:"Plan corrections and deep job management — not day-to-day dialing."},"/admin/colleges":{name:"Colleges (legacy)",who:"Super only by default.",what:"Older B.Ed college directory. Day-to-day outreach is CRM → Colleges.",how:"Browse/edit college records when CRM is not enough for a deep field edit.",when:"Rare deep edits; prefer CRM Colleges for calling."},"/admin/homeroom":{who:"Super and owner by default.",what:"Platform oversight of every Homeroom school: registration, plan, onboarding, provisioning. Not the school’s own Command Center.",how:"Filter by plan/status → open school → check onboarding → provision or upload seed data.",when:"School sales handoff, onboarding, or Homeroom support tickets."},"/admin/email-hub":{who:"Most admins with Growth access.",what:"Campaign composer for announcements, coupons, feedback asks. Segment or paste audience. Preview + test-send.",how:"Choose audience → write → preview → test to yourself → send.",when:"Plan promotions, reactivation blasts, announcements."},"/admin/emails":{who:"Any admin with panel access.",what:"Read [email protected] mailbox — inbox, sent, search.",how:"Search by sender/subject → open thread → reply or escalate.",when:"Inbound support and sales email replies."},"/admin/whatsapp-hub":{who:"Any admin with panel access.",what:"Single or bulk WhatsApp with role/location/subject filters. Templates, recipient count, chats for replies.",how:"Set filters → pick template → check count → preview → send.",when:"High-touch outreach where WhatsApp converts better than email."},"/admin/coupon-hub":{who:"Super, owner, telemarketer-lead.",what:"Create % or fixed discount codes for plans, shop, or AI credits, with optional expiry.",how:"Create code → set amount/type → choose applies-to → set expiry → share with user.",when:"Closing a sale, festival offers, goodwill discounts."},"/admin/feedback":{who:"Most admins.",what:"Inbox of feedback forms users submitted on the site.",how:"Read newest first → resolve or escalate bugs to Production Bugs.",when:"Weekly review or after a release."},"/admin/blogs":{who:"Content owners (hidden from telemarketer roles by default).",what:"Write, edit, publish blog posts on the public site.",how:"Draft → edit SEO fields → publish.",when:"Content marketing and SEO articles."},"/admin/seo":{who:"Most admins / growth.",what:"Search-engine settings and sitemaps that affect Google visibility.",how:"Update settings carefully → verify public URLs after changes.",when:"SEO campaigns or indexing fixes."},"/admin/shop":{who:"Commerce ops (hidden from telemarketers by default).",what:"Shop catalogue and fulfilment: resume passes, kits, add-ons, files.",how:"Create/edit product → attach files → publish → fulfil orders.",when:"Adding paid resources or fixing a downloadable product."},"/admin/orders":{who:"Finance/ops (hidden from telemarketers).",what:"Paid membership orders. Invoice shows tax, fee split, payment refs; downloadable.",how:"Search by user/order → open invoice → verify refs → download if asked.",when:"Payment disputes, invoice requests, reconciling payments."},"/admin/refunds":{who:"Support/finance.",what:"Refund request queue — approve or decline.",how:"Open request → check original order → approve/decline with note.",when:"Customer refund tickets and plan downgrade refunds."},"/admin/data-monetization":{who:"Partnerships/ops (hidden from telemarketers).",what:"Partner companies, campaigns, consented leads — with audit trail.",how:"Add partner → create campaign → share only consented leads → audit.",when:"Partner deals; never share without consent."},"/admin/owner-financials":{who:"Super and owner only.",what:"Sensitive P&L: revenue, costs, charts.",how:"Review period filters and charts. Do not share outside owners.",when:"Owner reviews."},"/admin/owner-forecast":{who:"Super and owner only.",what:"Model future revenue/growth, costs, profit projections.",how:"Adjust assumptions and read projected trend.",when:"Quarterly planning."},"/admin/ai-costs":{who:"Super and owner only.",what:"Real AI token spend vs credit value charged — margin proof.",how:"Compare provider cost vs credit revenue; investigate spikes.",when:"Pricing AI packs or unusual AI bills."},"/admin/deploy":{who:"Developers/ops.",what:"Trigger/watch production deploy of committed code.",how:"Only after review. Watch until green. Coordinate before clicking.",when:"Releasing a merged fix/feature.",notes:"Affects production — handle with care."},"/admin/production-bugs":{who:"Most admins / QA.",what:"Live-site bug board: severity and status workflow.",how:"Log/triage → set severity â
1†’ move status through fixed → verified.",when:"Any live defect or post-release regression."},"/admin/audits":{who:"Ops/dev.",what:"Data-quality and integrity checks across the platform.",how:"Run checks → inspect failures → fix in Users/Recruiters or engineering.",when:"Periodic hygiene or after messy imports."},"/admin/activity":{who:"Super and owner.",what:"Audit log of admin actions — who did what, when.",how:"Filter by admin/time when investigating edits or abuse.",when:"Security/accountability questions."},"/admin/test-sessions":{who:"Super and owner.",what:"Snapshots of the shared tester account’s sessions for QA.",how:"Open a snapshot to reproduce steps.",when:"Hard-to-reproduce QA issues."},"/admin/ai-studio":{who:"Super (+ named allowlisted admins).",what:"Script → Indian voiceover or AI-presenter video → preview/download.",how:"Paste script → choose voice/avatar → generate → download.",when:"Promo videos and voiceovers without a studio shoot."},"/admin/teachtree-access":{who:"Super and owner.",what:"Per-employee access codes for TeachTree mobile apps (no email/OTP).",how:"Add colleague → mint code → hand over → revoke if they leave.",when:"Onboarding internal TeachTree users."},"/admin/timetable":{who:"Super and owner.",what:"Grouped Timetable console: 01 Access (buyer codes, mint/resend/revoke, payment reconcile) and 02 Studio (email log, shared-code watchlist, support queue).",how:"Open Operations → Timetable. Use 01 Access for codes. Use 02 Studio for sends and support. Old /admin/timetable-access and /admin/timetable-studio URLs redirect here.",when:"Timetable sales support, comps, send spend, or a code that looks shared."},"/admin/access":{who:"Super only.",what:"Create/disable admin accounts and choose which tabs each may open.",how:"Create account → set role → tick tabs → save. Disable leavers.",when:"Hiring a new admin/telecaller or changing permissions.",notes:"This tab cannot be granted to other roles."},"/admin/crm?tab=recruiter":{who:"Telecallers selling recruiter/school hiring plans.",what:"School/recruiter accounts as CRM leads — plan, phone, last touch, pipeline status.",how:"Filter/search → open card → call/WhatsApp → log outcome → set follow-up.",when:"Working the hiring-side pipeline."},"/admin/crm?tab=jobseeker":{who:"Telecallers focused on teacher memberships.",what:"Teacher/jobseeker leads with profile + plan context.",how:"Same call/log loop; pitch Free → Basic → Premium upgrades.",when:"Teacher upgrade and activation campaigns."},"/admin/crm?tab=college":{who:"B.Ed college outreach team.",what:"College directory as dialable leads.",how:"Call placement cells / principals; log demo interest.",when:"College partnership drives."},"/admin/crm?tab=school":{who:"Homeroom / school SaaS sales.",what:"School leads for Homeroom product conversations.",how:"Qualify school size → schedule demo → move toward Won.",when:"Homeroom sales pipeline."},"/admin/crm?tab=lead":{who:"Anyone capturing freeform inbound leads.",what:"WhatsApp Ad contacts and freeform inbound leads not yet tied to a full account.",how:"Filter registered/not registered → call/WhatsApp → convert into the right audience.",when:"Website forms, WhatsApp ad inquiries, events."},"/admin/crm?tab=queue":{who:"Each telecaller’s assigned worklist.",what:"Personal dialer queue with click-to-call.",how:"Call next → set disposition → advance. Use for focused calling blocks.",when:"Daily dialing sessions."},"/admin/crm?tab=due":{who:"Anyone with follow-ups scheduled for today.",what:"Contacts whose follow-up date is today.",how:"Clear this list before cold outreach.",when:"Start of every calling day."},"/admin/crm?tab=overdue":{who:"Same team — missed follow-ups.",what:"Follow-ups that passed without a logged contact.",how:"Highest priority after Due Today. Reconnect and reset date.",when:"Immediately after Due Today."},"/admin/crm?tab=tomorrow":{who:"Planners preparing next day.",what:"Follow-ups scheduled for tomorrow.",how:"Scan to prepare scripts; don’t burn today on tomorrow’s list unless urgent.",when:"End of day prep."},"/admin/crm?tab=missed":{who:"Telecallers recovering no-connect attempts.",what:"Recent failed attempts (no answer / busy / not reachable).",how:"Retry at different times; respect do-not-call.",when:"Second-pass calling windows."},"/admin/crm?tab=reports":{who:"Leads and managers.",what:"CRM performance reporting across the team.",how:"Review connect and conversion rates; coach the team.",when:"End of day or weekly review."}};function M(e){let t=C[e.key]||{};return{id:e.key,name:t.name||e.label,url:e.key,who:t.who||"Admins with access to this tab (see Admin Role Access).",what:t.what||e.description||`${e.label} admin tool.`,how:t.how||`Open ${e.key} from the admin navigation and follow the on-screen actions.`,when:t.when||"When your work needs this tool.",notes:t.notes,moreWho:t.moreWho,moreWhat:t.moreWhat,moreHow:t.moreHow,moreWhen:t.moreWhen,moreNotes:t.moreNotes}}
1let P={audiences:{id:"crm-audiences",title:"Audience directories",lead:"Browse a specific type of person or institution."},queues:{id:"crm-queues",title:"Work queues",lead:"Call these in priority order."}};function F(e){return(String(e||"").split("\xb7").map(e=>e.trim())[0]||"").split("?")[0].split("#")[0].replace(/\/+$/,"")||"/"}let R=[{id:"jobseeker",label:"Jobseeker",intro:"Teacher side of TeachConnect. Free / Basic / Premium change limits and AI credits (3 / 25 / 72). New jobseeker pages under pages/ appear automatically under Auto-discovered.",groups:[{id:"js-nav",title:"Main navigation",lead:"Primary places a signed-in jobseeker goes from the header or mobile bottom rail.",tabs:[{id:"js-home",name:"Home / Dashboard",url:"/jobseeker/dashboard",who:"Any teacher who has logged in.",what:"This is the teacher home page. You can see recent job applications, interview invites (with join link), your current plan, and quick buttons for Jobs, Resume, Teaching, and Plans.",how:"After login you come here first. Check interview cards. If an interview is ready, join it. Use the buttons to open Jobs, Resume Studio, Teaching tools, or upgrade your plan. Use Applied / Saved to track your jobs.",when:"Open this after login, or anytime you want to see your job and interview status.",notes:"If something looks empty, finish your profile first so schools can find you.",moreWho:"Any teacher (jobseeker) who has signed in can open Home / Dashboard. Guests and recruiters use different home screens. If you just registered, this is the first place TeachConnect sends you after login.",moreWhat:"Home is your teacher control panel. In one place you see: recent applications, interview invites (with a join link when ready), your current plan (Free / Basic / Premium), and shortcuts to Jobs, Resume Studio, Teaching tools, and Plans. It does not replace full Jobs search or Resume editing — those open from the buttons.",moreHow:"1. Log in as a teacher — you land on /jobseeker/dashboard.\n2. Read interview cards first; if Join is available, open it on time.\n3. Check your plan badge so you know apply / AI limits.\n4. Use the quick buttons for Jobs, Resume, Teaching, or Membership.\n5. Open Applied / Saved when you need to track jobs you already touched.\n6. If cards look empty, complete Profile → Education → Experience → Documents first.",moreWhen:"Open Home right after every login, at the start of a job-hunt session, and whenever you expect an interview invite. Come back here if you feel lost — it is the hub for teacher work.",moreNotes:"Empty dashboard sections usually mean the profile is incomplete or you have not applied/saved anything yet. Finish the profile stepper so schools can find you, then applications and interviews will start to fill this page."},{id:"js-jobs",name:"Jobs (Search)",url:"/jobs-for-teachers",who:"Teachers looking for school jobs.",what:"Search page for live teacher jobs. You can filter by subject, place, board, and more, then open any job to read full details.",how:"Set filters → open a job → read details → click Apply. Each apply uses one apply count from your plan (Free 5, Basic 30, Premium unlimited). Save jobs you want to check later.",when:"When you are searching for a new teaching job.",notes:"Guest users can browse jobs, but login is needed to apply."},{id:"js-my-jobs",name:"My Jobs",url:"/jobseeker/my-jobs",who:"Teachers who already applied or saved jobs.",what:"Your job tracker. Applied = jobs you applied to. Saved = jobs you bookmarked for later.",how:"Open Applied to see applications. Open Saved to see bookmarks. Click any job to open it again and prepare for interview or follow-up.",when:"After you apply, or when you want to follow up on saved jobs."},{id:"js-job-detail",name:"Job detail & apply",url:"/jobs/[title]",who:"Teachers ready to read one job and apply.",what:"Full job page with school details, subject, place, requirements, and the Apply button.",how:"Open the job from search → check if it matches you → click Apply. If your plan limit is full, go to Membership to upgrade.",when:"When you want to apply to one specific job."},{id:"js-resume",name:"AI Resume Studio",url:"/resumes/ai-builder",who:"Teachers making or improving a resume.",what:"Build a teacher resume with templates, AI health check, rewrite help, PDF download, and (Premium) share link for schools.",how:"Pick a template → fill your details → run health check → fix weak parts → download PDF. Premium users can also tailor the resume and share a public link. You can sync the final resume to your profile.",when:"Before applying, or when a school asks for an updated resume.",notes:"Free plan PDFs may show a watermark. Basic/Premium can download clean PDFs (within plan limits)."},{id:"js-teaching",name:"Teaching Studios",url:"/jobseeker/teaching",who:"Teachers who need class materials.",what:"AI tools to make lesson plans, worksheets, quizzes, and more. This is for classroom work, not for applying to jobs.",how:"Open Teaching → choose a tool → enter board, grade, subject → generate → save. Open Library later to reuse old work. Buy AI credits if your monthly credits finish.",when:"When you need help preparing class content."},{id:"js-teaching-library",name:"Teaching Library",url:"/jobseeker/teaching/library",who:"Teachers who already made Teaching Studio content.",what:"Saved list of your lesson plans, worksheets, and other teaching files.",how:"Open an item to reuse it, copy it, or make a new version for another class.",when:"When you want to reuse past class materials."},{id:"js-shop",name:"Shop",url:"/shop",who:"Teachers buying extra products.",what:"Buy resume packs or other products. This is not the membership plan page.",how:"Browse → buy â
1†’ open Orders later for your purchase and invoice.",when:"When you need one product, but not a full plan change."},{id:"js-profile",name:"Profile (edit entry)",url:"/jobseeker-profile-update",who:"Teachers updating the profile schools see.",what:"Start of profile setup: your name, contact, summary, and skills. A complete profile helps schools trust and find you.",how:"Fill your details clearly. Then continue to Education → Teaching Experience → Documents. Keep phone and email correct.",when:"First time after signup, and whenever your details change."},{id:"js-plan",name:"Membership",url:"/jobseeker-plan",who:"Teachers comparing Free, Basic, and Premium.",what:"Plan page. See what each plan gives you (applies, resume downloads, AI credits, AI tools), pay for a plan, or buy AI credits only.",how:"Read Free (3 credits) / Basic (25) / Premium (72) → choose a plan → pay. Or stay on Free/Basic and only buy AI credit packs for tools you already can use.",when:"When apply or download limits stop you, credits run out, or when you need Premium AI tools.",notes:"Buying AI credits does not change your membership plan.",moreWhat:"Membership controls two things:\n1) Plan limits (applies, visibility, Premium tool unlocks)\n2) Monthly AI credits (Free 3, Basic 25, Premium 72)\n\nYou can also buy extra credit packs here without changing plan. See the Feature Map group “AI credits — where and how to use” for full where/how/cost details.",moreHow:"1. Open /jobseeker-plan.\n2. Compare Free / Basic / Premium.\n3. Upgrade if you need more applies or Premium tools.\n4. Or buy credit packs if you only need more AI runs this month.\n5. After payment, check balance on /jobseeker/ai-hub."},{id:"js-messages",name:"Messages",url:"/jobseeker/messages",who:"Teachers chatting with schools (when messaging is on).",what:"Chat box for talks with recruiters about jobs, documents, and interview time.",how:"Open a chat → reply with your questions or available time. Keep important talk here when messaging is enabled.",when:"When a school messages you, or you need to follow up."},{id:"js-ai-hub",name:"AI Career Hub",url:"/jobseeker/ai-hub",who:"Teachers using AI career tools.",what:"See AI credit balance, free Career Score, Premium tools (tailor, job match, demo prep), usage history, and buy more credits.",how:"Start with free score/check. Check credit cost before Premium tools. Buy packs when low. Check consent options before sharing data with partners.",when:"Before interviews, resume work, or when credits feel low.",notes:"Some tools need Premium. Other tools only need AI credits.",moreWhat:"AI Career Hub is the teacher credit home.\n\nYou can:\n• See remaining credits\n• Run Career Score (0 credits)\n• Run Premium tools if on Premium (Job Match 2, Demo Prep 2; Tailor is mainly in Resume Studio at 3)\n• Buy extra credits\n• Review past AI runs\n\nFull where-to-spend list is under Feature Map → AI credits — where and how to use.",moreHow:"1. Open /jobseeker/ai-hub.\n2. Read balance (Free 3 / Basic 25 / Premium 72 monthly base).\n3. Use free tools first.\n4. For paid tools, confirm cost.\n5. If locked, upgrade plan. If empty, buy credits."},{id:"js-settings",name:"Settings",url:"/settings",who:"Any signed-in user.",what:"Account settings page for preferences and basic account controls.",how:"Update your preferences. Logout from the menu if you use a shared computer.",when:"When you need to change account settings."},{id:"js-orders",name:"Orders & Invoices",url:"/orders \xb7 /invoices",who:"Teachers who paid for plans, credits, or shop items.",what:"Your payment history and invoices for plans, credits, and shop buys.",how:"Find the payment → open invoice → download if needed for records or refund help.",when:"When you need a bill or payment proof."}]},{id:"js-profile-steps",title:"Profile stepper tabs",lead:"Complete these steps so schools can trust your profile.",tabs:[{id:"js-profile-details",name:"Profile Details",url:"/jobseeker-profile-update",who:"Teachers filling basic profile info.",what:"Your name, phone, email, summary, and skills. This is the first thing schools read.",how:"Fill required fields. Keep phone and email correct for login and school contact.",when:"Step 1 after signup."},{id:"js-education",name:"Education",url:"/jobseeker-education-update",who:"Teachers adding degrees and certificates.",what:"Your B.Ed / D.El.Ed / degree list shown on your profile.",how:"Add each course with college and 
1year. Add certificates if you have them.",when:"Step 2 of profile setup."},{id:"js-experience",name:"Teaching Experience",url:"/jobseeker/ai-teacher-required",who:"Teachers adding classroom experience.",what:"Years taught, boards, classes, and subjects. Schools use this to filter teachers.",how:"Write real experience only. Wrong details can cause problems in interviews later.",when:"Step 3 of profile setup."},{id:"js-documents",name:"Documents",url:"/jobseeker-resume-update",who:"Teachers uploading resume and certificates.",what:"Files schools can download from your profile (resume PDF and certificates).",how:"Upload clear PDF files. You can also sync a resume from AI Resume Studio.",when:"Step 4 before you apply a lot."},{id:"js-view-profile",name:"View Profile",url:"/jobseeker/view-profile",who:"Teachers checking how schools see them.",what:"Preview of your public profile, including documents and resume links.",how:"Check missing parts → edit → come back and confirm before applying.",when:"Before you start applying to many jobs."}]},{id:"js-plans",title:"Plans (what each tier unlocks)",lead:"Simple plan limits for Free, Basic, and Premium — including AI credits.",tabs:[{id:"js-plan-free",name:"Free plan",url:"/jobseeker-plan#free",who:"New teachers trying TeachConnect.",what:"5 job applies, 10 saved jobs, 1 resume draft, 3 templates, watermark PDF, 3 AI credits each month. No share link. Normal profile visibility.",how:"Stay on Free and use jobs + light AI (Career Score is free). Spend the 3 credits carefully. Upgrade when limits stop you.",when:"First days on the platform.",notes:"Free checks like Career Score do not use credits. Paid AI actions do.",moreWhat:"Free plan limits in simple words:\n• 5 job applies\n• 10 saved jobs\n• 1 resume draft, 3 templates\n• PDF may show a watermark\n• 3 AI credits each month\n\nCredits are for AI help (rewrite, teaching tools, some resume actions). They are not the same as job-apply counts.",moreHow:"1. Open Membership (/jobseeker-plan) to confirm you are on Free.\n2. Check credit balance on AI Career Hub (/jobseeker/ai-hub).\n3. Use free tools first (Career Score, Resume Health Scan).\n4. Spend credits only when you need a rewrite or teaching generate.\n5. If credits finish, buy a credit pack — or upgrade to Basic/Premium for more monthly credits."},{id:"js-plan-basic",name:"Basic plan",url:"/jobseeker-plan#basic",who:"Teachers applying more often.",what:"30 applies, 75 saved jobs, 3 drafts, 8 templates, 3 clean PDFs, better visibility to schools, 25 AI credits each month. No Premium tailor / job-match / demo-prep tools.",how:"Buy Basic on Membership. Use clean PDF downloads within the limit. Spend AI credits on Resume Studio and Teaching tools.",when:"When Free limits are too small, but you do not need full Premium AI yet.",moreWhat:"Basic plan in simple words:\n• 30 job applies\n• 75 saved jobs\n• Better profile visibility\n• 25 AI credits each month\n• Clean PDF downloads (within plan limit)\n\nStill blocked on Premium-only AI: Resume Tailor (3 credits), Job Match (2), Demo Prep (2).",moreHow:"1. Buy Basic on /jobseeker-plan.\n2. Open /jobseeker/ai-hub to see your 25 credits.\n3. Use credits on profile/resume rewrites, PDF export, Teaching Toolkit generates.\n4. If you need Tailor / Job Match / Demo Prep, upgrade to Premium — credits alone do not unlock those tools."},{id:"js-plan-premium",name:"Premium plan",url:"/jobseeker-plan#premium",who:"Teachers who want full AI help and higher reach.",what:"Unlimited applies, saved jobs, drafts, templates, and clean PDFs. Share link, top visibility, 72 AI credits each month, plus tailor / job-match / demo-prep tools.",how:"Choose monthly or yearly on Membership, then use Resume Studio and AI Hub for Premium tools. Watch the credit cost before you run each tool.",when:"Interview time, or when you need Premium AI tools.",notes:"Best choice when you are actively interviewing and need strong resume help.",moreWhat:"Premium plan in simple words:\n• Unlimited applies and saved jobs\n• Full resume tools + share link\n• 72 AI credits each month\n• Unlocks Premium AI tools that Free/Basic cannot run\n\nPremium tool costs (from your credit wallet):\n• Resume Tailor — 3 credits\n• Job Match — 2 credits\n• Demo Prep — 2 credits\n• Section rewrite / profile rewrite / PDF export / share / profile upload — 1 credit each",moreHow:"1. Buy Premium on /jobseeker-plan.\n2. Check balance on /jobseeker/ai-hub.\n3. Prepare resume on /resumes/ai-builder (rewrites + tailor).\n4. Use Teaching tools on /jobseeker/teaching (each generate uses credits).\n5. Run Job Match / Demo Prep from AI Hub when preparing interviews.\n6. If credits run out mid-month, buy a credit pack — your Premium tools stay unlocked."}]},{id:"js-credits",title:"AI credits — where and how to use",lead:"Clear guide: credits by plan, where teachers spend them, and simple c
1osts. Buying credits does not change your plan.",tabs:[{id:"js-credits-overview",name:"Teacher AI credits (overview)",url:"/jobseeker/ai-hub",who:"Any teacher who uses AI tools.",what:"AI credits are tokens you spend on AI help. Your plan gives a monthly amount: Free 3, Basic 25, Premium 72. Extra packs can be bought anytime.",how:"Open AI Career Hub to see balance → open a tool → confirm the credit cost → run it. Check history on the same hub.",when:"Before you run any AI rewrite, export, tailor, teaching generate, job match, or demo prep.",notes:"Job applies and saved-job limits are separate from AI credits.",moreWho:"Every signed-in teacher has an AI credit wallet. Recruiters have a different wallet on the hiring side. Admins do not spend teacher credits here.",moreWhat:"Think of AI credits like mobile recharge for AI features.\n\nMonthly included credits by plan:\n• Free — 3 credits\n• Basic — 25 credits\n• Premium — 72 credits\n\nSome tools cost 0 credits (Career Score, Resume Health Scan). Most useful AI actions cost 1–3 credits. Teaching Toolkit tools often cost 1–3+ credits per generate.",moreHow:"1. Go to /jobseeker/ai-hub and read your balance.\n2. Decide the tool (Resume Studio, Teaching, or AI Hub Premium tools).\n3. Read the cost on the button or confirm popup.\n4. Run only if you have enough credits.\n5. If balance is low, buy a pack on Membership / AI Hub — or wait for the next plan refresh if your plan renews monthly credits.",moreWhen:"Check credits at the start of a resume session, before a teaching generate, and before interview prep tools. Do not spend the last credits on a test run if you need them for a real PDF or tailor.",moreNotes:"Important: buying AI credit packs adds credits only. It does not upgrade Free → Basic → Premium. Premium-only tools still need the Premium plan."},{id:"js-credits-where",name:"Where teachers can use credits",url:"/jobseeker/ai-hub",who:"Teachers spending AI credits.",what:"Main places: AI Career Hub, AI Resume Studio, Teaching Studios, and profile summary polish. Costs show before you spend.",how:"Pick the page below → use the AI button → confirm credits → get the result. Save useful output to Library or profile.",when:"Whenever you need AI writing or classroom content.",moreWhat:"Where to spend teacher AI credits (simple list):\n\n1) AI Career Hub — /jobseeker/ai-hub\n   • See balance and history\n   • Career Score (0 credits)\n   • Job Match (Premium, 2 credits)\n   • Demo Prep (Premium, 2 credits)\n   • Buy more credits\n\n2) AI Resume Studio — /resumes/ai-builder\n   • Resume Health Scan (0 credits)\n   • Section rewrite (1 credit)\n   • Resume Tailor (Premium, 3 credits)\n   • PDF export / share / upload to profile (1 credit each)\n\n3) Teaching Studios — /jobseeker/teaching\n   • Lesson plans, worksheets, quizzes, and more\n   • Each generate uses credits (often 1–3+, shown before generate)\n   • Saved work lives in /jobseeker/teaching/library\n\n4) Profile polish — /jobseeker-profile-update\n   • Summary rewrite (1 credit)",moreHow:"Easy path:\n1. Check balance on AI Hub.\n2. For resume work → Resume Studio.\n3. For class materials → Teaching.\n4. For interview / job fit → AI Hub Premium tools (needs Premium plan).\n5. Always confirm the cost popup before spending."},{id:"js-credits-costs",name:"Teacher credit costs (simple list)",url:"/jobseeker/ai-hub",who:"Teachers who want to know how many credits each action takes.",what:"Free tools: Career Score and Resume Health Scan (0). Common paid: rewrite / PDF / share / upload (1). Premium: Job Match 2, Demo Prep 2, Resume Tailor 3. Teaching tools show their own cost.",how:"Before you click Generate or Run, read the credit number on the button. If you do not have enough, buy a pack or upgrade plan.",when:"Every time before spending credits.",moreWhat:"Simple cost sheet (AI Hub / Resume tools):\n\n0 credits\n• Career Score\n• Resume Health Scan\n\n1 credit\n• Profile summary rewrite\n• Resume section rewrite\n• Resume PDF export\n• Upload resume to profile\n• Resume share link\n\n2 credits (Premium plan needed)\n• Job Match\n• Demo Prep\n\n3 credits (Premium plan needed)\n• Resume Tailor\n\nTeaching Toolkit\n• Cost depends on the tool (worksheet, quiz, lesson plan, etc.)\n• Harder / longer work can cost more\n• The screen always shows “Generate \xb7 N credits” before you pay",moreHow:"1. Open the tool.\n2. Fill board / grade / subject (for teaching) or resume section.\n3. Read N credits on the button.\n4. Confirm only if the cost is OK.\n5. If locked for Premium, upgrade plan first — extra credits alone will not unlock it."},{id:"js-credits-buy",name:"Buy extra teacher credits",url:"/jobseeker-plan",who:"Teachers whose monthly credits finished.",what:"Buy credit packs (1, 5, 10, 20, 50, 100) without changing Free / Basic / Premium. Packs add to your wallet for the same AI tools you already can use.",how:"Open Membership or AI Hub → choose a credit pack → pay → balance updates → continue on Re
1sume / Teaching / AI Hub.",when:"When monthly credits are low and you still need AI help this month.",notes:"Credit packs do not unlock Premium-only tools. Upgrade the plan for that.",moreWhat:"Credit packs are extra AI recharge. Example pack sizes: 1, 5, 10, 20, 50, 100 credits.\n\nUse packs when:\n• Free 3 credits are finished\n• Basic 25 credits are finished\n• Premium 72 credits are finished mid-month\n\nDo not buy packs hoping to unlock Tailor / Job Match / Demo Prep on Free or Basic — those need Premium membership.",moreHow:"1. Go to /jobseeker-plan or /jobseeker/ai-hub.\n2. Choose AI credits / pack.\n3. Pay.\n4. Return to the tool you needed.\n5. Run again with the new balance."}]}]},{id:"recruiter",label:"Recruiter",intro:"School / hiring side of TeachConnect. Starter / Growth / Elite change limits and AI credits (5 / 30 / 120). New recruiter pages appear automatically under Auto-discovered.",groups:[{id:"rec-nav",title:"Main navigation",lead:"Main screens for school hiring accounts.",tabs:[{id:"rec-home",name:"Home / Dashboard",url:"/recruiter/dashboard",who:"Any school recruiter who has logged in.",what:"Hiring home page. Shows your plan (Starter / Growth / Elite), remaining posts/views, recent applicants, and shortcuts to Post Job, Candidates, Pipeline, and AI Hub.",how:"After login, check your plan limits. Then post a job or review applicants. If Starter limits are full, upgrade from Membership.",when:"Open this after login and at the start of each hiring day.",notes:"Always check remaining posts/views before starting a new hiring drive."},{id:"rec-post",name:"Post Job",url:"/recruiter/post-job",who:"Recruiters adding a new teacher vacancy.",what:"Form to create a job post (subject, place, salary, details). Each publish uses one post from your plan (Starter 1, Growth 5, Elite unlimited).",how:"Fill clear job details → publish. On Growth+, you can use AI Job Post Review first to improve the job text.",when:"When your school has an open teacher role.",notes:"Clear subject and location help the right teachers apply."},{id:"rec-jobs",name:"My Job Postings",url:"/recruiter/my-jobs",who:"Recruiters managing their job posts.",what:"List of your active, draft, and closed jobs, with entry to each job’s applicants.",how:"Open a job → see applicants → edit details or close when the role is filled.",when:"Every day after you have posted at least one job."},{id:"rec-joblisting",name:"Job listing + applicants",url:"/recruiter/joblisting/[title]",who:"Recruiters reviewing applicants for one job.",what:"Applicant list for one vacancy, with teacher profiles linked to that job.",how:"Open the job → review each teacher → shortlist, message, or schedule interview.",when:"When applications start coming in."},{id:"rec-update-job",name:"Edit / Update Job",url:"/recruiter/update-job/[title]",who:"Recruiters fixing an existing job post.",what:"Edit page for salary, place, job text, or status of an already posted job.",how:"Open from My Jobs → change details → save. On Growth+, you can re-check the JD with AI if needed.",when:"When the job details need a correction."},{id:"rec-candidates",name:"Candidates (Search)",url:"/recruiter/brand-applicants",who:"Recruiters searching teachers in the database.",what:"Teacher search with filters (subject, place, experience). Starter has limited profile views. Growth/Elite can open more and see contact details.",how:"Filter by subject/place → open good profiles → save or contact them. Upgrade if Starter view/contact limits block you.",when:"When you need more teachers than just applicants.",notes:"Use this when applicant count is low for a hard-to-fill subject."},{id:"rec-candidate-profile",name:"Candidate profile",url:"/recruiter/view/[title]",who:"Recruiters checking one teacher in detail.",what:"Full teacher profile with education, experience, and resume. Starter may hide phone/email.",how:"Read the profile → save to Pipeline → message or call if your plan allows → schedule interview.",when:"When shortlisting a teacher."},{id:"rec-pipeline",name:"Candidate Pipeline",url:"/recruiter/my-jobseekers",who:"Recruiters tracking shortlisted teachers.",what:"Combined list of applicants and saved candidates — your working shortlist.",how:"Open Pipeline → message teachers → book interviews → move strong candidates forward.",when:"After shortlisting has started.",n
1otes:"Keep your shortlist here so the team does not lose track of good teachers."},{id:"rec-ai",name:"AI Hiring Hub",url:"/recruiter/ai-hub",who:"Recruiters using AI hiring tools.",what:"Credit balance and tools: Hiring Score (all, free), Job Review & Outreach (Growth+, 2 credits each), Compare Board (Elite, 4) & Interview Kit (Elite, 3). Buy packs here too.",how:"Check plan + credits → run tools allowed on your plan → buy more credits if needed without changing plan.",when:"When writing better jobs, comparing candidates, or preparing interviews.",notes:"Tool access depends on plan. Credits are separate from membership.",moreWhat:"AI Hiring Hub is the school credit home.\n\nMonthly credits: Starter 5 \xb7 Growth 30 \xb7 Elite 120.\n\nSee Feature Map → Recruiter → “AI credits — where and how to use” for the full where/how/cost guide in simple English.",moreHow:"1. Open /recruiter/ai-hub.\n2. Confirm Starter / Growth / Elite.\n3. Read credit balance.\n4. Run unlocked tools only.\n5. Buy packs if low; upgrade plan if locked."},{id:"rec-plan",name:"Membership",url:"/recruiter-plan",who:"Recruiters choosing Starter, Growth, or Elite.",what:"Plan page for hiring membership (posts, views, contacts, AI tool unlocks, monthly AI credits) and AI credit packs.",how:"Pick Growth for more posts, contacts, and 30 credits. Pick Elite for unlimited access, Elite AI tools, and 120 credits. Or buy credit packs only.",when:"When Starter limits block hiring, credits run out, or you need Elite AI tools.",notes:"Buying AI credits alone does not unlock Growth/Elite tools.",moreWhat:"Membership decides:\n1) Hiring limits (posts, views, contacts)\n2) Which AI tools unlock\n3) Monthly AI credits (5 / 30 / 120)\n\nCredit packs refill the wallet only. They do not upgrade the plan.",moreHow:"1. Open /recruiter-plan.\n2. Compare Starter / Growth / Elite.\n3. Upgrade for tool unlocks + more monthly credits.\n4. Or buy packs if you only need more AI runs this month."},{id:"rec-messages",name:"Messages",url:"/recruiter/messages",who:"Recruiters chatting with teachers (when messaging is on).",what:"Chat with candidates about jobs, documents, and interview timing.",how:"Open a chat from Pipeline or applicants → send next steps clearly.",when:"When you are talking to shortlisted teachers."},{id:"rec-profile",name:"Hiring Profile (edit)",url:"/recruiter-profile-update",who:"Recruiters updating school details.",what:"School name, place, and hiring profile info teachers see before they apply.",how:"Keep school name and location correct → save. Complete profiles get more teacher trust.",when:"After signup, and when school details change."},{id:"rec-view-profile",name:"View recruiter profile",url:"/recruiter/view-profile",who:"Recruiters checking how teachers see their school.",what:"Preview of your public hiring profile.",how:"Check missing info → edit profile → check again before posting jobs.",when:"Before a hiring campaign."},{id:"rec-interview",name:"Interview meeting room",url:"/meeting/interview/[requestId]",who:"Recruiters and teachers joining an interview.",what:"Meeting page for a scheduled interview request.",how:"Open the link on time → allow camera/mic → start interview. Make sure both sides got the invite.",when:"At the interview time."},{id:"rec-shop",name:"Shop",url:"/shop",who:"Recruiters buying hiring resources.",what:"Store for kits and tools. Separate from membership plans.",how:"Buy what you need → open Orders for access and invoice.",when:"When you need a kit, not a plan change."},{id:"rec-settings",name:"Settings",url:"/settings",who:"Any signed-in recruiter.",what:"Account settings page for preferences and basic account controls.",how:"Update preferences. Logout when done on a shared computer.",when:"When you need account changes."}]},{id:"rec-plans",title:"Plans (what each tier unlocks)",lead:"Simple limits for Starter, Growth, and Elite — including AI credits.",tabs:[{id:"rec-plan-starter",name:"Starter plan",url:"/recruiter-plan#starter",who:"New schools trying hiring first.",what:"Free: 1 job post, 5 profile views, 5 AI credits each month. Hiring Score only (free). Phone/email often hidden.",how:"Post one job and try the flow. Use Hiring Score for free. Upgrade when you need more posts, contacts, or AI review tools.",when:"Trial / first hire.",notes:"Good for testing TeachConnect before paying.",moreWhat:"Starter plan in simple words:\n• 1 job post\n• 5 profile views\n• 5 AI credits each month\n• Hiring Score is free (0 credits)\n• Growth/Elite AI tools are locked\n\nCredits on Starter are mainly for trying light AI once you unlock a Growth+ tool later — or for future paid AI actions available to your tier.",moreHow:"1. Confirm Starter on /recruiter-plan.\n2. Open /recruiter/ai-hub for balance and Hiring Score.\n3. Post your one job carefully.\n4. Upgrade to Growth when you need Job Review (2 credits) or Outreach Scripts (2 credits)."},{id:"rec-plan-growth",name:"Growth plan",url:"/recruiter-plan#growth",who:"Schools hiring for more than one role.",what:"5 posts/month, unlimited profile views, full contacts, Job Review + Outreach Scripts, 30 AI credits each month.",how:"Buy Growth → post jobs → run AI Job Review / Outreach Scripts (2 credits each) → buy more credits if needed.",when:"Normal multi-role hiring months.",notes:"Best everyday plan for most schools.",moreWhat:"Growth plan in simple words:\n• 5 job posts per month\n• Unlimited profile views + full contacts\n• 30 AI credits each month\n• Unlocks: Job Post Review (2 credits), Outreach Script (2 credits)\n• Still locked: Candidate Compare (4) and Interview Kit (3) — need Elite",moreHow:"1. Buy Growth on /recruiter-plan.\n2. Check 30 credits on /recruiter/ai-hub.\n3. Before publishing, run Job Review on the job text (2 credits).\n4. Use Outreach Script when calling/messaging teachers (2 credits).\n5. If you need Compare Board or Interview Kit, upgrade to Elite."},{id:"rec-plan-elite",name:"Elite plan",url:"/recruiter-plan#elite",who:"Schools that hire a lot or need stronger AI help.",what:"Unlimited posts and views, featured jobs, Compare Board, Interview Kits, 120 AI credits each month.",how:"Upgrade to Elite → use Compare and Interview Kit tools. Ask for Elite Plus from AI Hub if you need managed help.",when:"When you need unlimited hiring access and premium AI tools.",notes:"Choose Elite when Growth limits or missing AI tools slow hiring.",moreWhat:"Elite plan in simple words:\n• Unlimited posts and profile views\n• 120 AI credits each month\n• All Growth AI tools plus:\n  – Candidate Compare Board — 4 credits\n  – Interview Kit — 3 credits\n• Hiring Score still free (0 credits)\n• Job Review / Outreach Script — 2 credits each",moreHow:"1. Buy Elite on /recruiter-plan.\n2. Open /recruiter/ai-hub and check 120 credits.\n3. Improve jobs with Job Review before publish.\n4. Shortlist with Compare Board.\n5. Build Interview Kit before panel day.\n6. If credits finish, buy a pack — Elite tools stay unlocked."}]},{id:"rec-credits",title:"AI credits — where and how to use",lead:"Clear guide: credits by hiring plan, where schools spend them, and simple c
1osts. Buying credits does not change Starter / Growth / Elite.",tabs:[{id:"rec-credits-overview",name:"Recruiter AI credits (overview)",url:"/recruiter/ai-hub",who:"Any school recruiter who uses hiring AI tools.",what:"AI credits power hiring AI. Plans include: Starter 5, Growth 30, Elite 120 credits each month. Extra packs can be bought anytime.",how:"Open AI Hiring Hub to see balance → open a tool you are allowed to use → confirm cost → run it.",when:"Before Job Review, Outreach Script, Compare Board, or Interview Kit.",notes:"Job post counts and profile-view limits are separate from AI credits.",moreWho:"Hiring accounts (recruiters / schools) use this wallet. Teachers have a separate jobseeker credit wallet. Do not mix the two.",moreWhat:"Monthly included credits by hiring plan:\n• Starter — 5 credits\n• Growth — 30 credits\n• Elite — 120 credits\n\nHiring Score costs 0 credits on every plan.\nMost useful tools cost 2–4 credits and may also need Growth or Elite membership.",moreHow:"1. Go to /recruiter/ai-hub.\n2. Read your plan + credit balance.\n3. Use only tools unlocked for your plan.\n4. Confirm the credit popup.\n5. Buy a pack if balance is low — or upgrade plan if the tool is locked.",moreNotes:"Buying credit packs adds credits only. It does not upgrade Starter → Growth → Elite. Locked tools still need the higher plan."},{id:"rec-credits-where",name:"Where recruiters can use credits",url:"/recruiter/ai-hub",who:"Recruiters spending hiring AI credits.",what:"Main places: AI Hiring Hub, Post Job (Job Review), Candidates / Pipeline (compare & kits), and outreach scripts for calling.",how:"Open the page → run the AI action → confirm credits → use the result in hiring.",when:"While writing jobs, shortlisting teachers, preparing interviews, or planning outreach.",moreWhat:"Where to spend recruiter AI credits:\n\n1) AI Hiring Hub — /recruiter/ai-hub\n   • See balance and history\n   • Hiring Score (0 credits, all plans)\n   • Job Review, Outreach Script, Compare, Interview Kit (by plan)\n   • Buy more credits\n\n2) Post Job / Edit Job — /recruiter/post-job and /recruiter/update-job/[title]\n   • AI Job Post Review (Growth+, 2 credits)\n\n3) Candidates / Pipeline — /recruiter/brand-applicants and /recruiter/my-jobseekers\n   • Candidate Compare Board (Elite, 4 credits)\n   • Interview Kit (Elite, 3 credits)\n\n4) Outreach\n   • Calling / WhatsApp script from AI Hub (Growth+, 2 credits)",moreHow:"Easy path:\n1. Check balance on AI Hiring Hub.\n2. Writing a job → Job Review first.\n3. Shortlisting → Compare Board (Elite).\n4. Interview day → Interview Kit (Elite).\n5. Calling teachers → Outreach Script (Growth+)."},{id:"rec-credits-costs",name:"Recruiter credit costs (simple list)",url:"/recruiter/ai-hub",who:"Recruiters who want clear costs before spending.",what:"Hiring Score 0. Job Review 2 (Growth+). Outreach Script 2 (Growth+). Interview Kit 3 (Elite). Candidate Compare 4 (Elite).",how:"Read the cost on the tool button. If the tool is locked, upgrade plan. If balance is low, buy credits.",when:"Every time before running hiring AI.",moreWhat:"Simple cost sheet:\n\n0 credits (all plans)\n• Hiring Score\n\n2 credits (needs Growth or Elite)\n• AI Job Post Review\n• AI Outreach / calling script\n\n3 credits (needs Elite)\n• Structured Interview Kit\n\n4 credits (needs Elite)\n• Candidate Comparison Board\n\nRemember: plan unlocks the tool; credits pay for each run.",moreHow:"1. Confirm your plan can use the tool.\n2. Confirm you have enough credits.\n3. Run once with a real job/candidate — do not burn credits on empty tests.\n4. Save or copy the AI output into your hiring notes."},{id:"rec-credits-buy",name:"Buy extra recruiter credits",url:"/recruiter-plan",who:"Recruiters whose monthly credits finished.",what:"Buy credit packs without changing Starter / Growth / Elite. Packs refill the same hiring AI wallet.",how:"Open Membership or AI Hiring Hub → choose a credit pack → pay → continue Job Review / Compare / Interview Kit.",when:"When monthly credits are low during an active hiring drive.",notes:"Credit packs do not unlock Elite tools on Starter/Growth. Upgrade the plan for that.",moreWhat:"Use credit packs when monthly credits are finished but your hiring drive is still on.\n\nExample: Growth has 30 credits. After many Job Reviews and scripts, buy a pack to keep going without waiting for next month.\n\nIf Compare Board or Interview Kit is locked, upgrade to Elite first — packs will not unlock them.",moreHow:"1. Open /recruiter-plan or /recruiter/ai-hub.\n2. Choose AI credits / pack.\n3. Pay.\n4. Return to the hiring tool and run again."}]}]},{id:"homeroom",label:"Homeroom",intro:"School ERP Command Center for school staff (/pcc). Platform admins oversee schools from /admin/homeroom — not these tabs.",groups:[{id:"hr-school",title:"School",lead:"Core roster — available from Starter school tier.",tabs:[{id:"hr-overview",name:"Overview",url:"/pcc#overview",
1who:"Principal / school admin.",what:"Command Center home — school at a glance.",how:"Start here daily for alerts and counts.",when:"Every login."},{id:"hr-admissions",name:"Admissions",url:"/pcc#admissions",who:"Front office.",what:"New student admission pipeline.",how:"Capture inquiry → convert to enrolled student.",when:"Admission season and walk-ins."},{id:"hr-students",name:"Students",url:"/pcc#students",who:"Office / academic coordinators.",what:"Student master records.",how:"Search, edit, assign class/section.",when:"Ongoing student data work."},{id:"hr-faculty",name:"Faculty",url:"/pcc#faculty",who:"Principal / HR.",what:"Teacher staff directory.",how:"Add teachers, assign subjects/classes.",when:"Staffing changes."},{id:"hr-classes",name:"Classes",url:"/pcc#classes",who:"Academic coordinators.",what:"Class/section structure.",how:"Define grades, sections, strength.",when:"Year start setup."}]},{id:"hr-academics",title:"Academics",lead:"Timetable through lessons. Lesson Plans need Premium school tier.",tabs:[{id:"hr-timetable",name:"WeekWise",url:"/pcc#timetable",who:"Timetable builders.",what:"Build/adjust school timetable.",how:"Set periods/teachers/rules → generate → publish.",when:"Before term and mid-term swaps."},{id:"hr-attendance",name:"Attendance",url:"/pcc#attendance",who:"Teachers / class teachers.",what:"Daily attendance marking.",how:"Mark present/absent per period/day.",when:"Every school day."},{id:"hr-exams",name:"Exams & Report Cards",url:"/pcc#exams",who:"Exam cell.",what:"Assessments and report cards.",how:"Create exam → enter marks → publish cards.",when:"Exam cycles."},{id:"hr-homework",name:"Homework",url:"/pcc#homework",who:"Teachers.",what:"Assign and track homework.",how:"Create assignment → class sees it in portal.",when:"Daily teaching workflow."},{id:"hr-lessons",name:"Lesson Plans",url:"/pcc#lessons",who:"Teachers on Premium+ school tier.",what:"AI-assisted lesson planning inside Homeroom.",how:"Generate within school AI quota.",when:"Lesson prep on Premium school plan.",notes:"Minimum school tier: Premium."}]},{id:"hr-more",title:"Finance, operations, people, intelligence",lead:"Higher school tiers unlock more modules.",tabs:[{id:"hr-fees",name:"Fees & Payments",url:"/pcc#fees",who:"Accounts (Growth+).",what:"Fee structures, collections, dues.",how:"Define fee heads → collect → track dues.",when:"Fee cycles."},{id:"hr-comms",name:"Notices & Messaging",url:"/pcc#communications",who:"Office (Starter+).",what:"Announcements to parents/teachers/students.",how:"Compose notice → send to audience.",when:"Circulars and alerts."},{id:"hr-transport",name:"Transport & GPS",url:"/pcc#transport",who:"Transport in-charge (Growth+).",what:"Routes, buses, optional GPS.",how:"Define routes/stops → assign students.",when:"Transport operations."},{id:"hr-hr",name:"HR & Payroll",url:"/pcc#hr",who:"HR (Growth+).",what:"Staff HR and payroll workflows.",how:"Maintain staff → run payroll if entitled.",when:"Salary cycles."},{id:"hr-insights",name:"Insights",url:"/pcc#insights",who:"Leadership (Premium+).",what:"Analytics for attendance, fees, academics.",how:"Review KPIs in leadership meetings.",when:"Leadership reviews."},{id:"hr-settings",name:"Settings & Access",url:"/pcc#settings",who:"School admins (Starter+).",what:"School config and staff module access.",how:"Invite staff → assign roles → configure prefs.",when:"Setup and staff changes."}]}]}],T="tc_admin_feature_map_overrides_v1",E=[{key:"free",name:"Free",credits:3},{key:"basic",name:"Basic",credits:25},{key:"premium",name:"Premium",credits:72}],N=[{key:"starter",name:"Starter",credits:5},{key:"growth",name:"Growth",credits:30},{key:"elite",name:"Elite",credits:120}],H=["/jobseeker/ai-hub","/resumes/ai-builder","/jobseeker/career-score","/jobseeker/job-match","/jobseeker/demo-prep","/jobseeker/resume-tailor"],O=["/recruiter/ai-hub","/recruiter/hiring-score","/recruiter/job-review","/recruiter/outreach","/recruiter/interview-kit","/recruiter/compare"];function W(e){return String(e||"").split("\xb7")[0].trim().split("?")[0].replace(/\/+$/,"")||"/"}function B(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:8,r=String(e||"").trim();if(!r)return[];let a=r.split(/(?:→|;|\n|•|\u2022|(?<=\.)\s+(?=[A-Z]))/).map(e=>e.replace(/^\d+\.\s*/,"").trim()).filter(e=>e.length>12&&e.length<180),o=[];for(let e of a)if(!o.some(t=>t.toLowerCase()===e.toLowerCase())&&(o.push(e),o.length>=t))break;return o}function $(e,t,r,a){var o;let n,i,s=x(e.how||e.moreHow||""),l=Object.fromEntries(["who","what","how","when","notes"].map(t=>[t,function(e,t){let r="who"===t?e.moreWho:"what"===t?e.moreWhat:"how"===t?e.moreHow:"when"===t?e.moreWhen:e.moreNotes;if(String(r||"").trim())return String(r).trim();let a=String(("notes"===t?e.notes:e[t])||"").trim();if(!a&&"notes"===t)return"";let o=e.name||"this screen",n=e.url||"";return"who"===t?[`Clearer answer — who should open “${o}”:`,a||"People who need this screen for their work.","","If you are not in that group, you may 
1not see this tab in navigation, or some buttons may stay hidden.",n?`Remember this URL: ${n}`:""].filter(Boolean).join("\n"):"what"===t?[`What “${o}” does, in plain words:`,a||"This page supports one main product job.","","Use this screen for that job only. Open other tabs when you need a different task.",n?`Open it at: ${n}`:""].filter(Boolean).join("\n"):"how"===t?[`How to use “${o}” — step by step:`,...x(a||"Open the page and follow the on-screen actions."),"","Finish one step before the next. If something fails, refresh once, then check your plan or role access.",n?`Page: ${n}`:""].filter(Boolean).join("\n"):"when"===t?[`When to open “${o}”:`,a||"Whenever this screen is part of your workflow.","","Make it a habit (for example start of day, or right after a related action) so important work is not missed.",n?`Bookmark if you open it often: ${n}`:""].filter(Boolean).join("\n"):[`Extra tip for “${o}”, explained more clearly:`,a,"","Keep this tip in mind every time you use this screen.",n?`URL: ${n}`:""].filter(Boolean).join("\n")}(e,t)]));return{id:e.id,name:e.name,url:e.url,areaId:t.id,areaLabel:t.label,groupId:r,groupTitle:a,purpose:String(e.what||"").trim()||`Use ${e.name} for its main product job.`,audience:String(e.who||"").trim()||"People who need this screen for their work.",whenToUse:String(e.when||"").trim()||"Whenever this screen is part of your workflow.",steps:s.length?s:["1. Open the page and follow the on-screen actions."],features:(n=B(e.notes||"",4),(i=[...B(e.what||"",4),...B(e.how||"",4),...n]).length?i.slice(0,8):[`Open ${e.url||"this page"} to use the main actions on screen.`,"Follow the labels and buttons — each screen is built for one clear job."]),related:function(e,t,r){var a;let o=W(e.url),n=(null==(a=t.groups.find(e=>e.id===r))?void 0:a.tabs.filter(t=>t.id!==e.id).slice(0,4).map(e=>({name:e.name,url:e.url})))||[],i=[];"jobseeker"===t.id?i.push({name:"Jobseeker plans",url:"/jobseeker-plan"},{name:"AI Hub",url:"/jobseeker/ai-hub"},{name:"Dashboard",url:"/jobseeker/dashboard"}):"recruiter"===t.id?i.push({name:"Recruiter plans",url:"/recruiter-plan"},{name:"AI Hub",url:"/recruiter/ai-hub"},{name:"Dashboard",url:"/recruiter/dashboard"}):"admin"===t.id?i.push({name:"Feature Map",url:"/admin/feature-map"},{name:"Admin Role Access",url:"/admin/access"},{name:"CRM",url:"/admin/crm"}):"crm"===t.id&&i.push({name:"CRM home",url:"/admin/crm"},{name:"Emails & WhatsApp",url:"/admin/emails"},{name:"WhatsApp Hub",url:"/admin/whatsapp-hub"});let s=[],l=new Set;for(let e of[...n,...i]){let t=W(e.url);if(!(!t||t===o||l.has(t))&&(l.add(t),s.push(e),s.length>=6))break}return s}(e,t,r),plans:function(e,t,r){let a=W(t).toLowerCase(),o=`${r.name} ${r.what} ${r.how} ${r.notes||""}`.toLowerCase();if("admin"===e||"crm"===e)return[{name:"Admin access",available:!0,note:"Shown only to admins whose role includes this tab (see Admin Role Access)."}];if("homeroom"===e||a.startsWith("/homeroom")||a.startsWith("/pcc"))return[{name:"Homeroom school account",available:!0,note:"Available to schools using TeachConnect Homeroom."}];if("jobseeker"===e||a.includes("jobseeker")||a.startsWith("/jobs")||a.startsWith("/resumes")){let e=/premium|tailor|job-match|demo-prep|unlimited/.test(o)||/resume-tailor|job-match|demo-prep/.test(a),t=/basic|watermark|export|pdf|apply/.test(o)||e;return E.map(r=>"free"===r.key?{name:`${r.name} (${r.credits} AI credits / month)`,available:!e,note:e?"Upgrade to Premium for this AI tool.":"Included on Free with plan limits."}:"basic"===r.key?{name:`${r.name} (${r.credits} AI credits / month)`,available:t||!e,note:e?"Premium required for this tool.":"Included on Basic."}:{name:`${r.name} (${r.credits} AI credits / month)`,available:!0,note:"Full jobseeker AI access on Premium."})}if("recruiter"===e||a.includes("recruiter")||a.includes("hire")){let e=/elite|compare|interview-kit|unlimited posts/.test(o)||/compare|interview-kit/.test(a),t=/growth|outreach|job-review|contact/.test(o)||e;return N.map(r=>"starter"===r.key?{name:`${r.name} (${r.credits} AI credits / month)`,available:!t&&!e,note:t||e?"Upgrade to Growth or Elite.":"Included on Starter with limits."}:"growth"===r.key?{name:`${r.name} (${r.credits} AI credits / month)`,available:!e,note:e?"Elite required for this tool.":"Included on Growth."}:{name:`${r.name} (${r.credits} AI credits / month)`,available:!0,note:"Full recruiter AI access on Elite."})}return[{name:"Signed-in TeachConnect users",available:!0,note:"Availability depends on role and login."}]}(t.id,e.url,e),credits:function(e,t,r){let a=W(t).toLowerCase(),o=`${r.name} ${r.what} ${r.how} ${r.notes||""} ${r.moreWhat||""}`.toLowerCase();if("admin"===e||"crm"===e)return{summary:"No member AI credits — this is an admin tool.",lines:["Admin and CRM screens do not spend jobseeker or recruiter AI credits.","WhatsApp templates / SMS may charge the Fast2SMS wallet when you send."]};if(/credit|ai hub|ai-builder|tailor|job-match|demo-prep|hiring-score|outreach|compare|interview/.test(o+a)){if("jobseeker"===e||H.some(e=>a.startsWith(e)||a.includes(e.replace("/jobseeker/",""))))return{summary:"Jobseeker AI credits: Free 3 \xb7 Basic 25 \xb7 Premium 72 each month.",lines:["Career Score & Health Scan usually cost 0 credits (check the button before you run).","Simple rewrites / PDF / share links usually cost 1 credit.","Job Match & Demo Prep usually cost 2 credits (Premium).","Resume Tailor usually costs 3 credits (Premium).","Teaching tools often cost 1–3+ credits each — the screen shows the cost before you confirm.","Buying credit packs adds credits only; it does not change your plan name."]};
1if("recruiter"===e||O.some(e=>a.includes(e.split("/").pop()||"")))return{summary:"Recruiter AI credits: Starter 5 \xb7 Growth 30 \xb7 Elite 120 each month.",lines:["Hiring Score usually costs 0 credits.","Job Review and Outreach usually cost 2 credits (Growth+).","Interview Kit usually costs 3 credits (Elite).","Compare Board usually costs 4 credits (Elite).","The AI Hub shows remaining credits and pack purchase options."]}}if(String(r.id||"").includes("credits")||String(r.id||"").includes("plan")){if("jobseeker"===e)return{summary:"Monthly AI credits by plan: Free 3 \xb7 Basic 25 \xb7 Premium 72.",lines:["Credits refresh with your plan cycle.","Packs (1 / 5 / 10 / 20 / 50 / 100) top up without changing Free / Basic / Premium."]};if("recruiter"===e)return{summary:"Monthly AI credits by plan: Starter 5 \xb7 Growth 30 \xb7 Elite 120.",lines:["Credits refresh with your plan cycle.","Packs top up credits without changing Starter / Growth / Elite."]}}return{summary:"Usually no AI credits for this page.",lines:["Browsing, applying, posting jobs, and profile edits generally do not spend AI credits.","AI tools show the credit cost on the button before you run them."]}}(t.id,e.url,e),tip:String(e.notes||"").trim(),more:l,sourceLabel:(o=t.id,"auto-discovered"===r||e.id.startsWith("auto:")?"Auto-discovered page":"admin"===o?"Admin catalog (live tabs)":"crm"===o?"CRM catalog (live views)":String(e.id||"").includes("credits")||String(e.id||"").includes("plan")?"Plans & AI credits guide":"Product documentation")}}let D="tc_admin_feature_map_explored_v1",G={jobseeker:{label:"Jobseeker",blurb:"The teacher side"},recruiter:{label:"Recruiter",blurb:"Schools that hire"},admin:{label:"Admin",blurb:"This console"},crm:{label:"CRM",blurb:"The sales desk"},homeroom:{label:"Homeroom",blurb:"School software"},product:{label:"More pages",blurb:"Everything else"}};function U(e){return String(e||"").trim().toLowerCase()}function J(e,t,r){return!r||(t.haystacks.get(e.id)||`${e.name} ${e.url}`.toLowerCase()).includes(r)}function L(e,t){if(!e)return{done:0,total:0};let r=0,a=0;for(let o of e.groups)for(let e of o.tabs)a+=1,t.has(e.id)&&(r+=1);return{done:r,total:a}}let q={jobseeker:f.A,recruiter:b.A,admin:g.A,crm:y.A,homeroom:k.A,product:v.A},K=[[100,70],[300,130],[500,70],[700,130],[900,70],[1100,130]],Y="M100 70 C200 70 200 130 300 130 C400 130 400 70 500 70 C600 70 600 130 700 130 C800 130 800 70 900 70 C1000 70 1000 130 1100 130";function z(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:900,[r,a]=(0,o.useState)(0);return(0,o.useEffect)(()=>{var r,o;if(null==(r=(o=window).matchMedia)?void 0:r.call(o,"(prefers-reduced-motion: reduce)").matches)return void a(e);let n=0,i=performance.now(),s=r=>{let o=Math.min(1,(r-i)/t);a(Math.round(e*(1-Math.pow(1-o,3)))),o<1&&(n=requestAnimationFrame(s))};return n=requestAnimationFrame(s),()=>cancelAnimationFrame(n)},[e,t]),r}function Q(e){let{areas:t,activeId:r,onPick:o,hitCounts:n,searching:s,explored:l,totalTabs:c,updatedAt:d,editsOn:h,ticker:u}=e,m=z(t.length,600),w=z(c,1100),[f,b]=K[Math.min(Math.max(0,t.findIndex(e=>e.id===r)),K.length-1)],g=new Date(d),y=Number.isNaN(g.getTime())?"":g.toLocaleDateString("en-IN",{day:"numeric",month:"short"});return(0,a.jsxs)("header",{className:p().atlas,children:[(0,a.jsxs)("div",{className:p().atlasHead,children:[(0,a.jsxs)("span",{className:p().atlasBrand,children:[(0,a.jsx)(i.A,{"aria-hidden":"true"}),"Feature atlas"]}),(0,a.jsxs)("span",{className:p().stat,children:[(0,a.jsx)("strong",{children:m})," districts"]}),(0,a.jsxs)("span",{className:p().stat,children:[(0,a.jsx)("strong",{children:w})," pages mapped"]}),y?(0,a.jsxs)("span",{className:p().stat,children:[(0,a.jsx)("strong",{children:y})," last scan"]}):null,(0,a.jsxs)("span",{className:`${p().status} ${h?p().statusEdits:""}`,children:[(0,a.jsx)("i",{"aria-hidden":"true"}),h?"Local edits on":"Live catalog"]}),u?(0,a.jsxs)("span",{className:p().ticker,role:"status",children:[(0,a.jsx)(j.A,{"aria-hidden":"true"}),u]},u):null]}),(0,a.jsxs)("div",{className:p().stage,role:"group","aria-label":"Districts of the feature map",children:[(0,a.jsxs)("svg",{className:p().routeSvg,viewBox:"0 0 1200 200","aria-hidden":"true",focusable:"false",children:[(0,a.jsx)("path",{className:p().routeGlow,d:Y,pathLength:1}),(0,a.jsx)("path",{id:"fm-route",className:p().routeLine,d:Y,pathLength:1}),[0,1,2].map(e=>{let t=-(16*e)/3;return(0,a.jsxs)("g",{children:[(0,a.jsx)("circle",{className:p().packetTail,r:6,children:(0,a.jsx)("animateMotion",{dur:"16s",repeatCount:"indef
1inite",begin:`${t-.18}s`,children:(0,a.jsx)("mpath",{href:"#fm-route"})})}),(0,a.jsx)("circle",{className:p().packet,r:3.5,children:(0,a.jsx)("animateMotion",{dur:"16s",repeatCount:"indefinite",begin:`${t}s`,children:(0,a.jsx)("mpath",{href:"#fm-route"})})})]},e)}),(0,a.jsxs)("g",{className:p().here,style:{transform:`translate(${f}px, ${b}px)`},children:[(0,a.jsx)("circle",{className:p().hereRing,r:48}),(0,a.jsx)("circle",{className:`${p().hereRing} ${p().hereRing2}`,r:48})]})]}),t.map((e,t)=>{var c;let[d,h]=K[Math.min(t,K.length-1)],u=G[e.id]||{label:e.label,blurb:""},m=q[e.id]||i.A,{done:w,total:f}=L(e,l),b=e.id===r,g=null!=(c=n[e.id])?c:f,y=[p().district,b?p().districtOn:"",s?g?p().districtHits:p().districtQuiet:""].filter(Boolean).join(" "),k={"--i":t,"--sx":`${d/12}%`,"--sy":`${h/2}%`,"--fill":`${f?Math.round(w/f*100):0}%`};return(0,a.jsxs)("button",{type:"button","aria-pressed":b,"aria-controls":"fm-board",className:y,style:k,onClick:()=>o(e.id),title:`${u.label}: ${f} pages, ${w} opened`,children:[(0,a.jsxs)("span",{className:p().districtIcon,children:[(0,a.jsx)(m,{"aria-hidden":"true"}),(0,a.jsx)("span",{className:p().districtCount,children:g})]}),(0,a.jsx)("span",{className:p().districtLabel,children:u.label}),(0,a.jsx)("span",{className:p().districtBlurb,children:s?`${g} ${1===g?"hit":"hits"}`:u.blurb}),(0,a.jsx)("span",{className:p().districtTrail,"aria-hidden":"true",children:(0,a.jsx)("i",{})})]},e.id)})]})]})}var V=r(65231),X=r(94782),Z=r(35393),ee=r(83791),et=r(15089),er=r(92052),ea=r(12095),eo=r(85),en=r(91835),ei=r(64780),es=r(97139),el=r(58324);function ec(e){let{icon:t,heading:r,index:o,wide:n=!1,tone:i="",children:s}=e;return(0,a.jsxs)("div",{className:[p().facet,n?p().facetWide:"",i].filter(Boolean).join(" "),style:{"--i":o},children:[(0,a.jsxs)("div",{className:p().facetHead,children:[(0,a.jsx)(t,{"aria-hidden":"true"}),r]}),s]})}function ed(e){let{guide:t}=e,r=0;return(0,a.jsxs)("div",{className:p().guide,children:[(0,a.jsx)(ec,{icon:X.A,heading:"What this page is for",index:r++,wide:!0,tone:p().purpose,children:(0,a.jsx)("p",{children:t.purpose})}),(0,a.jsx)(ec,{icon:Z.A,heading:"Who can use it",index:r++,children:(0,a.jsx)("p",{children:t.audience})}),(0,a.jsx)(ec,{icon:ee.A,heading:"When to open",index:r++,children:(0,a.jsx)("p",{children:t.whenToUse})}),(0,a.jsx)(ec,{icon:et.A,heading:"How to use it",index:r++,children:(0,a.jsx)("ol",{className:p().steps,children:t.steps.map(e=>(0,a.jsx)("li",{children:e.replace(/^\d+\.\s*/,"")},e))})}),(0,a.jsx)(ec,{icon:er.A,heading:"Features on this page",index:r++,children:(0,a.jsx)("ul",{className:p().bullets,children:t.features.map(e=>(0,a.jsx)("li",{children:e},e))})}),(0,a.jsx)(ec,{icon:ea.A,heading:"Plan-wise availability",index:r++,children:(0,a.jsx)("ul",{className:p().plans,children:t.plans.map(e=>(0,a.jsxs)("li",{className:`${p().plan} ${e.available?p().planYes:""}`,children:[(0,a.jsxs)("span",{className:p().planTag,children:[e.available?(0,a.jsx)(j.A,{"aria-hidden":"true"}):(0,a.jsx)(eo.A,{"aria-hidden":"true"}),e.available?"Yes":"Limited"]}),(0,a.jsxs)("span",{children:[e.name," — ",e.note]})]},e.name))})}),(0,a.jsxs)(ec,{icon:en.A,heading:"Credits — where, how many, why",index:r++,tone:p().facetCredits,children:[(0,a.jsx)("p",{className:p().creditLine,children:t.credits.summary}),(0,a.jsx)("ul",{className:p().bullets,children:t.credits.lines.slice(0,4).map(e=>(0,a.jsx)("li",{children:e},e))})]}),t.related.length?(0,a.jsx)(ec,{icon:ei.A,heading:"Related pages",index:r++,wide:!0,children:(0,a.jsx)("div",{className:p().links,children:t.related.map(e=>(0,a.jsxs)("button",{type:"button",className:p().link,onClick:()=>{let t;!(!(t=String(e.url||"").split("\xb7").map(e=>e.trim()).find(Boolean))||t.startsWith("#"))&&window.open(t,"_blank","noopener,noreferrer")},children:[(0,a.jsxs)("span",{children:[e.name,(0,a.jsx)(es.A,{"aria-hidden":"true"})]}),(0,a.jsx)("code",{children:e.url})]},e.url))})}):null,t.tip?(0,a.jsx)(ec,{icon:el.A,heading:"Extra tip",index:r++,wide:!0,tone:p().facetTip,children:(0,a.jsx)("p",{children:t.tip})}):null,(0,a.jsxs)("span",{className:p().source,children:[(0,a.jsx)(c.A,{"aria-hidden":"true"}),t.sourceLabel]})]})}let eh=[{key:"name",label:"Name",long:!1},{key:"url",label:"URL",long:!1},{key:"who",label:"Who can use it",long:!1},{key:"what",label:"What this page is for",long:!0},{key:"how",label:"How to use (steps)",long:!0},{key:"when",label:"When to open",long:!0},{key:"notes",label:"Extra tip",long:!0}];function eu(e){let{tab:t,onPatch:r}=e;return(0,a.jsx)("div",{className:p().editGrid,children:eh.map(e=>{let{key:o,label:n,long:i}=e;return(0,a.jsxs)("label",{className:`${p().field} ${i?p().fieldWide:""}`,children:[(0,a.jsx)("span",{children:n}),i?(0,a.jsx)("textarea",{className:p().fieldArea,value:t[o]||"",onChange:e=>r(t.id,o,e.target.value)}):(0,a.jsx)("input",{className:p().fieldInput,value:t[o]||"",onChange:e=>r(t.id,o,e.target.value)})]},o)})})}function ep(e){let{text:t,query:r}=e,o=function(e,t){let r=String(e||""),a=U(t);if(!a||!r)return[{text:r,hit:!1}];let o=r.toLowerCase(),n=[],i=0,s=o.indexOf(a);for(;-1!==s;)s>i&&n.push({text:r.slice(i,s),hit:!1}),n.push({text:r.slice(s,s+a.length),hit:!0}),i=s+a.length,s=o.indexOf(a,i);return i<r.length&&n.push({text:r.slice(i),hit:!1}),n}(t,r);return(0,a.jsx)(a.Fragment,{children:o.map((e,t)=>e.hit?(0,a.jsx)("mark",{children:e.text},t):(0,a.jsx)("span",{children:e.text},t))})}function em(e){let{entry:t,index:r,open:n,seen:i,editing:s,query:l,onToggle:c,onPatch:d}=e,{tab:h,guide:u}=t,m=(0,o.useId)(),w=[p().station,n?p().stationOpen:"",i?p().stationSeen:""].filter(
1Boolean).join(" ");return(0,a.jsx)("li",{className:w,style:{"--i":r},"data-station":h.id,children:(0,a.jsxs)("article",{className:p().stationCard,children:[(0,a.jsxs)("button",{type:"button",className:p().stationTop,"aria-expanded":n,"aria-controls":m,onClick:()=>c(h.id),children:[(0,a.jsx)("span",{className:p().stationDot,"aria-hidden":"true",children:(0,a.jsx)("i",{})}),(0,a.jsxs)("span",{className:p().stationText,children:[(0,a.jsx)("span",{className:p().stationName,children:(0,a.jsx)(ep,{text:u.name,query:l})}),(0,a.jsx)("code",{className:p().stationUrl,children:(0,a.jsx)(ep,{text:u.url,query:l})})]}),(0,a.jsx)("span",{className:p().stationMore,"aria-hidden":"true",children:(0,a.jsx)(V.A,{})})]}),n?(0,a.jsx)("div",{className:p().stationBody,id:m,children:(0,a.jsx)("div",{className:p().stationInner,children:s?(0,a.jsx)(eu,{tab:h,onPatch:d}):(0,a.jsx)(ed,{guide:u})})}):null]})})}function ew(e){let{route:t,index:r,openIds:o,explored:n,editing:i,query:s,onToggle:l,onPatch:c}=e;return(0,a.jsxs)("section",{className:p().route,style:{"--i":r},"aria-label":t.title,children:[(0,a.jsxs)("div",{className:p().routeHead,children:[(0,a.jsx)("span",{className:p().routeMark,"aria-hidden":"true",children:r+1}),(0,a.jsx)("h2",{className:p().routeName,children:t.title}),(0,a.jsx)("span",{className:p().routeTally,children:t.entries.length})]}),t.lead?(0,a.jsx)("p",{className:p().routeBlurb,children:t.lead}):null,(0,a.jsx)("ol",{className:p().stations,children:t.entries.map((e,t)=>(0,a.jsx)(em,{entry:e,index:t,open:o.has(e.tab.id),seen:n.has(e.tab.id),editing:i,query:s,onToggle:l,onPatch:c},e.tab.id))})]})}var ef=r(3033),eb=r(53757),eg=r(58429),ey=r(77970),ek=r(81332),ev=r(20967),ej=r(29985),eA=r(29010),e_=r(48186);function eS(e){let{query:t,onQuery:r,hits:n,onExpand:i,onCollapse:l,onSurprise:c,onMarkdown:d,onJson:h,canEdit:u,editing:m,onToggleEdit:w,onDownloadEdits:f,onImport:b,onReset:g}=e,y=(0,o.useRef)(null),k=(0,o.useRef)(null);return(0,o.useEffect)(()=>{let e=e=>{var t,r;"/"!==e.key||e.metaKey||e.ctrlKey||e.altKey||function(e){if(!e)return!1;let t=e.tagName;return"INPUT"===t||"TEXTAREA"===t||"SELECT"===t||e.isContentEditable}(e.target)||(e.preventDefault(),null==(t=y.current)||t.focus(),null==(r=y.current)||r.select())};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[]),(0,a.jsxs)("div",{className:p().tools,children:[(0,a.jsxs)("label",{className:p().searchBox,children:[(0,a.jsx)(ef.A,{"aria-hidden":"true"}),(0,a.jsx)("input",{ref:y,className:p().searchInput,type:"search",value:t,onChange:e=>r(e.target.value),onKeyDown:e=>{"Escape"===e.key&&t&&(e.preventDefault(),r(""))},placeholder:"Search a page, URL, plan or credit…","aria-label":"Search the feature map",autoComplete:"off",spellCheck:!1}),t?(0,a.jsxs)(a.Fragment,{children:[null!==n?(0,a.jsxs)("span",{className:p().searchHits,"aria-live":"polite",children:[n," ",1===n?"page":"pages"]}):null,(0,a.jsx)("button",{type:"button",className:p().searchClear,onClick:()=>r(""),"aria-label":"Clear search",children:(0,a.jsx)(eb.A,{"aria-hidden":"true"})})]}):(0,a.jsx)("kbd",{className:p().searchKey,"aria-hidden":"true",children:"/"})]}),(0,a.jsxs)("button",{type:"button",className:`${p().tool} ${p().toolPrimary}`,onClick:c,children:[(0,a.jsx)(eg.A,{"aria-hidden":"true"}),"Surprise me"]}),(0,a.jsxs)("button",{type:"button",className:p().tool,onClick:i,children:[(0,a.jsx)(ey.A,{"aria-hidden":"true"}),"Expand all"]}),(0,a.jsxs)("button",{type:"button",className:p().tool,onClick:l,children:[(0,a.jsx)(ek.A,{"aria-hidden":"true"}),"Collapse all"]}),(0,a.jsx)("span",{className:p().toolGap,"aria-hidden":"true"}),(0,a.jsxs)("button",{type:"button",className:p().tool,onClick:d,children:[(0,a.jsx)(ev.A,{"aria-hidden":"true"}),"Markdown"]}),(0,a.jsxs)("button",{type:"button",className:p().tool,onClick:h,children:[(0,a.jsx)(ej.A,{"aria-hidden":"true"}),"JSON"]}),u?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("span",{className:p().toolGap,"aria-hidden":"true"}),(0,a.jsxs)("button",{type:"button",className:`${p().tool} ${m?p().toolOn:""}`,onClick:w,"aria-pressed":m,children:[(0,a.jsx)(s.A,{"aria-hidden":"true"}),m?"Done editing":"Edit text"]}),(0,a.jsxs)("button",{type:"button",className:p().tool,onClick:f,children:[(0,a.jsx)(ej.A,{"aria-hidden":"true"}),"Download edits"]}),(0,a.jsxs)("button",{type:"button",className:p().tool,onClick:()=>{var e;
1return null==(e=k.current)?void 0:e.click()},children:[(0,a.jsx)(eA.A,{"aria-hidden":"true"}),"Import JSON"]}),(0,a.jsxs)("button",{type:"button",className:p().tool,onClick:g,children:[(0,a.jsx)(e_.A,{"aria-hidden":"true"}),"Reset edits"]}),(0,a.jsx)("input",{ref:k,className:p().fileInput,type:"file",accept:"application/json,.json",onChange:e=>{var t;let r=null==(t=e.target.files)?void 0:t[0];e.target.value="",r&&b(r)}})]}):null]})}var ex=r(77467);function eI(e){try{let t=localStorage.getItem(e);return t?JSON.parse(t):null}catch{return null}}function eC(e,t){try{null===t?localStorage.removeItem(e):localStorage.setItem(e,JSON.stringify(t))}catch{}}function eM(e,t,r){let a=new Blob([t],{type:r}),o=URL.createObjectURL(a),n=document.createElement("a");n.href=o,n.download=e,document.body.appendChild(n),n.click(),n.remove(),URL.revokeObjectURL(o)}function eP(){return new Date().toISOString().slice(0,10)}function eF(){var e,t;(0,ex.E$)();let r=(0,n.useRouter)(),[d,u]=(0,o.useState)(!1),[f,b]=(0,o.useState)(!1),[g,y]=(0,o.useState)(!1),[k,v]=(0,o.useState)("jobseeker"),[j,x]=(0,o.useState)(()=>new Set),[H,O]=(0,o.useState)(""),[W,B]=(0,o.useState)(""),G=(0,o.useRef)(null),{overrides:q,persist:K,patchTab:Y}=function(){let[e,t]=(0,o.useState)(null);return(0,o.useEffect)(()=>{let e=eI(T);(null==e?void 0:e.version)===1&&t(e)},[]),{overrides:e,persist:(0,o.useCallback)(e=>{t(e),eC(T,e&&(Object.keys(e.tabs||{}).length>0||Array.isArray(e.areas)&&e.areas.length>0)?e:null)},[]),patchTab:(0,o.useCallback)((e,r,a)=>{t(t=>{var o,n;let i={version:1,updatedAt:new Date().toISOString(),tabs:{...(null==t?void 0:t.tabs)||{},[e]:{...(null==t||null==(o=t.tabs)?void 0:o[e])||{},[r]:a}},...(null==t||null==(n=t.areas)?void 0:n.length)?{areas:t.areas}:{}};return eC(T,i),i})},[])}}(),{explored:z,markExplored:V}=function(){let[e,t]=(0,o.useState)(()=>new Set);return(0,o.useEffect)(()=>{let e=eI(D);Array.isArray(e)&&t(new Set(e.filter(e=>"string"==typeof e)))},[]),{explored:e,markExplored:(0,o.useCallback)(e=>{t(t=>{if(t.has(e))return t;let r=new Set(t);return r.add(e),eC(D,Array.from(r)),r})},[])}}();(0,o.useEffect)(()=>{fetch("/api/admin/gate").then(e=>e.json()).then(e=>{if(!(null==e?void 0:e.ok))return void r.replace("/admin/login");u(!0);let t=String(e.role||"");b("super"===t||!!e.fullAccess||"owner"===t||"developer"===t)}).catch(()=>r.replace("/admin/login"))},[r]),(0,o.useEffect)(()=>()=>{G.current&&window.clearTimeout(G.current)},[]);let X=(0,o.useMemo)(()=>{let e,t,r,a,o,n;return n=[(e=Object.fromEntries(R.map(e=>[e.id,e]))).jobseeker,e.recruiter,(t=Object.fromEntries(A.wB.map(e=>[e.key,e])),r=new Set,a=I.map(e=>{let a=e.keys.map(e=>t[e]).filter(Boolean).map(e=>(r.add(e.key),M(e)));return{id:e.id,title:e.title,lead:e.lead,tabs:a}}),(o=A.wB.filter(e=>!r.has(e.key)).map(M)).length&&a.push({id:"more",title:"More",lead:"Admin tabs not listed in the fixed groups — still part of the live catalog.",tabs:o}),{id:"admin",label:"Admin",intro:"Everything in the admin panel. Tabs come from the live admin catalog, so new admin screens appear here automatically. Role Access controls who can open each tab. Extra pages under pages/admin that are not in the catalog show under Auto-discovered.",groups:a}),function(){let e={audiences:[],queues:[]};for(let t of _.vf)e[t.group].push(function(e){let t=(0,_.jS)(e.key),r=C[t]||C[`/admin/crm?view=${e.key}`]||C[`crm-${e.key}`]||{};return{id:`crm-${e.key}`,name:r.name||e.label,url:t,who:r.who||"CRM telecallers with access to this view.",what:r.what||`${e.label} view inside /admin/crm.`,how:r.how||`Open /admin/crm?tab=${e.key} and work the list.`,when:r.when||"When your outreach needs this CRM view.",notes:r.notes,moreWho:r.moreWho,moreWhat:r.moreWhat,moreHow:r.moreHow,moreWhen:r.moreWhen,moreNotes:r.moreNotes}}(t));return{id:"crm",label:"CRM",intro:"CRM inside /admin/crm. Audience folders and work queues update automatically from the CRM catalog — add a view there and it appears here. Pipeline statuses (New → Won) live on each contact card.",groups:Object.keys(P).map(t=>{let r=P[t];return{id:r.id,title:r.title,lead:r.lead,tabs:e[t]}}).filter(e=>e.tabs.length>0)}}
1(),e.homeroom].filter(Boolean),{title:"TeachConnect Feature Map",updatedAt:S.h||new Date().toISOString(),areas:function(e){let t=e.map(e=>({...e,groups:e.groups.map(e=>({...e,tabs:[...e.tabs]}))})),r=function(e){let t=new Set,r=[];for(let a of e)for(let e of a.groups)for(let a of e.tabs)for(let e of String(a.url||"").split("\xb7")){let a=F(e.trim());a&&(a.includes("[")?r.push(function(e){let t=F(e).replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/\\\[.*?\\\]/g,"[^/]+");return RegExp(`^${t}$`)}(a)):t.add(a))}for(let e of A.wB)t.add(F(e.key));return{exact:t,patterns:r}}(t),a=Object.fromEntries(t.map(e=>[e.id,e])),o=a.product;for(let e of S.M){if(function(e,t){let r=F(e);return!!t.exact.has(r)||t.patterns.some(e=>e.test(r))}(e.path,r)||"/admin/crm"===e.path)continue;let n=a["product"===e.areaHint?"product":e.areaHint];n||(o||(o={id:"product",label:"Other product pages",intro:"Public and shared URLs discovered from pages/ that are not under Jobseeker, Recruiter, Admin, CRM, or Homeroom.",groups:[]},t.push(o),a.product=o),n=o);let i=function(e){let t=e.groups.find(e=>"auto-discovered"===e.id);return t||(t={id:"auto-discovered",title:"Auto-discovered",lead:"New pages found under pages/ that are not yet documented in the curated groups above. They appear here automatically on each build/dev.",tabs:[]},e.groups=[...e.groups,t]),t}(n),s=function(e){let t=C[e.path]||{};return{id:`auto:${e.path}`,name:t.name||e.name,url:e.path,who:t.who||"Anyone who can open this URL (role gates may apply).",what:t.what||`Auto-discovered page from ${e.file}. Add richer copy in FEATURE_MAP_TAB_DETAILS keyed by this path, or Edit on Feature Map.`,how:t.how||`Open ${e.path}
1 from the product navigation or by URL.`,when:t.when||"When this screen is part of the user journey.",notes:t.notes||`Auto-discovered ${S.h}. Source: ${e.file}`,moreWho:t.moreWho,moreWhat:t.moreWhat,moreHow:t.moreHow,moreWhen:t.moreWhen,moreNotes:t.moreNotes}}(e);i.tabs.push(s),r.exact.add(F(e.path))}for(let e of t)e.groups=e.groups.filter(e=>"auto-discovered"!==e.id||e.tabs.length>0);return t}(n)}},[]),Z=(0,o.useMemo)(()=>(function(e,t){if(!t)return e;let r=Array.isArray(t.areas)&&t.areas.length?t.areas:e.areas,a=t.tabs||{};return{title:e.title,updatedAt:t.updatedAt||e.updatedAt,areas:r.map(e=>({...e,groups:e.groups.map(e=>({...e,tabs:e.tabs.map(e=>{let t=a[e.id];return t?{...e,...t,id:e.id}:e})}))}))}})(X,q),[X,q]),ee=(0,o.useMemo)(()=>(function(e){let t=new Map,r=new Map;for(let a of e.areas)for(let e of a.groups)for(let o of e.tabs){let n=$(o,a,e.id,e.title);t.set(o.id,n),r.set(o.id,[o.name,o.url,o.who,o.what,o.how,o.when,o.notes||"",[n.name,n.url,n.purpose,n.audience,n.whenToUse,n.tip,n.groupTitle,n.areaLabel,n.credits.summary,...n.steps,...n.features,...n.related.map(e=>`${e.name} ${e.url}`),...n.plans.map(e=>`${e.name} ${e.note}`),...n.credits.lines,...Object.values(n.more)].filter(Boolean).join(" ").toLowerCase()].join(" ").toLowerCase())}return{guides:t,haystacks:r}})(Z),[Z]),et=Z.areas.find(e=>e.id===k)||Z.areas[0],er=(0,o.useMemo)(()=>(function(e,t,r){if(!e)return[];let a=U(r);return e.groups.map(r=>({...r,entries:r.tabs.filter(e=>J(e,t,a)).map(a=>({tab:a,guide:t.guides.get(a.id)||$(a,e,r.id,r.title)}))})).filter(e=>e.entries.length>0)})(et,ee,H),[et,ee,H]),ea=(0,o.useMemo)(()=>(function(e,t,r){let a=U(r),o={};for(let r of e.areas){let e=0;for(let o of r.groups)for(let r of o.tabs)J(r,t,a)&&(e+=1);o[r.id]=e}return o})(Z,ee,H),[Z,ee,H]),eo=(0,o.useMemo)(()=>Z.areas.reduce((e,t)=>e+(t?t.groups.reduce((e,t)=>e+t.tabs.length,0):0),0),[Z]),en=U(H).length>0,ei=er.reduce((e,t)=>e+t.entries.length,0),es=en?Object.entries(ea).reduce((e,t)=>{let[r,a]=t;return r===(null==et?void 0:et.id)?e:e+a},0):0,el=L(et,z),ec=et?(e=et.id,t=et.label,"jobseeker"===e?"Jobseeker":"recruiter"===e?"Recruiter":"admin"===e?"Admin":"crm"===e?"CRM":"homeroom"===e?"Homeroom":"product"===e?"More pages":t):"",ed=(0,o.useCallback)(e=>{B(e),G.current&&window.clearTimeout(G.current),G.current=window.setTimeout(()=>B(""),3200)},[]),eh=e=>{let t=!j.has(e);t&&V(e),x(r=>{let a=new Set(r);return t?a.add(e):a.delete(e),a})},eu=async e=>{try{let t=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:new Date().toISOString();return e&&"object"==typeof e?1===e.version&&e.tabs&&"object"==typeof e.tabs&&!Array.isArray(e.tabs)?{kind:"overrides",overrides:{version:1,updatedAt:"string"==typeof e.updatedAt&&e.updatedAt?e.updatedAt:t,tabs:e.tabs,...Array.isArray(e.areas)&&e.areas.length?{areas:e.areas}:{}}}:"string"==typeof e.title&&Array.isArray(e.areas)&&e.areas.length?{kind:"document",overrides:{version:1,updatedAt:"string"==typeof e.updatedAt&&e.updatedAt?e.updatedAt:t,tabs:{},areas:e.areas}}:null:null}(JSON.parse(await e.text()));if(!t)return void ed("That JSON is not a Feature Map or an overrides export");K(t.overrides),ed("document"===t.kind?"Imported a full Feature Map":"Imported local edits")}catch{ed("Could not read that file")}};return d?(0,a.jsxs)("main",{className:h().page,children:[(0,a.jsx)(m.A,{}),(0,a.jsxs)("div",{className:h().container,children:[(0,a.jsx)(w.Ay,{name:"Feature Map",summary:"The whole platform, in simple English.",info:(0,a.jsxs)(a.Fragment,{children:["Single source of truth for Jobseeker, Recruiter, Admin, CRM and Homeroom. Every URL explains what it is for, who uses it, how to use it, plans, and AI credits. Admin tabs, CRM views, and new pages under"," ",(0,a.jsx)("code",{children:"pages/"})," appear automatically — no hand list to maintain."]}),extra:(0,a.jsxs)("div",{className:p().creditStrip,"aria-label":"Plan AI credits",children:[(0,a.jsxs)("span",{className:p().creditPill,children:["Jobseeker AI \xb7 Free ",E[0].credits," \xb7 Basic ",E[1].credits," \xb7 Premium ",E[2].credits]}),(0,a.jsxs)("span",{className:p().creditPill,children:["Recruiter AI \xb7 Starter ",N[0].credits," \xb7 Growth ",N[1].credits," \xb7 Elite ",N[2].credits]})]})}),(0,a.jsxs)("div",{className:p().map,children:[(0,a.jsx)(Q,{areas:Z.areas,activeId:(null==et?void 0:et.id)||"",onPick:e=>{e!==k&&(v(e),x(new Set))},hitCounts:ea,searching:en,explored:z,totalTabs:eo,updatedAt:Z.updatedAt,editsOn:!!q,ticker:W}),(0,a.jsxs)("section",{id:"fm-board",className:`${h().surfaceCard} ${p().board}`,children:[(0,a.jsx)(eS,{query:H,onQuery:O,hits:en?ei:null,onExpand:()=>x(new Set(er.flatMap(e=>e.entries.map(e=>e.tab.id)))),onCollapse:()=>x(new Set),onSurprise:()=>{var e;let t=function(e,t){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:Math.random,a=e.flatMap(e=>e.entries.map(e=>e.tab.id));if(!a.length)return null;let o=a.filter(e=>!t.has(e)),n=o.length?o:a,i=Math.min(n.length-1,Math.max(0,Math.floor(r()*n.length)));return n[i]}(er,z);if(!t)return;x(e=>new Set(e).add(t)),V(t);let r=(null==(e=ee.guides.get(t))?void 0:e.name)||"a page";ed(`Surprise: ${r}`),window.requestAnimationFrame(()=>{let e=document.querySelector(`[data-station="${CSS.escape(t)}"]`);null==e||e.scrollIntoView({behavior:"smooth",block:"center"})})},onMarkdown:()=>{eM(`teachconnect-feature-map-${eP()}.md`,function(e){let t=[`# ${e.title}`,"",`Updated: ${e.updatedAt}`,"","Product reference for TeachConnect — admin, CRM, jobseeker, recruiter, and Homeroom tabs.",""];for(let r of e.areas)for(let e of(t.push(`## ${r.label}`,""),r.intro&&t.push(r.intro,""),r.groups))for(let r of(t.push(`### ${e.title}`,""),e.lead&&t.push(`_${e.lead}_`,""),e.tabs))t.push(`#### ${r.name}`,""),t.push(`- **URL:** \`${r.url}\``),t.push(`- **Who uses this:** ${r.who}`),r.moreWho&&t.push(`  - **More:** ${r.moreWho}
1`),t.push(`- **What it does:** ${r.what}`),r.moreWhat&&t.push(`  - **More:** ${r.moreWhat}`),t.push(`- **How to use:** ${r.how}`),r.moreHow&&t.push(`  - **More:** ${r.moreHow}`),t.push(`- **When to open:** ${r.when}`),r.moreWhen&&t.push(`  - **More:** ${r.moreWhen}`),r.notes&&t.push(`- **Extra tip:** ${r.notes}`),r.moreNotes&&t.push(`  - **More:** ${r.moreNotes}`),t.push("","_Plans, credits, related URLs, and feature bullets are generated live on /admin/feature-map from catalogs + page discovery._","");return t.join("\n")}(Z),"text/markdown;charset=utf-8"),ed("Downloaded the map as Markdown")},onJson:()=>{eM(`teachconnect-feature-map-${eP()}.json`,JSON.stringify(Z,null,2),"application/json;charset=utf-8"),ed("Downloaded the map as JSON")},canEdit:f,editing:g,onToggleEdit:()=>y(e=>!e),onDownloadEdits:()=>{let e=q||{version:1,updatedAt:new Date().toISOString(),tabs:{}};eM(`teachconnect-feature-map-overrides-${eP()}.json`,JSON.stringify(e,null,2),"application/json;charset=utf-8"),ed("Downloaded your local edits")},onImport:eu,onReset:()=>{window.confirm("Clear your local Feature Map edits and restore the default catalog?")&&(K(null),y(!1),ed("Restored the default map"))}}),g?(0,a.jsxs)("div",{className:p().editBanner,children:[(0,a.jsx)(s.A,{"aria-hidden":"true"}),"Editing. Open a station to reword it; every keystroke is kept in this browser. Download edits to share them."]}):null,(0,a.jsxs)("div",{className:p().districtIntro,children:[(null==et?void 0:et.intro)?(0,a.jsx)("p",{children:et.intro}):null,(0,a.jsxs)("div",{className:`${p().explore} ${el.total&&el.done>=el.total?p().exploreDone:""}`,children:[(0,a.jsx)(l.A,{"aria-hidden":"true"}),(0,a.jsx)("span",{children:el.total&&el.done>=el.total?`Every page in ${ec} opened`:`${el.done} of ${el.total} pages opened in ${ec}`}),(0,a.jsx)("span",{className:p().exploreBar,"aria-hidden":"true",style:{"--fill":`${el.total?Math.round(el.done/el.total*100):0}%`},children:(0,a.jsx)("i",{})})]})]}),0===er.length?(0,a.jsxs)("div",{className:p().empty,children:[(0,a.jsx)(c.A,{"aria-hidden":"true"}),(0,a.jsxs)("p",{children:["No pages match ",(0,a.jsx)("strong",{children:H.trim()})," in ",ec,".",es?` ${es} ${1===es?"page does":"pages do"} elsewhere — the gold counts on the atlas say where.`:" Try a page name, a URL or a plan."]})]}):(0,a.jsx)("div",{children:er.map((e,t)=>(0,a.jsx)(ew,{route:e,index:t,openIds:j,explored:z,editing:g,query:H,onToggle:eh,onPatch:Y},e.id))},(null==et?void 0:et.id)||"none")]})]})]})]}):(0,a.jsxs)("main",{className:h().page,children:[(0,a.jsx)(m.A,{}),(0,a.jsx)("div",{className:h().container,children:(0,a.jsx)("div",{className:p().map,children:(0,a.jsxs)("div",{className:p().gate,children:[(0,a.jsx)(i.A,{"aria-hidden":"true"}),(0,a.jsx)("span",{children:"Checking admin access…"})]})})})]})}}},e=>{e.O(0,[53700,77467,82036,62142,38967,90636,46593,38792],()=>e(e.s=49240)),_N_E=e.O()}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.