/** * Canonical per-section metadata for the OpenFrame dev-center surfaces * (Roadmap / Bug-fixes & Enhancements / Releases / Onboarding Guides). * * One file co-locates every per-section value the openframe homepage * navigator card AND the destination full-page hero both consume — * icon, brief navigator description, longer hero paragraph, search * config (placeholder + paramKey), filter config (paramKey + options). * * Adding a 5th section is one edit here and zero edits across the * page files / navigator grid. * * EMBEDDER NOTE — `onboarding`: * The `onboarding` entry is INERT on `hero`/`search`/`filter` because * `/onboarding-guides` is owned by `OnboardingGuidesCatalogView` (a * hub-side full-page view), not the shared `DevSectionView` chrome. * This entry exists ONLY to drive the homepage navigator card. Any * embedder iterating the registry must SKIP `onboarding` if they * don't host the `/onboarding-guides` route — e.g. * `Object.values(OPENFRAME_DEV_SECTIONS).filter(s => s.href !== '/onboarding-guides')`. * * SERVER-BUNDLE SAFETY: * This module imports lucide-react icon components as JSX values but * never RENDERS them at module load. Lib's tsup config places `utils/` * in the server bundle (no `"use client"` banner), which is safe * because component-function references don't execute on import. * Precedent: `src/utils/platform-config.tsx` (also lucide imports, * also server-bundle, also imported by route-page `metadata` exports). */ import { type LucideIcon } from 'lucide-react'; export declare const ROADMAP_STATUS_OPTIONS: readonly [{ readonly value: "all"; readonly label: "All"; }, { readonly value: "completed"; readonly label: "Completed"; }, { readonly value: "in_progress"; readonly label: "In Progress"; }]; export declare const DELIVERY_TASK_TYPE_OPTIONS: readonly [{ readonly value: "all"; readonly label: "All"; }, { readonly value: "Bug"; readonly label: "Bug-fix"; }, { readonly value: "Request"; readonly label: "Enhancement"; }]; export declare const TICKET_STATUS_OPTIONS: readonly [{ readonly value: "all"; readonly label: "All"; }, { readonly value: "open"; readonly label: "Open"; }, { readonly value: "closed"; readonly label: "Closed"; }]; export interface OpenframeDevSection { /** Route href the navigator card and any internal cross-link composes. */ href: string; icon: LucideIcon; /** Brief copy for the homepage navigator card (≈50 char teaser). */ navigator: { title: string; description: string; }; /** Longer copy for the destination page hero (≈120-150 char marketing paragraph). */ hero: { title: string; description: string; }; /** Inline search bar configuration. */ search: { /** Placeholder text shown in the search input. */ placeholder: string; /** URL search param the input writes on submit and the list reads on fetch. */ paramKey: string; /** Companion URL params torn down whenever the search commits EMPTY. * For params that deep-links set TOGETHER with the search (e.g. the * tickets `?ticket=&search=` pair from chat cards) — clearing * the search must clear the whole linked context, not leave a stale * companion param filtering the view. */ clearParamKeys?: readonly string[]; } | null; /** Filter pill row configuration. `null` when the section has no filter (e.g. onboarding-guides). */ filter: { label: string; /** URL search param the pills write and the list reads. */ paramKey: string; /** The option value that maps to "no filter applied". When selected, * the URL param is removed instead of being set. Defaults to the * first option's value if omitted — explicit field guards against * brittleness if `options` is later reordered. */ defaultValue: string; options: readonly { value: string; label: string; }[]; } | null; } export declare const OPENFRAME_DEV_SECTIONS: { readonly roadmap: { readonly href: "/roadmap"; readonly icon: import("react").ForwardRefExoticComponent & import("react").RefAttributes>; readonly navigator: { readonly title: "Development Roadmap"; readonly description: "What we're building next — vote on upcoming features."; }; readonly hero: { readonly title: "Development Roadmap"; readonly description: "See what's in flight, what's planned, and what's up for community vote. The entire OpenFrame roadmap is public."; }; readonly search: { readonly placeholder: "Search roadmap items..."; readonly paramKey: "search"; }; readonly filter: { readonly label: "Status"; readonly paramKey: "status"; readonly defaultValue: "all"; readonly options: readonly [{ readonly value: "all"; readonly label: "All"; }, { readonly value: "completed"; readonly label: "Completed"; }, { readonly value: "in_progress"; readonly label: "In Progress"; }]; }; }; readonly delivery: { readonly href: "/bug-fixes-and-enhancements"; readonly icon: import("react").ForwardRefExoticComponent & import("react").RefAttributes>; readonly navigator: { readonly title: "Bug-fixes & Enhancements"; readonly description: "Recently shipped fixes and improvements."; }; readonly hero: { readonly title: "Bug-fixes & Enhancements"; readonly description: "A running log of fixes and improvements shipping into OpenFrame — recently completed and actively in progress."; }; readonly search: { readonly placeholder: "Search tasks..."; readonly paramKey: "search"; }; readonly filter: { readonly label: "Type"; readonly paramKey: "task_type"; readonly defaultValue: "all"; readonly options: readonly [{ readonly value: "all"; readonly label: "All"; }, { readonly value: "Bug"; readonly label: "Bug-fix"; }, { readonly value: "Request"; readonly label: "Enhancement"; }]; }; }; readonly releases: { readonly href: "/releases"; readonly icon: import("react").ForwardRefExoticComponent & import("react").RefAttributes>; readonly navigator: { readonly title: "Product Releases"; readonly description: "Version history and release notes."; }; readonly hero: { readonly title: "Product Releases"; readonly description: "Version notes, change summaries, and stability tier (alpha / beta / stable) for every OpenFrame release."; }; readonly search: { readonly placeholder: "Search releases..."; readonly paramKey: "search"; }; readonly filter: { readonly label: "Status"; readonly paramKey: "release_status"; readonly defaultValue: "all"; readonly options: readonly [{ readonly value: "alpha"; readonly label: "Alpha"; readonly description: "Early development, unstable"; readonly color: "orange"; }, { readonly value: "beta"; readonly label: "Beta"; readonly description: "Feature complete, testing"; readonly color: "yellow"; }, { readonly value: "stable"; readonly label: "Stable"; readonly description: "Production ready"; readonly color: "green"; }, { readonly value: "deprecated"; readonly label: "Deprecated"; readonly description: "No longer supported"; readonly color: "gray"; }]; }; }; readonly onboarding: { readonly href: "/onboarding-guides"; readonly icon: import("react").ForwardRefExoticComponent & import("react").RefAttributes>; readonly navigator: { readonly title: "Onboarding Guides"; readonly description: "Step-by-step product walkthroughs."; }; readonly hero: { readonly title: "Getting Started"; readonly description: "Step-by-step walkthroughs for getting up and running with OpenFrame — from your first device deployment to advanced integrations."; }; readonly search: null; readonly filter: null; }; readonly tickets: { readonly href: "/tickets"; readonly icon: import("react").ForwardRefExoticComponent & import("react").RefAttributes>; readonly navigator: { readonly title: "Help Center"; readonly description: "Open and manage your support tickets."; }; readonly hero: { readonly title: "Help Center"; readonly description: "Open new tickets, follow up on existing ones, and track responses from the team — all in one place."; }; readonly search: { readonly placeholder: "Search your tickets..."; readonly paramKey: "search"; readonly clearParamKeys: readonly ["ticket"]; }; readonly filter: { readonly label: "Status"; readonly paramKey: "status"; readonly defaultValue: "all"; readonly options: readonly [{ readonly value: "all"; readonly label: "All"; }, { readonly value: "open"; readonly label: "Open"; }, { readonly value: "closed"; readonly label: "Closed"; }]; }; }; }; export type OpenframeDevSectionKey = keyof typeof OPENFRAME_DEV_SECTIONS; //# sourceMappingURL=openframe-dev-sections.d.ts.map