Skip to main content

Group

The universal layout container: a flexbox div that stacks its children in a row or column and is the root of most components.

Group is the workhorse visual container. It renders as a flexbox element and lays out its visual children (the children list in the project file) along flexDirection, with alignment, padding, margins, size, scrolling, borders and background as parameters. Nearly every component's visual tree starts with a Group; nesting Groups is how all layout is composed. It also reports interaction (onClick, hover and pointer signals) and geometry (boundingWidth/boundingHeight, screen position), so it doubles as a click surface.

When to use it

Reach for Group whenever you need structure: rows, columns, cards, overlays, scroll areas, click targets. Do not use it for text (use Text), images (Image), or button-like affordances with label/icon styling (net.noodl.controls.button).

At a glance

CategoryVisual
Type nameGroup
Available inbrowser
SSR compatibilitysafe
Provided bynoodl-viewer-react

Inputs

Values

NameTypeDefaultDescription
alignContentEnum (flex-start, flex-end, center, space-between, space-around, space-evenly)Where the wrapped lines sit as a group; only applies once Multi Line Wrap is on
alignItemsEnum (flex-start, flex-end, center)flex-startWhere children sit across the layout direction
alignXEnum (left, center, right)Horizontal alignment of this element within the space its parent gives it
alignYEnum (top, center, bottom)Vertical alignment of this element within the space its parent gives it
asEnum (div, section, article, aside, nav, header, footer, main, span)divHTML element to render as, which changes nothing visually but matters for screen readers and SEO
backgroundColorColortransparentFill colour behind the children
blockTouchBooleanStops every pointer event that lands here from reaching the nodes this one sits inside. Blunt: it takes hover and pointer-down with it, so reach for Click Bubbling first if it is only clicks you want to keep in
borderBottomColorColorColour of the bottom edge only, overriding Border Color
borderBottomLeftRadiusNumberRounds the bottom-left corner only, overriding Corner Radius
borderBottomRightRadiusNumberRounds the bottom-right corner only, overriding Corner Radius
borderBottomStyleEnum (none, solid, dotted, dashed)Line style for the bottom edge only, overriding Border Style; None hides that edge
borderBottomWidthNumberThickness of the bottom edge in pixels, and it adds to the element's size
borderColorColor#000000Colour of the border, which has no effect while Border Style is None
borderLeftColorColorColour of the left edge only, overriding Border Color
borderLeftStyleEnum (none, solid, dotted, dashed)Line style for the left edge only, overriding Border Style; None hides that edge
borderLeftWidthNumberThickness of the left edge in pixels, and it adds to the element's size
borderRadiusNumber0Rounds all four corners, except any corner that sets its own radius
borderRightColorColorColour of the right edge only, overriding Border Color
borderRightStyleEnum (none, solid, dotted, dashed)Line style for the right edge only, overriding Border Style; None hides that edge
borderRightWidthNumberThickness of the right edge in pixels, and it adds to the element's size
borderStyleEnum (none, solid, dotted, dashed)noneLine style for all four edges; None hides the border and leaves Border Width and Color inactive
borderTopColorColorColour of the top edge only, overriding Border Color
borderTopLeftRadiusNumberRounds the top-left corner only, overriding Corner Radius
borderTopRightRadiusNumberRounds the top-right corner only, overriding Corner Radius
borderTopStyleEnum (none, solid, dotted, dashed)Line style for the top edge only, overriding Border Style; None hides that edge
borderTopWidthNumberThickness of the top edge in pixels, and it adds to the element's size
borderWidthNumber2Thickness of the border in pixels, which adds to the element's size unless Box Sizing accounts for it
boxShadowBlurRadiusNumber5How soft the shadow edge is; 0 gives a hard edge
boxShadowColorColor#00000033Colour of the shadow, including how transparent it is
boxShadowEnabledBooleanfalseTurns the drop shadow on
boxShadowInsetBooleanfalseDraws the shadow inside the element instead of behind it
boxShadowOffsetXNumber0How far to the right the shadow is cast from the element
boxShadowOffsetYNumber0How far down the shadow is cast from the element
boxShadowSpreadRadiusNumber2How much larger than the element the shadow is drawn
clickBubblingEnum (auto, always, never)autoWhether a click here also fires Click on the nodes this one sits inside. Automatic keeps it here as soon as this node's own Click is connected, so a button inside a clickable card runs the button and not the card; Always is the older behaviour where both run; Never keeps every click here, wired or not. Note that an element at zero opacity takes no pointer events at all
clipBooleanfalseHides any child that overflows the group instead of letting it spill out
columnGapNumber0Space between children on the horizontal axis
cssClassNameString``Extra CSS class names to put on this element, for styling from a stylesheet you supply
flexDirectionEnum (none, column, row)columnHow children are stacked: None positions them absolutely, Vertical stacks them down, Horizontal across
flexWrapEnum (nowrap, wrap, wrap-reverse)nowrapLets children wrap onto another line when they do not fit on one
heightDimension100Height of the element; how the value is read depends on Size Mode
justifyContentEnum (flex-start, flex-end, center, space-between, space-around, space-evenly)flex-startWhere children sit along the layout direction when they do not fill it
marginBottomNumberSpace outside the element's bottom edge, between it and its neighbours
marginLeftNumberSpace outside the element's left edge, between it and its neighbours
marginRightNumberSpace outside the element's right edge, between it and its neighbours
marginTopNumberSpace outside the element's top edge, between it and its neighbours
maxHeightNumberLargest height the element may grow to, taking priority over Height
maxWidthNumberLargest width the element may grow to, taking priority over Width
minHeightNumberSmallest height the element may shrink to, taking priority over Height
minWidthNumberSmallest width the element may shrink to, taking priority over Width
mixBlendModeEnum (normal, multiply, screen, overlay, darken, lighten, color-dodge, color-burn, hard-light, soft-light, difference, exclusion, hue, saturation, color, luminosity)normalHow this element's colours blend with whatever is painted behind it
mountedBooleantrueRemoves the element from the page entirely when false, unlike Visible which leaves its space behind
nativeScrollBooleantrueUses the browser's own scrolling, which is smoother; turn it off to get snapping and the Scroll To actions
opacityNumber1How opaque this element is, from 0 for invisible to 1 for solid
paddingBottomNumber0Space inside the element's bottom edge, between it and its content
paddingLeftNumber0Space inside the element's left edge, between it and its content
paddingRightNumber0Space inside the element's right edge, between it and its content
paddingTopNumber0Space inside the element's top edge, between it and its content
pointerEventsEnabledBooleantrueWhen disabled, mouse and touch events pass through to whatever is behind this element
pointerEventsModeEnum (inherit, explicit)inheritWhether pointer handling is inherited from the parent or set explicitly on this element
positionEnum (relative, absolute, sticky, fixed)relativeHow the element is placed: In Layout follows its siblings, Absolute ignores them, Sticky pins to the parent edge on overflow, Fixed stays put and takes no space
rowGapNumber0Space between children on the vertical axis
scrollBounceEnabledBooleantrueLets the content overscroll and spring back at the ends
scrollEnabledBooleanfalseLets the user scroll the children when they do not all fit
scrollSnapEnabledBooleanfalseMakes scrolling settle on item boundaries rather than anywhere
scrollSnapToEveryItemBooleanfalseSnaps to each item in turn instead of allowing a fast flick past several
scrollToElement.durationNumber500How long the scroll animation takes, in milliseconds; 0 jumps
scrollToElement.elementReferenceWhich element to scroll to, taken from another node's DOM Element output
scrollToIndex.durationNumber500How long the scroll animation takes, in milliseconds; 0 jumps
scrollToIndex.indexNumber0Zero-based index of the child to scroll to
showScrollbarBooleanfalseShows a scrollbar rather than scrolling invisibly
sizeModeEnum (explicit, contentWidth, contentHeight, contentSize)explicitWhether Width and Height are used as given, or the element sizes itself to fit its contents
styleCssString/* background-color: red; */Raw CSS declarations applied to this element, overriding the styling ports above
transformOriginXNumber50Horizontal point the element rotates and scales around, as a fraction of its width
transformOriginYNumber50Vertical point the element rotates and scales around, as a fraction of its height
transformRotationNumber0Rotates the element clockwise in degrees, without affecting the layout
transformScaleNumber1Scales the element about its transform origin; 1 leaves it unscaled
transformXNumber0Moves the element right after layout, without moving its siblings
transformYNumber0Moves the element down after layout, without moving its siblings
variantStringName of a saved variant of this node type to apply, replacing the styling set here
visibleBooleantrueHides the element while keeping the space it occupies in the layout
widthDimension100Width of the element; how the value is read depends on Size Mode
zIndexNumberPaint order among overlapping siblings; higher numbers paint on top

Signals

NameTypeDefaultDescription
focusSignalGives this group keyboard focus, so key events reach it
scrollToElement.doSignalScrolls to the element on Element; fired in the same frame the Group mounts, it is held until the Group exists rather than dropped
scrollToIndex.doSignalScrolls to the child at Index, then fires Done — or Failure with the reason it could not

Outputs

Values

NameTypeDefaultDescription
boundingHeightNumberHeight this element actually ended up with after layout, in pixels
boundingWidthNumberWidth this element actually ended up with after layout, in pixels
childIndexNumberThis element's position among its parent's children, counting from 0
childrenCountNumberHow many child elements are currently mounted inside this one
onScrollPositionChangedNumberHow far the content is scrolled, in pixels from the start
screenPositionXNumberDistance in pixels from the left edge of the window to this element's left edge
screenPositionYNumberDistance in pixels from the top edge of the window to this element's top edge
thisReferenceA reference to this node itself, for ports that take a node rather than a value

Signals

NameTypeDefaultDescription
completedSignalFires after every invocation, whatever the outcome — wire this to carry on regardless. Failure still fires and still carries its reason, so this cannot hide an error
didMountSignalFires once this element has been added to the page and can be measured
doneSignalFires once Focus, Scroll To Element or Scroll To Index has been carried out
focusLostSignalFires when keyboard focus leaves this group
focusedSignalFires when this group takes keyboard focus
hoverEndSignalFires when the pointer leaves this element
hoverStartSignalFires when the pointer moves over this element or any of its children
onClickSignalFires when this element is clicked or tapped
onScrollEndSignalFires when scrolling settles, including after a flick has coasted to a stop
onScrollStartSignalFires when the user starts scrolling
pointerDownSignalFires when a mouse button is pressed or a finger touches this element
pointerEnterSignalFires when the pointer moves onto this element, not counting its children
pointerUpSignalFires when the mouse button is released or the finger lifts over this element
willUnmountSignalFires just before this element is removed from the page, while it still exists

Failure outputs

NameTypeDefaultDescription
failureSignalFires when the action did nothing and says why on Error — most often a scroll target that is not inside this group, or a group that has still not mounted

Dynamic ports

This node's port list changes at runtime (declared-port-groups); the tables above may be incomplete for a given instance.

Declares conditional/expandable port groups whose visibility depends on parameter values (see declaredPortGroups).

ConditionInputs shownOutputs shown
flexDirection != nonescrollEnabled
flexDirection != none AND scrollEnabled = truenativeScroll
flexDirection != none AND scrollEnabled = true AND nativeScroll = falsescrollBounceEnabled, scrollSnapEnabled, showScrollbar, scrollToElement.do, scrollToElement.element, scrollToElement.duration, scrollToIndex.do, scrollToIndex.index, scrollToIndex.duration
flexDirection != none AND scrollEnabled = true AND scrollSnapEnabled = truescrollSnapToEveryItem
flexDirection != noneflexWrap
flexWrap = wrap OR flexWrap = wrap-reversealignContent
flexDirection = row OR flexWrap = wrap OR flexWrap = wrap-reversecolumnGap
flexDirection = column OR flexWrap = wrap OR flexWrap = wrap-reverserowGap
sizeMode = explicit OR sizeMode = contentHeight OR sizeMode NOT SETwidth
sizeMode = explicit OR sizeMode = contentWidth OR sizeMode NOT SETheight
pointerEventsMode = explicitpointerEventsEnabled
borderStyle = solid OR borderStyle = dashed OR borderStyle = dottedborderWidth, borderColor
borderLeftStyle = solid OR borderLeftStyle = dashed OR borderLeftStyle = dotted OR borderStyle = solid OR borderStyle = dashed OR borderStyle = dottedborderLeftWidth, borderLeftColor
borderTopStyle = solid OR borderTopStyle = dashed OR borderTopStyle = dotted OR borderStyle = solid OR borderStyle = dashed OR borderStyle = dottedborderTopWidth, borderTopColor
borderRightStyle = solid OR borderRightStyle = dashed OR borderRightStyle = dotted OR borderStyle = solid OR borderStyle = dashed OR borderStyle = dottedborderRightWidth, borderRightColor
borderBottomStyle = solid OR borderBottomStyle = dashed OR borderBottomStyle = dotted OR borderStyle = solid OR borderStyle = dashed OR borderStyle = dottedborderBottomWidth, borderBottomColor
boxShadowEnabled = trueboxShadowOffsetX, boxShadowOffsetY, boxShadowInset, boxShadowBlurRadius, boxShadowSpreadRadius, boxShadowColor

Ports at runtime

Group's port list is largely static, but several port groups are conditional on parameter values (declared-port-groups): scroll-related ports appear when scrolling is enabled, advanced-dimension ports depend on the size mode, and visual-state variants add ports per state. An authoring tool should treat the catalog's input list as the superset and expect the editor to expose subsets based on the node's current parameters.

Patterns

  • Component root: a single Group at the top of every visual component, flexDirection column.
  • Scroll list: outer Group with scrolling enabled and clip true, Repeater inside.

Watch out for

  • Deeply nesting a Group per style tweak; set padding/margins on the existing Group instead.

Examples

List page: Repeater fed by Query Records

The canonical data-list shape. Query Records (DbCollection2) fetches a database class and exposes the result on its items array output; the Repeater (For Each) consumes that array and instantiates its template component once per record. Each record's properties are delivered to the item component through Component Inputs whose names match the record's property names — the item component reads them like any other input. The Repeater and its item template component are separate components by design.

Validate an input before acting on a click

The idiomatic gate shape: a Button click does not act directly — it evaluates a Condition. The Condition's boolean comes from an Expression that checks the text input's current value, so the same click either proceeds (ontrue) or reveals an error message (isfalse drives the error Text's visibility as a level, not a pulse). Note the two kinds of flow: text/booleans are values, onClick/eval/ontrue are momentary signals.

Text, Image, Repeater, Component Children, Columns

Generated

This page is generated from node-catalog-enriched.json. Do not edit it by hand — run npm run docs:nodes to regenerate, and fix the source enrichment instead.