@chayns-ui/core 0.11.1 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/dist/badge.css +2 -2
  2. package/dist/components/badge/Badge.d.ts.map +1 -1
  3. package/dist/components/badge/Badge.js +2 -1
  4. package/dist/components/badge/Badge.js.map +1 -1
  5. package/dist/components/badge/Badge.types.d.ts +5 -0
  6. package/dist/components/badge/Badge.types.d.ts.map +1 -1
  7. package/dist/components/badge/Badge.types.js.map +1 -1
  8. package/dist/components/date-time-picker/DateTimePicker.d.ts.map +1 -1
  9. package/dist/components/date-time-picker/DateTimePicker.js +63 -46
  10. package/dist/components/date-time-picker/DateTimePicker.js.map +1 -1
  11. package/dist/components/date-time-picker/DateTimePicker.types.d.ts +4 -1
  12. package/dist/components/date-time-picker/DateTimePicker.types.d.ts.map +1 -1
  13. package/dist/components/date-time-picker/DateTimePicker.types.js +6 -1
  14. package/dist/components/date-time-picker/DateTimePicker.types.js.map +1 -1
  15. package/dist/components/date-time-picker/hooks/useDateTimePickerValue.d.ts +1 -1
  16. package/dist/components/date-time-picker/hooks/useDateTimePickerValue.d.ts.map +1 -1
  17. package/dist/components/date-time-picker/hooks/useDateTimePickerValue.js +14 -13
  18. package/dist/components/date-time-picker/hooks/useDateTimePickerValue.js.map +1 -1
  19. package/dist/components/date-time-picker/sizer/PickerSizer.d.ts +2 -2
  20. package/dist/components/date-time-picker/sizer/PickerSizer.d.ts.map +1 -1
  21. package/dist/components/date-time-picker/sizer/PickerSizer.js +5 -2
  22. package/dist/components/date-time-picker/sizer/PickerSizer.js.map +1 -1
  23. package/dist/components/date-time-picker/wheel/Wheel.d.ts +2 -1
  24. package/dist/components/date-time-picker/wheel/Wheel.d.ts.map +1 -1
  25. package/dist/components/date-time-picker/wheel/Wheel.js +6 -2
  26. package/dist/components/date-time-picker/wheel/Wheel.js.map +1 -1
  27. package/dist/date-time-picker.css +53 -8
  28. package/dist/split-button.css +2 -0
  29. package/package.json +1 -1
package/dist/badge.css CHANGED
@@ -52,7 +52,7 @@
52
52
  }
53
53
 
54
54
  @media (hover: hover) {
55
- .chayns-badge:hover {
55
+ .chayns-badge:not(.chayns-badge--hover-disabled):hover {
56
56
  transform: translateY(-2px);
57
57
  filter: saturate(1.18);
58
58
  box-shadow: 0 5px 12px -5px rgb(16 40 46 / 30%);
@@ -64,7 +64,7 @@
64
64
  transition: none;
65
65
  }
66
66
 
67
- .chayns-badge:hover {
67
+ .chayns-badge:not(.chayns-badge--hover-disabled):hover {
68
68
  transform: none;
69
69
  }
70
70
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Badge.d.ts","sourceRoot":"","sources":["../../../src/components/badge/Badge.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,QAAA,MAAM,KAAK,qHAwBT,CAAC;AAIH,eAAe,KAAK,CAAC"}
1
+ {"version":3,"file":"Badge.d.ts","sourceRoot":"","sources":["../../../src/components/badge/Badge.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,QAAA,MAAM,KAAK,qHAiCT,CAAC;AAIH,eAAe,KAAK,CAAC"}
@@ -1,9 +1,10 @@
1
1
  import { forwardRef } from "react";
2
2
  import { jsx } from "react/jsx-runtime";
3
3
  //#region src/components/badge/Badge.tsx
4
- var Badge = forwardRef(function Badge({ "aria-label": ariaLabel, children, className, size = "sm", tone = "neutral", ...spanProps }, ref) {
4
+ var Badge = forwardRef(function Badge({ "aria-label": ariaLabel, children, className, disableHover = false, size = "sm", tone = "neutral", ...spanProps }, ref) {
5
5
  const resolvedClassName = [
6
6
  "chayns-badge",
7
+ disableHover && "chayns-badge--hover-disabled",
7
8
  `chayns-badge--${tone}`,
8
9
  `chayns-badge--${size}`,
9
10
  className
@@ -1 +1 @@
1
- {"version":3,"file":"Badge.js","names":[],"sources":["../../../src/components/badge/Badge.tsx"],"sourcesContent":["import { forwardRef } from 'react';\n\nimport type { BadgeProps } from './Badge.types.js';\n\nconst Badge = forwardRef<HTMLSpanElement, BadgeProps>(function Badge(\n { 'aria-label': ariaLabel, children, className, size = 'sm', tone = 'neutral', ...spanProps },\n ref,\n) {\n const resolvedClassName = [\n 'chayns-badge',\n `chayns-badge--${tone}`,\n `chayns-badge--${size}`,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <span\n {...spanProps}\n aria-label={ariaLabel}\n className={resolvedClassName}\n ref={ref}\n role={ariaLabel === undefined ? undefined : 'status'}\n >\n <span className=\"chayns-badge__content\">{children}</span>\n </span>\n );\n});\n\nBadge.displayName = 'Badge';\n\nexport default Badge;\n"],"mappings":";;;AAIA,IAAM,QAAQ,WAAwC,SAAS,MAC7D,EAAE,cAAc,WAAW,UAAU,WAAW,OAAO,MAAM,OAAO,WAAW,GAAG,aAClF,KACA;CACA,MAAM,oBAAoB;EACxB;EACA,iBAAiB;EACjB,iBAAiB;EACjB;CACF,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;CAEX,OACE,oBAAC,QAAD;EACE,GAAI;EACJ,cAAY;EACZ,WAAW;EACN;EACL,MAAM,cAAc,KAAA,IAAY,KAAA,IAAY;EAE5C,UAAA,oBAAC,QAAD;GAAM,WAAU;GAAyB;EAAe,CAAA;CACpD,CAAA;AAEV,CAAC;AAED,MAAM,cAAc"}
1
+ {"version":3,"file":"Badge.js","names":[],"sources":["../../../src/components/badge/Badge.tsx"],"sourcesContent":["import { forwardRef } from 'react';\n\nimport type { BadgeProps } from './Badge.types.js';\n\nconst Badge = forwardRef<HTMLSpanElement, BadgeProps>(function Badge(\n {\n 'aria-label': ariaLabel,\n children,\n className,\n disableHover = false,\n size = 'sm',\n tone = 'neutral',\n ...spanProps\n },\n ref,\n) {\n const resolvedClassName = [\n 'chayns-badge',\n disableHover && 'chayns-badge--hover-disabled',\n `chayns-badge--${tone}`,\n `chayns-badge--${size}`,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <span\n {...spanProps}\n aria-label={ariaLabel}\n className={resolvedClassName}\n ref={ref}\n role={ariaLabel === undefined ? undefined : 'status'}\n >\n <span className=\"chayns-badge__content\">{children}</span>\n </span>\n );\n});\n\nBadge.displayName = 'Badge';\n\nexport default Badge;\n"],"mappings":";;;AAIA,IAAM,QAAQ,WAAwC,SAAS,MAC7D,EACE,cAAc,WACd,UACA,WACA,eAAe,OACf,OAAO,MACP,OAAO,WACP,GAAG,aAEL,KACA;CACA,MAAM,oBAAoB;EACxB;EACA,gBAAgB;EAChB,iBAAiB;EACjB,iBAAiB;EACjB;CACF,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;CAEX,OACE,oBAAC,QAAD;EACE,GAAI;EACJ,cAAY;EACZ,WAAW;EACN;EACL,MAAM,cAAc,KAAA,IAAY,KAAA,IAAY;EAE5C,UAAA,oBAAC,QAAD;GAAM,WAAU;GAAyB;EAAe,CAAA;CACpD,CAAA;AAEV,CAAC;AAED,MAAM,cAAc"}
@@ -18,6 +18,11 @@ export declare const BADGE_SIZES: readonly ["sm", "md"];
18
18
  export type BadgeSize = (typeof BADGE_SIZES)[number];
19
19
  export interface BadgeProps extends Omit<ComponentPropsWithRef<'span'>, 'children' | 'role'> {
20
20
  children: Exclude<ReactNode, boolean | null | undefined>;
21
+ /**
22
+ * @description Suppresses the decorative Badge hover treatment while
23
+ * preserving its non-interactive status semantics.
24
+ */
25
+ disableHover?: boolean;
21
26
  tone?: BadgeTone;
22
27
  size?: BadgeSize;
23
28
  'aria-label'?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"Badge.types.d.ts","sourceRoot":"","sources":["../../../src/components/badge/Badge.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE9D,2FAA2F;AAC3F,oBAAY,UAAU;IACpB,KAAK,OAAO;IACZ,MAAM,OAAO;CACd;AAED,2FAA2F;AAC3F,oBAAY,UAAU;IACpB,OAAO,YAAY;IACnB,MAAM,WAAW;IACjB,OAAO,YAAY;IACnB,OAAO,YAAY;IACnB,MAAM,WAAW;CAClB;AAED,eAAO,MAAM,WAAW,gEAAiE,CAAC;AAC1F,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAErD,eAAO,MAAM,WAAW,uBAAwB,CAAC;AACjD,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAErD,MAAM,WAAW,UAAW,SAAQ,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;IAC1F,QAAQ,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IACzD,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,KAAK,CAAC;CACd"}
1
+ {"version":3,"file":"Badge.types.d.ts","sourceRoot":"","sources":["../../../src/components/badge/Badge.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE9D,2FAA2F;AAC3F,oBAAY,UAAU;IACpB,KAAK,OAAO;IACZ,MAAM,OAAO;CACd;AAED,2FAA2F;AAC3F,oBAAY,UAAU;IACpB,OAAO,YAAY;IACnB,MAAM,WAAW;IACjB,OAAO,YAAY;IACnB,OAAO,YAAY;IACnB,MAAM,WAAW;CAClB;AAED,eAAO,MAAM,WAAW,gEAAiE,CAAC;AAC1F,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAErD,eAAO,MAAM,WAAW,uBAAwB,CAAC;AACjD,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAErD,MAAM,WAAW,UAAW,SAAQ,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;IAC1F,QAAQ,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IACzD;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,KAAK,CAAC;CACd"}
@@ -1 +1 @@
1
- {"version":3,"file":"Badge.types.js","names":[],"sources":["../../../src/components/badge/Badge.types.ts"],"sourcesContent":["import type { ComponentPropsWithRef, ReactNode } from 'react';\n\n/** Named configuration values; existing literal props and value lists remain supported. */\nexport enum BadgeSizes {\n Small = 'sm',\n Medium = 'md',\n}\n\n/** Named configuration values; existing literal props and value lists remain supported. */\nexport enum BadgeTones {\n Neutral = 'neutral',\n Accent = 'accent',\n Success = 'success',\n Warning = 'warning',\n Danger = 'danger',\n}\n\nexport const BADGE_TONES = ['neutral', 'accent', 'success', 'warning', 'danger'] as const;\nexport type BadgeTone = (typeof BADGE_TONES)[number];\n\nexport const BADGE_SIZES = ['sm', 'md'] as const;\nexport type BadgeSize = (typeof BADGE_SIZES)[number];\n\nexport interface BadgeProps extends Omit<ComponentPropsWithRef<'span'>, 'children' | 'role'> {\n children: Exclude<ReactNode, boolean | null | undefined>;\n tone?: BadgeTone;\n size?: BadgeSize;\n 'aria-label'?: string;\n role?: never;\n}\n"],"mappings":";;AAGA,IAAY,aAAL,yBAAA,YAAA;CACL,WAAA,WAAA;CACA,WAAA,YAAA;;AACF,EAAA,CAAA,CAAA;;AAGA,IAAY,aAAL,yBAAA,YAAA;CACL,WAAA,aAAA;CACA,WAAA,YAAA;CACA,WAAA,aAAA;CACA,WAAA,aAAA;CACA,WAAA,YAAA;;AACF,EAAA,CAAA,CAAA;AAEA,IAAa,cAAc;CAAC;CAAW;CAAU;CAAW;CAAW;AAAQ;AAG/E,IAAa,cAAc,CAAC,MAAM,IAAI"}
1
+ {"version":3,"file":"Badge.types.js","names":[],"sources":["../../../src/components/badge/Badge.types.ts"],"sourcesContent":["import type { ComponentPropsWithRef, ReactNode } from 'react';\n\n/** Named configuration values; existing literal props and value lists remain supported. */\nexport enum BadgeSizes {\n Small = 'sm',\n Medium = 'md',\n}\n\n/** Named configuration values; existing literal props and value lists remain supported. */\nexport enum BadgeTones {\n Neutral = 'neutral',\n Accent = 'accent',\n Success = 'success',\n Warning = 'warning',\n Danger = 'danger',\n}\n\nexport const BADGE_TONES = ['neutral', 'accent', 'success', 'warning', 'danger'] as const;\nexport type BadgeTone = (typeof BADGE_TONES)[number];\n\nexport const BADGE_SIZES = ['sm', 'md'] as const;\nexport type BadgeSize = (typeof BADGE_SIZES)[number];\n\nexport interface BadgeProps extends Omit<ComponentPropsWithRef<'span'>, 'children' | 'role'> {\n children: Exclude<ReactNode, boolean | null | undefined>;\n /**\n * @description Suppresses the decorative Badge hover treatment while\n * preserving its non-interactive status semantics.\n */\n disableHover?: boolean;\n tone?: BadgeTone;\n size?: BadgeSize;\n 'aria-label'?: string;\n role?: never;\n}\n"],"mappings":";;AAGA,IAAY,aAAL,yBAAA,YAAA;CACL,WAAA,WAAA;CACA,WAAA,YAAA;;AACF,EAAA,CAAA,CAAA;;AAGA,IAAY,aAAL,yBAAA,YAAA;CACL,WAAA,aAAA;CACA,WAAA,YAAA;CACA,WAAA,aAAA;CACA,WAAA,aAAA;CACA,WAAA,YAAA;;AACF,EAAA,CAAA,CAAA;AAEA,IAAa,cAAc;CAAC;CAAW;CAAU;CAAW;CAAW;AAAQ;AAG/E,IAAa,cAAc,CAAC,MAAM,IAAI"}
@@ -1 +1 @@
1
- {"version":3,"file":"DateTimePicker.d.ts","sourceRoot":"","sources":["../../../src/components/date-time-picker/DateTimePicker.tsx"],"names":[],"mappings":"AAQA,OAAO,EAAiC,KAAK,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEpG,QAAA,MAAM,cAAc,gIA6NlB,CAAC;AAIH,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"DateTimePicker.d.ts","sourceRoot":"","sources":["../../../src/components/date-time-picker/DateTimePicker.tsx"],"names":[],"mappings":"AAQA,OAAO,EAAiC,KAAK,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEpG,QAAA,MAAM,cAAc,gIA2PlB,CAAC;AAIH,eAAe,cAAc,CAAC"}
@@ -9,7 +9,7 @@ import { forwardRef, useEffect, useId, useLayoutEffect, useMemo, useRef, useStat
9
9
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
10
10
  import { createPortal } from "react-dom";
11
11
  //#region src/components/date-time-picker/DateTimePicker.tsx
12
- var DateTimePicker = forwardRef(function DateTimePicker({ className, disabled, id, label, locale, maxDate, minDate, minuteStep = 1, mode = "time", onChange, onClick, onKeyDown, placeholder, value, wheelLabels, ...buttonProps }, ref) {
12
+ var DateTimePicker = forwardRef(function DateTimePicker({ className, disabled, id, inline = false, label, locale, maxDate, minDate, minuteStep = 1, mode = "time", onChange, onClick, onKeyDown, placeholder, value, wheelLabels, ...buttonProps }, ref) {
13
13
  if (!DATE_TIME_PICKER_MINUTE_STEPS.includes(minuteStep)) throw new Error("DateTimePicker minuteStep must be one of: 1, 5, 15, 30.");
14
14
  if (minDate !== void 0 && maxDate !== void 0 && dateAtMidnight(minDate) > dateAtMidnight(maxDate)) throw new Error("DateTimePicker requires minDate to be earlier than or equal to maxDate.");
15
15
  const generatedId = useId();
@@ -20,7 +20,7 @@ var DateTimePicker = forwardRef(function DateTimePicker({ className, disabled, i
20
20
  const triggerRef = useRef(null);
21
21
  const setTriggerElement = useMemo(() => composeNativeRefs(triggerRef, ref), [ref]);
22
22
  const [open, setOpen] = useState(false);
23
- const { displayValue, formattedValue, activeValue, isTwelveHour, hours, minutes, dayPeriods, datePartOrder, dateOptions, dateValue, dateLabel, updateDate, updateTime, updatePeriod, sizingValues } = useDateTimePickerValue({
23
+ const { displayValue, formattedValue, activeValue, isTwelveHour, hours, minutes, dayPeriods, datePartOrder, dateOptions, dateValue, dateLabel, updateDate, updateTime, updatePeriod, sizingValueGroups } = useDateTimePickerValue({
24
24
  value,
25
25
  locale,
26
26
  maxDate,
@@ -70,16 +70,62 @@ var DateTimePicker = forwardRef(function DateTimePicker({ className, disabled, i
70
70
  const resolvedClassName = [
71
71
  "chayns-date-time-picker",
72
72
  `chayns-date-time-picker--${mode}`,
73
+ inline ? "chayns-date-time-picker--inline" : "",
73
74
  open ? "chayns-date-time-picker--open" : "",
74
75
  displayValue !== null ? "chayns-date-time-picker--filled" : ""
75
76
  ].filter(Boolean).join(" ");
77
+ const wheelContent = /* @__PURE__ */ jsxs(Fragment$1, { children: [
78
+ mode !== "time" ? datePartOrder.map((part) => /* @__PURE__ */ jsx(Wheel, {
79
+ ariaLabel: dateLabel(part),
80
+ disabled: disabled ?? false,
81
+ onEscape: inline ? () => void 0 : close,
82
+ onSelect: (nextValue) => updateDate(part, nextValue),
83
+ options: dateOptions(part),
84
+ selected: dateValue(part)
85
+ }, part)) : null,
86
+ mode === "date-time" ? /* @__PURE__ */ jsx("span", {
87
+ "aria-hidden": "true",
88
+ className: "chayns-date-time-picker__date-time-gap"
89
+ }) : null,
90
+ mode !== "date" ? /* @__PURE__ */ jsxs(Fragment$1, { children: [
91
+ /* @__PURE__ */ jsx(Wheel, {
92
+ ariaLabel: wheelLabels.hour,
93
+ disabled: disabled ?? false,
94
+ onEscape: inline ? () => void 0 : close,
95
+ onSelect: (hour) => updateTime("hours", hour),
96
+ options: hours,
97
+ selected: isTwelveHour ? activeValue.getHours() % 12 || 12 : activeValue.getHours()
98
+ }),
99
+ /* @__PURE__ */ jsx(Wheel, {
100
+ ariaLabel: wheelLabels.minute,
101
+ disabled: disabled ?? false,
102
+ onEscape: inline ? () => void 0 : close,
103
+ onSelect: (minute) => updateTime("minutes", minute),
104
+ options: minutes,
105
+ selected: activeValue.getMinutes()
106
+ }),
107
+ isTwelveHour ? /* @__PURE__ */ jsx(Wheel, {
108
+ ariaLabel: wheelLabels.dayPeriod,
109
+ disabled: disabled ?? false,
110
+ onEscape: inline ? () => void 0 : close,
111
+ onSelect: updatePeriod,
112
+ options: dayPeriods,
113
+ selected: activeValue.getHours() >= 12 ? 1 : 0
114
+ }) : null
115
+ ] }) : null
116
+ ] });
76
117
  return /* @__PURE__ */ jsxs("div", {
77
118
  className: resolvedClassName,
78
119
  ref: rootRef,
79
- children: [
120
+ children: [inline ? /* @__PURE__ */ jsx(Fragment$1, { children: /* @__PURE__ */ jsxs("div", {
121
+ "aria-label": label,
122
+ className: "chayns-date-time-picker__wheels",
123
+ role: "group",
124
+ children: [/* @__PURE__ */ jsx("div", { className: "chayns-date-time-picker__selection" }), wheelContent]
125
+ }) }) : /* @__PURE__ */ jsxs(Fragment$1, { children: [
80
126
  /* @__PURE__ */ jsx(PickerSizer, {
81
- values: sizingValues,
82
- placeholder: displayValue === null ? placeholder : null
127
+ placeholder: displayValue === null ? placeholder : null,
128
+ valueGroups: sizingValueGroups
83
129
  }),
84
130
  /* @__PURE__ */ jsx("button", {
85
131
  ...buttonProps,
@@ -109,47 +155,18 @@ var DateTimePicker = forwardRef(function DateTimePicker({ className, disabled, i
109
155
  className: "chayns-date-time-picker__label",
110
156
  htmlFor: triggerId,
111
157
  children: label
112
- }) : null,
113
- open && !disabled && typeof document !== "undefined" ? createPortal(/* @__PURE__ */ jsxs("div", {
114
- "aria-label": label,
115
- className: "chayns-date-time-picker__popup",
116
- id: popupId,
117
- ref: popupRef,
118
- role: "dialog",
119
- children: [/* @__PURE__ */ jsx("div", { className: "chayns-date-time-picker__selection" }), /* @__PURE__ */ jsx("div", {
120
- className: "chayns-date-time-picker__wheels",
121
- children: mode === "time" ? /* @__PURE__ */ jsxs(Fragment$1, { children: [
122
- /* @__PURE__ */ jsx(Wheel, {
123
- ariaLabel: wheelLabels.hour,
124
- onEscape: close,
125
- onSelect: (hour) => updateTime("hours", hour),
126
- options: hours,
127
- selected: isTwelveHour ? activeValue.getHours() % 12 || 12 : activeValue.getHours()
128
- }),
129
- /* @__PURE__ */ jsx(Wheel, {
130
- ariaLabel: wheelLabels.minute,
131
- onEscape: close,
132
- onSelect: (minute) => updateTime("minutes", minute),
133
- options: minutes,
134
- selected: activeValue.getMinutes()
135
- }),
136
- isTwelveHour ? /* @__PURE__ */ jsx(Wheel, {
137
- ariaLabel: wheelLabels.dayPeriod,
138
- onEscape: close,
139
- onSelect: updatePeriod,
140
- options: dayPeriods,
141
- selected: activeValue.getHours() >= 12 ? 1 : 0
142
- }) : null
143
- ] }) : datePartOrder.map((part) => /* @__PURE__ */ jsx(Wheel, {
144
- ariaLabel: dateLabel(part),
145
- onEscape: close,
146
- onSelect: (nextValue) => updateDate(part, nextValue),
147
- options: dateOptions(part),
148
- selected: dateValue(part)
149
- }, part))
150
- })]
151
- }), document.body) : null
152
- ]
158
+ }) : null
159
+ ] }), open && !disabled && !inline && typeof document !== "undefined" ? createPortal(/* @__PURE__ */ jsx("div", {
160
+ "aria-label": label,
161
+ className: ["chayns-date-time-picker__popup", `chayns-date-time-picker__popup--${mode}`].join(" "),
162
+ id: popupId,
163
+ ref: popupRef,
164
+ role: "dialog",
165
+ children: /* @__PURE__ */ jsxs("div", {
166
+ className: "chayns-date-time-picker__wheels",
167
+ children: [/* @__PURE__ */ jsx("div", { className: "chayns-date-time-picker__selection" }), wheelContent]
168
+ })
169
+ }), document.body) : null]
153
170
  });
154
171
  });
155
172
  DateTimePicker.displayName = "DateTimePicker";
@@ -1 +1 @@
1
- {"version":3,"file":"DateTimePicker.js","names":[],"sources":["../../../src/components/date-time-picker/DateTimePicker.tsx"],"sourcesContent":["import { forwardRef, useEffect, useId, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { composeNativeRefs } from '../../utils/native-ref.js';\nimport { useOverlayPosition } from '../../hooks/useOverlayPosition.js';\nimport { dateAtMidnight } from './date-time-picker-utils.js';\nimport { useDateTimePickerValue } from './hooks/useDateTimePickerValue.js';\nimport Wheel from './wheel/Wheel.js';\nimport PickerSizer from './sizer/PickerSizer.js';\nimport { DATE_TIME_PICKER_MINUTE_STEPS, type DateTimePickerProps } from './DateTimePicker.types.js';\n\nconst DateTimePicker = forwardRef<HTMLButtonElement, DateTimePickerProps>(function DateTimePicker(\n {\n className,\n disabled,\n id,\n label,\n locale,\n maxDate,\n minDate,\n minuteStep = 1,\n mode = 'time',\n onChange,\n onClick,\n onKeyDown,\n placeholder,\n value,\n wheelLabels,\n ...buttonProps\n },\n ref,\n) {\n if (!DATE_TIME_PICKER_MINUTE_STEPS.includes(minuteStep)) {\n throw new Error('DateTimePicker minuteStep must be one of: 1, 5, 15, 30.');\n }\n\n if (\n minDate !== undefined &&\n maxDate !== undefined &&\n dateAtMidnight(minDate) > dateAtMidnight(maxDate)\n ) {\n throw new Error('DateTimePicker requires minDate to be earlier than or equal to maxDate.');\n }\n\n const generatedId = useId();\n const triggerId = id ?? generatedId;\n const popupId = `${triggerId}-popup`;\n const rootRef = useRef<HTMLDivElement>(null);\n const popupRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const setTriggerElement = useMemo(() => composeNativeRefs(triggerRef, ref), [ref]);\n const [open, setOpen] = useState(false);\n const {\n displayValue,\n formattedValue,\n activeValue,\n isTwelveHour,\n hours,\n minutes,\n dayPeriods,\n datePartOrder,\n dateOptions,\n dateValue,\n dateLabel,\n updateDate,\n updateTime,\n updatePeriod,\n sizingValues,\n } = useDateTimePickerValue({\n value,\n locale,\n maxDate,\n minDate,\n onChange,\n placeholder,\n wheelLabels,\n minuteStep,\n mode,\n });\n function close() {\n setOpen(false);\n triggerRef.current?.focus();\n }\n\n useLayoutEffect(() => {\n const popup = popupRef.current;\n const trigger = triggerRef.current;\n if (!open || popup === null || trigger === null) return;\n\n const popupStyle = window.getComputedStyle(popup);\n const popupFrameWidth =\n Number.parseFloat(popupStyle.borderInlineStartWidth) +\n Number.parseFloat(popupStyle.borderInlineEndWidth) +\n Number.parseFloat(popupStyle.paddingInlineStart) +\n Number.parseFloat(popupStyle.paddingInlineEnd);\n const wheels = Array.from(\n popup.querySelectorAll<HTMLElement>('.chayns-date-time-picker__wheel'),\n );\n for (const wheel of wheels) {\n const contentWidth = Math.max(\n ...Array.from(\n wheel.querySelectorAll<HTMLElement>('.chayns-date-time-picker__wheel-sizer-option'),\n ).map((option) => option.getBoundingClientRect().width),\n wheel.scrollWidth,\n );\n wheel.style.inlineSize = `${contentWidth}px`;\n wheel.style.flex = `0 0 ${contentWidth}px`;\n }\n const wheelsWidth =\n popup.querySelector<HTMLElement>('.chayns-date-time-picker__wheels')?.scrollWidth ?? 0;\n const triggerWidth = trigger.getBoundingClientRect().width;\n\n if (wheelsWidth === 0 && triggerWidth === 0) return;\n popup.style.inlineSize = `${Math.max(triggerWidth, wheelsWidth + popupFrameWidth)}px`;\n }, [locale, maxDate, minDate, mode, open]);\n\n useOverlayPosition(popupRef, triggerRef.current, open, 'bottom', 4, true);\n\n useEffect(() => {\n if (!open) return undefined;\n function closeOnOutsidePress(event: PointerEvent) {\n if (\n event.target instanceof Node &&\n !rootRef.current?.contains(event.target) &&\n !popupRef.current?.contains(event.target)\n ) {\n close();\n }\n }\n document.addEventListener('pointerdown', closeOnOutsidePress);\n return () => document.removeEventListener('pointerdown', closeOnOutsidePress);\n });\n const resolvedClassName = [\n 'chayns-date-time-picker',\n `chayns-date-time-picker--${mode}`,\n open ? 'chayns-date-time-picker--open' : '',\n displayValue !== null ? 'chayns-date-time-picker--filled' : '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={resolvedClassName} ref={rootRef}>\n <PickerSizer values={sizingValues} placeholder={displayValue === null ? placeholder : null} />\n <button\n {...buttonProps}\n aria-controls={open ? popupId : undefined}\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n aria-label={label}\n className={['chayns-date-time-picker__trigger', className].filter(Boolean).join(' ')}\n disabled={disabled}\n id={triggerId}\n onClick={(event) => {\n onClick?.(event);\n if (!event.defaultPrevented) setOpen((current) => !current);\n }}\n onKeyDown={(event) => {\n onKeyDown?.(event);\n if (event.key === 'Escape' && open && !event.defaultPrevented) {\n event.preventDefault();\n close();\n }\n }}\n ref={setTriggerElement}\n type=\"button\"\n >\n {formattedValue}\n </button>\n {displayValue === null ? (\n <label className=\"chayns-date-time-picker__label\" htmlFor={triggerId}>\n {label}\n </label>\n ) : null}\n {open && !disabled && typeof document !== 'undefined'\n ? createPortal(\n <div\n aria-label={label}\n className=\"chayns-date-time-picker__popup\"\n id={popupId}\n ref={popupRef}\n role=\"dialog\"\n >\n <div className=\"chayns-date-time-picker__selection\" />\n <div className=\"chayns-date-time-picker__wheels\">\n {mode === 'time' ? (\n <>\n <Wheel\n ariaLabel={wheelLabels.hour}\n onEscape={close}\n onSelect={(hour) => updateTime('hours', hour)}\n options={hours}\n selected={\n isTwelveHour ? activeValue.getHours() % 12 || 12 : activeValue.getHours()\n }\n />\n <Wheel\n ariaLabel={wheelLabels.minute}\n onEscape={close}\n onSelect={(minute) => updateTime('minutes', minute)}\n options={minutes}\n selected={activeValue.getMinutes()}\n />\n {isTwelveHour ? (\n <Wheel\n ariaLabel={wheelLabels.dayPeriod}\n onEscape={close}\n onSelect={updatePeriod}\n options={dayPeriods}\n selected={activeValue.getHours() >= 12 ? 1 : 0}\n />\n ) : null}\n </>\n ) : (\n datePartOrder.map((part) => (\n <Wheel\n ariaLabel={dateLabel(part)}\n key={part}\n onEscape={close}\n onSelect={(nextValue) => updateDate(part, nextValue)}\n options={dateOptions(part)}\n selected={dateValue(part)}\n />\n ))\n )}\n </div>\n </div>,\n document.body,\n )\n : null}\n </div>\n );\n});\n\nDateTimePicker.displayName = 'DateTimePicker';\n\nexport default DateTimePicker;\n"],"mappings":"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"}
1
+ {"version":3,"file":"DateTimePicker.js","names":[],"sources":["../../../src/components/date-time-picker/DateTimePicker.tsx"],"sourcesContent":["import { forwardRef, useEffect, useId, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { composeNativeRefs } from '../../utils/native-ref.js';\nimport { useOverlayPosition } from '../../hooks/useOverlayPosition.js';\nimport { dateAtMidnight } from './date-time-picker-utils.js';\nimport { useDateTimePickerValue } from './hooks/useDateTimePickerValue.js';\nimport Wheel from './wheel/Wheel.js';\nimport PickerSizer from './sizer/PickerSizer.js';\nimport { DATE_TIME_PICKER_MINUTE_STEPS, type DateTimePickerProps } from './DateTimePicker.types.js';\n\nconst DateTimePicker = forwardRef<HTMLButtonElement, DateTimePickerProps>(function DateTimePicker(\n {\n className,\n disabled,\n id,\n inline = false,\n label,\n locale,\n maxDate,\n minDate,\n minuteStep = 1,\n mode = 'time',\n onChange,\n onClick,\n onKeyDown,\n placeholder,\n value,\n wheelLabels,\n ...buttonProps\n },\n ref,\n) {\n if (!DATE_TIME_PICKER_MINUTE_STEPS.includes(minuteStep)) {\n throw new Error('DateTimePicker minuteStep must be one of: 1, 5, 15, 30.');\n }\n\n if (\n minDate !== undefined &&\n maxDate !== undefined &&\n dateAtMidnight(minDate) > dateAtMidnight(maxDate)\n ) {\n throw new Error('DateTimePicker requires minDate to be earlier than or equal to maxDate.');\n }\n\n const generatedId = useId();\n const triggerId = id ?? generatedId;\n const popupId = `${triggerId}-popup`;\n const rootRef = useRef<HTMLDivElement>(null);\n const popupRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const setTriggerElement = useMemo(() => composeNativeRefs(triggerRef, ref), [ref]);\n const [open, setOpen] = useState(false);\n const {\n displayValue,\n formattedValue,\n activeValue,\n isTwelveHour,\n hours,\n minutes,\n dayPeriods,\n datePartOrder,\n dateOptions,\n dateValue,\n dateLabel,\n updateDate,\n updateTime,\n updatePeriod,\n sizingValueGroups,\n } = useDateTimePickerValue({\n value,\n locale,\n maxDate,\n minDate,\n onChange,\n placeholder,\n wheelLabels,\n minuteStep,\n mode,\n });\n function close() {\n setOpen(false);\n triggerRef.current?.focus();\n }\n\n useLayoutEffect(() => {\n const popup = popupRef.current;\n const trigger = triggerRef.current;\n if (!open || popup === null || trigger === null) return;\n\n const popupStyle = window.getComputedStyle(popup);\n const popupFrameWidth =\n Number.parseFloat(popupStyle.borderInlineStartWidth) +\n Number.parseFloat(popupStyle.borderInlineEndWidth) +\n Number.parseFloat(popupStyle.paddingInlineStart) +\n Number.parseFloat(popupStyle.paddingInlineEnd);\n const wheels = Array.from(\n popup.querySelectorAll<HTMLElement>('.chayns-date-time-picker__wheel'),\n );\n for (const wheel of wheels) {\n const contentWidth = Math.max(\n ...Array.from(\n wheel.querySelectorAll<HTMLElement>('.chayns-date-time-picker__wheel-sizer-option'),\n ).map((option) => option.getBoundingClientRect().width),\n wheel.scrollWidth,\n );\n wheel.style.inlineSize = `${contentWidth}px`;\n wheel.style.flex = `0 0 ${contentWidth}px`;\n }\n const wheelsWidth =\n popup.querySelector<HTMLElement>('.chayns-date-time-picker__wheels')?.scrollWidth ?? 0;\n const triggerWidth = trigger.getBoundingClientRect().width;\n\n if (wheelsWidth === 0 && triggerWidth === 0) return;\n popup.style.inlineSize = `${Math.max(triggerWidth, wheelsWidth + popupFrameWidth)}px`;\n }, [locale, maxDate, minDate, mode, open]);\n\n useOverlayPosition(popupRef, triggerRef.current, open, 'bottom', 4, true);\n\n useEffect(() => {\n if (!open) return undefined;\n function closeOnOutsidePress(event: PointerEvent) {\n if (\n event.target instanceof Node &&\n !rootRef.current?.contains(event.target) &&\n !popupRef.current?.contains(event.target)\n ) {\n close();\n }\n }\n document.addEventListener('pointerdown', closeOnOutsidePress);\n return () => document.removeEventListener('pointerdown', closeOnOutsidePress);\n });\n const resolvedClassName = [\n 'chayns-date-time-picker',\n `chayns-date-time-picker--${mode}`,\n inline ? 'chayns-date-time-picker--inline' : '',\n open ? 'chayns-date-time-picker--open' : '',\n displayValue !== null ? 'chayns-date-time-picker--filled' : '',\n ]\n .filter(Boolean)\n .join(' ');\n const wheelContent = (\n <>\n {mode !== 'time'\n ? datePartOrder.map((part) => (\n <Wheel\n ariaLabel={dateLabel(part)}\n disabled={disabled ?? false}\n key={part}\n onEscape={inline ? () => undefined : close}\n onSelect={(nextValue) => updateDate(part, nextValue)}\n options={dateOptions(part)}\n selected={dateValue(part)}\n />\n ))\n : null}\n {mode === 'date-time' ? (\n <span aria-hidden=\"true\" className=\"chayns-date-time-picker__date-time-gap\" />\n ) : null}\n {mode !== 'date' ? (\n <>\n <Wheel\n ariaLabel={wheelLabels.hour}\n disabled={disabled ?? false}\n onEscape={inline ? () => undefined : close}\n onSelect={(hour) => updateTime('hours', hour)}\n options={hours}\n selected={isTwelveHour ? activeValue.getHours() % 12 || 12 : activeValue.getHours()}\n />\n <Wheel\n ariaLabel={wheelLabels.minute}\n disabled={disabled ?? false}\n onEscape={inline ? () => undefined : close}\n onSelect={(minute) => updateTime('minutes', minute)}\n options={minutes}\n selected={activeValue.getMinutes()}\n />\n {isTwelveHour ? (\n <Wheel\n ariaLabel={wheelLabels.dayPeriod}\n disabled={disabled ?? false}\n onEscape={inline ? () => undefined : close}\n onSelect={updatePeriod}\n options={dayPeriods}\n selected={activeValue.getHours() >= 12 ? 1 : 0}\n />\n ) : null}\n </>\n ) : null}\n </>\n );\n\n return (\n <div className={resolvedClassName} ref={rootRef}>\n {inline ? (\n <>\n <div aria-label={label} className=\"chayns-date-time-picker__wheels\" role=\"group\">\n <div className=\"chayns-date-time-picker__selection\" />\n {wheelContent}\n </div>\n </>\n ) : (\n <>\n <PickerSizer\n placeholder={displayValue === null ? placeholder : null}\n valueGroups={sizingValueGroups}\n />\n <button\n {...buttonProps}\n aria-controls={open ? popupId : undefined}\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n aria-label={label}\n className={['chayns-date-time-picker__trigger', className].filter(Boolean).join(' ')}\n disabled={disabled}\n id={triggerId}\n onClick={(event) => {\n onClick?.(event);\n if (!event.defaultPrevented) setOpen((current) => !current);\n }}\n onKeyDown={(event) => {\n onKeyDown?.(event);\n if (event.key === 'Escape' && open && !event.defaultPrevented) {\n event.preventDefault();\n close();\n }\n }}\n ref={setTriggerElement}\n type=\"button\"\n >\n {formattedValue}\n </button>\n {displayValue === null ? (\n <label className=\"chayns-date-time-picker__label\" htmlFor={triggerId}>\n {label}\n </label>\n ) : null}\n </>\n )}\n {open && !disabled && !inline && typeof document !== 'undefined'\n ? createPortal(\n <div\n aria-label={label}\n className={[\n 'chayns-date-time-picker__popup',\n `chayns-date-time-picker__popup--${mode}`,\n ].join(' ')}\n id={popupId}\n ref={popupRef}\n role=\"dialog\"\n >\n <div className=\"chayns-date-time-picker__wheels\">\n <div className=\"chayns-date-time-picker__selection\" />\n {wheelContent}\n </div>\n </div>,\n document.body,\n )\n : null}\n </div>\n );\n});\n\nDateTimePicker.displayName = 'DateTimePicker';\n\nexport default DateTimePicker;\n"],"mappings":"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"}
@@ -9,9 +9,10 @@ export declare enum DateTimePickerMinuteSteps {
9
9
  /** Named configuration values; existing literal props and value lists remain supported. */
10
10
  export declare enum DateTimePickerModes {
11
11
  Date = "date",
12
+ DateTime = "date-time",
12
13
  Time = "time"
13
14
  }
14
- export declare const DATE_TIME_PICKER_MODES: readonly ["date", "time"];
15
+ export declare const DATE_TIME_PICKER_MODES: readonly ["date", "date-time", "time"];
15
16
  export declare const DATE_TIME_PICKER_MINUTE_STEPS: readonly [1, 5, 15, 30];
16
17
  export type DateTimePickerMode = (typeof DATE_TIME_PICKER_MODES)[number];
17
18
  export type DateTimePickerMinuteStep = (typeof DATE_TIME_PICKER_MINUTE_STEPS)[number];
@@ -25,6 +26,8 @@ export interface DateTimePickerWheelLabels {
25
26
  }
26
27
  export interface DateTimePickerProps extends Omit<ComponentPropsWithRef<'button'>, 'aria-controls' | 'aria-expanded' | 'aria-haspopup' | 'aria-label' | 'aria-labelledby' | 'children' | 'onChange' | 'type' | 'value'> {
27
28
  label: string;
29
+ /** Renders the wheel content without a trigger button or popup dialog. */
30
+ inline?: boolean;
28
31
  locale: string;
29
32
  minDate?: Date;
30
33
  maxDate?: Date;
@@ -1 +1 @@
1
- {"version":3,"file":"DateTimePicker.types.d.ts","sourceRoot":"","sources":["../../../src/components/date-time-picker/DateTimePicker.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,OAAO,CAAC;AAEnD,2FAA2F;AAC3F,oBAAY,yBAAyB;IACnC,GAAG,IAAI;IACP,IAAI,IAAI;IACR,OAAO,KAAK;IACZ,MAAM,KAAK;CACZ;AAED,2FAA2F;AAC3F,oBAAY,mBAAmB;IAC7B,IAAI,SAAS;IACb,IAAI,SAAS;CACd;AAED,eAAO,MAAM,sBAAsB,2BAA4B,CAAC;AAChE,eAAO,MAAM,6BAA6B,yBAA0B,CAAC;AAErE,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC;AACzE,MAAM,MAAM,wBAAwB,GAAG,CAAC,OAAO,6BAA6B,CAAC,CAAC,MAAM,CAAC,CAAC;AAEtF,MAAM,WAAW,yBAAyB;IACxC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAoB,SAAQ,IAAI,CAC/C,qBAAqB,CAAC,QAAQ,CAAC,EAC7B,eAAe,GACf,eAAe,GACf,eAAe,GACf,YAAY,GACZ,iBAAiB,GACjB,UAAU,GACV,UAAU,GACV,MAAM,GACN,OAAO,CACV;IACC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,UAAU,CAAC,EAAE,wBAAwB,CAAC;IACtC,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAC1B,QAAQ,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,IAAI,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,WAAW,EAAE,yBAAyB,CAAC;CACxC"}
1
+ {"version":3,"file":"DateTimePicker.types.d.ts","sourceRoot":"","sources":["../../../src/components/date-time-picker/DateTimePicker.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,OAAO,CAAC;AAEnD,2FAA2F;AAC3F,oBAAY,yBAAyB;IACnC,GAAG,IAAI;IACP,IAAI,IAAI;IACR,OAAO,KAAK;IACZ,MAAM,KAAK;CACZ;AAED,2FAA2F;AAC3F,oBAAY,mBAAmB;IAC7B,IAAI,SAAS;IACb,QAAQ,cAAc;IACtB,IAAI,SAAS;CACd;AAED,eAAO,MAAM,sBAAsB,wCAAyC,CAAC;AAC7E,eAAO,MAAM,6BAA6B,yBAA0B,CAAC;AAErE,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC;AACzE,MAAM,MAAM,wBAAwB,GAAG,CAAC,OAAO,6BAA6B,CAAC,CAAC,MAAM,CAAC,CAAC;AAEtF,MAAM,WAAW,yBAAyB;IACxC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAoB,SAAQ,IAAI,CAC/C,qBAAqB,CAAC,QAAQ,CAAC,EAC7B,eAAe,GACf,eAAe,GACf,eAAe,GACf,YAAY,GACZ,iBAAiB,GACjB,UAAU,GACV,UAAU,GACV,MAAM,GACN,OAAO,CACV;IACC,KAAK,EAAE,MAAM,CAAC;IACd,0EAA0E;IAC1E,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,UAAU,CAAC,EAAE,wBAAwB,CAAC;IACtC,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAC1B,QAAQ,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,IAAI,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,WAAW,EAAE,yBAAyB,CAAC;CACxC"}
@@ -10,10 +10,15 @@ var DateTimePickerMinuteSteps = /* @__PURE__ */ function(DateTimePickerMinuteSte
10
10
  /** Named configuration values; existing literal props and value lists remain supported. */
11
11
  var DateTimePickerModes = /* @__PURE__ */ function(DateTimePickerModes) {
12
12
  DateTimePickerModes["Date"] = "date";
13
+ DateTimePickerModes["DateTime"] = "date-time";
13
14
  DateTimePickerModes["Time"] = "time";
14
15
  return DateTimePickerModes;
15
16
  }({});
16
- var DATE_TIME_PICKER_MODES = ["date", "time"];
17
+ var DATE_TIME_PICKER_MODES = [
18
+ "date",
19
+ "date-time",
20
+ "time"
21
+ ];
17
22
  var DATE_TIME_PICKER_MINUTE_STEPS = [
18
23
  1,
19
24
  5,
@@ -1 +1 @@
1
- {"version":3,"file":"DateTimePicker.types.js","names":[],"sources":["../../../src/components/date-time-picker/DateTimePicker.types.ts"],"sourcesContent":["import type { ComponentPropsWithRef } from 'react';\n\n/** Named configuration values; existing literal props and value lists remain supported. */\nexport enum DateTimePickerMinuteSteps {\n One = 1,\n Five = 5,\n Fifteen = 15,\n Thirty = 30,\n}\n\n/** Named configuration values; existing literal props and value lists remain supported. */\nexport enum DateTimePickerModes {\n Date = 'date',\n Time = 'time',\n}\n\nexport const DATE_TIME_PICKER_MODES = ['date', 'time'] as const;\nexport const DATE_TIME_PICKER_MINUTE_STEPS = [1, 5, 15, 30] as const;\n\nexport type DateTimePickerMode = (typeof DATE_TIME_PICKER_MODES)[number];\nexport type DateTimePickerMinuteStep = (typeof DATE_TIME_PICKER_MINUTE_STEPS)[number];\n\nexport interface DateTimePickerWheelLabels {\n day: string;\n dayPeriod: string;\n hour: string;\n minute: string;\n month: string;\n year: string;\n}\n\nexport interface DateTimePickerProps extends Omit<\n ComponentPropsWithRef<'button'>,\n | 'aria-controls'\n | 'aria-expanded'\n | 'aria-haspopup'\n | 'aria-label'\n | 'aria-labelledby'\n | 'children'\n | 'onChange'\n | 'type'\n | 'value'\n> {\n label: string;\n locale: string;\n minDate?: Date;\n maxDate?: Date;\n minuteStep?: DateTimePickerMinuteStep;\n mode?: DateTimePickerMode;\n onChange: (value: Date) => void;\n placeholder: string;\n value: Date | null;\n wheelLabels: DateTimePickerWheelLabels;\n}\n"],"mappings":";;AAGA,IAAY,4BAAL,yBAAA,2BAAA;CACL,0BAAA,0BAAA,SAAA,KAAA;CACA,0BAAA,0BAAA,UAAA,KAAA;CACA,0BAAA,0BAAA,aAAA,MAAA;CACA,0BAAA,0BAAA,YAAA,MAAA;;AACF,EAAA,CAAA,CAAA;;AAGA,IAAY,sBAAL,yBAAA,qBAAA;CACL,oBAAA,UAAA;CACA,oBAAA,UAAA;;AACF,EAAA,CAAA,CAAA;AAEA,IAAa,yBAAyB,CAAC,QAAQ,MAAM;AACrD,IAAa,gCAAgC;CAAC;CAAG;CAAG;CAAI;AAAE"}
1
+ {"version":3,"file":"DateTimePicker.types.js","names":[],"sources":["../../../src/components/date-time-picker/DateTimePicker.types.ts"],"sourcesContent":["import type { ComponentPropsWithRef } from 'react';\n\n/** Named configuration values; existing literal props and value lists remain supported. */\nexport enum DateTimePickerMinuteSteps {\n One = 1,\n Five = 5,\n Fifteen = 15,\n Thirty = 30,\n}\n\n/** Named configuration values; existing literal props and value lists remain supported. */\nexport enum DateTimePickerModes {\n Date = 'date',\n DateTime = 'date-time',\n Time = 'time',\n}\n\nexport const DATE_TIME_PICKER_MODES = ['date', 'date-time', 'time'] as const;\nexport const DATE_TIME_PICKER_MINUTE_STEPS = [1, 5, 15, 30] as const;\n\nexport type DateTimePickerMode = (typeof DATE_TIME_PICKER_MODES)[number];\nexport type DateTimePickerMinuteStep = (typeof DATE_TIME_PICKER_MINUTE_STEPS)[number];\n\nexport interface DateTimePickerWheelLabels {\n day: string;\n dayPeriod: string;\n hour: string;\n minute: string;\n month: string;\n year: string;\n}\n\nexport interface DateTimePickerProps extends Omit<\n ComponentPropsWithRef<'button'>,\n | 'aria-controls'\n | 'aria-expanded'\n | 'aria-haspopup'\n | 'aria-label'\n | 'aria-labelledby'\n | 'children'\n | 'onChange'\n | 'type'\n | 'value'\n> {\n label: string;\n /** Renders the wheel content without a trigger button or popup dialog. */\n inline?: boolean;\n locale: string;\n minDate?: Date;\n maxDate?: Date;\n minuteStep?: DateTimePickerMinuteStep;\n mode?: DateTimePickerMode;\n onChange: (value: Date) => void;\n placeholder: string;\n value: Date | null;\n wheelLabels: DateTimePickerWheelLabels;\n}\n"],"mappings":";;AAGA,IAAY,4BAAL,yBAAA,2BAAA;CACL,0BAAA,0BAAA,SAAA,KAAA;CACA,0BAAA,0BAAA,UAAA,KAAA;CACA,0BAAA,0BAAA,aAAA,MAAA;CACA,0BAAA,0BAAA,YAAA,MAAA;;AACF,EAAA,CAAA,CAAA;;AAGA,IAAY,sBAAL,yBAAA,qBAAA;CACL,oBAAA,UAAA;CACA,oBAAA,cAAA;CACA,oBAAA,UAAA;;AACF,EAAA,CAAA,CAAA;AAEA,IAAa,yBAAyB;CAAC;CAAQ;CAAa;AAAM;AAClE,IAAa,gCAAgC;CAAC;CAAG;CAAG;CAAI;AAAE"}
@@ -6,7 +6,7 @@ type ValueProps = Pick<DateTimePickerProps, 'value' | 'locale' | 'onChange' | 'p
6
6
  };
7
7
  export declare function useDateTimePickerValue({ value, locale, maxDate, minDate, onChange, placeholder, wheelLabels, minuteStep, mode, }: ValueProps): {
8
8
  displayValue: Date | null;
9
- sizingValues: string[];
9
+ sizingValueGroups: string[][];
10
10
  formattedValue: string;
11
11
  activeValue: Date;
12
12
  isTwelveHour: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"useDateTimePickerValue.d.ts","sourceRoot":"","sources":["../../../../src/components/date-time-picker/hooks/useDateTimePickerValue.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,KAAK,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC;AAC9C,KAAK,UAAU,GAAG,IAAI,CACpB,mBAAmB,EACnB,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,aAAa,GAAG,aAAa,CAChE,GACC,QAAQ,CAAC,IAAI,CAAC,mBAAmB,EAAE,YAAY,GAAG,MAAM,CAAC,CAAC,GAAG;IAC3D,OAAO,EAAE,IAAI,GAAG,SAAS,CAAC;IAC1B,OAAO,EAAE,IAAI,GAAG,SAAS,CAAC;CAC3B,CAAC;AAEJ,wBAAgB,sBAAsB,CAAC,EACrC,KAAK,EACL,MAAM,EACN,OAAO,EACP,OAAO,EACP,QAAQ,EACR,WAAW,EACX,WAAW,EACX,UAAU,EACV,IAAI,GACL,EAAE,UAAU;;;;;;;;;;;;;;;;;;;wBAsJgB,QAAQ;;;;sBAMV,QAAQ;sBAYR,QAAQ;uBAhHP,QAAQ,aAAa,MAAM;uBAjB3B,OAAO,GAAG,SAAS,aAAa,MAAM;2BAWlC,MAAM;EA4IrC"}
1
+ {"version":3,"file":"useDateTimePickerValue.d.ts","sourceRoot":"","sources":["../../../../src/components/date-time-picker/hooks/useDateTimePickerValue.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,KAAK,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC;AAC9C,KAAK,UAAU,GAAG,IAAI,CACpB,mBAAmB,EACnB,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,aAAa,GAAG,aAAa,CAChE,GACC,QAAQ,CAAC,IAAI,CAAC,mBAAmB,EAAE,YAAY,GAAG,MAAM,CAAC,CAAC,GAAG;IAC3D,OAAO,EAAE,IAAI,GAAG,SAAS,CAAC;IAC1B,OAAO,EAAE,IAAI,GAAG,SAAS,CAAC;CAC3B,CAAC;AAEJ,wBAAgB,sBAAsB,CAAC,EACrC,KAAK,EACL,MAAM,EACN,OAAO,EACP,OAAO,EACP,QAAQ,EACR,WAAW,EACX,WAAW,EACX,UAAU,EACV,IAAI,GACL,EAAE,UAAU;;;;;;;;;;;;;;;;;;;wBAkKgB,QAAQ;;;;sBAMV,QAAQ;sBAYR,QAAQ;uBA1HP,QAAQ,aAAa,MAAM;uBAjB3B,OAAO,GAAG,SAAS,aAAa,MAAM;2BAWlC,MAAM;EAsJrC"}
@@ -1,5 +1,5 @@
1
1
  import { clampDate, dateAtMidnight, normalizeMinute } from "../date-time-picker-utils.js";
2
- import { useMemo } from "react";
2
+ import { useCallback, useMemo } from "react";
3
3
  //#region src/components/date-time-picker/hooks/useDateTimePickerValue.ts
4
4
  function useDateTimePickerValue({ value, locale, maxDate, minDate, onChange, placeholder, wheelLabels, minuteStep, mode }) {
5
5
  const { hourFormatter, monthFormatter, timeFormatter, dateFormatter, dateOrderFormatter } = useMemo(() => ({
@@ -21,7 +21,7 @@ function useDateTimePickerValue({ value, locale, maxDate, minDate, onChange, pla
21
21
  })
22
22
  }), [locale]);
23
23
  let displayValue = value;
24
- if (value !== null) displayValue = mode === "date" ? clampDate(value, minDate, maxDate) : normalizeMinute(value, minuteStep);
24
+ if (value !== null) displayValue = mode === "time" ? normalizeMinute(value, minuteStep) : normalizeMinute(clampDate(value, minDate, maxDate), minuteStep);
25
25
  const activeValue = displayValue ?? /* @__PURE__ */ new Date();
26
26
  const isTwelveHour = hourFormatter.resolvedOptions().hour12 === true;
27
27
  const years = useMemo(() => {
@@ -31,7 +31,7 @@ function useDateTimePickerValue({ value, locale, maxDate, minDate, onChange, pla
31
31
  return Array.from({ length: last - first + 1 }, (_, index) => first + index);
32
32
  }, [maxDate, minDate]);
33
33
  function emit(nextValue) {
34
- onChange(mode === "date" ? clampDate(nextValue, minDate, maxDate) : nextValue);
34
+ onChange(mode === "time" ? nextValue : clampDate(nextValue, minDate, maxDate));
35
35
  }
36
36
  function updateTime(part, nextValue) {
37
37
  const next = new Date(activeValue);
@@ -57,26 +57,27 @@ function useDateTimePickerValue({ value, locale, maxDate, minDate, onChange, pla
57
57
  emit(next);
58
58
  }
59
59
  let formattedValue = placeholder;
60
+ const formatTime = useCallback((date) => `${timeFormatter.format(date)}${locale.toLowerCase().startsWith("de") ? " Uhr" : ""}`, [locale, timeFormatter]);
60
61
  if (displayValue !== null) {
61
- if (mode === "time") formattedValue = `${timeFormatter.format(displayValue)}${locale.toLowerCase().startsWith("de") ? " Uhr" : ""}`;
62
- else formattedValue = dateFormatter.format(displayValue);
62
+ if (mode === "time") formattedValue = formatTime(displayValue);
63
+ else if (mode === "date") formattedValue = dateFormatter.format(displayValue);
64
+ else formattedValue = `${dateFormatter.format(displayValue)} ${formatTime(displayValue)}`;
63
65
  }
64
66
  const timeSizingValues = useMemo(() => {
65
- if (mode !== "time") return [];
67
+ if (mode === "date") return [];
66
68
  return Array.from({ length: 24 * (60 / minuteStep) }, (_, index) => {
67
69
  const candidate = new Date(2026, 0, 1);
68
70
  candidate.setHours(Math.floor(index / (60 / minuteStep)));
69
71
  candidate.setMinutes(index % (60 / minuteStep) * minuteStep);
70
- return `${timeFormatter.format(candidate)}${locale.toLowerCase().startsWith("de") ? " Uhr" : ""}`;
72
+ return formatTime(candidate);
71
73
  });
72
74
  }, [
73
- locale,
75
+ formatTime,
74
76
  minuteStep,
75
- mode,
76
- timeFormatter
77
+ mode
77
78
  ]);
78
79
  const dateSizingValues = useMemo(() => {
79
- if (mode !== "date") return [];
80
+ if (mode === "time") return [];
80
81
  return years.flatMap((year) => {
81
82
  return Array.from({ length: 12 }, (_, month) => {
82
83
  const first = new Date(year, month, 1);
@@ -95,7 +96,7 @@ function useDateTimePickerValue({ value, locale, maxDate, minDate, onChange, pla
95
96
  mode,
96
97
  years
97
98
  ]);
98
- const sizingValues = mode === "time" ? timeSizingValues : dateSizingValues;
99
+ const sizingValueGroups = mode === "date" ? [dateSizingValues] : mode === "time" ? [timeSizingValues] : [dateSizingValues.map((value) => `${value} `), timeSizingValues];
99
100
  const hours = Array.from({ length: isTwelveHour ? 12 : 24 }, (_, index) => isTwelveHour ? index + 1 : index).map((hour) => ({
100
101
  label: String(hour).padStart(2, "0"),
101
102
  value: hour
@@ -153,7 +154,7 @@ function useDateTimePickerValue({ value, locale, maxDate, minDate, onChange, pla
153
154
  }
154
155
  return {
155
156
  displayValue,
156
- sizingValues,
157
+ sizingValueGroups,
157
158
  formattedValue,
158
159
  activeValue,
159
160
  isTwelveHour,
@@ -1 +1 @@
1
- {"version":3,"file":"useDateTimePickerValue.js","names":[],"sources":["../../../../src/components/date-time-picker/hooks/useDateTimePickerValue.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport { clampDate, dateAtMidnight, normalizeMinute } from '../date-time-picker-utils.js';\nimport type { DateTimePickerProps } from '../DateTimePicker.types.js';\ntype DatePart = 'date' | 'fullYear' | 'month';\ntype ValueProps = Pick<\n DateTimePickerProps,\n 'value' | 'locale' | 'onChange' | 'placeholder' | 'wheelLabels'\n> &\n Required<Pick<DateTimePickerProps, 'minuteStep' | 'mode'>> & {\n minDate: Date | undefined;\n maxDate: Date | undefined;\n };\n\nexport function useDateTimePickerValue({\n value,\n locale,\n maxDate,\n minDate,\n onChange,\n placeholder,\n wheelLabels,\n minuteStep,\n mode,\n}: ValueProps) {\n const { hourFormatter, monthFormatter, timeFormatter, dateFormatter, dateOrderFormatter } =\n useMemo(\n () => ({\n hourFormatter: new Intl.DateTimeFormat(locale, { hour: 'numeric' }),\n monthFormatter: new Intl.DateTimeFormat(locale, { month: 'long' }),\n timeFormatter: new Intl.DateTimeFormat(locale, { hour: 'numeric', minute: '2-digit' }),\n dateFormatter: new Intl.DateTimeFormat(locale, {\n day: 'numeric',\n month: 'long',\n year: 'numeric',\n }),\n dateOrderFormatter: new Intl.DateTimeFormat(locale, {\n day: 'numeric',\n month: 'numeric',\n year: 'numeric',\n }),\n }),\n [locale],\n );\n let displayValue = value;\n if (value !== null) {\n displayValue =\n mode === 'date' ? clampDate(value, minDate, maxDate) : normalizeMinute(value, minuteStep);\n }\n const activeValue = displayValue ?? new Date();\n const isTwelveHour = hourFormatter.resolvedOptions().hour12 === true;\n\n const years = useMemo(() => {\n const today = new Date().getFullYear();\n const first = minDate?.getFullYear() ?? today - 100;\n const last = maxDate?.getFullYear() ?? today + 100;\n return Array.from({ length: last - first + 1 }, (_, index) => first + index);\n }, [maxDate, minDate]);\n\n function emit(nextValue: Date) {\n onChange(mode === 'date' ? clampDate(nextValue, minDate, maxDate) : nextValue);\n }\n\n function updateTime(part: 'hours' | 'minutes', nextValue: number) {\n const next = new Date(activeValue);\n if (part === 'hours') {\n const hour = isTwelveHour ? (nextValue % 12) + (next.getHours() >= 12 ? 12 : 0) : nextValue;\n next.setHours(hour);\n } else {\n next.setMinutes(nextValue);\n }\n emit(next);\n }\n\n function updatePeriod(period: number) {\n const next = new Date(activeValue);\n next.setHours((next.getHours() % 12) + period * 12);\n emit(next);\n }\n\n function updateDate(part: DatePart, nextValue: number) {\n const next = new Date(activeValue);\n const originalDay = next.getDate();\n next.setDate(1);\n if (part === 'fullYear') next.setFullYear(nextValue);\n if (part === 'month') next.setMonth(nextValue);\n if (part === 'date') next.setDate(nextValue);\n if (part !== 'date') {\n next.setDate(\n Math.min(originalDay, new Date(next.getFullYear(), next.getMonth() + 1, 0).getDate()),\n );\n }\n emit(next);\n }\n\n let formattedValue = placeholder;\n if (displayValue !== null) {\n if (mode === 'time')\n formattedValue = `${timeFormatter.format(displayValue)}${locale.toLowerCase().startsWith('de') ? ' Uhr' : ''}`;\n else formattedValue = dateFormatter.format(displayValue);\n }\n const timeSizingValues = useMemo(() => {\n if (mode !== 'time') return [];\n return Array.from({ length: 24 * (60 / minuteStep) }, (_, index) => {\n const candidate = new Date(2026, 0, 1);\n candidate.setHours(Math.floor(index / (60 / minuteStep)));\n candidate.setMinutes((index % (60 / minuteStep)) * minuteStep);\n return `${timeFormatter.format(candidate)}${locale.toLowerCase().startsWith('de') ? ' Uhr' : ''}`;\n });\n }, [locale, minuteStep, mode, timeFormatter]);\n const dateSizingValues = useMemo(() => {\n if (mode !== 'date') return [];\n\n return years.flatMap((year) => {\n const values = Array.from({ length: 12 }, (_, month) => {\n const first = new Date(year, month, 1);\n const last = new Date(year, month + 1, 0);\n if (\n (minDate !== undefined && last < dateAtMidnight(minDate)) ||\n (maxDate !== undefined && first > dateAtMidnight(maxDate))\n ) {\n return undefined;\n }\n\n const candidate = new Date(last);\n if (minDate !== undefined && candidate < dateAtMidnight(minDate)) {\n candidate.setDate(minDate.getDate());\n }\n if (maxDate !== undefined && candidate > dateAtMidnight(maxDate)) {\n candidate.setDate(maxDate.getDate());\n }\n return dateFormatter.format(candidate);\n });\n return values.filter((value): value is string => value !== undefined);\n });\n }, [dateFormatter, maxDate, minDate, mode, years]);\n const sizingValues = mode === 'time' ? timeSizingValues : dateSizingValues;\n\n const hours = Array.from({ length: isTwelveHour ? 12 : 24 }, (_, index) =>\n isTwelveHour ? index + 1 : index,\n ).map((hour) => ({ label: String(hour).padStart(2, '0'), value: hour }));\n const minutes = Array.from({ length: 60 / minuteStep }, (_, index) => {\n const minute = index * minuteStep;\n return { label: String(minute).padStart(2, '0'), value: minute };\n });\n const months = Array.from({ length: 12 }, (_, month) => ({\n label: monthFormatter.format(new Date(2026, month, 1)),\n value: month,\n })).filter((month) => {\n const first = new Date(activeValue.getFullYear(), month.value, 1);\n const last = new Date(activeValue.getFullYear(), month.value + 1, 0);\n return (\n (minDate === undefined || last >= dateAtMidnight(minDate)) &&\n (maxDate === undefined || first <= dateAtMidnight(maxDate))\n );\n });\n const days = Array.from(\n { length: new Date(activeValue.getFullYear(), activeValue.getMonth() + 1, 0).getDate() },\n (_, index) => ({ label: String(index + 1).padStart(2, '0'), value: index + 1 }),\n ).filter((day) => {\n const candidate = new Date(activeValue.getFullYear(), activeValue.getMonth(), day.value);\n return (\n (minDate === undefined || candidate >= dateAtMidnight(minDate)) &&\n (maxDate === undefined || candidate <= dateAtMidnight(maxDate))\n );\n });\n const datePartOrder = dateOrderFormatter.formatToParts(activeValue).flatMap<DatePart>((part) => {\n if (part.type === 'day') return ['date'];\n if (part.type === 'month') return ['month'];\n if (part.type === 'year') return ['fullYear'];\n return [];\n });\n const yearOptions = years.map((year) => ({ label: String(year), value: year }));\n\n function dateOptions(part: DatePart) {\n if (part === 'date') return days;\n if (part === 'month') return months;\n return yearOptions;\n }\n\n function dateValue(part: DatePart) {\n if (part === 'date') return activeValue.getDate();\n if (part === 'month') return activeValue.getMonth();\n return activeValue.getFullYear();\n }\n const dayPeriods = [0, 1].map((period) => ({\n label:\n hourFormatter\n .formatToParts(new Date(2026, 0, 1, period === 0 ? 1 : 13))\n .find((part) => part.type === 'dayPeriod')?.value ?? (period === 0 ? 'AM' : 'PM'),\n value: period,\n }));\n function dateLabel(part: DatePart) {\n if (part === 'date') return wheelLabels.day;\n if (part === 'month') return wheelLabels.month;\n return wheelLabels.year;\n }\n return {\n displayValue,\n sizingValues,\n formattedValue,\n activeValue,\n isTwelveHour,\n hours,\n minutes,\n dayPeriods,\n datePartOrder,\n dateOptions,\n dateValue,\n dateLabel,\n updateDate,\n updateTime,\n updatePeriod,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"useDateTimePickerValue.js","names":[],"sources":["../../../../src/components/date-time-picker/hooks/useDateTimePickerValue.ts"],"sourcesContent":["import { useCallback, useMemo } from 'react';\nimport { clampDate, dateAtMidnight, normalizeMinute } from '../date-time-picker-utils.js';\nimport type { DateTimePickerProps } from '../DateTimePicker.types.js';\ntype DatePart = 'date' | 'fullYear' | 'month';\ntype ValueProps = Pick<\n DateTimePickerProps,\n 'value' | 'locale' | 'onChange' | 'placeholder' | 'wheelLabels'\n> &\n Required<Pick<DateTimePickerProps, 'minuteStep' | 'mode'>> & {\n minDate: Date | undefined;\n maxDate: Date | undefined;\n };\n\nexport function useDateTimePickerValue({\n value,\n locale,\n maxDate,\n minDate,\n onChange,\n placeholder,\n wheelLabels,\n minuteStep,\n mode,\n}: ValueProps) {\n const { hourFormatter, monthFormatter, timeFormatter, dateFormatter, dateOrderFormatter } =\n useMemo(\n () => ({\n hourFormatter: new Intl.DateTimeFormat(locale, { hour: 'numeric' }),\n monthFormatter: new Intl.DateTimeFormat(locale, { month: 'long' }),\n timeFormatter: new Intl.DateTimeFormat(locale, { hour: 'numeric', minute: '2-digit' }),\n dateFormatter: new Intl.DateTimeFormat(locale, {\n day: 'numeric',\n month: 'long',\n year: 'numeric',\n }),\n dateOrderFormatter: new Intl.DateTimeFormat(locale, {\n day: 'numeric',\n month: 'numeric',\n year: 'numeric',\n }),\n }),\n [locale],\n );\n let displayValue = value;\n if (value !== null) {\n displayValue =\n mode === 'time'\n ? normalizeMinute(value, minuteStep)\n : normalizeMinute(clampDate(value, minDate, maxDate), minuteStep);\n }\n const activeValue = displayValue ?? new Date();\n const isTwelveHour = hourFormatter.resolvedOptions().hour12 === true;\n\n const years = useMemo(() => {\n const today = new Date().getFullYear();\n const first = minDate?.getFullYear() ?? today - 100;\n const last = maxDate?.getFullYear() ?? today + 100;\n return Array.from({ length: last - first + 1 }, (_, index) => first + index);\n }, [maxDate, minDate]);\n\n function emit(nextValue: Date) {\n onChange(mode === 'time' ? nextValue : clampDate(nextValue, minDate, maxDate));\n }\n\n function updateTime(part: 'hours' | 'minutes', nextValue: number) {\n const next = new Date(activeValue);\n if (part === 'hours') {\n const hour = isTwelveHour ? (nextValue % 12) + (next.getHours() >= 12 ? 12 : 0) : nextValue;\n next.setHours(hour);\n } else {\n next.setMinutes(nextValue);\n }\n emit(next);\n }\n\n function updatePeriod(period: number) {\n const next = new Date(activeValue);\n next.setHours((next.getHours() % 12) + period * 12);\n emit(next);\n }\n\n function updateDate(part: DatePart, nextValue: number) {\n const next = new Date(activeValue);\n const originalDay = next.getDate();\n next.setDate(1);\n if (part === 'fullYear') next.setFullYear(nextValue);\n if (part === 'month') next.setMonth(nextValue);\n if (part === 'date') next.setDate(nextValue);\n if (part !== 'date') {\n next.setDate(\n Math.min(originalDay, new Date(next.getFullYear(), next.getMonth() + 1, 0).getDate()),\n );\n }\n emit(next);\n }\n\n let formattedValue = placeholder;\n const formatTime = useCallback(\n (date: Date) =>\n `${timeFormatter.format(date)}${locale.toLowerCase().startsWith('de') ? ' Uhr' : ''}`,\n [locale, timeFormatter],\n );\n if (displayValue !== null) {\n if (mode === 'time') formattedValue = formatTime(displayValue);\n else if (mode === 'date') formattedValue = dateFormatter.format(displayValue);\n else formattedValue = `${dateFormatter.format(displayValue)} ${formatTime(displayValue)}`;\n }\n const timeSizingValues = useMemo(() => {\n if (mode === 'date') return [];\n return Array.from({ length: 24 * (60 / minuteStep) }, (_, index) => {\n const candidate = new Date(2026, 0, 1);\n candidate.setHours(Math.floor(index / (60 / minuteStep)));\n candidate.setMinutes((index % (60 / minuteStep)) * minuteStep);\n return formatTime(candidate);\n });\n }, [formatTime, minuteStep, mode]);\n const dateSizingValues = useMemo(() => {\n if (mode === 'time') return [];\n\n return years.flatMap((year) => {\n const values = Array.from({ length: 12 }, (_, month) => {\n const first = new Date(year, month, 1);\n const last = new Date(year, month + 1, 0);\n if (\n (minDate !== undefined && last < dateAtMidnight(minDate)) ||\n (maxDate !== undefined && first > dateAtMidnight(maxDate))\n ) {\n return undefined;\n }\n\n const candidate = new Date(last);\n if (minDate !== undefined && candidate < dateAtMidnight(minDate)) {\n candidate.setDate(minDate.getDate());\n }\n if (maxDate !== undefined && candidate > dateAtMidnight(maxDate)) {\n candidate.setDate(maxDate.getDate());\n }\n return dateFormatter.format(candidate);\n });\n return values.filter((value): value is string => value !== undefined);\n });\n }, [dateFormatter, maxDate, minDate, mode, years]);\n const sizingValueGroups =\n mode === 'date'\n ? [dateSizingValues]\n : mode === 'time'\n ? [timeSizingValues]\n : [dateSizingValues.map((value) => `${value} `), timeSizingValues];\n\n const hours = Array.from({ length: isTwelveHour ? 12 : 24 }, (_, index) =>\n isTwelveHour ? index + 1 : index,\n ).map((hour) => ({ label: String(hour).padStart(2, '0'), value: hour }));\n const minutes = Array.from({ length: 60 / minuteStep }, (_, index) => {\n const minute = index * minuteStep;\n return { label: String(minute).padStart(2, '0'), value: minute };\n });\n const months = Array.from({ length: 12 }, (_, month) => ({\n label: monthFormatter.format(new Date(2026, month, 1)),\n value: month,\n })).filter((month) => {\n const first = new Date(activeValue.getFullYear(), month.value, 1);\n const last = new Date(activeValue.getFullYear(), month.value + 1, 0);\n return (\n (minDate === undefined || last >= dateAtMidnight(minDate)) &&\n (maxDate === undefined || first <= dateAtMidnight(maxDate))\n );\n });\n const days = Array.from(\n { length: new Date(activeValue.getFullYear(), activeValue.getMonth() + 1, 0).getDate() },\n (_, index) => ({ label: String(index + 1).padStart(2, '0'), value: index + 1 }),\n ).filter((day) => {\n const candidate = new Date(activeValue.getFullYear(), activeValue.getMonth(), day.value);\n return (\n (minDate === undefined || candidate >= dateAtMidnight(minDate)) &&\n (maxDate === undefined || candidate <= dateAtMidnight(maxDate))\n );\n });\n const datePartOrder = dateOrderFormatter.formatToParts(activeValue).flatMap<DatePart>((part) => {\n if (part.type === 'day') return ['date'];\n if (part.type === 'month') return ['month'];\n if (part.type === 'year') return ['fullYear'];\n return [];\n });\n const yearOptions = years.map((year) => ({ label: String(year), value: year }));\n\n function dateOptions(part: DatePart) {\n if (part === 'date') return days;\n if (part === 'month') return months;\n return yearOptions;\n }\n\n function dateValue(part: DatePart) {\n if (part === 'date') return activeValue.getDate();\n if (part === 'month') return activeValue.getMonth();\n return activeValue.getFullYear();\n }\n const dayPeriods = [0, 1].map((period) => ({\n label:\n hourFormatter\n .formatToParts(new Date(2026, 0, 1, period === 0 ? 1 : 13))\n .find((part) => part.type === 'dayPeriod')?.value ?? (period === 0 ? 'AM' : 'PM'),\n value: period,\n }));\n function dateLabel(part: DatePart) {\n if (part === 'date') return wheelLabels.day;\n if (part === 'month') return wheelLabels.month;\n return wheelLabels.year;\n }\n return {\n displayValue,\n sizingValueGroups,\n formattedValue,\n activeValue,\n isTwelveHour,\n hours,\n minutes,\n dayPeriods,\n datePartOrder,\n dateOptions,\n dateValue,\n dateLabel,\n updateDate,\n updateTime,\n updatePeriod,\n };\n}\n"],"mappings":";;;AAaA,SAAgB,uBAAuB,EACrC,OACA,QACA,SACA,SACA,UACA,aACA,aACA,YACA,QACa;CACb,MAAM,EAAE,eAAe,gBAAgB,eAAe,eAAe,uBACnE,eACS;EACL,eAAe,IAAI,KAAK,eAAe,QAAQ,EAAE,MAAM,UAAU,CAAC;EAClE,gBAAgB,IAAI,KAAK,eAAe,QAAQ,EAAE,OAAO,OAAO,CAAC;EACjE,eAAe,IAAI,KAAK,eAAe,QAAQ;GAAE,MAAM;GAAW,QAAQ;EAAU,CAAC;EACrF,eAAe,IAAI,KAAK,eAAe,QAAQ;GAC7C,KAAK;GACL,OAAO;GACP,MAAM;EACR,CAAC;EACD,oBAAoB,IAAI,KAAK,eAAe,QAAQ;GAClD,KAAK;GACL,OAAO;GACP,MAAM;EACR,CAAC;CACH,IACA,CAAC,MAAM,CACT;CACF,IAAI,eAAe;CACnB,IAAI,UAAU,MACZ,eACE,SAAS,SACL,gBAAgB,OAAO,UAAU,IACjC,gBAAgB,UAAU,OAAO,SAAS,OAAO,GAAG,UAAU;CAEtE,MAAM,cAAc,gCAAgB,IAAI,KAAK;CAC7C,MAAM,eAAe,cAAc,gBAAgB,CAAC,CAAC,WAAW;CAEhE,MAAM,QAAQ,cAAc;EAC1B,MAAM,yBAAQ,IAAI,KAAK,EAAA,CAAE,YAAY;EACrC,MAAM,QAAQ,SAAS,YAAY,KAAK,QAAQ;EAChD,MAAM,OAAO,SAAS,YAAY,KAAK,QAAQ;EAC/C,OAAO,MAAM,KAAK,EAAE,QAAQ,OAAO,QAAQ,EAAE,IAAI,GAAG,UAAU,QAAQ,KAAK;CAC7E,GAAG,CAAC,SAAS,OAAO,CAAC;CAErB,SAAS,KAAK,WAAiB;EAC7B,SAAS,SAAS,SAAS,YAAY,UAAU,WAAW,SAAS,OAAO,CAAC;CAC/E;CAEA,SAAS,WAAW,MAA2B,WAAmB;EAChE,MAAM,OAAO,IAAI,KAAK,WAAW;EACjC,IAAI,SAAS,SAAS;GACpB,MAAM,OAAO,eAAgB,YAAY,MAAO,KAAK,SAAS,KAAK,KAAK,KAAK,KAAK;GAClF,KAAK,SAAS,IAAI;EACpB,OACE,KAAK,WAAW,SAAS;EAE3B,KAAK,IAAI;CACX;CAEA,SAAS,aAAa,QAAgB;EACpC,MAAM,OAAO,IAAI,KAAK,WAAW;EACjC,KAAK,SAAU,KAAK,SAAS,IAAI,KAAM,SAAS,EAAE;EAClD,KAAK,IAAI;CACX;CAEA,SAAS,WAAW,MAAgB,WAAmB;EACrD,MAAM,OAAO,IAAI,KAAK,WAAW;EACjC,MAAM,cAAc,KAAK,QAAQ;EACjC,KAAK,QAAQ,CAAC;EACd,IAAI,SAAS,YAAY,KAAK,YAAY,SAAS;EACnD,IAAI,SAAS,SAAS,KAAK,SAAS,SAAS;EAC7C,IAAI,SAAS,QAAQ,KAAK,QAAQ,SAAS;EAC3C,IAAI,SAAS,QACX,KAAK,QACH,KAAK,IAAI,aAAa,IAAI,KAAK,KAAK,YAAY,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CACtF;EAEF,KAAK,IAAI;CACX;CAEA,IAAI,iBAAiB;CACrB,MAAM,aAAa,aAChB,SACC,GAAG,cAAc,OAAO,IAAI,IAAI,OAAO,YAAY,CAAC,CAAC,WAAW,IAAI,IAAI,SAAS,MACnF,CAAC,QAAQ,aAAa,CACxB;CACA,IAAI,iBAAiB,MAAM;EACzB,IAAI,SAAS,QAAQ,iBAAiB,WAAW,YAAY;OACxD,IAAI,SAAS,QAAQ,iBAAiB,cAAc,OAAO,YAAY;OACvE,iBAAiB,GAAG,cAAc,OAAO,YAAY,EAAE,GAAG,WAAW,YAAY;CACxF;CACA,MAAM,mBAAmB,cAAc;EACrC,IAAI,SAAS,QAAQ,OAAO,CAAC;EAC7B,OAAO,MAAM,KAAK,EAAE,QAAQ,MAAM,KAAK,YAAY,IAAI,GAAG,UAAU;GAClE,MAAM,YAAY,IAAI,KAAK,MAAM,GAAG,CAAC;GACrC,UAAU,SAAS,KAAK,MAAM,SAAS,KAAK,WAAW,CAAC;GACxD,UAAU,WAAY,SAAS,KAAK,cAAe,UAAU;GAC7D,OAAO,WAAW,SAAS;EAC7B,CAAC;CACH,GAAG;EAAC;EAAY;EAAY;CAAI,CAAC;CACjC,MAAM,mBAAmB,cAAc;EACrC,IAAI,SAAS,QAAQ,OAAO,CAAC;EAE7B,OAAO,MAAM,SAAS,SAAS;GAoB7B,OAnBe,MAAM,KAAK,EAAE,QAAQ,GAAG,IAAI,GAAG,UAAU;IACtD,MAAM,QAAQ,IAAI,KAAK,MAAM,OAAO,CAAC;IACrC,MAAM,OAAO,IAAI,KAAK,MAAM,QAAQ,GAAG,CAAC;IACxC,IACG,YAAY,KAAA,KAAa,OAAO,eAAe,OAAO,KACtD,YAAY,KAAA,KAAa,QAAQ,eAAe,OAAO,GAExD;IAGF,MAAM,YAAY,IAAI,KAAK,IAAI;IAC/B,IAAI,YAAY,KAAA,KAAa,YAAY,eAAe,OAAO,GAC7D,UAAU,QAAQ,QAAQ,QAAQ,CAAC;IAErC,IAAI,YAAY,KAAA,KAAa,YAAY,eAAe,OAAO,GAC7D,UAAU,QAAQ,QAAQ,QAAQ,CAAC;IAErC,OAAO,cAAc,OAAO,SAAS;GACvC,CACO,CAAA,CAAO,QAAQ,UAA2B,UAAU,KAAA,CAAS;EACtE,CAAC;CACH,GAAG;EAAC;EAAe;EAAS;EAAS;EAAM;CAAK,CAAC;CACjD,MAAM,oBACJ,SAAS,SACL,CAAC,gBAAgB,IACjB,SAAS,SACP,CAAC,gBAAgB,IACjB,CAAC,iBAAiB,KAAK,UAAU,GAAG,MAAM,EAAE,GAAG,gBAAgB;CAEvE,MAAM,QAAQ,MAAM,KAAK,EAAE,QAAQ,eAAe,KAAK,GAAG,IAAI,GAAG,UAC/D,eAAe,QAAQ,IAAI,KAC7B,CAAC,CAAC,KAAK,UAAU;EAAE,OAAO,OAAO,IAAI,CAAC,CAAC,SAAS,GAAG,GAAG;EAAG,OAAO;CAAK,EAAE;CACvE,MAAM,UAAU,MAAM,KAAK,EAAE,QAAQ,KAAK,WAAW,IAAI,GAAG,UAAU;EACpE,MAAM,SAAS,QAAQ;EACvB,OAAO;GAAE,OAAO,OAAO,MAAM,CAAC,CAAC,SAAS,GAAG,GAAG;GAAG,OAAO;EAAO;CACjE,CAAC;CACD,MAAM,SAAS,MAAM,KAAK,EAAE,QAAQ,GAAG,IAAI,GAAG,WAAW;EACvD,OAAO,eAAe,OAAO,IAAI,KAAK,MAAM,OAAO,CAAC,CAAC;EACrD,OAAO;CACT,EAAE,CAAC,CAAC,QAAQ,UAAU;EACpB,MAAM,QAAQ,IAAI,KAAK,YAAY,YAAY,GAAG,MAAM,OAAO,CAAC;EAChE,MAAM,OAAO,IAAI,KAAK,YAAY,YAAY,GAAG,MAAM,QAAQ,GAAG,CAAC;EACnE,QACG,YAAY,KAAA,KAAa,QAAQ,eAAe,OAAO,OACvD,YAAY,KAAA,KAAa,SAAS,eAAe,OAAO;CAE7D,CAAC;CACD,MAAM,OAAO,MAAM,KACjB,EAAE,QAAQ,IAAI,KAAK,YAAY,YAAY,GAAG,YAAY,SAAS,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,IACtF,GAAG,WAAW;EAAE,OAAO,OAAO,QAAQ,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG;EAAG,OAAO,QAAQ;CAAE,EAC/E,CAAC,CAAC,QAAQ,QAAQ;EAChB,MAAM,YAAY,IAAI,KAAK,YAAY,YAAY,GAAG,YAAY,SAAS,GAAG,IAAI,KAAK;EACvF,QACG,YAAY,KAAA,KAAa,aAAa,eAAe,OAAO,OAC5D,YAAY,KAAA,KAAa,aAAa,eAAe,OAAO;CAEjE,CAAC;CACD,MAAM,gBAAgB,mBAAmB,cAAc,WAAW,CAAC,CAAC,SAAmB,SAAS;EAC9F,IAAI,KAAK,SAAS,OAAO,OAAO,CAAC,MAAM;EACvC,IAAI,KAAK,SAAS,SAAS,OAAO,CAAC,OAAO;EAC1C,IAAI,KAAK,SAAS,QAAQ,OAAO,CAAC,UAAU;EAC5C,OAAO,CAAC;CACV,CAAC;CACD,MAAM,cAAc,MAAM,KAAK,UAAU;EAAE,OAAO,OAAO,IAAI;EAAG,OAAO;CAAK,EAAE;CAE9E,SAAS,YAAY,MAAgB;EACnC,IAAI,SAAS,QAAQ,OAAO;EAC5B,IAAI,SAAS,SAAS,OAAO;EAC7B,OAAO;CACT;CAEA,SAAS,UAAU,MAAgB;EACjC,IAAI,SAAS,QAAQ,OAAO,YAAY,QAAQ;EAChD,IAAI,SAAS,SAAS,OAAO,YAAY,SAAS;EAClD,OAAO,YAAY,YAAY;CACjC;CACA,MAAM,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,YAAY;EACzC,OACE,cACG,cAAc,IAAI,KAAK,MAAM,GAAG,GAAG,WAAW,IAAI,IAAI,EAAE,CAAC,CAAC,CAC1D,MAAM,SAAS,KAAK,SAAS,WAAW,CAAC,EAAE,UAAU,WAAW,IAAI,OAAO;EAChF,OAAO;CACT,EAAE;CACF,SAAS,UAAU,MAAgB;EACjC,IAAI,SAAS,QAAQ,OAAO,YAAY;EACxC,IAAI,SAAS,SAAS,OAAO,YAAY;EACzC,OAAO,YAAY;CACrB;CACA,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;AACF"}
@@ -1,7 +1,7 @@
1
1
  interface PickerSizerProps {
2
- values: readonly string[];
2
+ valueGroups: readonly (readonly string[])[];
3
3
  placeholder: string | null;
4
4
  }
5
- declare const PickerSizer: import("react").MemoExoticComponent<({ values, placeholder }: PickerSizerProps) => import("react").JSX.Element>;
5
+ declare const PickerSizer: import("react").MemoExoticComponent<({ valueGroups, placeholder }: PickerSizerProps) => import("react").JSX.Element>;
6
6
  export default PickerSizer;
7
7
  //# sourceMappingURL=PickerSizer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PickerSizer.d.ts","sourceRoot":"","sources":["../../../../src/components/date-time-picker/sizer/PickerSizer.tsx"],"names":[],"mappings":"AAEA,UAAU,gBAAgB;IACxB,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,QAAA,MAAM,WAAW,gEAAsD,gBAAgB,iCASrF,CAAC;AAEH,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"PickerSizer.d.ts","sourceRoot":"","sources":["../../../../src/components/date-time-picker/sizer/PickerSizer.tsx"],"names":[],"mappings":"AAEA,UAAU,gBAAgB;IACxB,WAAW,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC;IAC5C,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,QAAA,MAAM,WAAW,qEAA2D,gBAAgB,iCAa1F,CAAC;AAEH,eAAe,WAAW,CAAC"}
@@ -1,11 +1,14 @@
1
1
  import { memo } from "react";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  //#region src/components/date-time-picker/sizer/PickerSizer.tsx
4
- var PickerSizer = memo(function PickerSizer({ values, placeholder }) {
4
+ var PickerSizer = memo(function PickerSizer({ valueGroups, placeholder }) {
5
5
  return /* @__PURE__ */ jsxs("span", {
6
6
  "aria-hidden": "true",
7
7
  className: "chayns-date-time-picker__sizer",
8
- children: [placeholder === null ? null : /* @__PURE__ */ jsx("span", { children: placeholder }), values.map((value) => /* @__PURE__ */ jsx("span", { children: value }, value))]
8
+ children: [placeholder === null ? null : /* @__PURE__ */ jsx("span", { children: placeholder }), valueGroups.map((values, index) => /* @__PURE__ */ jsx("span", {
9
+ className: "chayns-date-time-picker__sizer-group",
10
+ children: values.map((value) => /* @__PURE__ */ jsx("span", { children: value }, value))
11
+ }, index))]
9
12
  });
10
13
  });
11
14
  PickerSizer.displayName = "DateTimePicker.Sizer";
@@ -1 +1 @@
1
- {"version":3,"file":"PickerSizer.js","names":[],"sources":["../../../../src/components/date-time-picker/sizer/PickerSizer.tsx"],"sourcesContent":["import { memo } from 'react';\n\ninterface PickerSizerProps {\n values: readonly string[];\n placeholder: string | null;\n}\n\nconst PickerSizer = memo(function PickerSizer({ values, placeholder }: PickerSizerProps) {\n return (\n <span aria-hidden=\"true\" className=\"chayns-date-time-picker__sizer\">\n {placeholder === null ? null : <span>{placeholder}</span>}\n {values.map((value) => (\n <span key={value}>{value}</span>\n ))}\n </span>\n );\n});\nPickerSizer.displayName = 'DateTimePicker.Sizer';\nexport default PickerSizer;\n"],"mappings":";;;AAOA,IAAM,cAAc,KAAK,SAAS,YAAY,EAAE,QAAQ,eAAiC;CACvF,OACE,qBAAC,QAAD;EAAM,eAAY;EAAO,WAAU;EAAnC,UAAA,CACG,gBAAgB,OAAO,OAAO,oBAAC,QAAD,EAAA,UAAO,YAAkB,CAAA,GACvD,OAAO,KAAK,UACX,oBAAC,QAAD,EAAA,UAAmB,MAAY,GAApB,KAAoB,CAChC,CACG;;AAEV,CAAC;AACD,YAAY,cAAc"}
1
+ {"version":3,"file":"PickerSizer.js","names":[],"sources":["../../../../src/components/date-time-picker/sizer/PickerSizer.tsx"],"sourcesContent":["import { memo } from 'react';\n\ninterface PickerSizerProps {\n valueGroups: readonly (readonly string[])[];\n placeholder: string | null;\n}\n\nconst PickerSizer = memo(function PickerSizer({ valueGroups, placeholder }: PickerSizerProps) {\n return (\n <span aria-hidden=\"true\" className=\"chayns-date-time-picker__sizer\">\n {placeholder === null ? null : <span>{placeholder}</span>}\n {valueGroups.map((values, index) => (\n <span className=\"chayns-date-time-picker__sizer-group\" key={index}>\n {values.map((value) => (\n <span key={value}>{value}</span>\n ))}\n </span>\n ))}\n </span>\n );\n});\nPickerSizer.displayName = 'DateTimePicker.Sizer';\nexport default PickerSizer;\n"],"mappings":";;;AAOA,IAAM,cAAc,KAAK,SAAS,YAAY,EAAE,aAAa,eAAiC;CAC5F,OACE,qBAAC,QAAD;EAAM,eAAY;EAAO,WAAU;EAAnC,UAAA,CACG,gBAAgB,OAAO,OAAO,oBAAC,QAAD,EAAA,UAAO,YAAkB,CAAA,GACvD,YAAY,KAAK,QAAQ,UACxB,oBAAC,QAAD;GAAM,WAAU;GACb,UAAA,OAAO,KAAK,UACX,oBAAC,QAAD,EAAA,UAAmB,MAAY,GAApB,KAAoB,CAChC;EACG,GAJsD,KAItD,CACP,CACG;;AAEV,CAAC;AACD,YAAY,cAAc"}
@@ -4,11 +4,12 @@ interface WheelOption {
4
4
  }
5
5
  interface WheelProps {
6
6
  ariaLabel: string;
7
+ disabled?: boolean;
7
8
  onEscape: () => void;
8
9
  onSelect: (value: number) => void;
9
10
  options: readonly WheelOption[];
10
11
  selected: number;
11
12
  }
12
- declare function Wheel({ ariaLabel, onEscape, onSelect, options, selected }: WheelProps): import("react").JSX.Element;
13
+ declare function Wheel({ ariaLabel, disabled, onEscape, onSelect, options, selected }: WheelProps): import("react").JSX.Element;
13
14
  export default Wheel;
14
15
  //# sourceMappingURL=Wheel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Wheel.d.ts","sourceRoot":"","sources":["../../../../src/components/date-time-picker/wheel/Wheel.tsx"],"names":[],"mappings":"AAMA,UAAU,WAAW;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,UAAU;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,iBAAS,KAAK,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,UAAU,+BA0K9E;AAGD,eAAe,KAAK,CAAC"}
1
+ {"version":3,"file":"Wheel.d.ts","sourceRoot":"","sources":["../../../../src/components/date-time-picker/wheel/Wheel.tsx"],"names":[],"mappings":"AAMA,UAAU,WAAW;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,UAAU;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,iBAAS,KAAK,CAAC,EAAE,SAAS,EAAE,QAAgB,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,UAAU,+BA8KhG;AAGD,eAAe,KAAK,CAAC"}
@@ -3,7 +3,7 @@ import { jsx, jsxs } from "react/jsx-runtime";
3
3
  //#region src/components/date-time-picker/wheel/Wheel.tsx
4
4
  var WHEEL_LOOP_CYCLES = 11;
5
5
  var WHEEL_CENTER_CYCLE = Math.floor(WHEEL_LOOP_CYCLES / 2);
6
- function Wheel({ ariaLabel, onEscape, onSelect, options, selected }) {
6
+ function Wheel({ ariaLabel, disabled = false, onEscape, onSelect, options, selected }) {
7
7
  const wheelId = useId();
8
8
  const wheelRef = useRef(null);
9
9
  const selectedRef = useRef(null);
@@ -50,6 +50,7 @@ function Wheel({ ariaLabel, onEscape, onSelect, options, selected }) {
50
50
  selectCenteredValue();
51
51
  }
52
52
  function handleKeyDown(event) {
53
+ if (disabled) return;
53
54
  if (event.key === "Escape") {
54
55
  event.preventDefault();
55
56
  onEscape();
@@ -68,6 +69,7 @@ function Wheel({ ariaLabel, onEscape, onSelect, options, selected }) {
68
69
  }
69
70
  }
70
71
  function handlePointerDown(event) {
72
+ if (disabled) return;
71
73
  if (event.button !== 0) return;
72
74
  event.preventDefault();
73
75
  if (typeof event.currentTarget.setPointerCapture === "function") event.currentTarget.setPointerCapture(event.pointerId);
@@ -95,6 +97,7 @@ function Wheel({ ariaLabel, onEscape, onSelect, options, selected }) {
95
97
  }
96
98
  return /* @__PURE__ */ jsxs("div", {
97
99
  "aria-activedescendant": `${wheelId}-${selected}`,
100
+ "aria-disabled": disabled || void 0,
98
101
  "aria-label": ariaLabel,
99
102
  className: "chayns-date-time-picker__wheel",
100
103
  onKeyDown: handleKeyDown,
@@ -105,7 +108,7 @@ function Wheel({ ariaLabel, onEscape, onSelect, options, selected }) {
105
108
  onScroll: handleScroll,
106
109
  ref: wheelRef,
107
110
  role: "listbox",
108
- tabIndex: 0,
111
+ tabIndex: disabled ? -1 : 0,
109
112
  children: [/* @__PURE__ */ jsx("span", {
110
113
  "aria-hidden": "true",
111
114
  className: "chayns-date-time-picker__wheel-sizer",
@@ -116,6 +119,7 @@ function Wheel({ ariaLabel, onEscape, onSelect, options, selected }) {
116
119
  }), Array.from({ length: WHEEL_LOOP_CYCLES }, (_, cycle) => options.map((option, optionIndex) => /* @__PURE__ */ jsx("button", {
117
120
  "aria-hidden": cycle !== WHEEL_CENTER_CYCLE || void 0,
118
121
  "aria-selected": option.value === selected,
122
+ disabled,
119
123
  id: cycle === WHEEL_CENTER_CYCLE ? `${wheelId}-${option.value}` : void 0,
120
124
  className: "chayns-date-time-picker__wheel-option",
121
125
  "data-wheel-index": cycle * options.length + optionIndex,
@@ -1 +1 @@
1
- {"version":3,"file":"Wheel.js","names":[],"sources":["../../../../src/components/date-time-picker/wheel/Wheel.tsx"],"sourcesContent":["import { useLayoutEffect, useId, useRef } from 'react';\nimport type { KeyboardEvent, PointerEvent as ReactPointerEvent } from 'react';\n\nconst WHEEL_LOOP_CYCLES = 11;\nconst WHEEL_CENTER_CYCLE = Math.floor(WHEEL_LOOP_CYCLES / 2);\n\ninterface WheelOption {\n label: string;\n value: number;\n}\n\ninterface WheelProps {\n ariaLabel: string;\n onEscape: () => void;\n onSelect: (value: number) => void;\n options: readonly WheelOption[];\n selected: number;\n}\n\nfunction Wheel({ ariaLabel, onEscape, onSelect, options, selected }: WheelProps) {\n const wheelId = useId();\n const wheelRef = useRef<HTMLDivElement>(null);\n const selectedRef = useRef<HTMLButtonElement>(null);\n const dragRef = useRef<{ pointerId: number; scrollTop: number; startY: number } | undefined>(\n undefined,\n );\n const ignoreClickRef = useRef(false);\n\n useLayoutEffect(() => {\n const wheel = wheelRef.current;\n const itemHeight = selectedRef.current?.offsetHeight;\n const selectedIndex = options.findIndex((option) => option.value === selected);\n if (!wheel || !itemHeight || selectedIndex < 0) return;\n\n wheel.scrollTop = (WHEEL_CENTER_CYCLE * options.length + selectedIndex) * itemHeight;\n applyPerspective();\n }, [options, selected]);\n\n function applyPerspective() {\n const wheel = wheelRef.current;\n const itemHeight = selectedRef.current?.offsetHeight;\n if (!wheel || !itemHeight) return;\n\n const position = wheel.scrollTop / itemHeight;\n for (const option of wheel.querySelectorAll<HTMLButtonElement>(\n '.chayns-date-time-picker__wheel-option',\n )) {\n const index = Number(option.dataset.wheelIndex);\n const distance = Math.max(-2.5, Math.min(2.5, index - position));\n const progress = Math.min(1, Math.abs(distance) / 2.5);\n\n option.style.color = progress < 0.2 ? 'var(--text)' : 'var(--text-3)';\n option.style.fontWeight = progress < 0.2 ? '600' : '400';\n option.style.opacity = String(1 - progress * 0.7);\n option.style.transform = `rotateX(${distance * 22}deg) scale(${1 - progress * 0.24})`;\n }\n }\n\n function selectCenteredValue() {\n const wheel = wheelRef.current;\n const itemHeight = selectedRef.current?.offsetHeight;\n if (!wheel || !itemHeight) return;\n\n const index = Math.round(wheel.scrollTop / itemHeight);\n const option = options[((index % options.length) + options.length) % options.length];\n if (option !== undefined && option.value !== selected) onSelect(option.value);\n }\n\n function handleScroll() {\n const wheel = wheelRef.current;\n const itemHeight = selectedRef.current?.offsetHeight;\n if (!wheel || !itemHeight) return;\n\n const index = Math.round(wheel.scrollTop / itemHeight);\n const normalizedIndex = ((index % options.length) + options.length) % options.length;\n if (index < options.length * 2 || index >= options.length * (WHEEL_LOOP_CYCLES - 2)) {\n wheel.scrollTop = (WHEEL_CENTER_CYCLE * options.length + normalizedIndex) * itemHeight;\n }\n\n applyPerspective();\n selectCenteredValue();\n }\n\n function handleKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n if (event.key === 'Escape') {\n event.preventDefault();\n onEscape();\n return;\n }\n\n const index = options.findIndex((option) => option.value === selected);\n let nextIndex = index;\n if (event.key === 'ArrowDown') nextIndex = Math.min(index + 1, options.length - 1);\n if (event.key === 'ArrowUp') nextIndex = Math.max(index - 1, 0);\n if (event.key === 'Home') nextIndex = 0;\n if (event.key === 'End') nextIndex = options.length - 1;\n const nextOption = options[nextIndex];\n if (nextIndex !== index && nextOption !== undefined) {\n event.preventDefault();\n onSelect(nextOption.value);\n }\n }\n\n function handlePointerDown(event: ReactPointerEvent<HTMLDivElement>) {\n if (event.button !== 0) return;\n event.preventDefault();\n if (typeof event.currentTarget.setPointerCapture === 'function') {\n event.currentTarget.setPointerCapture(event.pointerId);\n }\n dragRef.current = {\n pointerId: event.pointerId,\n scrollTop: event.currentTarget.scrollTop,\n startY: event.clientY,\n };\n ignoreClickRef.current = false;\n }\n\n function handlePointerMove(event: ReactPointerEvent<HTMLDivElement>) {\n const drag = dragRef.current;\n if (drag?.pointerId !== event.pointerId) return;\n const distance = event.clientY - drag.startY;\n if (Math.abs(distance) > 3) {\n ignoreClickRef.current = true;\n event.currentTarget.scrollTop = drag.scrollTop - distance;\n }\n }\n\n function handlePointerUp(event: ReactPointerEvent<HTMLDivElement>) {\n if (dragRef.current?.pointerId !== event.pointerId) return;\n dragRef.current = undefined;\n if (typeof event.currentTarget.releasePointerCapture === 'function') {\n event.currentTarget.releasePointerCapture(event.pointerId);\n }\n selectCenteredValue();\n }\n\n return (\n <div\n aria-activedescendant={`${wheelId}-${selected}`}\n aria-label={ariaLabel}\n className=\"chayns-date-time-picker__wheel\"\n onKeyDown={handleKeyDown}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerCancel={handlePointerUp}\n onPointerUp={handlePointerUp}\n onScroll={handleScroll}\n ref={wheelRef}\n role=\"listbox\"\n tabIndex={0}\n >\n <span aria-hidden=\"true\" className=\"chayns-date-time-picker__wheel-sizer\">\n {options.map((option) => (\n <span className=\"chayns-date-time-picker__wheel-sizer-option\" key={option.value}>\n {option.label}\n </span>\n ))}\n </span>\n {Array.from({ length: WHEEL_LOOP_CYCLES }, (_, cycle) =>\n options.map((option, optionIndex) => (\n <button\n aria-hidden={cycle !== WHEEL_CENTER_CYCLE || undefined}\n aria-selected={option.value === selected}\n id={cycle === WHEEL_CENTER_CYCLE ? `${wheelId}-${option.value}` : undefined}\n className=\"chayns-date-time-picker__wheel-option\"\n data-wheel-index={cycle * options.length + optionIndex}\n key={`${cycle}-${option.value}`}\n onClick={(event) => {\n if (ignoreClickRef.current) {\n event.preventDefault();\n event.stopPropagation();\n ignoreClickRef.current = false;\n return;\n }\n onSelect(option.value);\n }}\n ref={\n cycle === WHEEL_CENTER_CYCLE && option.value === selected ? selectedRef : undefined\n }\n role=\"option\"\n tabIndex={-1}\n type=\"button\"\n >\n {option.label}\n </button>\n )),\n )}\n </div>\n );\n}\n\nObject.assign(Wheel, { displayName: 'DateTimePicker.Wheel' });\nexport default Wheel;\n"],"mappings":"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"}
1
+ {"version":3,"file":"Wheel.js","names":[],"sources":["../../../../src/components/date-time-picker/wheel/Wheel.tsx"],"sourcesContent":["import { useLayoutEffect, useId, useRef } from 'react';\nimport type { KeyboardEvent, PointerEvent as ReactPointerEvent } from 'react';\n\nconst WHEEL_LOOP_CYCLES = 11;\nconst WHEEL_CENTER_CYCLE = Math.floor(WHEEL_LOOP_CYCLES / 2);\n\ninterface WheelOption {\n label: string;\n value: number;\n}\n\ninterface WheelProps {\n ariaLabel: string;\n disabled?: boolean;\n onEscape: () => void;\n onSelect: (value: number) => void;\n options: readonly WheelOption[];\n selected: number;\n}\n\nfunction Wheel({ ariaLabel, disabled = false, onEscape, onSelect, options, selected }: WheelProps) {\n const wheelId = useId();\n const wheelRef = useRef<HTMLDivElement>(null);\n const selectedRef = useRef<HTMLButtonElement>(null);\n const dragRef = useRef<{ pointerId: number; scrollTop: number; startY: number } | undefined>(\n undefined,\n );\n const ignoreClickRef = useRef(false);\n\n useLayoutEffect(() => {\n const wheel = wheelRef.current;\n const itemHeight = selectedRef.current?.offsetHeight;\n const selectedIndex = options.findIndex((option) => option.value === selected);\n if (!wheel || !itemHeight || selectedIndex < 0) return;\n\n wheel.scrollTop = (WHEEL_CENTER_CYCLE * options.length + selectedIndex) * itemHeight;\n applyPerspective();\n }, [options, selected]);\n\n function applyPerspective() {\n const wheel = wheelRef.current;\n const itemHeight = selectedRef.current?.offsetHeight;\n if (!wheel || !itemHeight) return;\n\n const position = wheel.scrollTop / itemHeight;\n for (const option of wheel.querySelectorAll<HTMLButtonElement>(\n '.chayns-date-time-picker__wheel-option',\n )) {\n const index = Number(option.dataset.wheelIndex);\n const distance = Math.max(-2.5, Math.min(2.5, index - position));\n const progress = Math.min(1, Math.abs(distance) / 2.5);\n\n option.style.color = progress < 0.2 ? 'var(--text)' : 'var(--text-3)';\n option.style.fontWeight = progress < 0.2 ? '600' : '400';\n option.style.opacity = String(1 - progress * 0.7);\n option.style.transform = `rotateX(${distance * 22}deg) scale(${1 - progress * 0.24})`;\n }\n }\n\n function selectCenteredValue() {\n const wheel = wheelRef.current;\n const itemHeight = selectedRef.current?.offsetHeight;\n if (!wheel || !itemHeight) return;\n\n const index = Math.round(wheel.scrollTop / itemHeight);\n const option = options[((index % options.length) + options.length) % options.length];\n if (option !== undefined && option.value !== selected) onSelect(option.value);\n }\n\n function handleScroll() {\n const wheel = wheelRef.current;\n const itemHeight = selectedRef.current?.offsetHeight;\n if (!wheel || !itemHeight) return;\n\n const index = Math.round(wheel.scrollTop / itemHeight);\n const normalizedIndex = ((index % options.length) + options.length) % options.length;\n if (index < options.length * 2 || index >= options.length * (WHEEL_LOOP_CYCLES - 2)) {\n wheel.scrollTop = (WHEEL_CENTER_CYCLE * options.length + normalizedIndex) * itemHeight;\n }\n\n applyPerspective();\n selectCenteredValue();\n }\n\n function handleKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n if (disabled) return;\n if (event.key === 'Escape') {\n event.preventDefault();\n onEscape();\n return;\n }\n\n const index = options.findIndex((option) => option.value === selected);\n let nextIndex = index;\n if (event.key === 'ArrowDown') nextIndex = Math.min(index + 1, options.length - 1);\n if (event.key === 'ArrowUp') nextIndex = Math.max(index - 1, 0);\n if (event.key === 'Home') nextIndex = 0;\n if (event.key === 'End') nextIndex = options.length - 1;\n const nextOption = options[nextIndex];\n if (nextIndex !== index && nextOption !== undefined) {\n event.preventDefault();\n onSelect(nextOption.value);\n }\n }\n\n function handlePointerDown(event: ReactPointerEvent<HTMLDivElement>) {\n if (disabled) return;\n if (event.button !== 0) return;\n event.preventDefault();\n if (typeof event.currentTarget.setPointerCapture === 'function') {\n event.currentTarget.setPointerCapture(event.pointerId);\n }\n dragRef.current = {\n pointerId: event.pointerId,\n scrollTop: event.currentTarget.scrollTop,\n startY: event.clientY,\n };\n ignoreClickRef.current = false;\n }\n\n function handlePointerMove(event: ReactPointerEvent<HTMLDivElement>) {\n const drag = dragRef.current;\n if (drag?.pointerId !== event.pointerId) return;\n const distance = event.clientY - drag.startY;\n if (Math.abs(distance) > 3) {\n ignoreClickRef.current = true;\n event.currentTarget.scrollTop = drag.scrollTop - distance;\n }\n }\n\n function handlePointerUp(event: ReactPointerEvent<HTMLDivElement>) {\n if (dragRef.current?.pointerId !== event.pointerId) return;\n dragRef.current = undefined;\n if (typeof event.currentTarget.releasePointerCapture === 'function') {\n event.currentTarget.releasePointerCapture(event.pointerId);\n }\n selectCenteredValue();\n }\n\n return (\n <div\n aria-activedescendant={`${wheelId}-${selected}`}\n aria-disabled={disabled || undefined}\n aria-label={ariaLabel}\n className=\"chayns-date-time-picker__wheel\"\n onKeyDown={handleKeyDown}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerCancel={handlePointerUp}\n onPointerUp={handlePointerUp}\n onScroll={handleScroll}\n ref={wheelRef}\n role=\"listbox\"\n tabIndex={disabled ? -1 : 0}\n >\n <span aria-hidden=\"true\" className=\"chayns-date-time-picker__wheel-sizer\">\n {options.map((option) => (\n <span className=\"chayns-date-time-picker__wheel-sizer-option\" key={option.value}>\n {option.label}\n </span>\n ))}\n </span>\n {Array.from({ length: WHEEL_LOOP_CYCLES }, (_, cycle) =>\n options.map((option, optionIndex) => (\n <button\n aria-hidden={cycle !== WHEEL_CENTER_CYCLE || undefined}\n aria-selected={option.value === selected}\n disabled={disabled}\n id={cycle === WHEEL_CENTER_CYCLE ? `${wheelId}-${option.value}` : undefined}\n className=\"chayns-date-time-picker__wheel-option\"\n data-wheel-index={cycle * options.length + optionIndex}\n key={`${cycle}-${option.value}`}\n onClick={(event) => {\n if (ignoreClickRef.current) {\n event.preventDefault();\n event.stopPropagation();\n ignoreClickRef.current = false;\n return;\n }\n onSelect(option.value);\n }}\n ref={\n cycle === WHEEL_CENTER_CYCLE && option.value === selected ? selectedRef : undefined\n }\n role=\"option\"\n tabIndex={-1}\n type=\"button\"\n >\n {option.label}\n </button>\n )),\n )}\n </div>\n );\n}\n\nObject.assign(Wheel, { displayName: 'DateTimePicker.Wheel' });\nexport default Wheel;\n"],"mappings":"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"}
@@ -28,18 +28,37 @@
28
28
  }
29
29
 
30
30
  .chayns-date-time-picker__sizer {
31
- display: grid;
31
+ box-sizing: border-box;
32
+ display: flex;
32
33
  grid-area: 1 / 1;
34
+ padding: var(--input-py) var(--input-px);
35
+ border: 1.5px solid transparent;
36
+ font: inherit;
37
+ line-height: 1.2;
33
38
  visibility: hidden;
34
39
  white-space: nowrap;
35
40
  }
36
41
 
37
- .chayns-date-time-picker__sizer > span {
42
+ .chayns-date-time-picker__sizer-group {
43
+ display: grid;
44
+ }
45
+
46
+ .chayns-date-time-picker__sizer-group > span,
47
+ .chayns-date-time-picker__sizer > span:not(.chayns-date-time-picker__sizer-group) {
38
48
  grid-area: 1 / 1;
39
- padding: var(--input-py) var(--input-px);
40
- border: 1.5px solid transparent;
41
- font: inherit;
42
- line-height: 1.2;
49
+ }
50
+
51
+ .chayns-date-time-picker__sizer > span:not(.chayns-date-time-picker__sizer-group) {
52
+ display: grid;
53
+ }
54
+
55
+ .chayns-date-time-picker--inline {
56
+ display: inline-block;
57
+ overflow: hidden;
58
+ padding: var(--k12);
59
+ border: 1px solid var(--border);
60
+ border-radius: var(--k12);
61
+ background: var(--surface);
43
62
  }
44
63
 
45
64
  .chayns-date-time-picker__trigger:focus-visible {
@@ -88,6 +107,16 @@
88
107
  block-size: calc(var(--k40) * 5);
89
108
  }
90
109
 
110
+ .chayns-date-time-picker__popup .chayns-date-time-picker__wheels {
111
+ inline-size: max-content;
112
+ margin-inline: auto;
113
+ }
114
+
115
+ .chayns-date-time-picker__popup--time .chayns-date-time-picker__wheels {
116
+ inline-size: auto;
117
+ justify-content: center;
118
+ }
119
+
91
120
  .chayns-date-time-picker__selection {
92
121
  position: absolute;
93
122
  inset-block-start: 50%;
@@ -100,6 +129,20 @@
100
129
  transform: translateY(-50%);
101
130
  }
102
131
 
132
+ .chayns-date-time-picker--inline .chayns-date-time-picker__selection {
133
+ inset-inline: 0;
134
+ }
135
+
136
+ .chayns-date-time-picker__popup--date .chayns-date-time-picker__selection {
137
+ inset-inline-end: var(--k5);
138
+ }
139
+
140
+ .chayns-date-time-picker__date-time-gap {
141
+ z-index: 2;
142
+ flex: 0 0 var(--k8);
143
+ background: var(--surface);
144
+ }
145
+
103
146
  .chayns-date-time-picker__wheel {
104
147
  flex: 1;
105
148
  overflow-y: auto;
@@ -154,12 +197,14 @@
154
197
  transform-style: preserve-3d;
155
198
  }
156
199
 
157
- .chayns-date-time-picker--date .chayns-date-time-picker__wheel {
200
+ .chayns-date-time-picker--date .chayns-date-time-picker__wheel,
201
+ .chayns-date-time-picker--date-time .chayns-date-time-picker__wheel {
158
202
  flex: 0 0 auto;
159
203
  inline-size: max-content;
160
204
  }
161
205
 
162
- .chayns-date-time-picker--date .chayns-date-time-picker__wheel-option {
206
+ .chayns-date-time-picker--date .chayns-date-time-picker__wheel-option,
207
+ .chayns-date-time-picker--date-time .chayns-date-time-picker__wheel-option {
163
208
  inline-size: max-content;
164
209
  min-inline-size: 100%;
165
210
  padding-inline: var(--k8);
@@ -20,6 +20,8 @@
20
20
  padding: 0 var(--sp-2);
21
21
  border: 0;
22
22
  border-inline-start: 1px solid color-mix(in srgb, currentcolor 30%, transparent);
23
+ border-start-start-radius: 0;
24
+ border-end-start-radius: 0;
23
25
  border-start-end-radius: 999px;
24
26
  border-end-end-radius: 999px;
25
27
  font: inherit;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chayns-ui/core",
3
- "version": "0.11.1",
3
+ "version": "0.12.0",
4
4
  "description": "Accessible React core components for chayns UI",
5
5
  "license": "MIT",
6
6
  "type": "module",