@automattic/date-range-picker 1.0.0

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 (64) hide show
  1. package/README.md +80 -0
  2. package/dist/cjs/button-stack.js +9 -0
  3. package/dist/cjs/button-stack.js.map +1 -0
  4. package/dist/cjs/date-inputs.js +37 -0
  5. package/dist/cjs/date-inputs.js.map +1 -0
  6. package/dist/cjs/date-range-content.js +194 -0
  7. package/dist/cjs/date-range-content.js.map +1 -0
  8. package/dist/cjs/date-range-picker.js +48 -0
  9. package/dist/cjs/date-range-picker.js.map +1 -0
  10. package/dist/cjs/datetime.js +56 -0
  11. package/dist/cjs/datetime.js.map +1 -0
  12. package/dist/cjs/index.js +16 -0
  13. package/dist/cjs/index.js.map +1 -0
  14. package/dist/cjs/presets-listbox.js +18 -0
  15. package/dist/cjs/presets-listbox.js.map +1 -0
  16. package/dist/cjs/utils.js +137 -0
  17. package/dist/cjs/utils.js.map +1 -0
  18. package/dist/esm/button-stack.js +6 -0
  19. package/dist/esm/button-stack.js.map +1 -0
  20. package/dist/esm/date-inputs.js +34 -0
  21. package/dist/esm/date-inputs.js.map +1 -0
  22. package/dist/esm/date-range-content.js +191 -0
  23. package/dist/esm/date-range-content.js.map +1 -0
  24. package/dist/esm/date-range-picker.js +45 -0
  25. package/dist/esm/date-range-picker.js.map +1 -0
  26. package/dist/esm/datetime.js +50 -0
  27. package/dist/esm/datetime.js.map +1 -0
  28. package/dist/esm/index.js +4 -0
  29. package/dist/esm/index.js.map +1 -0
  30. package/dist/esm/presets-listbox.js +15 -0
  31. package/dist/esm/presets-listbox.js.map +1 -0
  32. package/dist/esm/utils.js +130 -0
  33. package/dist/esm/utils.js.map +1 -0
  34. package/dist/tsconfig-cjs.tsbuildinfo +1 -0
  35. package/dist/tsconfig.tsbuildinfo +1 -0
  36. package/dist/types/button-stack.d.ts +8 -0
  37. package/dist/types/button-stack.d.ts.map +1 -0
  38. package/dist/types/date-inputs.d.ts +21 -0
  39. package/dist/types/date-inputs.d.ts.map +1 -0
  40. package/dist/types/date-range-content.d.ts +39 -0
  41. package/dist/types/date-range-content.d.ts.map +1 -0
  42. package/dist/types/date-range-picker.d.ts +25 -0
  43. package/dist/types/date-range-picker.d.ts.map +1 -0
  44. package/dist/types/datetime.d.ts +15 -0
  45. package/dist/types/datetime.d.ts.map +1 -0
  46. package/dist/types/index.d.ts +6 -0
  47. package/dist/types/index.d.ts.map +1 -0
  48. package/dist/types/presets-listbox.d.ts +12 -0
  49. package/dist/types/presets-listbox.d.ts.map +1 -0
  50. package/dist/types/utils.d.ts +40 -0
  51. package/dist/types/utils.d.ts.map +1 -0
  52. package/package.json +71 -0
  53. package/src/button-stack.tsx +17 -0
  54. package/src/date-inputs.tsx +142 -0
  55. package/src/date-range-content.tsx +379 -0
  56. package/src/date-range-picker.tsx +197 -0
  57. package/src/datetime.ts +58 -0
  58. package/src/index.ts +11 -0
  59. package/src/presets-listbox.tsx +65 -0
  60. package/src/style.scss +72 -0
  61. package/src/test/date-range-picker.test.tsx +334 -0
  62. package/src/test/utils.test.ts +58 -0
  63. package/src/types.d.ts +1 -0
  64. package/src/utils.ts +174 -0
@@ -0,0 +1,8 @@
1
+ import { __experimentalHStack as HStack } from '@wordpress/components';
2
+ import type { ComponentProps, ReactNode } from 'react';
3
+ type ButtonStackProps = {
4
+ children: ReactNode;
5
+ };
6
+ export declare function ButtonStack({ children, ...hStackProps }: ButtonStackProps & Omit<ComponentProps<typeof HStack>, 'spacing'>): import("react/jsx-runtime").JSX.Element;
7
+ export {};
8
+ //# sourceMappingURL=button-stack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"button-stack.d.ts","sourceRoot":"","sources":["../../src/button-stack.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,IAAI,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvD,KAAK,gBAAgB,GAAG;IACvB,QAAQ,EAAE,SAAS,CAAC;CACpB,CAAC;AAEF,wBAAgB,WAAW,CAAE,EAC5B,QAAQ,EACR,GAAG,WAAW,EACd,EAAE,gBAAgB,GAAG,IAAI,CAAE,cAAc,CAAE,OAAO,MAAM,CAAE,EAAE,SAAS,CAAE,2CAMvE"}
@@ -0,0 +1,21 @@
1
+ import type { FocusEvent } from 'react';
2
+ type DateInputsProps = {
3
+ fromStr: string;
4
+ toStr: string;
5
+ onFromChange: (v: string) => void;
6
+ onToChange: (v: string) => void;
7
+ todayStr: string;
8
+ minStr?: string;
9
+ fromStyle?: React.CSSProperties;
10
+ toStyle?: React.CSSProperties;
11
+ stack?: boolean;
12
+ justify?: 'flex-start' | 'flex-end' | 'center' | 'space-between' | 'space-around' | 'space-evenly';
13
+ containerStyle?: React.CSSProperties;
14
+ onFromFocus?: (e: FocusEvent<HTMLInputElement>) => void;
15
+ onToFocus?: (e: FocusEvent<HTMLInputElement>) => void;
16
+ onFromBlur?: (e: FocusEvent<HTMLInputElement>) => void;
17
+ onToBlur?: (e: FocusEvent<HTMLInputElement>) => void;
18
+ };
19
+ export declare function DateInputs({ fromStr, toStr, onFromChange, onToChange, todayStr, minStr, fromStyle, toStyle, stack, justify, containerStyle, onFromFocus, onToFocus, onFromBlur, onToBlur, }: DateInputsProps): import("react/jsx-runtime").JSX.Element;
20
+ export {};
21
+ //# sourceMappingURL=date-inputs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-inputs.d.ts","sourceRoot":"","sources":["../../src/date-inputs.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAExC,KAAK,eAAe,GAAG;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,CAAE,CAAC,EAAE,MAAM,KAAM,IAAI,CAAC;IACpC,UAAU,EAAE,CAAE,CAAC,EAAE,MAAM,KAAM,IAAI,CAAC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAChC,OAAO,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC9B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EACL,YAAY,GACZ,UAAU,GACV,QAAQ,GACR,eAAe,GACf,cAAc,GACd,cAAc,CAAC;IAClB,cAAc,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IACrC,WAAW,CAAC,EAAE,CAAE,CAAC,EAAE,UAAU,CAAE,gBAAgB,CAAE,KAAM,IAAI,CAAC;IAC5D,SAAS,CAAC,EAAE,CAAE,CAAC,EAAE,UAAU,CAAE,gBAAgB,CAAE,KAAM,IAAI,CAAC;IAC1D,UAAU,CAAC,EAAE,CAAE,CAAC,EAAE,UAAU,CAAE,gBAAgB,CAAE,KAAM,IAAI,CAAC;IAC3D,QAAQ,CAAC,EAAE,CAAE,CAAC,EAAE,UAAU,CAAE,gBAAgB,CAAE,KAAM,IAAI,CAAC;CACzD,CAAC;AAEF,wBAAgB,UAAU,CAAE,EAC3B,OAAO,EACP,KAAK,EACL,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,MAAM,EACN,SAAS,EACT,OAAO,EACP,KAAa,EACb,OAAsB,EACtB,cAAc,EACd,WAAW,EACX,SAAS,EACT,UAAU,EACV,QAAQ,GACR,EAAE,eAAe,2CA6FjB"}
@@ -0,0 +1,39 @@
1
+ import { PresetId } from './utils';
2
+ type DateRangeContentProps = {
3
+ isSmall: boolean;
4
+ showTwoMonths?: boolean;
5
+ fromDraft?: Date;
6
+ toDraft?: Date;
7
+ fromStr: string;
8
+ toStr: string;
9
+ setFromDraft: (date?: Date) => void;
10
+ setToDraft: (date?: Date) => void;
11
+ setFromStr: (string: string) => void;
12
+ setToStr: (string: string) => void;
13
+ timezoneString?: string;
14
+ gmtOffset?: number;
15
+ onChange: (next: {
16
+ start: Date;
17
+ end: Date;
18
+ }) => void;
19
+ onClose?: () => void;
20
+ compositeActiveId: string | null;
21
+ setCompositeActiveId: (id: string | null) => void;
22
+ today: Date;
23
+ todayStr: string;
24
+ mobileLabelId: string;
25
+ desktopLabelId: string;
26
+ disableFuture?: boolean;
27
+ disabledBefore?: Date;
28
+ defaultFallbackPreset?: PresetId;
29
+ hiddenPresets?: PresetId[];
30
+ inputsProps?: {
31
+ onStartFocus?: (e: React.FocusEvent<HTMLInputElement>) => void;
32
+ onEndFocus?: (e: React.FocusEvent<HTMLInputElement>) => void;
33
+ onStartBlur?: (e: React.FocusEvent<HTMLInputElement>) => void;
34
+ onEndBlur?: (e: React.FocusEvent<HTMLInputElement>) => void;
35
+ };
36
+ };
37
+ export declare function DateRangeContent(props: DateRangeContentProps): import("react/jsx-runtime").JSX.Element;
38
+ export {};
39
+ //# sourceMappingURL=date-range-content.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-range-content.d.ts","sourceRoot":"","sources":["../../src/date-range-content.tsx"],"names":[],"mappings":"AAcA,OAAO,EAAyC,QAAQ,EAAc,MAAM,SAAS,CAAC;AAEtF,KAAK,qBAAqB,GAAG;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,CAAE,IAAI,CAAC,EAAE,IAAI,KAAM,IAAI,CAAC;IACtC,UAAU,EAAE,CAAE,IAAI,CAAC,EAAE,IAAI,KAAM,IAAI,CAAC;IACpC,UAAU,EAAE,CAAE,MAAM,EAAE,MAAM,KAAM,IAAI,CAAC;IACvC,QAAQ,EAAE,CAAE,MAAM,EAAE,MAAM,KAAM,IAAI,CAAC;IACrC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,CAAE,IAAI,EAAE;QAAE,KAAK,EAAE,IAAI,CAAC;QAAC,GAAG,EAAE,IAAI,CAAA;KAAE,KAAM,IAAI,CAAC;IACvD,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,oBAAoB,EAAE,CAAE,EAAE,EAAE,MAAM,GAAG,IAAI,KAAM,IAAI,CAAC;IACpD,KAAK,EAAE,IAAI,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,cAAc,CAAC,EAAE,IAAI,CAAC;IACtB,qBAAqB,CAAC,EAAE,QAAQ,CAAC;IACjC,aAAa,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC3B,WAAW,CAAC,EAAE;QACb,YAAY,CAAC,EAAE,CAAE,CAAC,EAAE,KAAK,CAAC,UAAU,CAAE,gBAAgB,CAAE,KAAM,IAAI,CAAC;QACnE,UAAU,CAAC,EAAE,CAAE,CAAC,EAAE,KAAK,CAAC,UAAU,CAAE,gBAAgB,CAAE,KAAM,IAAI,CAAC;QACjE,WAAW,CAAC,EAAE,CAAE,CAAC,EAAE,KAAK,CAAC,UAAU,CAAE,gBAAgB,CAAE,KAAM,IAAI,CAAC;QAClE,SAAS,CAAC,EAAE,CAAE,CAAC,EAAE,KAAK,CAAC,UAAU,CAAE,gBAAgB,CAAE,KAAM,IAAI,CAAC;KAChE,CAAC;CACF,CAAC;AAEF,wBAAgB,gBAAgB,CAAE,KAAK,EAAE,qBAAqB,2CAyU7D"}
@@ -0,0 +1,25 @@
1
+ import type { PresetId } from './utils';
2
+ import './style.scss';
3
+ export type DateRangePickerProps = {
4
+ start: Date;
5
+ end: Date;
6
+ onChange: (next: {
7
+ start: Date;
8
+ end: Date;
9
+ }) => void;
10
+ timezoneString?: string;
11
+ gmtOffset?: number;
12
+ locale: string;
13
+ disableFuture?: boolean;
14
+ disabledBefore?: Date;
15
+ defaultFallbackPreset?: PresetId;
16
+ hiddenPresets?: PresetId[];
17
+ inputsProps?: {
18
+ onStartFocus?: (e: React.FocusEvent<HTMLInputElement>) => void;
19
+ onEndFocus?: (e: React.FocusEvent<HTMLInputElement>) => void;
20
+ onStartBlur?: (e: React.FocusEvent<HTMLInputElement>) => void;
21
+ onEndBlur?: (e: React.FocusEvent<HTMLInputElement>) => void;
22
+ };
23
+ };
24
+ export declare function DateRangePicker({ start, end, onChange, gmtOffset, timezoneString, locale, disableFuture, disabledBefore, defaultFallbackPreset, hiddenPresets, inputsProps, }: DateRangePickerProps): import("react/jsx-runtime").JSX.Element;
25
+ //# sourceMappingURL=date-range-picker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-range-picker.d.ts","sourceRoot":"","sources":["../../src/date-range-picker.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,cAAc,CAAC;AAEtB,MAAM,MAAM,oBAAoB,GAAG;IAClC,KAAK,EAAE,IAAI,CAAC;IACZ,GAAG,EAAE,IAAI,CAAC;IACV,QAAQ,EAAE,CAAE,IAAI,EAAE;QAAE,KAAK,EAAE,IAAI,CAAC;QAAC,GAAG,EAAE,IAAI,CAAA;KAAE,KAAM,IAAI,CAAC;IACvD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,cAAc,CAAC,EAAE,IAAI,CAAC;IACtB,qBAAqB,CAAC,EAAE,QAAQ,CAAC;IACjC,aAAa,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC3B,WAAW,CAAC,EAAE;QACb,YAAY,CAAC,EAAE,CAAE,CAAC,EAAE,KAAK,CAAC,UAAU,CAAE,gBAAgB,CAAE,KAAM,IAAI,CAAC;QACnE,UAAU,CAAC,EAAE,CAAE,CAAC,EAAE,KAAK,CAAC,UAAU,CAAE,gBAAgB,CAAE,KAAM,IAAI,CAAC;QACjE,WAAW,CAAC,EAAE,CAAE,CAAC,EAAE,KAAK,CAAC,UAAU,CAAE,gBAAgB,CAAE,KAAM,IAAI,CAAC;QAClE,SAAS,CAAC,EAAE,CAAE,CAAC,EAAE,KAAK,CAAC,UAAU,CAAE,gBAAgB,CAAE,KAAM,IAAI,CAAC;KAChE,CAAC;CACF,CAAC;AAEF,wBAAgB,eAAe,CAAE,EAChC,KAAK,EACL,GAAG,EACH,QAAQ,EACR,SAAS,EACT,cAAc,EACd,MAAM,EACN,aAAoB,EACpB,cAAc,EACd,qBAAqC,EACrC,aAAa,EACb,WAAW,GACX,EAAE,oBAAoB,2CAoEtB"}
@@ -0,0 +1,15 @@
1
+ export declare function formatDate(date: Date, locale: string, formatOptions?: Intl.DateTimeFormatOptions): string;
2
+ /**
3
+ * Parse a date string in the format "YYYY-MM-DD" (local time).
4
+ */
5
+ export declare function parseYmdLocal(value: string): Date | null;
6
+ /**
7
+ * Format a date as a site calendar day (YYYY-MM-DD).
8
+ */
9
+ export declare function formatYmd(date: Date, timezoneString?: string, gmtOffset?: number): string;
10
+ /**
11
+ * Format a Date that already represents a site calendar day.
12
+ * This avoids reapplying timezone math to dates coming from the picker or URL.
13
+ */
14
+ export declare function formatSiteYmd(date: Date): string;
15
+ //# sourceMappingURL=datetime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datetime.d.ts","sourceRoot":"","sources":["../../src/datetime.ts"],"names":[],"mappings":"AAKA,wBAAgB,UAAU,CACzB,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,EACd,aAAa,GAAE,IAAI,CAAC,qBAA+C,UAMnE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAE,KAAK,EAAE,MAAM,GAAI,IAAI,GAAG,IAAI,CAU1D;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,UAYjF;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAE,IAAI,EAAE,IAAI,UAKxC"}
@@ -0,0 +1,6 @@
1
+ export { DateRangePicker } from './date-range-picker';
2
+ export type { DateRangePickerProps } from './date-range-picker';
3
+ export { computePresetRange, formatLabel, getActivePresetId, isLast7Days, presetDefs, } from './utils';
4
+ export type { PresetId } from './utils';
5
+ export { formatYmd, formatSiteYmd, parseYmdLocal } from './datetime';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,YAAY,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EACN,kBAAkB,EAClB,WAAW,EACX,iBAAiB,EACjB,WAAW,EACX,UAAU,GACV,MAAM,SAAS,CAAC;AACjB,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { PresetId } from './utils';
2
+ type PresetsListboxProps = {
3
+ labelId: string;
4
+ activePresetId?: PresetId;
5
+ onSelect: (id: PresetId) => void;
6
+ compositeActiveId: string | null;
7
+ setCompositeActiveId: (id: string | null) => void;
8
+ hiddenPresets?: PresetId[];
9
+ };
10
+ export declare function PresetsListbox({ labelId, activePresetId, onSelect, compositeActiveId, setCompositeActiveId, hiddenPresets, }: PresetsListboxProps): import("react/jsx-runtime").JSX.Element;
11
+ export {};
12
+ //# sourceMappingURL=presets-listbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presets-listbox.d.ts","sourceRoot":"","sources":["../../src/presets-listbox.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,KAAK,mBAAmB,GAAG;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,QAAQ,CAAC;IAC1B,QAAQ,EAAE,CAAE,EAAE,EAAE,QAAQ,KAAM,IAAI,CAAC;IACnC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,oBAAoB,EAAE,CAAE,EAAE,EAAE,MAAM,GAAG,IAAI,KAAM,IAAI,CAAC;IACpD,aAAa,CAAC,EAAE,QAAQ,EAAE,CAAC;CAC3B,CAAC;AAEF,wBAAgB,cAAc,CAAE,EAC/B,OAAO,EACP,cAAc,EACd,QAAQ,EACR,iBAAiB,EACjB,oBAAoB,EACpB,aAAa,GACb,EAAE,mBAAmB,2CAsCrB"}
@@ -0,0 +1,40 @@
1
+ export type PresetId = 'today' | 'yesterday' | 'last-7-days' | 'last-30-days' | 'last-90-days' | 'month-to-date' | 'last-12-months' | 'year-to-date' | 'last-3-years' | 'custom';
2
+ export declare const presetDefs: readonly [{
3
+ readonly id: "today";
4
+ readonly label: string;
5
+ }, {
6
+ readonly id: "yesterday";
7
+ readonly label: string;
8
+ }, {
9
+ readonly id: "last-7-days";
10
+ readonly label: string;
11
+ }, {
12
+ readonly id: "last-30-days";
13
+ readonly label: string;
14
+ }, {
15
+ readonly id: "last-90-days";
16
+ readonly label: string;
17
+ }, {
18
+ readonly id: "month-to-date";
19
+ readonly label: string;
20
+ }, {
21
+ readonly id: "last-12-months";
22
+ readonly label: string;
23
+ }, {
24
+ readonly id: "year-to-date";
25
+ readonly label: string;
26
+ }, {
27
+ readonly id: "last-3-years";
28
+ readonly label: string;
29
+ }];
30
+ export declare function computePresetRange(preset: PresetId, baseDate: Date): {
31
+ from: Date;
32
+ to: Date;
33
+ } | undefined;
34
+ export declare function getActivePresetId(from?: Date, to?: Date, baseDate?: Date): PresetId | undefined;
35
+ export declare function formatLabel(start: Date, end: Date, locale: string): string;
36
+ export declare function isLast7Days(range: {
37
+ start: Date;
38
+ end: Date;
39
+ }, timezoneString?: string, gmtOffset?: number): boolean;
40
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAkCA,MAAM,MAAM,QAAQ,GACjB,OAAO,GACP,WAAW,GACX,aAAa,GACb,cAAc,GACd,cAAc,GACd,eAAe,GACf,gBAAgB,GAChB,cAAc,GACd,cAAc,GACd,QAAQ,CAAC;AAEZ,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUmE,CAAC;AAE3F,wBAAgB,kBAAkB,CAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI;;;cA0BnE;AAED,wBAAgB,iBAAiB,CAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,IAAI,GAAI,QAAQ,GAAG,SAAS,CAiEjG;AAGD,wBAAgB,WAAW,CAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,UAOlE;AAGD,wBAAgB,WAAW,CAC1B,KAAK,EAAE;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,IAAI,CAAA;CAAE,EACjC,cAAc,CAAC,EAAE,MAAM,EACvB,SAAS,CAAC,EAAE,MAAM,GAChB,OAAO,CAKT"}
package/package.json ADDED
@@ -0,0 +1,71 @@
1
+ {
2
+ "name": "@automattic/date-range-picker",
3
+ "version": "1.0.0",
4
+ "description": "A date-range picker built on top of @automattic/ui's DateRangeCalendar, with timezone-aware site-day handling, preset shortcuts, and accessible inputs.",
5
+ "homepage": "https://github.com/Automattic/wp-calypso",
6
+ "license": "GPL-2.0-or-later",
7
+ "author": "Automattic Inc.",
8
+ "main": "dist/cjs/index.js",
9
+ "module": "dist/esm/index.js",
10
+ "calypso:src": "src/index.ts",
11
+ "exports": {
12
+ ".": {
13
+ "calypso:src": "./src/index.ts",
14
+ "types": "./dist/types/index.d.ts",
15
+ "import": "./dist/esm/index.js",
16
+ "require": "./dist/cjs/index.js"
17
+ },
18
+ "./src/*": {
19
+ "calypso:src": "./src/*"
20
+ }
21
+ },
22
+ "sideEffects": [
23
+ "*.css",
24
+ "*.scss"
25
+ ],
26
+ "repository": {
27
+ "type": "git",
28
+ "url": "git+https://github.com/Automattic/wp-calypso.git",
29
+ "directory": "packages/date-range-picker"
30
+ },
31
+ "publishConfig": {
32
+ "access": "public"
33
+ },
34
+ "bugs": "https://github.com/Automattic/wp-calypso/issues",
35
+ "files": [
36
+ "dist",
37
+ "src"
38
+ ],
39
+ "types": "dist/types",
40
+ "scripts": {
41
+ "clean": "tsc --build ./tsconfig.json ./tsconfig-cjs.json --clean && rm -rf dist",
42
+ "build": "tsc --build ./tsconfig.json ./tsconfig-cjs.json",
43
+ "prepack": "yarn run clean && yarn run build"
44
+ },
45
+ "dependencies": {
46
+ "@automattic/ui": "^1.0.2",
47
+ "@wordpress/base-styles": "^5.23.0",
48
+ "@wordpress/components": "^32.1.0",
49
+ "@wordpress/compose": "7.23.0",
50
+ "@wordpress/date": "5.23.0",
51
+ "@wordpress/i18n": "^5.23.0",
52
+ "@wordpress/icons": "^10.23.0",
53
+ "date-fns": "^4.1.0",
54
+ "tslib": "^2.8.1"
55
+ },
56
+ "peerDependencies": {
57
+ "react": "^18.3.1",
58
+ "react-dom": "^18.3.1"
59
+ },
60
+ "devDependencies": {
61
+ "@automattic/calypso-typescript-config": "^1.0.0",
62
+ "@testing-library/dom": "^10.4.1",
63
+ "@testing-library/jest-dom": "^6.9.1",
64
+ "@testing-library/react": "^16.3.0",
65
+ "@testing-library/user-event": "^14.6.1",
66
+ "@types/react": "^18.3.18",
67
+ "jest": "^29.7.0",
68
+ "mockdate": "^2.0.5",
69
+ "typescript": "^5.8.3"
70
+ }
71
+ }
@@ -0,0 +1,17 @@
1
+ import { __experimentalHStack as HStack } from '@wordpress/components';
2
+ import type { ComponentProps, ReactNode } from 'react';
3
+
4
+ type ButtonStackProps = {
5
+ children: ReactNode;
6
+ };
7
+
8
+ export function ButtonStack( {
9
+ children,
10
+ ...hStackProps
11
+ }: ButtonStackProps & Omit< ComponentProps< typeof HStack >, 'spacing' > ) {
12
+ return (
13
+ <HStack { ...hStackProps } spacing={ 3 }>
14
+ { children }
15
+ </HStack>
16
+ );
17
+ }
@@ -0,0 +1,142 @@
1
+ import {
2
+ __experimentalHStack as HStack,
3
+ __experimentalVStack as VStack,
4
+ __experimentalInputControl as InputControl,
5
+ } from '@wordpress/components';
6
+ import { __ } from '@wordpress/i18n';
7
+ import type { FocusEvent } from 'react';
8
+
9
+ type DateInputsProps = {
10
+ fromStr: string;
11
+ toStr: string;
12
+ onFromChange: ( v: string ) => void;
13
+ onToChange: ( v: string ) => void;
14
+ todayStr: string;
15
+ minStr?: string;
16
+ fromStyle?: React.CSSProperties;
17
+ toStyle?: React.CSSProperties;
18
+ stack?: boolean;
19
+ justify?:
20
+ | 'flex-start'
21
+ | 'flex-end'
22
+ | 'center'
23
+ | 'space-between'
24
+ | 'space-around'
25
+ | 'space-evenly';
26
+ containerStyle?: React.CSSProperties;
27
+ onFromFocus?: ( e: FocusEvent< HTMLInputElement > ) => void;
28
+ onToFocus?: ( e: FocusEvent< HTMLInputElement > ) => void;
29
+ onFromBlur?: ( e: FocusEvent< HTMLInputElement > ) => void;
30
+ onToBlur?: ( e: FocusEvent< HTMLInputElement > ) => void;
31
+ };
32
+
33
+ export function DateInputs( {
34
+ fromStr,
35
+ toStr,
36
+ onFromChange,
37
+ onToChange,
38
+ todayStr,
39
+ minStr,
40
+ fromStyle,
41
+ toStyle,
42
+ stack = false,
43
+ justify = 'flex-start',
44
+ containerStyle,
45
+ onFromFocus,
46
+ onToFocus,
47
+ onFromBlur,
48
+ onToBlur,
49
+ }: DateInputsProps ) {
50
+ if ( stack ) {
51
+ return (
52
+ <VStack as="div" spacing={ 2 } className="daterange-inputs" style={ containerStyle }>
53
+ <InputControl
54
+ type="date"
55
+ label={ __( 'Start date' ) }
56
+ value={ fromStr }
57
+ onFocus={ ( e: FocusEvent< HTMLInputElement > ) => {
58
+ onFromFocus?.( e );
59
+ } }
60
+ onBlur={ ( e: FocusEvent< HTMLInputElement > ) => {
61
+ onFromBlur?.( e );
62
+ } }
63
+ onChange={ ( value?: string ) => {
64
+ onFromChange( value ?? '' );
65
+ } }
66
+ autoComplete="off"
67
+ min={ minStr }
68
+ max={ toStr || todayStr }
69
+ style={ { width: '100%', ...( fromStyle || {} ) } }
70
+ __next40pxDefaultSize
71
+ />
72
+ <InputControl
73
+ type="date"
74
+ label={ __( 'End date' ) }
75
+ value={ toStr }
76
+ onFocus={ ( e: FocusEvent< HTMLInputElement > ) => {
77
+ onToFocus?.( e );
78
+ } }
79
+ onBlur={ ( e: FocusEvent< HTMLInputElement > ) => {
80
+ onToBlur?.( e );
81
+ } }
82
+ onChange={ ( value?: string ) => {
83
+ onToChange( value ?? '' );
84
+ } }
85
+ autoComplete="off"
86
+ min={ fromStr || minStr }
87
+ style={ { width: '100%', ...( toStyle || {} ) } }
88
+ __next40pxDefaultSize
89
+ />
90
+ </VStack>
91
+ );
92
+ }
93
+
94
+ return (
95
+ <HStack
96
+ as="div"
97
+ spacing={ 8 }
98
+ justify={ justify }
99
+ className="daterange-inputs"
100
+ wrap={ false }
101
+ style={ containerStyle }
102
+ >
103
+ <InputControl
104
+ type="date"
105
+ label={ __( 'Start date' ) }
106
+ value={ fromStr }
107
+ onFocus={ ( e: FocusEvent< HTMLInputElement > ) => {
108
+ onFromFocus?.( e );
109
+ } }
110
+ onBlur={ ( e: FocusEvent< HTMLInputElement > ) => {
111
+ onFromBlur?.( e );
112
+ } }
113
+ onChange={ ( value?: string ) => {
114
+ onFromChange( value ?? '' );
115
+ } }
116
+ autoComplete="off"
117
+ min={ minStr }
118
+ max={ toStr || todayStr }
119
+ style={ fromStyle }
120
+ __next40pxDefaultSize
121
+ />
122
+ <InputControl
123
+ type="date"
124
+ label={ __( 'End date' ) }
125
+ value={ toStr }
126
+ onFocus={ ( e: FocusEvent< HTMLInputElement > ) => {
127
+ onToFocus?.( e );
128
+ } }
129
+ onBlur={ ( e: FocusEvent< HTMLInputElement > ) => {
130
+ onToBlur?.( e );
131
+ } }
132
+ onChange={ ( value?: string ) => {
133
+ onToChange( value ?? '' );
134
+ } }
135
+ autoComplete="off"
136
+ min={ fromStr || minStr }
137
+ style={ toStyle }
138
+ __next40pxDefaultSize
139
+ />
140
+ </HStack>
141
+ );
142
+ }