Git Product home page Git Product logo

funklang's Introduction

::warning:: FunkLang has been mothballed as of now, we are considering continuing developing Q4 2022. We turned off hosting. If you want to play with the project git clone and npm start it.

Contributors Stargazers GNU License Twitter slack reddit


funkLogo

Visual FrontEnd Framework - Design, Develop‍ and Deploy complex web applications using both code and visual workflows

funkLogo

  1. About
  2. How funk works
  3. Why we built funk
  4. Contributing
  5. License
  6. Contact

1. About

funk-editor-screenshot

funkLang, or funk for short, is an open-source visual frontend framework where you can build complex stateful web applications using both code and visual workflows.

With funk visual and code workflows always stay in sync so designers, low-code users and developers can work alongside each other accelerating development. funk has a strong emphasis on simplicity, collaboration, and freeform design.

funk is currently in beta so bear with us, there is a lot to build, but we are committed to making funk succeed. You can help us on this journey by:

  1. Signing up, trying out funk and giving us feedback
  2. Contributing to the funk code base
  3. Telling your friends about funk
  4. Following us on Twitter and chatting to us on Slack
  5. Starting us on GitHub

If you are a business user (startup, agency, enterprise) and would like to discuss our roadmap or how funk can be used to replace existing proprietary tools (Mendix, OutSystems etc..) or how funk can be used alongside React, WordPress or VueJs please book a call with us

How funk is different

funk is NOT a templated web app builder such as Wix or WebFlow. funk enables freeform design of complex HTML layouts with internal bindings of state, data and navigation. We want funk to be as fully featured as WordPress, React or VueJs, but with a simple to use visual layer that can be extended with code when required.

funk brings the benefits of visual development to frontend teams of developers, designers and low-coders who need the power of an open-source frontend framework with the benefits of rapid visual development. Our vision is a tool where everyone can collaborate together as equals using either code or visual workflows.

2. How funk works

Product Name Screen Shot

Project status

We are working towards version 1 of funkLang. Our aim is to be able to recreate the Real World App within 6 months. We measured the below status of each part of funk against the requirements for the real-world app.

Check GH issues for details on what else we need to build to hit this milestone.

funk Description Status Docs
Canvas Draw freeform responsive HTML 70% complete Canvas docs
API editor Connect to external APIs 60% complete API docs
Code Editor Transform data and feed into Canvas 70% complete Code editor docs
Design system Setup site-wide reusable styles 60% complete Design system docs
Model Set up the state of your site, this may include if a user is logged in 50% complete Model docs
CLI Connect to the visual editor via a text editor EXPERIMENTAL CLI docs
Deploy Build funk apps, deploy anywhere 50% complete Deploy docs

Extending funk

You can connect the funk visual editor to your text editor using a CLI, changes are reflected between the two in real-time. This feature is presently experimental.

From your text editor you can add custom-elements to funk and eventually feed data to/from parts of funk created visually into your custom-element.

You can also write code to transform data within the funk visual environment. For instance, you could transform data from an API based on a users' location. You can import NPM packages using SkyPack directly in the editor.

Code output

When you create an app in funk everything about your application is encoded in the funk spec, which at the moment is JSON. We want this to be readable and editable by developers.

The funk spec can be pushed to git, compiled to highly optimised HTML, Js and CSS at build time and deployed anywhere.

We don't output code for different frontend framework as it creates many problems such as low code quality, poor readability, difficult integration and breaking changes between visual and code environments. Some tools try to migrate these problems by creating CSS frameworks and their own state management engines. Building a visual layers on-top of fremaworks which are only designed for code workflows is always going to cause problems (trust us we tried). We want projects built with funk to be stable and performant - we don't believe this is possible by generating code for other frameworks.

Built With funk

Here are some example sites we've built with funk, they were all built without the use of any CSS frameworks or templates. Soon you will be able to create more complex sites like password protected sites, dashboards and marketplaces.

These are our initial examples, soon you will be able to build much more complex sites with funk

3. Why we built funk

The founders of funk (David Beesley and Jan Wirth) are both developers. We've worked for large enterprise and small startups. We built funk as we could see the benefits of low-code but were disappointed by the closed-source alternatives that are heavily templated, slow, expensive and generally treat developers like second class citizens. We saw very little innovation with existing tools and decided to build something radically different.

As we developed funk we became more convinced visual development is the way forward not just for low-code users but developers too. The productivity gains are massive as is the speed of innovation. We see visual development argumenting developers existing workflows allowing them to work faster and smarter in more diversely skilled teams.

4. Contributing

Contributions are what make the open source community such an amazing place to be learn, inspire, and create. Any contributions you make are greatly appreciated.

The best way to get started is to book an onboarding call with a core funkLang contributor Jan

  1. Fork the Project
  2. Create your Feature Branch (git checkout -b gh-123-my-feature or git checkout -b no-issue-refactor-something)
  3. Commit your Changes (git commit -m 'GH-123: Add my feature' or git commit -m 'no-issue: Refactor something')
  4. Push to the Branch (git push origin no-issue-refactor-something)
  5. Open a Pull Request

Installation and Starting the project

This project runs on node. We develop funk using node version 15.

git clone [email protected]:funk-team/funkLang.git
cd funkLang
npm install

# run development environment
npm start

# run unit tests
npm run tdd-elm

5. License

funkLang is distributed under the GNU v3 License. See LICENSE for more information. We choose this licence as it's used by some of the most successful open-source projects in the world, including WordPress.

Software licensed with any GNU license can be used and even modified everywhere, including in a corporate environment, without any restrictions. However be aware that if you (or the company) ever make changes to the funkLang and want to distribute it, it must be distributed with full source code, on the same license terms as the original software source.

We choose GNU to ensure funkLang always remains free and open. Code which funkLang outputs and extensions you build for funkLang can be licensed using any licence you wish. If you have any questions about the licence please contact us.

6. Contact

You can reach us using the following social channels:

Twitter

LinkedIn

If you ever want to chat about life, love or funk, book a video call with David or Jan anytime you want.

Acknowledgements

funk would not be possible without Evan Czaplicki the creator of Elm and Matthew Griffith the ceater of Elm-ui

We are grateful for the support of the German government who provided financing via the EXIST program and Beuth Uochschule University for hosting us during our research grant.

funklang's People

Contributors

andrewmarkallen avatar davidjb99 avatar janwirth avatar jfmengels avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

funklang's Issues

More options for setting attributes on input elements

As a user of funk I want to set fields in forms to have certain attributes so I can customize them. This might include masking a password, disabling an extension or specifying a form that must have certain attributes for autofill.

  • Add custom attributes to input fields
  • Have presets for common options (auto-fill, spell check, masking)

Select multiple elements

As a funk user I want to select multiple elements at once in order to be more efficient while editing existing stuff. This might also involve modifying multiple properties in the style panel such as colors, dimensions or other styles.

More info

  • Decide the scope of the PR (i.e. how powerful should the multi select be) @davidjb99 and @FranzSkuffka
  • Design new interaction @davidjb99
  • Tech handoff with @FranzSkuffka

Elements with content become screens and content disappears

As a user I get very confused when my element which has content in disappears. A more reasoned behavior is elements dragged outside of a screen with content remain as elements. We can consider if the elements should be orphaned or remain connected to the screen they were created in.

We might have to discuss with in the context of components.

Refine CLI

As a developer, I want to connect directly to funk using my text editor

  • make sure file systems are in sync on startup
  • make sure syncing works
  • test on local and production deploy
  • improve custom elements

Min width should never be more then max width etc

When I set the min and max height / width I can presently set them to anything I want, this means the min can be more than the max. This is confusing as I end up entering the wrong values and needing to correct them.

image.png

If the min > max highlight min in red
If the max < min highlight max in red

This should show the user there is an error and allow them to correct, I wouldn't recommend hard preventing a user from entering values as this might confuse them more.

Screen structure panel lacks refinement

When I'm drawing something in funk I use the screen structure panel to figure out what I've selected, where it is nested, the type of element it is and what options it has applied to it. Presently the highlighting and selection is limited and I lose where I am in the tree. I also need to deselect everything to see al lmy screens.

ToDo

  • What should go in the sidebar? Look at figma and Sketch
  • New design

@davidjb99 needs design

Add more Elm Ui layout settings

As a user of funk I can only draw basic layouts. I want to have more advanced options available to me.

Initially just have these as manual options, not included in the responfiy algo.

  • spaceEvenly
  • fill proportions
  • spacingXY

Something went wrong in the API editor, when nothing went wrong

When sending a test webhook in the API editor it says something went wrong - body when the webhook actually worked.

This has to do with the accepted response type.

Solutions

Next steps

  1. find out which "Expects" the request works with.
  2. design a UX around this or conduct further research.

Simplify and improve adding icons to funk

As a user, I have one or more icons I want to add to funk. I may have created these myself or have an icon set I want to add from a third party. Presently I have to find an icon pack that has the correct git structure and add this repo to funk. I find the process of adding icons from github to takes me outside my normally workflow and is confusing and buggy (repos are not always added, icons are not always added if structure differs)

@davidjb99 to do a new design

A/C

  • User uploads either an individual icon or a folder containing all the icons they want.
  • The uploaded icons are visible as 'available icon packs' and can be added to an 'icon set'
  • If a user removes an uploaded icon pack the icons added to the 'icon set' remain
  • The uploaded icons are cached on our CDN (not in the spec)

Improve snapping

When I draw something in funk I rely on snapping to assist me. Presently snapping sort of works but has a lot of edge cases and things which sort of work.

  • Snapping widths seems to sometimes work, sometimes not work
  • When moving elements edge / width snapping is not consistence
  • Snapping between screens is inconsistency
  • There is no snapping when moving elements (especially annoying when cutting & pasting)

TODO

  • Write down as many broken edge cases as possible
  • Document figma snapping and outline how far away we are from it

Project management in funkLang

We use ZenHub for porject management

  1. Boards in ZenHub
  • New issues
  • Icebox, stuff we care about but don't plan to do anytime soon
  • Needs clarification, stuff we think should be addressed but need more information about
  • Backlog, stuff we plan to do soonish
  • This Sprint, stuff we plan to do within the next sprint
  • In Progress, stuff we are doing now
  • In Review, stuff that is under review

TODO

  • Figure out how zenhub works with open source repos, it's meant to be free, do we have to add people? Can they see the project board? Switch to something else if needed.
  1. Tag system

Add tags that are the most relevant to an issue.

The tags are divided into two distinct types

Feature tags (e.g. 'Model', 'API', 'Editor')
Need tags (e.g. 'Needs Technical Input', 'Unclear', 'Needs Design', ' Discussion' 'Old'
In general, an issue should have at least one Feature tag (as it most likely is connected to a feature). In an ideal world, it should not have any Needs tags as these mean the issue is lacking something which is needed to start it. When an issue has no Needs tags it is ready to be started.

Filtering tags is more dynamic than filtering by pipelines and enables an issue to be prioritized in the backlog with Need tags that can be addressed before the issue is completed.

I Would like to contrinute

Hi,
I have been building something similar, due to lack of resources 3 years ago, I have resorted to elisp. but I would love to assist in making this project a success.

What are the available roadmaps?

When resizing chld, parent is jumpy

This was not a problem before, hence is a regression

@FranzSkuffka noted this issue and is aware when it occurs

  • write e2e test that fails
  • fix bug that makes e2e test pass

Images don't work in the standalone/core version of funk

Reason: pseudo server expects a project ID because it thinks it's in the enterprise version.

TODO: think about solution

notes

  • this should be unit tested OR the image dependency should be injected OR a mode should be defined
  • importing scripts inside service workers is a pain

Improve screen resizing

When I'm resizing a screen I want more feedback on the process and more options for customization. Presently I can only switch to presets, which is fine, but there are a few oddities that limit how I interact with this feature.

AC

  • Input fields for screen size, enter screen size dynamically
  • Dynamically update screen size when dragging the screen
  • show presets while resizing screen

Vertically center text

As a user of funk I want to quickly vertically align text. Presently I need to draw an element (such as a button) then to vertically align text draw another element inside the first element and put text in this second element. This is longwinded and confusing.

This appears to be possible using

  • align-items: center
  • display:flex
  • justify-content: center

A/C

  • The behavior needs to be as predictable as possible between single and multiline text.

We need to consider if this should not be in the typo styles but in layout settings, as it's technically not a style but a layout property that should be set on a per-element basis, not per typo style. To get started I suggest we see if this is possible then we can decide where we should put these settings.

To be discussed with @davidjb99 and @FranzSkuffka

Breakpoints

As a user, I want to modify layout and style settings for different screen resolutions. Presently I might draw my design in Figma at different resolutions and ask a developer to transpose this to code. In my head, I have an idea of what my design should look like on different devices. I need to modify the layout/style settings in funk to match the design I want to produce.

The big difference compared to design tools is I'm only going to design one screen which will work across multiple devices. When I design I normally start from a base that might be desktop, tablet, or mobile, depending on the user requirements. As such I have in my head the base design and apply it to different screen sizes.

more info

needs design and tech discussion @davidjb99 @FranzSkuffka

  • Set a base layer for styles (i.e. Desktop 4k), from which the user will modify for sub layouts (iPhoneX)
  • When the user is not viewing the base layer make any style/layout changes resolution specific, such that they only apply to that resolution
  • Highlight to the user what setting have changed from the base layer
  • Allow the user to reset back to the base settings

Uploading images is complicated

I find it difficult to remember where to upload images in the current UI. I would like it to work pretty much exactly how it works in figma.

@davidjb99 to do a complete design and userflow

AC

  • Add Insert image to the title bar drawing tool dropdown which opens the upload image dialog box as per the interaction in Figma (having a menu item ensures the user know they can insert images and tells them the shortcut too)
  • I can copy&paste images from my system clipboard
  • I can drag images onto the canvas from my computer or from a different tab
  • If I have an element select (for paste) or drop onto an element (drag and drop) the element gets directly liked with the image
  • When a user drops an image onto the canvas we auto-create a new screen and add it to an element within that screen. Eventually when we can reconsider this but I think it matches the 'everything must be a screen' concept we presently have.

Components

TODO

more info

Things to think about...

  • Conditional rendering
  • Modification from design system?
  • One screen per canvas then default to components?

Images are display differently in deploy, preview and canvas

As a user of funk when I place an image in the canvas and set the display options I expect it to behave the same way when I deploy it. Presently it is different in deploy/preview and the canvas. I think the bugs are partly related to the width / height fill options but I'm not totally sure.

  • Check if this still occurs

Skypack typo on the website

Logic
Visual and code data transformation tools allow complex apps to be built.
Load web-optimised NPM packages from SkyPack.de and transform data within funk

"SkyPack.de" brings you to a company selling trolleys 😉

Improve undo behaviour

currently, every keyboard input is tracked, this results in undesirable behavior for undo events

More info

  • test with contenteditable (ctrl+z is funky)
  • test with input fields
  • visualize undo queue somehow in debugger
  • research on ODT

Allow the user to design empty states

Sometimes data sources return empty list. For example, when no items were found in a list. This is a common edge case which designers want to cover. See Refactoring UI p. 234-236

Sometimes surrounding UI is dependent on the empty state. In elm we do things like.

case results of
   [ ] -> "No results"
   _ -> viewResults results

Post and Get requests are not performed when buttons are pressed

As a user, I want to GET or POST data to an API when a button is pressed. I can correctly set this using the API panel but when I connect this to an ACTION (such as an onClick event in a button) the API request is not made.

More info

AC

  • when I am in a project I want the data from my last request to continue where I left off
  • when I preview a project, I want the latest data linked to a page to be fetched
  • while the data is loading, I want to see a spinner
  • I want only the data fetched that is required in the current page

Tech handoff

  • for the current page, aggregate all data connections
  • find out what the data connections depend on (e.g. the code depends on an API call)
  • once the root of the data (the API) is found, try to make the api call
  • the result from the API call should be remotedata.mapped to the transformations that depend on it
  • the runtime model (data fetched for each page on load) is clearly separated from the project model (data fetched from an API call in the API editor)
  • (how) do we make sure the project data is in sync with the runtime data?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.