import { Placement, TileAuthor } from '@hackforplay/next';
import { Epic } from 'redux-observable';
import { Action } from 'typescript-fsa';
import { CursorMode } from '../utils/cursor';
import { Selection } from '../utils/selection';
export interface IPagesResult {
    pages: {
        [index: number]: IPage;
    };
}
export interface IPage {
    /**
     * 全てのページで一意な番号。最大値はないが、欠番は存在する
     */
    index: number;
    /**
     * PaletteView で使うページ全体の画像 URL
     */
    src: string;
    /**
     * ページの行数。タイルの枚数が 100 を超えるとタイルの index が一意にならなくなるので、最大値は 12
     */
    row: number;
    /**
     * ページに含まれるタイルの情報。number は、左上が 0 で、その下は 8 である
     * undefined の場合は、透明な Nope タイルとして扱う
     */
    tiles: {
        [number: string]: ITile | undefined;
    };
}
export interface ITile {
    /**
     * 全てのタイルで一意な番号。 IPage["index"] * 100 + number で求められる
     */
    index: number;
    /**
     * このタイルだけの画像 URL
     */
    src: string;
    placement: Placement;
    author: TileAuthor;
}
export declare const actions: {
    loadPages: import("typescript-fsa").AsyncActionCreators<{}, IPagesResult, {}>;
    setSelection: {
        (payload: Selection | null, meta?: {
            [key: string]: any;
        } | null | undefined): Action<Selection | null>;
        type: string;
        match: (action: import("typescript-fsa").AnyAction) => action is Action<Selection | null>;
    };
    setCursorMode: {
        (payload: CursorMode, meta?: {
            [key: string]: any;
        } | null | undefined): Action<CursorMode>;
        type: string;
        match: (action: import("typescript-fsa").AnyAction) => action is Action<CursorMode>;
    };
};
export interface State {
    pages: IPage[];
    selection: Selection | null;
    nib: ITile[][];
    cursorMode: CursorMode;
}
declare const _default: (state: State | undefined, action: Action<any>) => State;
export default _default;
export declare const epics: Epic<Action<any>, Action<any>, void, any>;
