MCPcopy Index your code
hub / github.com/deseretdigital/dayzed

github.com/deseretdigital/dayzed @v3.2.3

Chat with this repo
repository ↗ · DeepWiki ↗ · release v3.2.3 ↗ · + Follow
54 symbols 120 edges 25 files 8 documented · 15%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

dayzed

Primitives to build simple, flexible, WAI-ARIA compliant React date-picker components.

[![version][version-badge]][package] [![MIT License][license-badge]][license] All Contributors

[![Supports React and Preact][react-badge]][react] [![size][size-badge]][unpkg-dist] [![gzip size][gzip-badge]][unpkg-dist] [![module formats: umd, cjs, and es][module-formats-badge]][unpkg-dist]

The problem

You need a date-picker in your application that is accessible, can fit a number of use cases (single date, multi date, range), and has styling and layout that can be easily extended.

This solution

This is a component that focuses on controlling user interactions so you can focus on creating beautiful, accessible, and useful date-pickers. It uses a custom [Hook][react-hooks] or a [render function as children][render-function-as-children]. This means you are responsible for rendering everything, but props are provided by the Hook or render function, through a pattern called [prop getters][prop-getters], which can be used to help enhance what you are rendering.

This differs from other solutions which render things for their use case and then expose many options to allow for extensibility resulting in a bigger API that is less flexible as well as making the implementation more complicated and harder to contribute to.

Table of Contents

Installation

This module is distributed via [npm][npm] which is bundled with [node][node] and should be installed as one of your project's dependencies:

npm install --save dayzed

Or, you can install this module through the [yarn][yarn] package manager.

yarn add dayzed

This package also depends on react@>=16.8.0 and prop-types. Please make sure you have those installed as well.

Note also this library supports preact@>=10 out of the box. If you are using preact then use the corresponding module in the preact/dist folder. You can even import Dayzed from 'dayzed/preact' or import { useDayzed } from 'dayzed/preact'

Usage

import React from 'react';
import Dayzed, { useDayzed } from 'dayzed';

const monthNamesShort = [
  'Jan',
  'Feb',
  'Mar',
  'Apr',
  'May',
  'Jun',
  'Jul',
  'Aug',
  'Sep',
  'Oct',
  'Nov',
  'Dec'
];
const weekdayNamesShort = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];

function Calendar({ calendars, getBackProps, getForwardProps, getDateProps }) {
  if (calendars.length) {
    return (






          <button {...getBackProps({ calendars })}>Back</button>
          <button {...getForwardProps({ calendars })}>Next</button>



        {calendars.map(calendar => (






              {monthNamesShort[calendar.month]} {calendar.year}



            {weekdayNamesShort.map(weekday => (



                {weekday}



            ))}
            {calendar.weeks.map((week, weekIndex) =>
              week.map((dateObj, index) => {
                let key = `${calendar.month}${calendar.year}${weekIndex}${index}`;
                if (!dateObj) {
                  return (



                  );
                }
                let { date, selected, selectable, today } = dateObj;
                let background = today ? 'cornflowerblue' : '';
                background = selected ? 'purple' : background;
                background = !selectable ? 'teal' : background;
                return (
                  <button
                    style={{
                      display: 'inline-block',
                      width: 'calc(100% / 7)',
                      border: 'none',
                      background
                    }}
                    key={key}
                    {...getDateProps({ dateObj })}
                  >
                    {selectable ? date.getDate() : 'X'}
                  </button>
                );
              })
            )}



        ))}



    );
  }
  return null;
}

/*----------- Render Prop -----------*/

class Datepicker extends React.Component {
  render() {
    return (
      <Dayzed
        onDateSelected={this.props.onDateSelected}
        selected={this.props.selected}
        render={dayzedData => <Calendar {...dayzedData} />}
      />
    );
  }
}

///////////////////////////////////////
// OR
///////////////////////////////////////

/*----------- Custom Hook -----------*/

function Datepicker(props) {
  let dayzedData = useDayzed(props);
  return <Calendar {...dayzedData} />;
}

class Single extends React.Component {
  state = { selectedDate: null };

  _handleOnDateSelected = ({ selected, selectable, date }) => {
    this.setState(state => ({ selectedDate: date }));
  };

  render() {
    let { selectedDate } = this.state;
    return (



        <Datepicker
          selected={this.state.selectedDate}
          onDateSelected={this._handleOnDateSelected}
        />
        {this.state.selectedDate && (





Selected:




{`${selectedDate.toLocaleDateString()}`}





        )}



    );
  }
}

export default Single;

Props

date

date | defaults to new Date()

Used to calculate what month to display on initial render.

maxDate

date | optional

Used to calculate the maximum month to render.

minDate

date | optional

Used to calculate the minimum month to render.

monthsToDisplay

number | defaults to 1

Number of months returned, based off the date and offset props.

firstDayOfWeek

number | defaults to 0

First day of the week with possible values 0-6 (Sunday to Saturday). Defaults to Sunday.

showOutsideDays

boolean | defaults to false

Flag to fill front and back weeks with dates from adjacent months.

selected

any | optional

An array of Dates or a single Date that has been selected.

onDateSelected

function(selectedDate: Date, event: Event) | required

Called when the user selects a date.

  • selectedDate: The date that was just selected.
  • event: The event fired when the date was selected.

render

function({}) | required

This is called with an object. Read more about the properties of this object in the section "Render Prop Function".

offset

number | control prop (read more about this in the "Control Props" section below) - defaults to 0 if not controlled.

Number off months to offset from the date prop.

onOffsetChanged

function(offset: number) | control prop (read more about this in the "Control Props" section below)

Called when the user selects to go forward or back. This function is required if offset is being provided as a prop.

  • offset: The number of months offset.

Control Props

dayzed manages its own offset state internally and calls your onOffsetChanged handler when the offset changes. Your render prop function (read more below) can be used to manipulate this state from within the render function and can likely support many of your use cases.

However, if more control is needed, you can pass offset as a prop (as indicated above) and that state becomes controlled. As soon as this.props.offset !== undefined, internally, dayzed will determine its state based on your prop's value rather than its own internal state. You will be required to keep the state up to date (this is where the onOffsetChanged handler comes in really handy), but you can also control the state from anywhere, be that state from other components, redux, react-router, or anywhere else.

Note: This is very similar to how normal controlled components work elsewhere in react (like <input />). If you want to learn more about this concept, you can learn about that from this the ["Controlled Components" lecture][controlled-components-lecture]

Custom Hook

You can either use the custom useDayzed hook or the render prop function (described in the section below) to return the things needed to render your calendars. The custom Hook has a benefit over the render prop function as it does not unnecessarily add an additional child into the render tree. Example:

function Datepicker(props) {
  let { calendars, getBackProps, getForwardProps, getDateProp } = useDayzed(
    props
  );
  return 

{/* calendar elements */}

;
}

Render Prop Function

This is where you render whatever you want to based on the state of dayzed. It's a regular prop called render: <Dayzed render={/* right here*/} />.

You can also pass it as the children prop if you prefer to do things that way <Dayzed>{/* right here*/}</Dayzed>

Fun fact, the Dazyed render prop component actually uses the useDayzed custom Hook under the hood.

The properties of this object can be split into two categories as indicated below:

prop getters

See [the blog post about prop getters][prop-getters]

These functions are used to apply props to the elements that you render. This gives you maximum flexibility to render what, when, and wherever you like. You call these on the element in question (for example: <button {...getDateProps()})). It's advisable to pass all your props to that function rather than applying them on the element yourself to avoid your props being overridden (or overriding the props returned). For example: getDateProps({onClick(event) {console.log(event)}}).

property type description
getDateProps function({}) Returns the props you should apply to the date button elements you render.
getBackProps function({}) Returns the props you should apply to any back button element you render.
getForwardProps function({}) Returns the props you should apply to any forward button element you render.

state

These are values that represent the current state of the dayzed component.

property type description
calendars any An array containing objects of each month's data.
calendars[{}].month number Zero-based number of the month. (0 - 11)
calendars[{}].year number The year of the month.
calendars[{}].firstDayOfMonth date First day of the month.
calendars[{}].lastDayOfMonth date Last day of the month.
calendars[{}].weeks any An array containing an array of date objects for each week of the month. Starting from Sunday to Saturday. [ ["", "", "", "", dateObj, dateObj, dateObj] ]
calendars[{}].weeks[[{}]].date date A Date object for that day of

Extension points exported contracts — how you extend this code

DateObj (Interface)
(no doc)
typings/dayzed.d.ts
State (Interface)
(no doc)
typings/dayzed-tests.tsx
Calendar (Interface)
(no doc)
typings/dayzed.d.ts
GetBackForwardPropsOptions (Interface)
(no doc)
typings/dayzed.d.ts
GetDatePropsOptions (Interface)
(no doc)
typings/dayzed.d.ts
RenderProps (Interface)
(no doc)
typings/dayzed.d.ts

Core symbols most depended-on inside this repo

getBackProps
called by 8
src/dayzed.js
getForwardProps
called by 8
src/dayzed.js
getDateProps
called by 5
src/dayzed.js
composeEventHandlers
called by 3
src/utils.js
requiredProp
called by 3
src/utils.js
isSelected
called by 3
src/utils.js
isSelectable
called by 3
src/utils.js
lastChild
called by 3
cypress/integration/single.js

Shape

Function 35
Class 9
Interface 7
Method 3

Languages

TypeScript100%

Modules by API surface

src/utils.js17 symbols
typings/dayzed.d.ts8 symbols
src/dayzed.js8 symbols
typings/dayzed-tests.tsx5 symbols
docs/components/range.js4 symbols
docs/components/Datepicker.js4 symbols
docs/components/interestingLayout.js3 symbols
docs/components/single.js1 symbols
docs/components/multi.js1 symbols
docs/components/monthsToDisplay.js1 symbols
docs/components/minMax.js1 symbols
cypress/integration/single.js1 symbols

For agents

$ claude mcp add dayzed \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact

Ask about this repo answers extend the page