Merge branch 'rel-next'

This commit is contained in:
Stewart Allen 2026-04-08 10:50:55 -04:00
commit c2eca07ed2
170 changed files with 36860 additions and 2409 deletions

View file

@ -18,6 +18,20 @@
font-family: sans-serif;
font-weight: bold;
}
#progress {
margin-top: 20px;
width: 300px;
height: 20px;
border: 1px solid black;
border-radius: 10px;
background-color: white;
overflow: hidden;
}
#bar {
background-color: #555;
height: 20px;
width: 0%;
}
</style>
<script type="module">
import { version } from '/lib/moto/license.js';
@ -49,10 +63,19 @@
version: map.version || version
});
const bar = document.getElementById('bar');
navigator.serviceWorker.addEventListener('message', e => {
console.log('[SM]', e.data);
setTimeout(() => {
if (map.mesh) {
let { data } = e;
if (data.progress) {
bar.style.width = `${(data.progress * 100)|0}%`;
return;
} else {
console.log('[SM]', data);
}
setTimeout(() => {
bar.style.width = `100%`;
if (map.mesh) {
location.replace('/mesh/index.html');
} else {
location.replace('/kiri/index.html');
@ -63,6 +86,11 @@
</script>
</head>
<body>Booting Grid.Space</body>
<body>
<div>Installing Grid.Space</div>
<div id="progress">
<div id="bar"></div>
</div>
</body>
</html>

View file

@ -43,7 +43,7 @@ self.addEventListener('message', e => {
async function _install(e) {
log('install');
if (e.addRoutes) {
for (let pre of ["font","mesh","kiri","lib","wasm"]) {
for (let pre of ["font","mesh","kiri","void","lib","wasm"]) {
e.addRoutes({
condition: { urlPattern: new URLPattern({ pathname: `/${pre}/.*` }) },
source: { cacheName: CACHE_VERSION }
@ -193,8 +193,10 @@ async function preloadBundle() {
const res = await fetch(BUNDLE_URL, { cache: 'no-store' });
const buf = await res.arrayBuffer();
const files = await unpackBundle(buf);
const total = Object.keys(files).length;
await Promise.all(
Object.entries(files).map(([path, blob]) => {
broadcast({ progress: loaded/total });
const ext = path.split('.').pop();
const type =
ext === 'html' ? 'text/html' :

BIN
web/icon/kirimoto.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

BIN
web/icon/kirimoto2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

BIN
web/icon/meshtool.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 278 KiB

BIN
web/icon/voidform.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

View file

@ -31,12 +31,17 @@
margin-right: 1rem;
}
#jcode, #gcode {
width: 400px;
height: 400px;
margin: 5px;
border-radius: 3px;
border: 1px solid #aaa;
}
#jcode {
width: 500px;
}
#gcode {
width: 300px;
}
#jcode, #gcode {
display: flex;
flex-direction: column;

File diff suppressed because it is too large Load diff

View file

@ -1,5 +1,5 @@
<!DOCTYPE html>
<html lang="en">
<html lang="en" data-app="kiri">
<head>
<meta charset="UTF-8">
<meta name="author" content="Stewart Allen">
@ -14,355 +14,58 @@
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="default">
<meta http-equiv="origin-trial" content="AobHyD9RXtmfFOTcY506ANNJjG8lYuuvQ3/C7YJvprSP6Kk2pjKIBSKAUbUh64Nx6aCZaqlZ+7sSSswiIFHflgYAAAB0eyJvcmlnaW4iOiJodHRwczovL2dyaWQuc3BhY2U6NDQzIiwiZmVhdHVyZSI6IlVucmVzdHJpY3RlZFNoYXJlZEFycmF5QnVmZmVyIiwiZXhwaXJ5IjoxNzY5NDcyMDAwLCJpc1N1YmRvbWFpbiI6dHJ1ZX0=">
<meta http-equiv="origin-trial" content="AvttY0bfMDdg4vBwjn5k4Yv/+OmqjNj4bTRvCgBpP7hkI6base2DxEViSebcOyglERiFV7g0DaVmI+yv79ftDw8AAAB0eyJvcmlnaW4iOiJodHRwczovL2dyaWQuc3BhY2U6NDQzIiwiZmVhdHVyZSI6IlVucmVzdHJpY3RlZFNoYXJlZEFycmF5QnVmZmVyIiwiZXhwaXJ5IjoxNzc5MTQ4ODAwLCJpc1N1YmRvbWFpbiI6dHJ1ZX0=">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover">
<title>Kiri:Moto</title>
<link rel="icon" href="favicon.ico">
<link rel="apple-touch-icon" href="favicon-mobile.png">
<script>
const isDark = localStorage['kiri-dark'] === 'true';
function setDarkLight(isDark) {
const dde = document.documentElement;
dde.setAttribute('data-theme', isDark ? 'dark' : 'light');
dde.style.background = isDark ? '#000000' : '#ffffff';
}
setDarkLight(isDark);
</script>
<link rel="icon" href="/icon/kirimoto.png">
<link rel="apple-touch-icon" href="/icon/kirimoto.png">
<link rel="stylesheet" type="text/css" href="/moto/palette.css">
<link rel="stylesheet" type="text/css" href="/moto/theme.css">
<link rel="stylesheet" type="text/css" href="/moto/menubar.css">
<link rel="stylesheet" type="text/css" href="index.css">
<link href="manifest.json" rel="manifest">
<link href="../font/css/all.min.css" rel="stylesheet">
<link href="/font/css/all.min.css" rel="stylesheet">
<!-- <script type="module" src="/lib/kiri/run/worker.js"></script> -->
<!-- <script type="module" src="/lib/kiri/run/minion.js"></script> -->
<script src="../lib/ext/tween.js"></script>
<script src="../font/js/all.min.js" crossorigin="anonymous" defer></script>
<script src="../lib/main/kiri.js" type="module"></script>
<script src="/lib/ext/tween.js"></script>
<script src="/font/js/all.min.js" crossorigin="anonymous" defer></script>
<script src="/lib/main/kiri.js" type="module"></script>
</head>
<body>
<div id="app" class="f-col">
<!-- hide page contents and provide loading message during initialization -->
<div id="curtain" class="j-center a-center"><img id="loading">Kiri:Moto is Loading</div>
<!-- when running iframed, provide a separator between the menu bar and enclosing page -->
<div id="top-sep"></div>
<!-- top menu bar -->
<div id="top" class="f-row">
<div class="f-row top-menu">
<span id="view-arrange">
<span><i class="fas fa-shapes"></i></span>
<label lk="arrange">arrange</label>
</span>
<span id="act-slice">
<span><i class="fas fa-bars"></i></span>
<label id="label-slice" title="generate layer slices" lk="slice">preview</label>
</span>
<span id="act-preview">
<span><i class="fas fa-layer-group"></i></span>
<label id="label-preview" title="show routing and paths" lk="preview">preview</label>
</span>
<span id="act-animate">
<span><i class="fas fa-film"></i></span>
<label id="label-animate" title="render routing on a mesh" lk="animate">animate</label>
</span>
<span id="act-export">
<span><i class="fas fa-file-download"></i></span>
<label id="label-export" title="generate gcode" lk="export">export</label>
</span>
</div>
<div class="grow"></div>
<div id="app-name" class="f-col a-center top-menu">
<span class="grow">
<span id="app-name-text" class="km-font">Kiri:Moto</span>
<div id="app-name-pop" class="top-menu-drop top-menu-center">
<div class="content">
<div>
<label id="app-info">version</label>
</div>
<hr width="100%">
<div>
<label id="app-mesh">mesh edit</label>
</div>
<hr>
<div id="install">
<label lk="install">install</label>
</div>
<div id="uninstall" class="hide">
<label lk="uninstall">uninstall</label>
</div>
<div id="app-quit" class="hide">
<label lk="quit">quit</label>
</div>
</div>
</div>
</span>
</div>
<div id="doit" class="f-row a-center">
<button id="undo"><i class="fas fa-undo-alt"></i></button>
<button id="redo"><i class="fas fa-redo-alt"></i></button>
</div>
<div class="grow"></div>
<div class="f-row top-menu">
<span>
<i class="fas fa-folder"></i>
<label lk="fe_menu">files</label>
<div class="top-menu-drop top-menu-right">
<div class="content">
<div id="file-new">
<label lk="new">new</label>
<span><i class="fas fa-file"></i></span>
</div>
<hr>
<div id="file-recent">
<label lk="recent">recent</label>
<span><i class="fas fa-list"></i></span>
</div>
<div id="file-import">
<label lk="import">import</label>
<span><i class="fas fa-file-upload"></i></span>
<!-- required file input loaders -->
<input id="load-file" type="file" name="loadme" style="display:none" accept=".km,.kmz,.stl,.obj,.svg,.png,.jpg,.jpeg,.gcode,.nc"></input>
</div>
<hr>
<div id="app-export">
<label lk="export">export</label>
<span><i class="fas fa-download"></i></span>
</div>
</div>
</div>
</span>
<span>
<i class="fas fa-eye"></i>
<label lk="vu_menu">view</label>
<div class="top-menu-drop top-menu-right">
<div class="content">
<div id="view-fit">
<label lk="contents">contents</label>
<span><i class="fas fa-expand"></i></span>
</div>
<div id="view-home">
<label lk="home">home</label>
<span><i class="fas fa-home"></i></span>
</div>
<hr>
<div id="view-top">
<label lk="top">top</label>
<span><i class="fas fa-square"></i></span>
</div>
<div id="view-front">
<label lk="front">top</label>
<span><i class="fas fa-square"></i></span>
</div>
<div id="view-back">
<label lk="back">top</label>
<span><i class="fas fa-square"></i></span>
</div>
<div id="view-left">
<label lk="left">top</label>
<span><i class="fas fa-square"></i></span>
</div>
<div id="view-right">
<label lk="right">top</label>
<span><i class="fas fa-square"></i></span>
</div>
<hr>
<div id="app-xpnd">
<label lk="fullscreen">fullscreen</label>
<span><i class="fas fa-maximize"></i></span>
</div>
</div>
</div>
</span>
<span>
<i class="fas fa-code-branch"></i>
<label lk="mo_menu">mode</label>
<div class="top-menu-drop top-menu-right">
<div class="content">
<div id="mode-fdm">
<label title="3D Additive Printing Processes">FDM</label>
<span><i class="fas fa-layer-group"></i></span>
</div>
<div id="mode-cam">
<label title="CNC Mills and Subtractive Processes">CNC</label>
<span><i class="fas fa-bore-hole"></i></span>
</div>
<div id="mode-sla">
<label title="mSLA Resin Printing">SLA</label>
<span><i class="fas fa-cube"></i></span>
</div>
<hr>
<div id="mode-laser">
<label title="Laser Cutting and Engraving">Laser</label>
<span><i class="fas fa-bolt"></i></span>
</div>
<div id="mode-wjet">
<label title="WaterJet Cutting">Water</label>
<span><i class="fas fa-location-pin"></i></span>
</div>
<div id="mode-wedm">
<label title="Wire EDM Cutting">Wire</label>
<span><i class="fas fa-ellipsis-vertical"></i></span>
</div>
<div id="mode-drag">
<label title="Drag Knife Cutting">Drag</label>
<span><i class="fas fa-caret-left"></i></span>
</div>
</div>
</div>
</span>
<span>
<i class="fas fa-cog"></i>
<label lk="su_menu">setup</label>
<div class="top-menu-drop top-menu-right">
<div class="content">
<div id="set-device">
<label lk="machines">machines</label>
<span><i class="fas fa-cube"></i></span>
</div>
<div id="set-profs">
<label lk="profs">profiles</label>
<span><i class="fas fa-sliders-h"></i></span>
</div>
<div id="set-tools">
<label lk="tools">tools</label>
<span><i class="fas fa-tools"></i></span>
</div>
<div id="set-prefs">
<label lk="prefs">prefs</label>
<span><i class="fa-solid fa-square-check"></i></span>
</div>
</div>
</div>
</span>
<span>
<i class="fas fa-question-circle"></i>
<label lk="info">info</label>
<div class="top-menu-drop top-menu-right">
<div class="content">
<div id="app-help">
<label lk="help">help</label>
</div>
<div id="app-don8">
<label lk="donate">donate</label>
</div>
</div>
</div>
</span>
<span>
<i class="fas fa-language"></i>
<div class="top-menu-drop top-menu-right">
<div class="content">
<div><label id="lset-zh">简体中文</label></div>
<div><label id="lset-da">dansk</label></div>
<div><label id="lset-de">deutsch</label></div>
<div><label id="lset-en">english</label></div>
<div><label id="lset-es">español</label></div>
<div><label id="lset-fr">français</label></div>
<div><label id="lset-pl" class="nocap">polski</label></div>
<div><label id="lset-pt">português</label></div>
</div>
</div>
</span>
<div id="menubar" class="f-row"></div>
<!-- modal progress overlay -->
<div id="progress-overlay" class="hide">
<div id="progress-indicator">
<div id="progress-ring"></div>
<div id="progress-pct"></div>
<div id="progtxt"></div>
</div>
</div>
<!-- line betwwen menu bar and main application windows -->
<div id="progress"><div id="progbar"></div><div id="progtxt">loading</div></div>
<!-- toolbar with mesh and rendering options -->
<div>
<div id="render-tools">
<span id="tool-nozzle"><i class="fas fa-location-pin" title="extruder"></i>
<div id="ft-nozzle" class="f-col pop"></div>
</span>
<span id="tool-rotate"><i class="fas fa-rotate-right" title="rotate selection"></i>
<div id="ft-rotate" class="grid pop">
<div id="rot_x_lt"><i class="fas fa-chevron-left"></i></div>
<label>X</label>
<div id="rot_x_gt"><i class="fas fa-chevron-right"></i></div>
<input id="rot_x" class="value center" size="6" value="90">
<div id="rot_y_lt"><i class="fas fa-chevron-left"></i></div>
<label>Y</label>
<div id="rot_y_gt"><i class="fas fa-chevron-right"></i></div>
<input id="rot_y" class="value center" size="6" value="90">
<div id="rot_z_lt"><i class="fas fa-chevron-left"></i></div>
<label>Z</label>
<div id="rot_z_gt"><i class="fas fa-chevron-right"></i></div>
<input id="rot_z" class="value center" size="6" value="90">
<div class="buttons f-row">
<button id="unrotate" class="grow" lk="reset">reset</button>
</div>
</div>
</span>
<span id="tool-scale"><i class="fas fa-expand" title="scale or resize selection"></i>
<div id="ft-scale" class="grid pop">
<div><label>X</label><input id="lock_x" type="checkbox" checked></div>
<div><label>Y</label><input id="lock_y" type="checkbox" checked></div>
<div><label>Z</label><input id="lock_z" type="checkbox" checked></div>
<label id="lab-axis" lk="axis">axis</label>
<input id="size_x" size="8" class="value">
<input id="size_y" size="8" class="value">
<input id="size_z" size="8" class="value">
<label id="lab-size" lk="size">size</label>
<input id="scale_x" size="8" class="value" value="1">
<input id="scale_y" size="8" class="value" value="1">
<input id="scale_z" size="8" class="value" value="1">
<label id="lab-scale" lk="scale">scale</label>
<div class="buttons f-row">
<button id="scale-reset" class="grow j-center">reset</button>
</div>
</div>
</span>
<span id="tool-mesh"><i class="fas fa-dice-d20"></i>
<div id="ft-mesh" class="grow f-col pop">
<div id="ft-mesh-btn">
<div><button id="mesh-merge" lk="rc_merg">Merge</button></div>
<div><button id="mesh-split" lk="rc_splt">Isolate Bodies</button></div>
<div><button id="mesh-export-obj" lk="rc_xobj">export OBJ</button></div>
<div><button id="mesh-export-stl" lk="rc_xstl">export STL</button></div>
</div>
</div>
</span>
<span id="context-mirror" xlk="rc_mirr">
<i class="fas fa-arrows-left-right-to-line"></i>
<div class="pop">mirror selection</div>
</span>
<span id="context-duplicate" xlk="rc_dupl">
<i class="fas fa-copy"></i>
<div class="pop">duplicate selection</div>
</span>
<span id="context-layflat" xlk="rc_lafl">
<i class="fas fa-arrows-down-to-line"></i>
<div class="pop">choose a face to place<br>on the work surface</div>
</span>
<span id="context-lefty" xlk="rc_lafl">
<i class="fas fa-arrows-down-to-line rot90"></i>
<div class="pop">choose a face to align<br>to the y axis</div>
</span>
<span id="context-setfocus" xlk="rc_focs">
<i class="fas fa-eye"></i>
<div class="pop">choose focal point<br>camera orbit center</div>
</span>
<span id="context-contents" xlk="rc_focs">
<i class="fas fa-arrows-to-circle"></i>
<div class="pop">fit workspace contents</div>
</span>
<span id="render-solid" class="j-center">
<i class="fas fa-square"></i>
<div class="pop">render objects solid</div>
</span>
<span id="render-wire" class="j-center">
<i class="fas fa-border-all"></i>
<div class="pop">render objects wireframe</div>
</span>
<span id="render-ghost" class="a-center">
<i class="fas fa-border-none"></i>
<div class="pop">render objects transparent</div>
</span>
<span id="render-edges" class="a-center">
<i class="fa-regular fa-square"></i>
<div class="pop">trace edges</div>
</span>
</div>
</div>
<div id="mode-tools"></div>
<div id="mid" class="grow f-row">
<!-- left settings menu -->
<div id="panel-left" class="f-col j-left">
<!-- <div class="line-sep2"></div> -->
<div id="slide-show"><span><i class="fa-solid fa-arrow-right"></i></span></div>
<div class="f-col grow settings">
<div id="panel-slide" class="f-col settings">
<div id="all-devpro" class="set2-group"></div>
<!-- FDM -->
<div id="fdm-layers" class="set2-group mode-fdm"></div>
<div id="fdm-walls" class="set2-group mode-fdm"></div>
@ -373,30 +76,28 @@
<div id="fdm-base" class="set2-group mode-fdm"></div>
<div id="fdm-support" class="set2-group mode-fdm"></div>
<div id="fdm-output" class="set2-group mode-fdm"></div>
<div id="fdm-expert" class="set2-group mode-fdm"></div>
<div id="fdm-expert" class="set2-group mode-fdm bottom"></div>
<!-- CAM -->
<div id="cam-tabs" class="set2-group mode-cam"></div>
<div id="cam-stock" class="set2-group mode-cam"></div>
<div id="cam-limits" class="set2-group mode-cam"></div>
<div id="cam-output" class="set2-group mode-cam"></div>
<div id="cam-origin" class="set2-group mode-cam"></div>
<div id="cam-expert" class="set2-group mode-cam"></div>
<div id="cam-expert" class="set2-group mode-cam bottom"></div>
<!-- LASER / 2D Cut Tools -->
<div id="lzr-slice" class="set2-group mode-laser"></div>
<div id="lzr-surface" class="set2-group mode-laser"></div>
<div id="lzr-knife" class="set2-group mode-laser"></div>
<div id="lzr-layout" class="set2-group mode-laser"></div>
<div id="lzr-output" class="set2-group mode-laser"></div>
<div id="lzr-output" class="set2-group mode-laser bottom"></div>
<!-- SLA -->
<div id="sla-slice" class="set2-group mode-sla"></div>
<div id="sla-layers" class="set2-group mode-sla"></div>
<div id="sla-base" class="set2-group mode-sla"></div>
<div id="sla-fill" class="set2-group mode-sla"></div>
<div id="sla-support" class="set2-group mode-sla"></div>
<div id="sla-output" class="set2-group mode-sla"></div>
<div id="sla-output" class="set2-group mode-sla bottom"></div>
</div>
<div class="line-sep2"></div>
<div class="chonk"></div>
</div>
<!-- main workspace -->
@ -422,7 +123,6 @@
</div>
<!-- CAM animation controls and readout -->
<div id="layer-animate" class="f-col a-center set2-group hide"></div>
<!-- <div id="layer-toolpos" class="f-row a-center hide"></div> -->
</div>
<!-- allows right tray to slide/hide but still show speeds menu -->
@ -432,21 +132,17 @@
</div>
<!-- vertical separation between workspace and right tray -->
<div id="panel-right" class="f-col j-start settings">
<div id="mode-info">
<div><label lk="mi_devi">Device</label><span id="mode-device"></span></div>
<div><label lk="mi_prof">Profile</label><span id="mode-profile"></span></div>
</div>
<div class="set2-group f-col">
<details open>
<summary class="set-header"><a>objects</a></summary>
<div id="ws-widgets" class="f-col"></div>
</details>
</div>
<div class="set2-group f-col mode-fdm">
<div class="set2-group f-col mode-fdm bottom">
<div class="set-header"><a>ranges</a></div>
<div id="fdm-ranges" class="f-col"></div>
</div>
<div class="set2-group f-col mode-cam">
<div class="set2-group f-col mode-cam bottom">
<details open>
<summary class="set-header mode-cam"><a>operation list</a></summary>
<div id="camops" class="f-col a-stretch grow">
@ -478,9 +174,6 @@
</div>
</details>
</div>
<div class="grow"></div>
<div class="line-sep2"></div>
<div class="chonk"></div>
</div>
</div>
</div>

View file

@ -65,6 +65,18 @@ self.lang['da-dk'] = {
view: "vis", // left view pop menu
wire: "tråd", // left render pop menu
volume: "volumen", // device build area
al_menu: "juster",
re_menu: "render",
sx_menu: "markering",
ed_menu: "rediger",
face_left: "venstre side",
re_edgs: "skift kanter",
al_menu: "juster",
re_menu: "render",
sx_menu: "markering",
ed_menu: "rediger",
face_left: "venstre side",
re_edgs: "skift kanter",
acct_xpo: ["lav en sikkerhedskopi af din enhed","og enhedsprofiler med mulighed for at","medtage arbejdsområdeobjekter og positioner"],
@ -80,8 +92,8 @@ self.lang['da-dk'] = {
rc_xobj: "eksporter OBJ",
rc_xstl: "eksporter STL",
sb_info: ["print hastighed","i mm/s"],
rc_merg: "flet objekt meshes",
rc_splt: "isoler legemer",
rc_merg: "flet objekter",
rc_splt: "isoler objekter",
// DEVICE MENU and related dialogs
dm_sldt: "vælg en enhedstype",
@ -712,6 +724,10 @@ self.lang['da-dk'] = {
ct_nabl_s: "auto",
ct_nabl_l: ["auto generer radiale tapper","projekteret fra del center","ved brug af antal og vinkel forskydning"],
// CNC AREA OP
ca_fini_s: "efterbehandlings snit",
ca_fini_l: "skærebane der følger konturen af den endelige del. tillader præcis step over ved rydning af større område.",
// OUTPUT
ou_menu: "output",

View file

@ -66,6 +66,18 @@ self.lang['de-de'] = {
view: "Ansicht", // left view pop menu
wire: "Drahtansicht", // left render pop menu
volume: "Volumen", // device build area
al_menu: "ausrichten",
re_menu: "rendern",
sx_menu: "auswahl",
ed_menu: "Bearbeiten",
face_left: "linke seite",
re_edgs: "kanten umschalten",
al_menu: "ausrichten",
re_menu: "rendern",
sx_menu: "auswahl",
ed_menu: "Bearbeiten",
face_left: "linke seite",
re_edgs: "kanten umschalten",
acct_xpo: ["Lege ein Backup Deiner Geräte","und Geräte-Profile an, mit der","Option, den Arbeitsbereich und","mit Objekten und Anordnung zu speichern"],
@ -81,8 +93,8 @@ self.lang['de-de'] = {
rc_xobj: "Als OBJ exportieren",
rc_xstl: "Als STL exportieren",
sb_info: ["Druckgeschwindigkeit","in mm/s"],
rc_merg: "Objekt-Meshes zusammenführen",
rc_splt: "Körper isolieren",
rc_merg: "Objekte zusammenführen",
rc_splt: "Objekte isolieren",
// DEVICE MENU and related dialogs
dm_sldt: "Wähle einen Geräte-Typ aus",
@ -713,6 +725,10 @@ self.lang['de-de'] = {
ct_nabl_s: "Auto",
ct_nabl_l: ["Radiale Haltestege automatisch generieren","projiziert von Teil-Mitte","mit Anzahl und Winkel-Offset"],
// CNC AREA OP
ca_fini_s: "Schlichtwerkzeugweg",
ca_fini_l: "Schneidpfad, der der Kontur des Endteils folgt. ermöglicht präzisen Vorschub beim Räumen größerer Bereiche.",
// OUTPUT
ou_menu: "Ausgabe",

View file

@ -67,6 +67,18 @@ self.lang['en-us'] = {
view: "view", // left view pop menu
wire: "wire", // left render pop menu
volume: "volume", // device build area
al_menu: "align",
re_menu: "render",
sx_menu: "selection",
ed_menu: "edit",
face_left: "face left",
re_edgs: "toggle edges",
al_menu: "align",
re_menu: "render",
sx_menu: "selection",
ed_menu: "edit",
face_left: "face left",
re_edgs: "toggle edges",
acct_xpo: ["make a backup of your device","and device profiles with the","option to include workspace","objects and positions"],
@ -82,8 +94,8 @@ self.lang['en-us'] = {
rc_xobj: "export OBJ",
rc_xstl: "export STL",
sb_info: ["print speed","in mm/s"],
rc_merg: "merge object meshes",
rc_splt: "isolate bodies",
rc_merg: "merge objects",
rc_splt: "isolate objects",
// DEVICE MENU and related dialogs
dm_sldt: "select a device type",
@ -472,7 +484,7 @@ self.lang['en-us'] = {
sp_offs_s: "part offset",
sp_offs_l: ["offset from part","in millimeters"],
sp_gaps_s: "layer gap",
sp_gaps_l: ["number of layers","offset from part"],
sp_gaps_l: ["add a layer gap between support and part"],
sp_span_s: "max span",
sp_span_l: ["unsupported span that causes","a new support to be generated","in millimeters"],
sp_angl_s: "angle",
@ -504,6 +516,8 @@ self.lang['en-us'] = {
cc_thru_l: ["allow trace depth to extend thru","the bottom of the selected area","use with negative Z bottom"],
cc_offd_s: "offset",
cc_offd_l: ["overrides default offset distance (which is the tool radius) when set to any value but zero"],
cc_offz_s: "offset z",
cc_offz_l: ["shift add or subtract Z values by this amount","in workspace units"],
cc_feed_s: "feed rate",
cc_feed_l: ["max cutting speed in","workspace units / minute"],
cc_plng_s: "plunge rate",
@ -549,6 +563,8 @@ self.lang['en-us'] = {
co_menu: "outline",
co_merg_s: "merge overlap",
co_merg_l: ["merge overlapping lines to prevent overcutting into adjacent solids"],
co_igno_s: "ignore part",
co_igno_l: ["do not constrain cutting areas","to part boundaries. this allows","using the part as negative space"],
co_dogb_s: "dogbones",
co_dogb_l: ["insert dogbone cuts","into inside corners"],
co_dogr_s: "reverse bones",
@ -724,6 +740,8 @@ self.lang['en-us'] = {
ca_sang_l: "crossing angle on the XY plane for contour lines",
ca_wall_s: "walls",
ca_wall_l: ["perform a single pass along vertical faces. leave interior spaces. similar to outline operation"],
ca_fini_s: "finish cut",
ca_fini_l: "cutting path that follows the contour of the final part. allows for precise step over when clearing a larger area.",
// OUTPUT
ou_menu: "output",

View file

@ -66,6 +66,18 @@ self.lang['es-es'] = {
view: "vista", // left view pop menu
wire: "alambre", // left render pop menu
volume: "volumen", // device build area
al_menu: "alinear",
re_menu: "renderizar",
sx_menu: "selección",
ed_menu: "editar",
face_left: "cara izquierda",
re_edgs: "alternar bordes",
al_menu: "alinear",
re_menu: "renderizar",
sx_menu: "selección",
ed_menu: "editar",
face_left: "cara izquierda",
re_edgs: "alternar bordes",
acct_xpo: ["hace una copia de seguridad de su dispositivo","y perfiles de dispositivo con la ","opción de incluir espacio de trabajo","objetos y posiciones"],
@ -81,8 +93,8 @@ self.lang['es-es'] = {
rc_xobj: "exportar OBJ",
rc_xstl: "exportar STL",
sb_info: ["velocidad de impresión","en mm/s"],
rc_merg: "fusionar mallas de objeto",
rc_splt: "aislar cuerpos",
rc_merg: "fusionar objetos",
rc_splt: "aislar objetos",
// DEVICE MENU and related dialogs
dm_sldt: "seleccionar un tipo de dispositivo",
@ -713,6 +725,10 @@ self.lang['es-es'] = {
ct_nabl_s: "automático",
ct_nabl_l: ["generar automáticamente pestañas radiales","proyectadas desde el centro de la pieza","usando cantidad y desplazamiento de ángulo"],
// CNC AREA OP
ca_fini_s: "corte de acabado",
ca_fini_l: "trayectoria de corte que sigue el contorno de la pieza final. permite un paso preciso al limpiar un área más grande.",
// OUTPUT
ou_menu: "salida",

View file

@ -66,6 +66,18 @@ self.lang['fr-fr'] = {
view: "vue", // left view pop menu
wire: "filaire", // left render pop menu
volume: "volume", // device build area
al_menu: "aligner",
re_menu: "rendu",
sx_menu: "sélection",
ed_menu: "éditer",
face_left: "face gauche",
re_edgs: "basculer arêtes",
al_menu: "aligner",
re_menu: "rendu",
sx_menu: "sélection",
ed_menu: "éditer",
face_left: "face gauche",
re_edgs: "basculer arêtes",
acct_xpo: ["faites une sauvegarde de votre appareil","et des profils d'appareil avec","l'option d'inclure les objets","de l'espace de travail et les positions"],
@ -81,8 +93,8 @@ self.lang['fr-fr'] = {
rc_xobj: "exporter OBJ",
rc_xstl: "exporter STL",
sb_info: ["vitesse d'impression","en mm/s"],
rc_merg: "fusionner les maillages d'objets",
rc_splt: "isoler les corps",
rc_merg: "fusionner les objets",
rc_splt: "isoler les objets",
// DEVICE MENU and related dialogs
dm_sldt: "sélectionner un type d'appareil",
@ -713,6 +725,10 @@ self.lang['fr-fr'] = {
ct_nabl_s: "auto",
ct_nabl_l: ["générer automatiquement des pattes radiales","projetées depuis le centre de la pièce","en utilisant le nombre et le décalage d'angle"],
// CNC AREA OP
ca_fini_s: "coupe de finition",
ca_fini_l: "chemin de coupe qui suit le contour de la pièce finale. permet un pas précis lors du dégagement d'une zone plus large.",
// OUTPUT
ou_menu: "sortie",

View file

@ -65,6 +65,18 @@ self.lang['pl-pl'] = {
view: "widok", // left view pop menu
wire: "szkielet", // left render pop menu
volume: "objętość", // device build area
al_menu: "wyrównaj",
re_menu: "renderuj",
sx_menu: "zaznaczenie",
ed_menu: "edytuj",
face_left: "lewa ściana",
re_edgs: "przełącz krawędzie",
al_menu: "wyrównaj",
re_menu: "renderuj",
sx_menu: "zaznaczenie",
ed_menu: "edytuj",
face_left: "lewa ściana",
re_edgs: "przełącz krawędzie",
acct_xpo: ["zrób kopię zapasową urządzenia","i profilów urządzenia z","opcją dołączenia obiektów","w przestrzeni roboczej i ich pozycji"],
@ -80,8 +92,8 @@ self.lang['pl-pl'] = {
rc_xobj: "eksportuj OBJ",
rc_xstl: "eksportuj STL",
sb_info: ["prędkość druku","w mm/s"],
rc_merg: "połącz siatki obiektu",
rc_splt: "wyizoluj bryły",
rc_merg: "połącz obiekty",
rc_splt: "wyizoluj obiekty",
// DEVICE MENU and related dialogs
dm_sldt: "wybierz typ urządzenia",
@ -712,6 +724,10 @@ self.lang['pl-pl'] = {
ct_nabl_s: "auto",
ct_nabl_l: ["automatycznie generuj wypustki promieniowe","rzutowane od środka części","używając liczby i przesunięcia kąta"],
// CNC AREA OP
ca_fini_s: "cięcie wykończeniowe",
ca_fini_l: "ścieżka cięcia podążająca za konturem ostatecznej części. pozwala na precyzyjny krok przy usuwaniu większego obszaru.",
// OUTPUT
ou_menu: "wyjście",

View file

@ -66,6 +66,18 @@ self.lang['pt-pt'] = {
view: "visualizar", // left view pop menu
wire: "aramado", // left render pop menu
volume: "volume", // device build area
al_menu: "alinhar",
re_menu: "renderizar",
sx_menu: "seleção",
ed_menu: "editar",
face_left: "face esquerda",
re_edgs: "alternar arestas",
al_menu: "alinhar",
re_menu: "renderizar",
sx_menu: "seleção",
ed_menu: "editar",
face_left: "face esquerda",
re_edgs: "alternar arestas",
acct_xpo: ["faça uma cópia de segurança do seu dispositivo","e perfis de dispositivo com a opção","de incluir objectos e posições","do espaço de trabalho"],
@ -81,8 +93,8 @@ self.lang['pt-pt'] = {
rc_xobj: "exportar OBJ",
rc_xstl: "exportar STL",
sb_info: ["velocidade de impressão","em mm/s"],
rc_merg: "fundir malhas de objecto",
rc_splt: "isolar corpos",
rc_merg: "fundir objectos",
rc_splt: "isolar objectos",
// DEVICE MENU and related dialogs
dm_sldt: "seleccione um tipo de dispositivo",
@ -713,6 +725,10 @@ self.lang['pt-pt'] = {
ct_nabl_s: "automático",
ct_nabl_l: ["gerar automaticamente abas radiais","projectadas do centro da peça","usando número e desvio de ângulo"],
// CNC AREA OP
ca_fini_s: "corte de acabamento",
ca_fini_l: "caminho de corte que segue o contorno da peça final. permite passo preciso ao limpar uma área maior.",
// OUTPUT
ou_menu: "saída",

View file

@ -65,6 +65,12 @@ self.lang['zh'] = {
view: "视图", // 左侧视图弹出菜单
wire: "线框", // 左侧渲染弹出菜单
volume: "体积", // 设备构建区域
al_menu: "对齐",
re_menu: "渲染",
sx_menu: "选择",
ed_menu: "编辑",
face_left: "面朝左",
re_edgs: "切换边线",
acct_xpo: ["备份您的设备及","设备配置文件,","可选择包括工作区、","对象及位置"],
@ -80,8 +86,8 @@ self.lang['zh'] = {
rc_xobj: "导出OBJ",
rc_xstl: "导出STL",
sb_info: ["打印速度","单位:毫米/秒"],
rc_merg: "合并对象网格",
rc_splt: "分离实体",
rc_merg: "合并对象",
rc_splt: "分离对象",
// 设备菜单及相关对话框
dm_sldt: "选择设备类型",
@ -712,6 +718,10 @@ self.lang['zh'] = {
ct_nabl_s: "自动",
ct_nabl_l: ["自动生成径向连接片","从零件中心投影","使用数量和角度偏移"],
// 数控区域操作
ca_fini_s: "精加工切削",
ca_fini_l: "遵循最终零件轮廓的切削路径。允许在清理较大区域时精确步进。",
// 输出
ou_menu: "输出",

View file

@ -1,5 +1,5 @@
{
"name": "Kiri:Moto 4.6.0",
"name": "Kiri:Moto 4.7.0",
"short_name": "Kiri:Moto",
"description": "Slicer for 3D printers, CNC mills, laser cutters and more",
"start_url": "/boot/index.html",
@ -9,7 +9,6 @@
"background_color": "#ffffff",
"orientation": "landscape-primary",
"icons": [
{ "src": "./logo-cube-512.png", "type": "image/png", "sizes": "512x512" },
{ "src": "./logo-cube-144.png", "type": "image/png", "sizes": "144x144" }
{ "src": "/icon/kirimoto.png", "type": "image/png", "sizes": "512x512" }
]
}

View file

@ -1,11 +1,10 @@
:root {
--accent: #5a9fd4;
--menu-blue: #0079ff;
--menu-back: rgba(255,255,255,0.55);
--dark-menu-back: rgba(80,80,80,0.75);
--border: #888;
--dark-border: #888;
--selected: rgba(0,255,0,0.5);
--selected-hover: rgba(0,255,0,0.8);
--menu-back: rgba(60,60,60,0.75);
--border: #444;
--selected: rgba(90,159,212,0.5);
--selected-hover: rgba(90,159,212,1);
}
@font-face {
@ -54,12 +53,18 @@ input {
font-family: sans-serif;
font-weight: normal;
font-size: larger;
background: #0f1116;
bottom: 0;
right: 0;
left: 0;
top: 0;
}
#app.booting #top,
#app.booting #app-body {
pointer-events: none;
}
#app-body {
flex-grow: 1;
}
@ -75,8 +80,13 @@ input {
right: 0;
bottom: 0;
position: fixed;
background-color: #fff;
background: radial-gradient(circle at 50% 40%, #1a2436 0%, #0f1116 60%, #0a0c11 100%);
color: #d7deea;
font-family: 'Russo One', sans-serif;
font-size: 16px;
letter-spacing: 0.08em;
text-transform: uppercase;
text-shadow: 0 1px 2px rgba(0,0,0,0.35);
justify-content: center;
align-items: center;
}
@ -84,6 +94,7 @@ input {
#container {
z-index: 1;
position: fixed;
background: #0f1116;
width: 100%;
height: 100%;
}
@ -94,14 +105,9 @@ input {
overflow: hidden;
}
.dark #top {
color: #eee;
background-color: var(--dark-menu-back);
}
#top {
z-index: 50;
color: #000;
color: #eee;
font-size: 14px;
flex-direction: row;
background-color: var(--menu-back);
@ -126,6 +132,10 @@ input {
margin-bottom: -14px !important;
}
#modal button {
border-radius: 3px;
}
button {
padding: 2px 3px 2px 3px;
border: 1px solid rgba(150,150,150,0.5);
@ -134,12 +144,8 @@ button {
outline: none;
}
.dark button:hover {
background-color: rgba(220,220,220,1);
}
button:hover {
background-color: rgba(210,210,210,1);
background-color: rgba(220,220,220,1);
}
/** misc ui **/
@ -168,47 +174,85 @@ button:hover {
padding: 0 !important;
}
.menu, #top-right > div {
.title {
cursor: default;
align-self: stretch;
align-items: center;
margin: 4px 0 4px 0;
padding: 4px 12px 4px 12px;
border-radius: 0;
user-select: none;
font-weight: bold;
color: var(--accent);
}
.menubar-separator {
align-self: stretch;
align-items: center;
background: rgba(255,255,255,0.2);
margin: 5px;
width: 1px;
}
.toolbar-separator {
align-self: stretch;
align-items: center;
background: rgba(255,255,255,0.2);
margin: 2px;
height: 1px;
}
.menu, #top-doc-name, #top-mode-label {
cursor: default;
align-self: stretch;
align-items: center;
padding: 8px 12px 8px 12px;
border: 1px solid transparent;
border-radius: 6px;
user-select: none;
margin: 2px;
}
.dark .menu hr {
.menu hr {
border-top: 0.5px solid rgba(255,255,255,0.5);
}
.menu:hover, .menu-items > div:hover, .tools i:hover {
background-color: var(--menu-blue);
border: 1px solid var(--accent);
background-color: rgba(0,0,0,0.5);
}
.menu:hover .menu-items {
display: flex;
}
.dark .menu-items {
background: #666;
border: 1px solid #999;
}
.menu-items {
display: none;
position: absolute;
flex-direction: column;
border: 1px solid #bbb;
border: 1px solid var(--border);
border-radius: 6px;
background: #eee;
background: var(--menu-back);
padding: 4px;
top: 100%;
top: calc(100% + 3px);
left: 0;
gap: 6px;
}
/* invisible bridge between menu label and pop menu */
.menu-items::before {
content: "";
position: absolute;
top: -20px;
left: -10px;
right: -10px;
height: calc(100% + 20px);
background: transparent;
}
.menu-items > div {
gap: 15px;
border: 1px solid transparent;
border-radius: 6px;
padding: 4px 8px 4px 8px;
}
@ -221,39 +265,6 @@ button:hover {
display: flex;
}
#mode-label {
display: none;
position: absolute;
text-transform: capitalize;
padding: 2px 4px 2px 4px;
background-color: rgba(0,200,0,0.35);
border: 1px solid rgba(0,0,0,0.25);
border-radius: 3px;
transform: translateX(-50%);
top: calc(100% + 2px);
left: 50%;
}
#mode-label:before {
content: '';
position: absolute;
top: -10px; /* Adjust to position the caret above the menu */
left: 50%;
transform: translateX(-50%);
border-width: 5px;
border-style: solid;
border-color: transparent transparent #777 transparent;
}
.dark #mode-label:before {
border-color: transparent transparent #ddd transparent;
}
.dark #mode-label {
background-color: rgba(0,200,0,0.65);
border-color: rgba(255,255,255,0.25);
}
#top-mid {
flex-grow: 1;
}
@ -268,6 +279,30 @@ button:hover {
gap: 8px;
}
#top-mode-label {
color: var(--accent);
white-space: nowrap;
justify-content: flex-end;
text-transform: capitalize;
}
#top-doc-name {
cursor: pointer;
max-width: 320px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
justify-content: flex-end;
border-color: #404040;
background-color: #202020;
transition: border-color 0.15s, color 0.15s;
}
#top-doc-name:hover {
border-color: var(--accent);
background-color: rgba(0,0,0,0.5);
}
/** specific modal dialogs */
.export {
@ -313,6 +348,52 @@ button:hover {
text-align: center;
}
.doc-open-list {
display: flex;
flex-direction: column;
min-width: 420px;
max-height: 60vh;
overflow: auto;
gap: 6px;
}
.doc-open-row {
display: flex;
align-items: center;
gap: 8px;
border: 1px solid var(--menu-border, #bbb);
border-radius: 6px;
padding: 6px 8px;
}
.doc-open-row:hover {
background-color: var(--menu-blue);
}
.doc-open-name {
flex: 1;
text-align: left;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.doc-open-empty {
padding: 8px;
text-align: center;
opacity: 0.7;
}
.doc-open-new {
width: 100%;
}
.doc-open-del {
min-width: 28px;
padding: 2px 8px;
font-weight: 700;
}
.image-import {
flex-direction: column;
gap: 3px;
@ -348,12 +429,18 @@ button:hover {
}
#modal_frame {
border-radius: 4px !important;
background-color: #fff !important;
background-color: rgba(30,30,30,0.9);
border: 1px solid var(--border);
border-radius: 4px;
color: white;
flex-direction: column;
padding: 0 !important; /* override common below */
/* z-index: 51; */
gap: 2px;
margin: 0 0 2px 0;
padding: 3px;
}
#modal_frame a {
color: var(--accent);
}
#modal_frame > div {
@ -362,10 +449,10 @@ button:hover {
}
#modal_title {
border-top-left-radius: 4px;
border-top-right-radius: 4px;
border-bottom: 1px solid gray;
background-color: rgba(0,0,0,0.2);
color: white;
border-radius: 2px;
border-bottom: 1px solid rgba(0,0,0,0.2);
background-color: rgba(60,60,60,0.7);
font-family: 'Russo One', monospace;
font-size: smaller;
justify-content: center;
@ -374,13 +461,13 @@ button:hover {
#modal_title_close {
position: absolute;
color: #555;
color: #999;
right: 3px;
top: 2px;
}
#modal_title_close:hover {
color: black;
color: #eee;
}
/** welcome dialog **/
@ -394,13 +481,12 @@ button:hover {
}
.welcome a {
color: #038;
border-radius: 3px;
padding: 0 10px 0 10px;
padding: 2px 10px 2px 10px;
}
.welcome a:hover {
background-color: #ddd;
background-color: #111;
}
.welcome .choice {
@ -412,18 +498,18 @@ button:hover {
.settings {
gap: 5px;
display: grid;
background-color: #fff;
/* background-color: #fff; */
grid: min-content 1fr / min-content 1fr;
grid-template-columns: 1fr 1fr 1fr;
}
.settings > div {
display: grid;
background-color: #f5f5f5;
background-color: rgba(0,0,0,0.1);
grid: min-content 1fr / min-content 1fr;
white-space: nowrap;
align-items: center;
border: 1px solid #ddd;
border: 1px solid rgba(100,100,100,0.7);
border-radius: 3px;
padding: 3px;
}
@ -433,7 +519,7 @@ button:hover {
text-align: center;
margin-bottom: 5px;
border-radius: 3px;
background-color: #ccc;
background-color: rgba(100,100,100,0.8);
padding: 0;
}
@ -477,12 +563,8 @@ button:hover {
/** common look & feel */
.dark #modal_frame, .dark #actions > div, .dark #grouplist > div {
border: 1px solid #999;
}
#modal_frame, #actions > div, #grouplist > div {
border: 1px solid gray;
#actions > div, #grouplist > div {
border: 1px solid #555;
border-radius: 3px;
margin: 0 0 2px 0;
padding: 3px;
@ -502,24 +584,18 @@ button:hover {
background-color: var(--selected-hover);
}
/* .dark .head {
/* .head {
color: #000 !important;
} */
/** slide in/out logging window **/
.dark #logger {
border-color: var(--dark-border);
background-color: var(--dark-menu-back);
color: #ddd;
}
#logger {
border-top: 1px solid var(--border);
border-right: 1px solid var(--border);
background-color: var(--menu-back);
display: none;
color: #555;
color: #ddd;
min-width: 300px;
flex-direction: column;
position: absolute;
@ -561,28 +637,24 @@ button:hover {
border-right: 1px solid var(--border);
}
.dark .tools {
border-color: var(--dark-border);
background-color: var(--dark-menu-back);
}
.dark .tools > div {
color: #fff;
}
.tools {
align-items: flex-start;
background-color: var(--menu-back);
padding-top: 2px;
}
.tools > div {
color: #fff;
display: grid;
grid-template-columns: 1fr;
margin: 2px;
}
.tools i {
padding: 9px;
border-bottom: 1px solid var(--border);
border: 1px solid transparent;
border-radius: 6px;
/* border-bottom: 1px solid var(--border); */
}
.tool > div {
@ -597,11 +669,6 @@ button:hover {
width: 100%;
}
.dark .tool label {
background-color: var(--dark-menu-back);
border: 1px solid var(--dark-border);
}
.tool label:before {
content: '';
position: absolute;
@ -610,10 +677,6 @@ button:hover {
transform: translateY(-50%);
border-width: 6px;
border-style: solid;
border-color: transparent #777 transparent transparent;
}
.dark .tool label:before {
border-color: transparent #ddd transparent transparent;
}
@ -715,14 +778,10 @@ button:hover {
margin: 0;
}
.dark #grouplist .models .square > svg {
color: #333;
}
#grouplist .models .square > svg {
aspect-ratio: 1;
max-height: 20px;
color: #666;
color: #333;
}
#grouplist .models > div {
@ -851,21 +910,15 @@ button:hover {
transform: translate(-50%, 50%);
}
.dark #pinner {
background-color: rgba(255,255,255,0.15);
border-color: rgba(255,255,255,0.25);
border-top-color: rgba(255,255,255,0.6);
}
#pinner {
z-index: 5000;
display: none;
width: 50px;
height: 50px;
background-color: rgba(0,0,0,0.1);
border: 12px solid rgba(0,0,0,0.15);
background-color: rgba(255,255,255,0.15);
border: 12px solid rgba(255,255,255,0.25);
border-radius: 50%;
border-top-color: rgba(0,0,0,0.6);
border-top-color: rgba(255,255,255,0.6);
animation: spin 1.5s linear infinite;
}

View file

@ -1,5 +1,5 @@
<!DOCTYPE html>
<html lang="en">
<html lang="en" data-app="mesh" data-theme="dark">
<head>
<meta charset="UTF-8">
<meta name="author" content="Stewart Allen">
@ -11,15 +11,16 @@
<meta property="og:type" content="website">
<meta property="og:url" content="https://grid.space/mesh/">
<title>Mesh:Tool</title>
<link rel="icon" href="favicon.ico">
<link rel="icon" href="/icon/meshtool.png">
<link rel="stylesheet" type="text/css" href="/moto/palette.css">
<link rel="stylesheet" type="text/css" href="index.css">
<link href="../font/css/all.min.css" rel="stylesheet">
<link href="../fon2/bootstrap-icons.min.css" rel="stylesheet">
<!-- <script type="module" src="/lib/mesh/work.js"></script> -->
<!-- <script src="../lib/ext/earcut.js" type="module"></script> -->
<script src="../lib/ext/tween.js"></script>
<script src="../font/js/all.min.js" crossorigin="anonymous"></script>
<script src="../lib/main/mesh.js" type="module"></script>
<!-- <script src="/lib/ext/earcut.js" type="module"></script> -->
<script src="/lib/ext/tween.js"></script>
<script src="/font/js/all.min.js" crossorigin="anonymous"></script>
<script src="/lib/main/mesh.js" type="module"></script>
</head>
<body>
<div id="app">

172
web/moto/menubar.css Normal file
View file

@ -0,0 +1,172 @@
#menubar {
position: relative;
z-index: 50;
background-color: var(--menubar-back);
color: var(--menubar-fore);
text-transform: capitalize;
align-items: center;
border-bottom: 1px solid var(--border-gray);
}
#menubar.top{
border-top: 1px solid var(--border-gray);
}
.menubar-separator {
align-self: stretch;
align-items: center;
background: var(--menubar-vsep);
margin: 5px;
width: 1px;
}
.menubar-appname,
.menubar-mode {
color: var(--appname-blue);
cursor: default;
align-self: stretch;
align-items: center;
margin: 4px 0 4px 0;
padding: 4px 12px 4px 12px;
border-radius: 0;
user-select: none;
}
.menubar-appname {
font-weight: bold;
}
#menubar .top-menu {
display: flex;
align-items: stretch;
white-space: nowrap;
}
#menubar .top-menu > span {
cursor: default;
position: relative;
display: flex;
gap: 8px;
align-items: center;
margin: 2px;
padding: 8px 12px;
border: 1px solid transparent;
border-radius: 6px;
user-select: none;
}
#menubar .top-menu > span:hover {
border-color: var(--appname-blue);
background-color: var(--menu-hover-bg);
}
#menubar .top-menu > span:hover .top-menu-drop {
display: flex;
}
#menubar .top-menu > span > .pop {
display: none;
position: absolute;
top: 100%;
left: 0;
z-index: 90;
margin-top: 3px;
border: 1px solid var(--border-gray);
border-radius: 6px;
background: var(--menubar-back);
color: var(--menubar-fore);
padding: 4px;
}
#menubar .top-menu > span > .pop::before {
content: "";
position: absolute;
top: -6px;
left: 0;
right: 0;
height: 6px;
background: transparent;
}
#menubar .top-menu > span:hover > .pop {
display: flex;
}
#menubar #ft-rotate.pop,
#menubar #ft-scale.pop {
display: none;
}
#menubar #tool-rotate:hover #ft-rotate.pop,
#menubar #tool-scale:hover #ft-scale.pop {
display: grid;
}
#menubar .top-menu label,
#menubar .top-menu svg {
color: inherit;
}
#menubar .top-menu hr {
width: 100%;
margin: 0;
border: 0;
border-top: 0.5px solid var(--menubar-vsep);
}
#menubar .top-menu-drop {
display: none;
position: absolute;
top: 100%;
left: 0;
z-index: 90;
font-family: sans-serif;
padding-top: 3px;
}
#menubar .top-menu-right {
left: auto;
right: 0;
}
#menubar .top-menu-drop .content {
display: flex;
flex-direction: column;
gap: 6px;
border: 1px solid var(--border-gray);
border-radius: 6px;
background: var(--menubar-back);
color: var(--menubar-fore);
padding: 4px;
}
#menubar .top-menu-drop .content > div {
display: flex;
align-items: center;
gap: 15px;
border: 1px solid transparent;
border-radius: 6px;
padding: 4px 8px;
}
#menubar .top-menu-drop .content > div > label {
flex-grow: 1;
text-align: left;
}
#menubar .top-menu-drop .content > div > span {
display: flex;
justify-content: flex-end;
min-width: 16px;
}
#menubar .top-menu-drop .content > div:hover {
border-color: var(--appname-blue);
background-color: var(--menu-hover-bg);
}
#menubar .top-menu-drop .content > div.selected,
#menubar .top-menu > span.selected {
border-color: var(--appname-blue);
background-color: var(--menu-active-bg);
}

71
web/moto/palette.css Normal file
View file

@ -0,0 +1,71 @@
/* Shared color tokens for Kiri / Mesh / Void.
* Phase 1: define semantic palette + compatibility aliases.
* App CSS keeps final say by overriding locally as migration proceeds.
*/
:root {
--appname-blue: #5a9fd4;
--menubar-vsep: rgba(0,0,0,0.2);
--menubar-back: rgba(245,245,245,1);
--menubar-fore: rgba(20,20,20,1.0);
--menu-hover-bg: rgba(250,250,250,1);
--menu-active-bg: rgba(90,159,212,0.4);
--border-gray: rgba(128,128,128,0.5);
--ui-text: #222;
--ui-text-muted: #888;
--ui-border: #ddd;
--ui-border-strong: #777;
--ui-hr: #ddd;
--ui-input-bg: #e8e8e8;
--ui-input-fg: #222;
--ui-input-disabled-bg: #ddd;
--ui-input-disabled-fg: #000;
--ui-select-bg: #e8e8e8;
--ui-option-selected-bg: var(--appname-blue);
--ui-textarea-bg: #fff;
--ui-textarea-fg: #222;
--ui-button-bg: #eee;
--ui-button-fg: #222;
--ui-button-border: #ccc;
--ui-button-hover-bg: #5a9fd4;
--ui-button-hover-fg: #fff;
--ui-button-disabled-fg: #999;
--ui-dialog-bg: rgba(255,255,255,0.85);
--ui-dialog-fg: #222;
--ui-dialog-border-top: rgba(180,180,180,1);
--ui-dialog-border-bottom: rgba(180,180,180,1);
}
:root.dark,
:root[data-theme="dark"] {
--appname-blue: #5a9fd4;
--menubar-vsep: rgba(255,255,255,0.2);
--menubar-back: rgba(40,40,40,1);
--menubar-fore: rgba(250,250,250,1.0);
--menu-hover-bg: rgba(0,0,0,0.5);
--menu-active-bg: rgba(90,159,212,0.5);
--border-gray: rgba(128,128,128,0.5);
--ui-text: #fff;
--ui-text-muted: #888;
--ui-border: #444;
--ui-border-strong: #666;
--ui-hr: #555;
--ui-input-bg: #333;
--ui-input-fg: #fff;
--ui-input-disabled-bg: #444;
--ui-input-disabled-fg: #888;
--ui-select-bg: #333;
--ui-option-selected-bg: var(--blue-1, #5a9fd4);
--ui-textarea-bg: #333;
--ui-textarea-fg: #fff;
--ui-button-bg: #555;
--ui-button-fg: #fff;
--ui-button-border: #777;
--ui-button-hover-bg: var(--blue-2, #7e99b7);
--ui-button-hover-fg: #000;
--ui-button-disabled-fg: #888;
--ui-dialog-bg: rgba(60,60,60,0.85);
--ui-dialog-fg: #fff;
--ui-dialog-border-top: rgba(100,100,100,1);
--ui-dialog-border-bottom: rgba(100,100,100,1);
}

70
web/moto/theme.css Normal file
View file

@ -0,0 +1,70 @@
/* Shared theme rules.
* Phase 1 scope: Kiri fundamentals only.
*/
:root[data-app="kiri"] {
color: var(--ui-text);
}
:root[data-app="kiri"] hr {
border-color: var(--ui-hr);
}
:root[data-app="kiri"] input,
:root[data-app="kiri"] select,
:root[data-app="kiri"] option {
border-style: solid;
border-width: 0px;
border-color: var(--ui-border);
background-color: var(--ui-input-bg);
color: var(--ui-input-fg);
border-bottom-width: 1px;
}
:root[data-app="kiri"] select {
background-color: var(--ui-select-bg);
}
:root[data-app="kiri"] option:checked {
background-color: var(--ui-option-selected-bg);
}
:root[data-app="kiri"] input[disabled] {
border-color: var(--ui-border-strong);
background-color: var(--ui-input-disabled-bg);
color: var(--ui-input-disabled-fg);
}
:root[data-app="kiri"] textarea {
background-color: var(--ui-textarea-bg);
color: var(--ui-textarea-fg);
}
:root[data-app="kiri"] button {
color: var(--ui-button-fg);
background-color: var(--ui-button-bg);
border-color: var(--ui-button-border);
}
:root[data-app="kiri"] button:not([disabled]):hover {
background-color: var(--ui-button-hover-bg);
color: var(--ui-button-hover-fg);
}
:root[data-app="kiri"] button[disabled] {
color: var(--ui-button-disabled-fg);
}
:root[data-app="kiri"] #dialog {
background-color: var(--ui-dialog-bg);
color: var(--ui-dialog-fg);
border-top-color: var(--ui-dialog-border-top);
border-bottom-color: var(--ui-dialog-border-bottom);
}
:root[data-app="kiri"] #modal,
:root[data-app="kiri"] #dialog,
:root[data-app="kiri"] #modal select,
:root[data-app="kiri"] #dialog select {
color: var(--ui-dialog-fg) !important;
}

30
web/void/index.html Normal file
View file

@ -0,0 +1,30 @@
<!DOCTYPE html>
<html lang="en" data-app="void" data-theme="dark">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Void:Form</title>
<link rel="stylesheet" href="/moto/palette.css">
<link rel="stylesheet" href="style.css">
<link rel="icon" type="image/png" href="/icon/voidform.png">
<script src="/lib/ext/tween.js"></script>
<script src="/lib/main/void.js" type="module"></script>
</head>
<body>
<div id="app">
<div id="curtain">
<div class="loading">
<div class="spinner"></div>
<div class="text">Loading Void:Form...</div>
</div>
</div>
<div id="top-bar"></div>
<div id="content">
<div id="left-panel"></div>
<div id="container">
<div id="sketch-overlay" class="hidden"></div>
</div>
</div>
</div>
</body>
</html>

1234
web/void/style.css Normal file

File diff suppressed because it is too large Load diff