Git Product home page Git Product logo

store-hours's Introduction

Store Hours for Craft CMS

This plugin adds a new “Store Hours” field type to Craft, for collecting the opening and closing hours (or any other time slots) of an organization for each day of the week.

Requirements

This plugin requires Craft CMS 5.0 or later.

Installation

You can install this plugin from the Plugin Store or with Composer.

From the Plugin Store

Go to the Plugin Store in your project’s Control Panel and search for “Store Hours”. Then press Install in its modal window.

With Composer

Open your terminal and run the following commands:

# go to the project directory
cd /path/to/my-project.test

# tell Composer to load the plugin
composer require craftcms/store-hours

# tell Craft to install the plugin
php craft plugin/install store-hours

Customizing Time Slots

Store Hours fields have a setting called “Time Slots” that lets you customize the time columns that will be visible in the field inputs. By default there will be two time slots, “Opening Time” and “Closing Time”, but you can customize those however you like.

A Time Slots field setting with “Open”, “Close”, “Second Open”, and “Second Close” slots defined

Each row you add here will end up adding a new column to the field inputs.

A Store Hours field with four custom time slots

Templating

You can loop through your Store Hours fields to access info for each day of the week (starting with Sunday):

<h3>Opening Hours</h3>
<dl>
  {% for day in entry.<FieldHandle> %}
    <dt>{{ day.name }}</dt>
    <dd>
      {% if day.isBlank %}
        Closed
      {% else %}
        {{ day.open|time }} - {{ day.close|time }}
      {% endif %}
    </dd>
  {% endfor %}
</dl>

The exact time format that will be used when outputting times with the |time filter depends on the current application locale. See the Craft documentation for details on how it can be customized.

Showing a Single Day’s Hours

You can get the hours for a single day using the following methods:

Method Day
getSun() Sunday
getMon() Monday
getTue() Tuesday
getWed() Wednesday
getThu() Thursday
getFri() Friday
getSat() Saturday
getYesterday() Yesterday
getToday() Today
getTomorrow() Tomorrow
<h3>Today’s Hours</h3>
{% set today = entry.<FieldHandle>.today %}
{% if today.isBlank %}
  <p>Sorry, we’re closed today.</p>
  {% set tomorrow = entry.<FieldHandle>.tomorrow %}
  {% if not tomorrow.isBlank %}
    <p>We’ll be back open tomorrow at {{ tomorrow.open|time }}.</p>
  {% endif %}
{% else %}
  <p>We’re open from {{ today.open|time }} to {{ today.close|time }} today.</p>
{% endif %}

Showing a Custom Day Range

To only show certain days of the week (e.g only Monday through Friday), use the getRange() field method. Pass two integers in to represent the start and end days of the range, using this mapping:

Number Day
0 Sunday
1 Monday
2 Tuesday
3 Wednesday
4 Thursday
5 Friday
6 Saturday
{# Only show Monday-Friday #}
{% set range = entry.<FieldHandle>.getRange(1, 5) %}

{% for day in range %}
    {# ... #}
{% endfor %}

Showing Grouped Ranges

You can show consolidated list of hours, such as:

11am – 6pm Mon – Fri
11am – 5pm Sat – Sun

To do that, use the getGroupedRanges() field method, which is similar to getRange(), except the resulting days are grouped by their time slots.

<ul>
  {% for group in entry.<FieldHandle>.getGroupedRanges(1) %}
    {% set first = group|first %}
    {% set last = group|last %}
    {% if first.open and first.close %}
      <li>
        <strong>
          {{ first.open|date('g:sa')|replace(':00', '') }}&hairsp;&hairsp;{{ first.close|date('g:sa')|replace(':00', '') }}
        </strong>
        {% if first != last %}
          {{ first.getName('medium') }}&hairsp;&hairsp;{{ last.getName('medium') }}
        {% else %}
          {{ first.getName('medium') }}
        {% endif %}
      {% endif %}
    </li>  
  {% endfor %}
</ul>

Changing the Week Start Day

You can use the getRange() field method to return the full list of days with a different week start day. For example, if you want Monday to be the first day of the week, do this:

{# Show all days with Monday first #}
{% set range = entry.<FieldHandle>.getRange(1, 0) %}

{% for day in range %}
  {# ... #}
{% endfor %}

As a shortcut, you can also skip passing the end day when you want to do this:

{# Show all days with Monday first #}
{% set range = entry.<FieldHandle>.getRange(1) %}

{% for day in range %}
  {# ... #}
{% endfor %}

Determining Whether All Slots are Blank

You can quickly find out whether all the time slots in a day were left blank using the getIsBlank() (isBlank) field method:

<h3>Opening Hours</h3>
<dl>
  {% for day in entry.<FieldHandle> %}
    <dt>{{ day.name }}</dt>
    <dd>
      {% if day.isBlank %}
        Closed
      {% else %}
        {{ day.open|time }} - {{ day.close|time }}
      {% endif %}
    </dd>
  {% endfor %}
</dl>

store-hours's People

Contributors

angrybrad avatar benjamindavid avatar brandonkelly avatar carlcs avatar drifteaur avatar lassemt avatar makeilalundy avatar mrwijsman 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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

store-hours's Issues

24 Hour Clock

Description

Would be nice to be able to use 24 hour clock and start the week on Monday if possible.

Maybe a settings screen in admin only available to admin users?

User WeekStartDay preference determines the order of the data

Craft lets you change what your starting day of the week is (either Sunday or Monday) as a per-user preference.

Store Hours nicely takes this into account by presenting the Store Hours entry data in the field type based on this preference.

The problem is that this data is serialized in a zero-based array of DateTime objects, with no indication of what day is associated with what hours.

So if a Monday-first user preference is set, the first item in the array will be the hours for Monday. If a Sunday-first user preference is set, the first item in the array will be the hours for Sunday.

In the stored data, there's no indication of what the first day is, it varies depending on who edited the entry last.

I'd suggest normalizing the stored data so that it's always Sunday-first (and thus the example code in the README.md will work). That, or store with the hours data what day of the week is first.

Feature request `isOpen`

Would be great to have a isOpen filter we could test against... Right now I'm doing this:
{{ location.hours[now|date('w')].open < now and location.hours[now|date('w')].close > now ? 'Open now' : 'Closed' }} which works but really messes up my template ;)

Leading Zeroes

We're getting leading zeroes on hours for either of these:

{{ dayHours.open|date('h:i a') }}
{{ dayHours.open|date('H:i a') }}

Output can be incorrect depending on the last user to save the entry

Seems like the Store Hours output is often inaccurate on the front-end, depending on who last saved the entry with the Store Hours field.

We have found that when a user with their Week Start Day setting set to Sunday saves the entry, the output on the front-end is correct. When another user with their Week Start Day set to any other day saves the entry, the times do not match their corresponding days.

Our template is pretty similar as to what is recommended in the readme.

This issue was first noted after this commit in this issue.

Doesn't seem to work with the element API

I'm trying to set up this plugin and retrieving the data as JSON with the element API plugin, but only ever getting NULL although the fields are filled in. This is my endpoint:

    'stores.json' => function() {
      $langHandle = Craft::$app->request->getQueryParam('lang', 'en');
      return [
        'elementType' => Entry::class,
        'criteria' => [
          'section' => 'store',
          'site' => $langHandle,
        ],
        'paginate' => false,
        'cache' => $GLOBALS['cache'],
        'transformer' => function(Entry $entry) {
          var_dump($entry->openingHours);
          return [
            'title' => $entry->title,
            'slug' => $entry->slug,
            'id' => $entry->id,
            'openingDate' => $entry->openingDate ? $entry->openingDate->format("d.m.Y") : null,
            'closingDate' => $entry->closingDate ? $entry->closingDate->format("d.m.Y") : null,
            'openingHours' => $entry->openingHours,
          ];
        },
      ];
    },

Even var_dump'ing it always outputs null. Am I doing something wrong or is this a bug?

FR: "now open"

Description

Would be nice to have a template variable to check, to see if the store is open atm (not this day, but this very moment).

.today returns wrong day

Craft CMS 3.0.23.1
Store Hours 2.1.1

.today (almost) always returns yesterday. I can remedy this (for a day) by saving the entry and .today will return the proper day.

hours-dump
The first dump is of the entry I just saved. The second dump is the next location in the loop that hasn't been saved today.

Feed Me format / compatibility

I'm setting up a new site with a list of about a hundred stores, and hoping to use this plugin to manage the opening hours.

I'm planning to use a CSV file for the source which the client will fill in; what's the correct format for getting Feed Me to read store hours and import them correctly to this plugin?

Saving shifts the time around

Craft version: 3.0.0-beta.34
Store Hours version: 2.0.5

Each time I click save on the entry, the time seems to shift by a number of hours. I'm not sure if it has something to do with the timezone.

After fixing the time, I checked the content table and it's stored as:

[{"open":null,"close":null},{"open":"2017-11-12T08:00:00-05:00","close":"2017-11-12T16:00:00-05:00"},{"open":"2017-11-12T08:00:00-05:00","close":"2017-11-12T16:00:00-05:00"},{"open":"2017-11-12T08:00:00-05:00","close":"2017-11-12T16:00:00-05:00"},{"open":"2017-11-12T08:00:00-05:00","close":"2017-11-12T16:00:00-05:00"},{"open":"2017-11-12T08:00:00-05:00","close":"2017-11-12T16:00:00-05:00"},{"open":null,"close":null}]

Once I click Save and continue editing I see the times have changed on the UI and also in the database:

[{"open":null,"close":null},{"open":"2017-11-12T13:00:00-05:00","close":"2017-11-12T21:00:00-05:00"},{"open":"2017-11-12T13:00:00-05:00","close":"2017-11-12T21:00:00-05:00"},{"open":"2017-11-12T13:00:00-05:00","close":"2017-11-12T21:00:00-05:00"},{"open":"2017-11-12T13:00:00-05:00","close":"2017-11-12T21:00:00-05:00"},{"open":"2017-11-12T13:00:00-05:00","close":"2017-11-12T21:00:00-05:00"},{"open":null,"close":null}]

This cycle repeats itself each time I click save.

For reference, the site's timezone in my case is set to UTC-5 Indianapolis however I am on Los Angeles time... not sure if that matters. This is happening on my local dev environment.

Question: Grouping Days with Same Hours

Would it be possible to group days with the same open & close hours?

For example:

Monday - Thursday: 9:00am - 4:00pm
Friday: 9:00am - 6:00pm
Saturday - Sunday: 10:00am - 8:00pm

Support multiple time inputs per day

I'm currently working on a restaurant website. They have a time schedule that's pretty common in Germany:

  • Closed on mondays
  • Open from 10am to 5pm, closed from 5pm to 6:30pm, open from 6:30pm to 11pm on tuesdays, wednesdays, fridays and saturdays
  • Open from 10am to 11pm on thursdays
  • Open from 10am to 5pm on sundays

Currently, I solve this with a table input:

MoTuWeThFrSaSu
10-1710-1710-2310-1710-1710-17
18:30-2318:30-2318:30-2318:30-23
+ Add row

Which works, but it feels bad having users type in the open hours as plain text instead of time. To turn this into usable JSON-LD data, I use the following Twig abomination:

{% set openingHours = [] %}
{% set monday =       [] %}
{% set tuesday =      [] %}
{% set wednesday =    [] %}
{% set thursday =     [] %}
{% set friday =       [] %}
{% set saturday =     [] %}
{% set sunday =       [] %}

{% for range in company.openingHours %}
  {% if range.Mo %}{% set monday    = monday    | merge( [ range.Mo ] ) %}{% endif %}
  {% if range.Tu %}{% set tuesday   = tuesday   | merge( [ range.Tu ] ) %}{% endif %}
  {% if range.We %}{% set wednesday = wednesday | merge( [ range.We ] ) %}{% endif %}
  {% if range.Th %}{% set thursday  = thursday  | merge( [ range.Th ] ) %}{% endif %}
  {% if range.Fr %}{% set friday    = friday    | merge( [ range.Fr ] ) %}{% endif %}
  {% if range.Sa %}{% set saturday  = saturday  | merge( [ range.Sa ] ) %}{% endif %}
  {% if range.Su %}{% set sunday    = sunday    | merge( [ range.Su ] ) %}{% endif %}
{% endfor %}

{% if monday %}{% set openingHours    = openingHours | merge( [ 'Mo ' ~ monday    | join(', ') ] ) %}{% endif %}
{% if tuesday %}{% set openingHours   = openingHours | merge( [ 'Tu ' ~ tuesday   | join(', ') ] ) %}{% endif %}
{% if wednesday %}{% set openingHours = openingHours | merge( [ 'We ' ~ wednesday | join(', ') ] ) %}{% endif %}
{% if thursday %}{% set openingHours  = openingHours | merge( [ 'Th ' ~ thursday  | join(', ') ] ) %}{% endif %}
{% if friday %}{% set openingHours    = openingHours | merge( [ 'Fr ' ~ friday    | join(', ') ] ) %}{% endif %}
{% if saturday %}{% set openingHours  = openingHours | merge( [ 'Sa ' ~ saturday  | join(', ') ] ) %}{% endif %}
{% if sunday %}{% set openingHours    = openingHours | merge( [ 'Su ' ~ sunday    | join(', ') ] ) %}{% endif %}

...which results in

"openingHours": [
  "Tu 10:00-17:00, 18:30-23:00",
  "We 10:00-17:00, 18:30-23:00",
  "Th 10:00-23:00",
  "Fr 10:00-17:00, 18:30-23:00",
  "Sa 10:00-17:00, 18:30-23:00",
  "Su 10:00-17:00"
],

It would be awesome if we could get optional, additional hour columns 😊
Would it be possible to make this work?

Tomorrow

Description

So i'm not sure if i'm just blind or the function "tomorrow" isn't there.

I'd like to be able to call tomorrows opening times, I have a little status at the top of my website that shows whether the shop is open or closed at the moment. When the shop is open the status shows at what time the shop is closing and when the shop is closed i'd like to display the opening time for the next day (during weekdays shops opens at 6AM and in the weekends at 8 (saturday) and 9(sunday).

  {% if now > today.openCarwash and now < today.closeCarwash %}
  open until {{ today.closeCarwash|time('short', locale='nl') }}
  {% elseif now < today.openCarwash %}
  closed until {{ today.openCarwash|time('short', locale='nl') }}
  {% elseif now > today.closeCarwash %}
  closed until {{ tomorrow.openCarwash|time('short', locale='nl') }}
  {% endif %}

I hope it's not too much to ask for :)

Roadmap for new releases

Thank you for this great plugin. It's a nice add-on for Craft.

Just wondering, is there a roadmap for new releases?

Looking forward using features such as ‘is open’.

Timeslots all returning today as date

Description

While working on getting the new getGroupedRanges() feature preparsed so i can use it via GraphQL I saw that all dates returned by the plugin are using today as the date.

For example given this template:

{% apply spaceless %}
{{element.openingHours.getGroupedRanges(1) | json_encode}}
{% endapply %}

i get the following result:

[
  [
    {
      "open": {
        "date": "2024-08-08 07:00:00.000000",
        "timezone_type": 3,
        "timezone": "Europe/Berlin"
      },
      "close": {
        "date": "2024-08-08 19:00:00.000000",
        "timezone_type": 3,
        "timezone": "Europe/Berlin"
      }
    },
    {
      "open": {
        "date": "2024-08-08 07:00:00.000000",
        "timezone_type": 3,
        "timezone": "Europe/Berlin"
      },
      "close": {
        "date": "2024-08-08 19:00:00.000000",
        "timezone_type": 3,
        "timezone": "Europe/Berlin"
      }
    },
    {
      "open": {
        "date": "2024-08-08 07:00:00.000000",
        "timezone_type": 3,
        "timezone": "Europe/Berlin"
      },
      "close": {
        "date": "2024-08-08 19:00:00.000000",
        "timezone_type": 3,
        "timezone": "Europe/Berlin"
      }
    },
    {
      "open": {
        "date": "2024-08-08 07:00:00.000000",
        "timezone_type": 3,
        "timezone": "Europe/Berlin"
      },
      "close": {
        "date": "2024-08-08 19:00:00.000000",
        "timezone_type": 3,
        "timezone": "Europe/Berlin"
      }
    }
  ],
  [
    {
      "open": {
        "date": "2024-08-08 07:00:00.000000",
        "timezone_type": 3,
        "timezone": "Europe/Berlin"
      },
      "close": {
        "date": "2024-08-08 21:00:00.000000",
        "timezone_type": 3,
        "timezone": "Europe/Berlin"
      }
    }
  ],
  [
    {
      "open": {
        "date": "2024-08-08 08:00:00.000000",
        "timezone_type": 3,
        "timezone": "Europe/Berlin"
      },
      "close": {
        "date": "2024-08-08 22:00:00.000000",
        "timezone_type": 3,
        "timezone": "Europe/Berlin"
      }
    },
    {
      "open": {
        "date": "2024-08-08 08:00:00.000000",
        "timezone_type": 3,
        "timezone": "Europe/Berlin"
      },
      "close": {
        "date": "2024-08-08 22:00:00.000000",
        "timezone_type": 3,
        "timezone": "Europe/Berlin"
      }
    }
  ]
]

while the groups are all correct, there is no way to see which day of the weeks the timeslots are refering to.

I tested this via GraphQL as well:

{
  locationsEntries {
    ... on location_Entry {
      openingHours {
        open
        close
      }
    }
  }
}

results in:

{
  "data": {
    "locationsEntries": [
      {
        "openingHours": [
          {
            "open": "2024-08-08T08:00:00+02:00",
            "close": "2024-08-08T22:00:00+02:00"
          },
          {
            "open": "2024-08-08T07:00:00+02:00",
            "close": "2024-08-08T19:00:00+02:00"
          },
          {
            "open": "2024-08-08T07:00:00+02:00",
            "close": "2024-08-08T19:00:00+02:00"
          },
          {
            "open": "2024-08-08T07:00:00+02:00",
            "close": "2024-08-08T19:00:00+02:00"
          },
          {
            "open": "2024-08-08T07:00:00+02:00",
            "close": "2024-08-08T19:00:00+02:00"
          },
          {
            "open": "2024-08-08T07:00:00+02:00",
            "close": "2024-08-08T21:00:00+02:00"
          },
          {
            "open": "2024-08-08T08:00:00+02:00",
            "close": "2024-08-08T22:00:00+02:00"
          }
        ]
      }
    ]
  }
}

Is there no way to get the "day of the week" as an int in the same result without having to call the getMon()/getTue() functions?

Additional info

  • Craft version: 5.2.10
  • Plugins & versions: 4.2.0

Default Hours

Description

Ability to set default hours for each day when setting up the field.

Bug when using field in draft

When loading up a draft of an entry it looks like prepValueFromPost and prepValue methods are both run, when causes the open/close properties to become empty strings.

Below is my quick hack, but I suck at php so it's probably not a good fix.

foreach ($value as &$day)
            {
                if ((is_string($day['open']) && $day['open']) || (is_array($day['open']) && $day['open']['time']))
                {
                    $day['open'] = DateTime::createFromString($day['open'], $timezone);
                }
                else if( !($day['open'] instanceof DateTime) )
                {
                    $day['open'] = '';
                }

                if ((is_string($day['close']) && $day['close']) || (is_array($day['close']) && $day['close']['time']))
                {
                    $day['close'] = DateTime::createFromString($day['close'], $timezone);
                }
                else if( !($day['close'] instanceof DateTime) )
                {
                    $day['close'] = '';
                }
            }

Closed Status

Description

Add a toggle or checkbox to denote a day as Closed. Currently I could leave blank or set open and close to 12a but I (or client) could also leave something blank by mistake.

Array to string conversion when saved

I've installed StoreHours, created a field type, and added it to a Global set's field layout. When I go to then save that Global set, regardless of if I've entered in content into the StoreHours field, the result of the save is an "Array to string conversion" error.

The stacktrace throws this error:

/pathto/craft/app/vendor/twig/twig/lib/Twig/Template.php(401)
throw new Twig_Error_Runtime(sprintf('Impossible to invoke a method ("%s") on a %s variable ("%s")', $item, gettype($object), $object), -1, $this->getTemplateName());

This is while running Craft Pro 2.1.2564

Cheers,
John

defaultWeekStartDay Support

I have my defaultWeekStartDay set to Monday, but the plugin starts on Sunday - shouldn't it honour whatever the default is set to?

Craft installation breaks when this is installed in project config

Description

Just updated to Craft 5.3.4 and noticed my test suite started failing because of a schema version validation error for the store-hours plugin because of this change.

The project config tries to validate the schema version of the plugin by referencing it's $schemaVersion property. However that property is blank on this plugin. I think $schemaVersion just needs to be added to the Plugin class with the current version.

  • Craft version: 5.3.4
  • PHP version: 8.2
  • Database driver & version:
  • Plugin Version: 4.2.0

Field setting to manage the "Week Start Day" in the CP

This little plugin has been pretty helpful, thanks! 🙂

Within the control panel, it would be great if we could set the leading day of the week for each Store Hours field. This field is currently locked to begin with Sunday, with no clear ability to change it...

Hours in the control panel

It leads to a bit of confusion, because on the front-end we are using Monday as the first day of the week...

Hours on the front end

So what we're seeing on the front-end (or in Live Preview mode) doesn't properly align with how it appears in the CP. This increases the odds that a careless content editor might enter their hours into the wrong subfields.


TL;DR - Would it be possible to add a field setting to manage the "Week Start Day" in the control panel?

entry form - front end editing

I need to enable store managers to edit the store hours via a front end form, which I've got working for some basic fields. However I'm not sure how to get the store-hours field coded.

What is the best approach for this?

using the Craft 2.x version

Neither the property "close" nor one of the methods "close()", "getclose()"/"isclose()"/"hasclose()" or "__call()" exist and have public access in class "craft\storehours\data\DayData".

Getting this error...

Neither the property "close" nor one of the methods "close()", "getclose()"/"isclose()"/"hasclose()" or "__call()" exist and have public access in class "craft\storehours\data\DayData".

When trying to use this template code...

{% if location.locationHours|length %}
    <div class="flex mb-3">
        <div class="w-1/6">
              <img class="w-full pr-5" src="/img/icon-clock.svg" alt="Hours">
        </div>
        <div class="w-5/6">
            {% set today = location.locationHours.today %}
            {% if today.isBlank %}
                <p>Closed</p>
            {% else %}
                <p>{{ today.open|time }} - {{ today.close|time }}</p>
            {% endif %}
        </div>
    </div>
{% endif %}

This is the specific line that seems to have the issue...

<p>{{ today.open|time }} - {{ today.close|time }}</p>

Holiday Hours

Description

Ability to add holiday date(s) with different hours than regular M-F. Currently using a matrix field as a work around.

storeHours|length is always 7

How do I Check is none of the storeHours is filled?
When you save the storeHours|length will be 7 instead of 0.

{% if entry.storeHours|length %} ... {% endif %}

GraphQL Compatibility

Being able to use the new baked-in GraphQL to query the Store Hours plugin would be very helpful.

Only show days that have time

My client's company is only open Mon-Fri. How can I make it so it only renders the days with times that are filled in instead of the entire week?

screen shot 2018-06-25 at 4 14 55 pm

screen shot 2018-06-25 at 4 14 21 pm

Undefined property

I am copying an pasting the code directly from gitHub and I get this error:

Undefined property: craft\storehours\data\DayData::$open

hours_-_amr_clinics

entry_twig __applications_mamp_htdocs_amrclinics_test_craft

it does not matter if I add the other hours, eg close, secondOpen, or secondClose

No documentation

Hi guys,
Any chance of some very basic documentation being added to the readme for this plugin please? There's nothing here about how to output data.

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.