Skip to content
ONIWC
iwc 0.1.0

section element

A thematic band of a page — a hero, a feature list, a footer call to action.

Renders

<section>

Required

Nothing beyond type.

Native apps

Compiled native apps and server-driven apps

Syntax

section element
{ "type": "section" }

An element lives in a screen's sections, another element's elements, a layout slot or a component root.

Properties

PropertyTypeDescription
elementsarray of element
layoutobject
  • align: "start" | "center" | "end" | "stretch" | "baseline"
  • direction: "row" | "column" | "row-reverse" | "column-reverse"
  • gap: string
  • justify: "start" | "center" | "end" | "between" | "around" | "evenly"
  • wrap: boolean
columnsinteger (1–24)string
responsiveColumnsobject {name: integer (1–24)}grid columns per breakpoint
gapstring
contentstringliteral text, or an expression starting with = ("=product.name")
bindstringtake content from data: a field of the current item, or props.x, user.x, params.x, state.store.path
tag"div""span""p""section""article""aside""header""footer""nav""main""figure""figcaption""ul""ol""li""dl""dt""dd""blockquote""address""time""small""strong""em""b""i""s""u""mark""cite""q""abbr""sub""sup""del""ins""code""pre""kbd""label""hgroup""h1""h2""h3""h4""h5""h6""details""summary""button"the HTML tag a container or text element renders as, e.g. "ul", "li", "article", "figure"
dataobject
  • aggregate: object — summarise in the database: one record per group with its measures; sort by a group or measure name
  • as: string — identifiers use letters, digits and '_' and do not start with a digit
  • cache: duration (500ms, 6s…) — durations look like 500ms, 30s, 5m, 1h or 7d
  • columns: array of string
  • filter: object {name: string | number | boolean | null | object}
  • include: object {name: object} — related records loaded with each record, one query per include: {"category": {}} or {"reviews": {"source": "DATABASE.reviews", "on": "product"}}
  • items: array of any — inline records for STATIC sources
  • limit: integer (1–500)
  • live: boolean — re-render when the underlying records change (server push)
  • mode: "list" | "single"
  • paginate: object
  • query: object {name: string | number | boolean | null | object} — API sources: query values passed to the api (literals or {param|query|props} references)
  • refresh: duration (500ms, 6s…) — durations look like 500ms, 30s, 5m, 1h or 7d
  • required: boolean — page data: when nothing matches, the page answers 404
  • search: object
  • sort: object
  • source: string — sources are DATABASE.<schema>, API.<name>, STATIC, USER, STATE.<store>.<list> or an expression giving a list ("=product.images")
itemelement
emptyelement
varsobject {name: string}CSS custom properties set from data, per record: {"--accent": "=color", "--progress": "=concat(pct, '%')"}; your stylesheet uses var(--accent)

Plus the properties every element accepts: id, className, style, responsive, states, animation, visible, ariaLabel, attributes and more.

Example

section example
{
  "type": "section",
  "id": "features",
  "layout": { "direction": "column", "align": "center", "gap": "12px" },
  "style": { "padding": "48px 24px", "textAlign": "center" },
  "elements": [
    { "type": "text", "variant": "h2", "content": "Why customers choose us" },
    { "type": "text", "content": "Same-day dispatch and free returns." }
  ]
}

Give a section an id and a button with action: "scroll" (or a link to #features) can jump to it.

Expected output

The HTML IWC rendered for the example above (inside the page's content wrapper). Class names such as i807b63fc are generated per element for its scoped CSS.

Rendered HTML
<div class="iwc-page ipage" id="iwc-content">
  <section class="iwc-section ic3ec7500" id="features">
    <h2 class="iwc-text i1d6e840c iwc-text-h2">
      Why customers choose us
    </h2>
    <p class="iwc-text i6fe7f5e7">
      Same-day dispatch and free returns.
    </p>
  </section>
</div>

Data, conditions & styling

  • Conditional rendering: "visible": {"auth": "signed-in"}, {"roles": ["admin"]} or an expression such as "=product.stock > 0". Decided on the server: hidden elements are never sent.
  • Data binding: bind takes text from data (name, user.name, props.title, params.slug, state.cart.count); binds binds attributes. Containers become data-driven with data + item. See data binding.
  • Styling: className for your stylesheets, style for CSS in JSON, states for hover/focus/active, animation for entrance motion. See the style property reference.
  • Responsive behaviour: responsive applies CSS at or below a breakpoint ({"mobile": {"padding": "12px"}}); grids also take responsiveColumns.