diff --git a/types/react-sketchapp/index.d.ts b/types/react-sketchapp/index.d.ts new file mode 100644 index 0000000000..f340e19232 --- /dev/null +++ b/types/react-sketchapp/index.d.ts @@ -0,0 +1,283 @@ +// Type definitions for react-sketchapp 0.12 +// Project: https://github.com/airbnb/react-sketchapp +// Definitions by: Rico Kahler +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped +// TypeScript Version: 2.3 + +import * as React from 'react'; + +declare global { + const context: SketchContext; +} + +// sketch interfaces taken from +// https://github.com/airbnb/react-sketchapp/blob/v0.12.1/src/types.js +export interface SketchPage { name: () => any; } +export interface SketchAssetCollection { + colors: () => any[]; + gradients: () => any[]; +} +export interface SketchSharedStyleContainer { + setObjects: (objects: any[]) => void; + addSharedStyleWithName_firstInstance: (name: string, ins: any) => void; +} +export interface SketchDocumentData { + layerStyles: () => void; + layerTextStyles: () => SketchSharedStyleContainer; + layerSymbols: () => void; + assets: () => SketchAssetCollection; +} +export interface SketchDocument { + documentData: () => SketchDocumentData; + pages: () => SketchPage[]; + addBlankPage: () => SketchPage; + currentPage: SketchPage; +} +export interface SketchContext { document: SketchDocument; } + +/** + * Returns the top-level rendered Sketch object or an array of Sketch objects if you use + * components. + * @param element Top-level React component that defines your Sketch document. + * @param container The element to render into - will be replaced. Should either be a Sketch Group + * or Page Object. + * @return The top-most rendered native Sketch layer. + */ +export function render(element: JSX.Element, container?: any): any; + +/** + * Returns a Sketch JSON object for further consumption - doesn't add to the page. + * @return The top-most Sketch layer as JSON. + */ +export function renderToJSON(element: JSX.Element): any; + +// https://github.com/airbnb/react-sketchapp/blob/v0.12.1/src/types.js#L59 +export type Color = string | number; + +/** + * The [`StyleSheet` api uses numbers as IDs][0] to pull registered styles. The component props + * can actually take either a `Style` or a `StyleReference` (where the `StyleReference` is given + * by a `StyleSheet` obj created with `StyleSheet.create`) + * [0]: https://github.com/airbnb/react-sketchapp/blob/v0.12.1/src/stylesheet/index.js#L34 + */ +export type StyleReference = number; + +/** + * Represents the base styles that can be applied to a component. + */ +export interface Style { + shadowColor?: Color; + shadowOffset?: { width?: number, height?: number }; + shadowOpacity?: number; + shadowRadius?: number; + width?: number; + height?: number; + top?: number; + left?: number; + right?: number; + bottom?: number; + minWidth?: number; + maxWidth?: number; + minHeight?: number; + maxHeight?: number; + margin?: number; + marginVertical?: number; + marginHorizontal?: number; + marginTop?: number; + marginBottom?: number; + marginLeft?: number; + marginRight?: number; + padding?: number; + paddingVertical?: number; + paddingHorizontal?: number; + paddingTop?: number; + paddingBottom?: number; + paddingLeft?: number; + paddingRight?: number; + borderWidth?: number; + borderTopWidth?: number; + borderRightWidth?: number; + borderBottomWidth?: number; + borderLeftWidth?: number; + position?: 'absolute' | 'relative'; + flexDirection?: 'row' | 'row-reverse' | 'column' | 'column-reverse'; + flexWrap?: 'wrap' | 'nowrap'; + justifyContent?: 'flex-start' | 'flex-end' | 'center' | 'space-between' | 'space-around'; + alignItems?: 'flex-start' | 'flex-end' | 'center' | 'stretch'; + alignSelf?: 'auto' | 'flex-start' | 'flex-end' | 'center' | 'stretch'; + overflow?: 'visible' | 'hidden' | 'scroll'; + flex?: number; + flexGrow?: number; + flexShrink?: number; + flexBasis?: number; + aspectRatio?: number; + zIndex?: number; + backfaceVisibility?: 'visible' | 'hidden'; + backgroundColor?: Color; + borderColor?: Color; + borderTopColor?: Color; + borderRightColor?: Color; + borderBottomColor?: Color; + borderLeftColor?: Color; + borderRadius?: number; + borderTopLeftRadius?: number; + borderTopRightRadius?: number; + borderBottomLeftRadius?: number; + borderBottomRightRadius?: number; + borderStyle?: 'solid' | 'dotted' | 'dashed'; + opacity?: number; +} + +/** + * Represents all the Styles that can be applied to a `` component. The this interface + * extends the `Style` interface + */ +export interface TextStyle extends Style { + color?: Color; + fontFamily?: string; + fontSize?: number; + fontStyle?: 'normal' | 'italic'; + fontWeight?: string; + textDecorationLine?: 'none' | 'underline' | 'double' | 'line-through'; + textShadowOffset?: { width: number, height: number }; + textShadowRadius?: number; + textShadowColor?: Color; + letterSpacing?: number; + lineHeight?: number; + textAlign?: 'auto' | 'left' | 'right' | 'center' | 'justify'; + writingDirection?: 'auto' | 'ltr' | 'rtl'; +} + +// wanted to type these as classes because they are implemented as classes and typing them this +// way gives you typings like `Artboard.prototype` + +// Artboard +export interface ArtboardProps { + /** + * The name to be displayed in the Sketch Layer List + */ + name?: string; + children?: any; + style?: Style | StyleReference; +} +/** + * Wrapper for Sketch's Artboards. + */ +export class Artboard extends React.Component { } + +// Image +export type ImageSource = string | { src: string }; +export type ResizeMode = 'contain' | 'cover' | 'stretch' | 'center' | 'repeat' | 'none'; +export interface ImageProps { + children?: any; + source?: ImageSource; + style?: Style | StyleReference; + resizeMode: ResizeMode; +} +export class Image extends React.Component { } + +// RedBox +export interface RedBoxProps { + /** A JavaScript Error object */ + error: Error; +} +/** + * A red box / 'red screen of death' error handler. Thanks to + * [commissure/redbox-react.](https://github.com/commissure/redbox-react) + */ +export class RedBox extends React.Component { } + +// Text +export interface TextProps { + name?: string; + children?: string; + style?: TextStyle | StyleReference; +} +/** Text primitives */ +export class Text extends React.Component { } + +// View +export interface ViewProps { + name?: string; + children?: any; + style?: Style | StyleReference; +} +/** View primitives */ +export class View extends React.Component { } + +export const StyleSheet: { + hairlineWidth: 1; + absoluteFill: StyleReference; + /** + * Create an optimized `StyleSheet` reference from a style object. + */ + create: (t: T) => { + [P in keyof T]: StyleReference + }; + /** + * Flatten an array of style objects into one aggregated object, or look up the definition for a + * registered stylesheet. + */ + flatten: ( + input: Array