@refraktor/dates 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.
Files changed (128) hide show
  1. package/.turbo/turbo-build.log +4 -0
  2. package/LICENSE +21 -0
  3. package/README.md +21 -0
  4. package/build/components/date-input/date-input.d.ts +4 -0
  5. package/build/components/date-input/date-input.d.ts.map +1 -0
  6. package/build/components/date-input/date-input.js +164 -0
  7. package/build/components/date-input/date-input.types.d.ts +96 -0
  8. package/build/components/date-input/date-input.types.d.ts.map +1 -0
  9. package/build/components/date-input/date-input.types.js +1 -0
  10. package/build/components/date-input/index.d.ts +3 -0
  11. package/build/components/date-input/index.d.ts.map +1 -0
  12. package/build/components/date-input/index.js +1 -0
  13. package/build/components/date-picker/date-picker.d.ts +4 -0
  14. package/build/components/date-picker/date-picker.d.ts.map +1 -0
  15. package/build/components/date-picker/date-picker.js +307 -0
  16. package/build/components/date-picker/date-picker.types.d.ts +86 -0
  17. package/build/components/date-picker/date-picker.types.d.ts.map +1 -0
  18. package/build/components/date-picker/date-picker.types.js +1 -0
  19. package/build/components/date-picker/index.d.ts +3 -0
  20. package/build/components/date-picker/index.d.ts.map +1 -0
  21. package/build/components/date-picker/index.js +1 -0
  22. package/build/components/dates-provider/context.d.ts +4 -0
  23. package/build/components/dates-provider/context.d.ts.map +1 -0
  24. package/build/components/dates-provider/context.js +10 -0
  25. package/build/components/dates-provider/dates-provider.d.ts +7 -0
  26. package/build/components/dates-provider/dates-provider.d.ts.map +1 -0
  27. package/build/components/dates-provider/dates-provider.js +65 -0
  28. package/build/components/dates-provider/index.d.ts +5 -0
  29. package/build/components/dates-provider/index.d.ts.map +1 -0
  30. package/build/components/dates-provider/index.js +3 -0
  31. package/build/components/dates-provider/types.d.ts +26 -0
  32. package/build/components/dates-provider/types.d.ts.map +1 -0
  33. package/build/components/dates-provider/types.js +1 -0
  34. package/build/components/dates-provider/use-dates.d.ts +2 -0
  35. package/build/components/dates-provider/use-dates.d.ts.map +1 -0
  36. package/build/components/dates-provider/use-dates.js +4 -0
  37. package/build/components/index.d.ts +8 -0
  38. package/build/components/index.d.ts.map +1 -0
  39. package/build/components/index.js +7 -0
  40. package/build/components/month-input/index.d.ts +3 -0
  41. package/build/components/month-input/index.d.ts.map +1 -0
  42. package/build/components/month-input/index.js +1 -0
  43. package/build/components/month-input/month-input.d.ts +4 -0
  44. package/build/components/month-input/month-input.d.ts.map +1 -0
  45. package/build/components/month-input/month-input.js +161 -0
  46. package/build/components/month-input/month-input.types.d.ts +85 -0
  47. package/build/components/month-input/month-input.types.d.ts.map +1 -0
  48. package/build/components/month-input/month-input.types.js +1 -0
  49. package/build/components/month-picker/index.d.ts +3 -0
  50. package/build/components/month-picker/index.d.ts.map +1 -0
  51. package/build/components/month-picker/index.js +1 -0
  52. package/build/components/month-picker/month-picker.d.ts +4 -0
  53. package/build/components/month-picker/month-picker.d.ts.map +1 -0
  54. package/build/components/month-picker/month-picker.js +229 -0
  55. package/build/components/month-picker/month-picker.types.d.ts +69 -0
  56. package/build/components/month-picker/month-picker.types.d.ts.map +1 -0
  57. package/build/components/month-picker/month-picker.types.js +1 -0
  58. package/build/components/picker-shared/index.d.ts +5 -0
  59. package/build/components/picker-shared/index.d.ts.map +1 -0
  60. package/build/components/picker-shared/index.js +2 -0
  61. package/build/components/picker-shared/picker-header.d.ts +4 -0
  62. package/build/components/picker-shared/picker-header.d.ts.map +1 -0
  63. package/build/components/picker-shared/picker-header.js +27 -0
  64. package/build/components/picker-shared/picker-header.types.d.ts +36 -0
  65. package/build/components/picker-shared/picker-header.types.d.ts.map +1 -0
  66. package/build/components/picker-shared/picker-header.types.js +1 -0
  67. package/build/components/picker-shared/picker.styles.d.ts +12 -0
  68. package/build/components/picker-shared/picker.styles.d.ts.map +1 -0
  69. package/build/components/picker-shared/picker.styles.js +53 -0
  70. package/build/components/picker-shared/picker.types.d.ts +4 -0
  71. package/build/components/picker-shared/picker.types.d.ts.map +1 -0
  72. package/build/components/picker-shared/picker.types.js +1 -0
  73. package/build/components/year-input/index.d.ts +3 -0
  74. package/build/components/year-input/index.d.ts.map +1 -0
  75. package/build/components/year-input/index.js +1 -0
  76. package/build/components/year-input/year-input.d.ts +4 -0
  77. package/build/components/year-input/year-input.d.ts.map +1 -0
  78. package/build/components/year-input/year-input.js +157 -0
  79. package/build/components/year-input/year-input.types.d.ts +74 -0
  80. package/build/components/year-input/year-input.types.d.ts.map +1 -0
  81. package/build/components/year-input/year-input.types.js +1 -0
  82. package/build/components/year-picker/index.d.ts +3 -0
  83. package/build/components/year-picker/index.d.ts.map +1 -0
  84. package/build/components/year-picker/index.js +1 -0
  85. package/build/components/year-picker/year-picker.d.ts +4 -0
  86. package/build/components/year-picker/year-picker.d.ts.map +1 -0
  87. package/build/components/year-picker/year-picker.js +236 -0
  88. package/build/components/year-picker/year-picker.types.d.ts +70 -0
  89. package/build/components/year-picker/year-picker.types.d.ts.map +1 -0
  90. package/build/components/year-picker/year-picker.types.js +1 -0
  91. package/build/index.d.ts +3 -0
  92. package/build/index.d.ts.map +1 -0
  93. package/build/index.js +2 -0
  94. package/build/style.css +2 -0
  95. package/package.json +38 -0
  96. package/refraktor-dates-0.0.1-alpha.0.tgz +0 -0
  97. package/src/components/date-input/date-input.tsx +376 -0
  98. package/src/components/date-input/date-input.types.ts +161 -0
  99. package/src/components/date-input/index.ts +13 -0
  100. package/src/components/date-picker/date-picker.tsx +649 -0
  101. package/src/components/date-picker/date-picker.types.ts +145 -0
  102. package/src/components/date-picker/index.ts +15 -0
  103. package/src/components/dates-provider/context.ts +18 -0
  104. package/src/components/dates-provider/dates-provider.tsx +136 -0
  105. package/src/components/dates-provider/index.ts +10 -0
  106. package/src/components/dates-provider/types.ts +33 -0
  107. package/src/components/dates-provider/use-dates.ts +5 -0
  108. package/src/components/index.ts +7 -0
  109. package/src/components/month-input/index.ts +13 -0
  110. package/src/components/month-input/month-input.tsx +363 -0
  111. package/src/components/month-input/month-input.types.ts +139 -0
  112. package/src/components/month-picker/index.ts +14 -0
  113. package/src/components/month-picker/month-picker.tsx +458 -0
  114. package/src/components/month-picker/month-picker.types.ts +117 -0
  115. package/src/components/picker-shared/index.ts +7 -0
  116. package/src/components/picker-shared/picker-header.tsx +178 -0
  117. package/src/components/picker-shared/picker-header.types.ts +49 -0
  118. package/src/components/picker-shared/picker.styles.ts +69 -0
  119. package/src/components/picker-shared/picker.types.ts +4 -0
  120. package/src/components/year-input/index.ts +13 -0
  121. package/src/components/year-input/year-input.tsx +347 -0
  122. package/src/components/year-input/year-input.types.ts +118 -0
  123. package/src/components/year-picker/index.ts +15 -0
  124. package/src/components/year-picker/year-picker.tsx +504 -0
  125. package/src/components/year-picker/year-picker.types.ts +108 -0
  126. package/src/index.ts +3 -0
  127. package/src/style.css +1 -0
  128. package/tsconfig.json +13 -0
@@ -0,0 +1,157 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useId, useUncontrolled } from "@refraktor/utils";
3
+ import { useCallback, useMemo } from "react";
4
+ import { createClassNamesConfig, createComponentConfig, factory, Input, Transition, useClassNames, useProps, useTheme } from "@refraktor/core";
5
+ import { autoUpdate, flip, FloatingFocusManager, FloatingPortal, inline, offset, shift, useDismiss, useFloating, useFocus, useInteractions, useRole } from "@floating-ui/react";
6
+ import { useDates } from "../dates-provider";
7
+ import { YearPicker } from "../year-picker";
8
+ const DEFAULT_YEARS_PER_PAGE = 9;
9
+ const DEFAULT_COLUMNS = 3;
10
+ const DEFAULT_VALUE_FORMAT = "YYYY";
11
+ const defaultProps = {
12
+ yearsPerPage: DEFAULT_YEARS_PER_PAGE,
13
+ columns: DEFAULT_COLUMNS,
14
+ valueFormat: DEFAULT_VALUE_FORMAT,
15
+ disabled: false,
16
+ size: "md",
17
+ radius: "default",
18
+ positioning: {
19
+ placement: "bottom-start",
20
+ offset: 4
21
+ },
22
+ middlewares: {
23
+ flip: true,
24
+ shift: true
25
+ },
26
+ withinPortal: true,
27
+ closeOnClickOutside: true,
28
+ closeOnEscape: true
29
+ };
30
+ const toSafeInteger = (value) => {
31
+ if (!Number.isFinite(value)) {
32
+ return undefined;
33
+ }
34
+ return Math.trunc(value);
35
+ };
36
+ const YearInput = factory((_props, ref) => {
37
+ const { cx, getRadius } = useTheme();
38
+ const { createDate } = useDates();
39
+ const { id, value, defaultValue, onChange, opened, defaultOpened, onOpenedChange, minYear, maxYear, yearsPerPage, columns, valueFormat, disabled, size, radius, positioning, middlewares, withinPortal, closeOnClickOutside, closeOnEscape, transitionProps, inputClassNames, className, classNames, onFocus, onBlur, onClick, onKeyDown, ...inputProps } = useProps("YearInput", defaultProps, _props);
40
+ const classes = useClassNames("YearInput", classNames);
41
+ const _id = useId(id);
42
+ const dropdownId = `${_id}-dropdown`;
43
+ const [selectedYearState, setSelectedYear] = useUncontrolled({
44
+ value,
45
+ defaultValue,
46
+ finalValue: undefined,
47
+ onChange: (nextYear) => {
48
+ if (nextYear !== undefined) {
49
+ onChange?.(nextYear);
50
+ }
51
+ }
52
+ });
53
+ const [isOpenState, setIsOpen] = useUncontrolled({
54
+ value: opened,
55
+ defaultValue: defaultOpened,
56
+ finalValue: false,
57
+ onChange: onOpenedChange
58
+ });
59
+ const isOpen = isOpenState && !disabled;
60
+ const middleware = useMemo(() => {
61
+ const middlewareList = [];
62
+ middlewareList.push(offset(positioning?.offset ?? 4));
63
+ if (middlewares?.flip ?? true) {
64
+ middlewareList.push(flip(typeof middlewares?.flip === "boolean"
65
+ ? undefined
66
+ : middlewares.flip));
67
+ }
68
+ if (middlewares?.shift ?? true) {
69
+ middlewareList.push(shift(typeof middlewares?.shift === "boolean"
70
+ ? undefined
71
+ : middlewares.shift));
72
+ }
73
+ if (middlewares?.inline) {
74
+ middlewareList.push(inline(typeof middlewares.inline === "boolean"
75
+ ? undefined
76
+ : middlewares.inline));
77
+ }
78
+ return middlewareList;
79
+ }, [middlewares, positioning?.offset]);
80
+ const handleOpenChange = useCallback((nextOpen) => {
81
+ if (disabled && nextOpen) {
82
+ return;
83
+ }
84
+ setIsOpen(nextOpen);
85
+ }, [disabled, setIsOpen]);
86
+ const floating = useFloating({
87
+ placement: positioning?.placement ?? "bottom-start",
88
+ open: isOpen,
89
+ onOpenChange: handleOpenChange,
90
+ middleware,
91
+ whileElementsMounted: autoUpdate
92
+ });
93
+ const focus = useFocus(floating.context, {
94
+ enabled: !disabled
95
+ });
96
+ const dismiss = useDismiss(floating.context, {
97
+ outsidePress: closeOnClickOutside,
98
+ escapeKey: closeOnEscape
99
+ });
100
+ const role = useRole(floating.context, {
101
+ role: "dialog"
102
+ });
103
+ const { getReferenceProps, getFloatingProps } = useInteractions([
104
+ focus,
105
+ dismiss,
106
+ role
107
+ ]);
108
+ const setInputRef = useCallback((node) => {
109
+ floating.refs.setReference(node);
110
+ if (typeof ref === "function") {
111
+ ref(node);
112
+ }
113
+ else if (ref) {
114
+ ref.current = node;
115
+ }
116
+ }, [floating.refs, ref]);
117
+ const handleInputKeyDown = useCallback((event) => {
118
+ onKeyDown?.(event);
119
+ if (event.defaultPrevented || disabled) {
120
+ return;
121
+ }
122
+ if (event.key === "ArrowDown" ||
123
+ event.key === "Enter" ||
124
+ event.key === " ") {
125
+ event.preventDefault();
126
+ setIsOpen(true);
127
+ return;
128
+ }
129
+ if (event.key === "Escape") {
130
+ event.preventDefault();
131
+ setIsOpen(false);
132
+ }
133
+ }, [disabled, onKeyDown, setIsOpen]);
134
+ const handleYearChange = useCallback((nextYear) => {
135
+ setSelectedYear(nextYear);
136
+ setIsOpen(false);
137
+ }, [setIsOpen, setSelectedYear]);
138
+ const selectedYear = toSafeInteger(selectedYearState);
139
+ const inputValue = selectedYear === undefined
140
+ ? ""
141
+ : createDate(new Date(selectedYear, 0, 1)).format(valueFormat);
142
+ const mergedReferenceProps = getReferenceProps({
143
+ onFocus,
144
+ onBlur,
145
+ onClick,
146
+ onKeyDown: handleInputKeyDown
147
+ });
148
+ const dropdownContent = (_jsx(Transition, { transition: "fade", duration: 150, mounted: isOpen, ...transitionProps, children: _jsx("div", { ref: floating.refs.setFloating, id: dropdownId, style: {
149
+ ...floating.floatingStyles
150
+ }, className: cx("w-60 z-50 border border-[var(--refraktor-border)] bg-[var(--refraktor-bg)] p-2 text-[var(--refraktor-text)] shadow-md", getRadius(radius), classes.dropdown), ...getFloatingProps(), children: _jsx(YearPicker, { value: selectedYear, onChange: handleYearChange, minYear: minYear, maxYear: maxYear, yearsPerPage: yearsPerPage, columns: columns, disabled: disabled, size: size, radius: radius, className: cx("bg-transparent p-0", classes.yearPicker) }) }) }));
151
+ const wrappedContent = isOpen ? (_jsx(FloatingFocusManager, { context: floating.context, modal: false, initialFocus: -1, returnFocus: false, children: dropdownContent })) : (dropdownContent);
152
+ return (_jsxs(_Fragment, { children: [_jsx(Input, { ref: setInputRef, id: _id, readOnly: true, value: inputValue, disabled: disabled, size: size, radius: radius, role: "combobox", "aria-haspopup": "dialog", "aria-expanded": isOpen, "aria-controls": isOpen ? dropdownId : undefined, className: cx(classes.input, className), classNames: inputClassNames, ...inputProps, ...mergedReferenceProps }), withinPortal ? (_jsx(FloatingPortal, { children: wrappedContent })) : (wrappedContent)] }));
153
+ });
154
+ YearInput.displayName = "@refraktor/dates/YearInput";
155
+ YearInput.configure = createComponentConfig();
156
+ YearInput.classNames = createClassNamesConfig();
157
+ export default YearInput;
@@ -0,0 +1,74 @@
1
+ import type { FlipOptions, InlineOptions, Placement, ShiftOptions } from "@floating-ui/react";
2
+ import { createClassNamesConfig, createComponentConfig, FactoryPayload, InputFieldClassNames, InputProps, RefraktorRadius, RefraktorSize, TransitionProps } from "@refraktor/core";
3
+ export type YearInputValue = number;
4
+ export type YearInputSize = RefraktorSize;
5
+ export type YearInputRadius = RefraktorRadius;
6
+ export type YearInputOnChange = (value: YearInputValue) => void;
7
+ export type YearInputValueFormat = string;
8
+ export type YearInputPositioning = {
9
+ /** The placement of the dropdown relative to the input @default `bottom-start` */
10
+ placement?: Placement;
11
+ /** Offset distance from the input in pixels @default `4` */
12
+ offset?: number;
13
+ };
14
+ export type YearInputMiddlewares = {
15
+ shift?: boolean | ShiftOptions;
16
+ flip?: boolean | FlipOptions;
17
+ inline?: boolean | InlineOptions;
18
+ };
19
+ export type YearInputClassNames = {
20
+ input?: string;
21
+ dropdown?: string;
22
+ yearPicker?: string;
23
+ };
24
+ interface _YearInputProps {
25
+ /** Selected year (controlled). */
26
+ value?: YearInputValue;
27
+ /** Initial selected year (uncontrolled). */
28
+ defaultValue?: YearInputValue;
29
+ /** Callback called when selected year changes. */
30
+ onChange?: YearInputOnChange;
31
+ /** Dropdown open state (controlled). */
32
+ opened?: boolean;
33
+ /** Initial dropdown open state (uncontrolled). */
34
+ defaultOpened?: boolean;
35
+ /** Callback called when dropdown open state changes. */
36
+ onOpenedChange?: (opened: boolean) => void;
37
+ /** Minimum selectable year. */
38
+ minYear?: number;
39
+ /** Maximum selectable year. */
40
+ maxYear?: number;
41
+ /** Years rendered in one page @default `9` */
42
+ yearsPerPage?: number;
43
+ /** Grid columns used by the year list @default `3` */
44
+ columns?: number;
45
+ /** Dayjs format used to render selected year in the input @default `YYYY` */
46
+ valueFormat?: YearInputValueFormat;
47
+ /** Positioning settings for the dropdown. */
48
+ positioning?: YearInputPositioning;
49
+ /** Floating middleware settings. */
50
+ middlewares?: YearInputMiddlewares;
51
+ /** Whether to render dropdown in a portal @default `true` */
52
+ withinPortal?: boolean;
53
+ /** Whether to close on click outside @default `true` */
54
+ closeOnClickOutside?: boolean;
55
+ /** Whether to close on Escape key @default `true` */
56
+ closeOnEscape?: boolean;
57
+ /** Transition props for dropdown, uses Transition internally */
58
+ transitionProps?: Omit<TransitionProps, "children" | "mounted">;
59
+ /** Used for styling the core Input field parts. */
60
+ inputClassNames?: InputFieldClassNames;
61
+ /** Used for styling YearInput parts. */
62
+ classNames?: YearInputClassNames;
63
+ }
64
+ export type YearInputProps = _YearInputProps & Omit<InputProps, "value" | "defaultValue" | "onChange" | "readOnly" | "classNames">;
65
+ export interface YearInputFactoryPayload extends FactoryPayload {
66
+ props: YearInputProps;
67
+ ref: HTMLInputElement;
68
+ compound: {
69
+ configure: ReturnType<typeof createComponentConfig<YearInputProps>>;
70
+ classNames: ReturnType<typeof createClassNamesConfig<YearInputClassNames>>;
71
+ };
72
+ }
73
+ export {};
74
+ //# sourceMappingURL=year-input.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"year-input.types.d.ts","sourceRoot":"","sources":["../../../src/components/year-input/year-input.types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,3 @@
1
+ export { default as YearPicker } from "./year-picker";
2
+ export type { YearPickerClassNames, YearPickerGetHeaderLabel, YearPickerGetNavigationAriaLabel, YearPickerGetYearAriaLabel, YearPickerGetYearLabel, YearPickerNavigationDirection, YearPickerOnChange, YearPickerProps, YearPickerRadius, YearPickerRange, YearPickerSize, YearPickerValue } from "./year-picker.types";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/year-picker/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,eAAe,CAAC;AACtD,YAAY,EACR,oBAAoB,EACpB,wBAAwB,EACxB,gCAAgC,EAChC,0BAA0B,EAC1B,sBAAsB,EACtB,6BAA6B,EAC7B,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,eAAe,EAClB,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1 @@
1
+ export { default as YearPicker } from "./year-picker";
@@ -0,0 +1,4 @@
1
+ import { YearPickerFactoryPayload } from "./year-picker.types";
2
+ declare const YearPicker: import("@refraktor/core").RefraktorComponent<YearPickerFactoryPayload>;
3
+ export default YearPicker;
4
+ //# sourceMappingURL=year-picker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"year-picker.d.ts","sourceRoot":"","sources":["../../../src/components/year-picker/year-picker.tsx"],"names":[],"mappings":"AAeA,OAAO,EAEH,wBAAwB,EAI3B,MAAM,qBAAqB,CAAC;AA2H7B,QAAA,MAAM,UAAU,wEAiWd,CAAC;AAMH,eAAe,UAAU,CAAC"}
@@ -0,0 +1,236 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useId, useUncontrolled } from "@refraktor/utils";
3
+ import { useEffect, useMemo, useState } from "react";
4
+ import { createClassNamesConfig, createComponentConfig, factory, useTheme, useClassNames, useProps } from "@refraktor/core";
5
+ import { getGridColumns, getPickerSizeStyles, PickerHeader } from "../picker-shared";
6
+ const DEFAULT_YEARS_PER_PAGE = 9;
7
+ const DEFAULT_COLUMNS = 3;
8
+ const defaultProps = {
9
+ yearsPerPage: DEFAULT_YEARS_PER_PAGE,
10
+ columns: DEFAULT_COLUMNS,
11
+ disabled: false,
12
+ size: "md",
13
+ radius: "default"
14
+ };
15
+ const toSafeInteger = (value, fallback) => {
16
+ if (!Number.isFinite(value)) {
17
+ return fallback;
18
+ }
19
+ return Math.trunc(value);
20
+ };
21
+ const clamp = (value, min, max) => Math.min(max, Math.max(min, value));
22
+ const getBounds = (minYear, maxYear) => {
23
+ const hasMin = Number.isFinite(minYear);
24
+ const hasMax = Number.isFinite(maxYear);
25
+ const min = hasMin
26
+ ? Math.trunc(minYear)
27
+ : Number.MIN_SAFE_INTEGER;
28
+ const max = hasMax
29
+ ? Math.trunc(maxYear)
30
+ : Number.MAX_SAFE_INTEGER;
31
+ if (min <= max) {
32
+ return { min, max, hasMin, hasMax };
33
+ }
34
+ return {
35
+ min: max,
36
+ max: min,
37
+ hasMin,
38
+ hasMax
39
+ };
40
+ };
41
+ const getCenteredRangeStart = (year, yearsPerPage) => year - Math.floor(yearsPerPage / 2);
42
+ const clampRangeStart = (rangeStart, bounds, yearsPerPage) => {
43
+ const totalVisibleYears = bounds.max - bounds.min + 1;
44
+ if (totalVisibleYears <= yearsPerPage) {
45
+ return bounds.min;
46
+ }
47
+ const maxStart = bounds.max - yearsPerPage + 1;
48
+ return clamp(rangeStart, bounds.min, maxStart);
49
+ };
50
+ const getRangeEnd = (rangeStart, yearsPerPage, bounds) => Math.min(rangeStart + yearsPerPage - 1, bounds.max);
51
+ const ensureRangeContainsYear = (year, rangeStart, bounds, yearsPerPage) => {
52
+ const normalizedRangeStart = clampRangeStart(rangeStart, bounds, yearsPerPage);
53
+ const rangeEnd = getRangeEnd(normalizedRangeStart, yearsPerPage, bounds);
54
+ if (year >= normalizedRangeStart && year <= rangeEnd) {
55
+ return normalizedRangeStart;
56
+ }
57
+ return clampRangeStart(getCenteredRangeStart(year, yearsPerPage), bounds, yearsPerPage);
58
+ };
59
+ const getVisibleYears = (rangeStart, bounds, yearsPerPage) => {
60
+ const years = [];
61
+ for (let index = 0; index < yearsPerPage; index += 1) {
62
+ const year = rangeStart + index;
63
+ if (year < bounds.min || year > bounds.max) {
64
+ continue;
65
+ }
66
+ years.push(year);
67
+ }
68
+ return years;
69
+ };
70
+ const YearPicker = factory((_props, ref) => {
71
+ const { cx, getRadius } = useTheme();
72
+ const { id, value, defaultValue, onChange, minYear, maxYear, yearsPerPage, columns, disabled, size, radius, getYearLabel, getYearAriaLabel, getHeaderLabel, getNavigationAriaLabel, className, classNames, ...props } = useProps("YearPicker", defaultProps, _props);
73
+ const classes = useClassNames("YearPicker", classNames);
74
+ const _id = useId(id);
75
+ const currentYear = new Date().getFullYear();
76
+ const bounds = useMemo(() => getBounds(minYear, maxYear), [minYear, maxYear]);
77
+ const safeYearsPerPage = Math.max(1, toSafeInteger(yearsPerPage, DEFAULT_YEARS_PER_PAGE));
78
+ const safeColumns = clamp(toSafeInteger(columns, DEFAULT_COLUMNS), 1, Math.min(6, safeYearsPerPage));
79
+ const [selectedYearState, setSelectedYear, isControlled] = useUncontrolled({
80
+ value,
81
+ defaultValue,
82
+ finalValue: undefined,
83
+ onChange: (nextYear) => {
84
+ if (nextYear !== undefined) {
85
+ onChange?.(nextYear);
86
+ }
87
+ }
88
+ });
89
+ const initialSelectedYear = clamp(toSafeInteger(selectedYearState, currentYear), bounds.min, bounds.max);
90
+ const [rangeStart, setRangeStart] = useState(() => clampRangeStart(getCenteredRangeStart(initialSelectedYear, safeYearsPerPage), bounds, safeYearsPerPage));
91
+ const selectedYear = selectedYearState === undefined
92
+ ? undefined
93
+ : clamp(toSafeInteger(selectedYearState, currentYear), bounds.min, bounds.max);
94
+ const rangeAnchorYear = selectedYear ?? clamp(currentYear, bounds.min, bounds.max);
95
+ useEffect(() => {
96
+ if (isControlled) {
97
+ return;
98
+ }
99
+ if (selectedYearState === undefined || selectedYear === undefined) {
100
+ return;
101
+ }
102
+ if (selectedYearState !== selectedYear) {
103
+ setSelectedYear(selectedYear);
104
+ }
105
+ }, [
106
+ bounds.max,
107
+ bounds.min,
108
+ isControlled,
109
+ selectedYear,
110
+ selectedYearState,
111
+ setSelectedYear
112
+ ]);
113
+ useEffect(() => {
114
+ setRangeStart((previousRangeStart) => ensureRangeContainsYear(rangeAnchorYear, previousRangeStart, bounds, safeYearsPerPage));
115
+ }, [bounds, rangeAnchorYear, safeYearsPerPage]);
116
+ const visibleYears = useMemo(() => getVisibleYears(rangeStart, bounds, safeYearsPerPage), [bounds, rangeStart, safeYearsPerPage]);
117
+ const visibleRange = {
118
+ start: visibleYears[0] ?? rangeStart,
119
+ end: visibleYears[visibleYears.length - 1] ??
120
+ getRangeEnd(rangeStart, safeYearsPerPage, bounds)
121
+ };
122
+ const sizeStyles = getPickerSizeStyles(size);
123
+ const canGoPrevious = !disabled && (!bounds.hasMin || rangeStart > bounds.min);
124
+ const canGoNext = !disabled &&
125
+ (!bounds.hasMax ||
126
+ getRangeEnd(rangeStart, safeYearsPerPage, bounds) < bounds.max);
127
+ const resolveNavigationLabel = (direction) => {
128
+ if (getNavigationAriaLabel) {
129
+ return getNavigationAriaLabel(direction, visibleRange);
130
+ }
131
+ return direction === "previous"
132
+ ? "Show previous years"
133
+ : "Show next years";
134
+ };
135
+ const resolveYearAriaLabel = (year, isSelected) => {
136
+ if (getYearAriaLabel) {
137
+ return getYearAriaLabel(year, isSelected);
138
+ }
139
+ return isSelected ? `Year ${year}, selected` : `Choose year ${year}`;
140
+ };
141
+ const setYear = (nextYear) => {
142
+ if (disabled) {
143
+ return;
144
+ }
145
+ const normalizedYear = clamp(nextYear, bounds.min, bounds.max);
146
+ if (normalizedYear === selectedYear) {
147
+ return;
148
+ }
149
+ setSelectedYear(normalizedYear);
150
+ };
151
+ const shiftRange = (direction) => {
152
+ setRangeStart((previousRangeStart) => clampRangeStart(previousRangeStart + direction * safeYearsPerPage, bounds, safeYearsPerPage));
153
+ };
154
+ const handlePrevious = () => {
155
+ if (!canGoPrevious) {
156
+ return;
157
+ }
158
+ shiftRange(-1);
159
+ };
160
+ const handleNext = () => {
161
+ if (!canGoNext) {
162
+ return;
163
+ }
164
+ shiftRange(1);
165
+ };
166
+ const handleYearSelect = (year) => {
167
+ setRangeStart((previousRangeStart) => ensureRangeContainsYear(year, previousRangeStart, bounds, safeYearsPerPage));
168
+ setYear(year);
169
+ };
170
+ const handleGridKeyDown = (event) => {
171
+ if (disabled) {
172
+ return;
173
+ }
174
+ const keyboardBaseYear = selectedYear ?? visibleYears[0] ?? rangeAnchorYear;
175
+ const keyboardSteps = {
176
+ ArrowLeft: -1,
177
+ ArrowRight: 1,
178
+ ArrowUp: -safeColumns,
179
+ ArrowDown: safeColumns
180
+ };
181
+ const step = keyboardSteps[event.key];
182
+ if (step !== undefined) {
183
+ event.preventDefault();
184
+ const nextYear = clamp(keyboardBaseYear + step, bounds.min, bounds.max);
185
+ handleYearSelect(nextYear);
186
+ return;
187
+ }
188
+ if (event.key === "Home") {
189
+ event.preventDefault();
190
+ if (visibleYears.length > 0) {
191
+ handleYearSelect(visibleYears[0]);
192
+ }
193
+ return;
194
+ }
195
+ if (event.key === "End") {
196
+ event.preventDefault();
197
+ if (visibleYears.length > 0) {
198
+ handleYearSelect(visibleYears[visibleYears.length - 1]);
199
+ }
200
+ return;
201
+ }
202
+ if (event.key === "PageUp") {
203
+ event.preventDefault();
204
+ handleYearSelect(keyboardBaseYear - safeYearsPerPage);
205
+ return;
206
+ }
207
+ if (event.key === "PageDown") {
208
+ event.preventDefault();
209
+ handleYearSelect(keyboardBaseYear + safeYearsPerPage);
210
+ }
211
+ };
212
+ const hasVisibleSelection = selectedYear !== undefined && visibleYears.includes(selectedYear);
213
+ return (_jsxs("div", { ref: ref, id: _id, className: cx("inline-flex w-full flex-col gap-2 bg-[var(--refraktor-bg)] p-2", getRadius(radius), classes.root, className), ...props, children: [_jsx(PickerHeader, { label: getHeaderLabel
214
+ ? getHeaderLabel(visibleRange)
215
+ : `${visibleRange.start} - ${visibleRange.end}`, onPrevious: handlePrevious, onNext: handleNext, previousDisabled: !canGoPrevious, nextDisabled: !canGoNext, previousLabel: resolveNavigationLabel("previous"), nextLabel: resolveNavigationLabel("next"), size: size, radius: radius, classNames: {
216
+ root: classes.header,
217
+ controls: classes.headerControls,
218
+ control: classes.headerControl,
219
+ previousControl: classes.headerPreviousControl,
220
+ nextControl: classes.headerNextControl,
221
+ label: classes.headerLabel
222
+ } }), _jsx("div", { role: "grid", "aria-label": "Year picker", className: cx("grid", getGridColumns(safeColumns), sizeStyles.gridGap, classes.grid), onKeyDown: handleGridKeyDown, children: visibleYears.map((year, index) => {
223
+ const isSelected = year === selectedYear;
224
+ const tabIndex = isSelected || (!hasVisibleSelection && index === 0)
225
+ ? 0
226
+ : -1;
227
+ return (_jsx("button", { type: "button", role: "gridcell", "aria-selected": isSelected, "aria-label": resolveYearAriaLabel(year, isSelected), tabIndex: tabIndex, "data-active": isSelected, "data-disabled": disabled, disabled: disabled, className: cx("inline-flex items-center justify-center font-medium text-[var(--refraktor-text)] transition-colors", isSelected
228
+ ? "bg-[var(--refraktor-primary)] text-[var(--refraktor-primary-text)]"
229
+ : "hover:bg-[var(--refraktor-bg-hover)]", disabled &&
230
+ "pointer-events-none cursor-not-allowed opacity-50 data-[disabled=true]:pointer-events-none", sizeStyles.cell, getRadius(radius), classes.year), onClick: () => handleYearSelect(year), children: getYearLabel ? getYearLabel(year) : year }, year));
231
+ }) })] }));
232
+ });
233
+ YearPicker.displayName = "@refraktor/dates/YearPicker";
234
+ YearPicker.configure = createComponentConfig();
235
+ YearPicker.classNames = createClassNamesConfig();
236
+ export default YearPicker;
@@ -0,0 +1,70 @@
1
+ import { ComponentPropsWithoutRef, ReactNode } from "react";
2
+ import { RefraktorRadius, RefraktorSize, createClassNamesConfig, createComponentConfig, FactoryPayload } from "@refraktor/core";
3
+ export type YearPickerValue = number;
4
+ export type YearPickerSize = RefraktorSize;
5
+ export type YearPickerRadius = RefraktorRadius;
6
+ export type YearPickerNavigationDirection = "previous" | "next";
7
+ export type YearPickerRange = {
8
+ start: number;
9
+ end: number;
10
+ };
11
+ export type YearPickerOnChange = (year: YearPickerValue) => void;
12
+ export type YearPickerGetYearLabel = (year: YearPickerValue) => ReactNode;
13
+ export type YearPickerGetYearAriaLabel = (year: YearPickerValue, selected: boolean) => string;
14
+ export type YearPickerGetHeaderLabel = (range: YearPickerRange) => ReactNode;
15
+ export type YearPickerGetNavigationAriaLabel = (direction: YearPickerNavigationDirection, range: YearPickerRange) => string;
16
+ export type YearPickerClassNames = {
17
+ root?: string;
18
+ header?: string;
19
+ headerControls?: string;
20
+ headerControl?: string;
21
+ headerPreviousControl?: string;
22
+ headerNextControl?: string;
23
+ headerLabel?: string;
24
+ grid?: string;
25
+ year?: string;
26
+ yearActive?: string;
27
+ };
28
+ export interface YearPickerProps extends Omit<ComponentPropsWithoutRef<"div">, "onChange"> {
29
+ /** Active year (controlled). */
30
+ value?: YearPickerValue;
31
+ /** Initial active year (uncontrolled). */
32
+ defaultValue?: YearPickerValue;
33
+ /** Callback called when active year changes. */
34
+ onChange?: YearPickerOnChange;
35
+ /** Minimum selectable year. */
36
+ minYear?: number;
37
+ /** Maximum selectable year. */
38
+ maxYear?: number;
39
+ /** Years rendered in one page @default `9` */
40
+ yearsPerPage?: number;
41
+ /** Grid columns used by the year list @default `3` */
42
+ columns?: number;
43
+ /** Whether all year controls are disabled @default `false` */
44
+ disabled?: boolean;
45
+ /** Component size @default `md` */
46
+ size?: YearPickerSize;
47
+ /** Border radius @default `default` */
48
+ radius?: YearPickerRadius;
49
+ /** Custom year label renderer. */
50
+ getYearLabel?: YearPickerGetYearLabel;
51
+ /** Custom aria-label generator for year buttons. */
52
+ getYearAriaLabel?: YearPickerGetYearAriaLabel;
53
+ /** Custom header label renderer for visible range. */
54
+ getHeaderLabel?: YearPickerGetHeaderLabel;
55
+ /** Custom aria-label generator for previous/next controls. */
56
+ getNavigationAriaLabel?: YearPickerGetNavigationAriaLabel;
57
+ /** Used for editing root class name. */
58
+ className?: string;
59
+ /** Used for styling different parts of the component. */
60
+ classNames?: YearPickerClassNames;
61
+ }
62
+ export interface YearPickerFactoryPayload extends FactoryPayload {
63
+ props: YearPickerProps;
64
+ ref: HTMLDivElement;
65
+ compound: {
66
+ configure: ReturnType<typeof createComponentConfig<YearPickerProps>>;
67
+ classNames: ReturnType<typeof createClassNamesConfig<YearPickerClassNames>>;
68
+ };
69
+ }
70
+ //# sourceMappingURL=year-picker.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"year-picker.types.d.ts","sourceRoot":"","sources":["../../../src/components/year-picker/year-picker.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC5D,OAAO,EACH,eAAe,EACf,aAAa,EACb,sBAAsB,EACtB,qBAAqB,EACrB,cAAc,EACjB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC;AACrC,MAAM,MAAM,cAAc,GAAG,aAAa,CAAC;AAC3C,MAAM,MAAM,gBAAgB,GAAG,eAAe,CAAC;AAE/C,MAAM,MAAM,6BAA6B,GAAG,UAAU,GAAG,MAAM,CAAC;AAEhE,MAAM,MAAM,eAAe,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;AAEjE,MAAM,MAAM,sBAAsB,GAAG,CAAC,IAAI,EAAE,eAAe,KAAK,SAAS,CAAC;AAE1E,MAAM,MAAM,0BAA0B,GAAG,CACrC,IAAI,EAAE,eAAe,EACrB,QAAQ,EAAE,OAAO,KAChB,MAAM,CAAC;AAEZ,MAAM,MAAM,wBAAwB,GAAG,CAAC,KAAK,EAAE,eAAe,KAAK,SAAS,CAAC;AAE7E,MAAM,MAAM,gCAAgC,GAAG,CAC3C,SAAS,EAAE,6BAA6B,EACxC,KAAK,EAAE,eAAe,KACrB,MAAM,CAAC;AAEZ,MAAM,MAAM,oBAAoB,GAAG;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,WAAW,eACb,SAAQ,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;IACzD,gCAAgC;IAChC,KAAK,CAAC,EAAE,eAAe,CAAC;IAExB,0CAA0C;IAC1C,YAAY,CAAC,EAAE,eAAe,CAAC;IAE/B,gDAAgD;IAChD,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAE9B,+BAA+B;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,+BAA+B;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,8CAA8C;IAC9C,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,sDAAsD;IACtD,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,mCAAmC;IACnC,IAAI,CAAC,EAAE,cAAc,CAAC;IAEtB,uCAAuC;IACvC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAE1B,kCAAkC;IAClC,YAAY,CAAC,EAAE,sBAAsB,CAAC;IAEtC,oDAAoD;IACpD,gBAAgB,CAAC,EAAE,0BAA0B,CAAC;IAE9C,sDAAsD;IACtD,cAAc,CAAC,EAAE,wBAAwB,CAAC;IAE1C,8DAA8D;IAC9D,sBAAsB,CAAC,EAAE,gCAAgC,CAAC;IAE1D,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,yDAAyD;IACzD,UAAU,CAAC,EAAE,oBAAoB,CAAC;CACrC;AAED,MAAM,WAAW,wBAAyB,SAAQ,cAAc;IAC5D,KAAK,EAAE,eAAe,CAAC;IACvB,GAAG,EAAE,cAAc,CAAC;IACpB,QAAQ,EAAE;QACN,SAAS,EAAE,UAAU,CAAC,OAAO,qBAAqB,CAAC,eAAe,CAAC,CAAC,CAAC;QACrE,UAAU,EAAE,UAAU,CAAC,OAAO,sBAAsB,CAAC,oBAAoB,CAAC,CAAC,CAAC;KAC/E,CAAC;CACL"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,3 @@
1
+ import "./style.css";
2
+ export * from "./components";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAC;AAErB,cAAc,cAAc,CAAC"}
package/build/index.js ADDED
@@ -0,0 +1,2 @@
1
+ import "./style.css";
2
+ export * from "./components";
@@ -0,0 +1,2 @@
1
+ /*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */
2
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style:solid;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height:calc(1.5/1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--font-weight-medium:500;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.visible{visibility:visible}.relative{position:relative}.z-50{z-index:50}.flex{display:flex}.grid{display:grid}.inline{display:inline}.inline-flex{display:inline-flex}.size-6{width:calc(var(--spacing)*6);height:calc(var(--spacing)*6)}.size-7{width:calc(var(--spacing)*7);height:calc(var(--spacing)*7)}.size-8{width:calc(var(--spacing)*8);height:calc(var(--spacing)*8)}.size-9{width:calc(var(--spacing)*9);height:calc(var(--spacing)*9)}.size-10{width:calc(var(--spacing)*10);height:calc(var(--spacing)*10)}.h-7{height:calc(var(--spacing)*7)}.h-8{height:calc(var(--spacing)*8)}.h-9{height:calc(var(--spacing)*9)}.h-10{height:calc(var(--spacing)*10)}.h-11{height:calc(var(--spacing)*11)}.w-60{width:calc(var(--spacing)*60)}.w-72{width:calc(var(--spacing)*72)}.w-80{width:calc(var(--spacing)*80)}.w-full{width:100%}.min-w-0{min-width:calc(var(--spacing)*0)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.rotate-180{rotate:180deg}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.border{border-style:var(--tw-border-style);border-width:1px}.border-\[var\(--refraktor-border\)\]{border-color:var(--refraktor-border)}.bg-\[var\(--refraktor-bg\)\]{background-color:var(--refraktor-bg)}.bg-\[var\(--refraktor-primary\)\]{background-color:var(--refraktor-primary)}.bg-transparent{background-color:#0000}.p-0{padding:calc(var(--spacing)*0)}.p-2{padding:calc(var(--spacing)*2)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-1\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.text-center{text-align:center}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.text-\[var\(--refraktor-primary-text\)\]{color:var(--refraktor-primary-text)}.text-\[var\(--refraktor-text\)\]{color:var(--refraktor-text)}.text-\[var\(--refraktor-text-secondary\)\]{color:var(--refraktor-text-secondary)}.opacity-50{opacity:.5}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-\[var\(--refraktor-primary\)\]{--tw-ring-color:var(--refraktor-primary)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.hover\:bg-\[var\(--refraktor-bg-hover\)\]:hover{background-color:var(--refraktor-bg-hover)}.hover\:bg-\[var\(--refraktor-primary\)\]:hover{background-color:var(--refraktor-primary)}}.focus-visible\:outline:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.focus-visible\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\:outline-offset-2:focus-visible{outline-offset:2px}.focus-visible\:outline-\[var\(--refraktor-primary\)\]:focus-visible{outline-color:var(--refraktor-primary)}.data-\[disabled\=true\]\:pointer-events-none[data-disabled=true]{pointer-events:none}.data-\[disabled\=true\]\:cursor-not-allowed[data-disabled=true]{cursor:not-allowed}.data-\[disabled\=true\]\:opacity-50[data-disabled=true]{opacity:.5}}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@refraktor/dates",
3
+ "version": "0.0.1",
4
+ "license": "MIT",
5
+ "publishConfig": {
6
+ "access": "public"
7
+ },
8
+ "main": "./build/index.js",
9
+ "module": "./build/index.js",
10
+ "types": "./build/index.d.ts",
11
+ "exports": {
12
+ ".": {
13
+ "types": "./build/index.d.ts",
14
+ "import": "./build/index.js"
15
+ },
16
+ "./style.css": "./build/style.css"
17
+ },
18
+ "scripts": {
19
+ "build": "tsc && tailwindcss -i src/style.css -o build/style.css --minify",
20
+ "dev": "concurrently \"tsc --watch\" \"tailwindcss -i src/style.css -o build/style.css --watch\"",
21
+ "test": "vitest"
22
+ },
23
+ "peerDependencies": {
24
+ "react": ">=18.0.0",
25
+ "react-dom": ">=18.0.0",
26
+ "dayjs": "^1.11.19",
27
+ "@refraktor/core": "0.0.1",
28
+ "@refraktor/utils": "0.0.1"
29
+ },
30
+ "devDependencies": {
31
+ "typescript": "^5.9.3"
32
+ },
33
+ "dependencies": {
34
+ "@floating-ui/react": "^0.27.6",
35
+ "clsx": "^2.1.1",
36
+ "tailwind-merge": "^3.4.0"
37
+ }
38
+ }