@motionscript/grids 0.1.0-alpha.7 → 0.1.0-alpha.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/LICENSE +201 -201
- package/NOTICE +49 -48
- package/README.md +118 -118
- package/dist/browser/chunks/{chunk-J62D7EFZ.js → chunk-TYNFMZ3D.js} +1 -1
- package/dist/browser/chunks/chunk-TYNFMZ3D.js.map +7 -0
- package/dist/browser/index.js +1 -1
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/kit.js +1 -1
- package/dist/browser/manifest.json +1 -1
- package/dist/engine.d.ts +1 -1
- package/dist/engine.js +1 -1
- package/dist/engine.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/kit/index.js.map +1 -1
- package/dist/kit/item-effects.js.map +1 -1
- package/dist/kit/item-grid.js.map +1 -1
- package/dist/kit/order.js.map +1 -1
- package/dist/kit/random.js.map +1 -1
- package/dist/kit/slots/index.js.map +1 -1
- package/dist/kit/slots/path-templates.js.map +1 -1
- package/dist/kit/slots/path.js.map +1 -1
- package/dist/kit/slots/radial.js.map +1 -1
- package/dist/kit/slots/rectangular.js.map +1 -1
- package/dist/kit/slots/slot.js.map +1 -1
- package/dist/kit/slots/sphere.js.map +1 -1
- package/dist/kit/stagger.js.map +1 -1
- package/dist/nodes.js.map +1 -1
- package/dist/path-grid/index.js.map +1 -1
- package/dist/path-grid/path-grid.js.map +1 -1
- package/dist/radial-grid/index.js.map +1 -1
- package/dist/radial-grid/radial-grid.js.map +1 -1
- package/dist/rectangular-grid/index.js.map +1 -1
- package/dist/rectangular-grid/rectangular-grid.js.map +1 -1
- package/dist/sphere-grid/index.js.map +1 -1
- package/dist/sphere-grid/sphere-grid.js.map +1 -1
- package/package.json +5 -4
- package/registry.json +32 -32
- package/src/engine.ts +12 -12
- package/src/index.ts +6 -6
- package/src/kit/index.ts +18 -18
- package/src/kit/item-effects.ts +114 -114
- package/src/kit/item-grid.ts +648 -648
- package/src/kit/order.ts +41 -41
- package/src/kit/random.ts +29 -29
- package/src/kit/slots/index.ts +39 -39
- package/src/kit/slots/path-templates.ts +120 -120
- package/src/kit/slots/path.ts +120 -120
- package/src/kit/slots/radial.ts +62 -62
- package/src/kit/slots/rectangular.ts +108 -108
- package/src/kit/slots/slot.ts +82 -82
- package/src/kit/slots/sphere.ts +94 -94
- package/src/kit/stagger.ts +96 -96
- package/src/nodes.ts +30 -30
- package/src/path-grid/index.ts +1 -1
- package/src/path-grid/path-grid.ts +186 -186
- package/src/radial-grid/index.ts +1 -1
- package/src/radial-grid/radial-grid.ts +81 -81
- package/src/rectangular-grid/index.ts +1 -1
- package/src/rectangular-grid/rectangular-grid.ts +145 -145
- package/src/sphere-grid/index.ts +1 -1
- package/src/sphere-grid/sphere-grid.ts +129 -129
- package/dist/browser/chunks/chunk-J62D7EFZ.js.map +0 -7
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/rectangular-grid/rectangular-grid.ts", "../../src/radial-grid/radial-grid.ts", "../../src/path-grid/path-grid.ts", "../../src/sphere-grid/sphere-grid.ts", "../../src/nodes.ts"],
|
|
4
|
-
"sourcesContent": ["import {\r\n component2d,\r\n easeInOut,\r\n Types,\r\n type NodeOf,\r\n type Values,\r\n // Named so the emitted declaration reaches these through the sdk, not core.\r\n type Node2D as _Node2D,\r\n type Node2DProps as _Node2DProps,\r\n} from \"@motionscript/sdk\"\r\n\r\nimport {\r\n CELL_MODES,\r\n FILL_DIRECTIONS,\r\n ItemGrid,\r\n LINE_ALIGNS,\r\n rectangularCell,\r\n staggerArgs,\r\n TRANSITION_STAGGER,\r\n type RectangularArrangement,\r\n} from \"../kit\"\r\n\r\nconst own = {\r\n columns: Types.number(3, { min: 1, step: 1 }),\r\n fillDirection: Types.oneOf(FILL_DIRECTIONS, { default: \"row\" }),\r\n cellMode: Types.oneOf(CELL_MODES, { default: \"fit\" }),\r\n cellWidth: Types.number(120, { min: 0, step: 1 }),\r\n cellHeight: Types.number(120, { min: 0, step: 1 }),\r\n columnGap: Types.number(24, { step: 1 }),\r\n rowGap: Types.number(24, { step: 1 }),\r\n lastLineAlign: Types.oneOf(LINE_ALIGNS, { default: \"start\" }),\r\n rowOffset: Types.number(0, { min: -1, max: 1, step: 0.05 }),\r\n columnOffset: Types.number(0, { min: -1, max: 1, step: 0.05 }),\r\n}\r\n\r\ntype Own = Values<typeof own>\r\n\r\nfunction arrangement(s: Own): RectangularArrangement {\r\n return {\r\n kind: \"rectangular\",\r\n columns: s.columns,\r\n fillDirection: s.fillDirection,\r\n cellMode: s.cellMode,\r\n cellWidth: s.cellWidth,\r\n cellHeight: s.cellHeight,\r\n columnGap: s.columnGap,\r\n rowGap: s.rowGap,\r\n lastLineAlign: s.lastLineAlign,\r\n rowOffset: s.rowOffset,\r\n columnOffset: s.columnOffset,\r\n }\r\n}\r\n\r\nconst arranger: ItemGrid.Arranger<Own> = {\r\n arrangement,\r\n // A child set to fill takes its cell, where the cell is not simply the largest child.\r\n itemSpace: (s, count, space) => (s.cellMode === \"fit\" ? space : rectangularCell(arrangement(s), count, [], space)),\r\n}\r\n\r\n/** The focus args of a row or a column: the grow a row leaves out is the shared focus's. */\r\nconst lineFocus = {\r\n dim: Types.number(0.7, { min: 0, max: 1, step: 0.05 }),\r\n grow: ItemGrid.hinted(0.1, { min: 0, max: 1, step: 0.05 }),\r\n}\r\n\r\n/**\r\n * Children in rows and columns — the grid the other three are variations on.\r\n *\r\n * Cells are as big as the largest child (`fit`), a size of their own\r\n * (`fixed`), or an equal share of the node's box (`fill`), which is also the\r\n * room a child set to fill grows into. Shift every other row by half a cell\r\n * for a brick bond or a hex pack.\r\n */\r\nexport const RectangularGrid = ItemGrid.define(component2d({\r\n key: \"rectangularGrid\",\r\n state: { ...ItemGrid.state, ...own },\r\n defaults: ItemGrid.defaults,\r\n commands: {\r\n ...ItemGrid.commands,\r\n /** Re-flow the items into `columns` columns, each moving to its new cell. */\r\n columnsTo: {\r\n args: { columns: ItemGrid.hinted(4, { min: 1, step: 1 }), ...staggerArgs(TRANSITION_STAGGER) },\r\n run: (timeline, s, children) => {\r\n const columns = Math.max(1, Math.round(timeline.args.columns ?? s.columns))\r\n return ItemGrid.transitionTo(timeline as never, s, children, { columns })\r\n },\r\n },\r\n /** Animate the spacing between columns and rows. */\r\n gapTo: {\r\n args: { columnGap: ItemGrid.hinted(48), rowGap: ItemGrid.hinted(48) },\r\n run: (timeline) => {\r\n const data: { columnGap?: number; rowGap?: number } = {}\r\n if (timeline.args.columnGap !== undefined) data.columnGap = timeline.args.columnGap\r\n if (timeline.args.rowGap !== undefined) data.rowGap = timeline.args.rowGap\r\n return timeline.tween(data)\r\n },\r\n },\r\n /**\r\n * Animate the cell size, from whatever the cells measure now. The grid\r\n * switches to `fixed` cells as it starts, since a size of its own is what\r\n * `fixed` means.\r\n */\r\n cellSizeTo: {\r\n args: { cellWidth: ItemGrid.hinted(160, { min: 0 }), cellHeight: ItemGrid.hinted(160, { min: 0 }) },\r\n easing: easeInOut(\"cubic\"),\r\n run: (timeline, s, children) => {\r\n const sizes = children.map((child) => child.size)\r\n const box = ItemGrid.contentBox(timeline.node.size, s.padding)\r\n const from = rectangularCell(arrangement(s), sizes.length, sizes, box)\r\n const width = timeline.args.cellWidth ?? from.width\r\n const height = timeline.args.cellHeight ?? from.height\r\n return timeline.animate((t) => ({\r\n cellMode: \"fixed\",\r\n cellWidth: from.width + (width - from.width) * t,\r\n cellHeight: from.height + (height - from.height) * t,\r\n }))\r\n },\r\n },\r\n /** Bring one row (from 0 at the top) forward and push the rest back. */\r\n focusRow: {\r\n args: { row: Types.number(0, { min: 0, step: 1 }), ...lineFocus },\r\n run: (timeline, s, children) => {\r\n const slots = ItemGrid.itemSlots(timeline as never, s, children)\r\n const row = Math.round(timeline.args.row ?? 0)\r\n const inRow = (i: number) => slots[i]?.meta.kind === \"rectangular\" && slots[i].meta.row === row\r\n return ItemGrid.focusOn(timeline as never, s, inRow, slots.length, timeline.args.dim ?? 0.7, timeline.args.grow ?? 0.15)\r\n },\r\n },\r\n /** Bring one column (from 0 at the left) forward and push the rest back. */\r\n focusColumn: {\r\n args: { column: Types.number(0, { min: 0, step: 1 }), ...lineFocus },\r\n run: (timeline, s, children) => {\r\n const slots = ItemGrid.itemSlots(timeline as never, s, children)\r\n const column = Math.round(timeline.args.column ?? 0)\r\n const inColumn = (i: number) => slots[i]?.meta.kind === \"rectangular\" && slots[i].meta.column === column\r\n return ItemGrid.focusOn(timeline as never, s, inColumn, slots.length, timeline.args.dim ?? 0.7, timeline.args.grow ?? 0.15)\r\n },\r\n },\r\n },\r\n ...ItemGrid.fields(arranger),\r\n}), arranger)\r\n\r\nexport type RectangularGrid = NodeOf<typeof RectangularGrid>\r\n/** What a call or a document row may set. */\r\nexport type RectangularGridProps = NonNullable<Parameters<typeof RectangularGrid>[0]>\r\n", "import {\r\n component2d,\r\n Types,\r\n type NodeOf,\r\n type Values,\r\n // Named so the emitted declaration reaches these through the sdk, not core.\r\n type Node2D as _Node2D,\r\n type Node2DProps as _Node2DProps,\r\n} from \"@motionscript/sdk\"\r\n\r\nimport { ItemGrid, normalizeOrder, RADIAL_DIRECTIONS, radialTurnToTop, type RadialArrangement } from \"../kit\"\r\n\r\nconst own = {\r\n radius: Types.number(200, { min: 0, step: 1 }),\r\n startAngle: Types.number(0, { step: 1, unit: \"°\" }),\r\n sweep: Types.number(360, { min: -360, max: 360, step: 1, unit: \"°\" }),\r\n direction: Types.oneOf(RADIAL_DIRECTIONS, { default: \"clockwise\" }),\r\n rotateItems: false,\r\n spinSpeed: Types.number(0, { step: 1, unit: \"°/s\" }),\r\n}\r\n\r\ntype Own = Values<typeof own>\r\n\r\nfunction arrangement(s: Own): RadialArrangement {\r\n return {\r\n kind: \"radial\",\r\n radius: s.radius,\r\n startAngle: s.startAngle,\r\n sweep: s.sweep,\r\n direction: s.direction,\r\n rotateItems: s.rotateItems,\r\n spinSpeed: s.spinSpeed,\r\n }\r\n}\r\n\r\nconst arranger: ItemGrid.Arranger<Own> = { arrangement }\r\n\r\n/**\r\n * Children round a circle, or along an arc of one.\r\n *\r\n * A full circle spaces the items evenly with none on top of another; an arc\r\n * puts one at each end. Angles run clockwise from twelve o'clock, so `turnTo`\r\n * can bring any item to the top like a dial.\r\n */\r\nexport const RadialGrid = ItemGrid.define(component2d({\r\n key: \"radialGrid\",\r\n state: { ...ItemGrid.state, ...own },\r\n defaults: ItemGrid.defaults,\r\n commands: {\r\n ...ItemGrid.commands,\r\n /** Orbit the items round the centre by `degrees` — `360` is one full turn. */\r\n spin: {\r\n args: { degrees: Types.number(360, { step: 15, unit: \"°\" }) },\r\n run: (timeline, s) => timeline.tween({ startAngle: s.startAngle + (timeline.args.degrees ?? 360) }),\r\n },\r\n /** Turn the ring the shorter way round until an item (by its place in the layers) sits at the top. */\r\n turnTo: {\r\n args: { item: Types.number(0, { min: 0, step: 1 }) },\r\n run: (timeline, s, children) => {\r\n const count = children.length\r\n const slot = normalizeOrder(s.order, count).indexOf(Math.round(timeline.args.item ?? 0))\r\n const turn = slot < 0 ? 0 : radialTurnToTop(arrangement(s), count, slot)\r\n return timeline.tween({ startAngle: s.startAngle + turn })\r\n },\r\n },\r\n radiusTo: {\r\n args: { radius: ItemGrid.hinted(280, { min: 0 }) },\r\n run: (timeline, s) => timeline.tween({ radius: timeline.args.radius ?? s.radius }),\r\n },\r\n /** Open or close the arc like a fan — from `0` to `360` is a reveal of its own. */\r\n sweepTo: {\r\n args: { sweep: ItemGrid.hinted(360, { min: -360, max: 360, unit: \"°\" }) },\r\n run: (timeline, s) => timeline.tween({ sweep: timeline.args.sweep ?? s.sweep }),\r\n },\r\n },\r\n ...ItemGrid.fields(arranger),\r\n}), arranger)\r\n\r\nexport type RadialGrid = NodeOf<typeof RadialGrid>\r\n/** What a call or a document row may set. */\r\nexport type RadialGridProps = NonNullable<Parameters<typeof RadialGrid>[0]>\r\n", "import {\r\n component2d,\r\n pathOps,\r\n Types,\r\n type NodeOf,\r\n type NodeView,\r\n type PathData,\r\n type Size2D,\r\n type Values,\r\n // Named so the emitted declaration reaches these through the sdk, not core.\r\n type Node2D as _Node2D,\r\n type Node2DProps as _Node2DProps,\r\n} from \"@motionscript/sdk\"\r\n\r\nimport {\r\n ItemGrid,\r\n PATH_SPACINGS,\r\n PATH_TEMPLATES,\r\n staggerArgs,\r\n TRANSITION_STAGGER,\r\n templatePath,\r\n type PathArrangement,\r\n type PathPlacement,\r\n type PathTemplate,\r\n} from \"../kit\"\r\n\r\n/** A template, or `custom` for the grid's own `path`. */\r\nexport const PATH_GRID_SHAPES = [...PATH_TEMPLATES, \"custom\"] as const\r\nexport type PathGridShape = (typeof PATH_GRID_SHAPES)[number]\r\n\r\nconst own = {\r\n shape: Types.oneOf(PATH_GRID_SHAPES, { default: \"circle\" }),\r\n /** Used when `shape` is `custom`: an SVG path, y-down as SVG writes one, centred on its own bounds. */\r\n path: Types.path,\r\n /** A path node to follow instead, by id — the items track it wherever it goes. */\r\n pathNode: ItemGrid.nodeRef([\"path\"]),\r\n spacing: Types.oneOf(PATH_SPACINGS, { default: \"distribute\" }),\r\n spacingDistance: Types.number(80, { min: 0, step: 1 }),\r\n /** Share of the path the items are moved along — `1` is once round. */\r\n offset: Types.number(0, { step: 0.01 }),\r\n /** Share of the path per second the items travel on their own. */\r\n flowSpeed: Types.number(0, { step: 0.01, unit: \"/s\" }),\r\n trimStart: Types.number(0, { min: 0, max: 1, step: 0.01 }),\r\n trimEnd: Types.number(1, { min: 0, max: 1, step: 0.01 }),\r\n alignToPath: true,\r\n}\r\n\r\ntype Own = Values<typeof own>\r\n\r\nconst AT_ORIGIN: PathPlacement = { originX: 0, originY: 0, x: 0, y: 0, rotation: 0, scale: 1 }\r\n\r\n/** The size a path grid is placed at when nothing says otherwise, since a template is drawn to fill it. */\r\nconst DEFAULT_SIZE = { width: 640, height: 400 }\r\n\r\nconst arranger: ItemGrid.Arranger<Own> = {\r\n arrangement: (s, box): PathArrangement => {\r\n const { path, placement } = pathIn(s, box)\r\n return {\r\n kind: \"path\",\r\n path,\r\n placement,\r\n spacing: s.spacing,\r\n spacingDistance: s.spacingDistance,\r\n offset: s.offset,\r\n flowSpeed: s.flowSpeed,\r\n trimStart: s.trimStart,\r\n trimEnd: s.trimEnd,\r\n alignToPath: s.alignToPath,\r\n }\r\n },\r\n}\r\n\r\n/**\r\n * Children along a path: one of the templates drawn to fill the node's box,\r\n * a path of the grid's own, or a path node elsewhere in the scene, followed\r\n * wherever it is.\r\n *\r\n * Items are spaced by distance along the curve, so they sit evenly on a tight\r\n * bend and a straight alike. Animating `offset` moves them along it — on a\r\n * closed path they come round again, which is a conveyor belt for free.\r\n */\r\nexport const PathGrid = ItemGrid.define(component2d({\r\n key: \"pathGrid\",\r\n state: { ...ItemGrid.state, ...own },\r\n // A template is drawn to fill the box, so a path grid needs one of its own\r\n // rather than hugging items whose places depend on it.\r\n defaults: { ...DEFAULT_SIZE },\r\n commands: {\r\n ...ItemGrid.commands,\r\n /** Move the items along the path by `loops` — `1` is once round, and they keep their spacing. */\r\n flow: {\r\n args: { loops: Types.number(1, { step: 0.25 }) },\r\n run: (timeline, s) => timeline.tween({ offset: s.offset + (timeline.args.loops ?? 1) }),\r\n },\r\n /** Squeeze the items into part of the path, between two shares of its length. */\r\n trimTo: {\r\n args: {\r\n trimStart: ItemGrid.hinted(0.25, { min: 0, max: 1, step: 0.01 }),\r\n trimEnd: ItemGrid.hinted(0.75, { min: 0, max: 1, step: 0.01 }),\r\n },\r\n run: (timeline, s) => timeline.tween({\r\n trimStart: timeline.args.trimStart ?? s.trimStart,\r\n trimEnd: timeline.args.trimEnd ?? s.trimEnd,\r\n }),\r\n },\r\n /**\r\n * Move the items onto another path — a template, or a path node in the\r\n * scene. Each item travels from its place on the old path to its place on\r\n * the new one; the path itself is not morphed.\r\n */\r\n setPath: {\r\n args: {\r\n shape: ItemGrid.hinted(\"heart\", { kind: \"enum\", options: PATH_GRID_SHAPES }),\r\n pathNode: ItemGrid.nodeRefArg([\"path\"]),\r\n ...staggerArgs(TRANSITION_STAGGER),\r\n },\r\n run: (timeline, s, children) => {\r\n const pathNode = timeline.args.pathNode ?? \"\"\r\n const changes = pathNode ? { pathNode } : { shape: timeline.args.shape ?? s.shape, pathNode: \"\" }\r\n return ItemGrid.transitionTo(timeline as never, s, children, changes)\r\n },\r\n },\r\n },\r\n ...ItemGrid.fields(arranger),\r\n}), arranger)\r\n\r\nexport type PathGrid = NodeOf<typeof PathGrid>\r\n/** What a call or a document row may set. */\r\nexport type PathGridProps = NonNullable<Parameters<typeof PathGrid>[0]>\r\n\r\n/** The path the items follow, and where its coordinates land in this grid's frame. */\r\nfunction pathIn(s: Own, box: Size2D): { path: PathData; placement: PathPlacement } {\r\n const linked = s.pathNode\r\n // A document `path` draws its data in its own unit box, at its own position.\r\n if (linked?.key === \"path\") return { path: unitPath(linked), placement: { ...AT_ORIGIN, ...linked.frame } }\r\n // A face-value path draws its data centred on the data's own bounds, at its own position.\r\n const data = linked?.key === \"facePath\" ? dataOf(linked) : undefined\r\n const bounds = data !== undefined ? pathOps.bounds(data) : null\r\n if (linked && data !== undefined && bounds) {\r\n return {\r\n path: data,\r\n placement: {\r\n originX: (bounds.minX + bounds.maxX) / 2,\r\n originY: (bounds.minY + bounds.maxY) / 2,\r\n ...linked.frame,\r\n },\r\n }\r\n }\r\n if (s.shape === \"custom\") {\r\n const own = pathOps.bounds(s.path)\r\n if (own) {\r\n return {\r\n path: s.path,\r\n placement: {\r\n ...AT_ORIGIN,\r\n originX: (own.minX + own.maxX) / 2,\r\n originY: (own.minY + own.maxY) / 2,\r\n flipY: true,\r\n },\r\n }\r\n }\r\n }\r\n const template: PathTemplate = s.shape === \"custom\" ? \"circle\" : s.shape\r\n return { path: templatePath(template, box), placement: AT_ORIGIN }\r\n}\r\n\r\nfunction dataOf(view: NodeView): PathData {\r\n return (view.state as { readonly data: PathData }).data\r\n}\r\n\r\nconst unitPaths = new WeakMap<NodeView, { data: PathData; width: number; height: number; path: PathData }>()\r\n\r\n/**\r\n * A path node's geometry as it draws it: stored in its unit box, y-down, and\r\n * scaled to its laid-out size — kept while neither changes, so the path's\r\n * measurement is kept with it.\r\n */\r\nfunction unitPath(view: NodeView): PathData {\r\n const data = dataOf(view)\r\n const { width, height } = view.size\r\n const cached = unitPaths.get(view)\r\n if (cached && cached.data === data && cached.width === width && cached.height === height) return cached.path\r\n const path = pathOps.anchorCommands(pathOps.anchors(data), (p) => ({ x: p.x * width, y: -p.y * height }))\r\n unitPaths.set(view, { data, width, height, path })\r\n return path\r\n}\r\n", "import {\r\n component2d,\r\n Types,\r\n type NodeOf,\r\n type Values,\r\n // Named so the emitted declaration reaches these through the sdk, not core.\r\n type Node2D as _Node2D,\r\n type Node2DProps as _Node2DProps,\r\n} from \"@motionscript/sdk\"\r\n\r\nimport {\r\n ItemGrid,\r\n normalizeOrder,\r\n SPHERE_AXES,\r\n SPHERE_FACINGS,\r\n sphereFaceForward,\r\n wrapDegrees,\r\n type SphereArrangement,\r\n type SphereAxis,\r\n} from \"../kit\"\r\n\r\nconst own = {\r\n radius: Types.number(220, { min: 0, step: 1 }),\r\n yaw: Types.number(0, { step: 1, unit: \"°\" }),\r\n pitch: Types.number(0, { step: 1, unit: \"°\" }),\r\n roll: Types.number(0, { step: 1, unit: \"°\" }),\r\n facing: Types.oneOf(SPHERE_FACINGS, { default: \"outward\" }),\r\n focalLength: Types.number(900, { min: 100, step: 10 }),\r\n depthFade: Types.number(0.5, { min: 0, max: 1, step: 0.05 }),\r\n cullBackfaces: false,\r\n spinSpeed: Types.number(0, { step: 1, unit: \"°/s\" }),\r\n}\r\n\r\ntype Own = Values<typeof own>\r\n\r\nfunction arrangement(s: Own): SphereArrangement {\r\n return {\r\n kind: \"sphere\",\r\n radius: s.radius,\r\n yaw: s.yaw,\r\n pitch: s.pitch,\r\n roll: s.roll,\r\n facing: s.facing,\r\n focalLength: s.focalLength,\r\n depthFade: s.depthFade,\r\n cullBackfaces: s.cullBackfaces,\r\n spinSpeed: s.spinSpeed,\r\n }\r\n}\r\n\r\nconst arranger: ItemGrid.Arranger<Own> = { arrangement }\r\n\r\nconst AXIS_PROP: Record<SphereAxis, \"yaw\" | \"pitch\" | \"roll\"> = { x: \"pitch\", y: \"yaw\", z: \"roll\" }\r\n\r\n/**\r\n * Children spread over a sphere — a Fibonacci lattice, as even as any number\r\n * of points gets — and seen through a camera of the grid's own, so the far\r\n * side is smaller, drawn first, and hidden where a face turns away.\r\n *\r\n * `outward` lays each item flat on the surface; `billboard` keeps each one\r\n * facing the viewer, like labels on a globe. `turnTo` brings any item round\r\n * to the front.\r\n */\r\nexport const SphereGrid = ItemGrid.define(component2d({\r\n key: \"sphereGrid\",\r\n state: { ...ItemGrid.state, ...own },\r\n defaults: ItemGrid.defaults,\r\n commands: {\r\n ...ItemGrid.commands,\r\n /** Turn the sphere about an axis by `degrees` — `y` spins it like a globe. */\r\n spin: {\r\n args: {\r\n axis: Types.oneOf(SPHERE_AXES, { default: \"y\" }),\r\n degrees: Types.number(360, { step: 15, unit: \"°\" }),\r\n },\r\n run: (timeline, s) => {\r\n const key = AXIS_PROP[timeline.args.axis ?? \"y\"] ?? \"yaw\"\r\n return timeline.tween({ [key]: s[key] + (timeline.args.degrees ?? 360) })\r\n },\r\n },\r\n /** Turn the sphere to a set orientation. */\r\n orientTo: {\r\n args: {\r\n yaw: ItemGrid.hinted(45, { unit: \"°\" }),\r\n pitch: ItemGrid.hinted(20, { unit: \"°\" }),\r\n roll: ItemGrid.hinted(0, { unit: \"°\" }),\r\n },\r\n run: (timeline, s) => timeline.tween({\r\n yaw: timeline.args.yaw ?? s.yaw,\r\n pitch: timeline.args.pitch ?? s.pitch,\r\n roll: timeline.args.roll ?? s.roll,\r\n }),\r\n },\r\n /**\r\n * Turn the sphere the shorter way until an item (by its place in the layers)\r\n * faces the viewer. It turns from the orientation the sphere is given: the\r\n * yaw its `spinSpeed` adds by the time the command runs is not counted, as\r\n * commands are built against the tree standing at time 0.\r\n */\r\n turnTo: {\r\n args: { item: Types.number(0, { min: 0, step: 1 }) },\r\n run: (timeline, s, children) => {\r\n const count = children.length\r\n const slot = normalizeOrder(s.order, count).indexOf(Math.round(timeline.args.item ?? 0))\r\n if (slot < 0) return timeline.tween({})\r\n const facing = sphereFaceForward(count, slot)\r\n return timeline.tween({\r\n yaw: s.yaw + wrapDegrees(facing.yaw - s.yaw),\r\n pitch: s.pitch + wrapDegrees(facing.pitch - s.pitch),\r\n roll: 0,\r\n })\r\n },\r\n },\r\n radiusTo: {\r\n args: { radius: ItemGrid.hinted(300, { min: 0 }) },\r\n run: (timeline, s) => timeline.tween({ radius: timeline.args.radius ?? s.radius }),\r\n },\r\n /** Dolly the camera: a shorter focal length exaggerates the depth, a longer one flattens it. */\r\n focalLengthTo: {\r\n args: { focalLength: ItemGrid.hinted(600, { min: 100 }) },\r\n run: (timeline, s) => timeline.tween({ focalLength: timeline.args.focalLength ?? s.focalLength }),\r\n },\r\n },\r\n ...ItemGrid.fields(arranger),\r\n}), arranger)\r\n\r\nexport type SphereGrid = NodeOf<typeof SphereGrid>\r\n/** What a call or a document row may set. */\r\nexport type SphereGridProps = NonNullable<Parameters<typeof SphereGrid>[0]>\r\n", "import { PathGrid } from \"./path-grid\"\r\nimport { RadialGrid } from \"./radial-grid\"\r\nimport { RectangularGrid } from \"./rectangular-grid\"\r\nimport { SphereGrid } from \"./sphere-grid\"\r\n\r\n/**\r\n * Every node type this package publishes.\r\n *\r\n * A host registers these by handing the array to an engine —\r\n * `new Engine(platform, { nodes: NODES })` — which reads each component's key.\r\n * Defining a component only *declares* that key: nothing is registered by\r\n * importing a module, so a registry holds exactly what its owner asked for.\r\n *\r\n * Listing the component **values** is also what survives bundling: this package\r\n * declares `sideEffects: false`, and a document names a node type by string, so\r\n * an import kept only for its side effect is exactly what gets shaken out.\r\n */\r\n// Typed by name, so the declaration names each component rather than spelling out its type through core.\r\ntype KitNode =\r\n | typeof RectangularGrid\r\n | typeof RadialGrid\r\n | typeof PathGrid\r\n | typeof SphereGrid\r\n\r\nexport const NODES: KitNode[] = [\r\n RectangularGrid,\r\n RadialGrid,\r\n PathGrid,\r\n SphereGrid,\r\n]\r\n"],
|
|
4
|
+
"sourcesContent": ["import {\n component2d,\n easeInOut,\n Types,\n type NodeOf,\n type Values,\n // Named so the emitted declaration reaches these through the sdk, not core.\n type Node2D as _Node2D,\n type Node2DProps as _Node2DProps,\n} from \"@motionscript/sdk\"\n\nimport {\n CELL_MODES,\n FILL_DIRECTIONS,\n ItemGrid,\n LINE_ALIGNS,\n rectangularCell,\n staggerArgs,\n TRANSITION_STAGGER,\n type RectangularArrangement,\n} from \"../kit\"\n\nconst own = {\n columns: Types.number(3, { min: 1, step: 1 }),\n fillDirection: Types.oneOf(FILL_DIRECTIONS, { default: \"row\" }),\n cellMode: Types.oneOf(CELL_MODES, { default: \"fit\" }),\n cellWidth: Types.number(120, { min: 0, step: 1 }),\n cellHeight: Types.number(120, { min: 0, step: 1 }),\n columnGap: Types.number(24, { step: 1 }),\n rowGap: Types.number(24, { step: 1 }),\n lastLineAlign: Types.oneOf(LINE_ALIGNS, { default: \"start\" }),\n rowOffset: Types.number(0, { min: -1, max: 1, step: 0.05 }),\n columnOffset: Types.number(0, { min: -1, max: 1, step: 0.05 }),\n}\n\ntype Own = Values<typeof own>\n\nfunction arrangement(s: Own): RectangularArrangement {\n return {\n kind: \"rectangular\",\n columns: s.columns,\n fillDirection: s.fillDirection,\n cellMode: s.cellMode,\n cellWidth: s.cellWidth,\n cellHeight: s.cellHeight,\n columnGap: s.columnGap,\n rowGap: s.rowGap,\n lastLineAlign: s.lastLineAlign,\n rowOffset: s.rowOffset,\n columnOffset: s.columnOffset,\n }\n}\n\nconst arranger: ItemGrid.Arranger<Own> = {\n arrangement,\n // A child set to fill takes its cell, where the cell is not simply the largest child.\n itemSpace: (s, count, space) => (s.cellMode === \"fit\" ? space : rectangularCell(arrangement(s), count, [], space)),\n}\n\n/** The focus args of a row or a column: the grow a row leaves out is the shared focus's. */\nconst lineFocus = {\n dim: Types.number(0.7, { min: 0, max: 1, step: 0.05 }),\n grow: ItemGrid.hinted(0.1, { min: 0, max: 1, step: 0.05 }),\n}\n\n/**\n * Children in rows and columns — the grid the other three are variations on.\n *\n * Cells are as big as the largest child (`fit`), a size of their own\n * (`fixed`), or an equal share of the node's box (`fill`), which is also the\n * room a child set to fill grows into. Shift every other row by half a cell\n * for a brick bond or a hex pack.\n */\nexport const RectangularGrid = ItemGrid.define(component2d({\n key: \"rectangularGrid\",\n state: { ...ItemGrid.state, ...own },\n defaults: ItemGrid.defaults,\n commands: {\n ...ItemGrid.commands,\n /** Re-flow the items into `columns` columns, each moving to its new cell. */\n columnsTo: {\n args: { columns: ItemGrid.hinted(4, { min: 1, step: 1 }), ...staggerArgs(TRANSITION_STAGGER) },\n run: (timeline, s, children) => {\n const columns = Math.max(1, Math.round(timeline.args.columns ?? s.columns))\n return ItemGrid.transitionTo(timeline as never, s, children, { columns })\n },\n },\n /** Animate the spacing between columns and rows. */\n gapTo: {\n args: { columnGap: ItemGrid.hinted(48), rowGap: ItemGrid.hinted(48) },\n run: (timeline) => {\n const data: { columnGap?: number; rowGap?: number } = {}\n if (timeline.args.columnGap !== undefined) data.columnGap = timeline.args.columnGap\n if (timeline.args.rowGap !== undefined) data.rowGap = timeline.args.rowGap\n return timeline.tween(data)\n },\n },\n /**\n * Animate the cell size, from whatever the cells measure now. The grid\n * switches to `fixed` cells as it starts, since a size of its own is what\n * `fixed` means.\n */\n cellSizeTo: {\n args: { cellWidth: ItemGrid.hinted(160, { min: 0 }), cellHeight: ItemGrid.hinted(160, { min: 0 }) },\n easing: easeInOut(\"cubic\"),\n run: (timeline, s, children) => {\n const sizes = children.map((child) => child.size)\n const box = ItemGrid.contentBox(timeline.node.size, s.padding)\n const from = rectangularCell(arrangement(s), sizes.length, sizes, box)\n const width = timeline.args.cellWidth ?? from.width\n const height = timeline.args.cellHeight ?? from.height\n return timeline.animate((t) => ({\n cellMode: \"fixed\",\n cellWidth: from.width + (width - from.width) * t,\n cellHeight: from.height + (height - from.height) * t,\n }))\n },\n },\n /** Bring one row (from 0 at the top) forward and push the rest back. */\n focusRow: {\n args: { row: Types.number(0, { min: 0, step: 1 }), ...lineFocus },\n run: (timeline, s, children) => {\n const slots = ItemGrid.itemSlots(timeline as never, s, children)\n const row = Math.round(timeline.args.row ?? 0)\n const inRow = (i: number) => slots[i]?.meta.kind === \"rectangular\" && slots[i].meta.row === row\n return ItemGrid.focusOn(timeline as never, s, inRow, slots.length, timeline.args.dim ?? 0.7, timeline.args.grow ?? 0.15)\n },\n },\n /** Bring one column (from 0 at the left) forward and push the rest back. */\n focusColumn: {\n args: { column: Types.number(0, { min: 0, step: 1 }), ...lineFocus },\n run: (timeline, s, children) => {\n const slots = ItemGrid.itemSlots(timeline as never, s, children)\n const column = Math.round(timeline.args.column ?? 0)\n const inColumn = (i: number) => slots[i]?.meta.kind === \"rectangular\" && slots[i].meta.column === column\n return ItemGrid.focusOn(timeline as never, s, inColumn, slots.length, timeline.args.dim ?? 0.7, timeline.args.grow ?? 0.15)\n },\n },\n },\n ...ItemGrid.fields(arranger),\n}), arranger)\n\nexport type RectangularGrid = NodeOf<typeof RectangularGrid>\n/** What a call or a document row may set. */\nexport type RectangularGridProps = NonNullable<Parameters<typeof RectangularGrid>[0]>\n", "import {\n component2d,\n Types,\n type NodeOf,\n type Values,\n // Named so the emitted declaration reaches these through the sdk, not core.\n type Node2D as _Node2D,\n type Node2DProps as _Node2DProps,\n} from \"@motionscript/sdk\"\n\nimport { ItemGrid, normalizeOrder, RADIAL_DIRECTIONS, radialTurnToTop, type RadialArrangement } from \"../kit\"\n\nconst own = {\n radius: Types.number(200, { min: 0, step: 1 }),\n startAngle: Types.number(0, { step: 1, unit: \"°\" }),\n sweep: Types.number(360, { min: -360, max: 360, step: 1, unit: \"°\" }),\n direction: Types.oneOf(RADIAL_DIRECTIONS, { default: \"clockwise\" }),\n rotateItems: false,\n spinSpeed: Types.number(0, { step: 1, unit: \"°/s\" }),\n}\n\ntype Own = Values<typeof own>\n\nfunction arrangement(s: Own): RadialArrangement {\n return {\n kind: \"radial\",\n radius: s.radius,\n startAngle: s.startAngle,\n sweep: s.sweep,\n direction: s.direction,\n rotateItems: s.rotateItems,\n spinSpeed: s.spinSpeed,\n }\n}\n\nconst arranger: ItemGrid.Arranger<Own> = { arrangement }\n\n/**\n * Children round a circle, or along an arc of one.\n *\n * A full circle spaces the items evenly with none on top of another; an arc\n * puts one at each end. Angles run clockwise from twelve o'clock, so `turnTo`\n * can bring any item to the top like a dial.\n */\nexport const RadialGrid = ItemGrid.define(component2d({\n key: \"radialGrid\",\n state: { ...ItemGrid.state, ...own },\n defaults: ItemGrid.defaults,\n commands: {\n ...ItemGrid.commands,\n /** Orbit the items round the centre by `degrees` — `360` is one full turn. */\n spin: {\n args: { degrees: Types.number(360, { step: 15, unit: \"°\" }) },\n run: (timeline, s) => timeline.tween({ startAngle: s.startAngle + (timeline.args.degrees ?? 360) }),\n },\n /** Turn the ring the shorter way round until an item (by its place in the layers) sits at the top. */\n turnTo: {\n args: { item: Types.number(0, { min: 0, step: 1 }) },\n run: (timeline, s, children) => {\n const count = children.length\n const slot = normalizeOrder(s.order, count).indexOf(Math.round(timeline.args.item ?? 0))\n const turn = slot < 0 ? 0 : radialTurnToTop(arrangement(s), count, slot)\n return timeline.tween({ startAngle: s.startAngle + turn })\n },\n },\n radiusTo: {\n args: { radius: ItemGrid.hinted(280, { min: 0 }) },\n run: (timeline, s) => timeline.tween({ radius: timeline.args.radius ?? s.radius }),\n },\n /** Open or close the arc like a fan — from `0` to `360` is a reveal of its own. */\n sweepTo: {\n args: { sweep: ItemGrid.hinted(360, { min: -360, max: 360, unit: \"°\" }) },\n run: (timeline, s) => timeline.tween({ sweep: timeline.args.sweep ?? s.sweep }),\n },\n },\n ...ItemGrid.fields(arranger),\n}), arranger)\n\nexport type RadialGrid = NodeOf<typeof RadialGrid>\n/** What a call or a document row may set. */\nexport type RadialGridProps = NonNullable<Parameters<typeof RadialGrid>[0]>\n", "import {\n component2d,\n pathOps,\n Types,\n type NodeOf,\n type NodeView,\n type PathData,\n type Size2D,\n type Values,\n // Named so the emitted declaration reaches these through the sdk, not core.\n type Node2D as _Node2D,\n type Node2DProps as _Node2DProps,\n} from \"@motionscript/sdk\"\n\nimport {\n ItemGrid,\n PATH_SPACINGS,\n PATH_TEMPLATES,\n staggerArgs,\n TRANSITION_STAGGER,\n templatePath,\n type PathArrangement,\n type PathPlacement,\n type PathTemplate,\n} from \"../kit\"\n\n/** A template, or `custom` for the grid's own `path`. */\nexport const PATH_GRID_SHAPES = [...PATH_TEMPLATES, \"custom\"] as const\nexport type PathGridShape = (typeof PATH_GRID_SHAPES)[number]\n\nconst own = {\n shape: Types.oneOf(PATH_GRID_SHAPES, { default: \"circle\" }),\n /** Used when `shape` is `custom`: an SVG path, y-down as SVG writes one, centred on its own bounds. */\n path: Types.path,\n /** A path node to follow instead, by id — the items track it wherever it goes. */\n pathNode: ItemGrid.nodeRef([\"path\"]),\n spacing: Types.oneOf(PATH_SPACINGS, { default: \"distribute\" }),\n spacingDistance: Types.number(80, { min: 0, step: 1 }),\n /** Share of the path the items are moved along — `1` is once round. */\n offset: Types.number(0, { step: 0.01 }),\n /** Share of the path per second the items travel on their own. */\n flowSpeed: Types.number(0, { step: 0.01, unit: \"/s\" }),\n trimStart: Types.number(0, { min: 0, max: 1, step: 0.01 }),\n trimEnd: Types.number(1, { min: 0, max: 1, step: 0.01 }),\n alignToPath: true,\n}\n\ntype Own = Values<typeof own>\n\nconst AT_ORIGIN: PathPlacement = { originX: 0, originY: 0, x: 0, y: 0, rotation: 0, scale: 1 }\n\n/** The size a path grid is placed at when nothing says otherwise, since a template is drawn to fill it. */\nconst DEFAULT_SIZE = { width: 640, height: 400 }\n\nconst arranger: ItemGrid.Arranger<Own> = {\n arrangement: (s, box): PathArrangement => {\n const { path, placement } = pathIn(s, box)\n return {\n kind: \"path\",\n path,\n placement,\n spacing: s.spacing,\n spacingDistance: s.spacingDistance,\n offset: s.offset,\n flowSpeed: s.flowSpeed,\n trimStart: s.trimStart,\n trimEnd: s.trimEnd,\n alignToPath: s.alignToPath,\n }\n },\n}\n\n/**\n * Children along a path: one of the templates drawn to fill the node's box,\n * a path of the grid's own, or a path node elsewhere in the scene, followed\n * wherever it is.\n *\n * Items are spaced by distance along the curve, so they sit evenly on a tight\n * bend and a straight alike. Animating `offset` moves them along it — on a\n * closed path they come round again, which is a conveyor belt for free.\n */\nexport const PathGrid = ItemGrid.define(component2d({\n key: \"pathGrid\",\n state: { ...ItemGrid.state, ...own },\n // A template is drawn to fill the box, so a path grid needs one of its own\n // rather than hugging items whose places depend on it.\n defaults: { ...DEFAULT_SIZE },\n commands: {\n ...ItemGrid.commands,\n /** Move the items along the path by `loops` — `1` is once round, and they keep their spacing. */\n flow: {\n args: { loops: Types.number(1, { step: 0.25 }) },\n run: (timeline, s) => timeline.tween({ offset: s.offset + (timeline.args.loops ?? 1) }),\n },\n /** Squeeze the items into part of the path, between two shares of its length. */\n trimTo: {\n args: {\n trimStart: ItemGrid.hinted(0.25, { min: 0, max: 1, step: 0.01 }),\n trimEnd: ItemGrid.hinted(0.75, { min: 0, max: 1, step: 0.01 }),\n },\n run: (timeline, s) => timeline.tween({\n trimStart: timeline.args.trimStart ?? s.trimStart,\n trimEnd: timeline.args.trimEnd ?? s.trimEnd,\n }),\n },\n /**\n * Move the items onto another path — a template, or a path node in the\n * scene. Each item travels from its place on the old path to its place on\n * the new one; the path itself is not morphed.\n */\n setPath: {\n args: {\n shape: ItemGrid.hinted(\"heart\", { kind: \"enum\", options: PATH_GRID_SHAPES }),\n pathNode: ItemGrid.nodeRefArg([\"path\"]),\n ...staggerArgs(TRANSITION_STAGGER),\n },\n run: (timeline, s, children) => {\n const pathNode = timeline.args.pathNode ?? \"\"\n const changes = pathNode ? { pathNode } : { shape: timeline.args.shape ?? s.shape, pathNode: \"\" }\n return ItemGrid.transitionTo(timeline as never, s, children, changes)\n },\n },\n },\n ...ItemGrid.fields(arranger),\n}), arranger)\n\nexport type PathGrid = NodeOf<typeof PathGrid>\n/** What a call or a document row may set. */\nexport type PathGridProps = NonNullable<Parameters<typeof PathGrid>[0]>\n\n/** The path the items follow, and where its coordinates land in this grid's frame. */\nfunction pathIn(s: Own, box: Size2D): { path: PathData; placement: PathPlacement } {\n const linked = s.pathNode\n // A document `path` draws its data in its own unit box, at its own position.\n if (linked?.key === \"path\") return { path: unitPath(linked), placement: { ...AT_ORIGIN, ...linked.frame } }\n // A face-value path draws its data centred on the data's own bounds, at its own position.\n const data = linked?.key === \"facePath\" ? dataOf(linked) : undefined\n const bounds = data !== undefined ? pathOps.bounds(data) : null\n if (linked && data !== undefined && bounds) {\n return {\n path: data,\n placement: {\n originX: (bounds.minX + bounds.maxX) / 2,\n originY: (bounds.minY + bounds.maxY) / 2,\n ...linked.frame,\n },\n }\n }\n if (s.shape === \"custom\") {\n const own = pathOps.bounds(s.path)\n if (own) {\n return {\n path: s.path,\n placement: {\n ...AT_ORIGIN,\n originX: (own.minX + own.maxX) / 2,\n originY: (own.minY + own.maxY) / 2,\n flipY: true,\n },\n }\n }\n }\n const template: PathTemplate = s.shape === \"custom\" ? \"circle\" : s.shape\n return { path: templatePath(template, box), placement: AT_ORIGIN }\n}\n\nfunction dataOf(view: NodeView): PathData {\n return (view.state as { readonly data: PathData }).data\n}\n\nconst unitPaths = new WeakMap<NodeView, { data: PathData; width: number; height: number; path: PathData }>()\n\n/**\n * A path node's geometry as it draws it: stored in its unit box, y-down, and\n * scaled to its laid-out size — kept while neither changes, so the path's\n * measurement is kept with it.\n */\nfunction unitPath(view: NodeView): PathData {\n const data = dataOf(view)\n const { width, height } = view.size\n const cached = unitPaths.get(view)\n if (cached && cached.data === data && cached.width === width && cached.height === height) return cached.path\n const path = pathOps.anchorCommands(pathOps.anchors(data), (p) => ({ x: p.x * width, y: -p.y * height }))\n unitPaths.set(view, { data, width, height, path })\n return path\n}\n", "import {\n component2d,\n Types,\n type NodeOf,\n type Values,\n // Named so the emitted declaration reaches these through the sdk, not core.\n type Node2D as _Node2D,\n type Node2DProps as _Node2DProps,\n} from \"@motionscript/sdk\"\n\nimport {\n ItemGrid,\n normalizeOrder,\n SPHERE_AXES,\n SPHERE_FACINGS,\n sphereFaceForward,\n wrapDegrees,\n type SphereArrangement,\n type SphereAxis,\n} from \"../kit\"\n\nconst own = {\n radius: Types.number(220, { min: 0, step: 1 }),\n yaw: Types.number(0, { step: 1, unit: \"°\" }),\n pitch: Types.number(0, { step: 1, unit: \"°\" }),\n roll: Types.number(0, { step: 1, unit: \"°\" }),\n facing: Types.oneOf(SPHERE_FACINGS, { default: \"outward\" }),\n focalLength: Types.number(900, { min: 100, step: 10 }),\n depthFade: Types.number(0.5, { min: 0, max: 1, step: 0.05 }),\n cullBackfaces: false,\n spinSpeed: Types.number(0, { step: 1, unit: \"°/s\" }),\n}\n\ntype Own = Values<typeof own>\n\nfunction arrangement(s: Own): SphereArrangement {\n return {\n kind: \"sphere\",\n radius: s.radius,\n yaw: s.yaw,\n pitch: s.pitch,\n roll: s.roll,\n facing: s.facing,\n focalLength: s.focalLength,\n depthFade: s.depthFade,\n cullBackfaces: s.cullBackfaces,\n spinSpeed: s.spinSpeed,\n }\n}\n\nconst arranger: ItemGrid.Arranger<Own> = { arrangement }\n\nconst AXIS_PROP: Record<SphereAxis, \"yaw\" | \"pitch\" | \"roll\"> = { x: \"pitch\", y: \"yaw\", z: \"roll\" }\n\n/**\n * Children spread over a sphere — a Fibonacci lattice, as even as any number\n * of points gets — and seen through a camera of the grid's own, so the far\n * side is smaller, drawn first, and hidden where a face turns away.\n *\n * `outward` lays each item flat on the surface; `billboard` keeps each one\n * facing the viewer, like labels on a globe. `turnTo` brings any item round\n * to the front.\n */\nexport const SphereGrid = ItemGrid.define(component2d({\n key: \"sphereGrid\",\n state: { ...ItemGrid.state, ...own },\n defaults: ItemGrid.defaults,\n commands: {\n ...ItemGrid.commands,\n /** Turn the sphere about an axis by `degrees` — `y` spins it like a globe. */\n spin: {\n args: {\n axis: Types.oneOf(SPHERE_AXES, { default: \"y\" }),\n degrees: Types.number(360, { step: 15, unit: \"°\" }),\n },\n run: (timeline, s) => {\n const key = AXIS_PROP[timeline.args.axis ?? \"y\"] ?? \"yaw\"\n return timeline.tween({ [key]: s[key] + (timeline.args.degrees ?? 360) })\n },\n },\n /** Turn the sphere to a set orientation. */\n orientTo: {\n args: {\n yaw: ItemGrid.hinted(45, { unit: \"°\" }),\n pitch: ItemGrid.hinted(20, { unit: \"°\" }),\n roll: ItemGrid.hinted(0, { unit: \"°\" }),\n },\n run: (timeline, s) => timeline.tween({\n yaw: timeline.args.yaw ?? s.yaw,\n pitch: timeline.args.pitch ?? s.pitch,\n roll: timeline.args.roll ?? s.roll,\n }),\n },\n /**\n * Turn the sphere the shorter way until an item (by its place in the layers)\n * faces the viewer. It turns from the orientation the sphere is given: the\n * yaw its `spinSpeed` adds by the time the command runs is not counted, as\n * commands are built against the tree standing at time 0.\n */\n turnTo: {\n args: { item: Types.number(0, { min: 0, step: 1 }) },\n run: (timeline, s, children) => {\n const count = children.length\n const slot = normalizeOrder(s.order, count).indexOf(Math.round(timeline.args.item ?? 0))\n if (slot < 0) return timeline.tween({})\n const facing = sphereFaceForward(count, slot)\n return timeline.tween({\n yaw: s.yaw + wrapDegrees(facing.yaw - s.yaw),\n pitch: s.pitch + wrapDegrees(facing.pitch - s.pitch),\n roll: 0,\n })\n },\n },\n radiusTo: {\n args: { radius: ItemGrid.hinted(300, { min: 0 }) },\n run: (timeline, s) => timeline.tween({ radius: timeline.args.radius ?? s.radius }),\n },\n /** Dolly the camera: a shorter focal length exaggerates the depth, a longer one flattens it. */\n focalLengthTo: {\n args: { focalLength: ItemGrid.hinted(600, { min: 100 }) },\n run: (timeline, s) => timeline.tween({ focalLength: timeline.args.focalLength ?? s.focalLength }),\n },\n },\n ...ItemGrid.fields(arranger),\n}), arranger)\n\nexport type SphereGrid = NodeOf<typeof SphereGrid>\n/** What a call or a document row may set. */\nexport type SphereGridProps = NonNullable<Parameters<typeof SphereGrid>[0]>\n", "import { PathGrid } from \"./path-grid\"\nimport { RadialGrid } from \"./radial-grid\"\nimport { RectangularGrid } from \"./rectangular-grid\"\nimport { SphereGrid } from \"./sphere-grid\"\n\n/**\n * Every node type this package publishes.\n *\n * A host registers these by handing the array to an engine —\n * `new Engine(platform, { nodes: NODES })` — which reads each component's key.\n * Defining a component only *declares* that key: nothing is registered by\n * importing a module, so a registry holds exactly what its owner asked for.\n *\n * Listing the component **values** is also what survives bundling: this package\n * declares `sideEffects: false`, and a document names a node type by string, so\n * an import kept only for its side effect is exactly what gets shaken out.\n */\n// Typed by name, so the declaration names each component rather than spelling out its type through core.\ntype KitNode =\n | typeof RectangularGrid\n | typeof RadialGrid\n | typeof PathGrid\n | typeof SphereGrid\n\nexport const NODES: KitNode[] = [\n RectangularGrid,\n RadialGrid,\n PathGrid,\n SphereGrid,\n]\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": ["component2d", "easeInOut", "Types", "own", "Types", "FILL_DIRECTIONS", "CELL_MODES", "LINE_ALIGNS", "arrangement", "s", "arranger", "count", "space", "rectangularCell", "lineFocus", "item_grid_exports", "RectangularGrid", "component2d", "staggerArgs", "TRANSITION_STAGGER", "timeline", "children", "columns", "data", "easeInOut", "sizes", "child", "box", "from", "width", "height", "t", "slots", "row", "inRow", "column", "inColumn", "component2d", "Types", "own", "Types", "RADIAL_DIRECTIONS", "arrangement", "s", "arranger", "RadialGrid", "item_grid_exports", "component2d", "timeline", "children", "count", "slot", "normalizeOrder", "turn", "radialTurnToTop", "component2d", "pathOps", "Types", "PATH_GRID_SHAPES", "PATH_TEMPLATES", "own", "Types", "item_grid_exports", "PATH_SPACINGS", "AT_ORIGIN", "DEFAULT_SIZE", "arranger", "s", "box", "path", "placement", "pathIn", "PathGrid", "component2d", "timeline", "staggerArgs", "TRANSITION_STAGGER", "children", "pathNode", "changes", "linked", "unitPath", "data", "dataOf", "bounds", "pathOps", "template", "templatePath", "view", "unitPaths", "width", "height", "cached", "p", "component2d", "Types", "own", "Types", "SPHERE_FACINGS", "arrangement", "s", "arranger", "AXIS_PROP", "SphereGrid", "item_grid_exports", "component2d", "SPHERE_AXES", "timeline", "key", "children", "count", "slot", "normalizeOrder", "facing", "sphereFaceForward", "wrapDegrees", "NODES", "RectangularGrid", "RadialGrid", "PathGrid", "SphereGrid"]
|
|
7
7
|
}
|
package/dist/browser/kit.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z}from"./chunks/chunk-
|
|
1
|
+
import{A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z}from"./chunks/chunk-TYNFMZ3D.js";export{m as CELL_MODES,l as FILL_DIRECTIONS,N as ITEM_GRID_TYPES,R as ItemGrid,n as LINE_ALIGNS,e as PATH_SPACINGS,x as PATH_TEMPLATES,g as RADIAL_DIRECTIONS,H as REVEAL_STYLES,s as SPHERE_AXES,r as SPHERE_FACINGS,E as STAGGER_ORDERS,O as TRANSITION_STAGGER,I as WAVE_STYLES,J as applyItemEffects,b as blendSlot,Q as contentBoxOf,t as fibonacciPoint,S as findNode2D,A as focalLengthOf,T as frameIn,D as hashSeed,d as largest,K as normalizeOrder,u as orient,M as parseOrder,f as pathSlots,h as radialAngles,i as radialSlots,j as radialTurnToTop,p as rectangularCell,o as rectangularShape,q as rectangularSlots,B as seededRandom,C as shuffled,a as slot,L as slotOfItem,z as slotsOf,w as sphereFaceForward,v as sphereSlots,c as spreadSlot,P as staggerArgs,G as staggerProgress,F as staggerRanks,y as templatePath,k as wrapDegrees};
|
|
2
2
|
//# sourceMappingURL=kit.js.map
|
package/dist/engine.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* The item grid **kit**: what the four grids share, and what a copied one does
|
|
3
3
|
* not copy.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
5
|
+
* A copy takes a grid's own files into your project and rewrites its reach for
|
|
6
6
|
* these to `@motionscript/grids`, so the shared parts stay a real
|
|
7
7
|
* dependency. That is not a size decision. `ItemGrid` keeps the register of
|
|
8
8
|
* grids a morph looks another grid's arrangement up in, so a second copy of it
|
package/dist/engine.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* The item grid **kit**: what the four grids share, and what a copied one does
|
|
3
3
|
* not copy.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
5
|
+
* A copy takes a grid's own files into your project and rewrites its reach for
|
|
6
6
|
* these to `@motionscript/grids`, so the shared parts stay a real
|
|
7
7
|
* dependency. That is not a size decision. `ItemGrid` keeps the register of
|
|
8
8
|
* grids a morph looks another grid's arrangement up in, so a second copy of it
|
package/dist/engine.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,cAAc,OAAO,CAAA","sourcesContent":["/**\
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,cAAc,OAAO,CAAA","sourcesContent":["/**\n * The item grid **kit**: what the four grids share, and what a copied one does\n * not copy.\n *\n * A copy takes a grid's own files into your project and rewrites its reach for\n * these to `@motionscript/grids`, so the shared parts stay a real\n * dependency. That is not a size decision. `ItemGrid` keeps the register of\n * grids a morph looks another grid's arrangement up in, so a second copy of it\n * would be a second register, and a morph from one grid to another would only\n * find the grids its own copy was told of.\n */\nexport * from \"./kit\"\n"]}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAA;AAClC,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,UAAU,CAAA;AACxB,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA","sourcesContent":["export * from \"./rectangular-grid\"\
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAA;AAClC,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,UAAU,CAAA;AACxB,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA","sourcesContent":["export * from \"./rectangular-grid\"\nexport * from \"./radial-grid\"\nexport * from \"./path-grid\"\nexport * from \"./sphere-grid\"\nexport * from \"./engine\"\nexport { NODES } from \"./nodes\"\n"]}
|
package/dist/kit/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/kit/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,cAAc,WAAW,CAAA;AACzB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,SAAS,CAAA;AACvB,cAAc,UAAU,CAAA;AACxB,OAAO,KAAK,QAAQ,MAAM,aAAa,CAAA;AACvC,OAAO,EACL,YAAY,EACZ,eAAe,EACf,WAAW,EACX,kBAAkB,GAInB,MAAM,aAAa,CAAA;AAEpB,4EAA4E;AAC5E,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA","sourcesContent":["export * from \"./slots\"\
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/kit/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,cAAc,WAAW,CAAA;AACzB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,SAAS,CAAA;AACvB,cAAc,UAAU,CAAA;AACxB,OAAO,KAAK,QAAQ,MAAM,aAAa,CAAA;AACvC,OAAO,EACL,YAAY,EACZ,eAAe,EACf,WAAW,EACX,kBAAkB,GAInB,MAAM,aAAa,CAAA;AAEpB,4EAA4E;AAC5E,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA","sourcesContent":["export * from \"./slots\"\nexport * from \"./stagger\"\nexport * from \"./item-effects\"\nexport * from \"./order\"\nexport * from \"./random\"\nexport * as ItemGrid from \"./item-grid\"\nexport {\n contentBoxOf,\n ITEM_GRID_TYPES,\n staggerArgs,\n TRANSITION_STAGGER,\n type GridSnapshot,\n type GridTransition,\n type StaggerArgs,\n} from \"./item-grid\"\n\n// Once this kit's own; kept on its barrel for whoever imports them from it.\nexport { findNode2D, frameIn } from \"@motionscript/sdk\"\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"item-effects.js","sourceRoot":"","sources":["../../src/kit/item-effects.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Size2D } from \"@motionscript/sdk\"\
|
|
1
|
+
{"version":3,"file":"item-effects.js","sourceRoot":"","sources":["../../src/kit/item-effects.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Size2D } from \"@motionscript/sdk\"\n\nimport type { Slot } from \"./slots\"\n\n/**\n * What an item does on its way in (or out): grow from nothing, fade, fly out of\n * the grid's centre, rise into place, flip up, or spin in.\n */\nexport const REVEAL_STYLES = [\"scale\", \"fade\", \"center\", \"rise\", \"flip\", \"spin\"] as const\nexport type RevealStyle = (typeof REVEAL_STYLES)[number]\n\n/** What a wave does to each item as it passes. */\nexport const WAVE_STYLES = [\"scale\", \"lift\", \"fade\", \"spin\"] as const\nexport type WaveStyle = (typeof WAVE_STYLES)[number]\n\n/**\n * How far into view each item is, `1` shown and `0` gone — past `1` on the\n * way to it under an overshooting ease. Absent means every item is shown.\n */\nexport interface RevealState {\n style: RevealStyle\n values: readonly number[]\n}\n\n/** Each item's share of the wave passing through it, `0` at rest and `1` at the crest. */\nexport interface WaveState {\n style: WaveStyle\n /** How big the crest is — a share of the item's size, opacity or a turn, by style. */\n amount: number\n values: readonly number[]\n}\n\n/** Each item's emphasis: `1` the focus, `-1` pushed back, `0` untouched. */\nexport interface FocusState {\n /** How far the others fade, `0..1`. */\n dim: number\n /** How much the focus grows, as a share of its size; the others shrink by half that. */\n grow: number\n values: readonly number[]\n}\n\n/** Layer item `i`'s reveal, wave and focus onto its slot, in place. */\nexport function applyItemEffects(\n s: Slot,\n i: number,\n size: Size2D,\n reveal: RevealState | null | undefined,\n wave: WaveState | null | undefined,\n focus: FocusState | null | undefined,\n): void {\n if (reveal) applyReveal(s, reveal.style, reveal.values[i] ?? 1, size)\n if (wave) applyWave(s, wave, wave.values[i] ?? 0, size)\n if (focus) applyFocus(s, focus, focus.values[i] ?? 0)\n}\n\nfunction applyReveal(s: Slot, style: RevealStyle, v: number, size: Size2D): void {\n if (v === 1) return\n const shown = clamp01(v)\n switch (style) {\n case \"fade\":\n s.opacity *= shown\n break\n case \"center\":\n s.x *= v\n s.y *= v\n s.depth *= v\n s.opacity *= clamp01(v * 4)\n break\n case \"rise\":\n s.y -= (1 - v) * Math.max(40, size.height)\n s.opacity *= shown\n break\n case \"flip\":\n s.rotationX += (1 - v) * 90\n break\n case \"spin\":\n s.rotation -= (1 - v) * 180\n s.scale *= Math.max(0, v)\n break\n default:\n s.scale *= Math.max(0, v)\n }\n}\n\nfunction applyWave(s: Slot, wave: WaveState, w: number, size: Size2D): void {\n if (w === 0) return\n switch (wave.style) {\n case \"lift\":\n s.y += wave.amount * w * Math.max(40, size.height)\n break\n case \"fade\":\n s.opacity *= clamp01(1 - wave.amount * w)\n break\n case \"spin\":\n s.rotation += wave.amount * w * 360\n break\n default:\n s.scale *= 1 + wave.amount * w\n }\n}\n\nfunction applyFocus(s: Slot, focus: FocusState, f: number): void {\n if (f === 0) return\n if (f > 0) {\n s.scale *= 1 + focus.grow * f\n return\n }\n s.opacity *= clamp01(1 - focus.dim * -f)\n s.scale *= Math.max(0, 1 + focus.grow * 0.5 * f)\n}\n\nfunction clamp01(v: number): number {\n return v < 0 ? 0 : v > 1 ? 1 : v\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"item-grid.js","sourceRoot":"","sources":["../../src/kit/item-grid.ts"],"names":[],"mappings":"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","sourcesContent":["import {\r\n commandsFor,\r\n easeIn,\r\n easeInOut,\r\n easeOut,\r\n flowOps,\r\n insetsOps,\r\n Types,\r\n type ChildView,\r\n type InsetsResolved,\r\n type LayoutBox,\r\n type LayoutItem,\r\n type Measurer,\r\n type Node2D,\r\n type NodeFrame,\r\n type NodeView,\r\n type Piece,\r\n type Placement2D,\r\n type RenderContext,\r\n type Size2D,\r\n type SpaceCamera,\r\n type Timeline,\r\n type Values,\r\n} from \"@motionscript/sdk\"\r\n\r\nimport {\r\n applyItemEffects,\r\n REVEAL_STYLES,\r\n WAVE_STYLES,\r\n type FocusState,\r\n type RevealState,\r\n type WaveState,\r\n} from \"./item-effects\"\r\nimport { normalizeOrder, parseOrder, slotOfItem } from \"./order\"\r\nimport { hashSeed, shuffled } from \"./random\"\r\nimport { blendSlot, focalLengthOf, slotsOf, spreadSlot, type Arrangement, type Slot } from \"./slots\"\r\nimport { STAGGER_ORDERS, staggerProgress, staggerRanks, type StaggerOrder } from \"./stagger\"\r\n\r\n/**\r\n * What every grid is built from: a container that places each of its children\r\n * in a slot of an arrangement — a rectangular grid, a ring, a path, a sphere.\r\n * Spread `state` and `commands` in, take `defaults`, hand `fields` the\r\n * {@link Arranger} that makes this grid's arrangement from its state, and pass\r\n * the finished component and its arranger through {@link define}.\r\n *\r\n * ## Children only\r\n *\r\n * The items are the children, in layer order. A child's slot is a parent\r\n * transform on it, so its own `x`/`y`/`rotation`/`scale` — and any command on\r\n * them — still work, relative to the slot. A group is one item; a grid of\r\n * grids is a grid of items that happen to be grids.\r\n *\r\n * ## One pass\r\n *\r\n * Every frame: measure the children, ask the arrangement for its slots (a pure\r\n * function of the state, the sizes and the clock), blend them from where a\r\n * transition is leaving, and layer on the per-item effects — reveal, wave,\r\n * focus. What is left is each child's box and slot, which the renderer,\r\n * picking and `global` all read, so a selection outline lands on the pixels\r\n * even on a sphere.\r\n *\r\n * ## Commands\r\n *\r\n * Every command is a pure function of time. The per-item ones stagger *inside*\r\n * their duration — a one-second reveal takes one second for four children or\r\n * four hundred — and write their per-item state into entries\r\n * (`revealState` and its siblings), which is what keeps them seekable. The ones\r\n * that change the arrangement itself (a reorder, a morph, a column count) keep\r\n * the arrangement they are leaving as data and blend each item from its old\r\n * slot to its new one.\r\n */\r\n\r\n/** An arrangement a grid is leaving, kept as data so its slots can be worked out afresh every frame. */\r\nexport interface GridSnapshot {\r\n arrangement: Arrangement\r\n /** The grid the arrangement was borrowed from, or `\"\"` for the grid's own. */\r\n source: string\r\n order: readonly number[]\r\n spread: number\r\n}\r\n\r\n/** A change of arrangement under way: where the items are coming from, and how far each has come. */\r\nexport interface GridTransition {\r\n from: GridSnapshot\r\n /** Each item's eased, staggered progress, `0..1`. */\r\n mix: readonly number[]\r\n}\r\n\r\n/** The stagger options every per-item command takes. */\r\nexport interface StaggerArgs {\r\n staggerOrder?: StaggerOrder\r\n /** `0..0.95`: how much of the command's length the items' offsets take up. */\r\n stagger?: number\r\n}\r\n\r\n/**\r\n * Every grid's document key — what a reference to \"another grid\" may name. A\r\n * `nodeRef` descriptor carries it as `nodeTypes`, for a host's picker to offer\r\n * only those.\r\n */\r\nexport const ITEM_GRID_TYPES = [\"rectangularGrid\", \"radialGrid\", \"pathGrid\", \"sphereGrid\"] as const\r\n\r\n/** The stagger a move to new slots takes when its command states none. */\r\nexport const TRANSITION_STAGGER = 0.3\r\n\r\n/** A reference to another node, a host's picker offering only `types`. Its fields read a view of it. */\r\nexport function nodeRef(types: readonly string[]) {\r\n const described = { kind: \"nodeRef\", nodeTypes: types, animatable: false }\r\n return Types.custom<string, NodeView | null>(\"\", described)\r\n}\r\n\r\n/** The stagger args every per-item command takes, `stagger` defaulting to `fallback`. */\r\nexport function staggerArgs(fallback: number) {\r\n return {\r\n staggerOrder: Types.oneOf(STAGGER_ORDERS, { default: \"index\" }),\r\n stagger: Types.number(fallback, { min: 0, max: 0.95, step: 0.05 }),\r\n }\r\n}\r\n\r\n/**\r\n * A command arg a host fills in with `hint`, which a row may leave out: the\r\n * command then keeps what the grid has. A run arg's default is both what a\r\n * host offers and what an omitted arg means, so the hint rides on the arg's\r\n * description alone, and an omitted arg reads `undefined`.\r\n */\r\nexport function hinted<T extends number | string>(hint: T, options: object = {}) {\r\n const described: Record<string, unknown> = { ...options, default: hint }\r\n return Types.custom<T | undefined>(undefined, described as never)\r\n}\r\n\r\n/** A command arg naming another node, a host's picker offering only `types`; left out, it reads `undefined`. */\r\nexport function nodeRefArg(types: readonly string[]) {\r\n const described = { kind: \"nodeRef\", nodeTypes: types }\r\n return Types.custom<string | undefined>(undefined, described)\r\n}\r\n\r\n/** The state every grid shares. */\r\nexport const state = {\r\n /** Items in slot order: slot `k` holds child `order[k]`. Empty is the children's own order. */\r\n order: Types.custom<number[]>([], { kind: \"order\", animatable: false }),\r\n /** `0` gathers every item at the centre, `1` is the arrangement, past `1` pushes them apart. */\r\n spread: Types.number(1, { min: 0, max: 3, step: 0.05 }),\r\n /** Another grid whose arrangement this one takes on — what `morphInto` animates. */\r\n arrangeLike: nodeRef(ITEM_GRID_TYPES),\r\n // What the per-item commands write. State rather than settings: a command\r\n // owns each while it runs, and a document has no reason to name them. Unset\r\n // until a command writes one, so a fresh node's row does not state them.\r\n revealState: Types.custom<RevealState | null | undefined>(undefined, { kind: \"state\", animatable: false }),\r\n waveState: Types.custom<WaveState | null | undefined>(undefined, { kind: \"state\", animatable: false }),\r\n focusState: Types.custom<FocusState | null | undefined>(undefined, { kind: \"state\", animatable: false }),\r\n transition: Types.custom<GridTransition | null | undefined>(undefined, { kind: \"state\", animatable: false }),\r\n /** The grid a transition's leaving arrangement was borrowed from, followed while the items travel. */\r\n transitionSource: Types.custom<string, NodeView | null, { readonly private: true }>(\"\", { kind: \"nodeRef\", private: true }),\r\n}\r\n\r\n/** A grid's size is what its items come to, whether it was built with children or they arrive after it. */\r\nexport const defaults = { width: \"hug\", height: \"hug\" } as const\r\n\r\n/** What a grid's commands read of its state, beyond its own arrangement's entries. */\r\nexport type GridValues = Values<typeof state> & { readonly padding: InsetsResolved }\r\n\r\n/** What a grid's measure, layout and render read of its state, beyond its own arrangement's entries. */\r\nexport type GridState = GridValues & {\r\n readonly width: LayoutItem[\"width\"]\r\n readonly height: LayoutItem[\"height\"]\r\n readonly children: readonly ChildView[]\r\n}\r\n\r\n/** What makes one grid's arrangement from its state: the rest of a grid is this module. */\r\nexport interface Arranger<S = unknown> {\r\n /** This grid's own arrangement, for a content box of `box`. */\r\n arrangement(state: S, box: Size2D): Arrangement\r\n /** The room each item is measured in — the whole content box, unless the arrangement has cells. */\r\n itemSpace?(state: S, count: number, space: Size2D): Size2D\r\n}\r\n\r\ntype GridComponent = { readonly key: string; readonly node: abstract new (...args: never[]) => object }\r\n\r\nconst GRIDS = new Map<string, { readonly component: GridComponent; readonly arranger: Arranger<never> }>()\r\n\r\n/**\r\n * `component` as a grid: registers its `arranger`, which another grid borrowing\r\n * its arrangement or morphing into it reads it by, and which {@link isGrid} knows it by.\r\n */\r\nexport function define<C extends GridComponent, S>(component: C, arranger: Arranger<S>): C {\r\n GRIDS.set(component.key, { component, arranger: arranger as Arranger<never> })\r\n return component\r\n}\r\n\r\n/** Whether `value` is a node of one of the grids {@link define} has seen. */\r\nexport function isGrid(value: unknown): boolean {\r\n for (const { component } of GRIDS.values()) if (value instanceof component.node) return true\r\n return false\r\n}\r\n\r\n/** The grid's measure, layout and render, for `arranger`'s arrangement: spread them into the component. */\r\nexport function fields<S>(arranger: Arranger<S>) {\r\n return {\r\n measure: (measurer: Measurer, s: GridState & S, children: readonly ChildView[]) => measure(measurer, s, children, arranger),\r\n layout: (box: LayoutBox, s: GridState & S, children: readonly ChildView[]) => layout(box, s, children, arranger),\r\n render: (ctx: RenderContext, s: GridState & S) => render(ctx, s, arranger),\r\n }\r\n}\r\n\r\nconst NO_CONTENT: Size2D = { width: 0, height: 0 }\r\nconst CENTRE = { x: 0, y: 0 }\r\n\r\n/** What `measure` found, for `layout` to reuse in the same pass. Keyed by the grid's state, one object per node. */\r\nconst measured = new WeakMap<object, { space: Size2D; sizes: Size2D[] }>()\r\n\r\nexport function measure<S>(measurer: Measurer, s: GridState & S, children: readonly ChildView[], arranger: Arranger<S>): Size2D {\r\n const constraints = { maxWidth: measurer.max.width, maxHeight: measurer.max.height }\r\n const padding = s.padding\r\n if (children.length === 0) {\r\n measured.delete(s)\r\n return flowOps.size(s, constraints, padding, NO_CONTENT)\r\n }\r\n const space = flowOps.contentBox(s, constraints, padding)\r\n const sizes = measureItems(children, space, s, arranger)\r\n measured.set(s, { space, sizes })\r\n const grid = { state: s, arranger, children, isSelf: sharesChildren(children) }\r\n const target = targetSlots(grid, sizes.length, sizes, space, measurer.time.total)\r\n return flowOps.size(s, constraints, padding, extentOf(target.slots, sizes, focalOf(s, target.arrangement)))\r\n}\r\n\r\nexport function layout<S>(box: LayoutBox, s: GridState & S, children: readonly ChildView[], arranger: Arranger<S>): readonly Placement2D[] {\r\n const kept = measured.get(s)\r\n measured.delete(s)\r\n if (children.length === 0) return []\r\n const inner = insetsOps.insetBounds(box.width, box.height, s.padding)\r\n const sizes = kept && kept.sizes.length === children.length && sameSize(kept.space, inner)\r\n ? kept.sizes\r\n : measureItems(children, inner, s, arranger)\r\n const slots = resolve({ state: s, arranger, children, isSelf: sharesChildren(children) }, sizes, inner, box.time.total)\r\n return slots.map((slot, i) => placement(inner, slot, sizes[i]))\r\n}\r\n\r\n/**\r\n * A grid whose arrangement has depth is seen through a camera of its own,\r\n * which paints its items far to near — unless it already sits in a space (an\r\n * orbit camera, a 3D stage), where its items join that one and its camera.\r\n */\r\nexport function render<S>(ctx: RenderContext, s: GridState & S, arranger: Arranger<S>): void {\r\n // With no items there is nothing to see through a camera.\r\n const focal = s.children.length === 0 ? 0 : focalOf(s, arrangementOf({ state: s, arranger, children: [], isSelf: () => false }, contentBox(ctx.size, s.padding)))\r\n if (focal > 0 && !ctx.inSpace) ctx.space(cameraAt(focal))\r\n else ctx.children()\r\n}\r\n\r\n/** A node's content box: its laid-out size inside its padding. */\r\nexport function contentBoxOf(grid: Node2D): Size2D {\r\n const b = grid.layoutBounds\r\n return contentBox({ width: b.width, height: b.height }, grid.effectivePadding())\r\n}\r\n\r\n// ---- what commands share --------------------------------------------------\r\n\r\ntype GridTimeline = Timeline<StaggerArgs, never>\r\n\r\n/**\r\n * Each item's slot in its arrangement as it stands, for a command being built,\r\n * at the clock commands are built against (the tree stands at time 0 while a\r\n * timeline compiles): what its stagger is ranked by.\r\n */\r\nexport function itemSlots(timeline: Timeline<object, never>, s: GridValues, children: readonly ChildView[]): Slot[] {\r\n const grid = commandGrid(timeline, s, children)\r\n const sizes = children.map((child) => child.size)\r\n return targetSlots(grid, children.length, sizes, contentBox(timeline.node.size, s.padding), 0).slots\r\n}\r\n\r\n/** Each item's start in a stagger. A random order is seeded by the node's id, so it never changes between builds. */\r\nexport function ranks(timeline: Timeline<object, never>, s: GridValues, children: readonly ChildView[], order: StaggerOrder | undefined): number[] {\r\n return staggerRanks(order ?? \"index\", itemSlots(timeline, s, children), hashSeed(timeline.node.id))\r\n}\r\n\r\n/**\r\n * Write `changes` to the arrangement and move each item from its slot in the\r\n * one being left to its slot in the new one, staggered.\r\n */\r\nexport function transitionTo(\r\n timeline: GridTimeline,\r\n s: GridValues,\r\n children: readonly ChildView[],\r\n changes: Record<string, unknown>,\r\n stagger = TRANSITION_STAGGER,\r\n): Piece {\r\n const from = snapshot(timeline, s, children)\r\n const ease = timeline.easing ?? easeInOut(\"cubic\")\r\n const order = ranks(timeline, s, children, timeline.args.staggerOrder)\r\n const spread = timeline.args.stagger ?? stagger\r\n return timeline.animate((t) => {\r\n if (t >= 1) return { ...changes, transition: null, transitionSource: \"\" } as never\r\n const mix = order.map((rank) => ease(staggerProgress(rank, t, spread)))\r\n return { ...changes, transition: { from, mix }, transitionSource: from.source } as never\r\n }, { eased: false })\r\n}\r\n\r\n/** Emphasise the items `isFocus` picks and push the rest back. */\r\nexport function focusOn(\r\n timeline: Timeline<object, never>,\r\n s: GridValues,\r\n isFocus: (item: number) => boolean,\r\n count: number,\r\n dim: number,\r\n grow: number,\r\n): Piece {\r\n const from = s.focusState\r\n const target = Array.from({ length: count }, (_, i) => (isFocus(i) ? 1 : -1))\r\n const ease = timeline.easing ?? easeInOut(\"cubic\")\r\n return timeline.animate((t) => {\r\n const e = ease(t)\r\n return {\r\n focusState: {\r\n dim: lerp(from?.dim ?? dim, dim, e),\r\n grow: lerp(from?.grow ?? grow, grow, e),\r\n values: target.map((v, i) => lerp(from?.values[i] ?? 0, v, e)),\r\n },\r\n } as never\r\n }, { eased: false })\r\n}\r\n\r\n// What the commands are typed against: the shared state, and the padding every node has.\r\nconst GRID_STATE = { ...state, padding: Types.insets }\r\n\r\nexport const commands = commandsFor(GRID_STATE, {\r\n /**\r\n * Bring the items in, one after another. Every item starts hidden, so place\r\n * it where the grid enters — or after a `conceal`.\r\n */\r\n reveal: {\r\n args: { style: Types.oneOf(REVEAL_STYLES, { default: \"scale\" }), ...staggerArgs(0.5) },\r\n run: (timeline, s, children) => {\r\n const style = timeline.args.style ?? \"scale\"\r\n const ease = timeline.easing ?? (style === \"scale\" || style === \"flip\" ? easeOut(\"back\") : easeOut(\"cubic\"))\r\n const order = ranks(timeline as never, s, children, timeline.args.staggerOrder)\r\n const stagger = timeline.args.stagger ?? 0.5\r\n return timeline.animate((t) => {\r\n if (t >= 1) return { revealState: null }\r\n return { revealState: { style, values: order.map((rank) => ease(staggerProgress(rank, t, stagger))) } }\r\n }, { eased: false })\r\n },\r\n },\r\n /** Take the items out, one after another — `reveal` in reverse. They stay hidden after. */\r\n conceal: {\r\n args: { style: Types.oneOf(REVEAL_STYLES, { default: \"scale\" }), ...staggerArgs(0.5) },\r\n run: (timeline, s, children) => {\r\n const style = timeline.args.style ?? \"scale\"\r\n const ease = timeline.easing ?? (style === \"scale\" || style === \"flip\" ? easeIn(\"back\") : easeInOut(\"cubic\"))\r\n const order = ranks(timeline as never, s, children, timeline.args.staggerOrder)\r\n const stagger = timeline.args.stagger ?? 0.5\r\n const from = s.revealState?.values\r\n return timeline.animate((t) => ({\r\n revealState: {\r\n style,\r\n values: order.map((rank, i) => (from?.[i] ?? 1) * (1 - ease(staggerProgress(rank, t, stagger)))),\r\n },\r\n }), { eased: false })\r\n },\r\n },\r\n /** Send a ripple through the items that swells each in turn and settles back. */\r\n wave: {\r\n args: {\r\n style: Types.oneOf(WAVE_STYLES, { default: \"scale\" }),\r\n amount: Types.number(0.3, { min: 0, max: 2, step: 0.05 }),\r\n ...staggerArgs(0.7),\r\n },\r\n run: (timeline, s, children) => {\r\n const style = timeline.args.style ?? \"scale\"\r\n const amount = timeline.args.amount ?? 0.3\r\n const ease = timeline.easing ?? easeInOut(\"sine\")\r\n const order = ranks(timeline as never, s, children, timeline.args.staggerOrder)\r\n const stagger = timeline.args.stagger ?? 0.7\r\n return timeline.animate((t) => {\r\n if (t >= 1) return { waveState: null }\r\n return { waveState: { style, amount, values: order.map((rank) => Math.sin(Math.PI * ease(staggerProgress(rank, t, stagger)))) } }\r\n }, { eased: false })\r\n },\r\n },\r\n /** Bring one item (by its place in the layers, from 0) forward and push the rest back. */\r\n focus: {\r\n args: {\r\n item: Types.number(0, { min: 0, step: 1 }),\r\n dim: Types.number(0.7, { min: 0, max: 1, step: 0.05 }),\r\n grow: Types.number(0.15, { min: 0, max: 1, step: 0.05 }),\r\n },\r\n run: (timeline, s, children) => {\r\n const item = Math.round(timeline.args.item ?? 0)\r\n return focusOn(timeline as never, s, (i) => i === item, children.length, timeline.args.dim ?? 0.7, timeline.args.grow ?? 0.15)\r\n },\r\n },\r\n /** Bring every item back to even. */\r\n unfocus: (timeline, s) => {\r\n const from = s.focusState\r\n const ease = timeline.easing ?? easeInOut(\"cubic\")\r\n return timeline.animate((t) => {\r\n if (t >= 1 || !from) return { focusState: null }\r\n const k = 1 - ease(t)\r\n return { focusState: { ...from, values: from.values.map((v) => v * k) } }\r\n }, { eased: false })\r\n },\r\n /** Gather the items toward the centre (`0`), back to the arrangement (`1`), or push them apart. */\r\n spreadTo: {\r\n args: { spread: Types.number(1, { min: 0, max: 3, step: 0.05 }) },\r\n run: (timeline) => timeline.tween({ spread: timeline.args.spread ?? 1 }),\r\n },\r\n /** Send every item to a random slot. The same `seed` always deals the same way. */\r\n shuffle: {\r\n args: { seed: Types.number(1, { min: 0, step: 1 }), ...staggerArgs(TRANSITION_STAGGER) },\r\n run: (timeline, s, children) => {\r\n const current = normalizeOrder(s.order, children.length)\r\n let next = shuffled(current, timeline.args.seed ?? 1)\r\n // A shuffle that deals everything back where it was would look like nothing happened.\r\n if (next.length > 1 && next.every((item, k) => item === current[k])) next = [...next.slice(1), next[0]]\r\n return transitionTo(timeline as never, s, children, { order: next })\r\n },\r\n },\r\n /** Two items trade places, by their place in the layers. */\r\n swap: {\r\n args: {\r\n first: Types.number(0, { min: 0, step: 1 }),\r\n second: Types.number(1, { min: 0, step: 1 }),\r\n ...staggerArgs(0),\r\n },\r\n run: (timeline, s, children) => {\r\n const order = normalizeOrder(s.order, children.length)\r\n const a = order.indexOf(Math.round(timeline.args.first ?? 0))\r\n const b = order.indexOf(Math.round(timeline.args.second ?? 1))\r\n if (a >= 0 && b >= 0) [order[a], order[b]] = [order[b], order[a]]\r\n return transitionTo(timeline as never, s, children, { order }, 0)\r\n },\r\n },\r\n /** Move the items into a new order — a list of layer indices, first slot first, like `\"2, 0, 1\"`. */\r\n reorder: {\r\n args: { order: Types.text(\"\"), ...staggerArgs(TRANSITION_STAGGER) },\r\n run: (timeline, s, children) => {\r\n const order = normalizeOrder(parseOrder(timeline.args.order), children.length)\r\n return transitionTo(timeline as never, s, children, { order })\r\n },\r\n },\r\n /**\r\n * Move every item into another grid's arrangement — a grid into a ring, a ring\r\n * onto a sphere — and keep following it. An empty `target` morphs back to\r\n * this grid's own.\r\n */\r\n morphInto: {\r\n args: { target: nodeRefArg(ITEM_GRID_TYPES), ...staggerArgs(TRANSITION_STAGGER) },\r\n run: (timeline, s, children) => transitionTo(timeline as never, s, children, { arrangeLike: timeline.args.target ?? \"\" }),\r\n },\r\n})\r\n\r\n// ---- the one pass ------------------------------------------------------------\r\n\r\ninterface Grid {\r\n readonly state: GridValues\r\n readonly arranger: Arranger<never>\r\n readonly children: readonly ChildView[]\r\n /** Whether a view is this grid itself, which borrows nothing from itself. */\r\n readonly isSelf: (view: NodeView) => boolean\r\n}\r\n\r\nfunction arrangerOf(key: string): Arranger<never> {\r\n const grid = GRIDS.get(key)\r\n if (!grid) throw new Error(`\"${key}\" is no grid: pass its component through ItemGrid.define.`)\r\n return grid.arranger\r\n}\r\n\r\n/** A grid `view` names, when it is one this kit can arrange and not the reader itself. */\r\nfunction gridIn(view: NodeView | null | undefined, grid: Grid): { view: NodeView; arranger: Arranger<never> } | null {\r\n if (!view) return null\r\n const found = GRIDS.get(view.key)\r\n if (!found || grid.isSelf(view)) return null\r\n return { view, arranger: found.arranger }\r\n}\r\n\r\n/** In layout, a view is this grid when it holds the same children: a child has one parent. */\r\nfunction sharesChildren(children: readonly ChildView[]): (view: NodeView) => boolean {\r\n return (view) => {\r\n if (children.length === 0) return false\r\n const theirs = (view.state as { readonly children?: readonly ChildView[] }).children\r\n return theirs?.[0] === children[0]\r\n }\r\n}\r\n\r\nfunction commandGrid(timeline: Timeline<object, never>, s: GridValues, children: readonly ChildView[]): Grid {\r\n return { state: s, arranger: arrangerOf(timeline.node.key), children, isSelf: (view) => view.id === timeline.node.id }\r\n}\r\n\r\nfunction snapshot(timeline: Timeline<object, never>, s: GridValues, children: readonly ChildView[]): GridSnapshot {\r\n const grid = commandGrid(timeline, s, children)\r\n const source = gridIn(s.arrangeLike, grid)\r\n return {\r\n arrangement: source\r\n ? source.arranger.arrangement(source.view.state as never, viewBox(source.view))\r\n : grid.arranger.arrangement(s as never, contentBox(timeline.node.size, s.padding)),\r\n source: source?.view.id ?? \"\",\r\n order: normalizeOrder(s.order, children.length),\r\n spread: s.spread,\r\n }\r\n}\r\n\r\nfunction measureItems(children: readonly ChildView[], space: Size2D, s: unknown, arranger: Arranger<never>): Size2D[] {\r\n const sizes = children.map((child) => child.measure(space))\r\n const cell = arranger.itemSpace ? arranger.itemSpace(s as never, children.length, space) : space\r\n if (cell === space) return sizes\r\n return children.map((child) => child.measure(cell))\r\n}\r\n\r\n/** The arrangement the grid is heading for: the one it borrows, or its own. */\r\nfunction arrangementOf(grid: Grid, box: Size2D): Arrangement {\r\n const source = gridIn(grid.state.arrangeLike, grid)\r\n return source ? source.arranger.arrangement(source.view.state as never, viewBox(source.view)) : grid.arranger.arrangement(grid.state as never, box)\r\n}\r\n\r\n/** Where each item sits in the arrangement it is heading for, before any transition or effect. */\r\nfunction targetSlots(grid: Grid, count: number, sizes: readonly Size2D[], box: Size2D, time: number): { slots: Slot[]; arrangement: Arrangement } {\r\n const s = grid.state\r\n const source = gridIn(s.arrangeLike, grid)\r\n const sourceBox = source ? viewBox(source.view) : box\r\n const arrangement = source ? source.arranger.arrangement(source.view.state as never, sourceBox) : grid.arranger.arrangement(s as never, box)\r\n let slots = slotsOf(arrangement, { count, sizes, box: sourceBox, time })\r\n if (source) slots = inFrame(source.view.frame, slots)\r\n const slotOf = slotOfItem(normalizeOrder(s.order, count))\r\n return { slots: slotOf.map((k) => spreadSlot(slots[k], s.spread)), arrangement }\r\n}\r\n\r\n/** Each item's final slot this frame: the target, blended from any transition, with its effects on. */\r\nfunction resolve(grid: Grid, sizes: readonly Size2D[], box: Size2D, time: number): Slot[] {\r\n const s = grid.state\r\n const count = sizes.length\r\n const slots = targetSlots(grid, count, sizes, box, time).slots\r\n const transition = s.transition\r\n if (transition) {\r\n const { from } = transition\r\n const named = from.source ? s.transitionSource : null\r\n const source = named && named.id === from.source && GRIDS.has(named.key) ? named : null\r\n const self = source !== null && grid.isSelf(source)\r\n const fromBox = source && !self ? viewBox(source) : box\r\n let leaving = slotsOf(from.arrangement, { count, sizes, box: fromBox, time })\r\n if (source && !self) leaving = inFrame(source.frame, leaving)\r\n const slotOf = slotOfItem(normalizeOrder(from.order, count))\r\n for (let i = 0; i < count; i++) {\r\n slots[i] = blendSlot(spreadSlot(leaving[slotOf[i]], from.spread), slots[i], transition.mix[i] ?? 1)\r\n }\r\n }\r\n const reveal = s.revealState\r\n const wave = s.waveState\r\n const focus = s.focusState\r\n if (reveal || wave || focus) {\r\n for (let i = 0; i < count; i++) applyItemEffects(slots[i], i, sizes[i], reveal, wave, focus)\r\n }\r\n return slots\r\n}\r\n\r\n/** The camera distance the grid is seen through: the target's, or, while a morph runs, the one it is leaving. */\r\nfunction focalOf(s: GridValues, target: Arrangement): number {\r\n // A morph into or out of depth keeps the camera for its whole length.\r\n return focalLengthOf(target) || (s.transition ? focalLengthOf(s.transition.from.arrangement) : 0)\r\n}\r\n\r\nfunction cameraAt(focal: number): SpaceCamera {\r\n return {\r\n perspective: focal,\r\n orbit: 0,\r\n elevation: 0,\r\n dolly: 0,\r\n lookAt: CENTRE,\r\n zoom: 1,\r\n heading: 0,\r\n viewportX: 0,\r\n viewportY: 0,\r\n }\r\n}\r\n\r\n/** A slot as a child's placement: its box centred on the slot, and the slot's transform when it has one. */\r\nfunction placement(inner: { x: number; y: number }, s: Slot, size: Size2D): Placement2D {\r\n const box = { x: inner.x + s.x, y: s.y - inner.y, width: size.width, height: size.height }\r\n if (s.rotation === 0 && s.scale === 1 && s.rotationX === 0 && s.rotationY === 0 && s.depth === 0 && s.opacity === 1) return box\r\n return {\r\n ...box,\r\n rotation: s.rotation,\r\n scale: s.scale,\r\n rotationX: s.rotationX,\r\n rotationY: s.rotationY,\r\n depth: s.depth,\r\n opacity: s.opacity,\r\n }\r\n}\r\n\r\n/** `slots`, laid out in another grid's frame, moved into this grid's. */\r\nfunction inFrame(frame: NodeFrame, slots: Slot[]): Slot[] {\r\n return slots.map((s) => {\r\n const p = rotateClockwise(s.x * frame.scale, s.y * frame.scale, frame.rotation)\r\n return {\r\n ...s,\r\n x: frame.x + p.x,\r\n y: frame.y + p.y,\r\n depth: s.depth * frame.scale,\r\n rotation: s.rotation + frame.rotation,\r\n scale: s.scale * frame.scale,\r\n }\r\n })\r\n}\r\n\r\nfunction viewBox(view: NodeView): Size2D {\r\n return contentBox(view.size, (view.state as { readonly padding: InsetsResolved }).padding)\r\n}\r\n\r\n/** A box of `size` inside `padding`: what a command reads as its grid's content box from `timeline.node.size`. */\r\nexport function contentBox(size: Size2D, padding: InsetsResolved): Size2D {\r\n const inner = insetsOps.insetBounds(size.width, size.height, padding)\r\n return { width: inner.width, height: inner.height }\r\n}\r\n\r\n/** The box, centred on the grid, that holds every item where its slot puts it. */\r\nfunction extentOf(slots: readonly Slot[], sizes: readonly Size2D[], focal: number): Size2D {\r\n let halfWidth = 0\r\n let halfHeight = 0\r\n for (let i = 0; i < slots.length; i++) {\r\n const s = slots[i]\r\n const size = sizes[i]\r\n const rad = (s.rotation * Math.PI) / 180\r\n const cos = Math.abs(Math.cos(rad))\r\n const sin = Math.abs(Math.sin(rad))\r\n // What the camera does to a slot at depth, so a sphere hugs its front.\r\n const lens = focal > 0 && focal - s.depth > 1 ? focal / (focal - s.depth) : 1\r\n const w = ((size.width * cos + size.height * sin) / 2) * s.scale * lens\r\n const h = ((size.width * sin + size.height * cos) / 2) * s.scale * lens\r\n halfWidth = Math.max(halfWidth, Math.abs(s.x) * lens + w)\r\n halfHeight = Math.max(halfHeight, Math.abs(s.y) * lens + h)\r\n }\r\n return { width: halfWidth * 2, height: halfHeight * 2 }\r\n}\r\n\r\nfunction rotateClockwise(x: number, y: number, degrees: number): { x: number; y: number } {\r\n if (degrees === 0) return { x, y }\r\n const rad = (degrees * Math.PI) / 180\r\n const cos = Math.cos(rad)\r\n const sin = Math.sin(rad)\r\n return { x: x * cos + y * sin, y: -x * sin + y * cos }\r\n}\r\n\r\nfunction sameSize(a: Size2D, b: Size2D): boolean {\r\n return Math.abs(a.width - b.width) < 1e-6 && Math.abs(a.height - b.height) < 1e-6\r\n}\r\n\r\nfunction lerp(a: number, b: number, t: number): number {\r\n return a + (b - a) * t\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"item-grid.js","sourceRoot":"","sources":["../../src/kit/item-grid.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n commandsFor,\n easeIn,\n easeInOut,\n easeOut,\n flowOps,\n insetsOps,\n Types,\n type ChildView,\n type InsetsResolved,\n type LayoutBox,\n type LayoutItem,\n type Measurer,\n type Node2D,\n type NodeFrame,\n type NodeView,\n type Piece,\n type Placement2D,\n type RenderContext,\n type Size2D,\n type SpaceCamera,\n type Timeline,\n type Values,\n} from \"@motionscript/sdk\"\n\nimport {\n applyItemEffects,\n REVEAL_STYLES,\n WAVE_STYLES,\n type FocusState,\n type RevealState,\n type WaveState,\n} from \"./item-effects\"\nimport { normalizeOrder, parseOrder, slotOfItem } from \"./order\"\nimport { hashSeed, shuffled } from \"./random\"\nimport { blendSlot, focalLengthOf, slotsOf, spreadSlot, type Arrangement, type Slot } from \"./slots\"\nimport { STAGGER_ORDERS, staggerProgress, staggerRanks, type StaggerOrder } from \"./stagger\"\n\n/**\n * What every grid is built from: a container that places each of its children\n * in a slot of an arrangement — a rectangular grid, a ring, a path, a sphere.\n * Spread `state` and `commands` in, take `defaults`, hand `fields` the\n * {@link Arranger} that makes this grid's arrangement from its state, and pass\n * the finished component and its arranger through {@link define}.\n *\n * ## Children only\n *\n * The items are the children, in layer order. A child's slot is a parent\n * transform on it, so its own `x`/`y`/`rotation`/`scale` — and any command on\n * them — still work, relative to the slot. A group is one item; a grid of\n * grids is a grid of items that happen to be grids.\n *\n * ## One pass\n *\n * Every frame: measure the children, ask the arrangement for its slots (a pure\n * function of the state, the sizes and the clock), blend them from where a\n * transition is leaving, and layer on the per-item effects — reveal, wave,\n * focus. What is left is each child's box and slot, which the renderer,\n * picking and `global` all read, so a selection outline lands on the pixels\n * even on a sphere.\n *\n * ## Commands\n *\n * Every command is a pure function of time. The per-item ones stagger *inside*\n * their duration — a one-second reveal takes one second for four children or\n * four hundred — and write their per-item state into entries\n * (`revealState` and its siblings), which is what keeps them seekable. The ones\n * that change the arrangement itself (a reorder, a morph, a column count) keep\n * the arrangement they are leaving as data and blend each item from its old\n * slot to its new one.\n */\n\n/** An arrangement a grid is leaving, kept as data so its slots can be worked out afresh every frame. */\nexport interface GridSnapshot {\n arrangement: Arrangement\n /** The grid the arrangement was borrowed from, or `\"\"` for the grid's own. */\n source: string\n order: readonly number[]\n spread: number\n}\n\n/** A change of arrangement under way: where the items are coming from, and how far each has come. */\nexport interface GridTransition {\n from: GridSnapshot\n /** Each item's eased, staggered progress, `0..1`. */\n mix: readonly number[]\n}\n\n/** The stagger options every per-item command takes. */\nexport interface StaggerArgs {\n staggerOrder?: StaggerOrder\n /** `0..0.95`: how much of the command's length the items' offsets take up. */\n stagger?: number\n}\n\n/**\n * Every grid's document key — what a reference to \"another grid\" may name. A\n * `nodeRef` descriptor carries it as `nodeTypes`, for a host's picker to offer\n * only those.\n */\nexport const ITEM_GRID_TYPES = [\"rectangularGrid\", \"radialGrid\", \"pathGrid\", \"sphereGrid\"] as const\n\n/** The stagger a move to new slots takes when its command states none. */\nexport const TRANSITION_STAGGER = 0.3\n\n/** A reference to another node, a host's picker offering only `types`. Its fields read a view of it. */\nexport function nodeRef(types: readonly string[]) {\n const described = { kind: \"nodeRef\", nodeTypes: types, animatable: false }\n return Types.custom<string, NodeView | null>(\"\", described)\n}\n\n/** The stagger args every per-item command takes, `stagger` defaulting to `fallback`. */\nexport function staggerArgs(fallback: number) {\n return {\n staggerOrder: Types.oneOf(STAGGER_ORDERS, { default: \"index\" }),\n stagger: Types.number(fallback, { min: 0, max: 0.95, step: 0.05 }),\n }\n}\n\n/**\n * A command arg a host fills in with `hint`, which a row may leave out: the\n * command then keeps what the grid has. A run arg's default is both what a\n * host offers and what an omitted arg means, so the hint rides on the arg's\n * description alone, and an omitted arg reads `undefined`.\n */\nexport function hinted<T extends number | string>(hint: T, options: object = {}) {\n const described: Record<string, unknown> = { ...options, default: hint }\n return Types.custom<T | undefined>(undefined, described as never)\n}\n\n/** A command arg naming another node, a host's picker offering only `types`; left out, it reads `undefined`. */\nexport function nodeRefArg(types: readonly string[]) {\n const described = { kind: \"nodeRef\", nodeTypes: types }\n return Types.custom<string | undefined>(undefined, described)\n}\n\n/** The state every grid shares. */\nexport const state = {\n /** Items in slot order: slot `k` holds child `order[k]`. Empty is the children's own order. */\n order: Types.custom<number[]>([], { kind: \"order\", animatable: false }),\n /** `0` gathers every item at the centre, `1` is the arrangement, past `1` pushes them apart. */\n spread: Types.number(1, { min: 0, max: 3, step: 0.05 }),\n /** Another grid whose arrangement this one takes on — what `morphInto` animates. */\n arrangeLike: nodeRef(ITEM_GRID_TYPES),\n // What the per-item commands write. State rather than settings: a command\n // owns each while it runs, and a document has no reason to name them. Unset\n // until a command writes one, so a fresh node's row does not state them.\n revealState: Types.custom<RevealState | null | undefined>(undefined, { kind: \"state\", animatable: false }),\n waveState: Types.custom<WaveState | null | undefined>(undefined, { kind: \"state\", animatable: false }),\n focusState: Types.custom<FocusState | null | undefined>(undefined, { kind: \"state\", animatable: false }),\n transition: Types.custom<GridTransition | null | undefined>(undefined, { kind: \"state\", animatable: false }),\n /** The grid a transition's leaving arrangement was borrowed from, followed while the items travel. */\n transitionSource: Types.custom<string, NodeView | null, { readonly private: true }>(\"\", { kind: \"nodeRef\", private: true }),\n}\n\n/** A grid's size is what its items come to, whether it was built with children or they arrive after it. */\nexport const defaults = { width: \"hug\", height: \"hug\" } as const\n\n/** What a grid's commands read of its state, beyond its own arrangement's entries. */\nexport type GridValues = Values<typeof state> & { readonly padding: InsetsResolved }\n\n/** What a grid's measure, layout and render read of its state, beyond its own arrangement's entries. */\nexport type GridState = GridValues & {\n readonly width: LayoutItem[\"width\"]\n readonly height: LayoutItem[\"height\"]\n readonly children: readonly ChildView[]\n}\n\n/** What makes one grid's arrangement from its state: the rest of a grid is this module. */\nexport interface Arranger<S = unknown> {\n /** This grid's own arrangement, for a content box of `box`. */\n arrangement(state: S, box: Size2D): Arrangement\n /** The room each item is measured in — the whole content box, unless the arrangement has cells. */\n itemSpace?(state: S, count: number, space: Size2D): Size2D\n}\n\ntype GridComponent = { readonly key: string; readonly node: abstract new (...args: never[]) => object }\n\nconst GRIDS = new Map<string, { readonly component: GridComponent; readonly arranger: Arranger<never> }>()\n\n/**\n * `component` as a grid: registers its `arranger`, which another grid borrowing\n * its arrangement or morphing into it reads it by, and which {@link isGrid} knows it by.\n */\nexport function define<C extends GridComponent, S>(component: C, arranger: Arranger<S>): C {\n GRIDS.set(component.key, { component, arranger: arranger as Arranger<never> })\n return component\n}\n\n/** Whether `value` is a node of one of the grids {@link define} has seen. */\nexport function isGrid(value: unknown): boolean {\n for (const { component } of GRIDS.values()) if (value instanceof component.node) return true\n return false\n}\n\n/** The grid's measure, layout and render, for `arranger`'s arrangement: spread them into the component. */\nexport function fields<S>(arranger: Arranger<S>) {\n return {\n measure: (measurer: Measurer, s: GridState & S, children: readonly ChildView[]) => measure(measurer, s, children, arranger),\n layout: (box: LayoutBox, s: GridState & S, children: readonly ChildView[]) => layout(box, s, children, arranger),\n render: (ctx: RenderContext, s: GridState & S) => render(ctx, s, arranger),\n }\n}\n\nconst NO_CONTENT: Size2D = { width: 0, height: 0 }\nconst CENTRE = { x: 0, y: 0 }\n\n/** What `measure` found, for `layout` to reuse in the same pass. Keyed by the grid's state, one object per node. */\nconst measured = new WeakMap<object, { space: Size2D; sizes: Size2D[] }>()\n\nexport function measure<S>(measurer: Measurer, s: GridState & S, children: readonly ChildView[], arranger: Arranger<S>): Size2D {\n const constraints = { maxWidth: measurer.max.width, maxHeight: measurer.max.height }\n const padding = s.padding\n if (children.length === 0) {\n measured.delete(s)\n return flowOps.size(s, constraints, padding, NO_CONTENT)\n }\n const space = flowOps.contentBox(s, constraints, padding)\n const sizes = measureItems(children, space, s, arranger)\n measured.set(s, { space, sizes })\n const grid = { state: s, arranger, children, isSelf: sharesChildren(children) }\n const target = targetSlots(grid, sizes.length, sizes, space, measurer.time.total)\n return flowOps.size(s, constraints, padding, extentOf(target.slots, sizes, focalOf(s, target.arrangement)))\n}\n\nexport function layout<S>(box: LayoutBox, s: GridState & S, children: readonly ChildView[], arranger: Arranger<S>): readonly Placement2D[] {\n const kept = measured.get(s)\n measured.delete(s)\n if (children.length === 0) return []\n const inner = insetsOps.insetBounds(box.width, box.height, s.padding)\n const sizes = kept && kept.sizes.length === children.length && sameSize(kept.space, inner)\n ? kept.sizes\n : measureItems(children, inner, s, arranger)\n const slots = resolve({ state: s, arranger, children, isSelf: sharesChildren(children) }, sizes, inner, box.time.total)\n return slots.map((slot, i) => placement(inner, slot, sizes[i]))\n}\n\n/**\n * A grid whose arrangement has depth is seen through a camera of its own,\n * which paints its items far to near — unless it already sits in a space (an\n * orbit camera, a 3D stage), where its items join that one and its camera.\n */\nexport function render<S>(ctx: RenderContext, s: GridState & S, arranger: Arranger<S>): void {\n // With no items there is nothing to see through a camera.\n const focal = s.children.length === 0 ? 0 : focalOf(s, arrangementOf({ state: s, arranger, children: [], isSelf: () => false }, contentBox(ctx.size, s.padding)))\n if (focal > 0 && !ctx.inSpace) ctx.space(cameraAt(focal))\n else ctx.children()\n}\n\n/** A node's content box: its laid-out size inside its padding. */\nexport function contentBoxOf(grid: Node2D): Size2D {\n const b = grid.layoutBounds\n return contentBox({ width: b.width, height: b.height }, grid.effectivePadding())\n}\n\n// ---- what commands share --------------------------------------------------\n\ntype GridTimeline = Timeline<StaggerArgs, never>\n\n/**\n * Each item's slot in its arrangement as it stands, for a command being built,\n * at the clock commands are built against (the tree stands at time 0 while a\n * timeline compiles): what its stagger is ranked by.\n */\nexport function itemSlots(timeline: Timeline<object, never>, s: GridValues, children: readonly ChildView[]): Slot[] {\n const grid = commandGrid(timeline, s, children)\n const sizes = children.map((child) => child.size)\n return targetSlots(grid, children.length, sizes, contentBox(timeline.node.size, s.padding), 0).slots\n}\n\n/** Each item's start in a stagger. A random order is seeded by the node's id, so it never changes between builds. */\nexport function ranks(timeline: Timeline<object, never>, s: GridValues, children: readonly ChildView[], order: StaggerOrder | undefined): number[] {\n return staggerRanks(order ?? \"index\", itemSlots(timeline, s, children), hashSeed(timeline.node.id))\n}\n\n/**\n * Write `changes` to the arrangement and move each item from its slot in the\n * one being left to its slot in the new one, staggered.\n */\nexport function transitionTo(\n timeline: GridTimeline,\n s: GridValues,\n children: readonly ChildView[],\n changes: Record<string, unknown>,\n stagger = TRANSITION_STAGGER,\n): Piece {\n const from = snapshot(timeline, s, children)\n const ease = timeline.easing ?? easeInOut(\"cubic\")\n const order = ranks(timeline, s, children, timeline.args.staggerOrder)\n const spread = timeline.args.stagger ?? stagger\n return timeline.animate((t) => {\n if (t >= 1) return { ...changes, transition: null, transitionSource: \"\" } as never\n const mix = order.map((rank) => ease(staggerProgress(rank, t, spread)))\n return { ...changes, transition: { from, mix }, transitionSource: from.source } as never\n }, { eased: false })\n}\n\n/** Emphasise the items `isFocus` picks and push the rest back. */\nexport function focusOn(\n timeline: Timeline<object, never>,\n s: GridValues,\n isFocus: (item: number) => boolean,\n count: number,\n dim: number,\n grow: number,\n): Piece {\n const from = s.focusState\n const target = Array.from({ length: count }, (_, i) => (isFocus(i) ? 1 : -1))\n const ease = timeline.easing ?? easeInOut(\"cubic\")\n return timeline.animate((t) => {\n const e = ease(t)\n return {\n focusState: {\n dim: lerp(from?.dim ?? dim, dim, e),\n grow: lerp(from?.grow ?? grow, grow, e),\n values: target.map((v, i) => lerp(from?.values[i] ?? 0, v, e)),\n },\n } as never\n }, { eased: false })\n}\n\n// What the commands are typed against: the shared state, and the padding every node has.\nconst GRID_STATE = { ...state, padding: Types.insets }\n\nexport const commands = commandsFor(GRID_STATE, {\n /**\n * Bring the items in, one after another. Every item starts hidden, so place\n * it where the grid enters — or after a `conceal`.\n */\n reveal: {\n args: { style: Types.oneOf(REVEAL_STYLES, { default: \"scale\" }), ...staggerArgs(0.5) },\n run: (timeline, s, children) => {\n const style = timeline.args.style ?? \"scale\"\n const ease = timeline.easing ?? (style === \"scale\" || style === \"flip\" ? easeOut(\"back\") : easeOut(\"cubic\"))\n const order = ranks(timeline as never, s, children, timeline.args.staggerOrder)\n const stagger = timeline.args.stagger ?? 0.5\n return timeline.animate((t) => {\n if (t >= 1) return { revealState: null }\n return { revealState: { style, values: order.map((rank) => ease(staggerProgress(rank, t, stagger))) } }\n }, { eased: false })\n },\n },\n /** Take the items out, one after another — `reveal` in reverse. They stay hidden after. */\n conceal: {\n args: { style: Types.oneOf(REVEAL_STYLES, { default: \"scale\" }), ...staggerArgs(0.5) },\n run: (timeline, s, children) => {\n const style = timeline.args.style ?? \"scale\"\n const ease = timeline.easing ?? (style === \"scale\" || style === \"flip\" ? easeIn(\"back\") : easeInOut(\"cubic\"))\n const order = ranks(timeline as never, s, children, timeline.args.staggerOrder)\n const stagger = timeline.args.stagger ?? 0.5\n const from = s.revealState?.values\n return timeline.animate((t) => ({\n revealState: {\n style,\n values: order.map((rank, i) => (from?.[i] ?? 1) * (1 - ease(staggerProgress(rank, t, stagger)))),\n },\n }), { eased: false })\n },\n },\n /** Send a ripple through the items that swells each in turn and settles back. */\n wave: {\n args: {\n style: Types.oneOf(WAVE_STYLES, { default: \"scale\" }),\n amount: Types.number(0.3, { min: 0, max: 2, step: 0.05 }),\n ...staggerArgs(0.7),\n },\n run: (timeline, s, children) => {\n const style = timeline.args.style ?? \"scale\"\n const amount = timeline.args.amount ?? 0.3\n const ease = timeline.easing ?? easeInOut(\"sine\")\n const order = ranks(timeline as never, s, children, timeline.args.staggerOrder)\n const stagger = timeline.args.stagger ?? 0.7\n return timeline.animate((t) => {\n if (t >= 1) return { waveState: null }\n return { waveState: { style, amount, values: order.map((rank) => Math.sin(Math.PI * ease(staggerProgress(rank, t, stagger)))) } }\n }, { eased: false })\n },\n },\n /** Bring one item (by its place in the layers, from 0) forward and push the rest back. */\n focus: {\n args: {\n item: Types.number(0, { min: 0, step: 1 }),\n dim: Types.number(0.7, { min: 0, max: 1, step: 0.05 }),\n grow: Types.number(0.15, { min: 0, max: 1, step: 0.05 }),\n },\n run: (timeline, s, children) => {\n const item = Math.round(timeline.args.item ?? 0)\n return focusOn(timeline as never, s, (i) => i === item, children.length, timeline.args.dim ?? 0.7, timeline.args.grow ?? 0.15)\n },\n },\n /** Bring every item back to even. */\n unfocus: (timeline, s) => {\n const from = s.focusState\n const ease = timeline.easing ?? easeInOut(\"cubic\")\n return timeline.animate((t) => {\n if (t >= 1 || !from) return { focusState: null }\n const k = 1 - ease(t)\n return { focusState: { ...from, values: from.values.map((v) => v * k) } }\n }, { eased: false })\n },\n /** Gather the items toward the centre (`0`), back to the arrangement (`1`), or push them apart. */\n spreadTo: {\n args: { spread: Types.number(1, { min: 0, max: 3, step: 0.05 }) },\n run: (timeline) => timeline.tween({ spread: timeline.args.spread ?? 1 }),\n },\n /** Send every item to a random slot. The same `seed` always deals the same way. */\n shuffle: {\n args: { seed: Types.number(1, { min: 0, step: 1 }), ...staggerArgs(TRANSITION_STAGGER) },\n run: (timeline, s, children) => {\n const current = normalizeOrder(s.order, children.length)\n let next = shuffled(current, timeline.args.seed ?? 1)\n // A shuffle that deals everything back where it was would look like nothing happened.\n if (next.length > 1 && next.every((item, k) => item === current[k])) next = [...next.slice(1), next[0]]\n return transitionTo(timeline as never, s, children, { order: next })\n },\n },\n /** Two items trade places, by their place in the layers. */\n swap: {\n args: {\n first: Types.number(0, { min: 0, step: 1 }),\n second: Types.number(1, { min: 0, step: 1 }),\n ...staggerArgs(0),\n },\n run: (timeline, s, children) => {\n const order = normalizeOrder(s.order, children.length)\n const a = order.indexOf(Math.round(timeline.args.first ?? 0))\n const b = order.indexOf(Math.round(timeline.args.second ?? 1))\n if (a >= 0 && b >= 0) [order[a], order[b]] = [order[b], order[a]]\n return transitionTo(timeline as never, s, children, { order }, 0)\n },\n },\n /** Move the items into a new order — a list of layer indices, first slot first, like `\"2, 0, 1\"`. */\n reorder: {\n args: { order: Types.text(\"\"), ...staggerArgs(TRANSITION_STAGGER) },\n run: (timeline, s, children) => {\n const order = normalizeOrder(parseOrder(timeline.args.order), children.length)\n return transitionTo(timeline as never, s, children, { order })\n },\n },\n /**\n * Move every item into another grid's arrangement — a grid into a ring, a ring\n * onto a sphere — and keep following it. An empty `target` morphs back to\n * this grid's own.\n */\n morphInto: {\n args: { target: nodeRefArg(ITEM_GRID_TYPES), ...staggerArgs(TRANSITION_STAGGER) },\n run: (timeline, s, children) => transitionTo(timeline as never, s, children, { arrangeLike: timeline.args.target ?? \"\" }),\n },\n})\n\n// ---- the one pass ------------------------------------------------------------\n\ninterface Grid {\n readonly state: GridValues\n readonly arranger: Arranger<never>\n readonly children: readonly ChildView[]\n /** Whether a view is this grid itself, which borrows nothing from itself. */\n readonly isSelf: (view: NodeView) => boolean\n}\n\nfunction arrangerOf(key: string): Arranger<never> {\n const grid = GRIDS.get(key)\n if (!grid) throw new Error(`\"${key}\" is no grid: pass its component through ItemGrid.define.`)\n return grid.arranger\n}\n\n/** A grid `view` names, when it is one this kit can arrange and not the reader itself. */\nfunction gridIn(view: NodeView | null | undefined, grid: Grid): { view: NodeView; arranger: Arranger<never> } | null {\n if (!view) return null\n const found = GRIDS.get(view.key)\n if (!found || grid.isSelf(view)) return null\n return { view, arranger: found.arranger }\n}\n\n/** In layout, a view is this grid when it holds the same children: a child has one parent. */\nfunction sharesChildren(children: readonly ChildView[]): (view: NodeView) => boolean {\n return (view) => {\n if (children.length === 0) return false\n const theirs = (view.state as { readonly children?: readonly ChildView[] }).children\n return theirs?.[0] === children[0]\n }\n}\n\nfunction commandGrid(timeline: Timeline<object, never>, s: GridValues, children: readonly ChildView[]): Grid {\n return { state: s, arranger: arrangerOf(timeline.node.key), children, isSelf: (view) => view.id === timeline.node.id }\n}\n\nfunction snapshot(timeline: Timeline<object, never>, s: GridValues, children: readonly ChildView[]): GridSnapshot {\n const grid = commandGrid(timeline, s, children)\n const source = gridIn(s.arrangeLike, grid)\n return {\n arrangement: source\n ? source.arranger.arrangement(source.view.state as never, viewBox(source.view))\n : grid.arranger.arrangement(s as never, contentBox(timeline.node.size, s.padding)),\n source: source?.view.id ?? \"\",\n order: normalizeOrder(s.order, children.length),\n spread: s.spread,\n }\n}\n\nfunction measureItems(children: readonly ChildView[], space: Size2D, s: unknown, arranger: Arranger<never>): Size2D[] {\n const sizes = children.map((child) => child.measure(space))\n const cell = arranger.itemSpace ? arranger.itemSpace(s as never, children.length, space) : space\n if (cell === space) return sizes\n return children.map((child) => child.measure(cell))\n}\n\n/** The arrangement the grid is heading for: the one it borrows, or its own. */\nfunction arrangementOf(grid: Grid, box: Size2D): Arrangement {\n const source = gridIn(grid.state.arrangeLike, grid)\n return source ? source.arranger.arrangement(source.view.state as never, viewBox(source.view)) : grid.arranger.arrangement(grid.state as never, box)\n}\n\n/** Where each item sits in the arrangement it is heading for, before any transition or effect. */\nfunction targetSlots(grid: Grid, count: number, sizes: readonly Size2D[], box: Size2D, time: number): { slots: Slot[]; arrangement: Arrangement } {\n const s = grid.state\n const source = gridIn(s.arrangeLike, grid)\n const sourceBox = source ? viewBox(source.view) : box\n const arrangement = source ? source.arranger.arrangement(source.view.state as never, sourceBox) : grid.arranger.arrangement(s as never, box)\n let slots = slotsOf(arrangement, { count, sizes, box: sourceBox, time })\n if (source) slots = inFrame(source.view.frame, slots)\n const slotOf = slotOfItem(normalizeOrder(s.order, count))\n return { slots: slotOf.map((k) => spreadSlot(slots[k], s.spread)), arrangement }\n}\n\n/** Each item's final slot this frame: the target, blended from any transition, with its effects on. */\nfunction resolve(grid: Grid, sizes: readonly Size2D[], box: Size2D, time: number): Slot[] {\n const s = grid.state\n const count = sizes.length\n const slots = targetSlots(grid, count, sizes, box, time).slots\n const transition = s.transition\n if (transition) {\n const { from } = transition\n const named = from.source ? s.transitionSource : null\n const source = named && named.id === from.source && GRIDS.has(named.key) ? named : null\n const self = source !== null && grid.isSelf(source)\n const fromBox = source && !self ? viewBox(source) : box\n let leaving = slotsOf(from.arrangement, { count, sizes, box: fromBox, time })\n if (source && !self) leaving = inFrame(source.frame, leaving)\n const slotOf = slotOfItem(normalizeOrder(from.order, count))\n for (let i = 0; i < count; i++) {\n slots[i] = blendSlot(spreadSlot(leaving[slotOf[i]], from.spread), slots[i], transition.mix[i] ?? 1)\n }\n }\n const reveal = s.revealState\n const wave = s.waveState\n const focus = s.focusState\n if (reveal || wave || focus) {\n for (let i = 0; i < count; i++) applyItemEffects(slots[i], i, sizes[i], reveal, wave, focus)\n }\n return slots\n}\n\n/** The camera distance the grid is seen through: the target's, or, while a morph runs, the one it is leaving. */\nfunction focalOf(s: GridValues, target: Arrangement): number {\n // A morph into or out of depth keeps the camera for its whole length.\n return focalLengthOf(target) || (s.transition ? focalLengthOf(s.transition.from.arrangement) : 0)\n}\n\nfunction cameraAt(focal: number): SpaceCamera {\n return {\n perspective: focal,\n orbit: 0,\n elevation: 0,\n dolly: 0,\n lookAt: CENTRE,\n zoom: 1,\n heading: 0,\n viewportX: 0,\n viewportY: 0,\n }\n}\n\n/** A slot as a child's placement: its box centred on the slot, and the slot's transform when it has one. */\nfunction placement(inner: { x: number; y: number }, s: Slot, size: Size2D): Placement2D {\n const box = { x: inner.x + s.x, y: s.y - inner.y, width: size.width, height: size.height }\n if (s.rotation === 0 && s.scale === 1 && s.rotationX === 0 && s.rotationY === 0 && s.depth === 0 && s.opacity === 1) return box\n return {\n ...box,\n rotation: s.rotation,\n scale: s.scale,\n rotationX: s.rotationX,\n rotationY: s.rotationY,\n depth: s.depth,\n opacity: s.opacity,\n }\n}\n\n/** `slots`, laid out in another grid's frame, moved into this grid's. */\nfunction inFrame(frame: NodeFrame, slots: Slot[]): Slot[] {\n return slots.map((s) => {\n const p = rotateClockwise(s.x * frame.scale, s.y * frame.scale, frame.rotation)\n return {\n ...s,\n x: frame.x + p.x,\n y: frame.y + p.y,\n depth: s.depth * frame.scale,\n rotation: s.rotation + frame.rotation,\n scale: s.scale * frame.scale,\n }\n })\n}\n\nfunction viewBox(view: NodeView): Size2D {\n return contentBox(view.size, (view.state as { readonly padding: InsetsResolved }).padding)\n}\n\n/** A box of `size` inside `padding`: what a command reads as its grid's content box from `timeline.node.size`. */\nexport function contentBox(size: Size2D, padding: InsetsResolved): Size2D {\n const inner = insetsOps.insetBounds(size.width, size.height, padding)\n return { width: inner.width, height: inner.height }\n}\n\n/** The box, centred on the grid, that holds every item where its slot puts it. */\nfunction extentOf(slots: readonly Slot[], sizes: readonly Size2D[], focal: number): Size2D {\n let halfWidth = 0\n let halfHeight = 0\n for (let i = 0; i < slots.length; i++) {\n const s = slots[i]\n const size = sizes[i]\n const rad = (s.rotation * Math.PI) / 180\n const cos = Math.abs(Math.cos(rad))\n const sin = Math.abs(Math.sin(rad))\n // What the camera does to a slot at depth, so a sphere hugs its front.\n const lens = focal > 0 && focal - s.depth > 1 ? focal / (focal - s.depth) : 1\n const w = ((size.width * cos + size.height * sin) / 2) * s.scale * lens\n const h = ((size.width * sin + size.height * cos) / 2) * s.scale * lens\n halfWidth = Math.max(halfWidth, Math.abs(s.x) * lens + w)\n halfHeight = Math.max(halfHeight, Math.abs(s.y) * lens + h)\n }\n return { width: halfWidth * 2, height: halfHeight * 2 }\n}\n\nfunction rotateClockwise(x: number, y: number, degrees: number): { x: number; y: number } {\n if (degrees === 0) return { x, y }\n const rad = (degrees * Math.PI) / 180\n const cos = Math.cos(rad)\n const sin = Math.sin(rad)\n return { x: x * cos + y * sin, y: -x * sin + y * cos }\n}\n\nfunction sameSize(a: Size2D, b: Size2D): boolean {\n return Math.abs(a.width - b.width) < 1e-6 && Math.abs(a.height - b.height) < 1e-6\n}\n\nfunction lerp(a: number, b: number, t: number): number {\n return a + (b - a) * t\n}\n"]}
|
package/dist/kit/order.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"order.js","sourceRoot":"","sources":["../../src/kit/order.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,iHAAiH;AACjH,MAAM,UAAU,cAAc,CAAC,KAAoC,EAAE,KAAa;IAChF,MAAM,GAAG,GAAa,EAAE,CAAA;IACxB,MAAM,KAAK,GAAG,IAAI,KAAK,CAAU,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACnD,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QAC9B,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,GAAG,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9C,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;YAClB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAChB,CAAC;IACH,CAAC;IACD,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,KAAK,EAAE,IAAI,EAAE;QAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzE,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,0CAA0C;AAC1C,MAAM,UAAU,UAAU,CAAC,KAAwB;IACjD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAS,KAAK,CAAC,MAAM,CAAC,CAAA;IAC7C,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;QAC3B,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACpB,CAAC,CAAC,CAAA;IACF,OAAO,KAAK,CAAA;AACd,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAC1E,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAA;IACxC,OAAO,KAAK;SACT,KAAK,CAAC,QAAQ,CAAC;SACf,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC;SAC7B,GAAG,CAAC,MAAM,CAAC;SACX,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;AAC5B,CAAC","sourcesContent":["/**\
|
|
1
|
+
{"version":3,"file":"order.js","sourceRoot":"","sources":["../../src/kit/order.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,iHAAiH;AACjH,MAAM,UAAU,cAAc,CAAC,KAAoC,EAAE,KAAa;IAChF,MAAM,GAAG,GAAa,EAAE,CAAA;IACxB,MAAM,KAAK,GAAG,IAAI,KAAK,CAAU,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACnD,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QAC9B,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,GAAG,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9C,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;YAClB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAChB,CAAC;IACH,CAAC;IACD,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,KAAK,EAAE,IAAI,EAAE;QAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzE,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,0CAA0C;AAC1C,MAAM,UAAU,UAAU,CAAC,KAAwB;IACjD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAS,KAAK,CAAC,MAAM,CAAC,CAAA;IAC7C,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;QAC3B,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACpB,CAAC,CAAC,CAAA;IACF,OAAO,KAAK,CAAA;AACd,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAC1E,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAA;IACxC,OAAO,KAAK;SACT,KAAK,CAAC,QAAQ,CAAC;SACf,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC;SAC7B,GAAG,CAAC,MAAM,CAAC;SACX,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;AAC5B,CAAC","sourcesContent":["/**\n * A grid's `order` lists items in slot order: slot `k` holds item `order[k]`.\n * These keep it a permutation whatever it was written as — a stale entry past\n * the count, a repeat, or nothing at all — so a child added or removed never\n * leaves a slot empty or two items in one.\n */\n\n/** `order` repaired into a permutation of `0..count-1`: its valid entries first, then the rest in item order. */\nexport function normalizeOrder(order: readonly number[] | undefined, count: number): number[] {\n const out: number[] = []\n const taken = new Array<boolean>(count).fill(false)\n for (const entry of order ?? []) {\n const item = Math.round(entry)\n if (item >= 0 && item < count && !taken[item]) {\n taken[item] = true\n out.push(item)\n }\n }\n for (let item = 0; item < count; item++) if (!taken[item]) out.push(item)\n return out\n}\n\n/** For each item, the slot it sits in. */\nexport function slotOfItem(order: readonly number[]): number[] {\n const slots = new Array<number>(order.length)\n order.forEach((item, slot) => {\n slots[item] = slot\n })\n return slots\n}\n\n/** An order written as `\"2, 0, 1\"` or as numbers. */\nexport function parseOrder(value: unknown): number[] {\n if (Array.isArray(value)) return value.map(Number).filter(Number.isFinite)\n if (typeof value !== \"string\") return []\n return value\n .split(/[\\s,]+/)\n .filter((part) => part !== \"\")\n .map(Number)\n .filter(Number.isFinite)\n}\n"]}
|
package/dist/kit/random.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"random.js","sourceRoot":"","sources":["../../src/kit/random.ts"],"names":[],"mappings":"AAAA,8GAA8G;AAC9G,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC9B,OAAO,GAAG,EAAE;QACV,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAA;QAC1B,IAAI,CAAC,GAAG,CAAC,CAAA;QACT,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;QACpC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAA;QACzC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,UAAU,CAAA;IAC9C,CAAC,CAAA;AACH,CAAC;AAED,yCAAyC;AACzC,MAAM,UAAU,QAAQ,CAAI,MAAoB,EAAE,IAAY;IAC5D,MAAM,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,CAAA;IACvB,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;IACjC,KAAK,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CACvC;QAAA,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACtC,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,wGAAwG;AACxG,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,IAAI,CAAC,GAAG,UAAU,CAAA;IAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;IACrF,OAAO,CAAC,KAAK,CAAC,CAAA;AAChB,CAAC","sourcesContent":["/** A seeded generator in `[0, 1)` — mulberry32, so a shuffle is the same on every frame and every machine. */\
|
|
1
|
+
{"version":3,"file":"random.js","sourceRoot":"","sources":["../../src/kit/random.ts"],"names":[],"mappings":"AAAA,8GAA8G;AAC9G,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC9B,OAAO,GAAG,EAAE;QACV,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAA;QAC1B,IAAI,CAAC,GAAG,CAAC,CAAA;QACT,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;QACpC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAA;QACzC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,UAAU,CAAA;IAC9C,CAAC,CAAA;AACH,CAAC;AAED,yCAAyC;AACzC,MAAM,UAAU,QAAQ,CAAI,MAAoB,EAAE,IAAY;IAC5D,MAAM,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,CAAA;IACvB,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;IACjC,KAAK,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CACvC;QAAA,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACtC,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,wGAAwG;AACxG,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,IAAI,CAAC,GAAG,UAAU,CAAA;IAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;IACrF,OAAO,CAAC,KAAK,CAAC,CAAA;AAChB,CAAC","sourcesContent":["/** A seeded generator in `[0, 1)` — mulberry32, so a shuffle is the same on every frame and every machine. */\nexport function seededRandom(seed: number): () => number {\n let a = Math.floor(seed) >>> 0\n return () => {\n a = (a + 0x6d2b79f5) >>> 0\n let t = a\n t = Math.imul(t ^ (t >>> 15), t | 1)\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61)\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296\n }\n}\n\n/** `values` in a seeded random order. */\nexport function shuffled<T>(values: readonly T[], seed: number): T[] {\n const out = [...values]\n const random = seededRandom(seed)\n for (let i = out.length - 1; i > 0; i--) {\n const j = Math.floor(random() * (i + 1))\n ;[out[i], out[j]] = [out[j], out[i]]\n }\n return out\n}\n\n/** A stable number for a string — a node's id, so its \"random\" stagger never changes between builds. */\nexport function hashSeed(text: string): number {\n let h = 2166136261\n for (let i = 0; i < text.length; i++) h = Math.imul(h ^ text.charCodeAt(i), 16777619)\n return h >>> 0\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/kit/slots/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAwB,MAAM,QAAQ,CAAA;AACxD,OAAO,EAAE,WAAW,EAA0B,MAAM,UAAU,CAAA;AAC9D,OAAO,EAAE,gBAAgB,EAA+B,MAAM,eAAe,CAAA;AAE7E,OAAO,EAAE,WAAW,EAA0B,MAAM,UAAU,CAAA;AAE9D,cAAc,QAAQ,CAAA;AACtB,cAAc,eAAe,CAAA;AAC7B,cAAc,UAAU,CAAA;AACxB,cAAc,QAAQ,CAAA;AACtB,cAAc,kBAAkB,CAAA;AAChC,cAAc,UAAU,CAAA;AAUxB,iFAAiF;AACjF,MAAM,UAAU,OAAO,CAAC,WAAwB,EAAE,KAAgB;IAChE,QAAQ,WAAW,CAAC,IAAI,EAAE,CAAC;QACzB,KAAK,aAAa;YAChB,OAAO,gBAAgB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAA;QAC7C,KAAK,QAAQ;YACX,OAAO,WAAW,CAAC,WAAW,EAAE,KAAK,CAAC,CAAA;QACxC,KAAK,MAAM;YACT,OAAO,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,CAAA;QACtC,KAAK,QAAQ;YACX,OAAO,WAAW,CAAC,WAAW,EAAE,KAAK,CAAC,CAAA;IAC1C,CAAC;AACH,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,aAAa,CAAC,WAAwB;IACpD,OAAO,WAAW,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AACjF,CAAC","sourcesContent":["import { pathSlots, type PathArrangement } from \"./path\"\
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/kit/slots/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAwB,MAAM,QAAQ,CAAA;AACxD,OAAO,EAAE,WAAW,EAA0B,MAAM,UAAU,CAAA;AAC9D,OAAO,EAAE,gBAAgB,EAA+B,MAAM,eAAe,CAAA;AAE7E,OAAO,EAAE,WAAW,EAA0B,MAAM,UAAU,CAAA;AAE9D,cAAc,QAAQ,CAAA;AACtB,cAAc,eAAe,CAAA;AAC7B,cAAc,UAAU,CAAA;AACxB,cAAc,QAAQ,CAAA;AACtB,cAAc,kBAAkB,CAAA;AAChC,cAAc,UAAU,CAAA;AAUxB,iFAAiF;AACjF,MAAM,UAAU,OAAO,CAAC,WAAwB,EAAE,KAAgB;IAChE,QAAQ,WAAW,CAAC,IAAI,EAAE,CAAC;QACzB,KAAK,aAAa;YAChB,OAAO,gBAAgB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAA;QAC7C,KAAK,QAAQ;YACX,OAAO,WAAW,CAAC,WAAW,EAAE,KAAK,CAAC,CAAA;QACxC,KAAK,MAAM;YACT,OAAO,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,CAAA;QACtC,KAAK,QAAQ;YACX,OAAO,WAAW,CAAC,WAAW,EAAE,KAAK,CAAC,CAAA;IAC1C,CAAC;AACH,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,aAAa,CAAC,WAAwB;IACpD,OAAO,WAAW,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AACjF,CAAC","sourcesContent":["import { pathSlots, type PathArrangement } from \"./path\"\nimport { radialSlots, type RadialArrangement } from \"./radial\"\nimport { rectangularSlots, type RectangularArrangement } from \"./rectangular\"\nimport type { Slot, SlotInput } from \"./slot\"\nimport { sphereSlots, type SphereArrangement } from \"./sphere\"\n\nexport * from \"./slot\"\nexport * from \"./rectangular\"\nexport * from \"./radial\"\nexport * from \"./path\"\nexport * from \"./path-templates\"\nexport * from \"./sphere\"\n\n/**\n * Everything an arrangement needs to place items, as plain data — so a\n * transition can keep the one it is leaving, and a grid can borrow another's.\n */\nexport type Arrangement = RectangularArrangement | RadialArrangement | PathArrangement | SphereArrangement\n\nexport type ArrangementKind = Arrangement[\"kind\"]\n\n/** Where each of `input.count` items sits under `arrangement`, in slot order. */\nexport function slotsOf(arrangement: Arrangement, input: SlotInput): Slot[] {\n switch (arrangement.kind) {\n case \"rectangular\":\n return rectangularSlots(arrangement, input)\n case \"radial\":\n return radialSlots(arrangement, input)\n case \"path\":\n return pathSlots(arrangement, input)\n case \"sphere\":\n return sphereSlots(arrangement, input)\n }\n}\n\n/** The camera distance an arrangement is seen through, or `0` when it is flat. */\nexport function focalLengthOf(arrangement: Arrangement): number {\n return arrangement.kind === \"sphere\" ? Math.max(1, arrangement.focalLength) : 0\n}\n"]}
|