Giter Site home page Giter Site logo

moderntribe / square-one Goto Github PK

View Code? Open in Web Editor NEW
90.0 42.0 20.0 54.44 MB

Modern Tribe's legacy WordPress framework for the classic editor.

License: GNU General Public License v2.0

PHP 61.19% CSS 22.63% JavaScript 14.04% HTML 1.70% Shell 0.15% SCSS 0.27% Procfile 0.01%
wordpress

square-one's People

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

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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

square-one's Issues

Codeception test suite installs incompatible PHPUnit version

After creating a new project and configuring the test suite so that it correctly loads WordPress, Codeception produces the following error:

Codeception PHP Testing Framework v3.0.3
Powered by PHPUnit 8.3.3 by Sebastian Bergmann and contributors.
Running with seed: 


Fatal error: Declaration of Codeception\Test\Test::toString() must be compatible with PHPUnit\Framework\SelfDescribing::toString(): string in /application/www/vendor/codeception/codeception/src/Codeception/Test/Test.php on line 18

This is due to incompatibilities between Codeception and PHPUnit 7.0+

Build Process Doesn't Compile Component JS Automatically

According to the documentation in docs/concepts/components.md:

Create an index.js file to serve as a clearing-house, loading additional files found in the Component's js directory. The build system will find this index.js and load it (along with anything it imports) into the global JS bundle.

To get the javascript compiling automatically I had to load it within the theme's components.js:

const init = () => {
accordion();
card();
comments();
share();
slider();
tabs();
video();
dialog();
console.info( 'SquareOne Theme: Initialized all components.' );
};

Improve filter on nav menu classes

(Sorry if this should be a discussion first.)

Because menus can be loaded via the menu (menu ID, slug, name, or object) parameter of wp_nav_menu(), this function should be adjusted:

  1. if the classes are relevant only for menus includes via theme_location, check if theme_location is populated before adding classes
  2. adjust to support menus included via menu parameter and not theme_location

Happy to submit a PR once a decision is made.

public function customize_nav_item_classes( array $classes, object $item, stdClass $args, int $depth ): array {
$theme_location = $args->theme_location;
$classes[] = $theme_location . '__list-item';
// Depth
$classes[] = $theme_location . '__list-item--depth-' . $depth;
// Has children items
if ( in_array( 'menu-item-has-children', $item->classes ) ) {
$classes[] = $theme_location . '__list-item--has-children';
}
// Is Parent Item
if ( in_array( 'current-menu-parent', $item->classes ) ) {
$classes[] = $theme_location . '__list-item--is-current-parent';
}
// Is Current Item
if ( in_array( 'current-menu-item', $item->classes ) ) {
$classes[] = $theme_location . '__list-item--is-current';
}
/**
* Filter the array of classes to remove the classes added by WP Core.
* Regex is designed to filter all classes defined in `_wp_menu_item_classes_by_context()`;
*/
return array_filter( $classes, static function ( $class ) {
/**
* Patterns used for matching:
*
* ^menu-item[\w|-]*$ Matches classes that start with `menu-item` and may or may not have additional modifiers.
* ^current[-|_][\w|-]*$ Matches classes that start with `current-` or `current_` and have additional modifiers.
* ^page[-|_]item[\w|-]*$ Matches classes that start with `page-item` or `page_item` and may or may not have additional modifiers.
*/
$pattern = '/^menu-item[\w|-]*$|^current[-|_][\w|-]*$|^page[-|_]item[\w|-]*$/iU';
return ! preg_match( $pattern, $class );
} );
}

Responsive font sizes for Square One

I was theorizing this feature with the use of the postcss-map plugin but I feel it might be overkill/disruptive for an idea that would only be used for one small need. Not to mention it requires the use of separate .yml files to set these map arrays. So I did a little digging on postcss plugins and found these two:
https://www.npmjs.com/package/postcss-responsive-font
&
https://www.npmjs.com/package/postcss-responsive-type

I’ve tested both of these and they output basically the same CSS; a font size that is set using CSS calc() in a MQ that uses a min and max width.

I think the former is still too new and not as robust at the latter which has additional features like the ability to apply responsive sizes to line-height and letter-spacing.

This brings up a couple questions I'd like to pose to the team.

  • Would one of these plugins be to proper solution or would people like the ability to explicitly define the in-between font sizes? (i.e. a static font size that only changes based on a min-width MQ instead of a fluid size shift that adjusts based on a min and max MQ range)
  • Does the design team currently provide designs for small and medium screens or maybe a responsive style-guide? Do they explicitly define these font sizes or is this left to the discretion of the front-end team?
  • There are some limitations with these plugins. Are any of these deal breakers?
    • MQ height is not supported.
    • When using rem or em a root setting needs to be set on the html element.
    • There is apparently a webkit bug in Safari related to vw unit used in calc() and the need for a font-size to be defined as a percentage.

Port Task_Chain from Blog Copier to tribe-libs

There is a great feature on a client project that supports sequential chaining of Tasks. It currently functions as part of a blog copier but could be abstracted to support sequential task chaining in queues.

I am logging this issue for work post mono-repo merge.

gulp watch and gulp dev don't generate assets.php file

If you run gulp watch or gulp watch without having previously run gulp or gulp dist the assets.php file won't be generated so assets won't be enqueued.

If you run gulp dev in the theme, the first time (without an existing assets.php file), that appears to cause a webpack error because assets.php is missing.

Add ability to add custom user roles

The Core plugin contains a framework for easily adding object meta, post types, taxonomies, but lacks a standard way to add user roles. It would be nice to have a similar config for user roles.

@jbrinley Mentioned that he used something he liked for Steelcase

Form/File Handler Abstract API

I built a form handler for a project at my last agency that was really useful. It was for a site with a ton of forms all doing completely different things, but a lot of them had attachment uploads and common fields/need.

I'm not sure what our level of plugins like gravity forms is, but I suspect there's plenty of times we don't use a plugin. If we barely use custom forms than this issue is moot and we can shelve it.

Today I was working on an import feature for Flashback. The admin has a page where they can upload a csv file and we generate some sales for an array of products. The file doesn't get saved so media uploader is not needed.

What I'm proposing is an abstract form handling class that does a few things:

Required functions for child classes

  • Nonce verification: All forms should have a nonce attached and all handlers should verify it
  • Validate data: All forms should validate their data before processing
  • Process data: All forms will be doing something with submitted data
  • Post processing action: Do something with results such as redirect page, return json, or just return a success boolean

Abstract features

  • Set defaults on __construct such as finish redirect property could default to wp_http_referer until overwritten by child class
  • File handling - take all files uploaded, verify their types, stash in a clean data structured array or object, pass to utility class or to wp_upload_bits, etc.
  • Split $_POST into useful data, unset crap data
  • Set a transient with post data for returning to form that didn't pass validation

Like I mentioned, I've built a rough version of this before and it was incredibly useful and after today I felt the file handling could be a lot cleaner if I had an form handling API to work with.

Content Loop Block Settings Icons

The Content Loop Block is missing the image assets for layout_row.svg, layout_feature.svg, and layout_columns.svg in the settings.

Screen Shot 2021-03-25 at 5 38 45 PM

Onboarding documentation suggestions

Since I'm onboarding and going through the process with a fresh set of eyes/ears. I wanted to jot down some possible suggestions for improving documentation.

All these suggestions should be taken with the context that I'm new to SquareOne and could likely be overlooking the obvious. I do have a good deal of experience working with Mark Jaquith's WP Skeleton (used by SquareOne), Roots - Bedrock, WP Local Docker, and many other local dev tooling setup in the WordPress ecosystem.

Replace all instances of "SquareOne local" with "SquareOne Local", and "SquareOne global" with "SquareOne Global". I think this is causing the biggest noise for me. There are areas where "SquareOne local" is referenced, but since it is lowercase "local" I'm interpreting it as a generic local environment, whereas I believe the author and documentation should be clear as to whether there are two difference products: SquareOne Local and SquareOne Global.

Then, I would reorganize the documentation as follows:

  1. Intro to overall terminology and concepts associated with SquareOne (including a clear callout to differentiate SquareOne Global and SquareOne Local).
    • Tools and packages used (links), e.g. Docker, Mark Jaquith WP Skeleton, Gulp, Grunt, test suites, etc. (gives devs a lay of the land)
  2. Setup & Usage scenarios:
    1. New user (internal)
      • new project
      • existing project
    2. Contributors
  3. Role specific documentation (after setting up)
    • Front end
    • Back end

Also, this was the most enlightening bit of info that I found late in the game when trying to set up: https://github.com/moderntribe/square-one/blob/master/dev/docker/README.md#daily-usage

How to organize your SquareOne instances πŸ‘†

I'm hastily jotting this down just to get it down and will be happy to try and contribute enhancements in the noted areas in the coming weeks.

Thanks to all the hard work that undoubtedly numerous developers have contributed to SquareOne. Awesome project!

Cannot complete Getting Started guide due to error starting local container

Hello,

A friend recently told me about this framework and I'm trying to check it out. I'm following the Getting Started guide, currently at section: spin-up-containers. I was able to get global container running. Then I ran this command npm run docker:start and got hit with the following error:

Sun Sep  8 04:02:51 UTC 2019
Recreating square1_memcached_1     ... done
Recreating square1_elasticsearch_1 ... done
Recreating square1_redis_1         ... done
Recreating square1_php-fpm_1       ... done
Recreating square1_webserver_1     ... done
    1/13:       https://wpackagist.org/p/providers-2019-03$6d33f1e97aac20169568bdf6af0f0b7473abd16ca296090271f30c259224d3bc.json
    2/13:       https://wpackagist.org/p/providers-2011$8e23b35b4cfcf7f99e52c4e26fcabbe284a23fccdd3a861575ead068722df252.json
    3/13:       https://wpackagist.org/p/providers-2012$847abc94e665084c48a7d11b8af05e415c1f93d32447a8cbc7686868b9420543.json
    4/13:       https://wpackagist.org/p/providers-2013$7d4a9dda9c9e232636dc817270624c124327e0836851ff71e4a78b4957cdd87a.json
    6/13:       https://wpackagist.org/p/providers-2019-06$1df05f4139638e0be41daf6ae817c78aab9d49ad58567b86c18c4bcc121fe5b3.json
    6/13:       https://wpackagist.org/p/providers-2014$21fd0e37909557d8656f68dfc0f953a9d428640ef962878cecb14728d933e303.json
    7/13:       https://wpackagist.org/p/providers-2019-09$27b6c2b77c5cd5180e1ae3f3d59044d9040588e5a2f351b066300eba7386ffbd.json
    8/13:       https://wpackagist.org/p/providers-2016$f6dcd4f8fe47940887c56a50fc5b81aaa30a8bec9267c94a87df0906c3481ab4.json
    9/13:       https://wpackagist.org/p/providers-2017$4d0ecea8120c87a362130d53f6772153afdcbe82433e27ebd9060448ec19b6ee.json
    10/13:      https://wpackagist.org/p/providers-old$109638c56a3de4e04f0c26c2ac98d7909ab40093a3f09f62c990ddda3688b830.json
    11/13:      https://wpackagist.org/p/providers-this-week$9c5f7abde3e7e890310bc424e38ea8a0f1daf35e23512c0906dfb374104cefdc.json
    12/13:      https://wpackagist.org/p/providers-2015$c82b58a639909b12f196c8ee42cfdabd90f5d6e286fc4964ece0428876480896.json
    13/13:      https://wpackagist.org/p/providers-2018$0740f67d0d180050d55735b8ceacd8b60c57072464c08369b8e050616cd15b29.json
    Finished: success: 13, skipped: 0, failure: 0, total: 13
    1/12:       http://repo.packagist.org/p/provider-archived$8d246e6405b41becd305b877da3eb50c0428de8d11d8496a011eee74f922f59b.json
    2/12:       http://repo.packagist.org/p/provider-latest$c4d3dc816d366a6ff83bdb003634a51138bd9aec3ea262e9c2ab0ec0c0db8704.json
    3/12:       http://repo.packagist.org/p/provider-2014$ca722b2204f954e3af6cf6509671d651f6947b54e2e61cdda47626381f0f951f.json
    4/12:       http://repo.packagist.org/p/provider-2018-10$14c5d8047eac3b33845564a317ce2b1db793094c73e5fdb61c88898f96d89e48.json
    5/12:       http://repo.packagist.org/p/provider-2019-01$e10b958a8e254e92a800dc437fe20fad5dc3bfd73afa4e32f69414c4a4232808.json
    7/12:       http://repo.packagist.org/p/provider-2015$dcc8676836a09981bff5aae22a1970e5b9d3019ec8f553505792b694af6f437f.json
    7/12:       http://repo.packagist.org/p/provider-2013$f1cc8e767accd102ab105015ea8fcfd09661c14d4e09f23f179211da428d1934.json
    8/12:       http://repo.packagist.org/p/provider-2019-07$be45305a2443f545c043fe4919223300896ec025fff6b655f426d440d6717ea7.json
    9/12:       http://repo.packagist.org/p/provider-2019-04$bff5087ec59b5bcf39ef346f740ddcb2bb2163ac0eaf95550862f2abd8cbd0ca.json
    10/12:      http://repo.packagist.org/p/provider-2016$15dcd22568106bb368634dbae130e93b6ea2bedfb1e2461b9fb1c723564d4e32.json
    11/12:      http://repo.packagist.org/p/provider-2018$e60bd8f66ceb1849f6c2f6ae5c05d2a73d3b1dee594b096793d8d373bc801f5f.json
    12/12:      http://repo.packagist.org/p/provider-2017$20ef305c9e66472573dc48ffb311b7b7043df291cefd52c04b3f074119d13916.json
    Finished: success: 12, skipped: 0, failure: 0, total: 12
Loading composer repositories with package information
                                                      
                                                                                                                      
  [Composer\Downloader\TransportException]                                                                            
  The "https://api.github.com/repos/moderntribe/panel-builder" file could not be downloaded (HTTP/1.1 404 Not Found)  
                                                                                                                      

install [--prefer-source] [--prefer-dist] [--dry-run] [--dev] [--no-dev] [--no-custom-installers] [--no-autoloader] [--no-scripts] [--no-progress] [--no-suggest] [-v|vv|vvv|--verbose] [-o|--optimize-autoloader] [-a|--classmap-authoritative] [--apcu-autoloader] [--ignore-platform-reqs] [--] [<packages>]...

npm ERR! code ELIFECYCLE
npm ERR! errno 255
npm ERR! [email protected] docker:start: `./dev/docker/start.sh`
npm ERR! Exit status 255
npm ERR! 
npm ERR! Failed at the [email protected] docker:start script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

Seems like the panel builder repo is gone? Any help would be greatly appreciated.

Thanks.

Docker Network Does Not Resolve

System: macOS
Docker version: 2.0.0.3 (31259)

After going through the setup steps in the README --skipping Docker installation, because I had already done this-- I ran into a strange error where all IP addresses 172.20.10.xxx failed to resolve. The (partial) output log looks like this:

Starting tribe-proxy        ... error
Starting tribe-dns-internal ... 
Starting tribe-chrome       ... 
Starting tribe-mysql        ... 
Starting tribe-dns-internal ... error
Starting tribe-dns-external ... 

ERROR: for tribe-proxy  Cannot start service reverse-proxy: Invalid address 172.20.10.100: It does not belong to any of this network's subnets

Starting tribe-mail         ... error
Starting tribe-chrome       ... error

ERROR: for tribe-mail  Cannot start service mailhog: Invalid address 172.20.10.90: It does not belong to any of this network's subnets
Starting tribe-mysql        ... error
ERROR: for tribe-chrome  Cannot start service chrome: Invalid address 172.20.10.80: It does not belong to any of this network's subnets

ERROR: for tribe-mysql  Cannot start service mysql: Invalid address 172.20.10.20Starting tribe-dns-external ... done

ERROR: for reverse-proxy  Cannot start service reverse-proxy: Invalid address 172.20.10.100: It does not belong to any of this network's subnets

ERROR: for dns-internal  Cannot start service dns-internal: Invalid address 172.20.10.250: It does not belong to any of this network's subnets

ERROR: for mailhog  Cannot start service mailhog: Invalid address 172.20.10.90: It does not belong to any of this network's subnets

ERROR: for chrome  Cannot start service chrome: Invalid address 172.20.10.80: It does not belong to any of this network's subnets

ERROR: for mysql  Cannot start service mysql: Invalid address 172.20.10.200: It does not belong to any of this network's subnets
ERROR: Encountered errors while bringing up the project.
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! [email protected] docker:global:start: `./dev/docker/global/start.sh`
npm ERR! Exit status 1

The container never fully installs.

Routes query var setting not accessible.

During testing on the Routing sample, noticed when I changed the Query ver match key it no longer was accessible. Also, if I changed the format of the key, from a number to say a string, it would still return a zero int.

This is either an issue of missing documentation or a bug, either way we should investigate.

Added some routes for testing to this sample PR #715

Missing base CLI classes for TribeLibs integration and generator

When attempting to create a CLI command using the wp sq1 generate cli <command name> I got a few errors about missing files which made me realize we don't have the base classes anymore. Not sure how they were removed, logging this ticket so whomever has time can re-add them.

Issue:

  • Run wp s1 generate cli <command name> and see the errors generated

Solution:

  • Re-add the base definer and subscriber to the core plugin.

blocks.registerBlockType addFilter doesn't work within init hook

Issue:

It was noticed that the registerBlockType filter doesn't run if it is inside ready( init ); call.

The following example will not work as expected if we put the filter within init at wp-content/themes/core/assets/js/src/admin/editor/hooks.js (here):

addFilter( 'blocks.registerBlockType', 'tribe/filter-alignment', setAlignmentSupports );

Potential Solution:
We can create a separate file with all the registerBlockType filters required and hook it directly before the ready( init ) call

Codeception doesn't populate DB

After following instructions for the new project setup, specifically getting the testing suite running, the following error appears:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Codeception PHP Testing Framework v3.0.3
Powered by PHPUnit 8.3.3 by Sebastian Bergmann and contributors.
Running with seed: 
WPLoader could not correctly load WordPress.
If you do not see any other output beside this, probably a call to `die` or `exit` might have been made while loading WordPress files.
There are a number of reasons why this might happen and the most common is an empty, incomplete or incoherent database status.
E.g. you are trying to bootstrap WordPress as multisite on a database that does not contain multisite tables.
Run the same test command again activating debug (-vvv) to run a WordPress status check.
It looks like, alongside the WPLoader module, you are using the WPDb one.
Since the `WPLoader::loadOnly` parameter is set to `true` the WPLoader module will not try to populate the database.
The database should be populated from a dump using the WPDb modules.
Make sure the SQL dump you're trying to use is not empty and correct for the kind of installation you are trying to test.
Make also sure that, in the suite configuration file, in the `modules` section, the WPDb modules comes before the WPLoader one.
If you are, instead, trying to run integration tests you do not probably need the WPDb module or should set the `populate` and `cleanup` arguments to `false` and set the `WPLoader::loadOnly` parameter to `false` to let the WPLoader module populate the database for you.
Find out more about this at https://wpbrowser.wptestkit.dev/summary/modules/wploader#wploader-to-only-bootstrap-wordpress

Steps to Reproduce

Create a new [1] project with a name other than square1 by following the getting started guide for a new project. Configure the .env and tests-config.php files. Run npm run codecept:test from the project root.

Docker network conflict

Hi there!

During my learning moment on Square One, I noticed that the docker container conflicted with the existent networks. I could solve that by removing the other networks with the mentioned solution on the documentation. The only problem with that is: I might not want to remove the other networks.

In this case, I found out that there might be a way to solve that by customizing the subnet range (this is the link where some people are talking about this issue: https://stackoverflow.com/questions/50514275/docker-bridge-conflicts-with-host-network). I believe that this could be something to improve for the next steps of this project, making it more compatible to be used in a shared development environment.

Thanks in advance!

Links for documentation at the first Readme broken

Hello,

The links at the first documentation are not getting to pages accessible. I believe that this might be due to this not being accessible to people from outside the organization. When I click on them I get 404, but if I navigate to the "docs" directory I can see them there.

I hope you are all well!

Cheers,
Savio

Glomar Default Text can be Confusing for Clients

Goodness this is a stodgy-old-professor complaint but hear me out.

I recently had a situation where a new client stake holder needed to be brought up to speed in a hurry and I passed them a link on staging. Almost immediately came the response of "It's broken, no matter what I do I get some kind of not-found page". Not found sounds kinda like a 404 situation. And in this case, that's exactly what it was. I had not adequately prepped this customer to access staging and as a result his first exposure to tribe was:

We can neither confirm nor deny the existence or nonexistence of records responsive to your request. The fact of the existence or nonexistence of requested records is currently and properly classified and is intelligence sources and methods information that is protected from disclosure.

I'd like to propose we drop the browser facing glomar text and back story and replace with a more general description of why this is 404ing. I think the radiolab episode (and subsequent 1.5 hour wikipedia rabbit hole πŸ˜‚) are a fun part of onboarding for devs. I'd propose we preserve the plugin naming and "archive" the radiolab link and text in the codebase.

TravisCI setup needs better env support

TravisCI fails right now on builds because of issues with the tr1b0t oAuth token and the missing .env file in the Composer install step. We need to allow for env vars set in TravisCI to be available to Docker Compose.

Ubuntu: Chrome/Firefox CA certificate improvements

Need to add some additional automation for Debian/Ubuntu systems.

Chrome uses $HOME/.pki/nssdb on Ubuntu for certificates.

Firefox uses a random string path: ~/.mozilla/firefox/${RANDOM PROFILE}.default-release

Need the certutil binary: sudo apt install libnss3-tools

For Chrome:

  1. Tell the user to shut down all Chrome instances
  2. certutil -d sql:$HOME/.pki/nssdb -A -t "C,," -n tribe -i /usr/local/share/ca-certificates/tribeCA.crt

For Firefox:

  1. Tell the user to shut down all Firefox instances
  2. Get Firefox profile directory: find ~/.mozilla/firefox -name "cert9.db" | xargs dirname
  3. Something like this should work: certutil -d sql:$(find ~/.mozilla/firefox -name "cert9.db" | xargs dirname) -A -t "C,," -n tribe -i /usr/local/share/ca-certificates/tribeCA.crt

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.