├── templates ├── block │ ├── code.js │ └── package.json └── program │ ├── blocks │ └── untitled │ │ ├── code.js │ │ └── package.json │ └── program.json ├── src ├── electron-app │ ├── normalisation │ │ ├── block.js │ │ └── program.js │ ├── disk │ │ ├── path.js │ │ └── fs.js │ ├── templates.js │ ├── preload-esm.js │ ├── main-esm.js │ ├── preload-engine-esm.js │ ├── store.js │ ├── properties.js │ ├── preload-engine.js │ ├── settings.js │ ├── preload.js │ ├── engine.js │ ├── program.js │ ├── application-menu.js │ └── main.js ├── state │ ├── index.js │ ├── loaders │ │ ├── interface.js │ │ ├── hooks.js │ │ └── model.js │ ├── status-bar │ │ ├── interface.js │ │ ├── hooks.js │ │ └── model.js │ ├── settings │ │ ├── interface.js │ │ ├── definitions.js │ │ ├── hooks.js │ │ └── model.js │ ├── statuses │ │ ├── hooks.js │ │ ├── model.js │ │ └── interface.js │ ├── modals │ │ ├── hooks.js │ │ ├── interface.js │ │ └── model.js │ ├── toasts │ │ ├── hooks.js │ │ ├── interface.js │ │ └── model.js │ ├── program │ │ ├── hooks.js │ │ └── interface.js │ ├── workspace │ │ ├── hooks.js │ │ ├── interface.js │ │ └── model.js │ ├── blocks │ │ ├── utils.js │ │ ├── hooks.js │ │ └── interface.js │ └── reducer.js ├── components │ ├── graph-panel │ │ ├── constants.js │ │ ├── index.js │ │ ├── graph-panel.js │ │ ├── link.js │ │ ├── toolbar.js │ │ └── property.js │ ├── layout │ │ ├── index.js │ │ ├── app-layout.js │ │ └── ui-layout.js │ ├── animated │ │ ├── index.js │ │ └── text.js │ ├── editor-panel │ │ ├── index.js │ │ ├── gpt.js │ │ ├── toolbar.js │ │ ├── monaco-editor.js │ │ ├── prompts.js │ │ └── chat.js │ ├── sidebar-panel │ │ ├── index.js │ │ ├── block-information │ │ │ ├── index.js │ │ │ ├── block-information.js │ │ │ ├── state-settings.js │ │ │ ├── property-list.js │ │ │ ├── property.js │ │ │ ├── dependencies.js │ │ │ └── general-information.js │ │ └── sidebar-panel.js │ ├── initialisation │ │ ├── index.js │ │ └── initialisation.js │ ├── engine │ │ ├── index.js │ │ ├── engine-panel.js │ │ └── engine-controls.js │ ├── form │ │ ├── index.js │ │ ├── form-actions.js │ │ ├── form-item.js │ │ ├── form.js │ │ └── form-header.js │ ├── system │ │ ├── flex-box.js │ │ ├── icon-button.js │ │ ├── grid.js │ │ ├── toolbar-button.js │ │ ├── textarea.js │ │ ├── loader.js │ │ ├── link.js │ │ ├── select.js │ │ ├── flex.js │ │ ├── file-input.js │ │ ├── loading-button.js │ │ ├── switch-slider.js │ │ ├── index.js │ │ ├── pop-menu.js │ │ ├── input.js │ │ ├── button.js │ │ ├── tags.js │ │ ├── dropdown.js │ │ └── icon.js │ ├── properties │ │ ├── generic.js │ │ ├── button.js │ │ ├── text.js │ │ ├── index.js │ │ ├── number.js │ │ ├── checkbox.js │ │ ├── color.js │ │ ├── file-selector.js │ │ └── slider.js │ ├── status-bar │ │ ├── index.js │ │ └── user.js │ ├── toasts │ │ ├── index.js │ │ └── toast.js │ └── modals │ │ ├── confirmation.js │ │ ├── color-picker.js │ │ ├── program_settings.js │ │ ├── index.js │ │ ├── edit-block-information.js │ │ ├── dependency-search.js │ │ ├── online-block-search.js │ │ ├── intro.js │ │ ├── auth.js │ │ └── edit-property.js ├── utils │ ├── is-dev.js │ ├── promise.js │ ├── markdown-literal.js │ ├── ids.js │ ├── npm.js │ ├── jsdelivr.js │ ├── logger.js │ ├── hooks.js │ └── object.js ├── electron-redux-ipc │ ├── channels.js │ ├── renderer.js │ └── main.js ├── ipc │ ├── main.js │ ├── renderer.js │ └── constants.js ├── electron-react-context-menu │ ├── constants.js │ ├── preload.js │ ├── main.js │ └── renderer.js ├── block-server │ ├── download.js │ ├── search.js │ ├── upload-block.js │ └── firebase.js ├── engine │ ├── index.html │ ├── components │ │ ├── block.js │ │ ├── shadow-root.js │ │ ├── error.js │ │ └── program.js │ ├── program-manager.js │ ├── store.js │ ├── index.js │ ├── require-system.js │ ├── link-manager.js │ └── transpile.js ├── ui │ ├── index.html │ └── index.js ├── state-management │ ├── hooks.js │ ├── builder.js │ └── watcher.js └── themes │ └── dark.js ├── screenshot.png ├── assets ├── logo │ ├── 16x16.png │ ├── 24x24.png │ ├── 32x32.png │ ├── 48x48.png │ ├── 64x64.png │ ├── logo.ico │ ├── logo.png │ ├── 128x128.png │ ├── 256x256.png │ ├── 512x512.png │ └── 1024x1024.png └── images │ └── header_back.png ├── .prettierrc ├── configs ├── webpack.dev.engine.config.js └── webpack.dev.ui.config.js ├── package.json └── .gitignore /templates/block/code.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/electron-app/normalisation/block.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /templates/program/blocks/untitled/code.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matt-way/0x00/HEAD/screenshot.png -------------------------------------------------------------------------------- /src/state/index.js: -------------------------------------------------------------------------------- 1 | import reducer from './reducer' 2 | 3 | export { reducer } 4 | -------------------------------------------------------------------------------- /assets/logo/16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matt-way/0x00/HEAD/assets/logo/16x16.png -------------------------------------------------------------------------------- /assets/logo/24x24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matt-way/0x00/HEAD/assets/logo/24x24.png -------------------------------------------------------------------------------- /assets/logo/32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matt-way/0x00/HEAD/assets/logo/32x32.png -------------------------------------------------------------------------------- /assets/logo/48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matt-way/0x00/HEAD/assets/logo/48x48.png -------------------------------------------------------------------------------- /assets/logo/64x64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matt-way/0x00/HEAD/assets/logo/64x64.png -------------------------------------------------------------------------------- /assets/logo/logo.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matt-way/0x00/HEAD/assets/logo/logo.ico -------------------------------------------------------------------------------- /assets/logo/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matt-way/0x00/HEAD/assets/logo/logo.png -------------------------------------------------------------------------------- /assets/logo/128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matt-way/0x00/HEAD/assets/logo/128x128.png -------------------------------------------------------------------------------- /assets/logo/256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matt-way/0x00/HEAD/assets/logo/256x256.png -------------------------------------------------------------------------------- /assets/logo/512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matt-way/0x00/HEAD/assets/logo/512x512.png -------------------------------------------------------------------------------- /src/components/graph-panel/constants.js: -------------------------------------------------------------------------------- 1 | export const DYNAMIC_HANDLE_ID = '.dynamic-handle' 2 | -------------------------------------------------------------------------------- /assets/logo/1024x1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matt-way/0x00/HEAD/assets/logo/1024x1024.png -------------------------------------------------------------------------------- /src/components/layout/index.js: -------------------------------------------------------------------------------- 1 | import AppLayout from './app-layout' 2 | 3 | export { AppLayout } 4 | -------------------------------------------------------------------------------- /src/utils/is-dev.js: -------------------------------------------------------------------------------- 1 | const isDev = () => { 2 | return true 3 | } 4 | 5 | export default isDev 6 | -------------------------------------------------------------------------------- /assets/images/header_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matt-way/0x00/HEAD/assets/images/header_back.png -------------------------------------------------------------------------------- /src/components/animated/index.js: -------------------------------------------------------------------------------- 1 | import AnimatedText from './text' 2 | 3 | export { 4 | AnimatedText 5 | } -------------------------------------------------------------------------------- /src/components/graph-panel/index.js: -------------------------------------------------------------------------------- 1 | import GraphPanel from './graph-panel' 2 | 3 | export { GraphPanel } -------------------------------------------------------------------------------- /src/components/editor-panel/index.js: -------------------------------------------------------------------------------- 1 | import EditorPanel from './monaco-editor' 2 | 3 | export { EditorPanel } 4 | -------------------------------------------------------------------------------- /src/components/sidebar-panel/index.js: -------------------------------------------------------------------------------- 1 | import SideBarPanel from './sidebar-panel' 2 | 3 | export { SideBarPanel } 4 | -------------------------------------------------------------------------------- /src/components/initialisation/index.js: -------------------------------------------------------------------------------- 1 | import Initialisation from './initialisation' 2 | 3 | export default Initialisation 4 | -------------------------------------------------------------------------------- /src/components/sidebar-panel/block-information/index.js: -------------------------------------------------------------------------------- 1 | import BlockInformation from './block-information' 2 | 3 | export { BlockInformation } 4 | -------------------------------------------------------------------------------- /src/electron-redux-ipc/channels.js: -------------------------------------------------------------------------------- 1 | const action = 'redux-action' 2 | const initialState = 'redux-initial-state' 3 | 4 | export { action, initialState } 5 | -------------------------------------------------------------------------------- /src/components/initialisation/initialisation.js: -------------------------------------------------------------------------------- 1 | const Initialisation = ({ children }) => { 2 | return children 3 | } 4 | 5 | export default Initialisation 6 | -------------------------------------------------------------------------------- /src/utils/promise.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Promise related helper functions 3 | */ 4 | 5 | export const delay = ms => new Promise(resolve => setTimeout(resolve, ms)) 6 | -------------------------------------------------------------------------------- /src/state/loaders/interface.js: -------------------------------------------------------------------------------- 1 | import { actions } from './model' 2 | 3 | export const startLoading = actions.startLoading 4 | export const loaded = actions.loaded 5 | -------------------------------------------------------------------------------- /src/state/status-bar/interface.js: -------------------------------------------------------------------------------- 1 | import { actions } from './model' 2 | 3 | export const setInfo = actions.setInfo 4 | export const removeItem = actions.removeItem 5 | -------------------------------------------------------------------------------- /templates/block/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "main": "code.js", 3 | "version": "0.0.1", 4 | "block": { 5 | "properties": {}, 6 | "propertyOrder": [] 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/components/engine/index.js: -------------------------------------------------------------------------------- 1 | import EnginePanel from './engine-panel' 2 | import EngineControls from './engine-controls' 3 | 4 | export { EnginePanel, EngineControls } 5 | -------------------------------------------------------------------------------- /templates/program/blocks/untitled/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "main": "code.js", 3 | "block": { 4 | "inputs": {}, 5 | "outputs": {}, 6 | "propertyOrder": [] 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "semi": false, 3 | "singleQuote": true, 4 | "bracketSpacing": true, 5 | "jsxBracketSameLine": true, 6 | "arrowParens": "avoid", 7 | "trailingComma": "es5" 8 | } 9 | -------------------------------------------------------------------------------- /src/utils/markdown-literal.js: -------------------------------------------------------------------------------- 1 | import MarkdownIt from 'markdown-it' 2 | 3 | const mdInstance = MarkdownIt() 4 | 5 | export const md = (...args) => { 6 | return mdInstance.render(String.raw(...args)) 7 | } 8 | -------------------------------------------------------------------------------- /templates/program/program.json: -------------------------------------------------------------------------------- 1 | { 2 | "blocks": { 3 | "untitled": { 4 | "x": 100, 5 | "y": 100 6 | } 7 | }, 8 | "renderOrder": ["untitled"], 9 | "name": "Untitled" 10 | } 11 | -------------------------------------------------------------------------------- /src/ipc/main.js: -------------------------------------------------------------------------------- 1 | import { ipcMain } from 'electron' 2 | 3 | const handle = (channel, handler) => { 4 | return ipcMain.handle(channel, (e, ...args) => { 5 | return handler(...args) 6 | }) 7 | } 8 | 9 | export { handle } 10 | -------------------------------------------------------------------------------- /src/components/form/index.js: -------------------------------------------------------------------------------- 1 | import Form from './form' 2 | import FormItem from './form-item' 3 | import FormActions from './form-actions' 4 | import FormHeader from './form-header' 5 | 6 | export { Form, FormItem, FormActions, FormHeader } 7 | -------------------------------------------------------------------------------- /src/electron-react-context-menu/constants.js: -------------------------------------------------------------------------------- 1 | const PREFIX = 'electron-react-context-menu' 2 | 3 | const channels = { 4 | open: `${PREFIX}/open`, 5 | item: `${PREFIX}/item`, 6 | close: `${PREFIX}/close`, 7 | } 8 | 9 | export { channels } 10 | -------------------------------------------------------------------------------- /src/state/settings/interface.js: -------------------------------------------------------------------------------- 1 | import { actions } from './model' 2 | 3 | export const update = actions.update 4 | export const updateExternal = actions.updateExternal 5 | export const updateValue = actions.updateValue 6 | export const removePath = actions.removePath 7 | -------------------------------------------------------------------------------- /src/state/statuses/hooks.js: -------------------------------------------------------------------------------- 1 | import { useSlice } from 'state-management/hooks' 2 | import { getDependencyId } from '../blocks/utils' 3 | 4 | export const useDependencyStatus = (blockId, packageName) => { 5 | return useSlice(`statuses.${getDependencyId(blockId, packageName)}`) 6 | } 7 | -------------------------------------------------------------------------------- /src/utils/ids.js: -------------------------------------------------------------------------------- 1 | import { nanoid } from 'nanoid' 2 | 3 | const ID_LENGTH = 10 4 | 5 | const generateId = prefix => { 6 | if (prefix) { 7 | return `${prefix}-${nanoid(ID_LENGTH)}` 8 | } else { 9 | return nanoid(ID_LENGTH) 10 | } 11 | } 12 | 13 | export { generateId } 14 | -------------------------------------------------------------------------------- /src/state/modals/hooks.js: -------------------------------------------------------------------------------- 1 | import { useStore, useActions } from 'state-management/hooks' 2 | import * as actions from './interface' 3 | 4 | export const useModals = () => { 5 | return useStore('modals', actions) 6 | } 7 | 8 | export const useModalActions = () => { 9 | return useActions(actions) 10 | } 11 | -------------------------------------------------------------------------------- /src/state/toasts/hooks.js: -------------------------------------------------------------------------------- 1 | import { useStore, useActions } from 'state-management/hooks' 2 | import * as actions from './interface' 3 | 4 | export const useToasts = () => { 5 | return useStore('toasts', actions) 6 | } 7 | 8 | export const useToastActions = () => { 9 | return useActions(actions) 10 | } 11 | -------------------------------------------------------------------------------- /src/state/program/hooks.js: -------------------------------------------------------------------------------- 1 | import { useStore, useActions } from 'state-management/hooks' 2 | import * as actions from './interface' 3 | 4 | export const useProgramActions = () => { 5 | return useActions(actions) 6 | } 7 | 8 | export const useProgram = () => { 9 | return useStore('program', actions) 10 | } 11 | -------------------------------------------------------------------------------- /src/components/form/form-actions.js: -------------------------------------------------------------------------------- 1 | /** @jsxImportSource theme-ui */ 2 | 3 | const FormActions = props => { 4 | return ( 5 |
12 | ) 13 | } 14 | 15 | export default FormActions 16 | -------------------------------------------------------------------------------- /src/state/status-bar/hooks.js: -------------------------------------------------------------------------------- 1 | import { useStore, useActions } from 'state-management/hooks' 2 | import * as actions from './interface' 3 | 4 | export const useStatusBar = () => { 5 | return useStore('statusBar', actions) 6 | } 7 | 8 | export const useStatusBarActions = () => { 9 | return useActions(actions) 10 | } 11 | -------------------------------------------------------------------------------- /src/state/workspace/hooks.js: -------------------------------------------------------------------------------- 1 | import { useStore, useActions } from 'state-management/hooks' 2 | import * as actions from './interface' 3 | 4 | export const useWorkspace = () => { 5 | return useStore('workspace', actions) 6 | } 7 | 8 | export const useWorkspaceActions = () => { 9 | return useActions(actions) 10 | } 11 | -------------------------------------------------------------------------------- /src/block-server/download.js: -------------------------------------------------------------------------------- 1 | import fetch from 'electron-fetch' 2 | 3 | const downloadBlock = (name, version) => { 4 | const url = `https://firebasestorage.googleapis.com/v0/b/x15-9e8ff.appspot.com/o/blocks%2F${name}%2F${version}.json?alt=media` 5 | return fetch(url).then(res => res.json()) 6 | } 7 | 8 | export { downloadBlock } 9 | -------------------------------------------------------------------------------- /src/components/system/flex-box.js: -------------------------------------------------------------------------------- 1 | /** @jsxImportSource theme-ui */ 2 | import React from 'react' 3 | 4 | const FlexBox = React.forwardRef((props, ref) => { 5 | const { sx, flex = 1, ...rest } = props 6 | return ( 7 |
15 | ) 16 | }) 17 | 18 | export default FlexBox 19 | -------------------------------------------------------------------------------- /src/components/properties/generic.js: -------------------------------------------------------------------------------- 1 | /** @jsxImportSource theme-ui */ 2 | 3 | const Generic = props => { 4 | const { id, incomingConnected, outgoingConnected } = props 5 | return ( 6 |
11 | {id} 12 |
13 | ) 14 | } 15 | 16 | export default Generic 17 | -------------------------------------------------------------------------------- /src/components/system/icon-button.js: -------------------------------------------------------------------------------- 1 | /** @jsxImportSource theme-ui */ 2 | import Icon from './icon' 3 | 4 | const IconButton = props => { 5 | return ( 6 | 16 | ) 17 | } 18 | 19 | export default IconButton 20 | -------------------------------------------------------------------------------- /src/electron-app/disk/path.js: -------------------------------------------------------------------------------- 1 | import path from 'path' 2 | 3 | export const join = path.join 4 | export const basename = path.basename 5 | export const extname = path.extname 6 | export const resolve = path.resolve 7 | export const normalize = path.normalize 8 | export const sep = path.sep 9 | 10 | export const dirname = _path => { 11 | var slashFixed = _path.split('\\').join('/') 12 | return path.dirname(slashFixed) 13 | } 14 | -------------------------------------------------------------------------------- /src/components/system/grid.js: -------------------------------------------------------------------------------- 1 | /** @jsxImportSource theme-ui */ 2 | 3 | const Grid = props => { 4 | const { columns, rows, sx, ...rest } = props 5 | return ( 6 |
16 | ) 17 | } 18 | 19 | export default Grid 20 | -------------------------------------------------------------------------------- /src/electron-react-context-menu/preload.js: -------------------------------------------------------------------------------- 1 | import { channels } from './constants' 2 | import { contextBridge, ipcRenderer } from 'electron' 3 | 4 | contextBridge.exposeInMainWorld('contextMenuIPC', { 5 | onItem: cb => ipcRenderer.on(channels.item, cb), 6 | removeItem: cb => ipcRenderer.removeAllListeners(channels.item), 7 | onceClose: cb => ipcRenderer.once(channels.close, cb), 8 | sendOpen: cb => ipcRenderer.send(channels.open, cb), 9 | }) 10 | -------------------------------------------------------------------------------- /src/state/loaders/hooks.js: -------------------------------------------------------------------------------- 1 | import { useSlice, useActions } from 'state-management/hooks' 2 | import { mapValues } from 'lodash' 3 | import * as actions from './interface' 4 | 5 | export const useLoaderActions = key => { 6 | return useActions(mapValues(actions, f => f.bind(undefined, key))) 7 | } 8 | 9 | export const useLoader = key => { 10 | const loader = useSlice(`loaders[${key}]`) 11 | return [loader || {}, useLoaderActions(key)] 12 | } 13 | -------------------------------------------------------------------------------- /src/components/animated/text.js: -------------------------------------------------------------------------------- 1 | import { useState, useEffect } from 'react' 2 | 3 | const AnimatedText = ({ strings = [], delay = 250 }) => { 4 | const [index, setIndex] = useState(0) 5 | useEffect(() => { 6 | const timer = setTimeout( 7 | () => setIndex(index < strings.length - 1 ? index + 1 : 0), 8 | delay 9 | ) 10 | return () => clearTimeout(timer) 11 | }) 12 | 13 | return strings[index] 14 | } 15 | 16 | export default AnimatedText 17 | -------------------------------------------------------------------------------- /src/components/form/form-item.js: -------------------------------------------------------------------------------- 1 | /** @jsxImportSource theme-ui */ 2 | 3 | const FormItem = props => { 4 | const { label, control } = props 5 | 6 | return ( 7 | <> 8 |
12 | {label} 13 |
14 |
18 | {control} 19 |
20 | 21 | ) 22 | } 23 | 24 | export default FormItem 25 | -------------------------------------------------------------------------------- /src/electron-app/templates.js: -------------------------------------------------------------------------------- 1 | import { app } from 'electron' 2 | import { join } from './disk/path' 3 | import { copy } from './disk/fs' 4 | 5 | const tpl_prefix = app.isPackaged ? '../' : '../../' 6 | 7 | const Templates = { 8 | PROGRAM: `${tpl_prefix}templates/program`, 9 | BLOCK: `${tpl_prefix}templates/block`, 10 | } 11 | 12 | const cloneTemplate = (type, dir) => { 13 | return copy(join(app.getAppPath(), type), dir) 14 | } 15 | 16 | export { Templates, cloneTemplate } 17 | -------------------------------------------------------------------------------- /src/engine/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 0x00 - Engine 7 | 10 | 16 | 17 | 18 |
19 | 20 | 21 | -------------------------------------------------------------------------------- /src/components/system/toolbar-button.js: -------------------------------------------------------------------------------- 1 | /** @jsxImportSource theme-ui */ 2 | import Button from './button' 3 | 4 | const ToolbarButton = props => { 5 | return ( 6 |