Coder Social home page Coder Social logo

yii2-dialog's Introduction

Krajee Logo
yii2-dialog
Donate

Stable Version Unstable Version License Total Downloads Monthly Downloads Daily Downloads

A widget component for Yii Framework 2.0 to easily configure and initialize popup notification dialog boxes. It provides a polyfill for the native javascript alert, confirm, and prompt dialog boxes. It includes inbuilt support for rendering rich dialog boxes via a customized plugin by Krajee based on and enhanced from bootstrap3-dialog. This plugin makes using Bootstrap's modal more monkey-friendly. The Krajee enhancements also includes enhanced support for Bootstrap 5.x, 4.x and 3.x. The key features provided by the library are:

  • Control how you want to render JAVASCRIPT dialogs. Inbuilt quick support for following dialog types:
    • ALERT dialog
    • CONFIRM dialog
    • PROMPT dialog
    • CUSTOM dialog
  • Includes a jQuery plugin krajeeDialog (created by Krajee), that allows one to configure the bootstrap3-dialog library easily, or use the native JS alerting component, OR also configure any third party JS Notification Library to be used.
  • Ability to render pretty dialogs by overriding and enhancing confirmation dialog for links that use yii's data-confirm methods.
  • Advanced configuration via kartik\dialog\Dialog widget. This widget allows one to globally setup the native JS alert OR bootstrap3-dialog settings.

How to contribute via a pull request?

Refer this git workflow for contributors.

Installation

The preferred way to install this extension is through composer.

Pre-requisites

Note: Check the composer.json for this extension's requirements and dependencies. You must set the minimum-stability to dev in the composer.json file in your application root folder before installation of this extension OR if your minimum-stability is set to any other value other than dev, then set the following in the require section of your composer.json file

kartik-v/yii2-dialog: "@dev"

Read this web tip /wiki on setting the minimum-stability settings for your application's composer.json.

Release Changes

Refer the CHANGE LOG for details of various releases.

Install

Either run

$ php composer.phar require kartik-v/yii2-dialog "@dev"

or add

"kartik-v/yii2-dialog": "@dev"

to the require section of your composer.json file.

Documentation and Demo

View the documentation and demos at Krajee Yii 2 Demos for details on using the extension.

Usage

Basic Usage

In your view you can load the asset bundle and render the javascript to load the bootstrap 3 modal dialog.

// view.php
use kartik\dialog\DialogAsset;
DialogAsset::register($this);
$this->registerJs("\$('#your-btn-id').on('click', function(){BootstrapDialog.alert('I want banana!');});");

Advanced Usage (Widget)

In your view OR view layout file, you can render the widget like this. This will not display any content directly - but will render all the javascript and css needed for initializing the BootstrapDialog as per your customized settings.

use kartik\dialog\Dialog;

// Example 1
echo Dialog::widget([
   'libName' => 'krajeeDialog',
   'options' => [], // default options
]);

// Example 2
echo Dialog::widget([
   'libName' => 'krajeeDialogCust',
   'options' => ['draggable' => true, 'closable' => true], // custom options
]);

Then in your view, you can write your own javascript to render your alert, confirm, and prompt boxes (or a custom dialog box). For example on click of HTML buttons btn-1 and btn-2, the dialogs can be popped up as shown below:

// NOTE: This is a javascript code and must be run in Yii via 'registerJs' 
//       or via a JS File in an AssetBundle

// use krajeeDialog object instance initialized by the widget
$('#btn-1').on('click', function() {
    krajeeDialog.alert('An alert');
    // or show a confirm
    krajeeDialog.confirm('Are you sure', function(out){
        if(out) {
            alert('Yes'); // or do something on confirmation
        }
    });
});

// use krajeeDialogCust object instance
$('#btn-2').on('click', function() {
    krajeeDialogCust.alert('An alert');
    // or show a prompt
    krajeeDialogCust.prompt({label:'Provide reason', placeholder:'Upto 30 characters...'}, function(out){
        if (out) {
            alert('Yes'); // or do something based on the value of out
        }
    });
});

Overriding Yii's Confirmation Dialog

Yii renders the native confirmation dialog on links that are rendered by setting data-confirm property on links. This widget enhances and beautifies the native confirmation dialog using Krajee Dialog. This behavior can be controlled via the overrideYiiConfirm property which defaults to true. This can be useful in rendering links and action buttons like the GridView ActionColumn delete button.

// the rendered link will automatically show a Krajee Dialog Confirmation dialog
use kartik\dialog\Dialog;
echo Dialog::widget(['overrideYiiConfirm' => true]);
echo Html::a(
    'Delete', 
    ['/item/delete', 'id' => $model->id], 
    [
        'data-confirm' => 'Are you sure to delete this item?'
        'data-method' => 'post'
    ]
);

License

yii2-dialog is released under the BSD 3-Clause License. See the bundled LICENSE.md for details.

yii2-dialog's People

Contributors

bmsrox avatar boliver20 avatar devkpv avatar doston92 avatar dumpofthevar avatar edofre avatar enricodetoma avatar execut avatar fetus-hina avatar igorcode avatar jaehter avatar kartik-v avatar kenjebaev avatar koxu1996 avatar lourdas avatar mingchi21 avatar mortezakarimi avatar mskayali avatar sjjliqpl avatar skullydev avatar yepes 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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

yii2-dialog's Issues

.dialog callback not called

Prerequisites

  • [ X ] I have searched for similar issues in both open and closed tickets and cannot find a duplicate.
  • [ X ] The issue still exists against the latest master branch of yii2-dialog.
  • [ X ] This is not an usage question. I confirm having gone through and read the extension documentation and demos.
  • [ X ] This is not a general programming / coding question. (Those should be directed to the webtips Q & A forum).
  • [ X ] I have attempted to find the simplest possible steps to reproduce the issue.
  • [ X ] I have included a failing test as a pull request (Optional).

Steps to reproduce the issue

  1. Use the example "Custom Dialog 2" from the example site
  2. Define something inside the function:
    $("#btn-custom-2").on("click", function() { krajeeDialogCust2.dialog( $('#kv-test-msg').val(), // markup stored in a hidden textarea function(result) { // do something console.log("This is never called"); } ); });
  3. The console never receives the log message

Expected behavior and actual behavior

The callback function is never called for a .dialog, and it should be. Note that it does work if you use a .confirm box instead.

It seems fairly simple to fix: in dialog.js, dialog() calls _dialog() with a callback reference. However, _dialog() only sets opts.callback if the dialog type is 'confirm' - it should set this for other dialog types too.

Environment

Browsers

  • [ X ] Google Chrome
  • [ X ] Mozilla Firefox
  • [ X ] Internet Explorer
  • [ X ] Safari

Operating System

  • [ X ] Windows
  • [ X ] Mac OS X
  • [ X ] Linux
  • [ X ] Mobile

Libraries

  • jQuery version: 3.6.0
  • yii2-dialog version: 1.0.6

Isolating the problem

  • [ X ] This bug happens on the demos page
  • [ X ] The bug happens consistently across all tested browsers
  • [ X ] This bug happens when using yii2-dialog without other plugins.

Problem overwriting the default alert message when Kartik GridView is present

Hi there!

I have followed all the process in order to replace Yii2 default alert with SweetAlert. The problem is that SweetAlert is only working properly whereKartik GridView is not present.

GridView assets is replacing the yii.confirm js function... I have found a similar issue but the solution is not working for me... Is it there a way to disable this functionality trough the config/main ?

I'm trying to use this inside backend/config/main:

'assetManager' => [
            'bundles' => [
                'kartik\dialog\Dialog' => [
                    'overrideYiiConfirm' => false,
                    'useNative' => true
                ],
            ],
        ],

the response is:

where gridview is:
Screen Shot 2019-08-20 at 9 24 33 AM

and where gridview is missing (how it should work):
Screen Shot 2019-08-20 at 9 24 45 AM

Thanks!

Jquery Event Show Hidden Dialog

Prerequisites

  • I have searched for similar issues in both open and closed tickets and cannot find a duplicate.
  • The issue still exists against the latest master branch of yii2-grid.
  • This is not an usage question. I confirm having gone through and read the extension documentation and demos.
  • This is not a general programming / coding question. (Those should be directed to the webtips Q & A forum).
  • I have attempted to find the simplest possible steps to reproduce the issue.
  • I have included a failing test as a pull request (Optional).

Steps to reproduce the issue

  1. How to indicated Event Show-Hidden-Close-Cancel Dialog in jquery

Expected behavior and actual behavior

When I follow those steps, I see...

I was expecting...

Environment

Browsers

  • Google Chrome
  • Mozilla Firefox
  • Internet Explorer
  • Safari

Operating System

  • Windows
  • Mac OS X
  • Linux
  • Mobile

Libraries

  • jQuery version:
  • yii2-grid version:

Isolating the problem

  • This bug happens on the demos page
  • The bug happens consistently across all tested browsers
  • This bug happens when using yii2-grid without other plugins.

bower-asset/bootstrap3-dialog reuired

composer require kartik-v/yii2-dialog

gives following error -

Using version ^1.0 for kartik-v/yii2-dialog
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.

Problem 1
- kartik-v/yii2-dialog v1.0.1 requires bower-asset/bootstrap3-dialog ~1.34 -> no matching package found.
- kartik-v/yii2-dialog v1.0.0 requires bower-asset/bootstrap3-dialog ~1.34 -> no matching package found.
- Installation request for kartik-v/yii2-dialog ^1.0 -> satisfiable by kartik-v/yii2-dialog[v1.0.0, v1.0.1].

Potential causes:

Read https://getcomposer.org/doc/articles/troubleshooting.md for further common problems.

i already installed fxp/composer-asset-plugin (v1.4.1)

Tag release

Hi. Can you tag new release?
yii2-grid won't get new commits from yii2-dialog because of "kartik-v/yii2-dialog": "~1.0" dependency :(

Yii 2 modal with form inside

I have a question, I have my form rendered in a modal, all that works with validation etc. But now when i submit the form it is going to the view. Instead it must stay on the same page and fill in the dropdown with the new value, is there a way for this? I can't find anything on the web and I'm desperate. :)
I'm using your extensions.
Thanks already

Allow all input attributes to be set for prompt input

Hey kartik,

I was trying to set a value on the prompt dialog input but it wasn't working I checked the doc and found nothing, then I inspected the code and saw that only the placeholder and label works, would be nice if we could set a value on the input aswell.

krajeeDialog.prompt({
   label: 'label',
   placeholder: 'text',
   value: 'text' // for example this
}, function (result) {
   // ...
});

I did check the dialog.js and from the line 111 we have:

if (typeof input === "object") {
      if (input.label !== undefined) {
                    msg = '<label for="krajee-dialog-prompt" class="control-label">' + input.label + '</label>';
       }
       if (input.placeholder !== undefined) {
                    holder = ' placeholder="' + input.placeholder + '"';
       } 

       // here I added this part and it works!
       if (input.value !== undefined) {
             value = ' value="' + input.value + '"';
        }
        msg += '<input type="text" name="krajee-dialog-prompt" class="form-control' + holder + value + '">';
...

change title and buttons label on confirm dialog

am trying to change title dialog when i use confirm dialog
i used this code

 echo Dialog::widget([
        'dialogDefaults'=>[ 
        Dialog::DIALOG_CONFIRM => [
            'type' => Dialog::TYPE_WARNING,
            'title' => 'testeee',
            'btnOKClass' => 'btn-warning',
            'btnOKLabel' => Dialog::ICON_OK . ' ' . 'pkkkk',
            'btnCancelLabel' => Dialog::ICON_CANCEL . ' ' .'caaaaa'
        ],
        
    ]
]);

but it's not effect by any thing
any help?

Ukrainian translation

Hi! I've got some error on Ukrainian language page. How can I fix it?

yii\i18n\PhpMessageSource::loadFallbackMessages
The message file for category 'kvdialog' does not exist: /var/www/krasota-style.yii2/vendor/kartik-v/yii2-dialog/messages/uk-UA/kvdialog.php
Fallback file does not exist as well: /var/www/krasota-style.yii2/vendor/kartik-v/yii2-dialog/messages/uk/kvdialog.php

Default buttons are always displayed althoug we set different ones

First of all, sorry if my english is not good enough, I will try to give my best to explain what it happens to know if it is an issue or bad understanding.

When you try to create a new custom dialog, it is impossible to show only one button, for example, to close the dialog. It always shows default buttons.

I have tried to use alert, but my configuration is not read correctly.

In my case, I have a grid view with tipycal rows with update/delete options for each row. I use kartik-v gridview, so all delete options trigger Kartik Dialog modals.

I am trying to use different Dialog to show embed videos at the same page, and the problem is that in this Dialog it is impossible to me to not show two buttons.

I think It is a problem with the other Dialog boxes, but I have to say that I haven´t try to reproduced alone without Kartik Gridview.

My approach has been to extend Dialog class, but I want to think this is not the right step.

In my tries, I have tried to use libname, default libname, dialogDefaults, buttons, etc, but anything works but overriding Dialog class.

Here is my configuration

echo Dialog::widget([ 'libName' => 'rtYtMediaView', 'options' => [ 'title' => $model->name, 'closable' => true, 'nl2br' => false, 'dialogDefaults' => [ Dialog::DIALOG_OTHER => [ 'buttons' => [], ],], 'buttons' => [ [ 'label' => Yii::t('app', 'Close'), 'hotkey' => 'C', 'icon' => 'fas fa-ban', 'cssClass' => 'btn-default', 'action' => new JsExpression("function(dialog) { dialog.close(); }") ], ], ], ]);

rtYtMediaView.dialog( '<iframe id= "ytMediaFrame" class="embed-responsive-item" width="560" height="315" src="' + url + '" frameborder="0" allow="encrypted-media; picture-in-picture" allowfullscreen></iframe>', // '<iframe id= "ytMediaFrame" class="embed-responsive-item" width="560" height="315" src="https://www.youtube.com/embed/2IbaZuKeQ80" frameborder="0" allow="encrypted-media; picture-in-picture" allowfullscreen></iframe>', function(result) {} );

I try to format code correctly, but it has been impossible.

Thank you!

Sizes does not working correctly

Hello, after last updates dialogs size does not working. I'm trying use SIZE_WIDE, but the classes does not applied correctly, and it is adding btn-block on buttons. Tnks for the plugin extension for Yii2.

PHP code:

echo Dialog::widget([
    'libName' => 'deleteBranchDialog',
    'dialogDefaults' => [
        Dialog::DIALOG_CONFIRM  => [
            'type' => Dialog::TYPE_DANGER,
            'size' => Dialog::SIZE_WIDE,
            'title' => Html::tag('div', Html::tag('i', false, ['class' => 'fas fa-exclamation']), ['class' => 'icon-box']) .
                Yii::t('app', 'Delete') . ' ' . mb_strtolower(Yii::t('app', 'Branch')),
            'btnOKClass' => 'btn-danger',
            'btnOKLabel' => Html::tag('i', false, ['class' => 'far fa-check-circle fa-lg']) . ' ' . Yii::t('app', 'Delete'),
            'btnCancelLabel' => Html::tag('i', false, ['class' => 'fas fa-times-circle']) . ' ' . Yii::t('app', 'Cancel')
        ]
    ]
]);

HTML Rendered:

<div class="modal-dialog modal-xl">
    <div class="modal-content">
        <div class="modal-header">
            <div class="bootstrap-dialog-header">
                <div class="bootstrap-dialog-close-button" style="display: none;">
                    <button class="close" data-dismiss="modal" aria-label="close">×</button>
                </div>
                <div class="bootstrap-dialog-title" id="w3_title">
                    <div class="icon-box"><i class="fas fa-exclamation"></i></div>
                    Deletar filial/setor
                </div>
            </div>
        </div>
        <div class="modal-body">
            <div class="bootstrap-dialog-body">
                <div class="bootstrap-dialog-message">Deseja realmente deletar a(o) filial/setor <strong>UNIDADE
                        CENTRO</strong>?
                </div>
            </div>
        </div>
        <div class="modal-footer">
            <div class="bootstrap-dialog-footer">
                <div class="bootstrap-dialog-footer-buttons">
                    <button class="btn btn-default btn-block" id="252dc9d3-ec07-420f-90c7-850880b5c8b7"><i
                                class="fas fa-times-circle"></i> Cancelar
                    </button>
                    <button class="btn btn-danger btn-block" id="ad46decd-7266-4554-a6f0-b0113eede04a"><i
                                class="far fa-check-circle fa-lg"></i> Deletar
                    </button>
                </div>
            </div>
        </div>
    </div>
</div>

Problem with bootstrap3-dialog

I installed your gridview and when running, I got the following error:

    Invalid Parameter – yii\base\InvalidParamException
    The file or directory to be published does not exist: /[path to my application root]/vendor/bower/bootstrap3-dialog

I checked and found out that bootstrap3-dialog is in the folder bower-asset. So, I changed path to the source in the file kartik-v/yii2-dialog/DialogBootstrapAsset.php in line 26 into following:

    $this->setSourcePath('@vendor/bower-asset/bootstrap3-dialog');

This worked for me. I hope others don't come across this problem, and if they do, this information might be helpful for them.

ActiveForm inside Dialog

I want to put an ActiveForm inside the Dialog.

The advanced demo on the documentation is not clear for me. Please help.

Thanks.

Uncaught ReferenceError: krajeeDialog is not defined

Hello!
I have a situation, after when build was created on server, I got the following error and the termination of most plugins. I don't know where to look.

lock file was deleted and reinstalled vendor folder

https://prnt.sc/kotuaj

catalog:42 Uncaught ReferenceError: krajeeDialog is not defined
    at catalog:42
(anonymous) @ catalog:42
jquery.js:1580 Uncaught Error: Syntax error, unrecognized expression: #
    at Function.Sizzle.error (jquery.js:1580)
    at Sizzle.tokenize (jquery.js:2232)
    at Sizzle.select (jquery.js:2659)
    at Function.Sizzle [as find] (jquery.js:884)
    at jQuery.fn.init.find (jquery.js:2922)
    at new jQuery.fn.init (jquery.js:3032)
    at jQuery (jquery.js:98)
    at new ExportData (kv-export-data.js:41)
    at HTMLAnchorElement.<anonymous> (kv-export-data.js:147)
    at Function.each (jquery.js:362)

I try to:

reinstall yii2-export

install yii2-dialog

restart services and clean cache

How i understand

This happens that some was updated and Dialog now have another settings

What i do to working

  1. revert my composer.lock
  2. remove vendor
  3. then composer install

My composer

{
    "name": "yiisoft/yii2-app-advanced",
    "description": "Yii 2 Advanced Project Template",
    "keywords": ["yii2", "framework", "advanced", "project template"],
    "homepage": "http://www.yiiframework.com/",
    "type": "project",
    "license": "BSD-3-Clause",
    "support": {
        "issues": "https://github.com/yiisoft/yii2/issues?state=open",
        "forum": "http://www.yiiframework.com/forum/",
        "wiki": "http://www.yiiframework.com/wiki/",
        "irc": "irc://irc.freenode.net/yii",
        "source": "https://github.com/yiisoft/yii2"
    },
    "repositories": [
        {
            "type": "composer",
            "url": "https://asset-packagist.org"
        }
    ],
    "minimum-stability": "dev",
    "require": {
        "php": ">=5.4.0",
        "yiisoft/yii2": "~2.0.6",
        "yiisoft/yii2-bootstrap": "~2.0.0",
        "yiisoft/yii2-swiftmailer": "^2.0@dev",
        "v0lume/yii2-meta-tags": "*",
        "himiklab/yii2-sitemap-module": "*",
        "guzzlehttp/guzzle": "^6.2@dev",
        "flow/jsonpath": "*",
        "codeception/phpbuiltinserver": "^1",
        "FortAwesome/Font-Awesome": "*",
        "kartik-v/yii2-widgets": "*",
        "2amigos/yii2-ckeditor-widget": "*",
        "sunhater/kcfinder": "*",
        "himiklab/yii2-sortable-grid-view-widget": "*",
        "zxbodya/yii2-image-attachment": "*@dev",
        "kartik-v/yii2-grid": "@dev",
        "2amigos/yii2-taggable-behavior": "~1.0",
        "zxbodya/yii2-gallery-manager": "*@dev",
        "kartik-v/yii2-date-range": "dev-master",
        "2amigos/yii2-selectize-widget": "~1.0",
        "lcobucci/jwt": "^3.2",
        "kartik-v/yii2-field-range": "*",
        "yiisoft/yii2-redis": "^2.0",
        "yiisoft/yii2-debug": "^2.0",
        "kartik-v/yii2-export": "^1.2@dev",
        "zelenin/yii2-rss": "~0.1",
        "iutbay/yii2-kcfinder": "dev-master",
        "sokolnikov911/yandex-turbo-pages": "*",
        "elasticsearch/elasticsearch": "5.0",
        "johnitvn/yii2-rbac-plus": "1.0.6",
        "kartik-v/yii2-editable": "*",
        "kartik-v/yii2-datecontrol": "dev-master",
        "yandex-money/yandex-checkout-sdk-php": "*",
        "lav45/yii2-aceeditor": "1.1.*",
    },

    "require-dev": {
        "yiisoft/yii2-gii": "~2.0.0",
        "yiisoft/yii2-faker": "~2.0.0",

        "codeception/base": "^2.2.3",
        "codeception/verify": "~0.3.1"
    },
    "config": {
        "process-timeout": 1800,
        "fxp-asset": {
            "repositories": {
                "bower-asset/eve": {
                    "type": "bower-vcs",
                    "url": "https://github.com/adobe-webplatform/eve.git"
                }
            }
        }
    },
    "extra": {
        "asset-installer-paths": {
            "npm-asset-library": "vendor/npm",
            "bower-asset-library": "vendor/bower"
        }
    }
}

Browsers

  • Google
  • Safari

Operating System

  • Linux

Isolating the problem

  • The bug happens consistently across all tested browsers

Wrong option to button class ('prompt and other')

I found a problem on documentation. To set button class on types Dialog::DIALOG_PROMPT and Dialog::DIALOG_OTHER the correct option is 'cssClass', not 'class' (saw on Boostrap Dialog plugin options)

dialog/messages/pt-BR/kvdialog

Hi

I use eclipse with php / pdt extension.

This file is marked with an error.

I think there is missing a "," at the end of line 20.

Sven

Problems installing kartik - v / dialog

When trying to install kartik - v / dialog following the instructions , I throws an error:

Problem 1
- kartik-v/yii2-dialog v1.0.0 requires bower-asset/bootstrap3-dialog ~1.34 -> no matching package found.
- kartik-v/yii2-dialog 1.0.x-dev requires bower-asset/bootstrap3-dialog ~1.34 -> no matching package found.
- kartik-v/yii2-dialog dev-master requires bower-asset/bootstrap3-dialog ~1.34 -> no matching package found.
- Installation request for kartik-v/yii2-dialog @dev -> satisfiable by kartik-v/yii2-dialog[dev-master, 1.0.x-dev, v1.0.0].

I tried to install bootstrap3 -dialog on the path: "vendor/bower-assets" but still does not work. Can you help me? I need this tool , thanks

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.