/* @flow */
export type TSFontWeight = 'normal' | 'bold' | '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900'
export type TSFontStyle = 'normal' | 'italic'
export type TSFontVariant = 'small-caps' | 'oldstyle-nums' | 'lining-nums' | 'tabular-nums' | 'proportional-nums'
export type TSTextBreakStrategy = 'simple' | 'highQuality' | 'balanced'
export type TSFontSize = {|
+default: number,
+button: number,
+label: number,
+smallSystem: number,
+system: number,
|}
export type TSMDStyleSpec =
| 'h1'
| 'h2'
| 'h3'
| 'h4'
| 'h5'
| 'h6'
| 'subtitle1'
| 'subtitle2'
| 'body1'
| 'body2'
| 'button'
| 'caption'
| 'overline'
export type TSTextStyle =
| 'body'
| 'callout'
| 'caption1'
| 'caption2'
| 'footnote'
| 'headline'
| 'subheadline'
| 'largeTitle'
| 'title1'
| 'title2'
| 'title3'
export type TSFontInfo = {
fontFamily: string | null,
fontName: string | null,
fontWeight: TSFontWeight,
fontSize: number,
fontStyle: TSFontStyle,
fontVariant?: TSFontVariant | null,
ascender: number,
descender: number,
capHeight?: number,
xHeight?: number,
top?: number,
bottom?: number,
leading: number,
lineHeight: number,
_hash: number,
}
export type TSFontSpecs = {
fontFamily?: string,
fontSize?: number,
fontStyle?: TSFontStyle,
fontWeight?: TSFontWeight,
/** @platform ios */
fontVariant?: Array<TSFontVariant>,
/** iOS all, Android SDK 21+ with RN 0.55+ */
letterSpacing?: number,
/** @platform android */
includeFontPadding?: boolean,
/** @platform android (SDK 23+) */
textBreakStrategy?: TSTextBreakStrategy,
}
export type TSFontForStyle = {
fontFamily: string,
fontSize: number,
/** fontStyle is omitted if it is "normal" */
fontStyle?: TSFontStyle,
/** fontWeight is omitted if it is "normal" */
fontWeight?: TSFontWeight,
/** @platform ios */
fontVariant?: Array<TSFontVariant> | null,
/** iOS all, Android SDK 21+ with RN 0.55+ */
letterSpacing?: number,
}
export type TSHeightsParams = TSFontSpecs & {
/** The required text to measure. */
text: Array<string>,
/** Maximum width of the area to display the text. @default MAX_INT */
width?: number,
/** @default true */
allowFontScaling?: boolean,
}
export type TSMeasureParams = TSFontSpecs & {
/**
* This is the only required parameter and may include _emojis_ or be empty,
* but it **must not be** `null`.
*
* If this is an empty string the resulting `width` will be zero.
*/
text: string,
/**
* To respect the user' setting of large fonts (i.e. use SP units).
* @default true
*/
allowFontScaling?: boolean,
/**
* Restrict the width. The resulting height will vary depending on the
* automatic flow of the text.
* @default MAX_INT
*/
width?: number,
/**
* If `true`, the result will include an exact `width` and the
* `lastLineWidth` property.
* @default false
*/
usePreciseWidth?: boolean,
/**
* If `>=0`, the result will include a `lineInfo` property with information
* for the required line number.
*/
lineInfoForLine?: number,
}
export interface TSMeasureResult {
/**
* Total used width. It may be less or equal to the `width` option.
*
* On Android, this value may vary depending on the `usePreciseWidth` flag.
*/
width: number;
/**
* Total height, including top and bottom padding if `includingFontPadding`
* was set (the default).
*/
height: number;
/**
* Width of the last line, without trailing blanks.
*
* If `usePreciseWidth` is `false` (the default), this field is undefined.
*/
lastLineWidth?: number;
/**
* Number of lines, taking into account hard and automatic line breaks.
*/
lineCount: number;
/**
* Line information, if the `lineInfoForLine` option is given.
*/
lineInfo?: {
/** Line number of this info, base 0.
*
* It can be less than the requested line number if `lineInfoForLine` is out of range.
*/
line: number;
/** Text offset of the beginning of this line. */
start: number;
/** Text offset after the last _visible_ character (so whitespace is not counted) on this line. */
end: number;
/** The vertical position of the bottom of this line, including padding. */
bottom: number;
/** Horizontal extent of this line, including leading margin indent, but excluding trailing whitespace. */
width: number;
}
}
declare interface TextSizeStatic {
measure(params: TSMeasureParams): Promise<TSMeasureResult>;
flatHeights(params: TSHeightsParams): Promise<number[]>;
specsForTextStyles(): Promise<{ [string]: TSFontForStyle }>;
fontFromSpecs(specs: TSFontSpecs): Promise<TSFontInfo>;
fontFamilyNames(): Promise<string[]>;
}
declare var TextSize: TextSizeStatic;
export default TextSize;