import type { ScalarListboxOption, WorkspaceGroup } from '@scalar/components';
import type { HttpMethod } from '@scalar/helpers/http/http-methods';
import type { LoaderPlugin } from '@scalar/json-magic/bundle';
import { createSidebarState } from '@scalar/sidebar';
import type { Theme } from '@scalar/themes';
import { type WorkspaceStore } from '@scalar/workspace-store/client';
import { type WorkspaceEventBus } from '@scalar/workspace-store/events';
import type { WorkspaceDocument } from '@scalar/workspace-store/schemas';
import type { XScalarEnvironment } from '@scalar/workspace-store/schemas/extensions/document/x-scalar-environments';
import type { Tab } from '@scalar/workspace-store/schemas/extensions/workspace/x-scalar-tabs';
import type { TraversedEntry } from '@scalar/workspace-store/schemas/navigation';
import { type ComputedRef, type MaybeRefOrGetter, type Ref, type ShallowRef } from 'vue';
import type { RouteLocationNormalizedGeneric, Router } from 'vue-router';
export type GetEntryByLocation = (location: {
    document: string;
    path?: string;
    method?: HttpMethod;
    example?: string;
}) => (TraversedEntry & {
    parent?: TraversedEntry | undefined;
}) | undefined;
type WorkspaceOption = ScalarListboxOption & {
    teamUid: string;
    namespace: string;
    slug: string;
};
/** Defines the overall application state structure and its main feature modules */
export type AppState = {
    /** The workspace store */
    store: ShallowRef<WorkspaceStore | null>;
    /** The sidebar management */
    sidebar: {
        /** The sidebar state */
        state: ReturnType<typeof createSidebarState<TraversedEntry>>;
        /** The width of the sidebar */
        width: ComputedRef<number>;
        /** Whether the sidebar is open */
        isOpen: Ref<boolean>;
        /** Handles the selection of an item in the sidebar */
        handleSelectItem: (id: string) => void;
        /** Handles the width update of the sidebar */
        handleSidebarWidthUpdate: (width: number) => void;
        /** Gets the entry by location */
        getEntryByLocation: GetEntryByLocation;
    };
    /** The tabs management */
    tabs: {
        /** The tabs state */
        state: Ref<Tab[]>;
        /** The active tab index */
        activeTabIndex: Ref<number>;
        /** Copies the URL of the tab at the given index to the clipboard */
        copyTabUrl: (index: number) => Promise<void>;
    };
    /** The workspace management */
    workspace: {
        /** Creates a new workspace and navigates to it */
        create: (payload: {
            teamUid?: string;
            namespace?: string;
            slug?: string;
            name: string;
        }) => Promise<{
            name: string;
            namespace: string;
            slug: string;
            teamUid: string;
        } | undefined>;
        /** All workspace list */
        workspaceList: Ref<WorkspaceOption[]>;
        /** Filtered workspace list, based on the current teamUid */
        filteredWorkspaceList: ComputedRef<WorkspaceOption[]>;
        /**
         * Groups workspaces into team and local categories for display in the workspace picker.
         * Team workspaces are shown first (when not on local team), followed by local workspaces.
         */
        workspaceGroups: ComputedRef<WorkspaceGroup[]>;
        /** The currently active workspace */
        activeWorkspace: ShallowRef<{
            id: string;
            label: string;
        } | null>;
        /** Navigates to the specified workspace */
        navigateToWorkspace: (namespace?: string, slug?: string) => Promise<void>;
        /** Whether the workspace page is open */
        isOpen: ComputedRef<boolean>;
    };
    /** The workspace event bus for handling workspace-level events */
    eventBus: WorkspaceEventBus;
    /** The router instance */
    router: Router;
    /** The current route derived from the router */
    currentRoute: Ref<RouteLocationNormalizedGeneric | null>;
    /** Whether the workspace is currently syncing */
    loading: Ref<boolean>;
    /** The currently active entities */
    activeEntities: {
        /** The namespace of the current entity, e.g. "default" or a custom namespace */
        namespace: Ref<string | undefined>;
        /** The slug identifying the current workspace */
        workspaceSlug: Ref<string | undefined>;
        /** The slug of the currently selected document in the workspace */
        documentSlug: Ref<string | undefined>;
        /** The API path currently selected (e.g. "/users/{id}") */
        path: Ref<string | undefined>;
        /** The HTTP method for the currently selected API path (e.g. GET, POST) */
        method: Ref<HttpMethod | undefined>;
        /** The name of the currently selected example (for examples within an endpoint) */
        exampleName: Ref<string | undefined>;
        /** The unique identifier for the selected team context (read-only; use setTeamUid to change) */
        teamUid: Readonly<Ref<string>>;
        /** Sets the current team context by team UID */
        setTeamUid: (value: string) => void;
    };
    /** The currently active environment */
    environment: ComputedRef<XScalarEnvironment>;
    /** The currently active document */
    document: ComputedRef<WorkspaceDocument | null>;
    /** Whether the current color mode is dark */
    isDarkMode: ComputedRef<boolean>;
    /** The currently active theme */
    theme: {
        /** The computed CSS styles for the current theme, as a string */
        styles: ComputedRef<{
            themeStyles: string;
            themeSlug: string;
        }>;
        /** The computed value for the <style> tag containing the current theme styles */
        themeStyleTag: ComputedRef<string>;
        /** The custom themes to use */
        customThemes: MaybeRefOrGetter<Theme[]>;
    };
    telemetry: Ref<boolean>;
};
export declare const createAppState: ({ router, fileLoader, fallbackThemeSlug, customThemes, telemetryDefault, }: {
    router: Router;
    fileLoader?: LoaderPlugin;
    customThemes?: MaybeRefOrGetter<Theme[]>;
    fallbackThemeSlug?: MaybeRefOrGetter<string>;
    telemetryDefault?: boolean;
}) => Promise<AppState>;
export {};
//# sourceMappingURL=app-state.d.ts.map