@motionscript/grids 0.1.0-alpha.8 → 0.1.0
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 +6 -0
- package/LICENSE +201 -201
- package/NOTICE +49 -49
- 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 +4 -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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path-templates.js","sourceRoot":"","sources":["../../../src/kit/slots/path-templates.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PathCommand, Size2D } from \"@motionscript/sdk\"\r\n\r\n/**\r\n * The shapes a path grid can follow without a path of its own, each drawn to\r\n * fill the grid's box. Centred and y-up, like every path in the library; the\r\n * closed ones run clockwise, so an item flowing along any of them travels the\r\n * same way round.\r\n */\r\nexport const PATH_TEMPLATES = [\r\n \"circle\",\r\n \"square\",\r\n \"star\",\r\n \"heart\",\r\n \"infinity\",\r\n \"wave\",\r\n \"spiral\",\r\n \"arc\",\r\n \"line\",\r\n] as const\r\nexport type PathTemplate = (typeof PATH_TEMPLATES)[number]\r\n\r\n/** What a template is drawn at when the grid has no box to fill. */\r\nconst FALLBACK = 400\r\n\r\nconst DRAWN = new Map<string, PathCommand[]>()\r\nconst DRAWN_CACHE = 64\r\n\r\n/**\r\n * `template` drawn to fill `box`. The same template at the same size is the\r\n * same array, which is what lets the path's measurement be kept between frames.\r\n */\r\nexport function templatePath(template: PathTemplate, box: Size2D): PathCommand[] {\r\n const key = `${template}:${Math.round(box.width * 100)}:${Math.round(box.height * 100)}`\r\n const hit = DRAWN.get(key)\r\n if (hit) return hit\r\n const path = drawTemplate(template, box)\r\n if (DRAWN.size >= DRAWN_CACHE) DRAWN.delete(DRAWN.keys().next().value!)\r\n DRAWN.set(key, path)\r\n return path\r\n}\r\n\r\nfunction drawTemplate(template: PathTemplate, box: Size2D): PathCommand[] {\r\n const w = box.width > 0 ? box.width : FALLBACK\r\n const h = box.height > 0 ? box.height : FALLBACK\r\n const rx = w / 2\r\n const ry = h / 2\r\n switch (template) {\r\n case \"square\":\r\n return closed([\r\n [-rx, ry], [rx, ry], [rx, -ry], [-rx, -ry],\r\n ])\r\n case \"star\": {\r\n const points: [number, number][] = []\r\n for (let i = 0; i < 10; i++) {\r\n const angle = (i * Math.PI) / 5\r\n const r = i % 2 === 0 ? 1 : 0.45\r\n points.push([Math.sin(angle) * rx * r, Math.cos(angle) * ry * r])\r\n }\r\n return closed(points)\r\n }\r\n case \"heart\":\r\n return closed(sample(96, (t) => {\r\n // The classic heart curve, from its top notch, clockwise.\r\n const a = t * 2 * Math.PI\r\n const x = 16 * Math.sin(a) ** 3\r\n const y = 13 * Math.cos(a) - 5 * Math.cos(2 * a) - 2 * Math.cos(3 * a) - Math.cos(4 * a)\r\n return [(x / 17) * rx, ((y + 2.5) / 15.5) * ry]\r\n }).slice(0, -1))\r\n case \"infinity\":\r\n return closed(sample(96, (t) => {\r\n const a = t * 2 * Math.PI\r\n const d = 1 + Math.sin(a) ** 2\r\n return [(Math.cos(a) / d) * rx, ((Math.sin(a) * Math.cos(a)) / d) * ry * 2]\r\n }).slice(0, -1))\r\n case \"wave\":\r\n return open(sample(96, (t) => [(-1 + 2 * t) * rx, Math.sin(t * 4 * Math.PI) * ry * 0.6]))\r\n case \"spiral\":\r\n return open(sample(160, (t) => {\r\n const a = t * 3 * 2 * Math.PI\r\n const r = 0.08 + 0.92 * t\r\n return [Math.sin(a) * rx * r, Math.cos(a) * ry * r]\r\n }))\r\n case \"arc\":\r\n return open(sample(64, (t) => {\r\n const a = -Math.PI / 2 + t * Math.PI\r\n return [Math.sin(a) * rx, -ry + Math.cos(a) * h]\r\n }))\r\n case \"line\":\r\n return [{ type: \"M\", x: -rx, y: 0 }, { type: \"L\", x: rx, y: 0 }]\r\n default:\r\n return ellipse(rx, ry)\r\n }\r\n}\r\n\r\n/** Four quarter-arcs from the top, clockwise. */\r\nfunction ellipse(rx: number, ry: number): PathCommand[] {\r\n const k = 0.5522847498\r\n return [\r\n { type: \"M\", x: 0, y: ry },\r\n { type: \"C\", x1: k * rx, y1: ry, x2: rx, y2: k * ry, x: rx, y: 0 },\r\n { type: \"C\", x1: rx, y1: -k * ry, x2: k * rx, y2: -ry, x: 0, y: -ry },\r\n { type: \"C\", x1: -k * rx, y1: -ry, x2: -rx, y2: -k * ry, x: -rx, y: 0 },\r\n { type: \"C\", x1: -rx, y1: k * ry, x2: -k * rx, y2: ry, x: 0, y: ry },\r\n { type: \"Z\" },\r\n ]\r\n}\r\n\r\nfunction sample(steps: number, at: (t: number) => [number, number]): [number, number][] {\r\n const points: [number, number][] = []\r\n for (let i = 0; i <= steps; i++) points.push(at(i / steps))\r\n return points\r\n}\r\n\r\nfunction open(points: [number, number][]): PathCommand[] {\r\n return points.map(([x, y], i) => (i === 0 ? { type: \"M\", x, y } : { type: \"L\", x, y }))\r\n}\r\n\r\nfunction closed(points: [number, number][]): PathCommand[] {\r\n return [...open(points), { type: \"Z\" }]\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"path-templates.js","sourceRoot":"","sources":["../../../src/kit/slots/path-templates.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PathCommand, Size2D } from \"@motionscript/sdk\"\n\n/**\n * The shapes a path grid can follow without a path of its own, each drawn to\n * fill the grid's box. Centred and y-up, like every path in the library; the\n * closed ones run clockwise, so an item flowing along any of them travels the\n * same way round.\n */\nexport const PATH_TEMPLATES = [\n \"circle\",\n \"square\",\n \"star\",\n \"heart\",\n \"infinity\",\n \"wave\",\n \"spiral\",\n \"arc\",\n \"line\",\n] as const\nexport type PathTemplate = (typeof PATH_TEMPLATES)[number]\n\n/** What a template is drawn at when the grid has no box to fill. */\nconst FALLBACK = 400\n\nconst DRAWN = new Map<string, PathCommand[]>()\nconst DRAWN_CACHE = 64\n\n/**\n * `template` drawn to fill `box`. The same template at the same size is the\n * same array, which is what lets the path's measurement be kept between frames.\n */\nexport function templatePath(template: PathTemplate, box: Size2D): PathCommand[] {\n const key = `${template}:${Math.round(box.width * 100)}:${Math.round(box.height * 100)}`\n const hit = DRAWN.get(key)\n if (hit) return hit\n const path = drawTemplate(template, box)\n if (DRAWN.size >= DRAWN_CACHE) DRAWN.delete(DRAWN.keys().next().value!)\n DRAWN.set(key, path)\n return path\n}\n\nfunction drawTemplate(template: PathTemplate, box: Size2D): PathCommand[] {\n const w = box.width > 0 ? box.width : FALLBACK\n const h = box.height > 0 ? box.height : FALLBACK\n const rx = w / 2\n const ry = h / 2\n switch (template) {\n case \"square\":\n return closed([\n [-rx, ry], [rx, ry], [rx, -ry], [-rx, -ry],\n ])\n case \"star\": {\n const points: [number, number][] = []\n for (let i = 0; i < 10; i++) {\n const angle = (i * Math.PI) / 5\n const r = i % 2 === 0 ? 1 : 0.45\n points.push([Math.sin(angle) * rx * r, Math.cos(angle) * ry * r])\n }\n return closed(points)\n }\n case \"heart\":\n return closed(sample(96, (t) => {\n // The classic heart curve, from its top notch, clockwise.\n const a = t * 2 * Math.PI\n const x = 16 * Math.sin(a) ** 3\n const y = 13 * Math.cos(a) - 5 * Math.cos(2 * a) - 2 * Math.cos(3 * a) - Math.cos(4 * a)\n return [(x / 17) * rx, ((y + 2.5) / 15.5) * ry]\n }).slice(0, -1))\n case \"infinity\":\n return closed(sample(96, (t) => {\n const a = t * 2 * Math.PI\n const d = 1 + Math.sin(a) ** 2\n return [(Math.cos(a) / d) * rx, ((Math.sin(a) * Math.cos(a)) / d) * ry * 2]\n }).slice(0, -1))\n case \"wave\":\n return open(sample(96, (t) => [(-1 + 2 * t) * rx, Math.sin(t * 4 * Math.PI) * ry * 0.6]))\n case \"spiral\":\n return open(sample(160, (t) => {\n const a = t * 3 * 2 * Math.PI\n const r = 0.08 + 0.92 * t\n return [Math.sin(a) * rx * r, Math.cos(a) * ry * r]\n }))\n case \"arc\":\n return open(sample(64, (t) => {\n const a = -Math.PI / 2 + t * Math.PI\n return [Math.sin(a) * rx, -ry + Math.cos(a) * h]\n }))\n case \"line\":\n return [{ type: \"M\", x: -rx, y: 0 }, { type: \"L\", x: rx, y: 0 }]\n default:\n return ellipse(rx, ry)\n }\n}\n\n/** Four quarter-arcs from the top, clockwise. */\nfunction ellipse(rx: number, ry: number): PathCommand[] {\n const k = 0.5522847498\n return [\n { type: \"M\", x: 0, y: ry },\n { type: \"C\", x1: k * rx, y1: ry, x2: rx, y2: k * ry, x: rx, y: 0 },\n { type: \"C\", x1: rx, y1: -k * ry, x2: k * rx, y2: -ry, x: 0, y: -ry },\n { type: \"C\", x1: -k * rx, y1: -ry, x2: -rx, y2: -k * ry, x: -rx, y: 0 },\n { type: \"C\", x1: -rx, y1: k * ry, x2: -k * rx, y2: ry, x: 0, y: ry },\n { type: \"Z\" },\n ]\n}\n\nfunction sample(steps: number, at: (t: number) => [number, number]): [number, number][] {\n const points: [number, number][] = []\n for (let i = 0; i <= steps; i++) points.push(at(i / steps))\n return points\n}\n\nfunction open(points: [number, number][]): PathCommand[] {\n return points.map(([x, y], i) => (i === 0 ? { type: \"M\", x, y } : { type: \"L\", x, y }))\n}\n\nfunction closed(points: [number, number][]): PathCommand[] {\n return [...open(points), { type: \"Z\" }]\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path.js","sourceRoot":"","sources":["../../../src/kit/slots/path.ts"],"names":[],"mappings":"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","sourcesContent":["import { pathOps, type PathData, type PathSampler } from \"@motionscript/sdk\"\
|
|
1
|
+
{"version":3,"file":"path.js","sourceRoot":"","sources":["../../../src/kit/slots/path.ts"],"names":[],"mappings":"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","sourcesContent":["import { pathOps, type PathData, type PathSampler } from \"@motionscript/sdk\"\n\nimport { slot, type Slot, type SlotInput } from \"./slot\"\n\n/** `distribute` spreads the items over the path; `fixed` sets them a distance apart. */\nexport const PATH_SPACINGS = [\"distribute\", \"fixed\"] as const\nexport type PathSpacing = (typeof PATH_SPACINGS)[number]\n\n/** How path coordinates land in the grid's frame: `origin` of the path goes to `(x, y)`, turned and scaled. */\nexport interface PathPlacement {\n originX: number\n originY: number\n /** The path is y-down, as SVG and the editor write one. */\n flipY?: boolean\n x: number\n y: number\n /** Degrees clockwise. */\n rotation: number\n scale: number\n}\n\nexport interface PathArrangement {\n kind: \"path\"\n /** y-up, like every path in the library, unless its placement says otherwise. */\n path: PathData\n placement: PathPlacement\n spacing: PathSpacing\n /** Pixels between items when `spacing` is `fixed`. */\n spacingDistance: number\n /** Share of the path the items are moved along; wraps on a closed path. */\n offset: number\n /** Share of the path per second the items travel on their own. */\n flowSpeed: number\n trimStart: number\n trimEnd: number\n /** Turn each item to follow the path's direction. */\n alignToPath: boolean\n}\n\nconst SAMPLERS = new Map<PathData, { sampler: PathSampler; closed: boolean }>()\nconst SAMPLER_CACHE = 32\n\n/** A sampler for `path`, kept while the same value keeps arriving — a path is re-read every frame. */\nfunction measured(path: PathData): { sampler: PathSampler; closed: boolean } {\n const hit = SAMPLERS.get(path)\n if (hit) return hit\n const contours = pathOps.contours(path)\n const entry = {\n sampler: pathOps.sampler(path),\n closed: contours.length === 1 && contours[0].closed,\n }\n if (SAMPLERS.size >= SAMPLER_CACHE) SAMPLERS.delete(SAMPLERS.keys().next().value!)\n SAMPLERS.set(path, entry)\n return entry\n}\n\n/**\n * Items at even arc-length steps — by distance along the curve rather than the\n * path's own parameter, which bunches them up wherever a curve is tight.\n *\n * On a closed path used whole, `n` items take `n` equal steps and `offset`\n * wraps round, so an animated offset is a loop. Anywhere else the ends are\n * ends: `n` items take `n - 1` steps so both get one, and an item moved past\n * either is hidden rather than piled on it.\n */\nexport function pathSlots(arrangement: PathArrangement, input: SlotInput): Slot[] {\n const { count } = input\n if (count === 0) return []\n const { sampler, closed } = measured(arrangement.path)\n const length = sampler.length\n const a = clamp01(Math.min(arrangement.trimStart, arrangement.trimEnd))\n const b = clamp01(Math.max(arrangement.trimStart, arrangement.trimEnd))\n const start = a * length\n const span = (b - a) * length\n const loops = closed && a === 0 && b === 1\n const offset = arrangement.offset + arrangement.flowSpeed * input.time\n const place = arrangement.placement\n const rad = (place.rotation * Math.PI) / 180\n const cos = Math.cos(rad)\n const sin = Math.sin(rad)\n\n const slots: Slot[] = []\n for (let k = 0; k < count; k++) {\n let u: number\n if (arrangement.spacing === \"fixed\" && span > 0) {\n u = offset + (k * arrangement.spacingDistance) / span\n } else if (loops) {\n u = offset + k / count\n } else {\n u = offset + (count === 1 ? 0.5 : k / (count - 1))\n }\n let visible = true\n if (loops) u = u - Math.floor(u)\n else if (u < -1e-9 || u > 1 + 1e-9) visible = false\n const at = sampler.frameAt(start + clamp01(u) * span)\n if (!at) {\n const s = slot(0, 0, { kind: \"path\", t: clamp01(u) })\n s.opacity = 0\n slots.push(s)\n continue\n }\n // Into the grid's frame: about the path's origin, turned clockwise (y-up).\n const flip = place.flipY ? -1 : 1\n const px = (at.x - place.originX) * place.scale\n const py = (at.y - place.originY) * place.scale * flip\n const s = slot(\n place.x + px * cos + py * sin,\n place.y - px * sin + py * cos,\n { kind: \"path\", t: clamp01(u) },\n )\n if (arrangement.alignToPath) s.rotation = (-Math.atan2(at.ty * flip, at.tx) * 180) / Math.PI + place.rotation\n if (!visible) s.opacity = 0\n slots.push(s)\n }\n return slots\n}\n\nfunction clamp01(v: number): number {\n return v < 0 ? 0 : v > 1 ? 1 : v\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"radial.js","sourceRoot":"","sources":["../../../src/kit/slots/radial.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAA6B,MAAM,QAAQ,CAAA;AAExD,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,WAAW,EAAE,kBAAkB,CAAU,CAAA;AAiB3E;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,WAA8B,EAAE,KAAa,EAAE,IAAY;IACtF,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAA;IAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAA;IACvD,MAAM,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,OAAO,CAAC,CAAA;IAC3D,MAAM,IAAI,GAAG,WAAW,CAAC,SAAS,KAAK,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAClE,MAAM,KAAK,GAAG,WAAW,CAAC,UAAU,GAAG,WAAW,CAAC,SAAS,GAAG,IAAI,CAAA;IACnE,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE;QAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,CAAA;IACpE,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,WAA8B,EAAE,KAAgB;IAC1E,MAAM,MAAM,GAAG,YAAY,CAAC,WAAW,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;IACjE,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IAC5B,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC1B,MAAM,GAAG,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAA;QACnC,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YACrF,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC;SAC/B,CAAC,CAAA;QACF,IAAI,WAAW,CAAC,WAAW;YAAE,CAAC,CAAC,QAAQ,GAAG,KAAK,CAAA;QAC/C,OAAO,CAAC,CAAA;IACV,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,eAAe,CAAC,WAA8B,EAAE,KAAa,EAAE,KAAa;IAC1F,MAAM,KAAK,GAAG,YAAY,CAAC,EAAE,GAAG,WAAW,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,UAAU,CAAA;IACvG,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;AAC5B,CAAC;AAED,2CAA2C;AAC3C,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAA;IAC7C,OAAO,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAA;AAChD,CAAC","sourcesContent":["import { slot, type Slot, type SlotInput } from \"./slot\"\
|
|
1
|
+
{"version":3,"file":"radial.js","sourceRoot":"","sources":["../../../src/kit/slots/radial.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAA6B,MAAM,QAAQ,CAAA;AAExD,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,WAAW,EAAE,kBAAkB,CAAU,CAAA;AAiB3E;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,WAA8B,EAAE,KAAa,EAAE,IAAY;IACtF,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAA;IAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAA;IACvD,MAAM,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,OAAO,CAAC,CAAA;IAC3D,MAAM,IAAI,GAAG,WAAW,CAAC,SAAS,KAAK,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAClE,MAAM,KAAK,GAAG,WAAW,CAAC,UAAU,GAAG,WAAW,CAAC,SAAS,GAAG,IAAI,CAAA;IACnE,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE;QAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,CAAA;IACpE,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,WAA8B,EAAE,KAAgB;IAC1E,MAAM,MAAM,GAAG,YAAY,CAAC,WAAW,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;IACjE,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IAC5B,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC1B,MAAM,GAAG,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAA;QACnC,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YACrF,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC;SAC/B,CAAC,CAAA;QACF,IAAI,WAAW,CAAC,WAAW;YAAE,CAAC,CAAC,QAAQ,GAAG,KAAK,CAAA;QAC/C,OAAO,CAAC,CAAA;IACV,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,eAAe,CAAC,WAA8B,EAAE,KAAa,EAAE,KAAa;IAC1F,MAAM,KAAK,GAAG,YAAY,CAAC,EAAE,GAAG,WAAW,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,UAAU,CAAA;IACvG,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;AAC5B,CAAC;AAED,2CAA2C;AAC3C,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAA;IAC7C,OAAO,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAA;AAChD,CAAC","sourcesContent":["import { slot, type Slot, type SlotInput } from \"./slot\"\n\nexport const RADIAL_DIRECTIONS = [\"clockwise\", \"counterclockwise\"] as const\nexport type RadialDirection = (typeof RADIAL_DIRECTIONS)[number]\n\nexport interface RadialArrangement {\n kind: \"radial\"\n radius: number\n /** Where the first item sits, degrees clockwise from twelve o'clock. */\n startAngle: number\n /** How much of the circle the items span, degrees. */\n sweep: number\n direction: RadialDirection\n /** Turn each item so its top faces away from the centre. */\n rotateItems: boolean\n /** Degrees per second the ring turns on its own. */\n spinSpeed: number\n}\n\n/**\n * The angle of each of `count` slots, clockwise from twelve o'clock. A full\n * circle divides by the count, so the last item does not land on the first; an\n * arc divides by one less, so both ends get an item. In between the divisor\n * slides from one to the other as the arc closes — steeply, so an arc is an arc\n * until it is nearly whole, and a sweep animated to 360 lands without a jump.\n */\nexport function radialAngles(arrangement: RadialArrangement, count: number, time: number): number[] {\n const sweep = arrangement.sweep\n const closing = Math.min(1, Math.abs(sweep) / 360) ** 8\n const step = count <= 1 ? 0 : sweep / (count - 1 + closing)\n const sign = arrangement.direction === \"counterclockwise\" ? -1 : 1\n const start = arrangement.startAngle + arrangement.spinSpeed * time\n const angles: number[] = []\n for (let k = 0; k < count; k++) angles.push(start + sign * k * step)\n return angles\n}\n\nexport function radialSlots(arrangement: RadialArrangement, input: SlotInput): Slot[] {\n const angles = radialAngles(arrangement, input.count, input.time)\n const start = angles[0] ?? 0\n return angles.map((angle) => {\n const rad = (angle * Math.PI) / 180\n const s = slot(arrangement.radius * Math.sin(rad), arrangement.radius * Math.cos(rad), {\n kind: \"radial\",\n angle: Math.abs(angle - start),\n })\n if (arrangement.rotateItems) s.rotation = angle\n return s\n })\n}\n\n/** The change to `startAngle` that brings slot `index` to twelve o'clock by the shorter way round. */\nexport function radialTurnToTop(arrangement: RadialArrangement, count: number, index: number): number {\n const angle = radialAngles({ ...arrangement, spinSpeed: 0 }, count, 0)[index] ?? arrangement.startAngle\n return -wrapDegrees(angle)\n}\n\n/** `degrees` folded into `(-180, 180]`. */\nexport function wrapDegrees(degrees: number): number {\n const wrapped = ((degrees % 360) + 360) % 360\n return wrapped > 180 ? wrapped - 360 : wrapped\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rectangular.js","sourceRoot":"","sources":["../../../src/kit/slots/rectangular.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Size2D } from \"@motionscript/sdk\"\
|
|
1
|
+
{"version":3,"file":"rectangular.js","sourceRoot":"","sources":["../../../src/kit/slots/rectangular.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Size2D } from \"@motionscript/sdk\"\n\nimport { largest, slot, type Slot, type SlotInput } from \"./slot\"\n\nexport const FILL_DIRECTIONS = [\"row\", \"column\"] as const\nexport type FillDirection = (typeof FILL_DIRECTIONS)[number]\n\n/**\n * How big a cell is: the largest child (`fit`), a size of its own (`fixed`), or\n * an equal share of the grid's box (`fill`), which is also the room a child set\n * to `fill` grows into.\n */\nexport const CELL_MODES = [\"fit\", \"fixed\", \"fill\"] as const\nexport type CellMode = (typeof CELL_MODES)[number]\n\n/** Where a short last row (or column, filling by column) sits. */\nexport const LINE_ALIGNS = [\"start\", \"center\", \"end\"] as const\nexport type LineAlign = (typeof LINE_ALIGNS)[number]\n\nexport interface RectangularArrangement {\n kind: \"rectangular\"\n columns: number\n fillDirection: FillDirection\n cellMode: CellMode\n cellWidth: number\n cellHeight: number\n columnGap: number\n rowGap: number\n lastLineAlign: LineAlign\n /** Share of a column's pitch every other row shifts right — `0.5` is a brick bond. */\n rowOffset: number\n /** Share of a row's pitch every other column shifts down. */\n columnOffset: number\n}\n\n/** Rows and columns `count` items make, `columns` wide. */\nexport function rectangularShape(arrangement: RectangularArrangement, count: number): { rows: number; columns: number } {\n const columns = Math.max(1, Math.round(arrangement.columns))\n const rows = Math.max(1, Math.ceil(count / columns))\n // Filling by column, the rows are set by the count, and a column the items\n // never reach would pull the block off centre.\n if (arrangement.fillDirection === \"column\") return { rows, columns: Math.max(1, Math.ceil(count / rows)) }\n return { rows, columns }\n}\n\n/** The cell every item is laid out in — what a `fill` child is measured against. */\nexport function rectangularCell(\n arrangement: RectangularArrangement,\n count: number,\n sizes: readonly Size2D[],\n box: Size2D,\n): Size2D {\n const { rows, columns } = rectangularShape(arrangement, count)\n switch (arrangement.cellMode) {\n case \"fixed\":\n return { width: Math.max(0, arrangement.cellWidth), height: Math.max(0, arrangement.cellHeight) }\n case \"fill\":\n return {\n width: Math.max(0, (box.width - arrangement.columnGap * (columns - 1)) / columns),\n height: Math.max(0, (box.height - arrangement.rowGap * (rows - 1)) / rows),\n }\n default:\n return largest(sizes)\n }\n}\n\n/**\n * Items fill rows left to right, top to bottom (or columns top to bottom, left to\n * right), and the whole block is centred on the grid.\n */\nexport function rectangularSlots(arrangement: RectangularArrangement, input: SlotInput): Slot[] {\n const { count } = input\n if (count === 0) return []\n const { rows, columns } = rectangularShape(arrangement, count)\n const byColumn = arrangement.fillDirection === \"column\"\n // Filling by column keeps the column count and lets the rows follow from it.\n const lines = byColumn ? columns : rows\n const perLine = byColumn ? rows : columns\n const cell = rectangularCell(arrangement, count, input.sizes, input.box)\n const pitchX = cell.width + arrangement.columnGap\n const pitchY = cell.height + arrangement.rowGap\n const lastLine = lines - 1\n const lastCount = count - lastLine * perLine\n const shortBy = perLine - lastCount\n const lead = arrangement.lastLineAlign === \"center\" ? shortBy / 2 : arrangement.lastLineAlign === \"end\" ? shortBy : 0\n // Shifting every other row by a share of a pitch moves the block's centre by\n // half that share; taking it back keeps the block centred on the grid.\n const shiftX = arrangement.rowOffset * pitchX\n const shiftY = arrangement.columnOffset * pitchY\n\n const slots: Slot[] = []\n for (let i = 0; i < count; i++) {\n const line = Math.floor(i / perLine)\n let along = i % perLine\n if (line === lastLine) along += lead\n const row = byColumn ? along : line\n const column = byColumn ? line : along\n // A centred short line sits between whole cells; its parity is the cell it covers most.\n const rowIndex = Math.round(row)\n const columnIndex = Math.round(column)\n const x = (column - (columns - 1) / 2) * pitchX\n + (rowIndex % 2 === 1 ? shiftX : 0) - (rows > 1 ? shiftX / 2 : 0)\n const y = ((rows - 1) / 2 - row) * pitchY\n - (columnIndex % 2 === 1 ? shiftY : 0) + (columns > 1 ? shiftY / 2 : 0)\n slots.push(slot(x, y, { kind: \"rectangular\", row: rowIndex, column: columnIndex }))\n }\n return slots\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slot.js","sourceRoot":"","sources":["../../../src/kit/slots/slot.ts"],"names":[],"mappings":"AA4CA,MAAM,UAAU,IAAI,CAAC,CAAS,EAAE,CAAS,EAAE,IAAc;IACvD,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAA;AAChG,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,SAAS,CAAC,CAAO,EAAE,CAAO,EAAE,CAAS;IACnD,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,CAAA;IACpB,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,CAAA;IACpB,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;IACrD,OAAO;QACL,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAChB,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAChB,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC;QAC5B,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC;QACrC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC;QACxC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC;QACxC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC;QAC5B,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC;QAClC,IAAI,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;KAChC,CAAA;AACH,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,UAAU,CAAC,CAAO,EAAE,MAAc;IAChD,IAAI,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAA;IAC1B,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,GAAG,MAAM,EAAE,CAAA;AAC5E,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,OAAO,CAAC,KAAwB;IAC9C,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,IAAI,MAAM,GAAG,CAAC,CAAA;IACd,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,KAAK,GAAG,KAAK;YAAE,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;QAC1C,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM;YAAE,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;IAChD,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAA;AAC1B,CAAC","sourcesContent":["import type { Size2D } from \"@motionscript/sdk\"\
|
|
1
|
+
{"version":3,"file":"slot.js","sourceRoot":"","sources":["../../../src/kit/slots/slot.ts"],"names":[],"mappings":"AA4CA,MAAM,UAAU,IAAI,CAAC,CAAS,EAAE,CAAS,EAAE,IAAc;IACvD,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAA;AAChG,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,SAAS,CAAC,CAAO,EAAE,CAAO,EAAE,CAAS;IACnD,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,CAAA;IACpB,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,CAAA;IACpB,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;IACrD,OAAO;QACL,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAChB,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAChB,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC;QAC5B,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC;QACrC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC;QACxC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC;QACxC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC;QAC5B,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC;QAClC,IAAI,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;KAChC,CAAA;AACH,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,UAAU,CAAC,CAAO,EAAE,MAAc;IAChD,IAAI,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAA;IAC1B,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,GAAG,MAAM,EAAE,CAAA;AAC5E,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,OAAO,CAAC,KAAwB;IAC9C,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,IAAI,MAAM,GAAG,CAAC,CAAA;IACd,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,KAAK,GAAG,KAAK;YAAE,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;QAC1C,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM;YAAE,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;IAChD,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAA;AAC1B,CAAC","sourcesContent":["import type { Size2D } from \"@motionscript/sdk\"\n\n/**\n * One place in an arrangement, in the grid's own frame: centred on it, y-up,\n * `depth` toward the viewer.\n *\n * Pure data, and the whole of what an arrangement produces — which is what lets\n * a morph blend any two of them item by item, whatever shapes they came from.\n */\nexport interface Slot {\n x: number\n y: number\n depth: number\n /** Degrees clockwise. */\n rotation: number\n /** Tilt, degrees, as a node's own `rotationX`/`rotationY`. */\n rotationX: number\n rotationY: number\n scale: number\n opacity: number\n meta: SlotMeta\n}\n\n/** What kind of place a slot is — the orderings a stagger can follow. */\nexport type SlotMeta =\n | { kind: \"rectangular\"; row: number; column: number }\n /** Degrees clockwise from the arrangement's first slot. */\n | { kind: \"radial\"; angle: number }\n /** `0..1` along the part of the path in use. */\n | { kind: \"path\"; t: number }\n /** `depth` is `-1` at the back of the sphere and `1` at the front. */\n | { kind: \"sphere\"; lat: number; lon: number; depth: number }\n\n/** What an arrangement is laid out for. */\nexport interface SlotInput {\n count: number\n /** Each item's measured size, in item order. */\n sizes: readonly Size2D[]\n /** The grid's content box. */\n box: Size2D\n /** Clip seconds, for arrangements that move on their own. */\n time: number\n}\n\nexport function slot(x: number, y: number, meta: SlotMeta): Slot {\n return { x, y, depth: 0, rotation: 0, rotationX: 0, rotationY: 0, scale: 1, opacity: 1, meta }\n}\n\n/** `a` toward `b`. The meta switches halfway, since an ordering cannot be half one thing. */\nexport function blendSlot(a: Slot, b: Slot, t: number): Slot {\n if (t <= 0) return a\n if (t >= 1) return b\n const mix = (p: number, q: number) => p + (q - p) * t\n return {\n x: mix(a.x, b.x),\n y: mix(a.y, b.y),\n depth: mix(a.depth, b.depth),\n rotation: mix(a.rotation, b.rotation),\n rotationX: mix(a.rotationX, b.rotationX),\n rotationY: mix(a.rotationY, b.rotationY),\n scale: mix(a.scale, b.scale),\n opacity: mix(a.opacity, b.opacity),\n meta: t < 0.5 ? a.meta : b.meta,\n }\n}\n\n/** Push `s` away from (or pull it toward) the grid's centre. */\nexport function spreadSlot(s: Slot, spread: number): Slot {\n if (spread === 1) return s\n return { ...s, x: s.x * spread, y: s.y * spread, depth: s.depth * spread }\n}\n\n/** Largest width and height among `sizes`. */\nexport function largest(sizes: readonly Size2D[]): Size2D {\n let width = 0\n let height = 0\n for (const size of sizes) {\n if (size.width > width) width = size.width\n if (size.height > height) height = size.height\n }\n return { width, height }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sphere.js","sourceRoot":"","sources":["../../../src/kit/slots/sphere.ts"],"names":[],"mappings":"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","sourcesContent":["import { slot, type Slot, type SlotInput } from \"./slot\"\
|
|
1
|
+
{"version":3,"file":"sphere.js","sourceRoot":"","sources":["../../../src/kit/slots/sphere.ts"],"names":[],"mappings":"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","sourcesContent":["import { slot, type Slot, type SlotInput } from \"./slot\"\n\n/** `outward` lays each item on the sphere's surface; `billboard` keeps every item facing the viewer. */\nexport const SPHERE_FACINGS = [\"outward\", \"billboard\"] as const\nexport type SphereFacing = (typeof SPHERE_FACINGS)[number]\n\nexport const SPHERE_AXES = [\"x\", \"y\", \"z\"] as const\nexport type SphereAxis = (typeof SPHERE_AXES)[number]\n\nexport interface SphereArrangement {\n kind: \"sphere\"\n radius: number\n /** Turn about the vertical axis, degrees — positive carries the front to the right. */\n yaw: number\n /** Turn about the horizontal axis, degrees — positive brings the top toward the viewer. */\n pitch: number\n /** Turn about the view axis, degrees clockwise. */\n roll: number\n facing: SphereFacing\n /** The camera's distance from the sphere's centre plane, px — smaller is more dramatic. */\n focalLength: number\n /** How much the back half fades, `0..1`. */\n depthFade: number\n /** Hide the items whose faces point away from the viewer. */\n cullBackfaces: boolean\n /** Degrees per second of yaw the sphere turns on its own. */\n spinSpeed: number\n}\n\nconst GOLDEN_ANGLE = Math.PI * (3 - Math.sqrt(5))\nconst DEG = 180 / Math.PI\n\n/** Point `k` of `count` on the unit sphere — a Fibonacci lattice, as even as `count` points get. */\nexport function fibonacciPoint(k: number, count: number): [number, number, number] {\n if (count <= 1) return [0, 0, 1]\n const y = 1 - (2 * (k + 0.5)) / count\n const r = Math.sqrt(Math.max(0, 1 - y * y))\n const theta = k * GOLDEN_ANGLE\n return [Math.cos(theta) * r, y, Math.sin(theta) * r]\n}\n\n/** `p` turned by yaw, then pitch, then roll — y-up, z toward the viewer. */\nexport function orient(p: readonly [number, number, number], yaw: number, pitch: number, roll: number): [number, number, number] {\n const [x0, y0, z0] = p\n const ya = yaw / DEG, pa = pitch / DEG, ra = roll / DEG\n const x1 = x0 * Math.cos(ya) + z0 * Math.sin(ya)\n const z1 = -x0 * Math.sin(ya) + z0 * Math.cos(ya)\n const y2 = y0 * Math.cos(pa) - z1 * Math.sin(pa)\n const z2 = y0 * Math.sin(pa) + z1 * Math.cos(pa)\n return [x1 * Math.cos(ra) + y2 * Math.sin(ra), -x1 * Math.sin(ra) + y2 * Math.cos(ra), z2]\n}\n\nexport function sphereSlots(arrangement: SphereArrangement, input: SlotInput): Slot[] {\n const { count } = input\n const radius = arrangement.radius\n const yaw = arrangement.yaw + arrangement.spinSpeed * input.time\n const outward = arrangement.facing === \"outward\"\n const slots: Slot[] = []\n for (let k = 0; k < count; k++) {\n const q = fibonacciPoint(k, count)\n const [nx, ny, nz] = orient(q, yaw, arrangement.pitch, arrangement.roll)\n const s = slot(nx * radius, ny * radius, {\n kind: \"sphere\",\n lat: Math.asin(Math.max(-1, Math.min(1, q[1]))) * DEG,\n lon: Math.atan2(q[2], q[0]) * DEG,\n depth: nz,\n })\n s.depth = nz * radius\n if (outward) {\n // The tilt whose `Rx · Ry` turns a face's normal onto the surface normal.\n s.rotationY = Math.asin(Math.max(-1, Math.min(1, nx))) * DEG\n s.rotationX = Math.atan2(ny, nz) * DEG\n }\n s.opacity = 1 - arrangement.depthFade * (1 - (nz + 1) / 2)\n if (outward && arrangement.cullBackfaces && facesAway(s, [nx, ny, nz], arrangement.focalLength)) s.opacity = 0\n slots.push(s)\n }\n return slots\n}\n\n/** Whether an outward face at `s` shows its back to a viewer `focal` px in front of the centre. */\nfunction facesAway(s: Slot, normal: readonly [number, number, number], focal: number): boolean {\n if (focal <= 0) return normal[2] < 0\n return normal[0] * -s.x + normal[1] * -s.y + normal[2] * (focal - s.depth) < 0\n}\n\n/** The yaw and pitch that bring point `index` of `count` round to face the viewer. */\nexport function sphereFaceForward(count: number, index: number): { yaw: number; pitch: number } {\n const [x, y, z] = fibonacciPoint(index, count)\n return {\n yaw: -Math.atan2(x, z) * DEG,\n pitch: Math.atan2(y, Math.hypot(x, z)) * DEG,\n }\n}\n"]}
|
package/dist/kit/stagger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stagger.js","sourceRoot":"","sources":["../../src/kit/stagger.ts"],"names":[],"mappings":"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","sourcesContent":["import { shuffled } from \"./random\"\
|
|
1
|
+
{"version":3,"file":"stagger.js","sourceRoot":"","sources":["../../src/kit/stagger.ts"],"names":[],"mappings":"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","sourcesContent":["import { shuffled } from \"./random\"\nimport type { Slot } from \"./slots\"\n\n/**\n * The order a per-item effect sweeps through a grid's items. The first five\n * work on any grid; the rest follow one arrangement's own geometry — rows and\n * columns of a rectangular grid (or top-to-bottom and left-to-right of any\n * other), the way round a ring, the way along a path, front to back of a sphere\n * — and fall back to item order where the grid has no such thing.\n */\nexport const STAGGER_ORDERS = [\n \"index\",\n \"reverse\",\n \"random\",\n \"centerOut\",\n \"edgesIn\",\n \"row\",\n \"column\",\n \"angle\",\n \"path\",\n \"depth\",\n] as const\nexport type StaggerOrder = (typeof STAGGER_ORDERS)[number]\n\n/** The most of a command's length the offsets may take; the rest is each item's own motion. */\nconst MAX_STAGGER = 0.95\n\n/**\n * Each item's start, `0..1`, as a share of the stagger: `0` goes first, `1`\n * last, and items that tie go together — a ring revealed `centerOut` from its\n * centre appears all at once, which is what that means.\n */\nexport function staggerRanks(order: StaggerOrder, slots: readonly Slot[], seed: number): number[] {\n const n = slots.length\n const keys = keysOf(order, slots, seed)\n let min = Infinity\n let max = -Infinity\n for (const key of keys) {\n if (key < min) min = key\n if (key > max) max = key\n }\n const range = max - min\n if (!(range > 1e-9)) return new Array<number>(n).fill(0)\n return keys.map((key) => (key - min) / range)\n}\n\n/**\n * Item progress at command time `t`: each item runs over the same length of\n * time, starting `rank · stagger` in. The stagger lives inside the command's\n * duration, so a one-second reveal takes one second for four items or four\n * hundred.\n */\nexport function staggerProgress(rank: number, t: number, stagger: number): number {\n const s = Math.max(0, Math.min(MAX_STAGGER, stagger))\n const p = s === 0 ? t : (t - rank * s) / (1 - s)\n return p < 0 ? 0 : p > 1 ? 1 : p\n}\n\nfunction keysOf(order: StaggerOrder, slots: readonly Slot[], seed: number): number[] {\n switch (order) {\n case \"reverse\":\n return slots.map((_, i) => -i)\n case \"random\": {\n const sequence = shuffled(slots.map((_, i) => i), seed)\n const keys = new Array<number>(slots.length)\n sequence.forEach((item, rank) => {\n keys[item] = rank\n })\n return keys\n }\n case \"centerOut\":\n return slots.map((s) => Math.round(Math.hypot(s.x, s.y, s.depth) * 1000) / 1000)\n case \"edgesIn\":\n return slots.map((s) => -Math.round(Math.hypot(s.x, s.y, s.depth) * 1000) / 1000)\n case \"row\":\n return slots.map((s) => (s.meta.kind === \"rectangular\" ? s.meta.row : -Math.round(s.y)))\n case \"column\":\n return slots.map((s) => (s.meta.kind === \"rectangular\" ? s.meta.column : Math.round(s.x)))\n case \"angle\":\n return slots.map((s, i) =>\n s.meta.kind === \"radial\" ? s.meta.angle : s.meta.kind === \"rectangular\" || s.meta.kind === \"sphere\" ? clockAngle(s) : i\n )\n case \"path\":\n return slots.map((s, i) => (s.meta.kind === \"path\" ? s.meta.t : i))\n case \"depth\":\n return slots.map((s, i) => (s.meta.kind === \"sphere\" ? -s.meta.depth : i))\n default:\n return slots.map((_, i) => i)\n }\n}\n\n/** Degrees clockwise from twelve o'clock to where `s` sits. */\nfunction clockAngle(s: Slot): number {\n const angle = (Math.atan2(s.x, s.y) * 180) / Math.PI\n return angle < 0 ? angle + 360 : angle\n}\n"]}
|
package/dist/nodes.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodes.js","sourceRoot":"","sources":["../src/nodes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAqB1C,MAAM,CAAC,MAAM,KAAK,GAAc;IAC9B,eAAe;IACf,UAAU;IACV,QAAQ;IACR,UAAU;CACX,CAAA","sourcesContent":["import { PathGrid } from \"./path-grid\"\
|
|
1
|
+
{"version":3,"file":"nodes.js","sourceRoot":"","sources":["../src/nodes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAqB1C,MAAM,CAAC,MAAM,KAAK,GAAc;IAC9B,eAAe;IACf,UAAU;IACV,QAAQ;IACR,UAAU;CACX,CAAA","sourcesContent":["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"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/path-grid/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA","sourcesContent":["export * from \"./path-grid\"\
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/path-grid/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA","sourcesContent":["export * from \"./path-grid\"\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path-grid.js","sourceRoot":"","sources":["../../src/path-grid/path-grid.ts"],"names":[],"mappings":"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","sourcesContent":["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"]}
|
|
1
|
+
{"version":3,"file":"path-grid.js","sourceRoot":"","sources":["../../src/path-grid/path-grid.ts"],"names":[],"mappings":"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","sourcesContent":["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"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/radial-grid/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA","sourcesContent":["export * from \"./radial-grid\"\
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/radial-grid/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA","sourcesContent":["export * from \"./radial-grid\"\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"radial-grid.js","sourceRoot":"","sources":["../../src/radial-grid/radial-grid.ts"],"names":[],"mappings":"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","sourcesContent":["import {\
|
|
1
|
+
{"version":3,"file":"radial-grid.js","sourceRoot":"","sources":["../../src/radial-grid/radial-grid.ts"],"names":[],"mappings":"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","sourcesContent":["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"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rectangular-grid/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAA","sourcesContent":["export * from \"./rectangular-grid\"\
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rectangular-grid/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAA","sourcesContent":["export * from \"./rectangular-grid\"\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rectangular-grid.js","sourceRoot":"","sources":["../../src/rectangular-grid/rectangular-grid.ts"],"names":[],"mappings":"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","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"]}
|
|
1
|
+
{"version":3,"file":"rectangular-grid.js","sourceRoot":"","sources":["../../src/rectangular-grid/rectangular-grid.ts"],"names":[],"mappings":"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","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"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sphere-grid/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA","sourcesContent":["export * from \"./sphere-grid\"\
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sphere-grid/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA","sourcesContent":["export * from \"./sphere-grid\"\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sphere-grid.js","sourceRoot":"","sources":["../../src/sphere-grid/sphere-grid.ts"],"names":[],"mappings":"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","sourcesContent":["import {\
|
|
1
|
+
{"version":3,"file":"sphere-grid.js","sourceRoot":"","sources":["../../src/sphere-grid/sphere-grid.ts"],"names":[],"mappings":"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","sourcesContent":["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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@motionscript/grids",
|
|
3
|
-
"version": "0.1.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Grid layouts for Motion Script: rectangular, radial, path and spherical arrangements of a node's children, with staggered reveals, waves, focus and morphs between them.",
|
|
6
6
|
"repository": {
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"license": "Apache-2.0",
|
|
51
51
|
"author": "Motionscript",
|
|
52
52
|
"peerDependencies": {
|
|
53
|
-
"@motionscript/sdk": "^0.1.0
|
|
53
|
+
"@motionscript/sdk": "^0.1.0"
|
|
54
54
|
},
|
|
55
55
|
"devDependencies": {
|
|
56
56
|
"@types/node": "^25.6.2",
|
|
@@ -61,8 +61,8 @@
|
|
|
61
61
|
"typescript": "^6.0.3",
|
|
62
62
|
"typescript-eslint": "^8.48.0",
|
|
63
63
|
"vitest": "^4.1.5",
|
|
64
|
-
"@motionscript/core": "0.1.0
|
|
65
|
-
"@motionscript/sdk": "0.1.0
|
|
64
|
+
"@motionscript/core": "0.1.0",
|
|
65
|
+
"@motionscript/sdk": "0.1.0"
|
|
66
66
|
},
|
|
67
67
|
"scripts": {
|
|
68
68
|
"build": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json --resolve-full-paths && node ../../../scripts/build-browser.mjs",
|