@hyphen/hyphen-components 6.14.0 → 7.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/dist/components/Calendar/Calendar.d.ts +5 -0
  2. package/dist/components/Calendar/Calendar.stories.d.ts +12 -0
  3. package/dist/components/Modal/components/ModalHeader/ModalHeader.d.ts +6 -1
  4. package/dist/css/index.css +2 -3
  5. package/dist/css/utilities.css +8 -0
  6. package/dist/hyphen-components.cjs.development.js +633 -788
  7. package/dist/hyphen-components.cjs.development.js.map +1 -1
  8. package/dist/hyphen-components.cjs.production.min.js +1 -1
  9. package/dist/hyphen-components.cjs.production.min.js.map +1 -1
  10. package/dist/hyphen-components.esm.js +634 -787
  11. package/dist/hyphen-components.esm.js.map +1 -1
  12. package/dist/index.d.ts +1 -2
  13. package/package.json +2 -3
  14. package/src/components/Calendar/Calendar.mdx +28 -0
  15. package/src/components/Calendar/Calendar.stories.tsx +217 -0
  16. package/src/components/Calendar/Calendar.tsx +117 -0
  17. package/src/components/Formik/Formik.stories.tsx +10 -21
  18. package/src/components/Modal/Modal.stories.tsx +3 -1
  19. package/src/components/Modal/components/ModalHeader/ModalHeader.tsx +27 -9
  20. package/src/index.ts +1 -2
  21. package/src/styles/utilities.scss +8 -0
  22. package/dist/components/DateInput/DateInput.d.ts +0 -57
  23. package/dist/components/DateInput/DateInput.stories.d.ts +0 -11
  24. package/dist/components/DatePicker/DatePicker.d.ts +0 -86
  25. package/dist/components/DatePicker/DatePicker.stories.d.ts +0 -13
  26. package/src/components/DateInput/DateInput.mdx +0 -61
  27. package/src/components/DateInput/DateInput.stories.tsx +0 -168
  28. package/src/components/DateInput/DateInput.test.tsx +0 -176
  29. package/src/components/DateInput/DateInput.tsx +0 -212
  30. package/src/components/DatePicker/DatePicker.mdx +0 -52
  31. package/src/components/DatePicker/DatePicker.module.scss +0 -603
  32. package/src/components/DatePicker/DatePicker.stories.tsx +0 -199
  33. package/src/components/DatePicker/DatePicker.test.tsx +0 -26
  34. package/src/components/DatePicker/DatePicker.tsx +0 -138
@@ -1,212 +0,0 @@
1
- import React, { FC, useState } from 'react';
2
- import format from 'date-fns/format';
3
- import { DatePicker, DatePickerProps } from '../DatePicker/DatePicker';
4
- import { TextInput, TextInputProps } from '../TextInput/TextInput';
5
- import {
6
- Popover,
7
- PopoverContent,
8
- PopoverPortal,
9
- PopoverTrigger,
10
- } from '../Popover/Popover';
11
- import { useOpenClose } from '../../hooks';
12
-
13
- export interface DateInputProps {
14
- /**
15
- * Props object for DatePicker component.
16
- */
17
- datePickerProps: DatePickerProps;
18
- /**
19
- * Props object for TextInput component.
20
- */
21
- textInputProps: Omit<TextInputProps, 'onChange'>;
22
- /**
23
- * Format for final date to be displayed.
24
- * Relies on date-fns/format --> https://date-fns.org/v1.9.0/docs/format
25
- */
26
- dateFormat?: string;
27
- /**
28
- * Additional settings for formatting date.
29
- */
30
- dateOptions?: {
31
- /**
32
- * The user's locale.
33
- */
34
- locale?: globalThis.Locale | undefined;
35
- /**
36
- * Start of week.
37
- */
38
- weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | undefined;
39
- /**
40
- * Should determine which week is week 1 of a new year.
41
- */
42
- firstWeekContainsDate?: number | undefined;
43
- /**
44
- * Whether to accept unicode tokens in format.
45
- * See here --> https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md
46
- */
47
- useAdditionalWeekYearTokens?: boolean | undefined;
48
- /**
49
- * Whether to accept unicode tokens in format.
50
- * See here --> https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md
51
- */
52
- useAdditionalDayOfYearTokens?: boolean | undefined;
53
- };
54
- /**
55
- * Props to pass down to the Popover component.
56
- */
57
- popoverProps?: {
58
- side: 'top' | 'bottom' | 'left' | 'right';
59
- align: 'start' | 'center' | 'end';
60
- };
61
- /**
62
- * Additional props to be spread to the `TextInput` element.
63
- */
64
- [x: string]: any; // eslint-disable-line
65
- }
66
-
67
- const defaultDatePickerProps: Omit<DatePickerProps, 'onChange'> = {
68
- selected: null,
69
- selectsRange: false,
70
- };
71
-
72
- const defaultPopoverProps = {
73
- align: 'start',
74
- side: 'bottom',
75
- };
76
-
77
- const defaultTextInputProps: Omit<TextInputProps, 'id'> = {
78
- label: 'Select Date',
79
- };
80
-
81
- export const DateInput: FC<DateInputProps> = ({
82
- datePickerProps,
83
- textInputProps,
84
- dateFormat = 'MM/dd/yyyy',
85
- dateOptions = undefined,
86
- popoverProps = { ...defaultPopoverProps },
87
- }) => {
88
- const { isOpen, handleClose, handleOpen } = useOpenClose();
89
-
90
- // Internal state for selected date if not controlled
91
- const isControlled = datePickerProps.selected !== undefined;
92
- const [internalSelected, setInternalSelected] = useState<Date | null>(
93
- Array.isArray(datePickerProps.selected)
94
- ? datePickerProps.selected[0] ?? null
95
- : datePickerProps.selected ?? null
96
- );
97
-
98
- // Use controlled or internal state
99
- const selectedDate = isControlled
100
- ? datePickerProps.selected
101
- : internalSelected;
102
-
103
- const mergedDatePickerProps = {
104
- ...defaultDatePickerProps,
105
- ...datePickerProps,
106
- selected: selectedDate,
107
- };
108
-
109
- const mergedPopoverProps = {
110
- ...defaultPopoverProps,
111
- ...popoverProps,
112
- side: (popoverProps?.side ?? defaultPopoverProps.side) as
113
- | 'top'
114
- | 'bottom'
115
- | 'left'
116
- | 'right',
117
- align: (popoverProps?.align ?? defaultPopoverProps.align) as
118
- | 'start'
119
- | 'center'
120
- | 'end',
121
- onInteractOutside: handleClose,
122
- };
123
-
124
- const mergedTextInputProps = {
125
- ...defaultTextInputProps,
126
- ...textInputProps,
127
- };
128
-
129
- const getTextInputValue = () => {
130
- const { selectsRange, startDate, endDate, selected } =
131
- mergedDatePickerProps;
132
- // If selectsRange and selected is an array, use it for start/end
133
- let rangeStart = startDate;
134
- let rangeEnd = endDate;
135
- if (selectsRange && Array.isArray(selected)) {
136
- rangeStart = selected[0] ?? null;
137
- rangeEnd = selected[1] ?? null;
138
- }
139
- const formattedStartDate = rangeStart
140
- ? format(rangeStart, dateFormat, dateOptions)
141
- : '';
142
- const formattedEndDate = rangeEnd
143
- ? format(rangeEnd, dateFormat, dateOptions)
144
- : '';
145
- const formattedSelectedDate =
146
- selected && !selectsRange && !Array.isArray(selected)
147
- ? format(selected, dateFormat, dateOptions)
148
- : '';
149
- if (selectsRange) {
150
- return `${formattedStartDate}${
151
- formattedStartDate || formattedEndDate ? ' - ' : ''
152
- }${formattedEndDate}`;
153
- }
154
- return formattedSelectedDate;
155
- };
156
-
157
- const handleDatePickerChange = (
158
- date: Date | [Date, Date] | null,
159
- event?: React.SyntheticEvent<any, Event>
160
- ) => {
161
- if (datePickerProps.onChange) {
162
- datePickerProps.onChange(date, event);
163
- }
164
- if (!isControlled) {
165
- // If not controlled, update internal state
166
- if (Array.isArray(date)) {
167
- setInternalSelected(date[0] ?? null);
168
- } else {
169
- setInternalSelected(date);
170
- }
171
- }
172
- // Close popover when a date is selected (single) or when end date is selected (range)
173
- if (mergedDatePickerProps.selectsRange) {
174
- if (Array.isArray(date) && date[0] && date[1]) {
175
- handleClose();
176
- }
177
- } else if (date) {
178
- handleClose();
179
- }
180
- };
181
-
182
- return (
183
- <Popover open={isOpen}>
184
- <PopoverTrigger asChild>
185
- <TextInput
186
- id={mergedTextInputProps.id}
187
- name={mergedTextInputProps.name}
188
- label={mergedTextInputProps.label}
189
- value={getTextInputValue()}
190
- readOnly
191
- onClick={handleOpen}
192
- inputProps={{ className: 'text-align-left' }}
193
- type="text"
194
- onChange={() =>
195
- null
196
- } /* Empty function since we hijack the onChange event */
197
- {...mergedTextInputProps}
198
- />
199
- </PopoverTrigger>
200
- <PopoverPortal>
201
- <PopoverContent {...mergedPopoverProps}>
202
- <DatePicker
203
- {...mergedDatePickerProps}
204
- onChange={handleDatePickerChange}
205
- selected={selectedDate}
206
- selectsRange={mergedDatePickerProps.selectsRange}
207
- />
208
- </PopoverContent>
209
- </PopoverPortal>
210
- </Popover>
211
- );
212
- };
@@ -1,52 +0,0 @@
1
- import { Canvas, Meta, ArgTypes } from '@storybook/addon-docs/blocks';
2
- import { DatePicker } from './DatePicker';
3
- import * as Stories from './DatePicker.stories';
4
-
5
- <Meta of={Stories} />
6
-
7
- # DatePicker
8
-
9
- The Datepicker lets users select a date by showing them a calendar.
10
-
11
- It is also used in combination with an input and popover by the [DateInput component](/?path=/docs/components-dateinput-overview--basic-usage).
12
-
13
- ### It can be used for:
14
-
15
- - selecting a single date
16
- - selecting a start and end date
17
-
18
- ## Props
19
-
20
- <ArgTypes of={DatePicker} />
21
-
22
- ## Basic Example
23
-
24
- <Canvas of={Stories.BasicExample} />
25
-
26
- ## Date Range
27
-
28
- <Canvas of={Stories.DateRange} />
29
-
30
- ## Min/Max Dates
31
-
32
- <Canvas of={Stories.MinAndMaxDates} />
33
-
34
- ## Month Picker
35
-
36
- <Canvas of={Stories.MonthPicker} />
37
-
38
- ## Show Multiple Months
39
-
40
- <Canvas of={Stories.ShowMultipleMonths} />
41
-
42
- ## With Time Picker
43
-
44
- <Canvas of={Stories.WithTimePicker} />
45
-
46
- ## Open by default on a specific date
47
-
48
- <Canvas of={Stories.OpenByDefaultOnASpecificDate} />
49
-
50
- ## With Children
51
-
52
- <Canvas of={Stories.WithChildren} />