/ ink / layout / node.ts
node.ts
  1  // --
  2  // Adapter interface for the layout engine (Yoga)
  3  
  4  export const LayoutEdge = {
  5    All: 'all',
  6    Horizontal: 'horizontal',
  7    Vertical: 'vertical',
  8    Left: 'left',
  9    Right: 'right',
 10    Top: 'top',
 11    Bottom: 'bottom',
 12    Start: 'start',
 13    End: 'end',
 14  } as const
 15  export type LayoutEdge = (typeof LayoutEdge)[keyof typeof LayoutEdge]
 16  
 17  export const LayoutGutter = {
 18    All: 'all',
 19    Column: 'column',
 20    Row: 'row',
 21  } as const
 22  export type LayoutGutter = (typeof LayoutGutter)[keyof typeof LayoutGutter]
 23  
 24  export const LayoutDisplay = {
 25    Flex: 'flex',
 26    None: 'none',
 27  } as const
 28  export type LayoutDisplay = (typeof LayoutDisplay)[keyof typeof LayoutDisplay]
 29  
 30  export const LayoutFlexDirection = {
 31    Row: 'row',
 32    RowReverse: 'row-reverse',
 33    Column: 'column',
 34    ColumnReverse: 'column-reverse',
 35  } as const
 36  export type LayoutFlexDirection =
 37    (typeof LayoutFlexDirection)[keyof typeof LayoutFlexDirection]
 38  
 39  export const LayoutAlign = {
 40    Auto: 'auto',
 41    Stretch: 'stretch',
 42    FlexStart: 'flex-start',
 43    Center: 'center',
 44    FlexEnd: 'flex-end',
 45  } as const
 46  export type LayoutAlign = (typeof LayoutAlign)[keyof typeof LayoutAlign]
 47  
 48  export const LayoutJustify = {
 49    FlexStart: 'flex-start',
 50    Center: 'center',
 51    FlexEnd: 'flex-end',
 52    SpaceBetween: 'space-between',
 53    SpaceAround: 'space-around',
 54    SpaceEvenly: 'space-evenly',
 55  } as const
 56  export type LayoutJustify = (typeof LayoutJustify)[keyof typeof LayoutJustify]
 57  
 58  export const LayoutWrap = {
 59    NoWrap: 'nowrap',
 60    Wrap: 'wrap',
 61    WrapReverse: 'wrap-reverse',
 62  } as const
 63  export type LayoutWrap = (typeof LayoutWrap)[keyof typeof LayoutWrap]
 64  
 65  export const LayoutPositionType = {
 66    Relative: 'relative',
 67    Absolute: 'absolute',
 68  } as const
 69  export type LayoutPositionType =
 70    (typeof LayoutPositionType)[keyof typeof LayoutPositionType]
 71  
 72  export const LayoutOverflow = {
 73    Visible: 'visible',
 74    Hidden: 'hidden',
 75    Scroll: 'scroll',
 76  } as const
 77  export type LayoutOverflow =
 78    (typeof LayoutOverflow)[keyof typeof LayoutOverflow]
 79  
 80  export type LayoutMeasureFunc = (
 81    width: number,
 82    widthMode: LayoutMeasureMode,
 83  ) => { width: number; height: number }
 84  
 85  export const LayoutMeasureMode = {
 86    Undefined: 'undefined',
 87    Exactly: 'exactly',
 88    AtMost: 'at-most',
 89  } as const
 90  export type LayoutMeasureMode =
 91    (typeof LayoutMeasureMode)[keyof typeof LayoutMeasureMode]
 92  
 93  export type LayoutNode = {
 94    // Tree
 95    insertChild(child: LayoutNode, index: number): void
 96    removeChild(child: LayoutNode): void
 97    getChildCount(): number
 98    getParent(): LayoutNode | null
 99  
100    // Layout computation
101    calculateLayout(width?: number, height?: number): void
102    setMeasureFunc(fn: LayoutMeasureFunc): void
103    unsetMeasureFunc(): void
104    markDirty(): void
105  
106    // Layout reading (post-layout)
107    getComputedLeft(): number
108    getComputedTop(): number
109    getComputedWidth(): number
110    getComputedHeight(): number
111    getComputedBorder(edge: LayoutEdge): number
112    getComputedPadding(edge: LayoutEdge): number
113  
114    // Style setters
115    setWidth(value: number): void
116    setWidthPercent(value: number): void
117    setWidthAuto(): void
118    setHeight(value: number): void
119    setHeightPercent(value: number): void
120    setHeightAuto(): void
121    setMinWidth(value: number): void
122    setMinWidthPercent(value: number): void
123    setMinHeight(value: number): void
124    setMinHeightPercent(value: number): void
125    setMaxWidth(value: number): void
126    setMaxWidthPercent(value: number): void
127    setMaxHeight(value: number): void
128    setMaxHeightPercent(value: number): void
129    setFlexDirection(dir: LayoutFlexDirection): void
130    setFlexGrow(value: number): void
131    setFlexShrink(value: number): void
132    setFlexBasis(value: number): void
133    setFlexBasisPercent(value: number): void
134    setFlexWrap(wrap: LayoutWrap): void
135    setAlignItems(align: LayoutAlign): void
136    setAlignSelf(align: LayoutAlign): void
137    setJustifyContent(justify: LayoutJustify): void
138    setDisplay(display: LayoutDisplay): void
139    getDisplay(): LayoutDisplay
140    setPositionType(type: LayoutPositionType): void
141    setPosition(edge: LayoutEdge, value: number): void
142    setPositionPercent(edge: LayoutEdge, value: number): void
143    setOverflow(overflow: LayoutOverflow): void
144    setMargin(edge: LayoutEdge, value: number): void
145    setPadding(edge: LayoutEdge, value: number): void
146    setBorder(edge: LayoutEdge, value: number): void
147    setGap(gutter: LayoutGutter, value: number): void
148  
149    // Lifecycle
150    free(): void
151    freeRecursive(): void
152  }