@lobehub/ui 5.63.4 → 5.64.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/es/base-ui/DatePicker/DatePicker.d.mts +7 -2
  2. package/es/base-ui/DatePicker/DatePicker.mjs +13 -83
  3. package/es/base-ui/DatePicker/DatePicker.mjs.map +1 -1
  4. package/es/base-ui/DatePicker/DateRangePicker.d.mts +3 -2
  5. package/es/base-ui/DatePicker/DateRangePicker.mjs +3 -123
  6. package/es/base-ui/DatePicker/DateRangePicker.mjs.map +1 -1
  7. package/es/base-ui/DatePicker/PurePanel.mjs +80 -0
  8. package/es/base-ui/DatePicker/PurePanel.mjs.map +1 -0
  9. package/es/base-ui/DatePicker/RangePicker.mjs +120 -0
  10. package/es/base-ui/DatePicker/RangePicker.mjs.map +1 -0
  11. package/es/base-ui/DatePicker/SinglePicker.mjs +143 -0
  12. package/es/base-ui/DatePicker/SinglePicker.mjs.map +1 -0
  13. package/es/base-ui/DatePicker/generateConfig.mjs +12 -0
  14. package/es/base-ui/DatePicker/generateConfig.mjs.map +1 -0
  15. package/es/base-ui/DatePicker/generatePicker.d.mts +12 -0
  16. package/es/base-ui/DatePicker/generatePicker.mjs +22 -0
  17. package/es/base-ui/DatePicker/generatePicker.mjs.map +1 -0
  18. package/es/base-ui/DatePicker/index.d.mts +4 -3
  19. package/es/base-ui/DatePicker/locale.d.mts +16 -0
  20. package/es/base-ui/DatePicker/locale.mjs +136 -0
  21. package/es/base-ui/DatePicker/locale.mjs.map +1 -0
  22. package/es/base-ui/DatePicker/semantic.mjs +34 -0
  23. package/es/base-ui/DatePicker/semantic.mjs.map +1 -0
  24. package/es/base-ui/DatePicker/style.mjs +990 -139
  25. package/es/base-ui/DatePicker/style.mjs.map +1 -1
  26. package/es/base-ui/DatePicker/type.d.mts +281 -25
  27. package/es/base-ui/DatePicker/usePanelKeyboard.mjs +230 -0
  28. package/es/base-ui/DatePicker/usePanelKeyboard.mjs.map +1 -0
  29. package/es/base-ui/DatePicker/usePickerShared.mjs +136 -0
  30. package/es/base-ui/DatePicker/usePickerShared.mjs.map +1 -0
  31. package/es/base-ui/DatePicker/usePresetActive.mjs +48 -0
  32. package/es/base-ui/DatePicker/usePresetActive.mjs.map +1 -0
  33. package/es/base-ui/Text/style.d.mts +1 -1
  34. package/es/base-ui/index.d.mts +4 -3
  35. package/es/base-ui/index.mjs +3 -1
  36. package/es/i18n/resources/en/datePicker.d.mts +47 -0
  37. package/es/i18n/resources/en/datePicker.mjs +48 -1
  38. package/es/i18n/resources/en/datePicker.mjs.map +1 -1
  39. package/es/i18n/resources/zhCn/datePicker.d.mts +47 -0
  40. package/es/i18n/resources/zhCn/datePicker.mjs +48 -1
  41. package/es/i18n/resources/zhCn/datePicker.mjs.map +1 -1
  42. package/es/i18n/resources/zhCn/index.mjs +1 -1
  43. package/es/utils/styleEngine.mjs +1 -0
  44. package/package.json +2 -1
  45. package/es/base-ui/DatePicker/CalendarPanel.mjs +0 -188
  46. package/es/base-ui/DatePicker/CalendarPanel.mjs.map +0 -1
  47. package/es/base-ui/DatePicker/PickerShell.mjs +0 -43
  48. package/es/base-ui/DatePicker/PickerShell.mjs.map +0 -1
  49. package/es/base-ui/DatePicker/calendar.d.mts +0 -5
  50. package/es/base-ui/DatePicker/calendar.mjs +0 -46
  51. package/es/base-ui/DatePicker/calendar.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"style.mjs","names":[],"sources":["../../../src/base-ui/DatePicker/style.ts"],"sourcesContent":["import { createStaticStyles } from 'antd-style';\n\nimport { focusRing } from '@/base-ui/focusRing';\n\nexport const styles = createStaticStyles(({ css, cssVar }) => ({\n band: css`\n background: ${cssVar.colorFillSecondary};\n `,\n bandEnd: css`\n background: linear-gradient(to left, transparent 50%, ${cssVar.colorFillSecondary} 50%);\n `,\n bandStart: css`\n background: linear-gradient(to right, transparent 50%, ${cssVar.colorFillSecondary} 50%);\n `,\n calendar: css`\n display: flex;\n flex-direction: column;\n gap: 8px;\n width: 266px;\n `,\n cell: css`\n display: flex;\n justify-content: center;\n `,\n day: css`\n ${focusRing};\n cursor: pointer;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: 34px;\n height: 34px;\n padding: 0;\n border: 0;\n border-radius: 50%;\n\n font: inherit;\n font-size: 13px;\n font-variant-numeric: tabular-nums;\n color: ${cssVar.colorText};\n\n background: none;\n\n &:hover:not(:disabled, [aria-pressed='true']) {\n background: ${cssVar.colorFillTertiary};\n }\n\n &:disabled {\n cursor: not-allowed;\n color: ${cssVar.colorTextQuaternary};\n }\n\n &[data-outside] {\n color: ${cssVar.colorTextQuaternary};\n }\n\n &[data-today] {\n box-shadow: inset 0 0 0 1px ${cssVar.colorText};\n }\n\n &[aria-pressed='true'] {\n font-weight: 600;\n color: ${cssVar.colorBgContainer};\n background: ${cssVar.colorText};\n }\n `,\n footer: css`\n display: flex;\n justify-content: center;\n\n margin-block-start: 12px;\n padding-block-start: 12px;\n border-block-start: 1px solid ${cssVar.colorBorderSecondary};\n `,\n grid: css`\n display: grid;\n grid-template-columns: repeat(7, minmax(0, 1fr));\n row-gap: 2px;\n `,\n header: css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-block-end: 4px;\n `,\n icon: css`\n display: inline-flex;\n flex: none;\n color: ${cssVar.colorTextTertiary};\n `,\n navGroup: css`\n display: flex;\n gap: 2px;\n `,\n placeholder: css`\n color: ${cssVar.colorTextPlaceholder};\n `,\n range: css`\n display: flex;\n gap: 28px;\n `,\n rangeHalf: css`\n flex: 1;\n min-width: 0;\n padding-block: 2px;\n\n &[data-active] {\n box-shadow: inset 0 -2px 0 ${cssVar.colorText};\n }\n `,\n rangeTrigger: css`\n display: flex;\n flex: 1;\n gap: 8px;\n align-items: center;\n\n min-width: 0;\n `,\n tile: css`\n ${focusRing};\n cursor: pointer;\n\n height: 40px;\n padding: 0;\n border: 0;\n border-radius: 999px;\n\n font: inherit;\n font-size: 14px;\n color: ${cssVar.colorText};\n\n background: none;\n\n &:hover:not(:disabled, [aria-pressed='true']) {\n background: ${cssVar.colorFillTertiary};\n }\n\n &:disabled {\n cursor: not-allowed;\n color: ${cssVar.colorTextQuaternary};\n }\n\n &[data-today] {\n box-shadow: inset 0 0 0 1px ${cssVar.colorText};\n }\n\n &[aria-pressed='true'] {\n font-weight: 600;\n color: ${cssVar.colorBgContainer};\n background: ${cssVar.colorText};\n }\n `,\n tiles: css`\n display: grid;\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: 6px 4px;\n width: 266px;\n `,\n trigger: css`\n ${focusRing};\n cursor: pointer;\n\n display: flex;\n flex: 1;\n align-items: center;\n\n min-width: 0;\n height: 100%;\n padding: 0;\n border: 0;\n\n font: inherit;\n color: inherit;\n text-align: start;\n white-space: nowrap;\n\n background: none;\n\n &:disabled {\n cursor: not-allowed;\n }\n `,\n weekday: css`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 20px;\n `,\n}));\n"],"mappings":";;;AAIA,MAAa,SAAS,oBAAoB,EAAE,KAAK,cAAc;CAC7D,MAAM,GAAG;kBACO,OAAO,mBAAmB;;CAE1C,SAAS,GAAG;4DAC8C,OAAO,mBAAmB;;CAEpF,WAAW,GAAG;6DAC6C,OAAO,mBAAmB;;CAErF,UAAU,GAAG;;;;;;CAMb,MAAM,GAAG;;;;CAIT,KAAK,GAAG;MACJ,UAAU;;;;;;;;;;;;;;;;aAgBH,OAAO,UAAU;;;;;oBAKV,OAAO,kBAAkB;;;;;eAK9B,OAAO,oBAAoB;;;;eAI3B,OAAO,oBAAoB;;;;oCAIN,OAAO,UAAU;;;;;eAKtC,OAAO,iBAAiB;oBACnB,OAAO,UAAU;;;CAGnC,QAAQ,GAAG;;;;;;oCAMuB,OAAO,qBAAqB;;CAE9D,MAAM,GAAG;;;;;CAKT,QAAQ,GAAG;;;;;;CAMX,MAAM,GAAG;;;aAGE,OAAO,kBAAkB;;CAEpC,UAAU,GAAG;;;;CAIb,aAAa,GAAG;aACL,OAAO,qBAAqB;;CAEvC,OAAO,GAAG;;;;CAIV,WAAW,GAAG;;;;;;mCAMmB,OAAO,UAAU;;;CAGlD,cAAc,GAAG;;;;;;;;CAQjB,MAAM,GAAG;MACL,UAAU;;;;;;;;;;aAUH,OAAO,UAAU;;;;;oBAKV,OAAO,kBAAkB;;;;;eAK9B,OAAO,oBAAoB;;;;oCAIN,OAAO,UAAU;;;;;eAKtC,OAAO,iBAAiB;oBACnB,OAAO,UAAU;;;CAGnC,OAAO,GAAG;;;;;;CAMV,SAAS,GAAG;MACR,UAAU;;;;;;;;;;;;;;;;;;;;;;;CAuBd,SAAS,GAAG;;;;;;AAMd,EAAE"}
1
+ {"version":3,"file":"style.mjs","names":[],"sources":["../../../src/base-ui/DatePicker/style.ts"],"sourcesContent":["import { focusRing } from '@/base-ui/focusRing';\nimport { createStaticStyles } from '@/utils/styleEngine';\n\n/** Own prefix so rc-picker class names never collide with antd's global `.ant-picker` CSS. */\nexport const PREFIX_CLS = 'lobe-picker';\n\nconst P = PREFIX_CLS;\nconst MOTION = `${P}-slide-up`;\n\n/**\n * Styles for rc-picker's class-name contract. `root` is passed as `rootClassName`, which\n * rc-picker puts on both the input box (`.lobe-picker`) and the popup\n * (`.lobe-picker-dropdown`); the box itself reuses base-ui Input's `rootVariants`.\n */\nexport const styles = createStaticStyles(({ css, cssVar }) => ({\n /** antd's `underlined`: only a bottom border, applied over Input's `borderless`. */\n underlined: css`\n &.${P} {\n border-block-end-color: ${cssVar.colorBorder};\n border-radius: 0;\n }\n\n &.${P}:hover:not(:focus-within, .${P}-disabled) {\n border-block-end-color: ${cssVar.colorPrimaryHover};\n }\n\n &.${P}:focus-within {\n border-block-end-color: ${cssVar.colorPrimary};\n }\n `,\n root: css`\n /* ---------------------------------------------------------------- input box */\n\n /* Size to content like antd: the shared Input root is width: 100%, which made the\n picker stretch in a flex row and squeeze its siblings. Default to auto width (capped by\n the container); a style / className width (e.g. 100%) still wins and the inputs grow. */\n &.${P} {\n position: relative;\n width: auto;\n max-width: 100%;\n }\n\n /* flex-basis auto, not 0: the input keeps its natural width from rc-picker's size\n attribute (format length + 2) instead of collapsing when the root is auto width. */\n &.${P} .${P}-input {\n position: relative;\n\n display: inline-flex;\n flex: 1 1 auto;\n gap: 8px;\n align-items: center;\n\n min-width: 0;\n }\n\n &.${P} .${P}-input > input {\n flex: 1 1 auto;\n\n width: auto;\n min-width: 0;\n padding: 0;\n border: none;\n\n font: inherit;\n font-variant-numeric: tabular-nums;\n color: inherit;\n text-overflow: ellipsis;\n\n appearance: none;\n background: transparent;\n outline: none;\n\n &::placeholder {\n color: ${cssVar.colorTextPlaceholder};\n }\n\n &:disabled {\n cursor: not-allowed;\n }\n }\n\n /*\n * \\`disabled: [boolean, boolean]\\`: Input greys the whole root on \\`:has(input:disabled)\\`;\n * while one end stays editable (rc adds \\`-disabled\\` only when both are), grey just that end.\n */\n &.${P}-range:not(.${P}-disabled):has(input:disabled) {\n cursor: auto;\n color: ${cssVar.colorText};\n opacity: 1;\n }\n\n &.${P}-range:not(.${P}-disabled) .${P}-input:has(> input:disabled) {\n cursor: not-allowed;\n color: ${cssVar.colorTextQuaternary};\n }\n\n /* hover preview text from presets / cells */\n &.${P} .${P}-input-placeholder > input {\n color: ${cssVar.colorTextPlaceholder};\n }\n\n &.${P} .${P}-prefix {\n display: inline-flex;\n flex: none;\n align-items: center;\n color: ${cssVar.colorTextTertiary};\n }\n\n &.${P} .${P}-suffix {\n pointer-events: none;\n\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n\n width: 16px;\n\n color: ${cssVar.colorTextTertiary};\n\n transition: opacity 150ms ${cssVar.motionEaseOut};\n }\n\n /* the clear button sits on top of the suffix icon (16px wide + 8px gap) */\n &.${P} .${P}-clear {\n cursor: pointer;\n\n position: relative;\n z-index: 1;\n\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n\n width: 16px;\n height: 16px;\n margin-inline-start: -24px;\n padding: 0;\n border: 0;\n border-radius: 50%;\n\n color: ${cssVar.colorBgContainer};\n\n opacity: 0;\n background: ${cssVar.colorTextQuaternary};\n\n transition: opacity 150ms ${cssVar.motionEaseOut};\n\n &:hover {\n background: ${cssVar.colorTextTertiary};\n }\n }\n\n &.${P}:not(.${P}-disabled):hover .${P}-clear {\n opacity: 1;\n }\n\n &.${P}:not(.${P}-disabled):hover .${P}-suffix:not(:last-child) {\n opacity: 0;\n }\n\n &.${P}-disabled .${P}-clear {\n display: none;\n }\n\n /*\n * multiple: rc-picker's tags (\\`-selection-item\\`, also the \\`+ N ...\\` rest) in base-ui Tag's\n * filled look, sized as antd (control height - 8px) and wrapping the box when they overflow.\n */\n &.${P}-multiple {\n --lobe-picker-tag-height: 24px;\n\n cursor: pointer;\n padding-block: 1px;\n }\n\n &.${P}-multiple.${P}-small {\n --lobe-picker-tag-height: 16px;\n }\n\n &.${P}-multiple.${P}-large {\n --lobe-picker-tag-height: 32px;\n }\n\n &.${P}-multiple .${P}-selector {\n position: relative;\n flex: 1;\n min-width: 0;\n }\n\n &.${P}-multiple .${P}-selection-overflow {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n max-width: 100%;\n }\n\n &.${P}-multiple .${P}-selection-overflow-item {\n flex: none;\n max-width: 100%;\n }\n\n &.${P}-multiple .${P}-selection-item {\n display: flex;\n gap: 4px;\n align-items: center;\n\n box-sizing: border-box;\n max-width: 100%;\n height: var(--lobe-picker-tag-height);\n margin-block: 2px;\n margin-inline-end: 4px;\n padding-inline: 8px 4px;\n border-radius: ${cssVar.borderRadiusSM};\n\n font-size: ${cssVar.fontSizeSM};\n line-height: var(--lobe-picker-tag-height);\n color: ${cssVar.colorText};\n white-space: nowrap;\n\n background: ${cssVar.colorFillSecondary};\n }\n\n &.${P}-multiple.${P}-large .${P}-selection-item {\n font-size: ${cssVar.fontSize};\n }\n\n &.${P}-multiple .${P}-selection-item:not(:has(.${P}-selection-item-remove)) {\n padding-inline-end: 8px;\n }\n\n &.${P}-multiple .${P}-selection-item-content {\n overflow: hidden;\n font-variant-numeric: tabular-nums;\n text-overflow: ellipsis;\n }\n\n &.${P}-multiple .${P}-selection-item-remove {\n cursor: pointer;\n\n display: inline-flex;\n flex: none;\n align-items: center;\n\n color: ${cssVar.colorIcon};\n\n &:hover {\n color: ${cssVar.colorTextHeading};\n }\n }\n\n &.${P}-multiple .${P}-selection-placeholder {\n overflow: hidden;\n display: block;\n\n line-height: calc(var(--lobe-picker-tag-height) + 4px);\n color: ${cssVar.colorTextPlaceholder};\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n /* the selector shows the value; rc-picker keeps this readonly input only for focus */\n &.${P}-multiple .${P}-multiple-input {\n position: absolute;\n z-index: -1;\n\n width: 0;\n height: 0;\n padding: 0;\n border: 0;\n\n opacity: 0;\n }\n\n &.${P}-multiple.${P}-disabled {\n cursor: not-allowed;\n color: ${cssVar.colorTextQuaternary};\n opacity: 0.66;\n }\n\n /* status: border + focus ring per variant, as antd's genStatusStyle */\n &.${P}-status-error {\n --lobe-picker-status: ${cssVar.colorError};\n --lobe-picker-status-hover: ${cssVar.colorErrorBorderHover};\n --lobe-picker-status-bg: ${cssVar.colorErrorBg};\n --lobe-picker-status-bg-hover: ${cssVar.colorErrorBgHover};\n }\n\n &.${P}-status-warning {\n --lobe-picker-status: ${cssVar.colorWarning};\n --lobe-picker-status-hover: ${cssVar.colorWarningBorderHover};\n --lobe-picker-status-bg: ${cssVar.colorWarningBg};\n --lobe-picker-status-bg-hover: ${cssVar.colorWarningBgHover};\n }\n\n &:is(.${P}-status-error, .${P}-status-warning):not(.${P}-disabled) {\n &.${P}-outlined {\n border-color: var(--lobe-picker-status);\n\n &:hover:not(:focus-within) {\n border-color: var(--lobe-picker-status-hover);\n }\n\n &:focus-within {\n border-color: var(--lobe-picker-status);\n box-shadow: 0 0 0 2px var(--lobe-picker-status-bg);\n }\n }\n\n &.${P}-filled {\n background: var(--lobe-picker-status-bg);\n\n &:hover:not(:focus-within) {\n background: var(--lobe-picker-status-bg-hover);\n }\n\n &:focus-within {\n border-color: var(--lobe-picker-status);\n background: ${cssVar.colorBgContainer};\n }\n }\n\n &.${P}-underlined {\n border-block-end-color: var(--lobe-picker-status);\n }\n\n &:is(.${P}-borderless, .${P}-underlined) .${P}-input > input {\n color: var(--lobe-picker-status);\n }\n\n .${P}-prefix {\n color: var(--lobe-picker-status);\n }\n }\n\n /* rtl: rc-picker adds the -rtl modifier to the box and the popup; lucide arrows are mirrored */\n &.${P}-rtl, &.${P}-dropdown-rtl {\n direction: rtl;\n }\n\n &.${P}-rtl .${P}-range-separator .lucide,\n &.${P}-dropdown-rtl .${P}-header > button .lucide {\n transform: scaleX(-1);\n }\n\n /* range: two inputs, a separator and the bar under the active field */\n &.${P}-range .${P}-input {\n flex: 1 1 auto;\n }\n\n &.${P}-range .${P}-range-separator {\n display: inline-flex;\n flex: none;\n align-items: center;\n color: ${cssVar.colorTextTertiary};\n }\n\n &.${P}-range .${P}-active-bar {\n pointer-events: none;\n\n position: absolute;\n inset-block-end: -1px;\n\n height: 2px;\n\n opacity: 0;\n background: ${cssVar.colorPrimary};\n\n transition:\n inset-inline-start 200ms ${cssVar.motionEaseOut},\n width 200ms ${cssVar.motionEaseOut},\n opacity 200ms ${cssVar.motionEaseOut};\n }\n\n &.${P}-range.${P}-focused .${P}-active-bar {\n opacity: 1;\n }\n\n /* ---------------------------------------------------------------- popup */\n &.${P}-dropdown {\n /* nested in a base-ui Modal / Popover layer that sets pointer-events: none */\n pointer-events: auto;\n\n position: absolute;\n inset-block-start: -9999px;\n inset-inline-start: -9999px;\n\n font-size: 14px;\n color: ${cssVar.colorText};\n }\n\n &.${P}-dropdown-hidden {\n display: none;\n }\n\n &.${P}-dropdown .${P}-range-arrow {\n display: none;\n }\n\n /* rc-trigger stretches the popup to the input width; only the container is painted */\n &.${P}-dropdown .${P}-panel-container {\n overflow: hidden;\n display: inline-block;\n\n border-radius: 16px;\n\n vertical-align: top;\n\n background: ${cssVar.colorBgElevated};\n box-shadow: ${cssVar.boxShadow}, var(--lobe-ring);\n }\n\n &.${P}-dropdown .${P}-panel-layout {\n display: flex;\n align-items: stretch;\n }\n\n &.${P}-dropdown .${P}-panels {\n display: flex;\n flex-wrap: nowrap;\n }\n\n /* presets: a sidebar on the start side of the panels, as in antd */\n &.${P}-dropdown .${P}-presets {\n display: flex;\n flex-direction: column;\n\n min-width: 120px;\n max-width: 200px;\n\n /* divider one step lighter than the panel borders: light colorFillSecondary,\n dark colorFillTertiary (see the -dropdown-dark rule below) */\n border-inline-end: 1px solid ${cssVar.colorFillSecondary};\n\n /* slightly tinted; the panel container's radius + overflow clip it */\n background: ${cssVar.colorFillQuaternary};\n\n ul {\n overflow: auto;\n flex: auto;\n\n height: 0;\n margin: 0;\n padding: 6px;\n\n list-style: none;\n }\n\n li {\n cursor: pointer;\n\n overflow: hidden;\n\n padding-block: 4px;\n padding-inline: 8px;\n border-radius: 6px;\n\n font-size: 13px;\n line-height: 20px;\n color: ${cssVar.colorText};\n text-overflow: ellipsis;\n white-space: nowrap;\n\n transition: background-color 150ms ${cssVar.motionEaseOut};\n\n &:hover {\n background: ${cssVar.colorFillTertiary};\n }\n\n &:has(> .${P}-preset-active) {\n font-weight: 500;\n background: ${cssVar.colorFillSecondary};\n }\n }\n\n li + li {\n margin-block-start: 2px;\n }\n }\n\n /* dark: fill tokens are white-alpha and would lighten the sidebar, so darken it */\n &.${P}-dropdown.${P}-dropdown-dark .${P}-presets {\n border-inline-end-color: ${cssVar.colorFillTertiary};\n background: rgb(0 0 0 / 12%);\n }\n\n &.${P}-dropdown .${P}-panel {\n display: inline-flex;\n flex-direction: column;\n outline: none;\n }\n\n &.${P}-dropdown .${P}-panels > .${P}-panel + .${P}-panel {\n border-inline-start: 1px solid ${cssVar.colorBorderSecondary};\n }\n\n &.${P}-dropdown\n :is(\n .${P}-date-panel,\n .${P}-week-panel,\n .${P}-month-panel,\n .${P}-quarter-panel,\n .${P}-year-panel,\n .${P}-decade-panel\n ) {\n width: 288px;\n }\n\n /* header: << < [month year] > >> */\n &.${P}-dropdown .${P}-header {\n display: flex;\n gap: 2px;\n align-items: center;\n\n padding-block: 12px 4px;\n padding-inline: 12px;\n }\n\n &.${P}-dropdown .${P}-header > button {\n ${focusRing};\n cursor: pointer;\n\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n\n width: 28px;\n height: 28px;\n padding: 0;\n border: 0;\n border-radius: 50%;\n\n color: ${cssVar.colorTextSecondary};\n\n background: none;\n\n &:hover:not(:disabled) {\n color: ${cssVar.colorText};\n background: ${cssVar.colorFillTertiary};\n }\n }\n\n &.${P}-dropdown\n :is(\n .${P}-header-prev-btn-disabled,\n .${P}-header-next-btn-disabled,\n .${P}-header-super-prev-btn-disabled,\n .${P}-header-super-next-btn-disabled\n ) {\n cursor: not-allowed;\n opacity: 0.3;\n }\n\n &.${P}-dropdown .${P}-header-view {\n display: flex;\n flex: 1;\n gap: 4px;\n align-items: center;\n justify-content: center;\n\n min-width: 0;\n\n font-weight: 600;\n }\n\n &.${P}-dropdown .${P}-header-view > button {\n ${focusRing};\n cursor: pointer;\n\n padding-block: 2px;\n padding-inline: 4px;\n border: 0;\n border-radius: 6px;\n\n font: inherit;\n color: inherit;\n\n background: none;\n\n &:hover:not(:disabled) {\n color: ${cssVar.colorPrimary};\n }\n\n &:disabled {\n cursor: default;\n }\n }\n\n /* body + cells */\n &.${P}-dropdown .${P}-body {\n padding-block: 4px 12px;\n padding-inline: 12px;\n }\n\n &.${P}-dropdown .${P}-content {\n table-layout: fixed;\n border-collapse: collapse;\n width: 100%;\n }\n\n &.${P}-dropdown .${P}-content th {\n height: 28px;\n padding: 0;\n\n font-size: 12px;\n font-weight: 400;\n color: ${cssVar.colorTextTertiary};\n text-align: center;\n }\n\n &.${P}-dropdown .${P}-cell {\n cursor: pointer;\n\n position: relative;\n\n padding-block: 2px;\n padding-inline: 0;\n\n color: ${cssVar.colorTextQuaternary};\n text-align: center;\n\n &::before {\n content: '';\n\n position: absolute;\n z-index: 0;\n inset-block-start: 50%;\n inset-inline: 0;\n transform: translateY(-50%);\n\n height: 32px;\n }\n }\n\n &.${P}-dropdown .${P}-cell-in-view {\n color: ${cssVar.colorText};\n }\n\n &.${P}-dropdown .${P}-cell-inner {\n position: relative;\n z-index: 1;\n\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n box-sizing: border-box;\n min-width: 32px;\n height: 32px;\n border-radius: 999px;\n\n font-size: 13px;\n font-variant-numeric: tabular-nums;\n\n transition:\n background 150ms ${cssVar.motionEaseOut},\n color 150ms ${cssVar.motionEaseOut};\n }\n\n &.${P}-dropdown\n .${P}-cell:not(\n .${P}-cell-disabled,\n .${P}-cell-selected,\n .${P}-cell-range-start,\n .${P}-cell-range-end\n ):hover\n .${P}-cell-inner {\n background: ${cssVar.colorFillTertiary};\n }\n\n /* today: bold only, no ring, fill or border */\n &.${P}-dropdown .${P}-cell-in-view.${P}-cell-today .${P}-cell-inner {\n font-weight: ${cssVar.fontWeightStrong};\n }\n\n &.${P}-dropdown\n :is(\n .${P}-cell-in-view.${P}-cell-selected,\n .${P}-cell-in-view.${P}-cell-range-start,\n .${P}-cell-in-view.${P}-cell-range-end\n )\n .${P}-cell-inner {\n font-weight: 600;\n color: ${cssVar.colorBgContainer};\n background: ${cssVar.colorText};\n }\n\n &.${P}-dropdown .${P}-cell-in-view.${P}-cell-in-range::before {\n background: ${cssVar.colorFillSecondary};\n }\n\n &.${P}-dropdown .${P}-cell-in-view.${P}-cell-range-start:not(.${P}-cell-range-end)::before {\n inset-inline-start: 50%;\n background: ${cssVar.colorFillSecondary};\n }\n\n &.${P}-dropdown .${P}-cell-in-view.${P}-cell-range-end:not(.${P}-cell-range-start)::before {\n inset-inline-end: 50%;\n background: ${cssVar.colorFillSecondary};\n }\n\n &.${P}-dropdown .${P}-cell-disabled {\n cursor: not-allowed;\n color: ${cssVar.colorTextQuaternary};\n }\n\n &.${P}-dropdown .${P}-cell-disabled::before {\n background: transparent;\n }\n\n /* month / quarter / year / decade: wider pills in a 3-column grid */\n &.${P}-dropdown\n :is(.${P}-month-panel, .${P}-quarter-panel, .${P}-year-panel, .${P}-decade-panel)\n .${P}-cell {\n padding-block: 8px;\n }\n\n &.${P}-dropdown\n :is(.${P}-month-panel, .${P}-quarter-panel, .${P}-year-panel, .${P}-decade-panel)\n .${P}-cell::before {\n height: 36px;\n }\n\n &.${P}-dropdown\n :is(.${P}-month-panel, .${P}-quarter-panel, .${P}-year-panel, .${P}-decade-panel)\n .${P}-cell-inner {\n min-width: 64px;\n height: 36px;\n padding-inline: 8px;\n font-size: 14px;\n }\n\n /* decade labels (\"2020-2029\") stay on one line */\n &.${P}-dropdown .${P}-decade-panel .${P}-cell-inner {\n padding-inline: 6px;\n font-size: 13px;\n white-space: nowrap;\n }\n\n /* week number column: always on the week panel, on the date panel with showWeek */\n &.${P}-dropdown :is(.${P}-week-panel, .${P}-date-panel-show-week) {\n width: 320px;\n }\n\n &.${P}-dropdown .${P}-cell-week {\n font-size: 12px;\n color: ${cssVar.colorTextTertiary};\n }\n\n &.${P}-dropdown .${P}-date-panel-show-week .${P}-cell-week {\n cursor: default;\n }\n\n /* week panel: the whole row is one tile, painted through each cell's band */\n &.${P}-dropdown .${P}-week-panel .${P}-cell:hover .${P}-cell-inner {\n background: none;\n }\n\n &.${P}-dropdown .${P}-week-panel .${P}-cell:first-child::before {\n inset-inline-start: 2px;\n border-start-start-radius: 999px;\n border-end-start-radius: 999px;\n }\n\n &.${P}-dropdown .${P}-week-panel .${P}-cell:last-child::before {\n inset-inline-end: 2px;\n border-start-end-radius: 999px;\n border-end-end-radius: 999px;\n }\n\n &.${P}-dropdown .${P}-week-panel-row:hover .${P}-cell::before {\n background: ${cssVar.colorFillTertiary};\n }\n\n &.${P}-dropdown\n .${P}-week-panel-row-range-hover\n .${P}-cell::before,\n &.${P}-dropdown\n .${P}-week-panel-row-hover\n .${P}-cell::before {\n background: ${cssVar.colorFillSecondary};\n }\n\n /* multiple: rc-picker marks every picked week but the first with \\`-row-hover\\` */\n &.${P}-dropdown\n :is(\n .${P}-week-panel-row-selected,\n .${P}-dropdown-multiple\n .${P}-week-panel-row-hover,\n .${P}-week-panel-row-range-start,\n .${P}-week-panel-row-range-end\n )\n .${P}-cell {\n color: ${cssVar.colorBgContainer};\n\n &::before {\n background: ${cssVar.colorText};\n }\n\n .${P}-cell-inner {\n font-weight: 600;\n box-shadow: none;\n }\n }\n\n /* keyboard: the tile arrow keys moved to on month / quarter / year / decade panels */\n &.${P}-dropdown .${P}-cell-keyboard-active {\n display: none;\n }\n\n &.${P}-dropdown .${P}-cell-in-view:has(> .${P}-cell-keyboard-active) .${P}-cell-inner {\n outline: 2px solid ${cssVar.colorPrimary};\n outline-offset: 1px;\n }\n\n /* time: hour / minute / second / meridiem columns, beside the date panel with showTime */\n &.${P}-dropdown .${P}-datetime-panel {\n display: flex;\n align-items: stretch;\n }\n\n &.${P}-dropdown .${P}-datetime-panel > .${P}-time-panel {\n border-inline-start: 1px solid ${cssVar.colorBorderSecondary};\n }\n\n &.${P}-dropdown .${P}-time-panel {\n display: flex;\n flex-direction: column;\n min-width: 0;\n }\n\n &.${P}-dropdown .${P}-time-panel .${P}-header-view {\n height: 28px;\n font-variant-numeric: tabular-nums;\n }\n\n &.${P}-dropdown .${P}-time-panel .${P}-content {\n display: flex;\n flex: auto;\n\n height: 224px;\n padding-block: 4px 12px;\n padding-inline: 4px;\n }\n\n /* next to the date panel the columns take its height instead */\n &.${P}-dropdown .${P}-datetime-panel .${P}-time-panel .${P}-content {\n flex: 1 1 0;\n height: auto;\n min-height: 0;\n }\n\n &.${P}-dropdown .${P}-time-panel-column {\n scrollbar-width: thin;\n\n overflow-y: hidden;\n flex: none;\n\n width: 56px;\n margin: 0;\n padding: 0;\n\n list-style: none;\n\n /* lets the last option scroll up to the top, as in antd */\n &::after {\n content: '';\n display: block;\n height: calc(100% - 28px);\n }\n\n &:hover {\n overflow-y: auto;\n }\n }\n\n &.${P}-dropdown .${P}-time-panel-column + .${P}-time-panel-column {\n border-inline-start: 1px solid ${cssVar.colorBorderSecondary};\n }\n\n &.${P}-dropdown .${P}-time-panel-cell {\n cursor: pointer;\n padding-block: 1px;\n padding-inline: 4px;\n }\n\n &.${P}-dropdown .${P}-time-panel-cell-inner {\n height: 26px;\n border-radius: 6px;\n\n font-size: 13px;\n font-variant-numeric: tabular-nums;\n line-height: 26px;\n color: ${cssVar.colorText};\n text-align: center;\n\n transition:\n background 150ms ${cssVar.motionEaseOut},\n color 150ms ${cssVar.motionEaseOut};\n }\n\n &.${P}-dropdown\n .${P}-time-panel-cell:not(.${P}-time-panel-cell-disabled, .${P}-time-panel-cell-selected):hover\n .${P}-time-panel-cell-inner {\n background: ${cssVar.colorFillTertiary};\n }\n\n &.${P}-dropdown .${P}-time-panel-cell-selected .${P}-time-panel-cell-inner {\n font-weight: 600;\n color: ${cssVar.colorBgContainer};\n background: ${cssVar.colorText};\n }\n\n &.${P}-dropdown .${P}-time-panel-cell-disabled {\n cursor: not-allowed;\n\n .${P}-time-panel-cell-inner {\n color: ${cssVar.colorTextQuaternary};\n }\n }\n\n /* footer: no background of its own; dividers match the presets sidebar divider */\n\n /* footer: ONE row in one container — renderExtraFooter content on the start side,\n Today / Now / OK on the end side — under a single divider. No background. */\n &.${P}-dropdown .${P}-footer {\n display: flex;\n gap: 8px;\n align-items: center;\n\n min-width: 0;\n border-block-start: 1px solid ${cssVar.colorFillSecondary};\n\n background: none;\n }\n\n &.${P}-dropdown.${P}-dropdown-dark .${P}-footer {\n border-block-start-color: ${cssVar.colorFillTertiary};\n }\n\n &.${P}-dropdown .${P}-footer-extra {\n flex: 1;\n\n min-width: 0;\n padding-block: 8px;\n padding-inline: 12px;\n\n font-size: 13px;\n line-height: 20px;\n color: ${cssVar.colorTextSecondary};\n text-align: start;\n }\n\n &.${P}-dropdown .${P}-footer-extra + .${P}-ranges {\n flex: none;\n padding-inline-start: 0;\n }\n\n &.${P}-dropdown .${P}-ranges {\n display: flex;\n flex: 1;\n gap: 8px;\n align-items: center;\n justify-content: space-between;\n\n margin: 0;\n padding-block: 8px;\n padding-inline: 12px;\n\n list-style: none;\n }\n\n &.${P}-dropdown .${P}-ranges > .${P}-now {\n margin-inline: auto;\n }\n\n /* Now on the start side, OK on the end side */\n &.${P}-dropdown .${P}-ranges > .${P}-now:has(+ .${P}-ok) {\n margin-inline: 0;\n }\n\n &.${P}-dropdown .${P}-ranges > .${P}-ok {\n margin-inline-start: auto;\n }\n\n &.${P}-dropdown .${P}-now-btn {\n ${focusRing};\n cursor: pointer;\n\n padding-block: 2px;\n padding-inline: 8px;\n border-radius: 6px;\n\n font-size: 13px;\n color: ${cssVar.colorText};\n\n &:hover {\n background: ${cssVar.colorFillTertiary};\n }\n }\n\n &.${P}-dropdown .${P}-now-btn-disabled {\n cursor: not-allowed;\n color: ${cssVar.colorTextQuaternary};\n }\n\n /* motion (transitionName = lobe-picker-slide-up) */\n &.${MOTION}-appear, &.${MOTION}-enter {\n transform-origin: top center;\n }\n\n /* rc-motion's prepare frame is where the trigger measures and aligns the popup, so it\n must stay untransformed (a scaled box would misalign). Without an opacity of its own\n it painted fully visible at the final spot for one frame, then snapped back to the\n start state below and animated in again: that flash + jump read as jitter on open. */\n &.${MOTION}-appear-prepare, &.${MOTION}-enter-prepare {\n opacity: 0;\n }\n\n &.${MOTION}-appear-start, &.${MOTION}-enter-start {\n transform: translateY(-4px) scale(0.98);\n opacity: 0;\n }\n\n &.${MOTION}-appear-active, &.${MOTION}-enter-active {\n transform: none;\n opacity: 1;\n transition:\n opacity 150ms ${cssVar.motionEaseOut},\n transform 150ms ${cssVar.motionEaseOut};\n }\n\n &.${MOTION}-leave-active {\n transform: translateY(-4px) scale(0.98);\n opacity: 0;\n transition:\n opacity 100ms ${cssVar.motionEaseInOut},\n transform 100ms ${cssVar.motionEaseInOut};\n }\n `,\n}));\n"],"mappings":"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"}
@@ -1,35 +1,291 @@
1
- import { InputSize, InputVariant } from "../Input/type.mjs";
2
- import { CalendarMode } from "./calendar.mjs";
3
- import { CSSProperties, ReactNode } from "react";
1
+ import { CSSProperties, ComponentType, FocusEvent, MouseEvent, ReactNode, Ref } from "react";
2
+ import { Dayjs } from "dayjs";
3
+ import { PickerProps, PickerRef, RangePickerProps } from "@rc-component/picker";
4
+ import { GenerateConfig } from "@rc-component/picker/generate";
5
+ import { BaseInfo, CellRender, CellRenderInfo, Components, Locale, PanelMode, PickerMode, RangePickerRef, SharedPanelProps, ValueDate } from "@rc-component/picker/interface";
4
6
  //#region src/base-ui/DatePicker/type.d.ts
5
- interface PickerCommonProps {
6
- allowClear?: boolean;
7
- className?: string;
8
- disabled?: boolean;
9
- disabledDate?: (date: Date) => boolean;
10
- format?: string | ((date: Date) => string);
11
- max?: Date;
12
- min?: Date;
7
+ /** rc-picker's locale (texts and formats) plus antd's per-`picker` placeholders. */
8
+ interface PickerLocaleLang extends Locale {
9
+ monthPlaceholder?: string;
10
+ placeholder?: string;
11
+ quarterPlaceholder?: string;
12
+ rangeMonthPlaceholder?: [string, string];
13
+ rangePlaceholder?: [string, string];
14
+ rangeQuarterPlaceholder?: [string, string];
15
+ rangeWeekPlaceholder?: [string, string];
16
+ rangeYearPlaceholder?: [string, string];
17
+ weekPlaceholder?: string;
18
+ yearPlaceholder?: string;
19
+ }
20
+ /** Placeholders of `picker="time"`. */
21
+ interface TimePickerLocale {
22
+ placeholder?: string;
23
+ rangePlaceholder?: [string, string];
24
+ }
25
+ /** antd's `PickerLocale`, the shape of the `locale` prop. */
26
+ interface PickerLocale {
27
+ /** @deprecated Kept for antd parity; use `lang.fieldDateFormat`. */
28
+ dateFormat?: string;
29
+ /** @deprecated Kept for antd parity; use `lang.fieldDateTimeFormat`. */
30
+ dateTimeFormat?: string;
31
+ lang: PickerLocaleLang;
32
+ /** @deprecated Kept for antd parity; use `lang.fieldMonthFormat`. */
33
+ monthFormat?: string;
34
+ timePickerLocale: TimePickerLocale;
35
+ /** @deprecated Kept for antd parity; use `lang.fieldWeekFormat`. */
36
+ weekFormat?: string;
37
+ }
38
+ /**
39
+ * The `locale` prop: a full `PickerLocale` (e.g. a spread of an exported default locale) or
40
+ * only the fields to change — `lang` and `timePickerLocale` are merged field by field over the
41
+ * default locale generated from `@lobehub/ui/i18n`.
42
+ */
43
+ type PickerLocaleInput = Omit<Partial<PickerLocale>, 'lang' | 'timePickerLocale'> & {
44
+ lang?: Partial<PickerLocaleLang>;
45
+ timePickerLocale?: TimePickerLocale;
46
+ };
47
+ /** A `presets` entry: `value` may be a function, evaluated when the preset is hovered or picked. */
48
+ type PresetDate<T = Dayjs> = ValueDate<T>;
49
+ /** `components`: replace a panel (`date` / `week` / … / `time`), the `input` or the OK `button`. */
50
+ type PickerComponents = Components<Dayjs>;
51
+ /** Props a custom panel in `components` receives (`value`, `onSelect`, `onHover`, …). */
52
+ type PickerPanelProps = SharedPanelProps<Dayjs>;
53
+ /** `middle` is kept as an alias of `medium`. */
54
+ type PickerSize = 'large' | 'medium' | 'small' | 'middle';
55
+ type PickerVariant = 'outlined' | 'borderless' | 'filled' | 'underlined';
56
+ type PickerStatus = 'error' | 'warning';
57
+ type PickerPlacement = 'bottomLeft' | 'bottomRight' | 'topLeft' | 'topRight';
58
+ /** @deprecated Use `PickerMode` (the `picker` prop) instead. */
59
+ type CalendarMode = 'date' | 'month' | 'year';
60
+ /** Semantic parts of the input box (Semantic DOM). */
61
+ type PickerSemanticName = 'root' | 'prefix' | 'input' | 'suffix';
62
+ /** Semantic parts of the popup (Semantic DOM, `classNames.popup` / `styles.popup`). */
63
+ type PickerPopupSemanticName = 'root' | 'container' | 'header' | 'body' | 'content' | 'item' | 'footer';
64
+ interface PickerSemanticClassNames extends Partial<Record<PickerSemanticName, string>> {
65
+ /** A string is the popup `root` class. */
66
+ popup?: string | Partial<Record<PickerPopupSemanticName, string>>;
67
+ }
68
+ interface PickerSemanticStyles extends Partial<Record<PickerSemanticName, CSSProperties>> {
69
+ popup?: Partial<Record<PickerPopupSemanticName, CSSProperties>>;
70
+ }
71
+ /** `classNames`: an object, or a function of `{ props }` returning one. */
72
+ type PickerClassNames<P = any> = PickerSemanticClassNames | ((info: {
73
+ props: P;
74
+ }) => PickerSemanticClassNames);
75
+ /** `styles`: an object, or a function of `{ props }` returning one. */
76
+ type PickerStyles<P = any> = PickerSemanticStyles | ((info: {
77
+ props: P;
78
+ }) => PickerSemanticStyles);
79
+ /** Props rc-picker owns internally or that lobe wires up itself. */
80
+ type InternalRcProps = 'classNames' | 'generateConfig' | 'locale' | 'prefixCls' | 'styles';
81
+ type MultipleRcProps = 'maxTagCount' | 'multiple' | 'removeIcon' | 'tagRender';
82
+ type ValueRcProps = 'changeOnBlur' | 'defaultValue' | 'onCalendarChange' | 'onChange' | 'onOk' | 'placeholder' | 'placement' | 'size' | 'value';
83
+ interface LobePickerProps {
84
+ /** @deprecated Use `variant` instead; `bordered={false}` maps to `variant="borderless"`. */
85
+ bordered?: boolean;
86
+ /**
87
+ * @deprecated Use `needConfirm={false}` instead: the value is committed when the popup
88
+ * closes, without the OK button. Ignored when `needConfirm` is set.
89
+ */
90
+ changeOnBlur?: boolean;
91
+ /** @deprecated Use `classNames.popup.root` instead. */
92
+ dropdownClassName?: string;
93
+ /**
94
+ * Popup position relative to the input.
95
+ * @default 'bottomLeft' ('bottomRight' when `direction="rtl"`)
96
+ */
97
+ placement?: PickerPlacement;
98
+ /** @deprecated Use `classNames.popup.root` instead. */
99
+ popupClassName?: string;
100
+ /** @deprecated Use `styles.popup.root` instead. */
101
+ popupStyle?: CSSProperties;
102
+ /** Lobe look: drop shadow under the input box. */
13
103
  shadow?: boolean;
14
- size?: InputSize;
15
- style?: CSSProperties;
16
- variant?: InputVariant;
104
+ /** @default 'medium' */
105
+ size?: PickerSize;
106
+ status?: PickerStatus;
107
+ /** @default 'outlined' (light) / 'filled' (dark) */
108
+ variant?: PickerVariant;
109
+ }
110
+ /** Props `tagRender` receives for each picked date in `multiple` mode. */
111
+ interface PickerTagProps<DateType extends object = Dayjs> {
112
+ closable: boolean;
113
+ disabled: boolean;
114
+ /** The date formatted with `format`. */
115
+ label: ReactNode;
116
+ /** Removes the date from the value. */
117
+ onClose: (event?: MouseEvent<HTMLElement>) => void;
118
+ value: DateType;
17
119
  }
18
- interface DatePickerProps extends PickerCommonProps {
19
- defaultValue?: Date | null;
120
+ /** `dateString` of a value: a string per date in `multiple` mode. */
121
+ type PickerDateStrings<ValueType> = ValueType extends readonly unknown[] ? string[] : string | null;
122
+ /**
123
+ * antd's `PickerPropsWithMultiple`: `InnerPickerProps` with the value props typed by
124
+ * `ValueType` — `DateType` for one date, `DateType[]` with `multiple`.
125
+ */
126
+ type PickerPropsWithMultiple<DateType, InnerPickerProps, ValueType = DateType> = Omit<InnerPickerProps, 'defaultValue' | 'onCalendarChange' | 'onChange' | 'onOk' | 'value'> & {
127
+ defaultValue?: ValueType | null;
128
+ onCalendarChange?: (date: ValueType | null, dateString: PickerDateStrings<ValueType>, info: BaseInfo) => void;
129
+ /** Cleared: `null` for one date, `[]` with `multiple`. */
130
+ onChange?: (date: ValueType | null, dateString: PickerDateStrings<ValueType>) => void;
131
+ onOk?: (date?: ValueType | null) => void;
132
+ value?: ValueType | null;
133
+ };
134
+ /**
135
+ * DatePicker props other than the value ones, which `PickerPropsWithMultiple` adds.
136
+ * `DateType` is the date library's type (`Dayjs`, or another one with `generatePicker`).
137
+ */
138
+ interface DatePickerBaseProps<DateType extends object = Dayjs> extends Omit<PickerProps<DateType>, InternalRcProps | MultipleRcProps | ValueRcProps>, LobePickerProps {
139
+ /** Semantic DOM class names: `root` / `prefix` / `input` / `suffix` and `popup.*`. */
140
+ classNames?: PickerClassNames<DatePickerProps<any>>;
141
+ /** @deprecated Use `renderExtraFooter` instead. */
20
142
  footer?: ReactNode;
21
- mode?: CalendarMode;
22
- onChange?: (date: Date | null) => void;
143
+ /**
144
+ * antd `PickerLocale`: `lang` texts and formats (`fieldDateFormat`, `yearFormat`,
145
+ * `shortWeekDays`, …) and `timePickerLocale`. Defaults to the locale generated from the
146
+ * `@lobehub/ui/i18n` resources in context.
147
+ */
148
+ locale?: PickerLocaleInput;
149
+ /** @deprecated Use `maxDate` instead. */
150
+ max?: DateType;
151
+ /**
152
+ * `multiple`: at most this many tags; `'responsive'` fits as many as the width allows.
153
+ * The rest collapse into a `+ N ...` tag.
154
+ */
155
+ maxTagCount?: number | 'responsive';
156
+ /** @deprecated Use `minDate` instead. */
157
+ min?: DateType;
158
+ /**
159
+ * Pick several dates, shown as tags; clicking a picked cell again removes it. Works on
160
+ * every `picker` except with `showTime`. Values are `Dayjs[]`, sorted unless
161
+ * `order={false}`. No OK button (`needConfirm` defaults to `false`): `onCalendarChange`
162
+ * fires on each click and `onChange` once the popup closes.
163
+ */
164
+ multiple?: boolean;
165
+ /** @deprecated Use `onCalendarChange` instead. Not called with `multiple`. */
166
+ onSelect?: (date: DateType) => void;
167
+ /**
168
+ * `multiple`: sort the picked dates; `false` keeps them in picking order.
169
+ * @default true
170
+ */
171
+ order?: boolean;
23
172
  placeholder?: string;
24
- value?: Date | null;
173
+ ref?: Ref<PickerRef>;
174
+ /** `multiple`: the remove icon of each tag. */
175
+ removeIcon?: ReactNode;
176
+ /** Semantic DOM styles: `root` / `prefix` / `input` / `suffix` and `popup.*`. */
177
+ styles?: PickerStyles<DatePickerProps<any>>;
178
+ /** `multiple`: render each picked date's tag, e.g. with base-ui `Tag`. */
179
+ tagRender?: (props: PickerTagProps<DateType>) => ReactNode;
25
180
  }
26
- type DateRangeValue = [Date | null, Date | null];
27
- interface DateRangePickerProps extends PickerCommonProps {
28
- defaultValue?: DateRangeValue;
29
- onChange?: (range: DateRangeValue) => void;
181
+ /**
182
+ * `ValueType` is `Dayjs` (default) or `Dayjs[]` with `multiple`; `<DatePicker multiple>`
183
+ * infers `Dayjs[]` by itself.
184
+ */
185
+ type DatePickerProps<ValueType = Dayjs> = PickerPropsWithMultiple<Dayjs, DatePickerBaseProps, ValueType>;
186
+ type DateRangeValue<DateType extends object = Dayjs> = [DateType | null, DateType | null];
187
+ /** Which end of a range an event belongs to. */
188
+ interface RangeInfo {
189
+ range: 'start' | 'end';
190
+ }
191
+ /** `info.from` is the end picked first in the current range selection. */
192
+ type RangeDisabledDate<DateType extends object = Dayjs> = (current: DateType, info: {
193
+ from?: DateType;
194
+ type: PanelMode;
195
+ }) => boolean;
196
+ type RangeRcProps = 'allowEmpty' | 'disabled' | 'disabledDate' | 'id' | 'onBlur' | 'onFocus' | 'order';
197
+ interface DateRangePickerProps<DateType extends object = Dayjs> extends Omit<RangePickerProps<DateType>, InternalRcProps | RangeRcProps | ValueRcProps>, LobePickerProps {
198
+ /**
199
+ * Allow leaving the start / end empty; `true` applies to both ends.
200
+ * @default [false, false]
201
+ */
202
+ allowEmpty?: boolean | [boolean, boolean];
203
+ /** Semantic DOM class names, see `DatePickerProps['classNames']`. */
204
+ classNames?: PickerClassNames<DateRangePickerProps<DateType>>;
205
+ defaultValue?: [DateType | null | undefined, DateType | null | undefined];
206
+ /** Disable the whole picker, or each end separately with `[start, end]`. */
207
+ disabled?: boolean | [boolean, boolean];
208
+ /** Receives `info.from` once one end is picked, e.g. to limit the range length. */
209
+ disabledDate?: RangeDisabledDate<DateType>;
210
+ /** @deprecated Use `renderExtraFooter` instead. */
211
+ footer?: ReactNode;
212
+ /** Ids of the start and end inputs. */
213
+ id?: {
214
+ end?: string;
215
+ start?: string;
216
+ };
217
+ /** antd `PickerLocale`, see `DatePickerProps['locale']`. */
218
+ locale?: PickerLocaleInput;
219
+ /** @deprecated Use `maxDate` instead. */
220
+ max?: DateType;
221
+ /** @deprecated Use `minDate` instead. */
222
+ min?: DateType;
223
+ onBlur?: (event: FocusEvent<HTMLElement>, info: RangeInfo) => void;
224
+ onCalendarChange?: (dates: DateRangeValue<DateType>, dateStrings: [string, string], info: RangeInfo) => void;
225
+ onChange?: (dates: DateRangeValue<DateType> | null, dateStrings: [string, string] | null) => void;
226
+ onFocus?: (event: FocusEvent<HTMLElement>, info: RangeInfo) => void;
227
+ onOk?: (dates: DateRangeValue<DateType>) => void;
228
+ /**
229
+ * Swap the ends when the end is earlier than the start; `false` keeps them as entered.
230
+ * @default true
231
+ */
232
+ order?: boolean;
30
233
  placeholder?: [string, string];
31
- value?: DateRangeValue;
234
+ /** `focus(index)` / `focus({ index })` focuses the start (`0`) or end (`1`) input. */
235
+ ref?: Ref<RangePickerRef>;
236
+ /** Semantic DOM styles, see `DatePickerProps['styles']`. */
237
+ styles?: PickerStyles<DateRangePickerProps<DateType>>;
238
+ value?: [DateType | null | undefined, DateType | null | undefined] | null;
239
+ }
240
+ /** antd `PickerProps<DateType>`: DatePicker props over any date library's type. */
241
+ type PickerProps$1<DateType extends object = Dayjs, ValueType = DateType> = PickerPropsWithMultiple<DateType, DatePickerBaseProps<DateType>, ValueType>;
242
+ /** Props of `DatePicker.WeekPicker` / `MonthPicker` / … : `picker` is fixed. */
243
+ type PresetPickerProps<DateType extends object = Dayjs, ValueType = DateType> = Omit<PickerProps$1<DateType, ValueType>, 'picker'>;
244
+ type WeekPickerProps<ValueType = Dayjs> = PresetPickerProps<Dayjs, ValueType>;
245
+ type MonthPickerProps<ValueType = Dayjs> = PresetPickerProps<Dayjs, ValueType>;
246
+ type YearPickerProps<ValueType = Dayjs> = PresetPickerProps<Dayjs, ValueType>;
247
+ type QuarterPickerProps<ValueType = Dayjs> = PresetPickerProps<Dayjs, ValueType>;
248
+ /** antd `GenericTimePickerProps`: `DatePicker.TimePicker` has no `picker` / `showTime`. */
249
+ type GenericTimePickerProps<DateType extends object = Dayjs, ValueType = DateType> = Omit<PickerProps$1<DateType, ValueType>, 'picker' | 'showTime'>;
250
+ type TimePickerProps<ValueType = Dayjs> = GenericTimePickerProps<Dayjs, ValueType>;
251
+ /** antd-style alias of `DateRangePickerProps`. */
252
+ type RangePickerProps$1<DateType extends object = Dayjs> = DateRangePickerProps<DateType>;
253
+ /** antd `DatePickerSemanticType`: the Semantic DOM `classNames` / `styles` shapes. */
254
+ interface DatePickerSemanticType {
255
+ classNames?: PickerSemanticClassNames;
256
+ styles?: PickerSemanticStyles;
257
+ }
258
+ /**
259
+ * A single-date picker component: `multiple` (as `IsMultiple`) picks `DateType[]` values,
260
+ * otherwise `DateType`; a `value` / `defaultValue` infers `ValueType` directly.
261
+ */
262
+ interface SinglePickerComponent<DateType extends object, InnerProps = DatePickerBaseProps<DateType>> {
263
+ <IsMultiple extends boolean = false, ValueType = IsMultiple extends true ? DateType[] : DateType>(props: PickerPropsWithMultiple<DateType, InnerProps, ValueType> & {
264
+ multiple?: IsMultiple;
265
+ }): ReactNode;
266
+ displayName?: string;
267
+ }
268
+ interface RangePickerComponent<DateType extends object> {
269
+ (props: DateRangePickerProps<DateType>): ReactNode;
270
+ displayName?: string;
271
+ }
272
+ /** What `generatePicker(generateConfig)` returns: DatePicker with its static pickers. */
273
+ interface GeneratedDatePicker<DateType extends object> extends SinglePickerComponent<DateType> {
274
+ MonthPicker: SinglePickerComponent<DateType, Omit<DatePickerBaseProps<DateType>, 'picker'>>;
275
+ QuarterPicker: SinglePickerComponent<DateType, Omit<DatePickerBaseProps<DateType>, 'picker'>>;
276
+ RangePicker: RangePickerComponent<DateType>;
277
+ TimePicker: SinglePickerComponent<DateType, Omit<DatePickerBaseProps<DateType>, 'picker' | 'showTime'>>;
278
+ WeekPicker: SinglePickerComponent<DateType, Omit<DatePickerBaseProps<DateType>, 'picker'>>;
279
+ YearPicker: SinglePickerComponent<DateType, Omit<DatePickerBaseProps<DateType>, 'picker'>>;
280
+ }
281
+ /** The default `DatePicker` (Dayjs), with antd's pure panels and `generatePicker`. */
282
+ interface DatePickerType extends GeneratedDatePicker<Dayjs> {
283
+ /** Debug only: the popup panel rendered inline, always open (antd `render-panel`). */
284
+ _InternalPanelDoNotUseOrYouWillBeFired: ComponentType<DatePickerProps<any>>;
285
+ /** Debug only: the RangePicker popup panel rendered inline, always open. */
286
+ _InternalRangePanelDoNotUseOrYouWillBeFired: ComponentType<DateRangePickerProps>;
287
+ generatePicker: <DateType extends object>(generateConfig: GenerateConfig<DateType>) => GeneratedDatePicker<DateType>;
32
288
  }
33
289
  //#endregion
34
- export { type CalendarMode, DatePickerProps, DateRangePickerProps, DateRangeValue };
290
+ export { CalendarMode, type CellRender, type CellRenderInfo, DatePickerBaseProps, DatePickerProps, DatePickerSemanticType, DatePickerType, DateRangePickerProps, DateRangeValue, GeneratedDatePicker, GenericTimePickerProps, MonthPickerProps, type PanelMode, PickerClassNames, PickerComponents, PickerDateStrings, PickerLocale, PickerLocaleInput, PickerLocaleLang, type PickerMode, PickerPanelProps, PickerPlacement, PickerPopupSemanticName, PickerProps$1 as PickerProps, PickerPropsWithMultiple, type PickerRef, PickerSemanticClassNames, PickerSemanticName, PickerSemanticStyles, PickerSize, PickerStatus, PickerStyles, PickerTagProps, PickerVariant, PresetDate, PresetPickerProps, QuarterPickerProps, RangeDisabledDate, RangeInfo, RangePickerComponent, RangePickerProps$1 as RangePickerProps, type RangePickerRef, SinglePickerComponent, TimePickerLocale, TimePickerProps, WeekPickerProps, YearPickerProps };
35
291
  //# sourceMappingURL=type.d.mts.map
@@ -0,0 +1,230 @@
1
+ "use client";
2
+ import generateConfig from "./generateConfig.mjs";
3
+ import { PREFIX_CLS } from "./style.mjs";
4
+ import { useCallback, useEffect, useId, useRef, useState } from "react";
5
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
6
+ //#region src/base-ui/DatePicker/usePanelKeyboard.tsx
7
+ const isGridMode = (mode) => mode === "month" || mode === "quarter" || mode === "year" || mode === "decade";
8
+ /** Cell steps per panel: one cell (←/→), one row (↑/↓) and one page (PageUp/PageDown). */
9
+ const GRID = {
10
+ decade: {
11
+ col: 10,
12
+ page: 100,
13
+ row: 30,
14
+ unit: "year"
15
+ },
16
+ month: {
17
+ col: 1,
18
+ page: 12,
19
+ row: 3,
20
+ unit: "month"
21
+ },
22
+ quarter: {
23
+ col: 3,
24
+ page: 12,
25
+ row: 12,
26
+ unit: "month"
27
+ },
28
+ year: {
29
+ col: 1,
30
+ page: 10,
31
+ row: 3,
32
+ unit: "year"
33
+ }
34
+ };
35
+ const defaultConfig = generateConfig;
36
+ /** Months since year 0, to compare tiles by position. */
37
+ const monthIndex = (date, config) => config.getYear(date) * 12 + config.getMonth(date);
38
+ /** First cell of the page `date` is on: Jan / Q1 of its year, first year of its decade… */
39
+ const getPageStart = (date, mode, config = defaultConfig) => {
40
+ const year = config.getYear(date);
41
+ const startYear = mode === "year" ? Math.floor(year / 10) * 10 : mode === "decade" ? Math.floor(year / 100) * 100 : year;
42
+ const start = config.setDate(config.setMonth(config.setYear(date, startYear), 0), 1);
43
+ return config.setHour(config.setMinute(config.setSecond(config.setMillisecond(start, 0), 0), 0), 0);
44
+ };
45
+ const getPageEnd = (date, mode, config) => {
46
+ const start = getPageStart(date, mode, config);
47
+ if (mode === "month") return config.setMonth(start, 11);
48
+ if (mode === "quarter") return config.setMonth(start, 9);
49
+ return config.addYear(start, mode === "year" ? 9 : 90);
50
+ };
51
+ /** Whether `a` and `b` fall in the same tile of a `mode` panel. */
52
+ const isSameCell = (a, b, mode, config = defaultConfig) => {
53
+ const yearA = config.getYear(a);
54
+ const yearB = config.getYear(b);
55
+ if (mode === "decade") return Math.floor(yearA / 10) === Math.floor(yearB / 10);
56
+ if (mode === "year") return yearA === yearB;
57
+ if (mode === "quarter") return yearA === yearB && Math.floor(config.getMonth(a) / 3) === Math.floor(config.getMonth(b) / 3);
58
+ return yearA === yearB && config.getMonth(a) === config.getMonth(b);
59
+ };
60
+ /**
61
+ * Where `key` moves the active tile of a `mode` panel, or `undefined` for other keys.
62
+ * `rtl` mirrors ←/→.
63
+ */
64
+ const moveGridCell = (date, key, mode, rtl = false, config = defaultConfig) => {
65
+ const { col, page, row, unit } = GRID[mode];
66
+ const add = (diff) => unit === "year" ? config.addYear(date, diff) : config.addMonth(date, diff);
67
+ switch (key) {
68
+ case "ArrowLeft": return add(rtl ? col : -col);
69
+ case "ArrowRight": return add(rtl ? -col : col);
70
+ case "ArrowUp": return add(-row);
71
+ case "ArrowDown": return add(row);
72
+ case "PageUp": return add(-page);
73
+ case "PageDown": return add(page);
74
+ case "Home": return getPageStart(date, mode, config);
75
+ case "End": return getPageEnd(date, mode, config);
76
+ }
77
+ };
78
+ const ACTIVE_CLS = `${PREFIX_CLS}-cell-keyboard-active`;
79
+ const toPair = (value) => Array.isArray(value) ? [value[0] ?? void 0, value[1] ?? void 0] : [value ?? void 0, void 0];
80
+ /** The selection the keys start from; with `multiple`, the last picked date. */
81
+ const toValuePair = (value, range) => !range && Array.isArray(value) ? toPair(value.at(-1)) : toPair(value);
82
+ /**
83
+ * lobe enhancement over rc-picker (ADR §8 step 6): arrow keys, PageUp / PageDown and
84
+ * Home / End move an active tile on the month, quarter, year and decade panels while
85
+ * focus stays in the input, and Enter picks it — as a click on that tile would.
86
+ *
87
+ * rc-picker has no grid navigation of its own, so this is layered on top: a capture
88
+ * listener reads the keys before rc-picker's input handlers, the active tile is marked
89
+ * through `cellRender`, and `pickerValue` is driven so the active tile stays on screen.
90
+ * The date and week panels keep the input's text-editing keys, as in antd.
91
+ */
92
+ const usePanelKeyboard = ({ cellRender, dateRender, defaultOpen, defaultPickerValue, defaultValue, direction, generateConfig: config = defaultConfig, mode, monthCellRender, onChange, onFocus, onOpenChange, onPanelChange, onPickerValueChange, open, picker = "date", pickerValue, range, value }) => {
93
+ const scopeId = useId();
94
+ const scopeClassName = `${PREFIX_CLS}-kb-${scopeId.replaceAll(/[^\w-]/g, "")}`;
95
+ const [innerOpen, setInnerOpen] = useState(!!defaultOpen);
96
+ const mergedOpen = open ?? innerOpen;
97
+ const [activeIndex, setActiveIndex] = useState(0);
98
+ const [innerMode, setInnerMode] = useState(picker);
99
+ const [innerPickerValue, setInnerPickerValue] = useState([void 0, void 0]);
100
+ const [activeCell, setActiveCell] = useState();
101
+ const [innerValue, setInnerValue] = useState();
102
+ const panelMode = (Array.isArray(mode) ? mode[activeIndex] : mode) ?? innerMode;
103
+ const resetKey = `${mergedOpen}|${activeIndex}|${picker}`;
104
+ const [prevResetKey, setPrevResetKey] = useState(resetKey);
105
+ if (prevResetKey !== resetKey) {
106
+ setPrevResetKey(resetKey);
107
+ setInnerMode(picker);
108
+ setActiveCell(void 0);
109
+ }
110
+ const [prevPanelMode, setPrevPanelMode] = useState(panelMode);
111
+ if (prevPanelMode !== panelMode) {
112
+ setPrevPanelMode(panelMode);
113
+ setActiveCell(void 0);
114
+ }
115
+ const mergedPickerValue = pickerValue === void 0 ? innerPickerValue : toPair(pickerValue);
116
+ const state = {
117
+ activeCell,
118
+ activeIndex,
119
+ config,
120
+ defaultPickerValue: toPair(defaultPickerValue),
121
+ direction,
122
+ mergedPickerValue,
123
+ onPickerValueChange,
124
+ panelMode,
125
+ picker,
126
+ range,
127
+ value: value === void 0 ? innerValue ?? toValuePair(defaultValue, range) : toValuePair(value, range)
128
+ };
129
+ const stateRef = useRef(state);
130
+ stateRef.current = state;
131
+ const commitPickerValue = useCallback((next) => {
132
+ const { activeIndex, mergedPickerValue, onPickerValueChange, panelMode, range } = stateRef.current;
133
+ const nextPair = [...mergedPickerValue];
134
+ nextPair[activeIndex] = next;
135
+ setInnerPickerValue(nextPair);
136
+ if (range) onPickerValueChange?.(nextPair, {
137
+ mode: [panelMode, panelMode],
138
+ range: activeIndex === 1 ? "end" : "start",
139
+ source: "panel"
140
+ });
141
+ else onPickerValueChange?.(next, {
142
+ mode: panelMode,
143
+ source: "panel"
144
+ });
145
+ }, []);
146
+ useEffect(() => {
147
+ if (!mergedOpen) return;
148
+ const onKeyDown = (event) => {
149
+ const { activeCell, activeIndex, config, defaultPickerValue, direction, mergedPickerValue, panelMode, picker, range, value } = stateRef.current;
150
+ if (!isGridMode(panelMode) || event.altKey || event.ctrlKey || event.metaKey) return;
151
+ if (!(event.target instanceof Element) || !event.target.closest(`.${scopeClassName}`)) return;
152
+ if (event.key === "Enter") {
153
+ if (!activeCell) return;
154
+ const cells = [...document.querySelectorAll(`.${scopeClassName} .${ACTIVE_CLS}`)].map((node) => node.closest("td")).filter((node) => !!node);
155
+ const cell = cells.find((node) => node.classList.contains(`${PREFIX_CLS}-cell-in-view`));
156
+ event.preventDefault();
157
+ event.stopPropagation();
158
+ (cell ?? cells[0])?.click();
159
+ return;
160
+ }
161
+ const pageDate = mergedPickerValue[activeIndex] ?? defaultPickerValue[activeIndex] ?? value[activeIndex] ?? config.getNow();
162
+ const rtl = direction === "rtl";
163
+ const pages = range && panelMode === picker ? 2 : 1;
164
+ const pageIndex = (date) => monthIndex(getPageStart(date, panelMode, config), config);
165
+ const firstPage = pageIndex(pageDate);
166
+ const lastPage = pageIndex(moveGridCell(pageDate, "PageDown", panelMode, rtl, config));
167
+ const isVisible = (date) => {
168
+ const page = pageIndex(date);
169
+ return page === firstPage || pages === 2 && page === lastPage;
170
+ };
171
+ const selected = value[activeIndex];
172
+ const base = activeCell && isVisible(activeCell) ? activeCell : selected && isVisible(selected) ? selected : void 0;
173
+ const next = base ? moveGridCell(base, event.key, panelMode, rtl, config) : moveGridCell(pageDate, event.key, panelMode, rtl, config) && pageDate;
174
+ if (!next) return;
175
+ event.preventDefault();
176
+ event.stopPropagation();
177
+ setActiveCell(next);
178
+ if (pageIndex(next) < firstPage) commitPickerValue(next);
179
+ else if (!isVisible(next)) commitPickerValue(pages === 2 ? moveGridCell(next, "PageUp", panelMode, rtl, config) : next);
180
+ };
181
+ document.addEventListener("keydown", onKeyDown, true);
182
+ return () => document.removeEventListener("keydown", onKeyDown, true);
183
+ }, [
184
+ mergedOpen,
185
+ scopeClassName,
186
+ commitPickerValue
187
+ ]);
188
+ const mergedCellRender = (current, info) => {
189
+ let node = info.originNode;
190
+ if (cellRender) node = cellRender(current, info);
191
+ else if (dateRender && info.type === "date") node = dateRender(current, info.today);
192
+ else if (monthCellRender && info.type === "month") node = monthCellRender(current, info.locale);
193
+ if (!activeCell || info.type !== panelMode || !isGridMode(info.type)) return node;
194
+ if (!isSameCell(current, activeCell, info.type, config)) return node;
195
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [node, /* @__PURE__ */ jsx("span", {
196
+ "aria-hidden": true,
197
+ className: ACTIVE_CLS
198
+ })] });
199
+ };
200
+ return {
201
+ cellRender: mergedCellRender,
202
+ onChange: (date, dateString) => {
203
+ setInnerValue(toValuePair(date, range));
204
+ onChange?.(date, dateString);
205
+ },
206
+ onFocus: (event, info) => {
207
+ if (range && info?.range) setActiveIndex(info.range === "end" ? 1 : 0);
208
+ onFocus?.(event, info);
209
+ },
210
+ onOpenChange: (next) => {
211
+ setInnerOpen(next);
212
+ onOpenChange?.(next);
213
+ },
214
+ onPanelChange: (date, nextMode) => {
215
+ setInnerMode(Array.isArray(nextMode) ? nextMode[stateRef.current.activeIndex] : nextMode);
216
+ onPanelChange?.(date, nextMode);
217
+ },
218
+ onPickerValueChange: (date, info) => {
219
+ setInnerPickerValue(toPair(date));
220
+ onPickerValueChange?.(date, info);
221
+ },
222
+ /** Controlled once known, so a key can move the visible page. */
223
+ pickerValue: pickerValue !== void 0 || innerPickerValue.some(Boolean) ? range ? mergedPickerValue : mergedPickerValue[0] : void 0,
224
+ scopeClassName
225
+ };
226
+ };
227
+ //#endregion
228
+ export { getPageStart, isSameCell, moveGridCell, usePanelKeyboard };
229
+
230
+ //# sourceMappingURL=usePanelKeyboard.mjs.map