GithubHelp home page GithubHelp logo

treeform / fidget Goto Github PK

View Code? Open in Web Editor NEW
757.0 757.0 32.0 124.46 MB

Figma based UI library for nim, with HTML and OpenGL backends.

License: MIT License

Nim 95.14% GLSL 1.05% TypeScript 2.12% Shell 0.50% HTML 1.18%

fidget's Introduction

πŸ‘ πŸ‘ πŸ‘ Check out video about the library: Fidget: Let's rethink UI development with Nim (NimConf 2020) πŸ‘ πŸ‘ πŸ‘

⚠️ WARNING: This library is still in heavy development. ⚠️

Fidget - A cross platform UI library for nim

nimble install fidget

Github Actions

API reference

About

Fidget aims to provide performant natively compiled cross platform UIs for any platform - Web with HTML5, Windows, macOS, Linux, iOS and Android with OpenGL.

Fidget leverages Figma - an app that is taking the design world by storm. It does this by providing a Figma Plugin to export directly to fidget code! No more counting stupid pixels, no more CSS puzzles. Want to change some spaces? Change it in Figma and export.

Fidget uses plain nim-procs, nim-templates, if-statements and for-loops. As well as providing only minimal primitives found in Figma.

Example:


Design done by Kate von Houck. Available for hire.

See code here: examples/demo/demo.nim

Minimal Sample:

import fidget, vmath

proc drawMain() =
  frame "main":
    box 0, 0, 620, 140
    for i in 0 .. 4:
      group "block":
        box 20+i*120, 20, 100, 100
        fill "#2B9FEA"

windowFrame = vec2(620, 140)
startFidget(drawMain)


See code here: examples/minimal/minimal.nim

Backends

Fidget has several backends that are planned:

  • HTML (best supported)
  • Windows (next best support)
  • Mac (less support)
  • Linux (less support)
  • iOS (proof of concept only)
  • Android (proof of concept only)

Philosophy - Minimalism

  • Mimic how Figma (Amazing UI/UX app) does it.
  • Everything is a Node.
  • There are Group, Rectangle, Image and Text Nodes.
  • Nodes are positions relative to the parent
  • Nodes have minimal set of properties that match Figma.
  • Resizing is done same way as Fimga's Constraints.
  • Layout is done same way as Figma's Auto Layout.

The main idea of fidget is to use standard imperative nim paradigms like nim-procs, nim-for-loops, nim-ifs, nim-templates instead of say providing a custom language, XML templates, HTML, Jinja templates, CSS ...

Instead of creating CSS classes you just create a nim proc or a nim template with the things you want and reuse that. Instead of having some sort of list controller you just use a for loop to position your list elements.

There are very little UI layout primitives just align left, center, right, both, or scale for the X axis and top, center, bottom, both, or scale for the Y axis. There is none of margin, padding, float, absolute, relative, border box, flex, recycle view controllers, stack layout, constraints ...

If you want to do something fancy just do a little math. Many times a simple math formula is smaller, simpler, and easier to figure out then layout puzzles.

Why Nim?

Nim is a great languages because it’s easy on the eyes like Python, but typed and is performant as C. It can also compile to JavaScript, C, C++, ObjC. Nim is a great language for UI design because it has advanced templates and macros can make a really good DSL (domain specific language) - that makes writing UIs straightforward, intuitive and crossplatform.

Imperative UI Style

I like imperative style of programming. This is a style you probably learned to program at the start, but was forced to abandon with more complex and ill fitting object oriented style. Imperative style to me means when you are only using functions, if-statements and for-loops. Imperative style to me means simple data structures of structs, lists and tables. Simple functions that read from top to bottom with as few branches as possible.

Each UI frame is drawn completely from start to finish all in the code you control. Use of callbacks is discouraged. Think liner, think simple. After any event by the user, data or timer, the UI is redrawn. The UI is redrawn in an efficient way as to allow this. With HTML a modification cache is used to ensure only a minimal amount of DOM changes are needed. With OpenGL you redraw the whole screen using as few state transitions and batching everything into a texture atlas and single global vertex buffer.

How to run the examples:

git clone https://github.com/treeform/fidget
cd fidget
nimble install
cd examples/minimal
nim c -r minimal

Native examples for Windows, macOS, and Linux:

First cd to each folder then compile and run.

nim c -r bars.nim
nim c -r hovers.nim
nim c -r inputs.nim
nim c -r padoftext.nim
nim c -r padofcode.nim
nim c -r basic.nim

Runs the same examples as HTML:

First cd to each folder then run js compile command then open the .html file in a browser.

nim js bars.nim
nim js hovers.nim
nim js inputs.nim
nim js padoftext.nim
nim js padofcode.nim
nim js basic.nim

Run all tests and save a screenshot

nim c -r tests/run --compile --native --testOneFrame

Figma Plug

To compile the figma plug run TypeScript in the figma_plugin folder.

tsc

Then go to figma and add a development plugin from this folder.

fidget's People

Contributors

alt-tosc avatar beef331 avatar citizen428 avatar guzba avatar mosic avatar treeform 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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

fidget's Issues

Why not QML?

After seeing your video, I do wonder why you didn't consider QML, the Qt Design Studio, and that whole, already developed and maintained set of software, instead of relying on non-free software and basically providing only Windows support.

https://www.qt.io/product/ui-design-tools

You can design interfaces with the Qt Design Studio at least as detailed and easy as with Figma, import assets directly from Blender, Photoshop and Co and can export all of that in QML.

fidget breaks nim CI again

(previous instances: #121 + other more recent IIRC)

as mentioned in #121 (comment), it would be good to find and fix root cause for such regressions;

EDIT: looks like it's guzba/nimsimd@538c47f#r46409625

logs

FAIL: fidget c
https://github.com/nim-lang/Nim/pull/16831/checks?check_run_id=1775941555

Compiling /Users/runner/work/Nim/Nim/pkgstemp/fidget/tests/test (from package fidget) using c backend
/Users/runner/.nimble/pkgs/pixie-0.0.16/pixie/images.nim(182, 30) Error: type mismatch: got <int literal(255)>
but expected one of:
func mm_set1_epi8(a: int8): M128i
first type mismatch at position: 1
required type for a: int8
but expression '255' is of type: int literal(255)

expression: mm_set1_epi8(255)
Tip: 73 messages have been suppressed, use --verbose to show them.
Error: Execution failed with exit code 256
... Command: /Users/runner/work/Nim/Nim/bin/nim c --noNimblePath -d:NimblePkgVersion=0.7.1 --path:/Users/runner/.nimble/pkgs/chroma-0.2.1 --path:/Users/runner/.nimble/pkgs/typography-0.7.4 --path:/Users/runner/.nimble/pkgs/pixie-0.0.16 --path:/Users/runner/.nimble/pkgs/vmath-0.4.1 --path:/Users/runner/.nimble/pkgs/chroma-0.2.1 --path:/Users/runner/.nimble/pkgs/zippy-0.5.2 --path:/Users/runner/.nimble/pkgs/flatty-0.1.5 --path:/Users/runner/.nimble/pkgs/nimsimd-1.0.0 --path:/Users/runner/.nimble/pkgs/bumpy-1.0.1 --path:/Users/runner/.nimble/pkgs/vmath-0.4.1 --path:/Users/runner/.nimble/pkgs/vmath-0.4.1 --path:/Users/runner/.nimble/pkgs/chroma-0.2.1 --path:/Users/runner/.nimble/pkgs/print-0.2.0 --path:/Users/runner/.nimble/pkgs/bumpy-1.0.1 --path:/Users/runner/.nimble/pkgs/vmath-0.4.1 --path:/Users/runner/.nimble/pkgs/flatty-0.1.5 --path:/Users/runner/.nimble/pkgs/pixie-0.0.16 --path:/Users/runner/.nimble/pkgs/vmath-0.4.1 --path:/Users/runner/.nimble/pkgs/chroma-0.2.1 --path:/Users/runner/.nimble/pkgs/zippy-0.5.2 --path:/Users/runner/.nimble/pkgs/flatty-0.1.5 --path:/Users/runner/.nimble/pkgs/nimsimd-1.0.0 --path:/Users/runner/.nimble/pkgs/bumpy-1.0.1 --path:/Users/runner/.nimble/pkgs/vmath-0.4.1 --path:/Users/runner/.nimble/pkgs/vmath-0.4.1 --path:/Users/runner/.nimble/pkgs/print-0.2.0 --path:/Users/runner/.nimble/pkgs/opengl-1.2.6 --path:/Users/runner/.nimble/pkgs/x11-1.1 --path:/Users/runner/.nimble/pkgs/html5_canvas-1.3 --path:/Users/runner/.nimble/pkgs/staticglfw-4.1.2 --path:/Users/runner/.nimble/pkgs/opengl-1.2.6 --path:/Users/runner/.nimble/pkgs/x11-1.1 --path:/Users/runner/.nimble/pkgs/cligen-1.4.0 --path:/Users/runner/.nimble/pkgs/supersnappy-2.0.0 --path:/Users/runner/.nimble/pkgs/bumpy-1.0.1 --path:/Users/runner/.nimble/pkgs/vmath-0.4.1 --hints:off -r --path:. /Users/runner/work/Nim/Nim/pkgstemp/fidget/tests/test

openglbackend.nim(31, 25) Error: type mismatch: got <Font, seq[Rune], pos: Vec2, size: Vec2, HAlignMode, VAlignMode, clip: bool, boundsMin: Vec2, boundsMax: Vec2>

I try to compile r:\fidget-0.4.2\examples\minimal\minimal.nim

$ nim
Nim Compiler Version 1.3.5 [Windows: amd64]
Compiled at 2020-06-18
Copyright (c) 2006-2020 by Andreas Rumpf

fldget/opengl/staticglfw/typography are uninstalled via nimble uninstall xx for severval times to confirm that none version of the module is installed
then fldget/opengl/staticglfw/typography are installed via nimble uninstall xx

then nim c minimal.nim says

R:\fidget-0.4.2\src\fidget\openglbackend.nim(31, 25) Error: type mismatch: got <Font, seq[Rune], pos: Vec2, size: Vec2, HAlignMode, VAlignMode, clip: bool, boundsMin: Vec2, boundsMax: Vec2>
but expected one of:
proc typeset(font: Font; runes: seq[Rune]; pos: Vec2 = vec2(0, 0);
            size: Vec2 = vec2(0, 0); hAlign: HAlignMode = Left; vAlign: VAlignMode = Top;
            clip = true; tabWidth: float32 = 0.0): seq[GlyphPosition]
  first type mismatch at position: 8
  unknown named parameter: boundsMin
proc typeset(font: Font; text: string; pos: Vec2 = vec2(0, 0); size: Vec2 = vec2(0, 0);
            hAlign: HAlignMode = Left; vAlign: VAlignMode = Top; clip = true;
            tabWidth: float32 = 0.0): seq[GlyphPosition]
  first type mismatch at position: 2
  required type for text: string
  but expression 'toRunes(node.text)' is of type: seq[Rune]

expression: typeset(font, toRunes(node.text), pos = vec2(0, 0), size = size,
        hAlignMode(node.textStyle.textAlignHorizontal),
        vAlignMode(node.textStyle.textAlignVertical), clip = false,
        boundsMin = boundsMin, boundsMax = boundsMax)

fidget causes `nim-lang/Nim` packages CI to fail

See nim-lang/Nim@73299b0 and the log:

    Compiling /home/runner/work/Nim/Nim/pkgstemp/fidget/tests/test (from package fidget) using c backend
  /home/runner/.nimble/pkgs/typography-0.6.0/typography/font.nim(25, 22) Error: undeclared identifier: 'Segment'

It looks like this is due to a recent change in https://github.com/treeform/bumpy/ or https://github.com/treeform/pixie/.

I'll ping @guzba here, since they aren't watching this repo and it looks like they might also know how to fix it.

Polygon element support

Support for Figma's polygon element. Because there's lacking support of both polygons and unicodes in Fidget I cannot create arrow buttons. Maybe this is possible with images, but I like to use simple elements.

Thank you!

Error compiling demos: .../.nimble/pkgs/pixie-0.0.15/pixie/images.nim(88, 28) Error: undeclared identifier: 'image'

As per title.

For example, when I try to compile and run the minimal example with nim c -r minimal.nim, I get the following output:

Hint: used config file '/usr/local/Nim/config/nim.cfg' [Conf]
Hint: used config file '/usr/local/Nim/config/config.nims' [Conf]
Hint: used config file '/usr/local/fidget/config.nims' [Conf]
Hint: used config file '/usr/local/fidget/examples/config.nims' [Conf]
..............................................
/Users/joubert/.nimble/pkgs/pixie-0.0.15/pixie/images.nim(88, 28) Error: undeclared identifier: 'image'

Compiler errors when trying to run examples as JS

Hello! I saw your Nim Conf presentation and I'm a total Nim newbie but wanted to try out these examples.

~/projects/fidget/examples/gradaui nim -v
Nim Compiler Version 1.2.6 [MacOSX: amd64]
Compiled at 2020-08-17
Copyright (c) 2006-2020 by Andreas Rumpf

active boot switches: -d:release
~/projects/fidget/examples/gradaui
 ~/projects/fidget/examples/gradaui nim js gradaui.nim
<snipped out stuff>
/Users/andrew/projects/fidget/examples/gradaui/gradaui.nim(514, 12) Error: type mismatch: got <proc (){.locks: <unknown>.}, w: int literal(840), h: int literal(1320)>
but expected one of:
proc startFidget(draw: proc (); load: proc (); w = 0; h = 0)
  first type mismatch at position: 4
  missing parameter: load

expression: startFidget(drawMain, w = 840, h = 1320)

Thought I'd pass along this report; I can't get any of them to run as HTML.

Unhandled exception in example: hn.nim (Hacker News)

hn.nim throws a KeyError exception when comments are disabled.

It works if you replace:

characters $call.json["descendants"].getInt() & " comments"

With:

try:
  characters $call.json["descendants"].getInt() & " comments"
except KeyError:
  characters "comments disabled"

The HN website just says "3 hours ago | hide" so it isn't a perfect match.

Here's the JSON for a HN post with comments disabled:

{
  "by": "thomaspaulmann",
  "id": 25217586,
  "score": 1,
  "time": 1606374063,
  "title": "Raycast (YC W20) Is Hiring Fullstack Software Engineers (EU, Remote)",
  "type": "job",
  "url": "https://raycast.com/jobs/software-engineer-fullstack"
}

examples error on flippy

I followed the getting started directions and cloned the repo. entered into the fidget directory and ran nimble install

nimble install
Verifying dependencies for [email protected]

Info: Dependency on flippy@>= 0.2.0 already satisfied
Verifying dependencies for [email protected]

Im using the newest version of nim
nim --version
Nim Compiler Version 1.3.1 [MacOSX: amd64]
Compiled at 2020-04-16
Copyright (c) 2006-2020 by Andreas Rumpf

git hash: 9295251e68ee86b512de51a2f650729ac6893104
active boot switches: -d:release

when I try and run any of the examples I receive the following errors...

cd examples/bars
nim c -r bars.nim

Hint: textures [Processing] /Users/mymachine/.nimble/pkgs/fidget-0.3.1/fidget/opengl/context.nim(194, 53) Error: undeclared identifier: 'Flippy'

using choosenim I've tried 1.0.6 and 1.3.1. same error

Install plugin on figma...

Hi!, how could I install this plugin into figma?

I can't compile it with npm run build because there is not packages.json

some help?

thanks!

.nimble/pkgs/flippy-0.4.7/flippy.nim(1, 22) Error: cannot open file: chroma/blends

Any example I try gives this error:
flippy.nim(1, 22) Error: cannot open file: chroma/blends

What am I missing?
Thanks for a hint,
Helmut

nim --version gives

Nim Compiler Version 1.5.1 [Linux: amd64]
Compiled at 2021-01-07
Copyright (c) 2006-2020 by Andreas Rumpf

git hash: 89a21e4ec71e705833d2aacd069e291cf41a19c6
active boot switches: -d:release

[FR] FOSS Figma replacement/alternative

I recently watched your nimconf video (very entertaining) and was excited to try Fidget out, but since i've never heard of Figma, i was suspicious as to it's possibly dubious origin. Sure enough: It's Enslaveware! This is a non-starter for me. Please consider some human freedom-respecting alternative.
Thank you.

[Question] Image - aspect ratio

How can I keep the aspect ratio for an imported image?

In order to put an image I am doing something like the following:

dataDir = ""
proc drawMain() =
  frame "main":
    box 0, 0, 256, 256
    image "mypath/myfile.png"

But myfile.png is never square. Do I need to know the resolution beforehand to set the proper box or is there something that I can do to keep the aspect ratio?

How to export from Figma?

How can i export projects from figma to this?
I cant find fidgetgen mentioned in the figma example.
Can i somehow import the figma extension to figma?

Cannot use system fonts in a simple manner

If passing a absolute directory to the loadFont procedure it fails due to the procedure not checking if it's relative. Currently requires

let fontPath = relativePath("/usr/share/fonts/truetype/jetbrains-mono/JetBrainsMonoNL-Regular.ttf",dataDir)
loadFont("JetBrains", fontPath)

example compilation error

command executed:

nim c -r minimal

actual output:

/Users/pradeep/.nimble/pkgs/opengl-#head/opengl/private/errors.nim(27, 30) Error: type mismatch: got <int>
but expected one of:
proc `<`(x, y: int): bool
  first type mismatch at position: 2
  missing parameter: y
proc `<`(x, y: int64): bool
  first type mismatch at position: 2
  missing parameter: y
19 other mismatching symbols have been suppressed; compile with --showAllMismatches:on to see them

expression: <len(params)

WASM support?

When compiling for the web is only JS supported or also WASM?

How to run?

Hi, are there any instructions on how to run at least the fidget examples? I tried to compile at least fidgetgen (not sure what that is), but it complains about a missing dependency (chroma) which is not in the nimble file, so thought I should ask for instructions first.

GUI updates

If your program is inline with GUI code, how hard is it to make changes to the GUI? Can it be done with Figma or does it need to be done by editing source code after Initial implementation?

Unicode support

Magnificient project you have here!
It would be super if there was unicode support for the text elements. At the moment when I input unicodes to my fidget text elements they will render empty. I'm not exactly sure if this is a restriction in Figma and not in Fidger per se.

Documentation/tutorial how to create reusable things with Fidget and Figma

My imagination and skillset are too weak for figuring out how I could create reusable elements with Figma and Fidget together. At the moment if I'll model my UI in Figma and export it to Fidget, I'll get "spaghetti code" which I have to copypaste to my code editor and implement the logic over. If after this the UI will change in Figma, I'll have to do everything again which bugs me off.

Do you have any suggestions or possibility to create tutorial/documentation of the correct work-flow for Figma->Fidget?

Thank you!

Todo example is missing fonts

/Users/username/Projects/nim/fidget/examples/todo/todo.nim(6) todo
/Users/username/Projects/nim/fidget/src/fidget/openglbackend.nim(392) loadFont
/Users/username/.nimble/pkgs/typography-#head/typography/opentype/parser.nim(730) readFontTtf
/Users/username/.nimble/pkgs/typography-#head/typography/opentype/parser.nim(719) readFontOtf
Error: unhandled exception: File does not exist. [IOError]

Looks like IBMPlexSans-Regular.ttf and IBMPlexSans-Bold.ttf are missing from fidget/examples/todo/data/

Error: cannot open file: glfw3

Cannot run any of the examples because it says "Error: cannot open file: glfw3"

I tried to install the glfw3 library but it says it doesn't exist. But the [email protected] library exists and is installed.

install-info.txt
nim c -r bars.nim
...
Hint: dynlib [Processing]
Hint: input [Processing]
/home/hdias/Downloads/tmp/fidget/src/fidget/openglbackend/input.nim(1, 8) Warning: imported and not used: 'unicode' [UnusedImport]
Hint: perf [Processing]
Hint: strformat [Processing]
/home/hdias/Downloads/tmp/fidget/src/fidget/openglbackend/base.nim(4, 8) Error: cannot open file: glfw3

figma:Error: unable to load code

Error: Unable to load code: Error
    at Object.t.getLocalPluginCode (figma_app.8ffd94b1b78f2b15d294274a103c3fd1.min.js.br:778)
    at async runLocalPlugin (figma_app.8ffd94b1b78f2b15d294274a103c3fd1.min.js.br:1260)
    at async Object.runPlugin (figma_app.8ffd94b1b78f2b15d294274a103c3fd1.min.js.br:1260)
runLocalPlugin | @ | figma_app.8ffd94b1b7…3fd1.min.js.br:1260

figma on manjaro linux x64

demo example - Image and Constraint Menu Not responsive

Very cool project. Thanks for doing it.

Controls and Text side menus function as expected. 'Controls' currently 'Contorls'. Image and Contstraint Menu do not change the main view.

Let me know if you need more specific information.

I'm on Fedora 32, Nim Compiler 1.2.4.

Join Immediate Mode UI organization

Thanks for presenting Fidget on Nim conference! Was interesting to learn about the Figma->Fidget workflow etc.

I find it interesting, that you call this approach "imperative" without noting it's usually known under the term "immediate mode UI" construction πŸ˜‰ (as opposed to "retained UI" construction).

I'm myself quite into immediate mode UIs and here I'd like to propose joining the Immediate Mode UI organization whose purpose is to foster this UI construction style as well as being a hub of such UI libraries and last but not least a pool of motivated developer/maintainer "workforce".

There are no obligations (nor rules of any kind) in the org - it's really just to make projects more visible and networked.

demo code fails to build

I get the following error when trying to build demo.nim:
Error: undeclared identifier: 'hLeft'

None of these seem to be defined and I don't know how they're supposed to be determined:

hLeft, vTop, cMinG, vCenter, hCenter, hRight

[Add Drag and Drop] Question: How do I do drag and drop?

Hi! I'm loving the idea, thanks a lot!

I'd really like to use Fidget for a small app, but this uploads files, so I need a way to drag and drop files to be uploaded.

I assume I can do the actual uploading with httpPost call, but I can't see a way to do a drag and drop to the app window.

Is that at all possible now?

Android & iOS POC?

In the readme for Android & iOS it says "Proof of Concept." Is there an example for these or can you make instructions?

Error: could not find symbol: glTextureSubImage2D

Hi. Thanks for the great library and plugin. It seems like an awesome project with huge potential.

The minimal example crashes with this message when I try to run it (cross compiled from linux to windows)

Got exception ref 024366E0 --> [errorCode = 0,
parent = nil,
name = 005D60F0"LibraryError",
msg = 02440670"could not find symbol: glTextureSubImage2D",
trace = 0219B340@[
[procname = 005FDC70"remoted", line = 33, filename = 005FDAB0"/workspaces/remoted.nim"],
[procname = 005FD328"startFidget", line = 282, filename = 005FD1C4"/home/gitpod/.nimble/pkgs/fidget-0.2.1/fidget/backendopengl.nim"], 
[procname = 005FD204"setupFidget", line = 213, filename = 005FD1C4"/home/gitpod/.nimble/pkgs/fidget-0.2.1/fidget/backendopengl.nim"], 
[procname = 005FB459"start", line = 176, filename = 005FB394"/home/gitpod/.nimble/pkgs/fidget-0.2.1/fidget/openglbackend/base.nim"], 
[procname = 005FA7EC"glGetProc", line = 66, filename = 005FA7F8"/home/gitpod/.nimble/pkgs/opengl-1.2.3/opengl/private/prelude.nim"], 
[procname = 005D609E"raiseInvalidLibrary", line = 75, filename = 005D5FEC"/home/gitpod/.choosenim/toolchains/nim-1.0.4/lib/pure/dynlib.nim"]],
raiseId = 0,
up = nil]
 with message could not find symbol: glTextureSubImage2D

OpenGl?

What version of opengl does fidget support in it’s window?

Unable to compile example

Unable to compile example on Ubuntu 20.04 with Nim Compiler Version 1.4.2 [Linux: amd64]
Below is the output

Hint: used config file '/etc/nim/nim.cfg' [Conf]
Hint: used config file '/etc/nim/config.nims' [Conf]
Hint: used config file '/home/ravel/project/nim/fidget/config.nims' [Conf]
Hint: used config file '/home/ravel/project/nim/fidget/examples/config.nims' [Conf]
.......................................................................................................CC: stb_image
CC: x11_init
CC: x11_monitor
CC: x11_window
CC: xkb_unicode
CC: posix_time
CC: posix_thread
CC: glx_context
CC: egl_context
CC: osmesa_context
CC: linux_joystick
CC: context
CC: init
CC: input
CC: monitor
CC: vulkan
CC: window
CC: stdlib_assertions.nim
CC: stdlib_dollars.nim
CC: stdlib_formatfloat.nim
CC: stdlib_io.nim
CC: stdlib_system.nim
CC: stdlib_algorithm.nim
CC: ../../../../../.nimble/pkgs/chroma-0.1.5/chroma/colortypes.nim
CC: stdlib_math.nim
CC: stdlib_hashes.nim
CC: stdlib_tables.nim
CC: ../../../../../.nimble/pkgs/chroma-0.1.5/chroma/names.nim
CC: ../../../../../.nimble/pkgs/chroma-0.1.5/chroma/transformations.nim
CC: stdlib_parseutils.nim
CC: stdlib_unicode.nim
CC: stdlib_strutils.nim
CC: ../../../../../.nimble/pkgs/chroma-0.1.5/chroma.nim
CC: ../../src/fidget/input.nim
CC: stdlib_sequtils.nim
CC: stdlib_options.nim
CC: stdlib_times.nim
CC: stdlib_random.nim
CC: stdlib_strformat.nim
CC: ../../../../../.nimble/pkgs/vmath-0.3.3/vmath.nim
CC: stdlib_streams.nim
CC: stdlib_lexbase.nim
CC: stdlib_json.nim
CC: ../../../../../.nimble/pkgs/typography-0.6.0/typography/opentype/types.nim
CC: ../../../../../.nimble/pkgs/pixie-0.0.3/pixie/common.nim
CC: ../../../../../.nimble/pkgs/pixie-0.0.3/pixie/images.nim
CC: ../../../../../.nimble/pkgs/pixie-0.0.3/pixie/fileformats/bmp.nim
CC: ../../../../../.nimble/pkgs/zippy-0.3.13/zippy/zippyerror.nim
CC: ../../../../../.nimble/pkgs/zippy-0.3.13/zippy/common.nim
CC: ../../../../../.nimble/pkgs/zippy-0.3.13/zippy/crc.nim
CC: ../../../../../.nimble/pkgs/zippy-0.3.13/zippy/bitstreams.nim
CC: ../../../../../.nimble/pkgs/zippy-0.3.13/zippy/inflate.nim
CC: ../../../../../.nimble/pkgs/zippy-0.3.13/zippy.nim
CC: ../../../../../.nimble/pkgs/pixie-0.0.3/pixie/fileformats/png.nim
CC: ../../../../../.nimble/pkgs/pixie-0.0.3/pixie/fileformats/stb_image/stb_image.nim
CC: ../../../../../.nimble/pkgs/pixie-0.0.3/pixie/fileformats/jpg.nim
CC: stdlib_pathnorm.nim
CC: stdlib_os.nim
CC: ../../../../../.nimble/pkgs/pixie-0.0.3/pixie.nim
CC: ../../../../../.nimble/pkgs/typography-0.6.0/typography/font.nim
CC: ../../../../../.nimble/pkgs/typography-0.6.0/typography/opentype/parser.nim
CC: ../../../../../.nimble/pkgs/typography-0.6.0/typography/rasterizer.nim
CC: ../../../../../.nimble/pkgs/typography-0.6.0/typography/layout.nim
CC: stdlib_parsexml.nim
CC: stdlib_strtabs.nim
CC: stdlib_xmltree.nim
CC: stdlib_xmlparser.nim
CC: ../../../../../.nimble/pkgs/typography-0.6.0/typography/svg.nim
CC: ../../../../../.nimble/pkgs/typography-0.6.0/typography/textboxes.nim
CC: stdlib_heapqueue.nim
CC: stdlib_deques.nim
CC: stdlib_asyncfutures.nim
CC: ../../src/fidget/common.nim
CC: ../../src/fidget/internal.nim
CC: stdlib_dynlib.nim
CC: ../../../../../.nimble/pkgs/opengl-1.2.6/opengl.nim
CC: stdlib_monotimes.nim
CC: ../../src/fidget/opengl/perf.nim
CC: ../../src/fidget/opengl/base.nim
CC: ../../src/fidget/opengl/buffers.nim
CC: ../../src/fidget/opengl/shaders.nim
CC: ../../src/fidget/opengl/textures.nim
CC: ../../../../../.nimble/pkgs/supersnappy-2.0.0/supersnappy/common.nim
CC: ../../../../../.nimble/pkgs/supersnappy-2.0.0/supersnappy.nim
CC: ../../src/fidget/opengl/formatflippy.nim
CC: ../../src/fidget/opengl/context.nim
CC: stdlib_nativesockets.nim
CC: stdlib_base64.nim
CC: stdlib_selectors.nim
CC: stdlib_asyncdispatch.nim
CC: stdlib_httpclient.nim
CC: ../../src/fidget/openglbackend.nim
CC: ../../src/fidget.nim
CC: demo.nim

Hint:  [Link]


/usr/bin/ld: cannot find -lXxf86vm
collect2: error: ld returned 1 exit status
Error: execution of an external program failed: 'gcc   -o /home/ravel/project/nim/fidget/examples/demo/demo  /home/ravel/.cache/nim/demo_d/stb_image.c.o /home/ravel/.cache/nim/demo_d/x11_init.c.o /home/ravel/.cache/nim/demo_d/x11_monitor.c.o /home/ravel/.cache/nim/demo_d/x11_window.c.o /home/ravel/.cache/nim/demo_d/xkb_unicode.c.o /home/ravel/.cache/nim/demo_d/posix_time.c.o /home/ravel/.cache/nim/demo_d/posix_thread.c.o /home/ravel/.cache/nim/demo_d/glx_context.c.o /home/ravel/.cache/nim/demo_d/egl_context.c.o /home/ravel/.cache/nim/demo_d/osmesa_context.c.o /home/ravel/.cache/nim/demo_d/linux_joystick.c.o /home/ravel/.cache/nim/demo_d/context.c.o /home/ravel/.cache/nim/demo_d/init.c.o /home/ravel/.cache/nim/demo_d/input.c.o /home/ravel/.cache/nim/demo_d/monitor.c.o /home/ravel/.cache/nim/demo_d/vulkan.c.o /home/ravel/.cache/nim/demo_d/window.c.o /home/ravel/.cache/nim/demo_d/stdlib_assertions.nim.c.o /home/ravel/.cache/nim/demo_d/stdlib_dollars.nim.c.o /home/ravel/.cache/nim/demo_d/stdlib_formatfloat.nim.c.o /home/ravel/.cache/nim/demo_d/stdlib_io.nim.c.o /home/ravel/.cache/nim/demo_d/stdlib_system.nim.c.o /home/ravel/.cache/nim/demo_d/stdlib_algorithm.nim.c.o /home/ravel/.cache/nim/demo_d/@m..@s..@s..@s..@[email protected]@[email protected]@[email protected] /home/ravel/.cache/nim/demo_d/stdlib_math.nim.c.o /home/ravel/.cache/nim/demo_d/stdlib_hashes.nim.c.o /home/ravel/.cache/nim/demo_d/stdlib_tables.nim.c.o /home/ravel/.cache/nim/demo_d/@m..@s..@s..@s..@[email protected]@[email protected]@[email protected] /home/ravel/.cache/nim/demo_d/@m..@s..@s..@s..@[email protected]@[email protected]@[email protected] /home/ravel/.cache/nim/demo_d/stdlib_parseutils.nim.c.o /home/ravel/.cache/nim/demo_d/stdlib_unicode.nim.c.o /home/ravel/.cache/nim/demo_d/stdlib_strutils.nim.c.o /home/ravel/.cache/nim/demo_d/@m..@s..@s..@s..@[email protected]@[email protected]@schroma.nim.c.o /home/ravel/.cache/nim/demo_d/@m..@s..@ssrc@[email protected] /home/ravel/.cache/nim/demo_d/stdlib_sequtils.nim.c.o /home/ravel/.cache/nim/demo_d/stdlib_options.nim.c.o /home/ravel/.cache/nim/demo_d/stdlib_times.nim.c.o /home/ravel/.cache/nim/demo_d/stdlib_random.nim.c.o /home/ravel/.cache/nim/demo_d/stdlib_strformat.nim.c.o /home/ravel/.cache/nim/demo_d/@m..@s..@s..@s..@[email protected]@[email protected]@svmath.nim.c.o /home/ravel/.cache/nim/demo_d/stdlib_streams.nim.c.o /home/ravel/.cache/nim/demo_d/stdlib_lexbase.nim.c.o /home/ravel/.cache/nim/demo_d/stdlib_json.nim.c.o /home/ravel/.cache/nim/demo_d/@m..@s..@s..@s..@[email protected]@[email protected]@stypography@[email protected] /home/ravel/.cache/nim/demo_d/@m..@s..@s..@s..@[email protected]@[email protected]@[email protected] /home/ravel/.cache/nim/demo_d/@m..@s..@s..@s..@[email protected]@[email protected]@[email protected] /home/ravel/.cache/nim/demo_d/@m..@s..@s..@s..@[email protected]@[email protected]@spixie@[email protected] /home/ravel/.cache/nim/demo_d/@m..@s..@s..@s..@[email protected]@[email protected]@[email protected] /home/ravel/.cache/nim/demo_d/@m..@s..@s..@s..@[email protected]@[email protected]@[email protected] /home/ravel/.cache/nim/demo_d/@m..@s..@s..@s..@[email protected]@[email protected]@[email protected] /home/ravel/.cache/nim/demo_d/@m..@s..@s..@s..@[email protected]@[email protected]@[email protected] /home/ravel/.cache/nim/demo_d/@m..@s..@s..@s..@[email protected]@[email protected]@[email protected] /home/ravel/.cache/nim/demo_d/@m..@s..@s..@s..@[email protected]@[email protected]@szippy.nim.c.o /home/ravel/.cache/nim/demo_d/@m..@s..@s..@s..@[email protected]@[email protected]@spixie@[email protected] /home/ravel/.cache/nim/demo_d/@m..@s..@s..@s..@[email protected]@[email protected]@spixie@sfileformats@sstb_image@sstb_image.nim.c.o /home/ravel/.cache/nim/demo_d/@m..@s..@s..@s..@[email protected]@[email protected]@spixie@[email protected] /home/ravel/.cache/nim/demo_d/stdlib_pathnorm.nim.c.o /home/ravel/.cache/nim/demo_d/stdlib_os.nim.c.o /home/ravel/.cache/nim/demo_d/@m..@s..@s..@s..@[email protected]@[email protected]@spixie.nim.c.o /home/ravel/.cache/nim/demo_d/@m..@s..@s..@s..@[email protected]@[email protected]@[email protected] /home/ravel/.cache/nim/demo_d/@m..@s..@s..@s..@[email protected]@[email protected]@stypography@[email protected] /home/ravel/.cache/nim/demo_d/@m..@s..@s..@s..@[email protected]@[email protected]@[email protected] /home/ravel/.cache/nim/demo_d/@m..@s..@s..@s..@[email protected]@[email protected]@[email protected] /home/ravel/.cache/nim/demo_d/stdlib_parsexml.nim.c.o /home/ravel/.cache/nim/demo_d/stdlib_strtabs.nim.c.o /home/ravel/.cache/nim/demo_d/stdlib_xmltree.nim.c.o /home/ravel/.cache/nim/demo_d/stdlib_xmlparser.nim.c.o /home/ravel/.cache/nim/demo_d/@m..@s..@s..@s..@[email protected]@[email protected]@[email protected] /home/ravel/.cache/nim/demo_d/@m..@s..@s..@s..@[email protected]@[email protected]@[email protected] /home/ravel/.cache/nim/demo_d/stdlib_heapqueue.nim.c.o /home/ravel/.cache/nim/demo_d/stdlib_deques.nim.c.o /home/ravel/.cache/nim/demo_d/stdlib_asyncfutures.nim.c.o /home/ravel/.cache/nim/demo_d/@m..@s..@ssrc@[email protected] /home/ravel/.cache/nim/demo_d/@m..@s..@ssrc@[email protected] /home/ravel/.cache/nim/demo_d/stdlib_dynlib.nim.c.o /home/ravel/.cache/nim/demo_d/@m..@s..@s..@s..@[email protected]@[email protected]@sopengl.nim.c.o /home/ravel/.cache/nim/demo_d/stdlib_monotimes.nim.c.o /home/ravel/.cache/nim/demo_d/@m..@s..@ssrc@sfidget@[email protected] /home/ravel/.cache/nim/demo_d/@m..@s..@ssrc@sfidget@[email protected] /home/ravel/.cache/nim/demo_d/@m..@s..@ssrc@sfidget@[email protected] /home/ravel/.cache/nim/demo_d/@m..@s..@ssrc@sfidget@[email protected] /home/ravel/.cache/nim/demo_d/@m..@s..@ssrc@sfidget@[email protected] /home/ravel/.cache/nim/demo_d/@m..@s..@s..@s..@[email protected]@[email protected]@[email protected] /home/ravel/.cache/nim/demo_d/@m..@s..@s..@s..@[email protected]@[email protected]@ssupersnappy.nim.c.o /home/ravel/.cache/nim/demo_d/@m..@s..@ssrc@sfidget@[email protected] /home/ravel/.cache/nim/demo_d/@m..@s..@ssrc@sfidget@[email protected] /home/ravel/.cache/nim/demo_d/stdlib_nativesockets.nim.c.o /home/ravel/.cache/nim/demo_d/stdlib_base64.nim.c.o /home/ravel/.cache/nim/demo_d/stdlib_selectors.nim.c.o /home/ravel/.cache/nim/demo_d/stdlib_asyncdispatch.nim.c.o /home/ravel/.cache/nim/demo_d/stdlib_httpclient.nim.c.o /home/ravel/.cache/nim/demo_d/@m..@s..@ssrc@[email protected] /home/ravel/.cache/nim/demo_d/@m..@s..@[email protected] /home/ravel/.cache/nim/demo_d/@mdemo.nim.c.o  -lm -lrt -pthread -lGL -lX11 -lXrandr -lXxf86vm -lXi -lXcursor -lm -lXinerama   -ldl'

What is meaning of backend?

Is the output? Or Input?

I am searching a super fast html-css renderer engine via OpenGL, OpenGL ES, Metal, Vulkan works on ios and android. Also web can be done with WebGL. Because CSS3 API is so amazing so powerful.

I analyzed xamarin, flutter, react, vue, ios api, android api, cordova, fusetools but none is right.
Flutter rending on skia engine and fusetools rendering on opengl but there is no way to use any libraries or templates. Also CSS isn't available. So I have to develop all the things over.

Why not direct design to opengl rendering?

  • There are a tons of designs systems so it's usefull. https://adele.uxpin.com/
  • There are tons of css snippets, tons of animation libraries
  • There are figma to html, sketch to html like converters staying already

When design to opengl rendering usefull?

  • When you have to code your design but it can be done with design to html than html to rendering

So both are required.

The solution steps:

  1. Design to code
  2. Code to webGL, OpenGL etc.

OR just the opposite

  1. Render react components in sketch (the tool by airbnb) only available for react.
  2. Import sketch files in figma. Both of converted and handmades.
  3. Render figma files in a 2d engine.

Which way possible? Which way we need to go? I think we can find the right way and create a practical solution.

Counter-intuitive behaviour of event templates

First thank you for this library! I'm new in the Nim world and in the "imperative UI style" world thanks to you :)

I played with the minimal.nim example and I noticed the behaviour is not the same for the following three pieces of code, which differ in the order of those statements: fill, onHover: fill and onClick: fill.

With this example onHover and onClick work as I expected:

## This minimal example shows 5 blue squares.

import fidget

proc drawMain() =
  frame "main":
    box 0, 0, 620, 140
    for i in 0 .. 4:
      group "block":
        box 20 + i * 120, 20, 100, 100
        fill "#2B9FEA"
        onHover:
          fill "#000"
        onClick:
          fill "#FFF"

startFidget(drawMain, w = 620, h = 140)

While with this example, onHover and onClick have no effect:

## This minimal example shows 5 blue squares.

import fidget

proc drawMain() =
  frame "main":
    box 0, 0, 620, 140
    for i in 0 .. 4:
      group "block":
        box 20 + i * 120, 20, 100, 100
        onClick:
          fill "#FFF"
        onHover:
          fill "#000"
        fill "#2B9FEA"

startFidget(drawMain, w = 620, h = 140)

Here, onHover works but not onClick:

import fidget

proc drawMain() =
  frame "main":
    box 0, 0, 620, 140
    for i in 0 .. 4:
      group "block":
        box 20 + i * 120, 20, 100, 100
        fill "#2B9FEA"
        onClick:
          fill "#FFF"
        onHover:
          fill "#000"

startFidget(drawMain, w = 620, h = 140)

I think it is at least surprising for a new user, because it differs from this other example: the observed behaviour is independent on the position of box 20 + i * 120, 20, 100, 100 statement inside the group "block".

Do you think that this is a "documentation issue" or that this behaviour is not expected?

Error: execution of an external compiler program

Here's the whole error:

Error: execution of an external compiler program 'gcc -c  -w -D_GLFW_X11  -I/home/divy/.choosenim/toolchains/nim-1.0.6/lib -I/home/divy/fidget/examples/bars -o /home/divy/.cache/nim/bars_d/x11_init.c.o /home/divy/.nimble/pkgs/staticglfw-4.0.1/staticglfw/x11_init.c' failed with exit code: 1

In file included from /home/divy/.nimble/pkgs/staticglfw-4.0.1/staticglfw/internal.h:187:0,
                 from /home/divy/.nimble/pkgs/staticglfw-4.0.1/staticglfw/x11_init.c:30:
/home/divy/.nimble/pkgs/staticglfw-4.0.1/staticglfw/x11_platform.h:36:10: fatal error: X11/Xcursor/Xcursor.h: No such file or directory
 #include <X11/Xcursor/Xcursor.h>
          ^~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.

I'm trying to run the examples. And this error occurs for every one of them.
I am on Ubuntu 18.04 LTS.

Thanks.

[Question] why does image add prefix automatically?

I'm doing some homeworks using fidget.

image

I use native file dialog in windows with fidget and it works fine. But I need to display image in window from the file dialog. image function will automatically add data prefix to path. I have to modify the source code to display images.

By the way sometimes I need to disable image cache. Now I have to set different names for the images. I hope fidget can supply this options. Are there some road maps for fidget, maybe I can participate in:)

Thanks!

White window or IndexDefect with version 0.5.0

Dear treeform,

The following has been introduced after 54d4239 (it worked correctly with that commit).

Here are the step I followed:

git clone https://github.com/treeform/fidget.git  # == commit "0.5.0"
cd fidget
mkdir nimbledeps  # I use this to have a fresh "environment"
nimble develop
cd example/minimal
nim c --nimblePath:../../nimbledeps/pkgs -r minimal.nim

The minimal example compiles and runs without error but the resulting window is entirely white. It is the same for area example.

Other examples (demo, hn, gradui) that I tried have the following (or a similar) error at run:

examples/demo$ nim c --nimblePath:../../nimbledeps/pkgs -r demo.nim
Hint: used config file '~/.choosenim/toolchains/nim-1.4.2/config/nim.cfg' [Conf]
Hint: used config file '~/.choosenim/toolchains/nim-1.4.2/config/config.nims' [Conf]
Hint: used config file '{repo_root}/config.nims' [Conf]
Hint: used config file '{repo_root}/examples/config.nims' [Conf]
Hint: 22833 lines; 0.029s; 20.652MiB peakmem; Debug build; proj: {repo_root}/examples/demo/demo.nim; out: {repo_root}/examples/demo/demo [SuccessX]
Hint: {repo_root}/examples/demo/demo  [Exec]
{repo_root}/examples/demo/demo.nim(404) demo
{repo_root}/src/fidget/openglbackend.nim(408) startFidget
{repo_root}/src/fidget/opengl/base.nim(144) updateLoop
{repo_root}/src/fidget/opengl/base.nim(116) drawAndSwap
{repo_root}/src/fidget/openglbackend.nim(335) :anonymous
{repo_root}/src/fidget/openglbackend.nim(283) draw
{repo_root}/src/fidget/openglbackend.nim(283) draw
{repo_root}/src/fidget/openglbackend.nim(283) draw
{repo_root}/src/fidget/openglbackend.nim(271) draw
{repo_root}/src/fidget/opengl/context.nim(569) strokeRoundedRect
{repo_root}/src/fidget/opengl/formatflippy.nim(368) strokeRoundedRect
{repo_root}/src/fidget/opengl/formatflippy.nim(271) blit
{repo_root}/src/fidget/opengl/formatflippy.nim(210) blit
{repo_root}/src/fidget/opengl/formatflippy.nim(169) blitUnsafe
~/.choosenim/toolchains/nim-1.4.2/lib/system/fatal.nim(49) sysFatal
Error: unhandled exception: index 48 not in 0 .. 35 [IndexDefect]
Error: execution of an external program failed: '{repo_root}/examples/demo/demo '

I have no issue when using js compiler.

I work on a debian 10.

Please tell me if you need additional details to understand/reproduce.

[Question] Scroll

Could you post an example about the proper way to do scrolling?

Regards,
JosΓ© MarΓ­a

fidget 2?

I read in a comment of an open pull request, that you're working on a fidget 2 already? Is there any more detailed information on that?

Linux support + Idea (Publish the Fidget plugin so that it works on Linux)

So I try to use it from Linux, I found a community made Figma clone, but is very limited, and Plugins wont work, neither from Web,
so maybe I was wondering why not just use the Plugin that serializes to JSON that works everywhere including web?.

Then parse back from JSON on Nim using std lib JSON module, otherwise mention on the readme that it wont work on Linux.
:)

Issues running examples on Osx

Hello,
Just want to say thank you for developing this new gui lib.

Issues: The file compiles just fine using nim c --version Nim Compiler Version 1.2.4 [MacOSX: amd64]
Compiled at 2020-07-22
Copyright (c) 2006-2020 by Andreas Rumpf

git hash: 54cb1eed34361bfd91b66541b2802bd0a68a4fae
active boot switches: -d:release

I then take this code

`
import fidget

loadFont("Inconsolata", "Inconsolata-Regular.ttf")

setTitle("Pad of Code")

var
textValue = """
-- sql query
SELECT foo
FROM bar
WHERE a = 234 and b = "nothing"
"""

proc drawMain() =

frame "main":                                                                             
  box 0, 0, parent.box.w-20, parent.box.h                                                 
  font "Inconsolata", 16.0, 400.0, 20, hLeft, vTop                                        
  fill "#F7F7F9"                                                                          
                                                                                          
  text "codebox":                                                                         
    box 0, 0, parent.box.w, parent.box.h                                                  
    fill "#000000"                                                                        
    multiline true                                                                        
    binding textValue                                                                     

startFidget(drawMain)
`

and compile via nim c -r padofcode.nim
it compiles fine and gives me:
Hint: 164910 LOC; 16.055 sec; 215.82MiB peakmem; Debug build; proj: /Users/.env/nim/fidget/padofcode/padofcode.nim; out: /.env/nim/fidget/padofcode/padofcode [SuccessX]

but gives me an error when trying to run it.

""
Hint: /Users/.env/nim/fidget/padofcode/padofcode [Exec]
/Users/.env/nim/fidget/padofcode/padofcode.nim(5) padofcode
/Users/.nimble/pkgs/fidget-0.4.2/fidget/openglbackend.nim(392) loadFont
/Users/.nimble/pkgs/typography-#head/typography/opentype/parser.nim(730) readFontTtf
/Users/.nimble/pkgs/typography-#head/typography/opentype/parser.nim(722) readFontOtf
/Users/.nimble/pkgs/typography-#head/typography/opentype/parser.nim(641) readFontOtf
/Users/.choosenim/toolchains/nim-1.2.4/lib/pure/collections/tables.nim(262) []
Error: unhandled exception: key not found: head [KeyError]
Error: execution of an external program failed: '/Users/.env/nim/fidget/padofcode/padofcode '
""

Here is my treeview:

.
β”œβ”€β”€ data
β”‚Β Β  └── Inconsolata-Regular.ttf
β”œβ”€β”€ padofcode
└── padofcode.nim

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.