@motionscript/grids 0.1.0-alpha.5 → 0.1.0-alpha.6

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.
Files changed (50) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +47 -15
  3. package/dist/browser/chunks/chunk-J62D7EFZ.js +2 -0
  4. package/dist/browser/chunks/chunk-J62D7EFZ.js.map +7 -0
  5. package/dist/browser/index.js +1 -1
  6. package/dist/browser/index.js.map +3 -3
  7. package/dist/browser/kit.js +1 -1
  8. package/dist/browser/manifest.json +1 -1
  9. package/dist/engine.d.ts +4 -4
  10. package/dist/engine.js +4 -4
  11. package/dist/engine.js.map +1 -1
  12. package/dist/kit/index.d.ts +3 -1
  13. package/dist/kit/index.d.ts.map +1 -1
  14. package/dist/kit/index.js +4 -1
  15. package/dist/kit/index.js.map +1 -1
  16. package/dist/kit/item-grid.d.ts +203 -198
  17. package/dist/kit/item-grid.d.ts.map +1 -1
  18. package/dist/kit/item-grid.js +413 -440
  19. package/dist/kit/item-grid.js.map +1 -1
  20. package/dist/nodes.d.ts +8 -3
  21. package/dist/nodes.d.ts.map +1 -1
  22. package/dist/nodes.js +6 -10
  23. package/dist/nodes.js.map +1 -1
  24. package/dist/path-grid/path-grid.d.ts +108 -73
  25. package/dist/path-grid/path-grid.d.ts.map +1 -1
  26. package/dist/path-grid/path-grid.js +129 -172
  27. package/dist/path-grid/path-grid.js.map +1 -1
  28. package/dist/radial-grid/radial-grid.d.ts +97 -45
  29. package/dist/radial-grid/radial-grid.d.ts.map +1 -1
  30. package/dist/radial-grid/radial-grid.js +55 -87
  31. package/dist/radial-grid/radial-grid.js.map +1 -1
  32. package/dist/rectangular-grid/rectangular-grid.d.ts +114 -70
  33. package/dist/rectangular-grid/rectangular-grid.d.ts.map +1 -1
  34. package/dist/rectangular-grid/rectangular-grid.js +107 -145
  35. package/dist/rectangular-grid/rectangular-grid.js.map +1 -1
  36. package/dist/sphere-grid/sphere-grid.d.ts +109 -60
  37. package/dist/sphere-grid/sphere-grid.d.ts.map +1 -1
  38. package/dist/sphere-grid/sphere-grid.js +90 -137
  39. package/dist/sphere-grid/sphere-grid.js.map +1 -1
  40. package/package.json +4 -4
  41. package/src/engine.ts +4 -4
  42. package/src/kit/index.ts +13 -1
  43. package/src/kit/item-grid.ts +505 -442
  44. package/src/nodes.ts +18 -3
  45. package/src/path-grid/path-grid.ts +137 -164
  46. package/src/radial-grid/radial-grid.ts +69 -78
  47. package/src/rectangular-grid/rectangular-grid.ts +118 -133
  48. package/src/sphere-grid/sphere-grid.ts +103 -117
  49. package/dist/browser/chunks/chunk-XDUDKWM7.js +0 -2
  50. package/dist/browser/chunks/chunk-XDUDKWM7.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 command,\r\n easeInOut,\r\n node,\r\n property,\r\n type Command,\r\n type CommandArgs,\r\n type NodeConfig,\r\n type Size2D,\r\n} from \"@motionscript/sdk\"\r\n\r\nimport {\r\n CELL_MODES,\r\n contentBoxOf,\r\n FILL_DIRECTIONS,\r\n LINE_ALIGNS,\r\n ItemGrid,\r\n rectangularCell,\r\n staggerArgs,\r\n TRANSITION_STAGGER,\r\n type CellMode,\r\n type FillDirection,\r\n type ItemGridProps,\r\n type LineAlign,\r\n type RectangularArrangement,\r\n type StaggerArgs,\r\n} from \"../kit\"\r\n\r\nexport interface RectangularGridProps extends ItemGridProps {\r\n columns: number\r\n fillDirection: FillDirection\r\n cellMode: CellMode\r\n cellWidth: number\r\n cellHeight: number\r\n columnGap: number\r\n rowGap: number\r\n lastLineAlign: LineAlign\r\n rowOffset: number\r\n columnOffset: number\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\n@node({\r\n key: \"rectangularGrid\",\r\n parentKey: \"node\",\r\n forkable: true,\r\n layout: {\r\n children: \"freeform\",\r\n acceptsChildren: true,\r\n defaultWidthMode: \"hug\",\r\n defaultHeightMode: \"hug\",\r\n },\r\n})\r\nexport class RectangularGrid extends ItemGrid<RectangularGridProps> {\r\n @property({ default: 3, min: 1, step: 1 }) declare columns: number\r\n @property({ default: \"row\", kind: \"enum\", options: FILL_DIRECTIONS }) declare fillDirection: FillDirection\r\n @property({ default: \"fit\", kind: \"enum\", options: CELL_MODES }) declare cellMode: CellMode\r\n @property({ default: 120, min: 0, step: 1 }) declare cellWidth: number\r\n @property({ default: 120, min: 0, step: 1 }) declare cellHeight: number\r\n @property({ default: 24, step: 1 }) declare columnGap: number\r\n @property({ default: 24, step: 1 }) declare rowGap: number\r\n @property({ default: \"start\", kind: \"enum\", options: LINE_ALIGNS }) declare lastLineAlign: LineAlign\r\n @property({ default: 0, min: -1, max: 1, step: 0.05 }) declare rowOffset: number\r\n @property({ default: 0, min: -1, max: 1, step: 0.05 }) declare columnOffset: number\r\n\r\n constructor(props?: NodeConfig<RectangularGrid, RectangularGridProps>) {\r\n super(props)\r\n }\r\n\r\n /** Re-flow the items into `columns` columns, each moving to its new cell. */\r\n @command({ args: [{ key: \"columns\", min: 1, step: 1, default: 4 }, ...staggerArgs(TRANSITION_STAGGER)] })\r\n columnsTo(args: CommandArgs<{ columns: number } & StaggerArgs> & { duration: number }): Command<RectangularGridProps> {\r\n const columns = Math.max(1, Math.round(args.data?.columns ?? this.columns))\r\n return this._transitionTo({ columns }, args)\r\n }\r\n\r\n /** Animate the spacing between columns and rows. */\r\n @command({ args: [{ key: \"columnGap\", default: 48 }, { key: \"rowGap\", default: 48 }] })\r\n gapTo(args: CommandArgs<{ columnGap?: number; rowGap?: number }> & { duration: number }): Command<RectangularGridProps> {\r\n const data: Partial<RectangularGridProps> = {}\r\n if (args.data?.columnGap !== undefined) data.columnGap = args.data.columnGap\r\n if (args.data?.rowGap !== undefined) data.rowGap = args.data.rowGap\r\n return this.to({ data, duration: args.duration, easing: args.easing })\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 @command({ args: [{ key: \"cellWidth\", min: 0, default: 160 }, { key: \"cellHeight\", min: 0, default: 160 }] })\r\n cellSizeTo(args: CommandArgs<{ cellWidth?: number; cellHeight?: number }> & { duration: number }): Command<RectangularGridProps> {\r\n const sizes = this._itemSizes()\r\n const from = rectangularCell(this.arrangementFor(), sizes.length, sizes, contentBoxOf(this))\r\n const width = args.data?.cellWidth ?? from.width\r\n const height = args.data?.cellHeight ?? from.height\r\n return this.command<RectangularGridProps>((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 }), args.duration, args.easing ?? easeInOut(\"cubic\"))\r\n }\r\n\r\n /** Bring one row (from 0 at the top) forward and push the rest back. */\r\n @command({\r\n args: [\r\n { key: \"row\", min: 0, step: 1, default: 0 },\r\n { key: \"dim\", min: 0, max: 1, step: 0.05, default: 0.7 },\r\n { key: \"grow\", min: 0, max: 1, step: 0.05, default: 0.1 },\r\n ],\r\n })\r\n focusRow(args: CommandArgs<{ row?: number; dim?: number; grow?: number }> & { duration: number }): Command<ItemGridProps> {\r\n const slots = this._itemSlots()\r\n const row = Math.round(args.data?.row ?? 0)\r\n return this._focusOn((i) => slots[i]?.meta.kind === \"rectangular\" && slots[i].meta.row === row, slots.length, args)\r\n }\r\n\r\n /** Bring one column (from 0 at the left) forward and push the rest back. */\r\n @command({\r\n args: [\r\n { key: \"column\", min: 0, step: 1, default: 0 },\r\n { key: \"dim\", min: 0, max: 1, step: 0.05, default: 0.7 },\r\n { key: \"grow\", min: 0, max: 1, step: 0.05, default: 0.1 },\r\n ],\r\n })\r\n focusColumn(args: CommandArgs<{ column?: number; dim?: number; grow?: number }> & { duration: number }): Command<ItemGridProps> {\r\n const slots = this._itemSlots()\r\n const column = Math.round(args.data?.column ?? 0)\r\n return this._focusOn((i) => slots[i]?.meta.kind === \"rectangular\" && slots[i].meta.column === column, slots.length, args)\r\n }\r\n\r\n protected override arrangementFor(): RectangularArrangement {\r\n return {\r\n kind: \"rectangular\",\r\n columns: this.columns,\r\n fillDirection: this.fillDirection,\r\n cellMode: this.cellMode,\r\n cellWidth: this.cellWidth,\r\n cellHeight: this.cellHeight,\r\n columnGap: this.columnGap,\r\n rowGap: this.rowGap,\r\n lastLineAlign: this.lastLineAlign,\r\n rowOffset: this.rowOffset,\r\n columnOffset: this.columnOffset,\r\n }\r\n }\r\n\r\n /** A child set to fill takes its cell, where the cell is not simply the largest child. */\r\n protected override itemSpace(count: number, space: Size2D): Size2D {\r\n if (this.cellMode === \"fit\") return space\r\n return rectangularCell(this.arrangementFor(), count, [], space)\r\n }\r\n}\r\n", "import { command, node, property, type Command, type CommandArgs, type NodeConfig } from \"@motionscript/sdk\"\r\n\r\nimport {\r\n ItemGrid,\r\n normalizeOrder,\r\n RADIAL_DIRECTIONS,\r\n radialTurnToTop,\r\n type ItemGridProps,\r\n type RadialArrangement,\r\n type RadialDirection,\r\n} from \"../kit\"\r\n\r\nexport interface RadialGridProps extends ItemGridProps {\r\n radius: number\r\n startAngle: number\r\n sweep: number\r\n direction: RadialDirection\r\n rotateItems: boolean\r\n spinSpeed: number\r\n}\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\r\n * {@link turnTo} can bring any item to the top like a dial.\r\n */\r\n@node({\r\n key: \"radialGrid\",\r\n parentKey: \"node\",\r\n forkable: true,\r\n layout: {\r\n children: \"freeform\",\r\n acceptsChildren: true,\r\n defaultWidthMode: \"hug\",\r\n defaultHeightMode: \"hug\",\r\n },\r\n})\r\nexport class RadialGrid extends ItemGrid<RadialGridProps> {\r\n @property({ default: 200, min: 0, step: 1 }) declare radius: number\r\n @property({ default: 0, step: 1, unit: \"°\" }) declare startAngle: number\r\n @property({ default: 360, min: -360, max: 360, step: 1, unit: \"°\" }) declare sweep: number\r\n @property({ default: \"clockwise\", kind: \"enum\", options: RADIAL_DIRECTIONS }) declare direction: RadialDirection\r\n @property({ default: false }) declare rotateItems: boolean\r\n @property({ default: 0, step: 1, unit: \"°/s\" }) declare spinSpeed: number\r\n\r\n constructor(props?: NodeConfig<RadialGrid, RadialGridProps>) {\r\n super(props)\r\n }\r\n\r\n /** Orbit the items round the centre by `degrees` — `360` is one full turn. */\r\n @command({ args: [{ key: \"degrees\", step: 15, unit: \"°\", default: 360 }] })\r\n spin(args: CommandArgs<{ degrees?: number }> & { duration: number }): Command<RadialGridProps> {\r\n const degrees = args.data?.degrees ?? 360\r\n return this.to({ data: { startAngle: this.startAngle + degrees }, duration: args.duration, easing: args.easing })\r\n }\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 @command({ args: [{ key: \"item\", min: 0, step: 1, default: 0 }] })\r\n turnTo(args: CommandArgs<{ item?: number }> & { duration: number }): Command<RadialGridProps> {\r\n const count = this._itemCount()\r\n const slot = normalizeOrder(this.order, count).indexOf(Math.round(args.data?.item ?? 0))\r\n const turn = slot < 0 ? 0 : radialTurnToTop(this.arrangementFor(), count, slot)\r\n return this.to({ data: { startAngle: this.startAngle + turn }, duration: args.duration, easing: args.easing })\r\n }\r\n\r\n @command({ args: [{ key: \"radius\", min: 0, default: 280 }] })\r\n radiusTo(args: CommandArgs<{ radius: number }> & { duration: number }): Command<RadialGridProps> {\r\n return this.to({ data: { radius: args.data?.radius ?? this.radius }, duration: args.duration, easing: args.easing })\r\n }\r\n\r\n /** Open or close the arc like a fan — from `0` to `360` is a reveal of its own. */\r\n @command({ args: [{ key: \"sweep\", min: -360, max: 360, unit: \"°\", default: 360 }] })\r\n sweepTo(args: CommandArgs<{ sweep: number }> & { duration: number }): Command<RadialGridProps> {\r\n return this.to({ data: { sweep: args.data?.sweep ?? this.sweep }, duration: args.duration, easing: args.easing })\r\n }\r\n\r\n protected override arrangementFor(): RadialArrangement {\r\n return {\r\n kind: \"radial\",\r\n radius: this.radius,\r\n startAngle: this.startAngle,\r\n sweep: this.sweep,\r\n direction: this.direction,\r\n rotateItems: this.rotateItems,\r\n spinSpeed: this.spinSpeed,\r\n }\r\n }\r\n}\r\n", "import {\r\n command,\r\n node,\r\n Path,\r\n pathOps,\r\n PathShape,\r\n pathProperty,\r\n property,\r\n type Command,\r\n type CommandArgs,\r\n type NodeConfig,\r\n type PathData,\r\n type Size2D,\r\n} from \"@motionscript/sdk\"\r\n\r\nimport {\r\n findNode2D,\r\n frameIn,\r\n ItemGrid,\r\n PATH_SPACINGS,\r\n PATH_TEMPLATES,\r\n staggerArgs,\r\n TRANSITION_STAGGER,\r\n templatePath,\r\n type ItemGridProps,\r\n type PathArrangement,\r\n type PathPlacement,\r\n type PathSpacing,\r\n type PathTemplate,\r\n type StaggerArgs,\r\n} from \"../kit\"\r\n\r\n/** A template, or `custom` for the grid's own {@link PathGrid.path}. */\r\nexport const PATH_GRID_SHAPES = [...PATH_TEMPLATES, \"custom\"] as const\r\nexport type PathGridShape = (typeof PATH_GRID_SHAPES)[number]\r\n\r\nexport interface PathGridProps extends ItemGridProps {\r\n shape: PathGridShape\r\n path: PathData\r\n pathNode: string\r\n spacing: PathSpacing\r\n spacingDistance: number\r\n offset: number\r\n flowSpeed: number\r\n trimStart: number\r\n trimEnd: number\r\n alignToPath: boolean\r\n}\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\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 {@link offset} moves them along it — on\r\n * a closed path they come round again, which is a conveyor belt for free.\r\n */\r\n@node({\r\n key: \"pathGrid\",\r\n parentKey: \"node\",\r\n forkable: true,\r\n layout: {\r\n children: \"freeform\",\r\n acceptsChildren: true,\r\n defaultWidthMode: \"fixed\",\r\n defaultHeightMode: \"fixed\",\r\n defaultWidth: DEFAULT_SIZE.width,\r\n defaultHeight: DEFAULT_SIZE.height,\r\n },\r\n seed: { ...DEFAULT_SIZE },\r\n})\r\nexport class PathGrid extends ItemGrid<PathGridProps> {\r\n @property({ default: \"circle\", kind: \"enum\", options: PATH_GRID_SHAPES }) declare shape: PathGridShape\r\n /** Used when {@link shape} is `custom`: an SVG path, y-down as SVG writes one, centred on its own bounds. */\r\n @pathProperty() declare path: PathData\r\n /** A path node to follow instead, by id — the items track it wherever it goes. */\r\n @property({ default: \"\", kind: \"nodeRef\", nodeTypes: [\"path\"], animatable: false }) declare pathNode: string\r\n @property({ default: \"distribute\", kind: \"enum\", options: PATH_SPACINGS }) declare spacing: PathSpacing\r\n @property({ default: 80, min: 0, step: 1 }) declare spacingDistance: number\r\n /** Share of the path the items are moved along — `1` is once round. */\r\n @property({ default: 0, step: 0.01 }) declare offset: number\r\n /** Share of the path per second the items travel on their own. */\r\n @property({ default: 0, step: 0.01, unit: \"/s\" }) declare flowSpeed: number\r\n @property({ default: 0, min: 0, max: 1, step: 0.01 }) declare trimStart: number\r\n @property({ default: 1, min: 0, max: 1, step: 0.01 }) declare trimEnd: number\r\n @property({ default: true }) declare alignToPath: boolean\r\n\r\n constructor(props?: NodeConfig<PathGrid, PathGridProps>) {\r\n super(props)\r\n }\r\n\r\n /** Move the items along the path by `loops` — `1` is once round, and they keep their spacing. */\r\n @command({ args: [{ key: \"loops\", step: 0.25, default: 1 }] })\r\n flow(args: CommandArgs<{ loops?: number }> & { duration: number }): Command<PathGridProps> {\r\n const loops = args.data?.loops ?? 1\r\n return this.to({ data: { offset: this.offset + loops }, duration: args.duration, easing: args.easing })\r\n }\r\n\r\n /** Squeeze the items into part of the path, between two shares of its length. */\r\n @command({\r\n args: [\r\n { key: \"trimStart\", min: 0, max: 1, step: 0.01, default: 0.25 },\r\n { key: \"trimEnd\", min: 0, max: 1, step: 0.01, default: 0.75 },\r\n ],\r\n })\r\n trimTo(args: CommandArgs<{ trimStart?: number; trimEnd?: number }> & { duration: number }): Command<PathGridProps> {\r\n return this.to({\r\n data: { trimStart: args.data?.trimStart ?? this.trimStart, trimEnd: args.data?.trimEnd ?? this.trimEnd },\r\n duration: args.duration,\r\n easing: args.easing,\r\n })\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 the\r\n * new one; the path itself is not morphed.\r\n */\r\n @command({\r\n args: [\r\n { key: \"shape\", kind: \"enum\", options: PATH_GRID_SHAPES, default: \"heart\" },\r\n { key: \"pathNode\", kind: \"nodeRef\", nodeTypes: [\"path\"] },\r\n ...staggerArgs(TRANSITION_STAGGER),\r\n ],\r\n })\r\n setPath(args: CommandArgs<{ shape?: PathGridShape; pathNode?: string } & StaggerArgs> & { duration: number }): Command<PathGridProps> {\r\n const pathNode = args.data?.pathNode ?? \"\"\r\n const changes: Partial<PathGridProps> = pathNode ? { pathNode } : { shape: args.data?.shape ?? this.shape, pathNode: \"\" }\r\n return this._transitionTo(changes, args)\r\n }\r\n\r\n protected override arrangementFor(box: Size2D): PathArrangement {\r\n const { path, placement } = this._pathIn(box)\r\n return {\r\n kind: \"path\",\r\n path,\r\n placement,\r\n spacing: this.spacing,\r\n spacingDistance: this.spacingDistance,\r\n offset: this.offset,\r\n flowSpeed: this.flowSpeed,\r\n trimStart: this.trimStart,\r\n trimEnd: this.trimEnd,\r\n alignToPath: this.alignToPath,\r\n }\r\n }\r\n\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 protected override applyDefaultSize(props?: { readonly width?: unknown; readonly height?: unknown }): void {\r\n if (!props || props.width === undefined) this.applyProp(\"width\", DEFAULT_SIZE.width)\r\n if (!props || props.height === undefined) this.applyProp(\"height\", DEFAULT_SIZE.height)\r\n }\r\n\r\n private _linked: { data: PathData; width: number; height: number; path: PathData } | null = null\r\n\r\n /** The path the items follow, and where its coordinates land in this grid's frame. */\r\n private _pathIn(box: Size2D): { path: PathData; placement: PathPlacement } {\r\n const linked = this.pathNode ? findNode2D(this, this.pathNode) : null\r\n if (linked instanceof PathShape) {\r\n return { path: this._unitPath(linked), placement: { ...AT_ORIGIN, ...frameIn(this, linked) } }\r\n }\r\n if (linked instanceof Path && pathOps.bounds(linked.data)) {\r\n // A `Path` draws its data centred on the data's own bounds, at its own position.\r\n const bounds = pathOps.bounds(linked.data)!\r\n const frame = frameIn(this, linked)\r\n return {\r\n path: linked.data,\r\n placement: {\r\n originX: (bounds.minX + bounds.maxX) / 2,\r\n originY: (bounds.minY + bounds.maxY) / 2,\r\n ...frame,\r\n },\r\n }\r\n }\r\n if (this.shape === \"custom\") {\r\n const bounds = pathOps.bounds(this.path)\r\n if (bounds) {\r\n return {\r\n path: this.path,\r\n placement: {\r\n ...AT_ORIGIN,\r\n originX: (bounds.minX + bounds.maxX) / 2,\r\n originY: (bounds.minY + bounds.maxY) / 2,\r\n flipY: true,\r\n },\r\n }\r\n }\r\n }\r\n const template: PathTemplate = this.shape === \"custom\" ? \"circle\" : this.shape\r\n return { path: templatePath(template, box), placement: AT_ORIGIN }\r\n }\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\n private _unitPath(shape: PathShape): PathData {\r\n const { width, height } = shape.layoutBounds\r\n const cached = this._linked\r\n if (cached && cached.data === shape.data && cached.width === width && cached.height === height) return cached.path\r\n const path = pathOps.anchorCommands(pathOps.anchors(shape.data), (p) => ({ x: p.x * width, y: -p.y * height }))\r\n this._linked = { data: shape.data, width, height, path }\r\n return path\r\n }\r\n}\r\n", "import { command, node, property, type Command, type CommandArgs, type NodeConfig } 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 ItemGridProps,\r\n type SphereArrangement,\r\n type SphereAxis,\r\n type SphereFacing,\r\n} from \"../kit\"\r\n\r\nexport interface SphereGridProps extends ItemGridProps {\r\n radius: number\r\n yaw: number\r\n pitch: number\r\n roll: number\r\n facing: SphereFacing\r\n focalLength: number\r\n depthFade: number\r\n cullBackfaces: boolean\r\n spinSpeed: number\r\n}\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. {@link turnTo} brings any item\r\n * round to the front.\r\n */\r\n@node({\r\n key: \"sphereGrid\",\r\n parentKey: \"node\",\r\n forkable: true,\r\n layout: {\r\n children: \"freeform\",\r\n acceptsChildren: true,\r\n defaultWidthMode: \"hug\",\r\n defaultHeightMode: \"hug\",\r\n },\r\n})\r\nexport class SphereGrid extends ItemGrid<SphereGridProps> {\r\n @property({ default: 220, min: 0, step: 1 }) declare radius: number\r\n @property({ default: 0, step: 1, unit: \"°\" }) declare yaw: number\r\n @property({ default: 0, step: 1, unit: \"°\" }) declare pitch: number\r\n @property({ default: 0, step: 1, unit: \"°\" }) declare roll: number\r\n @property({ default: \"outward\", kind: \"enum\", options: SPHERE_FACINGS }) declare facing: SphereFacing\r\n @property({ default: 900, min: 100, step: 10 }) declare focalLength: number\r\n @property({ default: 0.5, min: 0, max: 1, step: 0.05 }) declare depthFade: number\r\n @property({ default: false }) declare cullBackfaces: boolean\r\n @property({ default: 0, step: 1, unit: \"°/s\" }) declare spinSpeed: number\r\n\r\n constructor(props?: NodeConfig<SphereGrid, SphereGridProps>) {\r\n super(props)\r\n }\r\n\r\n /** Turn the sphere about an axis by `degrees` — `y` spins it like a globe. */\r\n @command({\r\n args: [\r\n { key: \"axis\", kind: \"enum\", options: SPHERE_AXES, default: \"y\" },\r\n { key: \"degrees\", step: 15, unit: \"°\", default: 360 },\r\n ],\r\n })\r\n spin(args: CommandArgs<{ axis?: SphereAxis; degrees?: number }> & { duration: number }): Command<SphereGridProps> {\r\n const key = AXIS_PROP[args.data?.axis ?? \"y\"] ?? \"yaw\"\r\n const degrees = args.data?.degrees ?? 360\r\n return this.to({ data: { [key]: this[key] + degrees }, duration: args.duration, easing: args.easing })\r\n }\r\n\r\n /** Turn the sphere to a set orientation. */\r\n @command({\r\n args: [\r\n { key: \"yaw\", unit: \"°\", default: 45 },\r\n { key: \"pitch\", unit: \"°\", default: 20 },\r\n { key: \"roll\", unit: \"°\", default: 0 },\r\n ],\r\n })\r\n orientTo(args: CommandArgs<{ yaw?: number; pitch?: number; roll?: number }> & { duration: number }): Command<SphereGridProps> {\r\n return this.to({\r\n data: { yaw: args.data?.yaw ?? this.yaw, pitch: args.data?.pitch ?? this.pitch, roll: args.data?.roll ?? this.roll },\r\n duration: args.duration,\r\n easing: args.easing,\r\n })\r\n }\r\n\r\n /** Turn the sphere the shorter way until an item (by its place in the layers) faces the viewer. */\r\n @command({ args: [{ key: \"item\", min: 0, step: 1, default: 0 }] })\r\n turnTo(args: CommandArgs<{ item?: number }> & { duration: number }): Command<SphereGridProps> {\r\n const count = this._itemCount()\r\n const slot = normalizeOrder(this.order, count).indexOf(Math.round(args.data?.item ?? 0))\r\n if (slot < 0) return this.to({ data: {}, duration: args.duration })\r\n const facing = sphereFaceForward(count, slot)\r\n // The yaw the clock has added is part of where the item is now.\r\n const spun = this.spinSpeed * this.time.total\r\n return this.to({\r\n data: {\r\n yaw: this.yaw + wrapDegrees(facing.yaw - (this.yaw + spun)),\r\n pitch: this.pitch + wrapDegrees(facing.pitch - this.pitch),\r\n roll: 0,\r\n },\r\n duration: args.duration,\r\n easing: args.easing,\r\n })\r\n }\r\n\r\n @command({ args: [{ key: \"radius\", min: 0, default: 300 }] })\r\n radiusTo(args: CommandArgs<{ radius: number }> & { duration: number }): Command<SphereGridProps> {\r\n return this.to({ data: { radius: args.data?.radius ?? this.radius }, duration: args.duration, easing: args.easing })\r\n }\r\n\r\n /** Dolly the camera: a shorter focal length exaggerates the depth, a longer one flattens it. */\r\n @command({ args: [{ key: \"focalLength\", min: 100, default: 600 }] })\r\n focalLengthTo(args: CommandArgs<{ focalLength: number }> & { duration: number }): Command<SphereGridProps> {\r\n return this.to({\r\n data: { focalLength: args.data?.focalLength ?? this.focalLength },\r\n duration: args.duration,\r\n easing: args.easing,\r\n })\r\n }\r\n\r\n protected override arrangementFor(): SphereArrangement {\r\n return {\r\n kind: \"sphere\",\r\n radius: this.radius,\r\n yaw: this.yaw,\r\n pitch: this.pitch,\r\n roll: this.roll,\r\n facing: this.facing,\r\n focalLength: this.focalLength,\r\n depthFade: this.depthFade,\r\n cullBackfaces: this.cullBackfaces,\r\n spinSpeed: this.spinSpeed,\r\n }\r\n }\r\n}\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 class's `@node()`\r\n * key. Listing class **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\nexport const NODES = [RectangularGrid, RadialGrid, PathGrid, SphereGrid]\r\n"],
5
- "mappings": "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",
6
- "names": ["command", "easeInOut", "node", "property", "RectangularGrid", "ItemGrid", "props", "args", "columns", "data", "sizes", "from", "rectangularCell", "contentBoxOf", "width", "height", "t", "easeInOut", "slots", "row", "i", "column", "count", "space", "__decorate", "property", "FILL_DIRECTIONS", "CELL_MODES", "LINE_ALIGNS", "command", "staggerArgs", "TRANSITION_STAGGER", "node", "command", "node", "property", "RadialGrid", "ItemGrid", "props", "args", "degrees", "count", "slot", "normalizeOrder", "turn", "radialTurnToTop", "__decorate", "property", "RADIAL_DIRECTIONS", "command", "node", "command", "node", "Path", "pathOps", "PathShape", "pathProperty", "property", "PATH_GRID_SHAPES", "PATH_TEMPLATES", "AT_ORIGIN", "DEFAULT_SIZE", "PathGrid", "ItemGrid", "props", "args", "loops", "pathNode", "changes", "box", "path", "placement", "linked", "findNode2D", "PathShape", "frameIn", "Path", "pathOps", "bounds", "frame", "template", "templatePath", "shape", "width", "height", "cached", "p", "__decorate", "property", "pathProperty", "PATH_SPACINGS", "command", "staggerArgs", "TRANSITION_STAGGER", "node", "command", "node", "property", "AXIS_PROP", "SphereGrid", "ItemGrid", "props", "args", "key", "degrees", "count", "slot", "normalizeOrder", "facing", "sphereFaceForward", "spun", "wrapDegrees", "__decorate", "property", "SPHERE_FACINGS", "command", "SPHERE_AXES", "node", "NODES", "RectangularGrid", "RadialGrid", "PathGrid", "SphereGrid"]
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"],
5
+ "mappings": "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",
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
  }
@@ -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-XDUDKWM7.js";export{m as CELL_MODES,l as FILL_DIRECTIONS,O as ITEM_GRID_TYPES,Q 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,P as TRANSITION_STAGGER,I as WAVE_STYLES,J as applyItemEffects,b as blendSlot,R 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,N as staggerArgs,G as staggerProgress,F as staggerRanks,y as templatePath,k as wrapDegrees};
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-J62D7EFZ.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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@motionscript/grids",
3
- "version": "0.1.0-alpha.5",
3
+ "version": "0.1.0-alpha.6",
4
4
  "exports": {
5
5
  ".": "dist/browser/index.js",
6
6
  "./kit": "dist/browser/kit.js"
package/dist/engine.d.ts CHANGED
@@ -4,10 +4,10 @@
4
4
  *
5
5
  * `ms add` writes 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
- * dependency. That is not a size decision. The engine keys prop machinery to
8
- * class identity — `@property` installs against the class it was applied with —
9
- * so a second copy of `ItemGrid` is a second class answering to one name, and
10
- * a morph from one grid to another only finds grids of the class it knows.
7
+ * dependency. That is not a size decision. `ItemGrid` keeps the register of
8
+ * grids a morph looks another grid's arrangement up in, so a second copy of it
9
+ * would be a second register, and a morph from one grid to another would only
10
+ * find the grids its own copy was told of.
11
11
  */
12
12
  export * from "./kit/index.js";
13
13
  //# sourceMappingURL=engine.d.ts.map
package/dist/engine.js CHANGED
@@ -4,10 +4,10 @@
4
4
  *
5
5
  * `ms add` writes 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
- * dependency. That is not a size decision. The engine keys prop machinery to
8
- * class identity — `@property` installs against the class it was applied with —
9
- * so a second copy of `ItemGrid` is a second class answering to one name, and
10
- * a morph from one grid to another only finds grids of the class it knows.
7
+ * dependency. That is not a size decision. `ItemGrid` keeps the register of
8
+ * grids a morph looks another grid's arrangement up in, so a second copy of it
9
+ * would be a second register, and a morph from one grid to another would only
10
+ * find the grids its own copy was told of.
11
11
  */
12
12
  export * from "./kit/index.js";
13
13
  //# sourceMappingURL=engine.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,cAAc,OAAO,CAAA","sourcesContent":["/**\r\n * The item grid **kit**: what the four grids share, and what a copied one does\r\n * not copy.\r\n *\r\n * `ms add` writes a grid's own files into your project and rewrites its reach for\r\n * these to `@motionscript/grids`, so the shared parts stay a real\r\n * dependency. That is not a size decision. The engine keys prop machinery to\r\n * class identity — `@property` installs against the class it was applied with —\r\n * so a second copy of `ItemGrid` is a second class answering to one name, and\r\n * a morph from one grid to another only finds grids of the class it knows.\r\n */\r\nexport * from \"./kit\"\r\n"]}
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,cAAc,OAAO,CAAA","sourcesContent":["/**\r\n * The item grid **kit**: what the four grids share, and what a copied one does\r\n * not copy.\r\n *\r\n * `ms add` writes a grid's own files into your project and rewrites its reach for\r\n * these to `@motionscript/grids`, so the shared parts stay a real\r\n * dependency. That is not a size decision. `ItemGrid` keeps the register of\r\n * grids a morph looks another grid's arrangement up in, so a second copy of it\r\n * would be a second register, and a morph from one grid to another would only\r\n * find the grids its own copy was told of.\r\n */\r\nexport * from \"./kit\"\r\n"]}
@@ -3,5 +3,7 @@ export * from "./stagger.js";
3
3
  export * from "./item-effects.js";
4
4
  export * from "./order.js";
5
5
  export * from "./random.js";
6
- export * from "./item-grid.js";
6
+ export * as ItemGrid from "./item-grid.js";
7
+ export { contentBoxOf, ITEM_GRID_TYPES, staggerArgs, TRANSITION_STAGGER, type GridSnapshot, type GridTransition, type StaggerArgs, } from "./item-grid.js";
8
+ export { findNode2D, frameIn } from "@motionscript/sdk";
7
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","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,cAAc,aAAa,CAAA"}
1
+ {"version":3,"file":"index.d.ts","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,EAClB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,WAAW,GACjB,MAAM,aAAa,CAAA;AAGpB,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA"}
package/dist/kit/index.js CHANGED
@@ -3,5 +3,8 @@ export * from "./stagger.js";
3
3
  export * from "./item-effects.js";
4
4
  export * from "./order.js";
5
5
  export * from "./random.js";
6
- export * from "./item-grid.js";
6
+ export * as ItemGrid from "./item-grid.js";
7
+ export { contentBoxOf, ITEM_GRID_TYPES, staggerArgs, TRANSITION_STAGGER, } from "./item-grid.js";
8
+ // Once this kit's own; kept on its barrel for whoever imports them from it.
9
+ export { findNode2D, frameIn } from "@motionscript/sdk";
7
10
  //# sourceMappingURL=index.js.map
@@ -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,cAAc,aAAa,CAAA","sourcesContent":["export * from \"./slots\"\r\nexport * from \"./stagger\"\r\nexport * from \"./item-effects\"\r\nexport * from \"./order\"\r\nexport * from \"./random\"\r\nexport * from \"./item-grid\"\r\n"]}
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\"\r\nexport * from \"./stagger\"\r\nexport * from \"./item-effects\"\r\nexport * from \"./order\"\r\nexport * from \"./random\"\r\nexport * as ItemGrid from \"./item-grid\"\r\nexport {\r\n contentBoxOf,\r\n ITEM_GRID_TYPES,\r\n staggerArgs,\r\n TRANSITION_STAGGER,\r\n type GridSnapshot,\r\n type GridTransition,\r\n type StaggerArgs,\r\n} from \"./item-grid\"\r\n\r\n// Once this kit's own; kept on its barrel for whoever imports them from it.\r\nexport { findNode2D, frameIn } from \"@motionscript/sdk\"\r\n"]}