Code Monkey home page Code Monkey logo

form's Introduction

Important: This package is not actively maintained. For bug fixes and new features, please fork.

Form

This Project Has Been Deprecated. Code Climate Coverage Status

Boring name for a boring package. Builds form HTML with a fluent-ish, hopefully intuitive syntax.

Installation

You can install this package via Composer by running this command in your terminal in the root of your project:

composer require adamwathan/form

Laravel

This package works great as a replacement Form Builder that was removed in Laravel 5. The API is different but all of the features are there.

If you are using Laravel 4 or 5, you can register the FormServiceProvider to automatically gain access to the Old Input and Error Message functionality.

To do so, just update the providers array in your config/app.php:

'providers' => [
        //...
        'AdamWathan\Form\FormServiceProvider'
    ],

You can also choose to use the Facade by adding an alias in config/app.php:

'aliases' => [
        //...
        'Form' => 'AdamWathan\Form\Facades\Form',
    ],

Note that in Laravel 4, there is already a Form facade for the built-in Form Builder. If you want to use both, use a different alias. If you'd just like to use this one, remove the Form alias that points to the Illuminate component.

Basic Usage

Getting Started

First, instantiate a FormBuilder...

$builder = new AdamWathan\Form\FormBuilder;

Next, use the FormBuilder to build an element. For example:

// <input type="text" name="email" value="[email protected]" required="required">
<?= $builder->text('email')->value('[email protected]')->required(); ?>
  • All elements support method chaining, so you can add as many options to an element as you need.
  • All elements implement __toString() so there is no need to manually render.

Opening a Form

// <form method="POST">
<?= $builder->open(); ?>

// <form method="GET">
<?= $builder->open()->get(); ?>

// <form method="POST">
// <input type="hidden" name="_method" value="PUT">
<?= $builder->open()->put(); ?>

// <form method="POST">
// <input type="hidden" name="_method" value="DELETE">
<?= $builder->open()->delete(); ?>

// <form method="POST" action="/test">
<?= $builder->open()->action('/test'); ?>

// <form method="POST" action="" enctype="multipart/form-data">
<?= $builder->open()->multipart() ?>

// <form method="POST" action="" enctype="custom">
<?= $builder->open()->encodingType("custom") ?>

Text and Password Fields

Text and password fields share the same interface.

// <input type="text" name="email">
<?= $builder->text('email'); ?>

// <input type="text" name="email" id="email_field">
<?= $builder->text('email')->id('email_field'); ?>

// <input type="password" name="password" class="required">
<?= $builder->password('password')->addClass('required'); ?>

// <input type="text" name="email" value="[email protected]" required="required">
<?= $builder->text('email')->value('[email protected]')->required(); ?>

Other available methods:

  • placeholder($string)
  • optional()
  • defaultValue($string)
  • disable()
  • enable()

Textareas

Textareas share the same interface as regular text fields, with a couple of extra useful methods.

// <textarea name="bio" rows="5" cols="50"></textarea>
<?= $builder->textarea('bio')->rows(5); ?>

// <textarea name="bio" rows="10" cols="20"></textarea>
<?= $builder->textarea('bio')->cols(20); ?>

// <textarea name="bio" rows="5" cols="20" class="important">My biography</textarea>
<?= $builder->textarea('bio')->rows(5)->cols(20)->addClass('important')->value('My biography'); ?>

Checkboxes and Radio Buttons

// <input type="checkbox" name="terms" value="1">
<?= $builder->checkbox('terms'); ?>

// <input type="checkbox" name="terms" value="1" checked="checked">
<?= $builder->checkbox('terms')->check(); ?>

// <input type="checkbox" name="terms" value="1">
<?= $builder->checkbox('terms')->uncheck(); ?>

// <input type="checkbox" name="terms" value="1" checked="checked">
<?= $builder->checkbox('terms')->defaultToChecked(); ?>

// <input type="checkbox" name="terms" value="agree">
<?= $builder->checkbox('terms')->value('agree'); ?>

// <input type="radio" name="color" value="red">
<?= $builder->radio('color', 'red'); ?>

Selects

// <select name="birth_year"></select>
<?= $builder->select('birth_year'); ?>

// <select name="birth_year">
//   <option value="0">1990</option>
//   <option value="1">1991</option>
//   <option value="2">1992</option>
// </select>
<?= $builder->select('birth_year', [1990, 1991, 1992]); ?>

// <select name="birth_year">
//   <option value="1990">1990</option>
//   <option value="1991">1991</option>
//   <option value="1992">1992</option>
// </select>
<?= $builder->select('birth_year', ['1990' => 1990, '1991' => 1991, '1992' => 1992]); ?>

// <select name="birth_year">
//   <optgroup label="Ontario">
//     <option value="toronto">Toronto</option>
//     <option value="ottawa">Ottawa</option>
//   </optgroup>
//   <optgroup label="Quebec">
//     <option value="montreal">Montreal</option>
//     <option value="quebec_city">Quebec City</option>
//   </optgroup>
// </select>
$options = [
	'Ontario' => [
		'toronto' => 'Toronto',
		'ottawa' => 'Ottawa',
	],
	'Quebec' => [
		'montreal' => 'Montreal',
		'quebec_city' => 'Quebec City',
	]
];

<?= $builder->select('birth_year', $options); ?>

// <select name="birth_year">
//   <option value="1">1990</option>
// </select>
<?= $builder->select('birth_year')->addOption('1', 1990); ?>

// <select name="birth_year">
//   <option value="1">1990</option>
//   <option value="2">1991</option>
//   <option value="3" selected>1992</option>
// </select>
<?= $builder->select('birth_year', ['1' => 1990, '2' => 1991, '3' => 1992])->select('3'); ?>

Buttons

// <button type="button">Click Me</button>
<?= $builder->button('Click Me'); ?>

// <button type="submit">Sign Up</button>
<?= $builder->submit('Sign Up'); ?>

// <button type="reset">Reset Form</button>
<?= $builder->reset('Reset Form'); ?>

// <button type="submit" class="js-submit">Sign Up</button>
<?= $builder->submit('Sign Up')->addClass('js-submit'); ?>

Hidden Inputs

// <input type="hidden" name="secret" value="my-secret-value">
<?= $builder->hidden('secret')->value('my-secret-value'); ?>

Labels

Basic Label

// <label>Email</label>
<?= $builder->label('Email'); ?>

// <label for="email">Email</label>
<?= $builder->label('Email')->forId('email'); ?>

Wrapping another element

// <label>Email<input type="text" name="email"></label>
<?= $builder->label('Email')->before($emailElement); ?>

// <label><input type="text" name="email">Email</label>
<?= $builder->label('Email')->after($emailElement); ?>

Setting Attributes

// Attributes can be set with attribute(...)
// <input type="text" name="foobar" min="4">
<?= $builder->text('foobar')->attribute('min', 4); ?>

// Or by calling the attribute name as a method
// <input type="text" name="foobar" min="4">
<?= $builder->text('foobar')->min(4); ?>

// Setting data-* attributes
// <input type="text" data-foo="bar" name="foobar">
<?= $builder->text('foobar')->data('foo', 'bar'); ?>

// Multiple data-* attributes can be set at once
// <input type="text" data-foo="bar" data-bar="foo" name="foobar">
<?= $builder->text('foobar')->data(['foo' => 'bar', 'bar' => 'foo']); ?>

Remembering Old Input

The FormBuilder can remember old input and prepopulate your form fields if you redirect back to the form because of a validation error.

To make this work, you must create a class that implements the OldInputInterface and pass it to the FormBuilder:

$builder->setOldInputProvider($myOldInputProvider);

Now, your form elements will automatically populate with the user's old input data if it is available.

This works well with the defaultValue() methods, allowing you to set a default value that will be overridden by old input if the user has already submitted the form.

This package ships with a Laravel implementation out of the box, called IlluminateOldInput.

Error Messages

FormBuilder also allows you to easily retrieve error messages for your form elements. To do so, just implement the ErrorStoreInterface and pass it to the FormBuilder:

$builder->setErrorStore($myErrorStore);

This package ships with a Laravel implementation out of the box, called IlluminateErrorStore.

// Check if the form has an error for an element
$builder->hasError('email');

// Retrieve the error message for an element
$builder->getError('email');

You can also supply a format parameter to getError() to cleanup your markup. Instead of doing this:

<?php if ($builder->hasError('email')): ?>
	<span class="error"><?= $builder->getError('email'); ?></span>
<?php endif; ?>

...you can simply do this, which will display the formatted message if it exists, or nothing otherwise.

<?= $builder->getError('email', '<span class="error">:message</span'); ?>

CSRF Protection

Assuming you set a CSRF token when instantiating the Formbuilder (or you are using Laravel), add a CSRF token to your form easily like so:

<?= $builder->token(); ?>

Data Binding

Sometimes you might have a form where all of the fields match properties on some sort of object or array in your system, and you want the user to be able to edit that data. Data binding makes this really easy by allowing you to bind an object or array to your form that will be used to automatically provide all of the default values for your fields.

$model->first_name = "John";
$model->last_name = "Doe";
$model->email = "[email protected]";
$model->date_of_birth = new DateTime('1985-05-06');

<?= $builder->open(); ?>
<?= $builder->bind($model); ?>
<?= $builder->text('first_name'); ?>
<?= $builder->text('last_name'); ?>
<?= $builder->email('email'); ?>
<?= $builder->date('date_of_birth'); ?>
<?= $builder->close(); ?>

This will work out of the box with Laravel's Eloquent models.

When using data binding, old input will still take priority over any of your bound values, so you can still easily redirect the user back to the form with any validation errors without losing any of the data they entered.

Note: Be sure to bind before creating any other form elements.

form's People

Contributors

adamwathan avatar aydinhassan avatar bmullican avatar ckrack avatar daguilarm avatar grantlovell avatar irineujunior avatar jesseleite avatar marank avatar moura137 avatar ncrazed avatar padreik avatar sdebacker avatar sobak avatar strayobject avatar tflight 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

form's Issues

Multple forms on one page.

Ran into an issue while working with multiple forms on same page.

If you bind form A to a an Eloquent model and don't bind form B to anything. Then B will try to lookup its fields on the model bound to A which results in an endless loop when B has fields that don't match any of the model's relations.

The workaround that I ended up implementing was binding form B to NULL when I didn't have a model for it.

Bind translated name groups

I use dimsav/laravel-translatable with adamwathan/form. In this part of code BootForm::bind($model) does not work:

{!! BootForm::open()->action( route('catalogs.update', $catalog) )->put() !!}
{!! BootForm::bind($catalog) !!}
@foreach($locales AS $locale => $localeData)
    {!! BootForm::text('Title', $locale.'[title]') !!}
@endforeach
{!! BootForm::close() !!}

I found only one solution but it is not pretty good:

{!! BootForm::text('Title', $locale.'[title]')->value(isset($catalog->translate($locale)->title)?$catalog->translate($locale)->title:'') !!}

Any ideas why bind don't work on this?

Feature Request: Support url resolution of controller methods

It would be nice to be able to pass in controller method names or route names such as Auth\AuthController@postLogin either into the action method of form open or another method such as route()

open()->action(action('Auth\AuthController@postSms')) seems messy

Html input groups

Hey, I have not found a way to bind html input groups.
For example:

$builder->text('group[email]')

I did a little work around but it is not good piece of code :( but you can take a look :)

protected function nameToArray($str)
    {
        if (strpos($str,'[') === false) {
            return $str;
        }
        $re = "/(.*?)\\[(.*?)\\]/"; 
        preg_match_all($re, $str, $matches);
        array_shift($matches);
        $matches = array_filter(call_user_func_array('array_merge', $matches));
        $arr_string = "";
        foreach ($matches as $match)
        {
            $arr_string .= "['{$match}']";
        }
        return $arr_string;
    }
protected function hasModelValue($name)
    {
        if (is_array($this->model))
        {
            $name = $this->nameToArray($name);
            $arr = $this->model;
            eval('$isset = isset($arr'.$name.');');         
            return $isset;
        }
        if (! isset($this->model)) {
            return false;
        }
        return isset($this->model->{$name});
    }
protected function getModelValue($name)
    {
        if (is_array($this->model))
        {
            $name = $this->nameToArray($name);
            $arr = $this->model;
            eval('$val = $arr'.$name.';');  
            return $val;
        }
        return $this->model->{$name};
    }

License Information

Hi @adamwathan ,

I'm looking to use your rather excellent form and bootform code, but I have various licencing restrictions, and I am unable to find anything about how you've licenced your code. Could you add the information to your readme.md ?

Thanks!

Support for col

In a fresh laravel installation, the /auth/register looks like this:

<div class="form-group">
    <label class="col-md-4 control-label">Firstname</label>
    <div class="col-md-6">
        <input type="text" class="form-control" name="firstname" value="{{ old('firstname') }}">
    </div>
</div>

I have tried recreating that in bootform using:

{!! BootForm::text('Firstname', 'firstname')->placeholder('Firstname')->value(old('firstname')) !!}

However, I find it impossible to add the extra wrapper <div class="col-md-6"> that needs to be around the input text.

Is it possible?

How can I replace template for submit button

Hi,

how can I replace the template or simply replace the class for the submit button. This library uses 'btn-default' as class for submit button, but I want to for example use 'btn-primary' instead of 'btn-default'. I know I can use $element->removeClass('btn-default')->addClass('btn-primary') but this looks ugly for me... Is there any solution how to do that in another way?

onsubmit feature

What about an onsubmit feature?

I.e.:

            {!! BootForm::open(['onsubmit' => 'return confirm(\'Do you really want to submit the form?\');'])->post()->action(route('category.merge', $category->id)) !!}

Or support laravel's data-confirm.

select field is not selecting value

code is working fine but select field is not selecting value like other fields.
Here is code:


$frm = new AdamWathan\Form\FormBuilder;

$years = ['1990' => 1990, '1991' => 1991, '1992' => 1992];

$model = json_decode(json_encode(array('full_name'=>'John Doe', 
										'bio'=>'', 
										'color'=>'',
										'terms'=>'',
										'birth_year' => 1991 , 
										'email'=>'[email protected]', 
										'date_of_birth'=> '1985-05-06' 
										)));
 
?>

<?= $frm->open(); ?>
<?= $frm->bind($model); ?> <hr>
<?= $frm->text('full_name'); ?> <hr>
<?= $frm->email('email')->required(); ?> <hr>
<?= $frm->text('date_of_birth'); ?> <hr>
<?= $frm->radio('color', 'red'); ?>  <hr>
<?= $frm->checkbox('terms')->uncheck(); ?><hr>
<?= $frm->select('birth_year',$years); ?><hr>
<?= $frm->textarea('bio')->rows(5)->cols(20)->addClass('important')->value('My biography'); ?> <hr>
<?= $frm->submit('Submit'); ?>
<?= $frm->close(); ?>
```
 

Leftover key transformation?

Hi

When trying to debug this issue at TranslatableBootForms, I stumbled upon the following code which seems to be the underlying cause:

FormBuilder.php line 222:

public function getValueFor($name)
{
    $name = $this->transformKey($name);

    if ($this->hasOldInput()) {
        return $this->getOldInput($name);
    }

    // ...
}
//...
protected function getOldInput($name)
{
    return $this->escape($this->oldInput->getOldInput($name));
}
//...
protected function transformKey($key)
{
    return str_replace(['.', '[]', '[', ']'], ['_', '', '.', ''], $key);
}

IlluminateOldInputProvider.php line 21:

public function getOldInput($key)
{
    return $this->session->getOldInput($this->transformKey($key));
}
//...
protected function transformKey($key)
{
    return str_replace(['.', '[]', '[', ']'], ['_', '', '.', ''], $key);
}

Is there any specific reason why transformKey() is called twice throughout this process (in getValueFor() and getOldInput())?
Right now, the following transformations will occur to e.g. en[title]:
en[title] --> en.title --> en_title
As you can see, there seems to be a superfluous transformation since en.title should be the key to search for in old input session store.

Bug with checkboxes not being unchecked on populating from Session

Explanation:
I'm on a form bind to a model and there is a checked checkbox and a filled required text field,
then I uncheck the box, empty the text field and submit the form,
validation fails, and I'm redirected back to the form with oldInput taken from session, but my checkbox is checked and it shouldn't.

Selected for multiple select

Please replace isSelected method on Select class:

    protected function isSelected($value)
    {
        if (isset($this->selected)) {
            return $this->selected == $value || is_array($this->selected) && in_array($value, $this->selected);
        }

        return false;
    }

Can't add class for checkbox form-group

I try:
BootForm::checkbox('Label name', 'field_name')->addGroupClass('some-css-class');
result:

<div class="form-group">
	<div class="col-sm-offset-4 col-sm-8 col-md-offset-4 col-md-8 col-lg-offset-3 col-lg-9">
		<div class="checkbox some-css-class">
			<label>
				<input type="checkbox" name="field_name" value="1">Label name
			</label>
		</div>
	</div>
</div>
  • "some-css-class" added in div.checkbox.
    How can i get next result? ("some-css-class" added in div.form-group)
<div class="form-group some-css-class">
	<div class="col-sm-offset-4 col-sm-8 col-md-offset-4 col-md-8 col-lg-offset-3 col-lg-9">
		<div class="checkbox">
			<label>
				<input type="checkbox" name="field_name" value="1">Label name
			</label>
		</div>
	</div>
</div>

How can i set the ID for Hidden Input?

I'm trying to set the ID for my hidden input. Something like:

{{ Form::hidden('name', 'value')->id('id') }}

I've searched here and at BootForm package and didn't find a solution.

Thanks.

Submit Input instead of Button?

When doing

{!! $builder->submit('Search') !!}

Is there a nice way of outputing that as <input type="submit" value="Search"> instead of the button?

FormBuilder::bind() support for multiple models in one form.

How can I do

<?= $builder->open(); ?>
foreach($models as $model) {
    <?= $builder->bind($model); ?>
    <?= $builder->text('first_name'); ?>
    <?= $builder->text('last_name'); ?>
    <?= $builder->email('email'); ?>
    <?= $builder->date('date_of_birth'); ?>
}
<?= $builder->close(); ?>

Preferrably "first_name[$model->id]" suffix should automatically be used, but manual override via ::bind() argument is nice to have for additional flexibility.

Is that already possible?

Remember old input?

How does the "remember old input" works? It isn't pretty clear as per the documentation.

I am using BootForm, but I guess this is the same.

            {!! BootForm::open(['files' => true])->put()->action(route('category.update', $category->id))->multipart() !!}
                {!! BootForm::text('Name', 'name')->value($category->name) !!}
                {!! BootForm::text('Slug', 'slug')->value($category->slug) !!}
                {!! BootForm::submit('Save') !!}
            {!! BootForm::close() !!}

If errors happens under Request validation, the old input is now populated.

Script not wokring

I am using plain php to work in this

first i created a file in the name of form.php and included the below file

require('AdamWathan/Form/FormBuilder.php');

below require i added the below code
$builder = new AdamWathan\Form\FormBuilder;

and i got the error as Fatal error: Class 'AdamWathan\Form\Elements\FormOpen' not found

Bind to select ?

Hello,

Is it possible to do a bind on a < select> ?

thank you,

Better testing coverage for Element and FormControl methods

As discussed in #39, some of the functionality that is not specific to one of the 4 base element types is currently being tested only in the context of Text (The base class for all of the <input> type implementations).

The other 3 element types (TextArea, Select, and Button) lack the tests.

[Critical] Data-binding for related-records as Collection

Hi, I think I have resolved a "critical" problem (at least from my usage) with the data-binding logic, but I am not familiar with issuing a PR, so I just raise it here and hope the author would consider it.

AdamWathan\Form\Binding\BoundData.php

protected function dataGet($target, $keyParts, $default)
    {
        if (count($keyParts) == 0) {
            return $target;
        }

        // *** Added handling of related-collections ***//
        if ($target instanceof \Illuminate\Database\Eloquent\Collection) {
            $key = array_shift($keyParts);
            return $this->objectGet($target->get($key), $keyParts, $default);
        }

        if (is_array($target)) {
            return $this->arrayGet($target, $keyParts, $default);
        }

        if (is_object($target)) {
            return $this->objectGet($target, $keyParts, $default);
        }

        return $default;
    }

My view in question is a simple form displaying an Order with its Items where the Items are named as follows (a simplified version):

{!! BootForm::text('Name', 'item[0][name]') !!}
{!! BootForm::text('Qty', 'item[0][qty]') !!}
...

{!! BootForm::text('Name', 'item[1][name]') !!}
{!! BootForm::text('Qty', 'item[1][qty]') !!}
...

What went wrong was that when the Item Listing initializes, the Collections of related-items were not being properly bound since neither arrayGet() nor objectGet() expects a Collection of Models, rather they expect a single Model with attributes.

The effect of this "bug" is that the related-items' data cannot be loaded into the view. But then I've added that Collection Handling part (see above code) and it works properly since. It simply "skips ahead" to objectGet() using the incoming item-key whenever it sees a Collection.

Please kindly consider this fix of mine if it helps in any way & btw thanks for the package!

And if I have misunderstood the original design in any way, please pardon me and please teach me a proper way of dealing with Order-Items using Bootforms.

-Godric

Accept array based binding

It would be very convenient if the FormBuilder::bind worked with array as well as objects just like Larave's Form::model.

Let me know if that's a feature you want to include in this library and I'll start working on a PR.

XSS Vulnerabilities

I believe the textarea input is vulnerable to xss. It uses $value to between the textarea tags. We haven't escaped this value. We need to be using htmlentities($output, ENT_QUOTES, 'UTF-8') to escape any user provided output, as none of it should be able to break the html.

There are other locations, other than textarea where we should be doing this escaping. Anywhere we accept user/developer input and render it should be escaped.

Escaping of label contents

Hi, i've just composer updated a project with "adamwathan/bootforms": "^0.8.2" and "propaganistas/laravel-translatable-bootforms": "~1.3" (on composer.json) and now the labels for the translatable inputs aren't being escaped.

I have opened an issue with propagandistas but they informed me I should open an issue with you, since the escaping of the labels was done bu the form package. (see more here: https://github.com/Propaganistas/Laravel-Translatable-Bootforms/issues/24 ).

Will there be a fix, or I need to revert the update?
Thank you for this package!

Adding VueJS Attributes

Hi,

I am trying to add VueJS attributes like v-on and v-model using hte attribute() but sadly it's not working....

Why there is no method validate to know if all form fields are "OK" ?

Hello,

First, thanks for sharing your code.

I am interesting in your class but I am aksing me : Why there is no 'magic' function to check if all the form elements are valids.

Eg. :

<?php
//src/AdamWathan/Form/FormBuilder.php
namespace AdamWathan\Form;
...

    /**
     * Check if an error exist
     * @param mixed $name Null if you want to know if there is an error for all fields else 
     *                                      string corresponding to field name
     * @return bool
     */
    public function hasError($name = null)
    {
        if (! isset($this->errorStore)) {
            return false;
        }
        if ($name !== null) {
            return $this->errorStore->hasError($name);
        }

        return true;
    }
...

I am curious to know how you are doing.
Else, if you judge this new feature and modification relevant, I can submit a pull-request.

Thanks for your time.

type=number

There doesn't seem to be an input type 'number'.

Form::bind() and relationships

Consider having one model Devis and one DevisData.
One Devis hasMany DevisData, linked by DevisData.devis_id field.

how can i do that in controller and view ? :
Controller :
$devis = Devis::find($id);
$datas = $devis->datas; // hasMany defined in model

View :
Form::bind($devis + $datas)

Inputs are automatically filled.

My input field names looks like that :


I think we should define the "row" in Form::bind() method.

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.