Coder Social home page Coder Social logo

box-cli-maker's Introduction


logo


Go Reference godocs.io CI Go Report Card GolangCI GitHub release Mentioned in Awesome Go

Features

  • Make a Terminal Box in 8๏ธโƒฃ inbuilt different styles
  • 16 Inbuilt Colors and True Color Support ๐ŸŽจ
  • Custom Title Positions ๐Ÿ“
  • Make your Terminal Box style ๐Ÿ“ฆ
  • Support for ANSI, Tabbed, Multi-line and Line Wrapping boxes ๐Ÿ“‘
  • Align the text according to your needs ๐Ÿ“
  • Unicode, Emoji and Windows Console Support ๐Ÿ˜‹
  • Written in ๐Ÿ‡ฌ ๐Ÿ‡ด

Installation

 go get github.com/Delta456/box-cli-maker/v2

Usage Tutorial

In main.go

package main

import "github.com/Delta456/box-cli-maker/v2"

func main() {
 Box := box.New(box.Config{Px: 2, Py: 5, Type: "Single", Color: "Cyan"})
 Box.Print("Box CLI Maker", "Highly Customized Terminal Box Maker")
}

box.New(config Config) takes Box Config and returns a Box from the given Config.

  • Parameters
    • Px : Horizontal Padding
    • Py : Vertical Padding
    • ContentAlign : Content Alignment inside Box i.e. Center, Left and Right
    • Type: Box Type
    • TitlePos : Title Position of Box i.e. Inside, Top and Bottom
    • Color : Box Color
    • TitleColor : Title Color
    • ContentColor : Content Color
    • AllowWrapping: Flag to allow custom Content wrapping
    • WrappingLimit: Wrap the Content up to the Limit

Box Methods

Box.Print(title, lines string) prints Box from the specified arguments.

  • Parameters
    • title : Box Title
    • lines : Box Content

Box.Println(title, lines string) prints Box in a newline from the specified arguments.

  • Parameters
    • title : Box Title
    • lines : Box Content

Box.String(title, lines string) string returns string representation of Box.

  • Parameters
    • title : Box Title
    • lines : Box Content

Box Types

  • Single

single

  • Single Double

single_double

  • Double

double

  • Double Single

double_single

  • Bold

bold

  • Round

round

  • Hidden

hidden

  • Classic

classic

Title Positions

  • Inside

single

  • Top

top

  • Bottom

bottom

Custom Box

A Custom Box can be created by using the built-in Box struct provided by the module.

type Box struct {
  TopRight    string // TopRight Corner Symbols
  TopLeft     string // TopLeft Corner Symbols
  Vertical    string // Vertical Bar Symbols
  BottomRight string // BottomRight Corner Symbols
  BottomLeft  string // BottomLeft Corner Symbols
  Horizontal  string // Horizontal Bar Symbols
  Config             // Box Config
}

Usage

In main.go:

package main

import "github.com/Delta456/box-cli-maker/v2"

func main() {
    config := box.Config{Px: 2, Py: 3, Type: "", TitlePos: "Inside"}
    boxNew := box.Box{TopRight: "*", TopLeft: "*", BottomRight: "*", BottomLeft: "*", Horizontal: "-", Vertical: "|", Config: config}
    boxNew.Println("Box CLI Maker", "Make Highly Customized Terminal Boxes")
}

custom

More examples can be found in the examples/ folder which you can explore yourself. Feel free to add more examples and submit a pr for the same.

Color Types

The gookit/color module provides support for colors in your program. It uses two main types: FgColor and FgHiColor. These types correspond to different color settings.Color is a key for the following maps:

 fgColors map[string]color.Color = {
  "Black":   color.FgBlack,
  "Blue":    color.FgBlue,
  "Red":     color.FgRed,
  "Green":   color.FgGreen,
  "Yellow":  color.FgYellow,
  "Cyan":    color.FgCyan,
  "Magenta": color.FgMagenta,
  "White":   color.FgWhite,
}

 fgHiColors map[string]color.Color = {
  "HiBlack":   color.FgDarkGray,
  "HiBlue":    color.FgLightBlue,
  "HiRed":     color.FgLightRed,
  "HiGreen":   color.FgLightGreen,
  "HiYellow":  color.FgLightYellow,
  "HiCyan":    color.FgLightCyan,
  "HiMagenta": color.FgLightMagenta,
  "HiWhite":   color.FgLightWhite,
}

There are two maps, fgColors and fgHiColors, which map color names to their respective settings. Here are some examples:

  • fgColors maps basic colors like Black, Blue, Red, Green, Yellow, Cyan, Magenta, and White.
  • fgHiColors maps high-intensity colors like HiBlack, HiBlue, HiRed, HiGreen, HiYellow, HiCyan, HiMagenta, and HiWhite.

If you want to use high-intensity colors, make sure the color name starts with "Hi." If the color option is empty or invalid, no color will be applied.

You can also use True Colors by providing them as either a uint or [3]uint. For [3]uint, all elements must be in the range of [0, 0xFF], and for uint, it should be in the range of [0x000000, 0xFFFFFF].

If your terminal doesn't support True Colors, the module will automatically round the colors to match the terminal's maximum supported colors. This simplifies things for most users.

If you're curious about supported terminals, you can check the list of 24-bit supported terminals and 8-bit supported terminals.

Additionally, this module enables True Color and 256 Colors support on Windows Console through Virtual Terminal Processing. However, for 256 colors, you need at least Windows 10 Version 1511, and for True Color support, you need at least Windows 10 Version 1607.

Finally, if you're using Windows, the module can detect ConEmu or ANSICON if they're installed. To ensure the best experience, it's recommended to use the latest versions of both programs.

Content Wrapping

This library allows the usage of custom wrapping of Content so that the Box formed will be created according to your own needs.

To use this feature, you need to do two things:

  1. Set Config.AllowWrapping to true. This tells the library to allow custom wrapping.

  2. Optionally, you can set your own wrapping limit using Config.WrappingLimit. By default, the wrapping limit is set to 2/3 of the current terminal's width (TermWidth).

So, in simple terms, if you want to customize how content is wrapped in boxes, make sure to enable wrapping with Config.AllowWrapping, and if needed, you can adjust the wrapping limit using Config.WrappingLimit, which is initially set to 2/3 of the terminal's width.

Note

1. Vertical Alignment

As different terminals have different fonts by default, the right vertical alignment may not be aligned well. You will have to change your font accordingly to make it work.

2. Limitations of Unicode and Emoji

Unicode is a character encoding standard that assigns unique codes to characters from various writing systems, allowing universal text representation.

This library relies on mattn/go-runewidth to support Unicode and Emoji characters but consider the following:

  1. Proper rendering of Unicode and Emojis on Windows is primarily supported by Windows Terminal, ConEmu, and Mintty as terminal emulators. They handle these characters well.

  2. Indic text (a script used in some Indian languages) may not display correctly in most terminals. It's important to note that support for Indic text is quite limited.

  3. Avoid using this library in certain environments like online code playgrounds such as Go Playground, Repl.it, and in Continuous Integration/Continuous Deployment (CI/CD) pipelines. These platforms typically use fonts that only support basic ASCII characters, making it problematic to accurately calculate character lengths when the font changes dynamically.

  4. Depending on your font settings, you may need to make adjustments to ensure proper rendering of Unicode and Emoji characters. Failure to do so could result in issues with vertical alignment.

In essence, while this library supports Unicode and Emojis, there are limitations and considerations to keep in mind, especially when dealing with different terminal environments and character sets.

3. Terminal Color Detection

For beginners, this library can adjust True Color to work with your terminal's capabilities, either 8-bit or 4-bit color.

Detecting your terminal's color capacity isn't always straightforward, and there's no universal method. However, if you know a solution for your specific terminal, you can contribute by making a pull request.

For Unix systems:

  • If True Color detection fails, you can set the COLORTERM environment variable to truecolor or 24bit for True Color support.

  • For 8-bit color-based terminals, if detection doesn't work, set the TERM environment variable to your terminal emulator's name followed by 256color, like xterm-256color.

Keep in mind that very old terminals like Windows Console (Legacy Mode) or terminals with TERM set to DUMB might not show color effects, and the module may output unexpected results or warnings.

It's generally not recommended to use this library with color effects in Online Playgrounds, CI/CD environments, Browsers, and similar platforms since color support varies, and detection is challenging. If you encounter issues, you can open an issue and suggest a solution!

4. Tabs

This library supports the usage of tabs but their use should be limited.

Projects using Box CLI Maker

Acknowledgements

I thank the following people and their packages whom I have studied and was able to port to Go accordingly.

Also special thanks to @elimsteve who helped me to optimize the code and told me the best possible ways to fix my problems, @JalonSolov for tab lines support and Kunal Raghav for making the library's logo.

Kudos to moul/golang-repo-template for their Go template.

License

Licensed under MIT

box-cli-maker's People

Contributors

anoushk1234 avatar ciaokitty avatar davesaah avatar delta456 avatar elimisteve 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

box-cli-maker's Issues

ASoC: enhance `README.md`

I have written a README which people don't bother reading because of its complexity, and the screenshots can be showcased in a better way.

[BUG] First line of text is centered when content align is non-centered

Describe the bug
When the ContentAlign is set to Left/Right and the TitlePos is not set to Inside, the first line of the content is still aligned to the center.
To Reproduce

package main

import "github.com/Delta456/box-cli-maker/v2"

func main() {
     bx := box.New(box.Config{
             Px: 2, 
             Py: 0, 
             Type: "Single", 
             ContentAlign: "Left", 
             Color: "Green", 
             TitlePos: "Top"
     })
     bx.Print("System Info", "Lorem Ipsum\nfoo bar hello world\n123456 abcdefghijk")
}

Expected behavior
The first line of the content should be aligned based on ContentAlign.

โ”Œ System Info โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  OS:     linux ubuntu                                  โ”‚
โ”‚  Arch:   x86_64                                        โ”‚
โ”‚  CPU:    Intel(R) Core(TM) i5-8250U CPU @ 1.60GHz x 8  โ”‚
โ”‚  RAM:    7.7 GiB                                       โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Screenshots / Logs

โ”Œ System Info โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                  OS:     linux ubuntu                  โ”‚
โ”‚  Arch:   x86_64                                        โ”‚
โ”‚  CPU:    Intel(R) Core(TM) i5-8250U CPU @ 1.60GHz x 8  โ”‚
โ”‚  RAM:    7.7 GiB                                       โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Versions (please complete the following information, if relevant):

  • Software version: 2.0.1
  • OS: Ubuntu 20.04
  • Golang version: `go version go1.15.2 linux/amd64

[BUG] Tabbed Title Lines don't work when TitlePos is not `Inside`

Describe the bug
Tabbed Title Lines don't work when TitlePos is not Inside.

To Reproduce

import "github.com/Delta456/box-cli-maker/v2"
func main() {
  Box := New(Config{Px: 2, Py: 5, Color: "Red", TitlePos: "Top"})
  Box.Println("	Box CLI	Maker		", `Make
			  Highly
				  Customized
					  Terminal
							   Boxes`)
}

Expected behavior
The Box should form normally as it should.

Versions (please complete the following information, if relevant):

  • Software version: v2.2.2
  • OS: Windows 10
  • Golang version: v1.17.3
  • Terminal using and Version: Windows Terminal V1.5

Additional context
N.A.

[BUG] Formatting of the Top Title is lost

Describe the bug
On the dev branch, If I write a Title and a text with formatting like 033[1m something \033[0m
The text formatting stay as it should be.
But the Title one loose its formatting.

To Reproduce

func main() {
        Box := box.New(box.Config{Px: 2, Py: 1, Type: "Single", Color: "Cyan", TitlePos: "Top"})
	Box.Print("\033[1mBroken\033[0m, sorry", "Btw \033[1mNot Broken\033[0m, very nice")
}

Screenshot from 2022-10-04 01-11-55

As you see Broken is not anymore Bold as it should be.

The output string is :

"\x1b[36mโ”Œ Broken, sorry โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”\x1b[0m\n\x1b[36mโ”‚\x1b[0m"

When it should be :

"\x1b[36mโ”Œ \x1b[1mBroken\x1b[0m\x1b[36m, sorry โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”\x1b[0m"

You have to somehow split by the reset tag \x1b[0m and add the color \x1b[36m after again.

Optimize package

The package needs to be optimized and rewritten a bit more so that it passes through Go Report Card.

[BUG] Multi line strings break vertical alignment

Describe the bug
The vertical alignment of the Box in the right will be broken if multi line strings are used.

To Reproduce
Steps to reproduce the behavior:

Box := box.New(box.Config{Px: 2, Py: 5, Type: Single})
Box.Println(`Box CLI Maker 
		foo foobar`, `Highly Customized Terminal Box Maker  
		bar`)

Expected behavior
The vertical alignment shouldn't break.

Screenshots / Logs
If applicable, add screenshots or logs to help explain your problem.

image

Versions (please complete the following information, if relevant):

  • Software version: v1.3.2
  • OS: Windows 10
  • Golang version: 1.15.3

ASoC: Remove `errorMsg` and replace it with `err` type

There is a function errorMsg which prints to the stderr stream when there is an error. In production open must never print to stderr because it may conflict with other things present in the product, and can cause debugging to become very hard.

For example, the below code can be turned into:

// roundOffTitleColor rounds off 24 bit Color to the terminals maximum color capacity for Title.
func (b Box) roundOffTitleColor(col color.RGBColor, title string) string {
	switch detectTerminalColor() {
	case terminfo.ColorLevelNone:
		errorMsg("[warning]: terminal does not support colors, using no effects")
		return title
	case terminfo.ColorLevelMillions:
		return col.Sprint(title)
	default:
		return col.C256().Sprint(title)
	}
}
// roundOffTitleColor rounds off 24 bit Color to the terminals maximum color capacity for Title.
func (b Box) roundOffTitleColor(col color.RGBColor, title string) (string, err) {
	switch detectTerminalColor() {
	case terminfo.ColorLevelNone:
		return title, errors.New("terminal does not support colors")
	case terminfo.ColorLevelMillions:
		return col.Sprint(title), nil
	default:
		return col.C256().Sprint(title), nil
	}
}

then, do the changes as per the need.

This is a very breaking change so this has to be some with cautious.

[BUG] `TestTabWithColorBox` test fails on macos terminal

Describe the bug
When running the test especially on TestTabWithColorBox, it crashes (specifically an out-of-bounds crash)

To Reproduce
Steps to reproduce the behavior:

  1. Test go test -v .
  2. See error

Expected behavior
Successful test

Screenshots / Logs
image

Versions (please complete the following information, if relevant):

  • Software version: dev branch
  • OS: Mac OS 11.6
  • Golang version: 1.19
  • Terminal using and Version: MacOS Terminal 2.11

Additional context
Debugging the text and the separator in runes shows the following results:

color.ClearCode(topBar): [9484 32 66 111 120 32 32 32 32 32 67 76 73 32 32 32 32 32 77 97 107 101 114 32 32 32 128230 32 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9488]
color.ClearCode(title): [66 111 120 32 32 32 67 76 73 32 32 32 32 32 77 97 107 101 114 32 32 32 128230]

the title text in the topbar in []runes (the color.clearCode(topBar)) is 66 111 120 32 32 32 32 32 67 76 73 32 32 32 32 32 77 97 107 101 114 32 32 32 128230
while the separator (the color.clearCode(title)) is 66 111 120 32 32 32 67 76 73 32 32 32 32 32 77 97 107 101 114 32 32 32 128230

if you look at it closely on the first set of 32s the text has 5 32s while the separator has only 3 32s

probably an issue with the ClearCode method

ASoC: update dependencies

Dependencies have been outdated for a long time, so they need to be updated to the latest version.

To know where to start updating look at go.mod.

[BUG] TopBar/BottomBar ain't aligned with rest of the Box when they have tabbed lines and `TitlePos` isn't `Inside`

Solving this error is very hard due to dependence on the number of tabs, length of string and b.Px and a magical number from which we will have to add/sub the title length according but this can only be found on during runtime according to my observations and experimenting so this value is dynamic.

For now I will have to put a panic when TitlePos isn't Inside and title has tab lines. I know doing this is a pretty big limitation as tab lines are frequently used but please understand that I cannot figure this out for now so just use spaces instead for now.

I would like someone to help me on this issue if they want do. I will be grateful!

[BUG] long text fails to wrap

Describe the bug
Text lines that are longer than terminal width fail to wrap inside the box

To Reproduce
You can reproduce the behaviour by simply creating a string that is longer than terminal width: notice that you can retrieve the current terminal length with

import (
    "golang.org/x/term"
)

width, _, err := term.GetSize(0)
if err != nil {
    return
}

and replicate a string of given width.

Then simply

Box.Print("title", long_string)

produces effects like this.

Expected behavior
The box wraps text automatically. Ideally the user can specify wrap after a certain length.

Workaround
At the moment I am making use of go-wordwrap to wrap the text myself before feeding it into the box.

import (
	"github.com/mitchellh/go-wordwrap"
)
Box.Print("title", wordwrap.WrapString(sb.String(), uint((2*width)/3)))

Versions (please complete the following information, if relevant):

Machine:   MacBookPro15,2
Kernel:     Darwin 21.2.0
OS         macOS 12.1.0 Monterey
Terminal   iTerm2 (Version 3.4.14)
Shell      /bin/zsh

[feature request] IO-independent output

Is your feature request related to a problem? Please describe.
Currently it only supports outputting to os.Stdout.

Describe the solution you'd like
Should take advantage of Go's io.Writer and have Stdout-specific configurations as a io.Writer-compliant type/struct. That way we can do stuff like simultaneous logging and displaying of output with io.MultiWriter

Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.

Additional context
See the io package.

[BUG] When your text have no-displayable characters, the box alignment won't be perfect.

Describe the bug
When your text have no-displayable characters, the box alignment won't be perfect.

To Reproduce

package main

import "github.com/Delta456/box-cli-maker/v2"

func main() {
	Box := box.New(box.Config{Px: 2, Py: 1, Type: "Single", Color: "Cyan", TitlePos: "Top"})
	Box.Print("\033[1mFirst Break\033[0m", "Btw \033[1mhere is broken as well\033[0m, sorry")
}

[IMP] Breaking changes in v3 release

As I was a newbie who started this project 2 years ago. I had made tons of mistakes by doing an initial release v1.0.0 instead of v0.0.1 as I thought it would be fine but now after gaining experience it seems like I will have to do some major changes.

As a library, one must never print to os.Stderr, instead of doing that one must return an err and let the user handle it plus Color field would be renamed to BoxColor so that it will be consistent to TitleColor and ContentColor:

package main

import "github.com/Delta456/box-cli-maker/v3"
import "log"

func main() {
 Box := box.New(box.Config{Px: 2, Py: 5, Type: "Single", BoxColor: "Cyan"})
 err := Box.Print("Box CLI Maker", "Highly Customized Terminal Box Maker")
   if err != nil {
   log.Fatal(err)
   }
}

Most of the panics for unknown Color types will also be changed probably to err so that the user can handle those too.

Warnings like Unknown Color Terminal Profile, Unknown Alignment provided etc will also be changed to err, though the Box will still be created successfully with default settings.

If there are any more changes needed then I will also add those too.

ASoC: use termenv to detect color profile of terminals

There is a lot of colour detection used in the library that can be removed, and muesli/termenv can be used to which will reduce the number of lines of code and boilerplate.

One will have to study all the detect_platform files to understand how colour profile checking by the module manually.

failing to get `term` width for wrapping shouldn't be fatal

hello! I encountered an issue using this lib, looked for the source of it, and found out something that might be a wrong decision.

here's what happened to me:

  • I tried to print a box with this code:
box.New(box.Config{
	Py:            0,
	Px:            5,
	ContentAlign:  "Center",
	Type:          "Double",
	TitlePos:      "Inside",
	AllowWrapping: true,
}).Println(title, msg)
  • I started my app in a container started by docker-compose.
  • my app fataled with the message inappropriate ioctl for device
  • I looked in the code and found out that if I'm setting AllowWrapping to true and an error is returned from term.GetSize,the code calls to log.Fatal:
	// Allow Wrapping according to the user
	if b.AllowWrapping {
		// If limit not provided then use 2*TermWidth/3 as limit else
		// use the one provided
		if b.WrappingLimit != 0 {
			lines = wrap.String(lines, b.WrappingLimit)
		} else {
			width, _, err := term.GetSize(int(os.Stdout.Fd()))
			if err != nil {
				log.Fatal(err)
			}
			lines = wrap.String(lines, 2*width/3)
		}
	}

IMO, a library of such kind should not panic but return an error instead. let the user decide what to do.

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.