Mixins / foldkit-mixins-ui

MenuView

namespace · packages/mixins-ui/src/menuView.ts:14

export * as MenuView from './menuView.js'

A Menu view with the consumer toView seam @foldkit/ui/menu lacks. State, Messages, update, Commands, and Mounts stay upstream (imported from @foldkit/ui/menu); only markup assembly is transcribed, from @foldkit/ui@0.165.0 (packages/ui/src/menu/index.ts, MIT (c) 2025 Devin Jameson) at tag @foldkit/ui@0.165.0, with the computed bundles named (MenuRenderInfo) and handed to toView.

The default toView reproduces upstream's markup; the parity battery draws both views over the same models, so drift fails loudly. If upstream gains a seam, delete this module; on a bump, re-transcribe and re-run the battery.

In the guides

Members

MenuView.create

function · packages/mixins-ui/src/menuView.ts:526

function create<Item extends string = string>(): MenuBundle<Item>

The forked view with upstream's update and helpers.

MenuView.defaultToView

function · packages/mixins-ui/src/menuView.ts:498

function defaultToView(
  h: HtmlBuilder<Message>,
): (render: MenuRenderInfo) => Html

Upstream's markup from the computed bundles: the default toView.

type · packages/mixins-ui/src/menuView.ts:517

type MenuBundle<Item extends string = string> = Readonly<{
  view: ViewForItem<Item>
  update: (model: Model, message: Message) => BundleUpdateReturn<Item>
  selectItem: (
    model: Model,
    item: Item,
    index: number,
  ) => BundleUpdateReturn<Item>
  open: (model: Model) => BundleUpdateReturn<Item>
  close: (model: Model) => BundleUpdateReturn<Item>
}>

Upstream's Bundle with the forked view.

type · packages/mixins-ui/src/menuView.ts:44

type MenuGroupRender = Readonly<{
  key: string
  heading: MenuHeadingRender | undefined
  group:
    | {
        key: string
        attributes: ReadonlyArray<ChildAttribute>
      }
    | undefined
  separator:
    | {
        key: string
        attributes: ReadonlyArray<ChildAttribute>
      }
    | undefined
  items: ReadonlyArray<MenuItemRender>
}>

type · packages/mixins-ui/src/menuView.ts:38

type MenuHeadingRender = Readonly<{
  id: string
  attributes: ReadonlyArray<ChildAttribute>
  content: Html
}>

type · packages/mixins-ui/src/menuView.ts:32

type MenuItemRender = Readonly<{
  key: string
  attributes: ReadonlyArray<ChildAttribute>
  content: Html
}>

type · packages/mixins-ui/src/menuView.ts:57

type MenuRenderInfo = Readonly<{
  id: string
  isVisible: boolean
  wrapper: ReadonlyArray<ChildAttribute>
  button: ReadonlyArray<ChildAttribute>
  buttonContent: Html
  backdrop:
    | {
        key: string
        attributes: ReadonlyArray<ChildAttribute>
      }
    | undefined
  items:
    | {
        key: string
        attributes: ReadonlyArray<ChildAttribute>
      }
    | undefined
  scroll: ReadonlyArray<ChildAttribute> | undefined
  groups: ReadonlyArray<MenuGroupRender>
}>

The menu's computed bundles. backdrop, items, scroll, and groups are present only while visible; a closed menu carries the rest alone, as upstream renders it.

type · packages/mixins-ui/src/menuView.ts:70

type MenuViewInputs<Item extends string> = ViewInputs<Item> &
  Readonly<{
    toView?: (render: MenuRenderInfo) => Html
  }>

Upstream ViewInputs plus toView.