@purpurds/date-picker 0.0.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.
@@ -0,0 +1,7 @@
1
+ module.exports = {
2
+ "moduleName": "date-picker",
3
+ "exports": [
4
+ "DatePickerProps",
5
+ "DatePicker"
6
+ ]
7
+ };
@@ -0,0 +1 @@
1
+ ._purpur-text-field_3gl1k_1{position:relative;display:flex;flex-direction:column;gap:var(--purpur-spacing-50)}._purpur-text-field__label_3gl1k_7{display:flex;gap:var(--purpur-spacing-25);width:fit-content}._purpur-text-field__label-text_3gl1k_12{width:fit-content}._purpur-text-field__field-row_3gl1k_15{display:flex;width:100%}._purpur-text-field__frame_3gl1k_19{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:var(--purpur-border-radius-sm);border:var(--purpur-border-width-xs) solid var(--purpur-color-border-interactive-subtle);pointer-events:none}._purpur-text-field__input-container_3gl1k_26{position:relative;display:flex;align-items:center;width:100%;border-radius:var(--purpur-border-radius-sm);background:var(--purpur-color-background-primary)}._purpur-text-field__input-container_3gl1k_26:has(:-internal-autofill-previewed),._purpur-text-field__input-container_3gl1k_26:has(:-internal-autofill-selected){background-color:var(--purpur-color-background-interactive-auto-fill)!important}._purpur-text-field__input-container--disabled_3gl1k_37{background:var(--purpur-color-background-interactive-disabled)}._purpur-text-field__input-container--readonly_3gl1k_40{background:var(--purpur-color-background-interactive-read-only)}._purpur-text-field__input-container--has-clear-button_3gl1k_43{padding-right:var(--purpur-spacing-25)}._purpur-text-field__input-container--end-adornment_3gl1k_46{padding-right:var(--purpur-spacing-150)}._purpur-text-field__input-container--end-adornment_3gl1k_46 ._purpur-text-field__input_3gl1k_26{padding-right:var(--purpur-spacing-100)}._purpur-text-field__input-container--start-adornment_3gl1k_52{padding-left:var(--purpur-spacing-150)}._purpur-text-field__input-container--start-adornment_3gl1k_52 ._purpur-text-field__input_3gl1k_26{padding-left:var(--purpur-spacing-100)}._purpur-text-field__input_3gl1k_26{border-radius:var(--purpur-border-radius-sm);padding:calc(var(--purpur-spacing-100) + var(--purpur-spacing-25)) var(--purpur-spacing-150);border:none;width:100%;box-sizing:border-box;font-family:var(--purpur-typography-family-default);font-size:var(--purpur-typography-scale-100);line-height:150%;outline:none;background:transparent;color:var(--purpur-color-text-default)}._purpur-text-field__input_3gl1k_26:hover~._purpur-text-field__frame_3gl1k_19{border-width:var(--purpur-border-width-sm);border-color:var(--purpur-color-border-interactive-subtle-hover)}._purpur-text-field__input_3gl1k_26:active:not(:disabled):not(:read-only)~._purpur-text-field__frame_3gl1k_19,._purpur-text-field__input_3gl1k_26:focus:not(:disabled):not(:read-only)~._purpur-text-field__frame_3gl1k_19{outline:var(--purpur-border-width-sm) solid var(--purpur-color-border-interactive-focus);outline-offset:calc(var(--purpur-spacing-10) * 2);border-width:var(--purpur-border-width-xs);border-color:var(--purpur-color-border-interactive-subtle-hover)}._purpur-text-field__input_3gl1k_26:disabled{color:var(--purpur-color-text-weak)}._purpur-text-field__input_3gl1k_26:disabled~._purpur-text-field__frame_3gl1k_19{border-width:var(--purpur-border-width-xs);border-color:var(--purpur-color-border-medium)}._purpur-text-field__input_3gl1k_26:read-only:not(:disabled){color:var(--purpur-color-text-default)}._purpur-text-field__input_3gl1k_26:read-only:not(:disabled)~._purpur-text-field__frame_3gl1k_19{border-width:var(--purpur-border-width-xs)}._purpur-text-field__input_3gl1k_26:read-only:not(:disabled):not(._purpur-text-field__input--valid_3gl1k_94):not(._purpur-text-field__input--error_3gl1k_94)~._purpur-text-field__frame_3gl1k_19{border-color:var(--purpur-color-border-medium)}._purpur-text-field__input_3gl1k_26:-internal-autofill-previewed,._purpur-text-field__input_3gl1k_26:-internal-autofill-selected{box-shadow:inset 0 0 0 1px transparent,inset 0 0 0 100px var(--purpur-color-background-interactive-auto-fill)}._purpur-text-field__input_3gl1k_26._purpur-text-field__input--valid_3gl1k_94~._purpur-text-field__frame_3gl1k_19{border-color:var(--purpur-color-border-status-success)}._purpur-text-field__input_3gl1k_26._purpur-text-field__input--error_3gl1k_94:not(:hover)~._purpur-text-field__frame_3gl1k_19{border-color:var(--purpur-color-border-status-error)}._purpur-text-field__adornment-container_3gl1k_106{display:flex;align-items:center;gap:var(--purpur-spacing-50)}._purpur-text-field__valid-icon_3gl1k_111{color:var(--purpur-color-text-status-success-medium)}._purpur-date-field__container_ci2f4_1{position:relative}._purpur-date-field__overlay_ci2f4_5{pointer-events:none;box-sizing:border-box;font-family:var(--purpur-typography-family-default);font-size:var(--purpur-typography-scale-100);font-weight:var(--purpur-typography-scale-400);color:var(--purpur-color-text-default);line-height:var(--purpur-typography-line-height-loose);white-space:pre}._purpur-date-field__start-adornment_ci2f4_16{color:var(--purpur-color-text-weak)}.rdp-root{--rdp-accent-color: blue;--rdp-accent-background-color: #f0f0ff;--rdp-day-height: 44px;--rdp-day-width: 44px;--rdp-day_button-border-radius: 100%;--rdp-day_button-border: 2px solid transparent;--rdp-day_button-height: 42px;--rdp-day_button-width: 42px;--rdp-selected-border: 2px solid var(--rdp-accent-color);--rdp-disabled-opacity: .5;--rdp-outside-opacity: .75;--rdp-today-color: var(--rdp-accent-color);--rdp-dropdown-gap: .5rem;--rdp-months-gap: 2rem;--rdp-nav_button-disabled-opacity: .5;--rdp-nav_button-height: 2.25rem;--rdp-nav_button-width: 2.25rem;--rdp-nav-height: 2.75rem;--rdp-range_middle-background-color: var(--rdp-accent-background-color);--rdp-range_middle-color: inherit;--rdp-range_start-color: white;--rdp-range_start-background: linear-gradient(var(--rdp-gradient-direction), transparent 50%, var(--rdp-range_middle-background-color) 50%);--rdp-range_start-date-background-color: var(--rdp-accent-color);--rdp-range_end-background: linear-gradient(var(--rdp-gradient-direction), var(--rdp-range_middle-background-color) 50%, transparent 50%);--rdp-range_end-color: white;--rdp-range_end-date-background-color: var(--rdp-accent-color);--rdp-week_number-border-radius: 100%;--rdp-week_number-border: 2px solid transparent;--rdp-week_number-height: var(--rdp-day-height);--rdp-week_number-opacity: .75;--rdp-week_number-width: var(--rdp-day-width);--rdp-weeknumber-text-align: center;--rdp-weekday-opacity: .75;--rdp-weekday-padding: .5rem 0rem;--rdp-weekday-text-align: center;--rdp-gradient-direction: 90deg;--rdp-animation_duration: .3s;--rdp-animation_timing: cubic-bezier(.4, 0, .2, 1)}.rdp-root[dir=rtl]{--rdp-gradient-direction: -90deg}.rdp-root[data-broadcast-calendar=true]{--rdp-outside-opacity: unset}.rdp-root{position:relative;box-sizing:border-box}.rdp-root *{box-sizing:border-box}.rdp-day{width:var(--rdp-day-width);height:var(--rdp-day-height);text-align:center}.rdp-day_button{background:none;padding:0;margin:0;cursor:pointer;font:inherit;color:inherit;justify-content:center;align-items:center;display:flex;width:var(--rdp-day_button-width);height:var(--rdp-day_button-height);border:var(--rdp-day_button-border);border-radius:var(--rdp-day_button-border-radius)}.rdp-day_button:disabled{cursor:revert}.rdp-caption_label{z-index:1;position:relative;display:inline-flex;align-items:center;white-space:nowrap;border:0}.rdp-dropdown:focus-visible~.rdp-caption_label{outline:5px auto Highlight;outline:5px auto -webkit-focus-ring-color}.rdp-button_next,.rdp-button_previous{border:none;background:none;padding:0;margin:0;cursor:pointer;font:inherit;color:inherit;-moz-appearance:none;-webkit-appearance:none;display:inline-flex;align-items:center;justify-content:center;position:relative;appearance:none;width:var(--rdp-nav_button-width);height:var(--rdp-nav_button-height)}.rdp-button_next:disabled,.rdp-button_next[aria-disabled=true],.rdp-button_previous:disabled,.rdp-button_previous[aria-disabled=true]{cursor:revert;opacity:var(--rdp-nav_button-disabled-opacity)}.rdp-chevron{display:inline-block;fill:var(--rdp-accent-color)}.rdp-root[dir=rtl] .rdp-nav .rdp-chevron{transform:rotate(180deg);transform-origin:50%}.rdp-dropdowns{position:relative;display:inline-flex;align-items:center;gap:var(--rdp-dropdown-gap)}.rdp-dropdown{z-index:2;opacity:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;position:absolute;inset-block-start:0;inset-block-end:0;inset-inline-start:0;width:100%;margin:0;padding:0;cursor:inherit;border:none;line-height:inherit}.rdp-dropdown_root{position:relative;display:inline-flex;align-items:center}.rdp-dropdown_root[data-disabled=true] .rdp-chevron{opacity:var(--rdp-disabled-opacity)}.rdp-month_caption{display:flex;align-content:center;height:var(--rdp-nav-height);font-weight:700;font-size:large}.rdp-root[data-nav-layout=around] .rdp-month,.rdp-root[data-nav-layout=after] .rdp-month{position:relative}.rdp-root[data-nav-layout=around] .rdp-month_caption{justify-content:center;margin-inline-start:var(--rdp-nav_button-width);margin-inline-end:var(--rdp-nav_button-width);position:relative}.rdp-root[data-nav-layout=around] .rdp-button_previous{position:absolute;inset-inline-start:0;top:0;height:var(--rdp-nav-height);display:inline-flex}.rdp-root[data-nav-layout=around] .rdp-button_next{position:absolute;inset-inline-end:0;top:0;height:var(--rdp-nav-height);display:inline-flex;justify-content:center}.rdp-months{position:relative;display:flex;flex-wrap:wrap;gap:var(--rdp-months-gap);max-width:fit-content}.rdp-month_grid{border-collapse:collapse}.rdp-nav{position:absolute;inset-block-start:0;inset-inline-end:0;display:flex;align-items:center;height:var(--rdp-nav-height)}.rdp-weekday{opacity:var(--rdp-weekday-opacity);padding:var(--rdp-weekday-padding);font-weight:500;font-size:smaller;text-align:var(--rdp-weekday-text-align);text-transform:var(--rdp-weekday-text-transform)}.rdp-week_number{opacity:var(--rdp-week_number-opacity);font-weight:400;font-size:small;height:var(--rdp-week_number-height);width:var(--rdp-week_number-width);border:var(--rdp-week_number-border);border-radius:var(--rdp-week_number-border-radius);text-align:var(--rdp-weeknumber-text-align)}.rdp-today:not(.rdp-outside){color:var(--rdp-today-color)}.rdp-selected{font-weight:700;font-size:large}.rdp-selected .rdp-day_button{border:var(--rdp-selected-border)}.rdp-outside{opacity:var(--rdp-outside-opacity)}.rdp-disabled{opacity:var(--rdp-disabled-opacity)}.rdp-hidden{visibility:hidden;color:var(--rdp-range_start-color)}.rdp-range_start{background:var(--rdp-range_start-background)}.rdp-range_start .rdp-day_button{background-color:var(--rdp-range_start-date-background-color);color:var(--rdp-range_start-color)}.rdp-range_middle{background-color:var(--rdp-range_middle-background-color)}.rdp-range_middle .rdp-day_button{border-color:transparent;border:unset;border-radius:unset;color:var(--rdp-range_middle-color)}.rdp-range_end{background:var(--rdp-range_end-background);color:var(--rdp-range_end-color)}.rdp-range_end .rdp-day_button{color:var(--rdp-range_start-color);background-color:var(--rdp-range_end-date-background-color)}.rdp-range_start.rdp-range_end{background:revert}.rdp-focusable{cursor:pointer}@keyframes rdp-slide_in_left{0%{transform:translate(-100%)}to{transform:translate(0)}}@keyframes rdp-slide_in_right{0%{transform:translate(100%)}to{transform:translate(0)}}@keyframes rdp-slide_out_left{0%{transform:translate(0)}to{transform:translate(-100%)}}@keyframes rdp-slide_out_right{0%{transform:translate(0)}to{transform:translate(100%)}}.rdp-weeks_before_enter{animation:rdp-slide_in_left var(--rdp-animation_duration) var(--rdp-animation_timing) forwards}.rdp-weeks_before_exit{animation:rdp-slide_out_left var(--rdp-animation_duration) var(--rdp-animation_timing) forwards}.rdp-weeks_after_enter{animation:rdp-slide_in_right var(--rdp-animation_duration) var(--rdp-animation_timing) forwards}.rdp-weeks_after_exit{animation:rdp-slide_out_right var(--rdp-animation_duration) var(--rdp-animation_timing) forwards}.rdp-root[dir=rtl] .rdp-weeks_after_enter{animation:rdp-slide_in_left var(--rdp-animation_duration) var(--rdp-animation_timing) forwards}.rdp-root[dir=rtl] .rdp-weeks_before_exit{animation:rdp-slide_out_right var(--rdp-animation_duration) var(--rdp-animation_timing) forwards}.rdp-root[dir=rtl] .rdp-weeks_before_enter{animation:rdp-slide_in_right var(--rdp-animation_duration) var(--rdp-animation_timing) forwards}.rdp-root[dir=rtl] .rdp-weeks_after_exit{animation:rdp-slide_out_left var(--rdp-animation_duration) var(--rdp-animation_timing) forwards}@keyframes rdp-fade_in{0%{opacity:0}to{opacity:1}}@keyframes rdp-fade_out{0%{opacity:1}to{opacity:0}}.rdp-caption_after_enter{animation:rdp-fade_in var(--rdp-animation_duration) var(--rdp-animation_timing) forwards}.rdp-caption_after_exit{animation:rdp-fade_out var(--rdp-animation_duration) var(--rdp-animation_timing) forwards}.rdp-caption_before_enter{animation:rdp-fade_in var(--rdp-animation_duration) var(--rdp-animation_timing) forwards}.rdp-caption_before_exit{animation:rdp-fade_out var(--rdp-animation_duration) var(--rdp-animation_timing) forwards}._purpur-button_w455q_1{align-items:center;border-radius:var(--purpur-border-radius-full);border-width:0;cursor:pointer;display:inline-flex;font-size:var(--purpur-typography-scale-100);font-family:var(--purpur-typography-family-default);font-weight:var(--purpur-typography-weight-medium);gap:var(--purpur-spacing-100);justify-content:center;line-height:var(--purpur-spacing-300);outline:0;position:relative;text-decoration:none;transition:all var(--purpur-motion-duration-100) ease;width:auto}._purpur-button_w455q_1:focus:before{border-radius:var(--purpur-border-radius-full);box-shadow:0 0 0 var(--purpur-border-width-sm) var(--purpur-color-border-interactive-focus);content:"";display:block;inset:calc(var(--purpur-spacing-25) * -1);position:absolute}._purpur-button_w455q_1:focus:not(:focus-visible):before{box-shadow:none}._purpur-button_w455q_1 svg{display:block}._purpur-button--xs_w455q_33{padding:var(--purpur-spacing-50) var(--purpur-spacing-250)}._purpur-button--xs_w455q_33._purpur-button--icon-only_w455q_36{padding:var(--purpur-spacing-100)}._purpur-button--sm_w455q_39{padding:var(--purpur-spacing-100) var(--purpur-spacing-250)}._purpur-button--sm_w455q_39._purpur-button--icon-only_w455q_36{padding:var(--purpur-spacing-100)}._purpur-button--md_w455q_45{padding:var(--purpur-spacing-150) var(--purpur-spacing-300)}._purpur-button--md_w455q_45._purpur-button--icon-only_w455q_36{padding:var(--purpur-spacing-150)}._purpur-button--lg_w455q_51{padding:var(--purpur-spacing-200) var(--purpur-spacing-400)}._purpur-button--lg_w455q_51._purpur-button--icon-only_w455q_36{padding:var(--purpur-spacing-200)}._purpur-button--full-width_w455q_57{width:100%}._purpur-button--primary_w455q_60{background-color:var(--purpur-color-background-interactive-primary);color:var(--purpur-color-text-interactive-on-primary)}._purpur-button--primary_w455q_60:hover:not(._purpur-button--disabled_w455q_64){background-color:var(--purpur-color-background-interactive-primary-hover)}._purpur-button--primary_w455q_60:active:not(._purpur-button--disabled_w455q_64){background-color:var(--purpur-color-background-interactive-primary-active)}._purpur-button--primary-negative_w455q_70{background-color:var(--purpur-color-background-interactive-primary-negative);color:var(--purpur-color-text-interactive-on-primary-negative)}._purpur-button--primary-negative_w455q_70:hover:not(._purpur-button--disabled_w455q_64){background-color:var(--purpur-color-background-interactive-primary-negative-hover);border-color:var(--purpur-color-background-interactive-primary-negative-hover)}._purpur-button--primary-negative_w455q_70:active:not(._purpur-button--disabled_w455q_64){background-color:var(--purpur-color-background-interactive-primary-negative-active);border-color:var(--purpur-color-background-interactive-primary-negative-active)}._purpur-button--secondary_w455q_82{background-color:var(--purpur-color-background-interactive-transparent);box-shadow:inset 0 0 0 var(--purpur-border-width-xs) var(--purpur-color-border-interactive-primary);color:var(--purpur-color-text-interactive-primary)}._purpur-button--secondary_w455q_82:hover:not(._purpur-button--disabled_w455q_64){background-color:var(--purpur-color-background-interactive-transparent-hover)}._purpur-button--secondary_w455q_82:active:not(._purpur-button--disabled_w455q_64){background-color:var(--purpur-color-background-interactive-transparent-active)}._purpur-button--secondary-negative_w455q_93{background-color:var(--purpur-color-background-interactive-transparent);box-shadow:inset 0 0 0 var(--purpur-border-width-xs) var(--purpur-color-border-interactive-primary-negative);color:var(--purpur-color-text-interactive-primary-negative)}._purpur-button--secondary-negative_w455q_93:hover:not(._purpur-button--disabled_w455q_64){background-color:var(--purpur-color-background-interactive-transparent-negative-hover)}._purpur-button--secondary-negative_w455q_93:active:not(._purpur-button--disabled_w455q_64){background-color:var(--purpur-color-background-interactive-transparent-negative-active)}._purpur-button--expressive_w455q_104{background-color:var(--purpur-color-background-interactive-expressive);color:var(--purpur-color-text-interactive-on-expressive)}._purpur-button--expressive_w455q_104:hover:not(._purpur-button--disabled_w455q_64){background-color:var(--purpur-color-background-interactive-expressive-hover)}._purpur-button--expressive_w455q_104:active:not(._purpur-button--disabled_w455q_64){background-color:var(--purpur-color-background-interactive-expressive-active)}._purpur-button--expressive-negative_w455q_114{background-color:var(--purpur-color-background-interactive-expressive-negative);color:var(--purpur-color-text-interactive-on-expressive-negative)}._purpur-button--expressive-negative_w455q_114:hover:not(._purpur-button--disabled_w455q_64){background-color:var(--purpur-color-background-interactive-expressive-negative-hover);color:var(--purpur-color-text-interactive-on-expressive-negative-hover)}._purpur-button--expressive-negative_w455q_114:active:not(._purpur-button--disabled_w455q_64){background-color:var(--purpur-color-background-interactive-expressive-negative-active);color:var(--purpur-color-text-interactive-on-expressive-negative-active)}._purpur-button--negative_w455q_126._purpur-button--disabled_w455q_64{background-color:var(--purpur-color-background-interactive-disabled-negative);color:var(--purpur-color-text-weak-negative)}._purpur-button--secondary_w455q_82._purpur-button--disabled_w455q_64,._purpur-button--secondary-negative_w455q_93._purpur-button--disabled_w455q_64{box-shadow:none}._purpur-button--destructive_w455q_133{background-color:var(--purpur-color-background-interactive-destructive);color:var(--purpur-color-text-interactive-on-destructive)}._purpur-button--destructive_w455q_133:hover:not(._purpur-button--disabled_w455q_64){background-color:var(--purpur-color-background-interactive-destructive-hover)}._purpur-button--destructive_w455q_133:active:not(._purpur-button--disabled_w455q_64){background-color:var(--purpur-color-background-interactive-destructive-active)}._purpur-button--destructive-negative_w455q_143{background-color:var(--purpur-color-background-interactive-destructive);color:var(--purpur-color-text-interactive-on-destructive)}._purpur-button--destructive-negative_w455q_143:hover:not(._purpur-button--disabled_w455q_64){background-color:var(--purpur-color-background-interactive-destructive-hover)}._purpur-button--destructive-negative_w455q_143:active:not(._purpur-button--disabled_w455q_64){background-color:var(--purpur-color-background-interactive-destructive-active)}._purpur-button--tertiary-purple_w455q_153{background-color:var(--purpur-color-background-interactive-transparent);color:var(--purpur-color-text-interactive-primary)}._purpur-button--tertiary-purple_w455q_153._purpur-button--disabled_w455q_64{background-color:var(--purpur-color-background-interactive-transparent)}._purpur-button--tertiary-purple_w455q_153:hover:not(._purpur-button--disabled_w455q_64){background-color:var(--purpur-color-background-interactive-transparent-hover)}._purpur-button--tertiary-purple_w455q_153:active:not(._purpur-button--disabled_w455q_64){background-color:var(--purpur-color-background-interactive-transparent-active)}._purpur-button--tertiary-purple-negative_w455q_166{background-color:var(--purpur-color-background-interactive-transparent);color:var(--purpur-color-text-interactive-primary-negative)}._purpur-button--tertiary-purple-negative_w455q_166._purpur-button--disabled_w455q_64{background-color:var(--purpur-color-background-interactive-transparent)}._purpur-button--tertiary-purple-negative_w455q_166:hover:not(._purpur-button--disabled_w455q_64){background-color:var(--purpur-color-background-interactive-transparent-negative-hover);color:var(--purpur-color-text-interactive-primary-negative-hover)}._purpur-button--tertiary-purple-negative_w455q_166:active:not(._purpur-button--disabled_w455q_64){background-color:var(--purpur-color-background-interactive-transparent-negative-active);color:var(--purpur-color-text-interactive-primary-negative-active)}._purpur-button--text-negative_w455q_181{border-radius:0;padding-left:0;padding-right:0}._purpur-button--text-negative_w455q_181:focus-visible:before{border-radius:0}._purpur-button--text-negative_w455q_181{background-color:var(--purpur-color-background-interactive-transparent);color:var(--purpur-color-text-interactive-primary-negative)}._purpur-button--text-negative_w455q_181._purpur-button--disabled_w455q_64{background-color:var(--purpur-color-background-interactive-transparent)}._purpur-button--text-negative_w455q_181:hover:not(._purpur-button--disabled_w455q_64){background-color:var(--purpur-color-background-interactive-transparent-negative-hover);color:var(--purpur-color-text-interactive-primary-negative-hover)}._purpur-button--text-negative_w455q_181:active:not(._purpur-button--disabled_w455q_64){background-color:var(--purpur-color-background-interactive-transparent-negative-active);color:var(--purpur-color-text-interactive-primary-negative-active)}._purpur-button--text_w455q_181{border-radius:0;padding-left:0;padding-right:0}._purpur-button--text_w455q_181:focus-visible:before{border-radius:0}._purpur-button--text_w455q_181{background-color:var(--purpur-color-background-interactive-transparent);color:var(--purpur-color-text-interactive-primary)}._purpur-button--text_w455q_181._purpur-button--disabled_w455q_64{background-color:var(--purpur-color-background-interactive-transparent);color:var(--purpur-color-text-weak)}._purpur-button--text_w455q_181:hover:not(._purpur-button--disabled_w455q_64){background-color:var(--purpur-color-background-interactive-transparent-hover)}._purpur-button--text_w455q_181:active:not(._purpur-button--disabled_w455q_64){background-color:var(--purpur-color-background-interactive-transparent-active)}._purpur-button--disabled_w455q_64{background-color:var(--purpur-color-background-interactive-disabled);color:var(--purpur-color-text-weak);cursor:not-allowed}._root_11ee2_3{--rdp-accent-color: var(--purpur-color-text-interactive-primary);--rdp-accent-background-color: var(--purpur-color-background-interactive-primary);--rdp-day-height: var(--purpur-spacing-400);--rdp-day-width: calc(var(--purpur-spacing-400) + var(--purpur-spacing-100));--rdp-day_button-border-radius: 100%;--rdp-day_button-border: none;--rdp-day_button-height: var(--purpur-spacing-400);--rdp-day_button-width: var(--purpur-spacing-400);--rdp-selected-border: var(--purpur-spacing-25) solid var(--rdp-accent-color);--rdp-disabled-opacity: 1;--rdp-outside-opacity: 1;--rdp-today-color: var(--rdp-accent-color);--rdp-dropdown-gap: var(--purpur-spacing-100);--rdp-months-gap: var(purpur-spacing-400);--rdp-nav_button-disabled-opacity: 1;--rdp-nav_button-height: calc(var(---purpur-spacing-50) + var(--purpur-spacing-400));--rdp-nav_button-width: calc(var(---purpur-spacing-50) + var(--purpur-spacing-400));--rdp-nav-height: calc(var(---purpur-spacing-150) + var(--purpur-spacing-400));--rdp-range_middle-background-color: var(--purpur-color-background-interactive-transparent-active);--rdp-range_middle-color: inherit;--rdp-range_start-color: white;--rdp-range_start-background: linear-gradient(var(--rdp-gradient-direction), transparent 50%, var(--rdp-range_middle-background-color) 50%);--rdp-range_start-date-background-color: var(--purpur-color-background-interactive-transparent-active);--rdp-range_end-background: linear-gradient(var(--rdp-gradient-direction), var(--rdp-range_middle-background-color) 50%, transparent 50%);--rdp-range_end-color: white;--rdp-range_end-date-background-color: var(--purpur-color-background-interactive-transparent-active);--rdp-week_number-border-radius: 100%;--rdp-week_number-border: var(--purpur-spacing-25) solid transparent;--rdp-week_number-height: var(--rdp-day-height);--rdp-week_number-opacity: 1;--rdp-week_number-width: var(--rdp-day-width);--rdp-weeknumber-text-align: center;--rdp-weekday-opacity: 1;--rdp-weekday-padding: var(--purpur-spacing-100) 0;--rdp-weekday-text-align: center;--rdp-gradient-direction: 90deg;--rdp-animation_duration: .3s;--rdp-animation_timing: cubic-bezier(.4, 0, .2, 1);min-width:fit-content}._root_11ee2_3 *:focus-visible{outline-color:var(--purpur-color-border-interactive-focus)}._root_11ee2_3 table{width:100%;border-collapse:separate;border-spacing:0 var(--purpur-spacing-100)}._months_11ee2_88{max-width:none}._month_11ee2_88{width:100%}._day_button_11ee2_96{margin:0 auto;font-weight:var(--purpur-typography-weight-medium)}._day_11ee2_96{color:var(--rdp-accent-color);padding:0}._day_11ee2_96:hover:not(._selected_11ee2_105) ._day_button_11ee2_96{background-color:var(--purpur-color-background-interactive-transparent-hover);color:var(--purpur-color-text-interactive-primary-active);border-radius:50%}._month_caption_11ee2_111{height:calc(var(--purpur-spacing-400) + var(--purpur-spacing-50));color:var(--purpur-color-text-default);padding-left:var(--purpur-spacing-100);font-size:var(--purpur-typography-scale-150);font-family:var(--purpur-typography-family-default);font-weight:var(--purpur-typography-weight-medium)}._dropdown_root_11ee2_120{color:var(--rdp-accent-color)}._weekday_11ee2_124,._week_number_11ee2_125{color:var(--purpur-color-text-medium);text-transform:uppercase}._selected_11ee2_105 ._day_button_11ee2_96{color:var(--purpur-color-text-interactive-on-primary);background-color:var(--purpur-color-background-interactive-primary);border-radius:100%}._selected_11ee2_105._range_middle_11ee2_135{background-color:var(--purpur-color-background-interactive-transparent-active)}._selected_11ee2_105._range_middle_11ee2_135 ._day_button_11ee2_96{background-color:transparent;color:var(--purpur-color-text-interactive-primary-active);border-radius:0}._disabled_11ee2_144{color:var(--purpur-color-text-weak);text-decoration:line-through solid var(--purpur-color-text-weak);opacity:100%}._disabled_11ee2_144 ._day_button_11ee2_96{font-weight:var(--purpur-typography-weight-normal)}._outside_11ee2_153{color:var(--purpur-color-text-weak);opacity:100%}._outside_11ee2_153 ._day_button_11ee2_96{font-weight:var(--purpur-typography-weight-normal)}._button_next_11ee2_161,._button_previous_11ee2_162{z-index:2;border-radius:var(--purpur-border-radius-full)!important}._button_next_11ee2_161:before,._button_previous_11ee2_162:before{border-radius:var(--purpur-border-radius-full)!important}._purpur-drawer-content_5mlbf_1{bottom:0;height:90vh;height:90dvh;max-width:100%;position:absolute;right:0;width:100%}@media (prefers-reduced-motion: no-preference){._purpur-drawer-content_5mlbf_1{animation:_drawerSmallScreenAnimation_5mlbf_1 var(--purpur-motion-duration-200) var(--purpur-motion-easing-ease-in-out);transition:transform var(--purpur-motion-duration-200) var(--purpur-motion-easing-ease-in-out)}}._purpur-drawer-content--fit-to-content_5mlbf_16{display:flex;flex-direction:column;height:auto;max-height:90vh;max-height:90dvh}@media screen and (min-width: 600px){._purpur-drawer-content_5mlbf_1{height:100vh;height:100dvh;max-width:calc(30rem * var(--purpur-rescale));top:0}._purpur-drawer-content--fit-to-content_5mlbf_16{max-height:100vh;max-height:100dvh}}@media screen and (min-width: 600px) and (prefers-reduced-motion: no-preference){._purpur-drawer-content_5mlbf_1{animation:_drawerLargeScreenAnimation_5mlbf_1 var(--purpur-motion-duration-200) var(--purpur-motion-easing-ease-in-out)}}._purpur-drawer-content_5mlbf_1:focus{outline:none}._purpur-drawer-content__content-container_5mlbf_43{display:flex;flex-direction:column;gap:var(--purpur-spacing-400)}._purpur-drawer-content__drawer-frame_5mlbf_48[data-swipe=cancel]{transform:translateY(0);transition:transform var(--purpur-motion-duration-200) var(--purpur-motion-easing-ease-in-out)}._purpur-drawer-content__drawer-frame_5mlbf_48[data-swipe=move]{transform:translateY(var(--purpur-drawer-swipe-move-y))}._purpur-drawer-content__drawer-frame_5mlbf_48[data-swipe=end]{animation:_slideDown_5mlbf_1 var(--purpur-motion-duration-200) var(--purpur-motion-easing-ease-in-out) forwards}._purpur-drawer-content__description_5mlbf_58{color:var(--purpur-color-text-default);display:block;font-family:var(--purpur-typography-family-default);font-size:var(--purpur-typography-scale-100);font-weight:var(--purpur-typography-weight-normal);-webkit-hyphens:none;hyphens:none;line-height:var(--purpur-typography-line-height-loose);margin:0}._purpur-drawer-overlay_5mlbf_69{background:var(--purpur-color-overlay-default);top:0;right:0;bottom:0;left:0;position:fixed}@media (prefers-reduced-motion: no-preference){._purpur-drawer-overlay_5mlbf_69{animation:_overlayAnimation_5mlbf_1 var(--purpur-motion-duration-200) var(--purpur-motion-easing-ease-in-out);transition:opacity var(--purpur-motion-duration-200) var(--purpur-motion-easing-ease-in-out)}}@keyframes _slideDown_5mlbf_1{0%{transform:translateY(var(--purpur-drawer-swipe-end-y))}to{transform:translateY(100%)}}@keyframes _overlayAnimation_5mlbf_1{0%{opacity:0}to{opacity:1}}@keyframes _drawerLargeScreenAnimation_5mlbf_1{0%{transform:translate(100%)}to{transform:translate(0)}}@keyframes _drawerSmallScreenAnimation_5mlbf_1{0%{transform:translateY(100%)}to{transform:translateY(0)}}._purpur-drawer-container--header_1u45h_1{padding:var(--purpur-spacing-300) var(--purpur-spacing-page-padding-sm) var(--purpur-spacing-150);border-bottom:var(--purpur-border-width-xs) solid var(--purpur-color-border-weak)}@media screen and (min-width: 600px){._purpur-drawer-container--header_1u45h_1{padding:var(--purpur-spacing-300) var(--purpur-spacing-300) var(--purpur-spacing-200)}}._purpur-drawer-container--body_1u45h_10{padding:var(--purpur-spacing-300) var(--purpur-spacing-page-padding-sm) 0}@media screen and (min-width: 600px){._purpur-drawer-container--body_1u45h_10{padding:var(--purpur-spacing-400) var(--purpur-spacing-300) 0}}._purpur-drawer-container--body_1u45h_10._purpur-drawer-container--sticky_1u45h_18{padding:var(--purpur-spacing-300) var(--purpur-spacing-page-padding-sm)}@media screen and (min-width: 600px){._purpur-drawer-container--body_1u45h_10._purpur-drawer-container--sticky_1u45h_18{padding:var(--purpur-spacing-400) var(--purpur-spacing-300)}}._purpur-drawer-container--footer_1u45h_26{padding:0 var(--purpur-spacing-page-padding-sm) var(--purpur-spacing-200)}@media screen and (min-width: 600px){._purpur-drawer-container--footer_1u45h_26{padding:0 var(--purpur-spacing-300) var(--purpur-spacing-200)}}._purpur-drawer-container--footer_1u45h_26._purpur-drawer-container--sticky_1u45h_18{border-top:var(--purpur-border-width-xs) solid var(--purpur-color-border-weak);padding:var(--purpur-spacing-200) var(--purpur-spacing-page-padding-sm)}@media screen and (min-width: 600px){._purpur-drawer-container--footer_1u45h_26._purpur-drawer-container--sticky_1u45h_18{padding:var(--purpur-spacing-200) var(--purpur-spacing-300)}}._purpur-drawer-frame_1gdvv_1{background-color:var(--purpur-color-background-primary);border-top-left-radius:var(--purpur-border-radius-lg);border-top-right-radius:var(--purpur-border-radius-lg);box-shadow:var(--purpur-shadow-lg);display:flex;flex-direction:column;height:100%;position:relative}@media screen and (min-width: 600px){._purpur-drawer-frame_1gdvv_1{border-bottom-left-radius:var(--purpur-border-radius-lg);border-top-right-radius:0}}._purpur-drawer-frame--sticky-footer_1gdvv_17{gap:0}._purpur-drawer-frame__header_1gdvv_20{flex:0 0 auto}._purpur-drawer-frame__body_1gdvv_23{flex:1 1 auto;overflow:hidden}._purpur-drawer-frame--fit-to-content_1gdvv_27{flex:1 1 auto;height:auto;overflow:hidden}._purpur-drawer-frame--fit-to-content_1gdvv_27 ._purpur-drawer-frame__body_1gdvv_23{display:flex;flex-direction:column}._purpur-drawer-frame__footer_1gdvv_36{flex:0 0 auto}._purpur-drawer-frame__content-container_1gdvv_39{display:flex;flex-direction:column;gap:var(--purpur-spacing-400)}._purpur-drawer-frame__content-container--no-footer_1gdvv_44{margin-bottom:var(--purpur-spacing-400)}._purpur-drawer-handle_3n0ew_1{align-items:center;display:flex;height:var(--purpur-spacing-250);justify-content:center;position:absolute;top:0;width:100%}@media screen and (min-width: 600px){._purpur-drawer-handle_3n0ew_1{display:none}}._purpur-drawer-handle_3n0ew_1:before{content:"";background:var(--purpur-color-border-weak);border-radius:var(--purpur-border-radius-full);height:var(--purpur-spacing-50);width:var(--purpur-spacing-600)}._purpur-drawer-header__row_1yg5w_1{display:flex;align-items:center;gap:var(--purpur-spacing-100)}._purpur-drawer-header__row--with-back-button_1yg5w_6{margin-bottom:var(--purpur-spacing-100)}._purpur-drawer-header__left_1yg5w_9{flex:1 1 auto}._purpur-drawer-header__right_1yg5w_12{flex:0 0 auto}._purpur-drawer-header__close-button_1yg5w_15{margin-right:calc(-1 * var(--purpur-spacing-100))}._purpur-drawer-header__back-button--only-icon_1yg5w_18{margin-left:calc(-1 * var(--purpur-spacing-100))}._purpur-drawer-scroll-area__root_1r0fa_1{height:100%}._purpur-drawer-scroll-area__root--fit-to-content_1r0fa_4{display:flex;flex-direction:column;height:auto;overflow:hidden}._purpur-drawer-scroll-area__viewport_1r0fa_10{height:100%}._purpur-drawer-scroll-area__scrollbar_1r0fa_13{display:flex;-webkit-user-select:none;user-select:none;touch-action:none;padding:var(--purpur-spacing-25);background:var(--purpur-color-functional-white);transition:background var(--purpur-motion-duration-200) var(--purpur-motion-easing-ease-in-out);width:var(--purpur-spacing-100)}._purpur-drawer-scroll-area__thumb_1r0fa_24{background:var(--purpur-color-gray-200);border-radius:var(--purpur-spacing-200);flex:1;position:relative}._purpur-drawer-scroll-area__thumb_1r0fa_24:before{content:"";height:100%;left:50%;min-height:var(--purpur-spacing-300);min-width:var(--purpur-spacing-300);position:absolute;top:50%;transform:translate(-50%,-50%);width:100%}._purpur-icon_8u1lq_1{display:inline-block}._purpur-icon--xxs_8u1lq_4{width:var(--purpur-spacing-150);height:var(--purpur-spacing-150)}._purpur-icon--xs_8u1lq_8{width:var(--purpur-spacing-200);height:var(--purpur-spacing-200)}._purpur-icon--sm_8u1lq_12{width:var(--purpur-spacing-250);height:var(--purpur-spacing-250)}._purpur-icon--md_8u1lq_16{width:var(--purpur-spacing-300);height:var(--purpur-spacing-300)}._purpur-icon--lg_8u1lq_20{width:var(--purpur-spacing-400);height:var(--purpur-spacing-400)}._purpur-icon--xl_8u1lq_24{width:var(--purpur-spacing-600);height:var(--purpur-spacing-600)}._date-picker-calendar-container_17f84_1{padding:var(--purpur-spacing-150) var(--purpur-spacing-100) 0 var(--purpur-spacing-100);margin:0;border:var(--purpur-border-width-xs) solid var(--purpur-color-border-interactive-subtle);border-radius:var(--purpur-border-radius-sm);background-color:var(--purpur-color-background-primary);display:flex;align-items:center;justify-content:center;box-shadow:var(--purpur-shadow-md)}
@@ -0,0 +1,2 @@
1
+ import purpurCommon from "@purpurds/component-rig/eslint.config.mjs";
2
+ export default purpurCommon;
package/package.json ADDED
@@ -0,0 +1,79 @@
1
+ {
2
+ "name": "@purpurds/date-picker",
3
+ "version": "0.0.1",
4
+ "license": "AGPL-3.0-only",
5
+ "main": "./dist/date-picker.cjs.js",
6
+ "types": "./dist/date-picker.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "require": "./dist/date-picker.cjs.js",
10
+ "types": "./dist/date-picker.d.ts",
11
+ "default": "./dist/date-picker.es.js"
12
+ },
13
+ "./styles": "./dist/styles.css",
14
+ "./metadata": "./dist/metadata.js"
15
+ },
16
+ "source": "src/date-picker.tsx",
17
+ "dependencies": {
18
+ "classnames": "~2.5.0",
19
+ "date-fns": "~4.1.0",
20
+ "react-input-mask": "~2.0.4",
21
+ "@floating-ui/react": "~0.27.12",
22
+ "@purpurds/tokens": "7.7.0",
23
+ "@purpurds/icon": "7.7.0",
24
+ "@purpurds/button": "7.7.0",
25
+ "@purpurds/drawer": "7.7.0",
26
+ "@purpurds/date-field": "0.0.1",
27
+ "@purpurds/calendar": "0.0.1",
28
+ "@purpurds/text-field": "7.7.0"
29
+ },
30
+ "devDependencies": {
31
+ "eslint": "9.24.0",
32
+ "@storybook/react-vite": "^9.0.18",
33
+ "@testing-library/dom": "~10.4.0",
34
+ "@testing-library/jest-dom": "~6.4.0",
35
+ "@testing-library/react": "~16.2.0",
36
+ "@testing-library/user-event": "~14.5.1",
37
+ "@types/node": "20.12.12",
38
+ "@types/react-dom": "^19.0.4",
39
+ "@types/react": "^19.0.10",
40
+ "jsdom": "~22.1.0",
41
+ "lint-staged": "15.5.0",
42
+ "prettier": "~2.8.8",
43
+ "react-dom": "^19.0.0",
44
+ "react": "^19.0.0",
45
+ "storybook": "^9.0.18",
46
+ "typescript": "^5.6.3",
47
+ "vite": "^6.2.1",
48
+ "vitest": "^3.1.2",
49
+ "@purpurds/component-rig": "1.0.0"
50
+ },
51
+ "peerDependencies": {
52
+ "@types/react": "^18 || ^19",
53
+ "@types/react-dom": "^18 || ^19",
54
+ "react": "^18 || ^19",
55
+ "react-dom": "^18 || ^19"
56
+ },
57
+ "peerDependenciesMeta": {
58
+ "@types/react": {
59
+ "optional": true
60
+ },
61
+ "@types/react-dom": {
62
+ "optional": true
63
+ }
64
+ },
65
+ "scripts": {
66
+ "build:dev": "vite",
67
+ "build:watch": "vite build --watch",
68
+ "build": "vite build",
69
+ "ci:build": "rushx build",
70
+ "coverage": "vitest run --coverage",
71
+ "lint:fix": "eslint . --fix",
72
+ "lint": "lint-staged --no-stash 2>&1",
73
+ "sbdev": "rush sbdev",
74
+ "test:unit": "vitest run --passWithNoTests",
75
+ "test:watch": "vitest --watch",
76
+ "test": "rushx test:unit",
77
+ "typecheck": "tsc -p ./tsconfig.json"
78
+ }
79
+ }
@@ -0,0 +1,11 @@
1
+ .date-picker-calendar-container {
2
+ padding: var(--purpur-spacing-150) var(--purpur-spacing-100) 0 var(--purpur-spacing-100);
3
+ margin: 0;
4
+ border: var(--purpur-border-width-xs) solid var(--purpur-color-border-interactive-subtle);
5
+ border-radius: var(--purpur-border-radius-sm);
6
+ background-color: var(--purpur-color-background-primary);
7
+ display: flex;
8
+ align-items: center;
9
+ justify-content: center;
10
+ box-shadow: var(--purpur-shadow-md);
11
+ }
@@ -0,0 +1,78 @@
1
+ import React, { useState } from "react";
2
+ import type { Meta, StoryObj } from "@storybook/react";
3
+
4
+ import { DatePicker } from "./date-picker";
5
+
6
+ const meta = {
7
+ title: "Forms and Inputs/DatePicker",
8
+ component: DatePicker,
9
+ parameters: {
10
+ design: [
11
+ {
12
+ name: "DatePicker",
13
+ type: "figma",
14
+ url: "https://www.figma.com/design/XEaIIFskrrxIBHMZDkIuIg/Purpur-DS---Component-library---guidelines?node-id=39042-5999&p=f&t=5D0qSGRGqXJgdAxm-0",
15
+ },
16
+ ],
17
+ },
18
+ args: {
19
+ label: "Date picker label",
20
+ helperText: "Helper text",
21
+ valid: false,
22
+ errorText: "",
23
+ disabled: false,
24
+ readOnly: false,
25
+ required: false,
26
+ },
27
+ argTypes: {
28
+ startAdornment: { table: { disable: true } },
29
+ endAdornment: { table: { disable: true } },
30
+ },
31
+ decorators: [
32
+ (Story) => (
33
+ <div style={{ maxWidth: "20.5rem" }}>
34
+ <Story />
35
+ </div>
36
+ ),
37
+ ],
38
+ } satisfies Meta<typeof DatePicker>;
39
+
40
+ export default meta;
41
+ type Story = StoryObj<typeof DatePicker>;
42
+
43
+ export const Showcase: Story = {
44
+ args: {
45
+ label: "Date",
46
+ helperText: "This is a date picker",
47
+ },
48
+ render: (args) => {
49
+ return <DatePicker {...args} />;
50
+ },
51
+ };
52
+
53
+ export const Controlled: Story = {
54
+ args: {
55
+ label: "Date",
56
+ helperText: "This is a controlled date picker",
57
+ },
58
+ render: (args) => {
59
+ // eslint-disable-next-line react-hooks/rules-of-hooks
60
+ const [value, setValue] = useState<Date | undefined>(new Date());
61
+ const selectHandler = (date: Date | undefined) => {
62
+ setValue(date);
63
+ };
64
+
65
+ return (
66
+ <div style={{ display: "flex", flexDirection: "column", gap: "10px" }}>
67
+ <button
68
+ onClick={() => {
69
+ selectHandler(new Date(Date.now() - 24 * 60 * 60 * 1000));
70
+ }}
71
+ >
72
+ Choose yesterday
73
+ </button>
74
+ <DatePicker {...args} onChange={selectHandler} value={value} />
75
+ </div>
76
+ );
77
+ },
78
+ };
@@ -0,0 +1,51 @@
1
+ import React from "react";
2
+ import * as matchers from "@testing-library/jest-dom/matchers";
3
+ import { cleanup, fireEvent, render, screen, waitFor } from "@testing-library/react";
4
+ import { afterEach, describe, expect, it, vi } from "vitest";
5
+
6
+ import { DatePicker } from "./date-picker";
7
+
8
+ expect.extend(matchers);
9
+
10
+ describe("DatePicker", () => {
11
+ afterEach(() => {
12
+ cleanup();
13
+ });
14
+
15
+ it("renders without crashing", () => {
16
+ render(<DatePicker data-testid="date-picker" />);
17
+ expect(screen.getByTestId("date-picker-input")).toBeInTheDocument();
18
+ });
19
+
20
+ it("shows calendar when input is clicked (big screen)", async () => {
21
+ render(<DatePicker data-testid="date-picker" />);
22
+ screen.getByTestId("date-picker-input").click();
23
+ await waitFor(() => {
24
+ expect(screen.getByTestId("date-picker-calendar")).toBeInTheDocument();
25
+ });
26
+ });
27
+
28
+ it("calls onChange when a date is selected", async () => {
29
+ const handleChange = vi.fn();
30
+ render(<DatePicker onChange={handleChange} data-testid="date-picker" />);
31
+
32
+ const input = screen.getByTestId("date-picker-input") as HTMLInputElement;
33
+ input.click();
34
+ await waitFor(() => {
35
+ expect(screen.getByTestId("date-picker-calendar")).toBeInTheDocument();
36
+ });
37
+ const dayButton = screen.getAllByRole("button", { name: /\d+/ })[0];
38
+ fireEvent.click(dayButton);
39
+ await waitFor(() => expect(handleChange).toHaveBeenCalledWith(expect.any(Date)));
40
+ });
41
+
42
+ it("renders modal in small screen mode", async () => {
43
+ Object.defineProperty(window, "innerWidth", { writable: true, configurable: true, value: 320 });
44
+ window.dispatchEvent(new Event("resize"));
45
+ render(<DatePicker data-testid="date-picker" />);
46
+ screen.getByTestId("date-picker-input").click();
47
+ await waitFor(() => {
48
+ expect(screen.getByTestId("date-picker-calendar")).toBeInTheDocument();
49
+ });
50
+ });
51
+ });
@@ -0,0 +1,172 @@
1
+ import React, {
2
+ type ForwardedRef,
3
+ forwardRef,
4
+ useEffect,
5
+ useId,
6
+ useLayoutEffect,
7
+ useState,
8
+ } from "react";
9
+ import {
10
+ autoUpdate,
11
+ flip,
12
+ FloatingFocusManager,
13
+ FloatingPortal,
14
+ offset,
15
+ useClick,
16
+ useDismiss,
17
+ useFloating,
18
+ useInteractions,
19
+ } from "@floating-ui/react";
20
+ import { Calendar, type CalendarProps } from "@purpurds/calendar";
21
+ import { DateField, type DateFieldProps } from "@purpurds/date-field";
22
+ import { Drawer } from "@purpurds/drawer";
23
+ import { IconCalendar } from "@purpurds/icon/calendar";
24
+ import c from "classnames/bind";
25
+
26
+ import "@purpurds/date-field/styles";
27
+ import "@purpurds/calendar/styles";
28
+ import "@purpurds/drawer/styles";
29
+ import "@purpurds/icon/styles";
30
+ import styles from "./date-picker.module.scss";
31
+
32
+ const cx = c.bind(styles);
33
+
34
+ export type DatePickerProps = DateFieldProps & {
35
+ calendarProps?: CalendarProps;
36
+ };
37
+
38
+ export const DatePicker = forwardRef(
39
+ (
40
+ { calendarProps, value, onChange, ...props }: DatePickerProps,
41
+ ref: ForwardedRef<HTMLDivElement>
42
+ ) => {
43
+ const [showCalendar, setShowCalendar] = useState(false);
44
+
45
+ const [showDrawer, setShowDrawer] = useState(false);
46
+
47
+ const [isSmallScreen, setIsSmallScreen] = useState(false);
48
+
49
+ const { context, refs, floatingStyles } = useFloating({
50
+ open: showCalendar,
51
+ onOpenChange: (openChange) => {
52
+ if (!props.readOnly) setShowCalendar(openChange);
53
+ },
54
+ placement: "bottom-start",
55
+ middleware: [
56
+ offset({
57
+ mainAxis: 10,
58
+ crossAxis: -32, // left padding + small icon
59
+ }),
60
+ flip(),
61
+ ],
62
+ whileElementsMounted: autoUpdate,
63
+ });
64
+ const click = useClick(context);
65
+ const dismiss = useDismiss(context);
66
+ const { getFloatingProps, getReferenceProps } = useInteractions([click, dismiss]);
67
+
68
+ const [selectedDate, setSelectedDate] = useState<Date | undefined>(value);
69
+
70
+ useEffect(() => {
71
+ setSelectedDate(value);
72
+ }, [value]);
73
+
74
+ const handleDayPickerSelect = (date: Date | undefined) => {
75
+ if (!date) {
76
+ setSelectedDate(undefined);
77
+ onChange?.(undefined);
78
+ } else {
79
+ setSelectedDate(date);
80
+ onChange?.(date);
81
+ }
82
+ };
83
+
84
+ const inputId = useId();
85
+
86
+ // Update isSmallScreen on window resize
87
+ useLayoutEffect(() => {
88
+ const handleResize = () => {
89
+ setIsSmallScreen(window.innerWidth < 600);
90
+ };
91
+
92
+ handleResize();
93
+
94
+ window.addEventListener("resize", handleResize);
95
+ return () => {
96
+ window.removeEventListener("resize", handleResize);
97
+ };
98
+ }, []);
99
+
100
+ const smallScreenCalendar = () => {
101
+ return (
102
+ <Drawer open={showDrawer} onOpenChange={setShowDrawer}>
103
+ <Drawer.Trigger>
104
+ <DateField
105
+ {...props}
106
+ startAdornment={<IconCalendar size="sm" />}
107
+ id={inputId}
108
+ value={selectedDate}
109
+ onChange={handleDayPickerSelect}
110
+ data-testid={props["data-testid"]}
111
+ />
112
+ </Drawer.Trigger>
113
+ <Drawer.Content
114
+ closeButtonAriaLabel="Close calendar"
115
+ title="Select date"
116
+ fitToContent
117
+ data-testid={props["data-testid"] && `${props["data-testid"]}-calendar`}
118
+ >
119
+ <Calendar
120
+ showOutsideDays={true}
121
+ {...calendarProps}
122
+ mode="single"
123
+ selected={selectedDate}
124
+ onSelect={(date) => handleDayPickerSelect(date)}
125
+ />
126
+ </Drawer.Content>
127
+ </Drawer>
128
+ );
129
+ };
130
+
131
+ const bigScreenCalendar = () => {
132
+ return (
133
+ <div ref={ref}>
134
+ <DateField
135
+ {...getReferenceProps(props)}
136
+ ref={refs.setReference}
137
+ startAdornment={<IconCalendar size="sm" />}
138
+ id={inputId}
139
+ value={selectedDate}
140
+ onChange={handleDayPickerSelect}
141
+ data-testid={props["data-testid"]}
142
+ />
143
+ {showCalendar && !props.readOnly && (
144
+ <FloatingPortal>
145
+ <FloatingFocusManager context={context} modal={true}>
146
+ <div
147
+ data-testid={props["data-testid"] && `${props["data-testid"]}-calendar`}
148
+ className={cx(`date-picker-calendar-container`)}
149
+ ref={refs.setFloating}
150
+ style={floatingStyles}
151
+ {...getFloatingProps()}
152
+ >
153
+ <Calendar
154
+ showOutsideDays={true}
155
+ {...calendarProps}
156
+ mode="single"
157
+ selected={selectedDate}
158
+ onSelect={(date) => handleDayPickerSelect(date)}
159
+ />
160
+ </div>
161
+ </FloatingFocusManager>
162
+ </FloatingPortal>
163
+ )}
164
+ </div>
165
+ );
166
+ };
167
+
168
+ return isSmallScreen ? smallScreenCalendar() : bigScreenCalendar();
169
+ }
170
+ );
171
+
172
+ DatePicker.displayName = "DatePicker";
@@ -0,0 +1,4 @@
1
+ declare module "*.scss" {
2
+ const styles: { [className: string]: string };
3
+ export default styles;
4
+ }