Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
13f9161
new docs for security policy and hosting of assets on users cdn
matas-bitbybit-dev Dec 13, 2025
790525a
fixed wire splitting bug
matas-bitbybit-dev Dec 14, 2025
a79c9f4
mesh mesh intersection unit tests
matas-bitbybit-dev Dec 14, 2025
156427e
remove io-assembly from coverage
matas-bitbybit-dev Dec 14, 2025
146909c
additional solid unit tests
matas-bitbybit-dev Dec 14, 2025
d05173d
additional edge unit tests
matas-bitbybit-dev Dec 14, 2025
fee393c
some face unit tests
matas-bitbybit-dev Dec 14, 2025
ce5ea1b
io unit tests
matas-bitbybit-dev Dec 14, 2025
62608b7
additional fillets, io and operations unit tests
matas-bitbybit-dev Dec 14, 2025
a64eb0d
dxf service unit tests
matas-bitbybit-dev Dec 15, 2025
8149539
some unit tests for reversedWireFromReversedEdges
matas-bitbybit-dev Dec 15, 2025
f262104
unit test shape-fix method
matas-bitbybit-dev Dec 15, 2025
c378687
unit tests for iterator service
matas-bitbybit-dev Dec 15, 2025
7e2f8f5
enum service unit tests
matas-bitbybit-dev Dec 15, 2025
7cbf067
wire unit tests
matas-bitbybit-dev Dec 15, 2025
78a7186
unit test io with fromRightHanded STEP and fillets with defined solut…
matas-bitbybit-dev Dec 15, 2025
4d9c38f
unit tests for base points including hex grids.
matas-bitbybit-dev Dec 15, 2025
82b8d1e
dxf AC1009 unit tests
matas-bitbybit-dev Dec 15, 2025
028e655
additional unit tests for base
matas-bitbybit-dev Dec 15, 2025
34065c2
removed console.log from unit tests
matas-bitbybit-dev Dec 15, 2025
30f31c4
additional unit tests
matas-bitbybit-dev Dec 15, 2025
338076f
homepage of learn tuned up, festive decor tutorial
matas-bitbybit-dev Dec 15, 2025
acc9966
updated learn.bitbybit.dev homepage to be more like main site.
matas-bitbybit-dev Dec 16, 2025
44d2774
improved some homepage editor related styling
matas-bitbybit-dev Dec 16, 2025
6f859da
update to festive decor modeling tutorials
matas-bitbybit-dev Dec 19, 2025
c25b109
update to manifold 3.3.2, some new tutorials for festive decorations
matas-bitbybit-dev Dec 21, 2025
69de45e
some new helper functions for math and lists. Also improved comments …
matas-bitbybit-dev Dec 22, 2025
9a75af6
removed double quotes from comments
matas-bitbybit-dev Dec 22, 2025
cef48c6
new helper methods for text, some fundamentals that were not there li…
matas-bitbybit-dev Dec 22, 2025
ae79745
fixed some default values
matas-bitbybit-dev Dec 22, 2025
df3a775
New CSV parsing and generation methods. CSV to JSON and JSON to CSV. …
matas-bitbybit-dev Dec 22, 2025
ba64c65
updated actual nr of API functions
matas-bitbybit-dev Dec 22, 2025
3f0d56f
added option to remove trailing zeros to dimensions
matas-bitbybit-dev Dec 22, 2025
766f042
new asset handling methods
matas-bitbybit-dev Dec 23, 2025
3c4dc7b
implemented prompt preview interface
matas-bitbybit-dev Dec 23, 2025
64343dd
fixed comment
matas-bitbybit-dev Dec 23, 2025
8b203d8
v0.20.14
matas-bitbybit-dev Dec 23, 2025
1c935a2
unit test fix
matas-bitbybit-dev Dec 23, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/blog/2024-11-08-updated-bitbybit-runners.md
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ We are serving the Bitbybit Runners from the **JSDelivr CDN**. You can include t
<script src="https://cdn.jsdelivr.net/gh/bitbybit-dev/bitbybit-assets@<version-number-of-bitbybit>/runner/bitbybit-runner-lite-threejs.js"></script>
```

**Note:** You should replace `<version-number-of-bitbybit>` with an actual version number (e.g., `0.20.13`). You can find all the official versions of Bitbybit.dev here:
**Note:** You should replace `<version-number-of-bitbybit>` with an actual version number (e.g., `0.20.14`). You can find all the official versions of Bitbybit.dev here:
➡️ **[Bitbybit.dev GitHub Releases](https://github.com/bitbybit-dev/bitbybit/releases)**

### Examples of the Runners
Expand Down
2 changes: 1 addition & 1 deletion docs/learn/3d-bits/theme-app-extensions/bitbybit-viewer.md
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ Save your JSON configurator as a file, upload it to Shopify CDN as a file. Copy

While our Viewer Editor is the recommended way to create and manage the Scene Config JSON, you can also edit the JSON directly using any text editor. For a better editing experience with features like syntax highlighting and autocompletion (intellisense), we provide a JSON schema.

* **JSON Schema:** You can find the schema [here](https://app-store.bitbybit.dev/files/ecommerce/viewer-editor/viewer-scene-schema-v0.20.13.json). (Note: This schema link points to version `0.20.13`. The schema may be updated in the future, so ensure you refer to the latest version compatible with your "3D Bits" app version.)
* **JSON Schema:** You can find the schema [here](https://app-store.bitbybit.dev/files/ecommerce/viewer-editor/viewer-scene-schema-v0.20.14.json). (Note: This schema link points to version `0.20.14`. The schema may be updated in the future, so ensure you refer to the latest version compatible with your "3D Bits" app version.)
Many modern code editors (like VS Code) can use this schema to provide validation and autocompletion as you edit the JSON.

## Video Tutorial: BITBYBIT VIEWER Block Setup
Expand Down
2 changes: 1 addition & 1 deletion docs/learn/3d-bits/tutorials/bitbybit-viewer/settings.md
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,7 @@ The system automatically detects if you're providing a URL (starting with `http:
- For complex configurations, use a URL to an external JSON file - it keeps your theme settings cleaner and makes updates easier
- Use the Viewer Editor to generate valid configurations
- Test your scene configuration thoroughly before going live
- The scene configuration follows a [JSON schema](https://app-store.bitbybit.dev/files/ecommerce/viewer-editor/viewer-scene-schema-v0.20.13.json) that defines all available options
- The scene configuration follows a [JSON schema](https://app-store.bitbybit.dev/files/ecommerce/viewer-editor/viewer-scene-schema-v0.20.14.json) that defines all available options
:::

---
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ These settings are specific to RUNNER and APPS blocks:
### Runner CDN Link

**Available in:** VIEWER, RUNNER
**Default:** `https://cdn.jsdelivr.net/gh/bitbybit-dev/[email protected].13/runner/bitbybit-runner-babylonjs.js`
**Default:** `https://cdn.jsdelivr.net/gh/bitbybit-dev/[email protected].14/runner/bitbybit-runner-babylonjs.js`

Specifies which version of the Bitbybit runner library to use. The runner is the core engine that loads and renders 3D content in your browser.

Expand Down Expand Up @@ -173,7 +173,7 @@ The URL follows this pattern:
https://cdn.jsdelivr.net/gh/bitbybit-dev/bitbybit-assets@{VERSION}/runner/bitbybit-runner-babylonjs.js
```

Replace `{VERSION}` with the desired version number (e.g., `0.20.13`).
Replace `{VERSION}` with the desired version number (e.g., `0.20.14`).

**Self-Hosting on Shopify CDN:**

Expand Down

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ To save you time and provide a starting point, here is the embedded Bitbybit Typ

<BitByBitRenderCanvas
requireManualStart={true}
script={{"script":"Bit.mockBitbybitRunnerInputs({\n \"Laptop Type\": \"MacBook Pro 16\",\n \"Number Laptops\": \"3\",\n \"Color\": \"Black\",\n});\nconst inputs = Bit.getBitbybitRunnerInputs();\n\nconst laptops: Laptop[] = []\n\nlet laptop: Laptop;\n\nswitch (inputs[\"Laptop Type\"]) {\n case \"MacBook Pro 16\":\n laptop = {\n length: 1.63,\n width: 35.8,\n height: 24.6\n };\n break;\n case \"MacBook Pro 14\":\n laptop = {\n length: 1.57,\n width: 31.3,\n height: 22.2\n }\n break;\n case \"MacBook Air\":\n laptop = {\n length: 1.2,\n width: 30.5,\n height: 21.6\n }\n break;\n default:\n break;\n}\n\nlet flipColor = false;\nswitch (inputs[\"Color\"]) {\n case \"Blue\":\n flipColor = true;\n break;\n default:\n break;\n}\n\nconsole.log(\"laptop \", laptop);\n\nconst nrLaptops = +inputs[\"Number Laptops\"];\n\nfor (let i = 0; i < nrLaptops; i++) {\n laptops.push({ ...laptop });\n}\n\nconst whiteColor = \"#ffffff\";\nconst holderColor = \"#333333\";\n\nconst laptopLiftedHeight = 3;\nconst distanceBetweenLaptops = 1.7;\nconst exportSTEP = false;\n\nbitbybit.babylon.scene.backgroundColour({ colour: \"#bbbbbb\" });\n\nconst pointLightConf = new Bit.Inputs.BabylonScene.PointLightDto();\npointLightConf.position = [-15, 20, -5];\npointLightConf.intensity = 8000;\npointLightConf.diffuse = \"#3333ff\";\npointLightConf.radius = 0;\nbitbybit.babylon.scene.drawPointLight(pointLightConf);\n\nconst controlPoints = [\n [-12.5, 0, 0],\n [-8, 13, 0],\n [-4, 11, 0],\n [-2, 6, 0],\n [2, 6, 0],\n [4, 14, 0],\n [8, 17, 0],\n [12.5, 0, 0]\n] as Bit.Inputs.Base.Point3[];\n\nlet laptopStand;\nlet laptopStandMesh;\n\nconst laptopsFilletsMesh = [];\n\nasync function start() {\n const ground = await bitbybit.occt.shapes.face.createCircleFace({ center: [0, 0, 0], direction: [0, 1, 0], radius: 75, });\n const groundOptions = new Bit.Inputs.Draw.DrawOcctShapeOptions();\n groundOptions.faceColour = whiteColor;\n groundOptions.drawEdges = false;\n await bitbybit.draw.drawAnyAsync({ entity: ground, options: groundOptions });\n\n const renderLaptops = async (laptops) => {\n\n laptops.forEach(laptop => {\n laptop.center = [0, laptop.height / 2 + laptopLiftedHeight, 0] as Bit.Inputs.Base.Point3;\n });\n\n let laptopFillets = [];\n let totalDistance = 0;\n let previousLaptopLength = 0;\n\n laptops.forEach(async (laptop, index) => {\n totalDistance += distanceBetweenLaptops + laptop.length / 2 + previousLaptopLength / 2;\n previousLaptopLength = laptop.length;\n laptop.center[2] = totalDistance;\n const laptopBaseModel = await bitbybit.occt.shapes.solid.createBox({\n width: laptop.width,\n length: laptop.length,\n height: laptop.height,\n center: laptop.center\n });\n const laptopFillet = await bitbybit.occt.fillets.filletEdges({ shape: laptopBaseModel, indexes: undefined, radius: 0.2 });\n laptopFillets.push(laptopFillet);\n\n const laptopVisModel = await bitbybit.occt.shapes.solid.createBox({\n width: laptop.width,\n length: laptop.length - 0.01,\n height: laptop.height,\n center: laptop.center\n });\n const laptopVisFillet = await bitbybit.occt.fillets.filletEdges({ shape: laptopVisModel, indexes: undefined, radius: 0.2 });\n laptopFillets.push(laptopFillet);\n\n const di = new Bit.Inputs.Draw.DrawOcctShapeOptions();\n\n di.faceOpacity = 0.2;\n di.edgeWidth = 5;\n di.edgeOpacity = 0.6;\n di.edgeColour = whiteColor;\n di.faceColour = whiteColor;\n const laptopFilletMesh = await bitbybit.draw.drawAnyAsync({ entity: laptopVisFillet, options: di });\n laptopsFilletsMesh.push(laptopFilletMesh);\n })\n\n const polygonWire = await bitbybit.occt.shapes.wire.createPolygonWire({\n points: controlPoints\n });\n const extrusion = await bitbybit.occt.operations.extrude({\n shape: polygonWire, direction: [0, 0, totalDistance += distanceBetweenLaptops + previousLaptopLength / 2]\n });\n const laptopStandFillet = await bitbybit.occt.fillets.filletEdges({ shape: extrusion, indexes: undefined, radius: 1 });\n const laptopStandThick = await bitbybit.occt.operations.makeThickSolidSimple({ shape: laptopStandFillet, offset: -0.5 });\n\n laptopStand = await bitbybit.occt.booleans.difference({ shape: laptopStandThick, shapes: laptopFillets, keepEdges: false });\n const li = new Bit.Inputs.OCCT.DrawShapeDto(laptopStand);\n li.faceOpacity = 1;\n if (flipColor) {\n li.faceColour = \"#0000ff\";\n li.edgeColour = whiteColor;\n } else {\n li.faceColour = holderColor;\n li.edgeColour = whiteColor;\n }\n li.edgeWidth = 5;\n laptopStandMesh = await bitbybit.draw.drawAnyAsync({ entity: laptopStand, options: li });\n const laptopsMeshes = await Promise.all(laptopsFilletsMesh);\n return [laptopStandMesh, ...laptopsMeshes];\n }\n\n const meshes = await renderLaptops(laptops);\n return { meshes };\n}\n\nclass Laptop {\n width: number;\n length: number;\n height: number;\n center?: Bit.Inputs.Base.Point3;\n}\n\nBit.setBitbybitRunnerResult(start());","version":"0.20.13","type":"typescript"}}
script={{"script":"Bit.mockBitbybitRunnerInputs({\n \"Laptop Type\": \"MacBook Pro 16\",\n \"Number Laptops\": \"3\",\n \"Color\": \"Black\",\n});\nconst inputs = Bit.getBitbybitRunnerInputs();\n\nconst laptops: Laptop[] = []\n\nlet laptop: Laptop;\n\nswitch (inputs[\"Laptop Type\"]) {\n case \"MacBook Pro 16\":\n laptop = {\n length: 1.63,\n width: 35.8,\n height: 24.6\n };\n break;\n case \"MacBook Pro 14\":\n laptop = {\n length: 1.57,\n width: 31.3,\n height: 22.2\n }\n break;\n case \"MacBook Air\":\n laptop = {\n length: 1.2,\n width: 30.5,\n height: 21.6\n }\n break;\n default:\n break;\n}\n\nlet flipColor = false;\nswitch (inputs[\"Color\"]) {\n case \"Blue\":\n flipColor = true;\n break;\n default:\n break;\n}\n\nconsole.log(\"laptop \", laptop);\n\nconst nrLaptops = +inputs[\"Number Laptops\"];\n\nfor (let i = 0; i < nrLaptops; i++) {\n laptops.push({ ...laptop });\n}\n\nconst whiteColor = \"#ffffff\";\nconst holderColor = \"#333333\";\n\nconst laptopLiftedHeight = 3;\nconst distanceBetweenLaptops = 1.7;\nconst exportSTEP = false;\n\nbitbybit.babylon.scene.backgroundColour({ colour: \"#bbbbbb\" });\n\nconst pointLightConf = new Bit.Inputs.BabylonScene.PointLightDto();\npointLightConf.position = [-15, 20, -5];\npointLightConf.intensity = 8000;\npointLightConf.diffuse = \"#3333ff\";\npointLightConf.radius = 0;\nbitbybit.babylon.scene.drawPointLight(pointLightConf);\n\nconst controlPoints = [\n [-12.5, 0, 0],\n [-8, 13, 0],\n [-4, 11, 0],\n [-2, 6, 0],\n [2, 6, 0],\n [4, 14, 0],\n [8, 17, 0],\n [12.5, 0, 0]\n] as Bit.Inputs.Base.Point3[];\n\nlet laptopStand;\nlet laptopStandMesh;\n\nconst laptopsFilletsMesh = [];\n\nasync function start() {\n const ground = await bitbybit.occt.shapes.face.createCircleFace({ center: [0, 0, 0], direction: [0, 1, 0], radius: 75, });\n const groundOptions = new Bit.Inputs.Draw.DrawOcctShapeOptions();\n groundOptions.faceColour = whiteColor;\n groundOptions.drawEdges = false;\n await bitbybit.draw.drawAnyAsync({ entity: ground, options: groundOptions });\n\n const renderLaptops = async (laptops) => {\n\n laptops.forEach(laptop => {\n laptop.center = [0, laptop.height / 2 + laptopLiftedHeight, 0] as Bit.Inputs.Base.Point3;\n });\n\n let laptopFillets = [];\n let totalDistance = 0;\n let previousLaptopLength = 0;\n\n laptops.forEach(async (laptop, index) => {\n totalDistance += distanceBetweenLaptops + laptop.length / 2 + previousLaptopLength / 2;\n previousLaptopLength = laptop.length;\n laptop.center[2] = totalDistance;\n const laptopBaseModel = await bitbybit.occt.shapes.solid.createBox({\n width: laptop.width,\n length: laptop.length,\n height: laptop.height,\n center: laptop.center\n });\n const laptopFillet = await bitbybit.occt.fillets.filletEdges({ shape: laptopBaseModel, indexes: undefined, radius: 0.2 });\n laptopFillets.push(laptopFillet);\n\n const laptopVisModel = await bitbybit.occt.shapes.solid.createBox({\n width: laptop.width,\n length: laptop.length - 0.01,\n height: laptop.height,\n center: laptop.center\n });\n const laptopVisFillet = await bitbybit.occt.fillets.filletEdges({ shape: laptopVisModel, indexes: undefined, radius: 0.2 });\n laptopFillets.push(laptopFillet);\n\n const di = new Bit.Inputs.Draw.DrawOcctShapeOptions();\n\n di.faceOpacity = 0.2;\n di.edgeWidth = 5;\n di.edgeOpacity = 0.6;\n di.edgeColour = whiteColor;\n di.faceColour = whiteColor;\n const laptopFilletMesh = await bitbybit.draw.drawAnyAsync({ entity: laptopVisFillet, options: di });\n laptopsFilletsMesh.push(laptopFilletMesh);\n })\n\n const polygonWire = await bitbybit.occt.shapes.wire.createPolygonWire({\n points: controlPoints\n });\n const extrusion = await bitbybit.occt.operations.extrude({\n shape: polygonWire, direction: [0, 0, totalDistance += distanceBetweenLaptops + previousLaptopLength / 2]\n });\n const laptopStandFillet = await bitbybit.occt.fillets.filletEdges({ shape: extrusion, indexes: undefined, radius: 1 });\n const laptopStandThick = await bitbybit.occt.operations.makeThickSolidSimple({ shape: laptopStandFillet, offset: -0.5 });\n\n laptopStand = await bitbybit.occt.booleans.difference({ shape: laptopStandThick, shapes: laptopFillets, keepEdges: false });\n const li = new Bit.Inputs.OCCT.DrawShapeDto(laptopStand);\n li.faceOpacity = 1;\n if (flipColor) {\n li.faceColour = \"#0000ff\";\n li.edgeColour = whiteColor;\n } else {\n li.faceColour = holderColor;\n li.edgeColour = whiteColor;\n }\n li.edgeWidth = 5;\n laptopStandMesh = await bitbybit.draw.drawAnyAsync({ entity: laptopStand, options: li });\n const laptopsMeshes = await Promise.all(laptopsFilletsMesh);\n return [laptopStandMesh, ...laptopsMeshes];\n }\n\n const meshes = await renderLaptops(laptops);\n return { meshes };\n}\n\nclass Laptop {\n width: number;\n length: number;\n height: number;\n center?: Bit.Inputs.Base.Point3;\n}\n\nBit.setBitbybitRunnerResult(start());","version":"0.20.14","type":"typescript"}}
title="Bitbybit Rete Editor - 3D Laptop Holder"
description="3D Laptop holder configurator"
/>
Expand Down

Large diffs are not rendered by default.

Loading