@comitor/ui 2.1.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +59 -24
- package/dist/chart/chart.d.ts +6 -1
- package/dist/chart/chart.js +3 -1
- package/dist/chart/chart.js.map +1 -1
- package/dist/chart/comitor-chart.d.ts +4 -1
- package/dist/chart/comitor-chart.js +3 -1
- package/dist/chart/comitor-chart.js.map +1 -1
- package/dist/components/composite/avatar-group.d.ts +9 -6
- package/dist/components/composite/avatar-group.js +6 -2
- package/dist/components/composite/avatar-group.js.map +1 -1
- package/dist/components/composite/combobox.d.ts +11 -11
- package/dist/components/composite/combobox.js +25 -11
- package/dist/components/composite/combobox.js.map +1 -1
- package/dist/components/composite/command-palette-constants.d.ts +15 -5
- package/dist/components/composite/command-palette-constants.js +3 -2
- package/dist/components/composite/command-palette-constants.js.map +1 -1
- package/dist/components/composite/command-palette.d.ts +2 -2
- package/dist/components/composite/command-palette.js +8 -5
- package/dist/components/composite/command-palette.js.map +1 -1
- package/dist/components/composite/confirm-dialog.d.ts +8 -8
- package/dist/components/composite/confirm-dialog.js +8 -3
- package/dist/components/composite/confirm-dialog.js.map +1 -1
- package/dist/components/composite/copy-button.d.ts +7 -3
- package/dist/components/composite/copy-button.js +7 -3
- package/dist/components/composite/copy-button.js.map +1 -1
- package/dist/components/composite/data-table-constants.d.ts +7 -3
- package/dist/components/composite/data-table-constants.js +2 -9
- package/dist/components/composite/data-table-constants.js.map +1 -1
- package/dist/components/composite/data-table.js +3 -3
- package/dist/components/composite/data-table.js.map +1 -1
- package/dist/components/composite/date-picker-constants.d.ts +32 -9
- package/dist/components/composite/date-picker-constants.js +16 -11
- package/dist/components/composite/date-picker-constants.js.map +1 -1
- package/dist/components/composite/date-picker.d.ts +19 -10
- package/dist/components/composite/date-picker.js +33 -9
- package/dist/components/composite/date-picker.js.map +1 -1
- package/dist/components/composite/filter-chips.d.ts +4 -3
- package/dist/components/composite/filter-chips.js +6 -2
- package/dist/components/composite/filter-chips.js.map +1 -1
- package/dist/components/composite/inline-edit.d.ts +14 -3
- package/dist/components/composite/inline-edit.js +8 -4
- package/dist/components/composite/inline-edit.js.map +1 -1
- package/dist/components/composite/relative-time.d.ts +4 -4
- package/dist/components/composite/relative-time.js +4 -2
- package/dist/components/composite/relative-time.js.map +1 -1
- package/dist/components/composite/route-tabs-nav.d.ts +9 -0
- package/dist/components/composite/route-tabs-nav.js +11 -0
- package/dist/components/composite/route-tabs-nav.js.map +1 -0
- package/dist/components/composite/route-tabs.d.ts +4 -1
- package/dist/components/composite/route-tabs.js +3 -2
- package/dist/components/composite/route-tabs.js.map +1 -1
- package/dist/components/composite/search-filter-bar-constants.d.ts +18 -8
- package/dist/components/composite/search-filter-bar-constants.js +2 -14
- package/dist/components/composite/search-filter-bar-constants.js.map +1 -1
- package/dist/components/composite/search-filter-bar.d.ts +5 -2
- package/dist/components/composite/search-filter-bar.js +2 -2
- package/dist/components/composite/search-filter-bar.js.map +1 -1
- package/dist/components/composite/stat-card.d.ts +1 -1
- package/dist/components/composite/table-pagination-constants.d.ts +16 -11
- package/dist/components/composite/table-pagination-constants.js +2 -12
- package/dist/components/composite/table-pagination-constants.js.map +1 -1
- package/dist/components/composite/table-pagination.d.ts +6 -3
- package/dist/components/composite/table-pagination.js +3 -5
- package/dist/components/composite/table-pagination.js.map +1 -1
- package/dist/components/composite/toast.d.ts +4 -2
- package/dist/components/composite/toast.js +9 -1
- package/dist/components/composite/toast.js.map +1 -1
- package/dist/components/ui/action-bar-constants.d.ts +8 -4
- package/dist/components/ui/action-bar-constants.js +2 -5
- package/dist/components/ui/action-bar-constants.js.map +1 -1
- package/dist/components/ui/action-bar.d.ts +5 -4
- package/dist/components/ui/action-bar.js +2 -2
- package/dist/components/ui/action-bar.js.map +1 -1
- package/dist/components/ui/alert.d.ts +1 -1
- package/dist/components/ui/badge-overflow.d.ts +2 -2
- package/dist/components/ui/badge-overflow.js +4 -2
- package/dist/components/ui/badge-overflow.js.map +1 -1
- package/dist/components/ui/badge.d.ts +1 -1
- package/dist/components/ui/banner.d.ts +6 -5
- package/dist/components/ui/banner.js +3 -1
- package/dist/components/ui/banner.js.map +1 -1
- package/dist/components/ui/breadcrumb.d.ts +11 -4
- package/dist/components/ui/breadcrumb.js +7 -2
- package/dist/components/ui/breadcrumb.js.map +1 -1
- package/dist/components/ui/button.d.ts +2 -2
- package/dist/components/ui/calendar.d.ts +12 -5
- package/dist/components/ui/calendar.js +38 -3
- package/dist/components/ui/calendar.js.map +1 -1
- package/dist/components/ui/carousel.d.ts +4 -3
- package/dist/components/ui/carousel.js +11 -4
- package/dist/components/ui/carousel.js.map +1 -1
- package/dist/components/ui/circular-progress.js.map +1 -1
- package/dist/components/ui/command.d.ts +5 -4
- package/dist/components/ui/command.js +6 -2
- package/dist/components/ui/command.js.map +1 -1
- package/dist/components/ui/cropper-constants.d.ts +8 -3
- package/dist/components/ui/cropper-constants.js +2 -6
- package/dist/components/ui/cropper-constants.js.map +1 -1
- package/dist/components/ui/cropper.d.ts +2 -1
- package/dist/components/ui/cropper.js +2 -2
- package/dist/components/ui/cropper.js.map +1 -1
- package/dist/components/ui/dialog.d.ts +2 -2
- package/dist/components/ui/dialog.js +4 -1
- package/dist/components/ui/dialog.js.map +1 -1
- package/dist/components/ui/item.d.ts +2 -2
- package/dist/components/ui/kanban-constants.d.ts +7 -1
- package/dist/components/ui/kanban-constants.js +2 -17
- package/dist/components/ui/kanban-constants.js.map +1 -1
- package/dist/components/ui/kanban.d.ts +2 -2
- package/dist/components/ui/kanban.js +2 -2
- package/dist/components/ui/kanban.js.map +1 -1
- package/dist/components/ui/key-value-constants.d.ts +7 -3
- package/dist/components/ui/key-value-constants.js +2 -7
- package/dist/components/ui/key-value-constants.js.map +1 -1
- package/dist/components/ui/key-value.d.ts +5 -5
- package/dist/components/ui/key-value.js +2 -2
- package/dist/components/ui/key-value.js.map +1 -1
- package/dist/components/ui/mask-input-constants.d.ts +2 -3
- package/dist/components/ui/mask-input-constants.js +5 -6
- package/dist/components/ui/mask-input-constants.js.map +1 -1
- package/dist/components/ui/mask-input.d.ts +7 -4
- package/dist/components/ui/mask-input.js +4 -2
- package/dist/components/ui/mask-input.js.map +1 -1
- package/dist/components/ui/mention.d.ts +3 -2
- package/dist/components/ui/mention.js +4 -6
- package/dist/components/ui/mention.js.map +1 -1
- package/dist/components/ui/pagination.d.ts +13 -9
- package/dist/components/ui/pagination.js +15 -6
- package/dist/components/ui/pagination.js.map +1 -1
- package/dist/components/ui/phone-input-constants.d.ts +17 -6
- package/dist/components/ui/phone-input-constants.js +2 -5
- package/dist/components/ui/phone-input-constants.js.map +1 -1
- package/dist/components/ui/phone-input.d.ts +18 -11
- package/dist/components/ui/phone-input.js +9 -10
- package/dist/components/ui/phone-input.js.map +1 -1
- package/dist/components/ui/progress.d.ts +2 -2
- package/dist/components/ui/rating.d.ts +2 -1
- package/dist/components/ui/rating.js +4 -2
- package/dist/components/ui/rating.js.map +1 -1
- package/dist/components/ui/scroll-spy.js +3 -1
- package/dist/components/ui/scroll-spy.js.map +1 -1
- package/dist/components/ui/sheet.d.ts +2 -2
- package/dist/components/ui/sheet.js +10 -1
- package/dist/components/ui/sheet.js.map +1 -1
- package/dist/components/ui/spinner.js +4 -1
- package/dist/components/ui/spinner.js.map +1 -1
- package/dist/components/ui/stepper-constants.d.ts +7 -2
- package/dist/components/ui/stepper-constants.js +2 -5
- package/dist/components/ui/stepper-constants.js.map +1 -1
- package/dist/components/ui/stepper.d.ts +2 -1
- package/dist/components/ui/stepper.js +2 -2
- package/dist/components/ui/stepper.js.map +1 -1
- package/dist/components/ui/tags-input.d.ts +3 -2
- package/dist/components/ui/tags-input.js +4 -2
- package/dist/components/ui/tags-input.js.map +1 -1
- package/dist/components/ui/time-picker-constants.d.ts +12 -9
- package/dist/components/ui/time-picker-constants.js +2 -10
- package/dist/components/ui/time-picker-constants.js.map +1 -1
- package/dist/components/ui/time-picker.d.ts +11 -6
- package/dist/components/ui/time-picker.js +5 -7
- package/dist/components/ui/time-picker.js.map +1 -1
- package/dist/components/ui/toggle.d.ts +1 -1
- package/dist/components/ui/tour-constants.d.ts +7 -2
- package/dist/components/ui/tour-constants.js +2 -8
- package/dist/components/ui/tour-constants.js.map +1 -1
- package/dist/components/ui/tour.d.ts +3 -2
- package/dist/components/ui/tour.js +2 -2
- package/dist/components/ui/tour.js.map +1 -1
- package/dist/data-grid/data-grid-cell-variants.js +4 -4
- package/dist/data-grid/data-grid-cell-variants.js.map +1 -1
- package/dist/data-grid/data-grid-column-header.js +1 -1
- package/dist/data-grid/data-grid-column-header.js.map +1 -1
- package/dist/data-grid/data-grid-filter-menu.d.ts +5 -4
- package/dist/data-grid/data-grid-filter-menu.js +13 -8
- package/dist/data-grid/data-grid-filter-menu.js.map +1 -1
- package/dist/data-grid/data-grid-keyboard-shortcuts.d.ts +4 -4
- package/dist/data-grid/data-grid-keyboard-shortcuts.js.map +1 -1
- package/dist/data-grid/data-grid-locale.d.ts +58 -6
- package/dist/data-grid/data-grid-locale.js +41 -9
- package/dist/data-grid/data-grid-locale.js.map +1 -1
- package/dist/data-grid/data-grid-row-height-menu.d.ts +4 -3
- package/dist/data-grid/data-grid-row-height-menu.js.map +1 -1
- package/dist/data-grid/data-grid-sort-menu.d.ts +4 -4
- package/dist/data-grid/data-grid-sort-menu.js +1 -1
- package/dist/data-grid/data-grid-sort-menu.js.map +1 -1
- package/dist/data-grid/data-grid-view-menu.d.ts +4 -4
- package/dist/data-grid/data-grid-view-menu.js.map +1 -1
- package/dist/data-grid/data-grid.d.ts +4 -3
- package/dist/data-grid/data-grid.js +2 -3
- package/dist/data-grid/data-grid.js.map +1 -1
- package/dist/data-grid/index.d.ts +1 -0
- package/dist/data-grid/index.js.map +1 -1
- package/dist/data-grid/messages-en.d.ts +23 -4
- package/dist/data-grid/messages-en.js +20 -0
- package/dist/data-grid/messages-en.js.map +1 -1
- package/dist/data-grid/messages-vi.d.ts +3 -1
- package/dist/data-grid/messages-vi.js +14 -0
- package/dist/data-grid/messages-vi.js.map +1 -1
- package/dist/data-grid/messages.d.ts +29 -3
- package/dist/data-grid/messages.js.map +1 -1
- package/dist/data-grid/sortable.js +16 -19
- package/dist/data-grid/sortable.js.map +1 -1
- package/dist/data-grid/types.d.ts +1 -1
- package/dist/data-grid/use-data-grid-undo-redo.d.ts +5 -4
- package/dist/data-grid/use-data-grid-undo-redo.js +2 -2
- package/dist/data-grid/use-data-grid-undo-redo.js.map +1 -1
- package/dist/data-grid/use-data-grid.d.ts +21 -6
- package/dist/data-grid/use-data-grid.js +8 -6
- package/dist/data-grid/use-data-grid.js.map +1 -1
- package/dist/data-grid/utils.d.ts +24 -4
- package/dist/data-grid/utils.js +15 -5
- package/dist/data-grid/utils.js.map +1 -1
- package/dist/i18n/locale-provider.d.ts +109 -0
- package/dist/i18n/locale-provider.js +47 -0
- package/dist/i18n/locale-provider.js.map +1 -0
- package/dist/i18n/locale.d.ts +27 -0
- package/dist/i18n/locale.js +10 -0
- package/dist/i18n/locale.js.map +1 -0
- package/dist/i18n/messages.d.ts +116 -0
- package/dist/i18n/messages.js +149 -0
- package/dist/i18n/messages.js.map +1 -0
- package/dist/i18n/namespaces/action-bar.d.ts +7 -0
- package/dist/i18n/namespaces/action-bar.js +15 -0
- package/dist/i18n/namespaces/action-bar.js.map +1 -0
- package/dist/i18n/namespaces/avatar-group.d.ts +14 -0
- package/dist/i18n/namespaces/avatar-group.js +13 -0
- package/dist/i18n/namespaces/avatar-group.js.map +1 -0
- package/dist/i18n/namespaces/badge-overflow.d.ts +12 -0
- package/dist/i18n/namespaces/badge-overflow.js +11 -0
- package/dist/i18n/namespaces/badge-overflow.js.map +1 -0
- package/dist/i18n/namespaces/banner.d.ts +9 -0
- package/dist/i18n/namespaces/banner.js +7 -0
- package/dist/i18n/namespaces/banner.js.map +1 -0
- package/dist/i18n/namespaces/breadcrumb.d.ts +11 -0
- package/dist/i18n/namespaces/breadcrumb.js +13 -0
- package/dist/i18n/namespaces/breadcrumb.js.map +1 -0
- package/dist/i18n/namespaces/calendar.d.ts +40 -0
- package/dist/i18n/namespaces/calendar.js +25 -0
- package/dist/i18n/namespaces/calendar.js.map +1 -0
- package/dist/i18n/namespaces/carousel.d.ts +15 -0
- package/dist/i18n/namespaces/carousel.js +17 -0
- package/dist/i18n/namespaces/carousel.js.map +1 -0
- package/dist/i18n/namespaces/combobox.d.ts +21 -0
- package/dist/i18n/namespaces/combobox.js +23 -0
- package/dist/i18n/namespaces/combobox.js.map +1 -0
- package/dist/i18n/namespaces/command-palette.d.ts +20 -0
- package/dist/i18n/namespaces/command-palette.js +19 -0
- package/dist/i18n/namespaces/command-palette.js.map +1 -0
- package/dist/i18n/namespaces/command.d.ts +11 -0
- package/dist/i18n/namespaces/command.js +13 -0
- package/dist/i18n/namespaces/command.js.map +1 -0
- package/dist/i18n/namespaces/confirm-dialog.d.ts +13 -0
- package/dist/i18n/namespaces/confirm-dialog.js +15 -0
- package/dist/i18n/namespaces/confirm-dialog.js.map +1 -0
- package/dist/i18n/namespaces/contrast.d.ts +7 -0
- package/dist/i18n/namespaces/contrast.js +13 -0
- package/dist/i18n/namespaces/contrast.js.map +1 -0
- package/dist/i18n/namespaces/copy-button.d.ts +11 -0
- package/dist/i18n/namespaces/copy-button.js +13 -0
- package/dist/i18n/namespaces/copy-button.js.map +1 -0
- package/dist/i18n/namespaces/cropper.d.ts +7 -0
- package/dist/i18n/namespaces/cropper.js +17 -0
- package/dist/i18n/namespaces/cropper.js.map +1 -0
- package/dist/i18n/namespaces/data-table.d.ts +7 -0
- package/dist/i18n/namespaces/data-table.js +23 -0
- package/dist/i18n/namespaces/data-table.js.map +1 -0
- package/dist/i18n/namespaces/date-picker.d.ts +42 -0
- package/dist/i18n/namespaces/date-picker.js +35 -0
- package/dist/i18n/namespaces/date-picker.js.map +1 -0
- package/dist/i18n/namespaces/dialog.d.ts +9 -0
- package/dist/i18n/namespaces/dialog.js +7 -0
- package/dist/i18n/namespaces/dialog.js.map +1 -0
- package/dist/i18n/namespaces/display-axis.d.ts +25 -0
- package/dist/i18n/namespaces/display-axis.js +21 -0
- package/dist/i18n/namespaces/display-axis.js.map +1 -0
- package/dist/i18n/namespaces/file-upload.d.ts +11 -0
- package/dist/i18n/namespaces/file-upload.js +19 -0
- package/dist/i18n/namespaces/file-upload.js.map +1 -0
- package/dist/i18n/namespaces/filter-chips.d.ts +11 -0
- package/dist/i18n/namespaces/filter-chips.js +13 -0
- package/dist/i18n/namespaces/filter-chips.js.map +1 -0
- package/dist/i18n/namespaces/image-upload-field.d.ts +12 -0
- package/dist/i18n/namespaces/image-upload-field.js +23 -0
- package/dist/i18n/namespaces/image-upload-field.js.map +1 -0
- package/dist/i18n/namespaces/inline-edit.d.ts +15 -0
- package/dist/i18n/namespaces/inline-edit.js +17 -0
- package/dist/i18n/namespaces/inline-edit.js.map +1 -0
- package/dist/i18n/namespaces/kanban.d.ts +11 -0
- package/dist/i18n/namespaces/kanban.js +39 -0
- package/dist/i18n/namespaces/kanban.js.map +1 -0
- package/dist/i18n/namespaces/key-value.d.ts +10 -0
- package/dist/i18n/namespaces/key-value.js +19 -0
- package/dist/i18n/namespaces/key-value.js.map +1 -0
- package/dist/i18n/namespaces/mention.d.ts +9 -0
- package/dist/i18n/namespaces/mention.js +7 -0
- package/dist/i18n/namespaces/mention.js.map +1 -0
- package/dist/i18n/namespaces/pagination.d.ts +19 -0
- package/dist/i18n/namespaces/pagination.js +21 -0
- package/dist/i18n/namespaces/pagination.js.map +1 -0
- package/dist/i18n/namespaces/phone-input.d.ts +10 -0
- package/dist/i18n/namespaces/phone-input.js +17 -0
- package/dist/i18n/namespaces/phone-input.js.map +1 -0
- package/dist/i18n/namespaces/rating.d.ts +12 -0
- package/dist/i18n/namespaces/rating.js +11 -0
- package/dist/i18n/namespaces/rating.js.map +1 -0
- package/dist/i18n/namespaces/route-tabs.d.ts +9 -0
- package/dist/i18n/namespaces/route-tabs.js +7 -0
- package/dist/i18n/namespaces/route-tabs.js.map +1 -0
- package/dist/i18n/namespaces/scroll-spy.d.ts +9 -0
- package/dist/i18n/namespaces/scroll-spy.js +7 -0
- package/dist/i18n/namespaces/scroll-spy.js.map +1 -0
- package/dist/i18n/namespaces/search-filter-bar.d.ts +15 -0
- package/dist/i18n/namespaces/search-filter-bar.js +32 -0
- package/dist/i18n/namespaces/search-filter-bar.js.map +1 -0
- package/dist/i18n/namespaces/sheet.d.ts +9 -0
- package/dist/i18n/namespaces/sheet.js +7 -0
- package/dist/i18n/namespaces/sheet.js.map +1 -0
- package/dist/i18n/namespaces/shell.d.ts +17 -0
- package/dist/i18n/namespaces/shell.js +75 -0
- package/dist/i18n/namespaces/shell.js.map +1 -0
- package/dist/i18n/namespaces/spinner.d.ts +9 -0
- package/dist/i18n/namespaces/spinner.js +7 -0
- package/dist/i18n/namespaces/spinner.js.map +1 -0
- package/dist/i18n/namespaces/stepper.d.ts +7 -0
- package/dist/i18n/namespaces/stepper.js +15 -0
- package/dist/i18n/namespaces/stepper.js.map +1 -0
- package/dist/i18n/namespaces/table-pagination.d.ts +7 -0
- package/dist/i18n/namespaces/table-pagination.js +29 -0
- package/dist/i18n/namespaces/table-pagination.js.map +1 -0
- package/dist/i18n/namespaces/tags-input.d.ts +12 -0
- package/dist/i18n/namespaces/tags-input.js +11 -0
- package/dist/i18n/namespaces/tags-input.js.map +1 -0
- package/dist/i18n/namespaces/time-picker.d.ts +15 -0
- package/dist/i18n/namespaces/time-picker.js +25 -0
- package/dist/i18n/namespaces/time-picker.js.map +1 -0
- package/dist/i18n/namespaces/toast.d.ts +15 -0
- package/dist/i18n/namespaces/toast.js +7 -0
- package/dist/i18n/namespaces/toast.js.map +1 -0
- package/dist/i18n/namespaces/tour.d.ts +7 -0
- package/dist/i18n/namespaces/tour.js +21 -0
- package/dist/i18n/namespaces/tour.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.js +24 -1
- package/dist/index.js.map +1 -1
- package/dist/shell/app-header.js.map +1 -1
- package/dist/shell/app-shell.d.ts +20 -2
- package/dist/shell/app-shell.js +4 -1
- package/dist/shell/app-shell.js.map +1 -1
- package/dist/shell/contrast-constants.d.ts +9 -1
- package/dist/shell/contrast-constants.js +2 -4
- package/dist/shell/contrast-constants.js.map +1 -1
- package/dist/shell/contrast-toggle.d.ts +4 -1
- package/dist/shell/contrast-toggle.js +2 -2
- package/dist/shell/contrast-toggle.js.map +1 -1
- package/dist/shell/display-axis-constants.d.ts +2 -1
- package/dist/shell/display-axis-constants.js.map +1 -1
- package/dist/shell/display-axis-controls.d.ts +15 -6
- package/dist/shell/display-axis-controls.js +11 -9
- package/dist/shell/display-axis-controls.js.map +1 -1
- package/dist/shell/mobile-menu.js.map +1 -1
- package/dist/shell/notifications-button.d.ts +1 -1
- package/dist/shell/notifications-button.js +3 -2
- package/dist/shell/notifications-button.js.map +1 -1
- package/dist/shell/shell-context.d.ts +4 -1
- package/dist/shell/shell-context.js +2 -4
- package/dist/shell/shell-context.js.map +1 -1
- package/dist/shell/sidebar.d.ts +1 -1
- package/dist/shell/sidebar.js.map +1 -1
- package/dist/shell/theme-toggle.d.ts +6 -3
- package/dist/shell/theme-toggle.js +2 -2
- package/dist/shell/theme-toggle.js.map +1 -1
- package/dist/shell/types.d.ts +14 -8
- package/dist/shell/types.js +2 -35
- package/dist/shell/types.js.map +1 -1
- package/dist/shell/user-menu.d.ts +6 -6
- package/dist/shell/user-menu.js.map +1 -1
- package/dist/shell/utils.d.ts +1 -1
- package/dist/shell/utils.js.map +1 -1
- package/dist/shell/workspace-switcher.js +1 -1
- package/dist/shell/workspace-switcher.js.map +1 -1
- package/dist/uploader/file-upload-constants.d.ts +13 -0
- package/dist/uploader/file-upload-constants.js +4 -16
- package/dist/uploader/file-upload-constants.js.map +1 -1
- package/dist/uploader/file-upload.d.ts +4 -1
- package/dist/uploader/file-upload.js +2 -2
- package/dist/uploader/file-upload.js.map +1 -1
- package/dist/uploader/image-upload-field.d.ts +5 -1
- package/dist/uploader/image-upload-field.js +2 -2
- package/dist/uploader/image-upload-field.js.map +1 -1
- package/dist/uploader/use-file-upload.d.ts +4 -0
- package/dist/uploader/use-file-upload.js +6 -2
- package/dist/uploader/use-file-upload.js.map +1 -1
- package/package.json +4 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/ui/time-picker.tsx"],"sourcesContent":["\"use client\";\n\n/*\n * Port từ Dice UI (https://diceui.com/docs/components/time-picker) — MIT, © 2024 Sadman Sakib.\n * Giữ nguyên cấu trúc thượng nguồn để còn đối chiếu ngược được; mọi chỗ đổi đều có chú thích.\n */\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { Clock } from \"lucide-react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/cn.js\";\nimport { useComposedRefs } from \"../../lib/compose-refs.js\";\nimport { useAsRef } from \"../../lib/use-as-ref.js\";\nimport { useIsomorphicLayoutEffect } from \"../../lib/use-isomorphic-layout-effect.js\";\nimport { useLazyRef } from \"../../lib/use-lazy-ref.js\";\nimport { VisuallyHiddenInput } from \"../../lib/visually-hidden-input.js\";\nimport { Popover, PopoverAnchor, PopoverContent, PopoverTrigger } from \"./popover.js\";\nimport { DEFAULT_TIME_PICKER_LABELS, type TimePickerLabels } from \"./time-picker-constants.js\";\n\nconst ROOT_NAME = \"TimePicker\";\nconst LABEL_NAME = \"TimePickerLabel\";\nconst INPUT_GROUP_NAME = \"TimePickerInputGroup\";\nconst INPUT_NAME = \"TimePickerInput\";\nconst TRIGGER_NAME = \"TimePickerTrigger\";\nconst CONTENT_NAME = \"TimePickerContent\";\nconst COLUMN_NAME = \"TimePickerColumn\";\nconst COLUMN_ITEM_NAME = \"TimePickerColumnItem\";\nconst HOUR_NAME = \"TimePickerHour\";\nconst MINUTE_NAME = \"TimePickerMinute\";\nconst SECOND_NAME = \"TimePickerSecond\";\nconst PERIOD_NAME = \"TimePickerPeriod\";\nconst CLEAR_NAME = \"TimePickerClear\";\n\nconst DEFAULT_STEP = 1;\nconst DEFAULT_SEGMENT_PLACEHOLDER = \"--\";\n/*\n * ⚠ Khác thượng nguồn: bản gốc để `undefined`, tức đồng hồ 12/24 giờ suy từ locale của MÔI\n * TRƯỜNG CHẠY. Hai hệ quả với Comitor: (1) máy chủ Node thường là `en-US` → 12 giờ, trình duyệt\n * của người dùng Việt là `vi` → 24 giờ, nên cùng một giá trị \"14:30\" server in \"02\" còn client in\n * \"14\" — lệch hydrate (cùng lý do `Calendar` bỏ `\"default\"`); (2) Việt Nam dùng đồng hồ 24 giờ,\n * nên mặc định phải ra 24 giờ bất kể máy. `Intl.DateTimeFormat(\"vi-VN\", { hour: \"numeric\" })`\n * in \"13 giờ\" cho 13:00 → `getIs12Hour` trả `false`. Prop `locale` vẫn giữ nguyên để đổi.\n */\nconst DEFAULT_LOCALE = \"vi-VN\";\nconst SEGMENTS: Segment[] = [\"hour\", \"minute\", \"second\", \"period\"];\nconst PERIODS = [\"AM\", \"PM\"] as const;\n\ntype Segment = \"hour\" | \"minute\" | \"second\" | \"period\";\ntype SegmentFormat = \"numeric\" | \"2-digit\";\ntype Period = (typeof PERIODS)[number];\n\ninterface DivProps extends React.ComponentProps<\"div\"> {\n asChild?: boolean;\n}\n\ninterface ButtonProps extends React.ComponentProps<\"button\"> {\n asChild?: boolean;\n}\n\ntype PopoverContentProps = React.ComponentProps<typeof PopoverContent>;\n\ntype InputGroupElement = React.ComponentRef<typeof TimePickerInputGroup>;\ntype InputElement = React.ComponentRef<typeof TimePickerInput>;\ntype TriggerElement = React.ComponentRef<typeof TimePickerTrigger>;\ntype ColumnElement = React.ComponentRef<typeof TimePickerColumn>;\ntype ColumnItemElement = React.ComponentRef<typeof TimePickerColumnItem>;\n\ninterface TimeValue {\n hour?: number;\n minute?: number;\n second?: number;\n period?: Period;\n}\n\ninterface ItemData {\n value: number | string;\n ref: React.RefObject<ColumnItemElement | null>;\n selected: boolean;\n}\n\ninterface ColumnData {\n id: string;\n ref: React.RefObject<ColumnElement | null>;\n getSelectedItemRef: () => React.RefObject<ColumnItemElement | null> | null;\n getItems: () => ItemData[];\n}\n\nfunction focusFirst(candidates: React.RefObject<ColumnItemElement | null>[], preventScroll = false) {\n const PREVIOUSLY_FOCUSED_ELEMENT = document.activeElement;\n for (const candidateRef of candidates) {\n const candidate = candidateRef.current;\n if (!candidate) continue;\n if (candidate === PREVIOUSLY_FOCUSED_ELEMENT) return;\n candidate.focus({ preventScroll });\n if (document.activeElement !== PREVIOUSLY_FOCUSED_ELEMENT) return;\n }\n}\n\nfunction sortNodes<T extends { ref: React.RefObject<Element | null> }>(items: T[]): T[] {\n return items.sort((a, b) => {\n const elementA = a.ref.current;\n const elementB = b.ref.current;\n if (!elementA || !elementB) return 0;\n const position = elementA.compareDocumentPosition(elementB);\n if (position & Node.DOCUMENT_POSITION_FOLLOWING) {\n return -1;\n }\n if (position & Node.DOCUMENT_POSITION_PRECEDING) {\n return 1;\n }\n return 0;\n });\n}\n\nfunction getIs12Hour(locale?: string): boolean {\n const testDate = new Date(2000, 0, 1, 13, 0, 0);\n const formatted = new Intl.DateTimeFormat(locale, {\n hour: \"numeric\"\n }).format(testDate);\n\n return /am|pm/i.test(formatted) || !formatted.includes(\"13\");\n}\n\nfunction parseTimeString(timeString: string | undefined): TimeValue | null {\n if (!timeString) return null;\n\n const parts = timeString.split(\":\");\n if (parts.length < 2) return null;\n\n const result: TimeValue = {};\n\n if (parts[0] && parts[0] !== DEFAULT_SEGMENT_PLACEHOLDER) {\n const hour = Number.parseInt(parts[0], 10);\n if (!Number.isNaN(hour) && hour >= 0 && hour <= 23) {\n result.hour = hour;\n }\n }\n\n if (parts[1] && parts[1] !== DEFAULT_SEGMENT_PLACEHOLDER) {\n const minute = Number.parseInt(parts[1], 10);\n if (!Number.isNaN(minute) && minute >= 0 && minute <= 59) {\n result.minute = minute;\n }\n }\n\n if (parts[2] && parts[2] !== DEFAULT_SEGMENT_PLACEHOLDER) {\n const second = Number.parseInt(parts[2], 10);\n if (!Number.isNaN(second) && second >= 0 && second <= 59) {\n result.second = second;\n }\n }\n if (result.hour === undefined && result.minute === undefined && result.second === undefined) {\n return null;\n }\n\n return result;\n}\n\nfunction formatTimeValue(value: TimeValue, showSeconds: boolean): string {\n const hourStr = value.hour !== undefined ? value.hour.toString().padStart(2, \"0\") : DEFAULT_SEGMENT_PLACEHOLDER;\n const minuteStr = value.minute !== undefined ? value.minute.toString().padStart(2, \"0\") : DEFAULT_SEGMENT_PLACEHOLDER;\n const secondStr = value.second !== undefined ? value.second.toString().padStart(2, \"0\") : DEFAULT_SEGMENT_PLACEHOLDER;\n\n if (showSeconds) {\n return `${hourStr}:${minuteStr}:${secondStr}`;\n }\n return `${hourStr}:${minuteStr}`;\n}\n\nfunction to12Hour(hour24: number): { hour: number; period: Period } {\n const period: Period = hour24 >= 12 ? \"PM\" : \"AM\";\n const hour = hour24 % 12 || 12;\n return { hour, period };\n}\n\nfunction to24Hour(hour12: number, period: Period): number {\n if (hour12 === 12) {\n return period === \"PM\" ? 12 : 0;\n }\n return period === \"PM\" ? hour12 + 12 : hour12;\n}\n\nfunction clamp(value: number, min: number, max: number) {\n return Math.min(Math.max(value, min), max);\n}\n\n/*\n * ⚠ Khác thượng nguồn: bản gốc in thẳng mã buổi \"AM\"/\"PM\" ra ô và ra cột. Ở đây mã buổi vẫn là\n * thứ chạy trong state (`editValue`, `updateTimeValue`) — chỉ lúc VẼ mới đổi sang nhãn hiển thị\n * (`labels.am`/`labels.pm`, mặc định \"SA\"/\"CH\"), nên logic bàn phím của thượng nguồn giữ nguyên.\n */\nfunction getPeriodLabel(value: string, labels: Pick<TimePickerLabels, \"am\" | \"pm\">): string {\n if (value === \"AM\") return labels.am;\n if (value === \"PM\") return labels.pm;\n return value;\n}\n\n/*\n * ⚠ Khác thượng nguồn: bản gốc chỉ nhận `A`/`1` → AM và `P`/`2` → PM (viết thẳng ở hai chỗ).\n * Nhãn hiển thị là \"SA\"/\"CH\" thì người dùng sẽ gõ `S`/`C`, nên ký tự đầu của nhãn cũng là phím\n * tắt. Phím của thượng nguồn được xét TRƯỚC và vẫn chạy.\n */\nfunction getPeriodFromKey(key: string, labels: Pick<TimePickerLabels, \"am\" | \"pm\">): Period | null {\n const lowerKey = key.toLowerCase();\n if (lowerKey === \"a\" || lowerKey === \"1\") return \"AM\";\n if (lowerKey === \"p\" || lowerKey === \"2\") return \"PM\";\n if (lowerKey.length !== 1) return null;\n if (lowerKey === labels.am.charAt(0).toLowerCase()) return \"AM\";\n if (lowerKey === labels.pm.charAt(0).toLowerCase()) return \"PM\";\n return null;\n}\n\ninterface StoreState {\n value: string;\n open: boolean;\n openedViaFocus: boolean;\n}\n\ninterface Store {\n subscribe: (callback: () => void) => () => void;\n getState: () => StoreState;\n setState: <K extends keyof StoreState>(key: K, value: StoreState[K]) => void;\n notify: () => void;\n}\n\nconst StoreContext = React.createContext<Store | null>(null);\n\nfunction useStoreContext(consumerName: string) {\n const context = React.useContext(StoreContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` phải nằm bên trong \\`${ROOT_NAME}\\``);\n }\n return context;\n}\n\nfunction useStore<T>(selector: (state: StoreState) => T, ogStore?: Store | null): T {\n const contextStore = React.useContext(StoreContext);\n\n const store = ogStore ?? contextStore;\n\n if (!store) {\n throw new Error(`\\`useTimePicker\\` phải được gọi bên trong \\`${ROOT_NAME}\\``);\n }\n\n const getSnapshot = React.useCallback(() => selector(store.getState()), [store, selector]);\n\n return React.useSyncExternalStore(store.subscribe, getSnapshot, getSnapshot);\n}\n\ntype SegmentPlaceholder =\n | string\n | {\n hour?: string;\n minute?: string;\n second?: string;\n period?: string;\n };\n\ninterface TimePickerContextValue {\n id: string;\n inputGroupId: string;\n labelId: string;\n triggerId: string;\n inputGroupRef: React.RefObject<InputGroupElement | null>;\n triggerRef: React.RefObject<TriggerElement | null>;\n openOnFocus: boolean;\n inputGroupClickAction: \"focus\" | \"open\";\n onInputGroupChange: (inputGroup: InputGroupElement | null) => void;\n disabled: boolean;\n readOnly: boolean;\n required: boolean;\n invalid: boolean;\n showSeconds: boolean;\n is12Hour: boolean;\n minuteStep: number;\n secondStep: number;\n hourStep: number;\n segmentPlaceholder: {\n hour: string;\n minute: string;\n second: string;\n period: string;\n };\n labels: TimePickerLabels;\n min?: string;\n max?: string;\n}\n\nconst TimePickerContext = React.createContext<TimePickerContextValue | null>(null);\n\nfunction useTimePickerContext(consumerName: string) {\n const context = React.useContext(TimePickerContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` phải nằm bên trong \\`${ROOT_NAME}\\``);\n }\n return context;\n}\n\ninterface TimePickerProps extends DivProps {\n /** Giá trị có kiểm soát, LUÔN ở dạng 24 giờ: `\"HH:mm\"` hoặc `\"HH:mm:ss\"` — bất kể đồng hồ hiển thị. */\n value?: string;\n /** Giá trị ban đầu (không kiểm soát), cùng định dạng với `value`. */\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** Mở bảng chọn ngay khi một ô được focus. Mặc định `false`. */\n openOnFocus?: boolean;\n /** Bấm vào khoảng trống của nhóm ô: `\"focus\"` (mặc định) focus ô đầu, `\"open\"` mở bảng chọn. */\n inputGroupClickAction?: \"focus\" | \"open\";\n /**\n * ⚠ Thượng nguồn nhận `min`/`max` và đưa vào context nhưng CHƯA áp dụng ở đâu cả — không chặn\n * gõ, không làm mờ mục trong cột. Giữ để khớp API gốc; muốn ràng buộc khung giờ (ca làm, giờ\n * hành chính) thì app phải tự kiểm ở `onValueChange` / tầng validate của form.\n */\n min?: string;\n /** Xem `min`. */\n max?: string;\n hourStep?: number;\n minuteStep?: number;\n secondStep?: number;\n /** Chữ giữ chỗ của ô trống — một chuỗi cho mọi ô, hoặc từng ô. Mặc định `\"--\"`. */\n segmentPlaceholder?: SegmentPlaceholder;\n /**\n * Locale BCP 47 quyết định đồng hồ 12 hay 24 giờ — CHỈ vậy, không dịch nhãn (xem `labels`).\n *\n * ⚠ Khác thượng nguồn: mặc định `\"vi-VN\"` (đồng hồ 24 giờ) thay vì locale của môi trường chạy.\n * Muốn 12 giờ: `locale=\"en-US\"` kèm `labels={{ am: \"AM\", pm: \"PM\" }}`. Muốn theo trình duyệt:\n * truyền `navigator.language` — nhưng chỉ sau khi hydrate, vì server không biết giá trị đó.\n */\n locale?: string;\n /**\n * Chuỗi hiển thị và nhãn trình đọc màn hình (tên từng ô, \"SA\"/\"CH\", tên nút mở, nút xoá) —\n * mặc định tiếng Việt, xem `DEFAULT_TIME_PICKER_LABELS`. Thêm so với thượng nguồn.\n */\n labels?: Partial<TimePickerLabels>;\n name?: string;\n disabled?: boolean;\n invalid?: boolean;\n readOnly?: boolean;\n required?: boolean;\n showSeconds?: boolean;\n}\n\nfunction TimePicker(props: TimePickerProps) {\n const {\n value: valueProp,\n defaultValue,\n onValueChange,\n open,\n defaultOpen,\n onOpenChange,\n openOnFocus = false,\n inputGroupClickAction = \"focus\",\n min,\n max,\n hourStep = DEFAULT_STEP,\n minuteStep = DEFAULT_STEP,\n secondStep = DEFAULT_STEP,\n segmentPlaceholder = DEFAULT_SEGMENT_PLACEHOLDER,\n locale = DEFAULT_LOCALE,\n labels: labelsProp,\n name,\n asChild,\n disabled = false,\n invalid = false,\n readOnly = false,\n required = false,\n showSeconds = false,\n className,\n children,\n id,\n ...rootProps\n } = props;\n\n const instanceId = React.useId();\n const rootId = id ?? instanceId;\n const inputGroupId = React.useId();\n const labelId = React.useId();\n const triggerId = React.useId();\n\n const inputGroupRef = React.useRef<InputGroupElement>(null);\n const triggerRef = React.useRef<TriggerElement>(null);\n\n const [inputGroup, setInputGroup] = React.useState<InputGroupElement | null>(null);\n const isFormControl = inputGroup ? !!inputGroup.closest(\"form\") : true;\n\n const listenersRef = useLazyRef(() => new Set<() => void>());\n const stateRef = useLazyRef<StoreState>(() => ({\n value: valueProp ?? defaultValue ?? \"\",\n open: open ?? defaultOpen ?? false,\n openedViaFocus: false\n }));\n\n const propsRef = useAsRef({ onValueChange, onOpenChange });\n\n const store: Store = React.useMemo(() => {\n return {\n subscribe: (cb) => {\n listenersRef.current.add(cb);\n return () => listenersRef.current.delete(cb);\n },\n getState: () => stateRef.current,\n setState: (key, value) => {\n if (Object.is(stateRef.current[key], value)) return;\n\n if (key === \"value\" && typeof value === \"string\") {\n stateRef.current.value = value;\n propsRef.current.onValueChange?.(value);\n } else if (key === \"open\" && typeof value === \"boolean\") {\n stateRef.current.open = value;\n propsRef.current.onOpenChange?.(value);\n if (!value) {\n stateRef.current.openedViaFocus = false;\n }\n } else {\n stateRef.current[key] = value;\n }\n\n store.notify();\n },\n notify: () => {\n for (const cb of listenersRef.current) {\n cb();\n }\n }\n };\n }, [listenersRef, stateRef, propsRef]);\n\n const value = useStore((state) => state.value, store);\n\n useIsomorphicLayoutEffect(() => {\n if (valueProp !== undefined) {\n store.setState(\"value\", valueProp);\n }\n }, [valueProp]);\n\n useIsomorphicLayoutEffect(() => {\n if (open !== undefined) {\n store.setState(\"open\", open);\n }\n }, [open]);\n\n const storeOpen = useStore((state) => state.open, store);\n\n const onPopoverOpenChange = React.useCallback((newOpen: boolean) => store.setState(\"open\", newOpen), [store]);\n\n const is12Hour = React.useMemo(() => getIs12Hour(locale), [locale]);\n\n const normalizedPlaceholder = React.useMemo(() => {\n if (typeof segmentPlaceholder === \"string\") {\n return {\n hour: segmentPlaceholder,\n minute: segmentPlaceholder,\n second: segmentPlaceholder,\n period: segmentPlaceholder\n };\n }\n return {\n hour: segmentPlaceholder.hour ?? DEFAULT_SEGMENT_PLACEHOLDER,\n minute: segmentPlaceholder.minute ?? DEFAULT_SEGMENT_PLACEHOLDER,\n second: segmentPlaceholder.second ?? DEFAULT_SEGMENT_PLACEHOLDER,\n period: segmentPlaceholder.period ?? DEFAULT_SEGMENT_PLACEHOLDER\n };\n }, [segmentPlaceholder]);\n\n const labels = React.useMemo<TimePickerLabels>(\n () => ({ ...DEFAULT_TIME_PICKER_LABELS, ...labelsProp }),\n [labelsProp]\n );\n\n const rootContext = React.useMemo<TimePickerContextValue>(\n () => ({\n id: rootId,\n inputGroupId,\n labelId,\n triggerId,\n inputGroupRef,\n triggerRef,\n openOnFocus,\n inputGroupClickAction,\n onInputGroupChange: setInputGroup,\n disabled,\n readOnly,\n required,\n invalid,\n showSeconds,\n is12Hour,\n minuteStep,\n secondStep,\n hourStep,\n segmentPlaceholder: normalizedPlaceholder,\n labels,\n min,\n max\n }),\n [\n rootId,\n inputGroupId,\n labelId,\n triggerId,\n openOnFocus,\n inputGroupClickAction,\n disabled,\n readOnly,\n required,\n invalid,\n showSeconds,\n is12Hour,\n minuteStep,\n secondStep,\n hourStep,\n normalizedPlaceholder,\n labels,\n min,\n max\n ]\n );\n\n const RootPrimitive = asChild ? Slot : \"div\";\n\n return (\n <>\n <StoreContext.Provider value={store}>\n <TimePickerContext.Provider value={rootContext}>\n <Popover open={storeOpen} onOpenChange={onPopoverOpenChange}>\n <RootPrimitive\n data-slot=\"time-picker\"\n data-disabled={disabled ? \"\" : undefined}\n data-invalid={invalid ? \"\" : undefined}\n {...rootProps}\n className={cn(\"relative\", className)}\n >\n {children}\n </RootPrimitive>\n </Popover>\n </TimePickerContext.Provider>\n </StoreContext.Provider>\n {isFormControl && (\n <VisuallyHiddenInput\n type=\"hidden\"\n control={inputGroup}\n name={name}\n value={value}\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n />\n )}\n </>\n );\n}\n\ninterface TimePickerLabelProps extends React.ComponentProps<\"label\"> {\n asChild?: boolean;\n}\n\nfunction TimePickerLabel(props: TimePickerLabelProps) {\n const { asChild, className, ...labelProps } = props;\n\n const { labelId } = useTimePickerContext(LABEL_NAME);\n\n const LabelPrimitive = asChild ? Slot : \"label\";\n\n return (\n <LabelPrimitive\n data-slot=\"time-picker-label\"\n {...labelProps}\n /*\n * ⚠ Khác thượng nguồn: bản gốc đặt `htmlFor={labelId}` mà KHÔNG phần tử nào mang\n * `id={labelId}` — nhóm ô trỏ `aria-labelledby={labelId}` vào hư không nên trình đọc màn\n * hình đọc một nhóm không tên, và `htmlFor` trỏ vào chính một id không tồn tại. Nhãn giờ\n * MANG id đó; `htmlFor` (nếu app cần) đi qua `labelProps`.\n */\n id={labelId}\n className={cn(\n \"text-sm leading-none font-medium peer-disabled:cursor-not-allowed peer-disabled:opacity-70\",\n className\n )}\n />\n );\n}\n\ninterface TimePickerInputGroupContextValue {\n onInputRegister: (segment: Segment, ref: React.RefObject<InputElement | null>) => void;\n onInputUnregister: (segment: Segment) => void;\n getNextInput: (currentSegment: Segment) => React.RefObject<InputElement | null> | null;\n}\n\nconst TimePickerInputGroupContext = React.createContext<TimePickerInputGroupContextValue | null>(null);\n\nfunction useTimePickerInputGroupContext(consumerName: string) {\n const context = React.useContext(TimePickerInputGroupContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` phải nằm bên trong \\`${INPUT_GROUP_NAME}\\``);\n }\n return context;\n}\n\ntype TimePickerInputGroupProps = DivProps;\n\nfunction TimePickerInputGroup(props: TimePickerInputGroupProps) {\n const {\n onPointerDown: onPointerDownProp,\n onClick: onClickProp,\n asChild,\n className,\n style,\n ref,\n ...inputGroupProps\n } = props;\n\n const {\n inputGroupId,\n labelId,\n onInputGroupChange,\n disabled,\n readOnly,\n invalid,\n segmentPlaceholder,\n labels,\n inputGroupRef,\n triggerRef,\n inputGroupClickAction\n } = useTimePickerContext(INPUT_GROUP_NAME);\n\n const store = useStoreContext(INPUT_GROUP_NAME);\n\n const composedRef = useComposedRefs(ref, inputGroupRef, onInputGroupChange);\n\n const inputRefsMap = React.useRef<Map<Segment, React.RefObject<InputElement | null>>>(new Map());\n\n const onInputRegister = React.useCallback((segment: Segment, ref: React.RefObject<InputElement | null>) => {\n inputRefsMap.current.set(segment, ref);\n }, []);\n\n const onInputUnregister = React.useCallback((segment: Segment) => {\n inputRefsMap.current.delete(segment);\n }, []);\n\n const getNextInput = React.useCallback((currentSegment: Segment): React.RefObject<InputElement | null> | null => {\n const segmentOrder: Segment[] = [\"hour\", \"minute\", \"second\", \"period\"];\n const currentIndex = segmentOrder.indexOf(currentSegment);\n\n if (currentIndex === -1 || currentIndex === segmentOrder.length - 1) {\n return null;\n }\n\n for (let i = currentIndex + 1; i < segmentOrder.length; i++) {\n const nextSegment = segmentOrder[i];\n if (nextSegment) {\n const nextRef = inputRefsMap.current.get(nextSegment);\n if (nextRef?.current) {\n return nextRef;\n }\n }\n }\n\n return null;\n }, []);\n\n const onPointerDown = React.useCallback(\n (event: React.PointerEvent<InputGroupElement>) => {\n onPointerDownProp?.(event);\n if (disabled || readOnly || event.defaultPrevented) return;\n\n const target = event.target as HTMLElement;\n\n if (target.tagName === \"INPUT\" || target.closest(\"input\")) {\n return;\n }\n\n if (triggerRef.current?.contains(target)) {\n return;\n }\n\n event.preventDefault();\n },\n [onPointerDownProp, disabled, readOnly, triggerRef]\n );\n\n const onClick = React.useCallback(\n (event: React.MouseEvent<InputGroupElement>) => {\n onClickProp?.(event);\n if (disabled || readOnly || event.defaultPrevented) return;\n\n const target = event.target as HTMLElement;\n\n if (target.tagName === \"INPUT\" || target.closest(\"input\")) {\n return;\n }\n\n if (triggerRef.current?.contains(target)) {\n return;\n }\n\n if (inputGroupClickAction === \"open\") {\n store.setState(\"open\", true);\n } else {\n const activeElement = document.activeElement;\n const isInputAlreadyFocused =\n activeElement && activeElement.tagName === \"INPUT\" && inputGroupRef.current?.contains(activeElement);\n\n if (!isInputAlreadyFocused) {\n for (const segment of SEGMENTS) {\n const inputRef = inputRefsMap.current.get(segment);\n if (inputRef?.current) {\n inputRef.current.focus();\n inputRef.current.select();\n break;\n }\n }\n }\n }\n },\n [onClickProp, disabled, readOnly, inputGroupClickAction, store, triggerRef, inputGroupRef]\n );\n\n const inputGroupContextValue = React.useMemo<TimePickerInputGroupContextValue>(\n () => ({\n onInputRegister,\n onInputUnregister,\n getNextInput\n }),\n [onInputRegister, onInputUnregister, getNextInput]\n );\n\n const InputGroupPrimitive = asChild ? Slot : \"div\";\n\n return (\n <TimePickerInputGroupContext.Provider value={inputGroupContextValue}>\n <PopoverAnchor asChild>\n <InputGroupPrimitive\n role=\"group\"\n id={inputGroupId}\n aria-labelledby={labelId}\n data-slot=\"time-picker-input-group\"\n data-disabled={disabled ? \"\" : undefined}\n data-invalid={invalid ? \"\" : undefined}\n {...inputGroupProps}\n className={cn(\n /*\n * ⚠ Khác thượng nguồn: khung ô đi theo `Input` của gói (ô ngày của `DatePicker` là\n * một `Input`, và hai thứ này hay đứng chung một hàng biểu mẫu): `h-9` thay `h-10`,\n * bỏ `shadow-xs`, hover đậm viền `--control-edge-strong`, focus viền\n * `--primary-ink` + quầng `ring-2 ring-ring/50` KHÔNG offset (quy ước họ ô nhập —\n * xem `InputGroup`), lỗi viền `--destructive-ink`. Số đo ở chú thích đầu `input.tsx`.\n */\n \"flex h-9 w-full cursor-text items-center gap-0.5 rounded-md border border-input bg-background px-3 py-2 text-sm text-foreground transition-colors duration-150 ease-out outline-none hover:border-control-edge-strong\",\n \"has-[input:focus]:border-primary-ink has-[input:focus]:ring-2 has-[input:focus]:ring-ring/50\",\n invalid &&\n \"border-destructive-ink hover:border-destructive-ink has-[input:focus]:border-destructive-ink has-[input:focus]:ring-destructive/30\",\n /*\n * ⚠ Khác thượng nguồn: bản gốc ghép `disabled && \"cursor-not-allowed opacity-50\"` —\n * lớp gắn VÔ ĐIỀU KIỆN vào chuỗi, nên `pnpm lint:a11y` đo viền/chữ lúc NGHỈ đã nhân\n * 50% (viền 1,75:1, chữ 3,49:1 ✗). Neo vào `:disabled` gốc của các ô con (cổng miễn\n * trừ đúng nhánh này — WCAG 1.4.3/1.4.11 không đòi tương phản cho control vô hiệu);\n * `disabled` ở gốc khoá MỌI ô nên hai cách cho cùng kết quả. Thêm `bg-muted` theo `Input`.\n */\n \"has-[input:disabled]:cursor-not-allowed has-[input:disabled]:bg-muted has-[input:disabled]:opacity-50\",\n className\n )}\n style={\n {\n \"--time-picker-hour-input-width\": `${segmentPlaceholder.hour.length}ch`,\n \"--time-picker-minute-input-width\": `${segmentPlaceholder.minute.length}ch`,\n \"--time-picker-second-input-width\": `${segmentPlaceholder.second.length}ch`,\n // ⚠ Khác thượng nguồn: tính cả độ dài nhãn buổi (`labels.am`/`labels.pm`) — bản gốc\n // chỉ có \"AM\"/\"PM\" 2 ký tự nên ghim sàn 2; nhãn do app đặt có thể dài hơn.\n \"--time-picker-period-input-width\": `${Math.max(segmentPlaceholder.period.length, labels.am.length, labels.pm.length, 2) + 0.5}ch`,\n ...style\n } as React.CSSProperties\n }\n ref={composedRef}\n onPointerDown={onPointerDown}\n onClick={onClick}\n />\n </PopoverAnchor>\n </TimePickerInputGroupContext.Provider>\n );\n}\n\ninterface TimePickerInputProps extends Omit<React.ComponentProps<\"input\">, \"type\" | \"value\"> {\n segment: Segment;\n}\n\nfunction TimePickerInput(props: TimePickerInputProps) {\n const {\n segment,\n onBlur: onBlurProp,\n onChange: onChangeProp,\n onClick: onClickProp,\n onFocus: onFocusProp,\n onKeyDown: onKeyDownProp,\n disabled: disabledProp,\n readOnly: readOnlyProp,\n className,\n style,\n ref,\n ...inputProps\n } = props;\n\n const { is12Hour, showSeconds, disabled, readOnly, invalid, segmentPlaceholder, labels, openOnFocus } =\n useTimePickerContext(INPUT_NAME);\n const store = useStoreContext(INPUT_NAME);\n const inputGroupContext = useTimePickerInputGroupContext(INPUT_NAME);\n\n const isDisabled = disabledProp || disabled;\n const isReadOnly = readOnlyProp || readOnly;\n\n const value = useStore((state) => state.value);\n const timeValue = parseTimeString(value);\n\n const inputRef = React.useRef<HTMLInputElement>(null);\n const composedRef = useComposedRefs(ref, inputRef);\n\n useIsomorphicLayoutEffect(() => {\n if (segment) {\n inputGroupContext.onInputRegister(segment as Segment, inputRef);\n return () => inputGroupContext.onInputUnregister(segment as Segment);\n }\n }, [inputGroupContext, segment]);\n\n const getSegmentValue = React.useCallback(() => {\n if (!timeValue) {\n if (!segment) return \"\";\n return segmentPlaceholder[segment];\n }\n switch (segment) {\n case \"hour\": {\n if (timeValue.hour === undefined) return segmentPlaceholder.hour;\n if (is12Hour) {\n return to12Hour(timeValue.hour).hour.toString().padStart(2, \"0\");\n }\n return timeValue.hour.toString().padStart(2, \"0\");\n }\n case \"minute\":\n if (timeValue.minute === undefined) return segmentPlaceholder.minute;\n return timeValue.minute.toString().padStart(2, \"0\");\n case \"second\":\n if (timeValue.second === undefined) return segmentPlaceholder.second;\n return timeValue.second.toString().padStart(2, \"0\");\n case \"period\": {\n if (!timeValue || timeValue.hour === undefined) return segmentPlaceholder.period;\n return to12Hour(timeValue.hour).period;\n }\n default:\n return \"\";\n }\n }, [timeValue, segment, is12Hour, segmentPlaceholder]);\n\n const [editValue, setEditValue] = React.useState(getSegmentValue());\n const [isEditing, setIsEditing] = React.useState(false);\n const [pendingDigit, setPendingDigit] = React.useState<string | null>(null);\n\n React.useEffect(() => {\n if (!isEditing) {\n setEditValue(getSegmentValue());\n setPendingDigit(null);\n }\n }, [getSegmentValue, isEditing]);\n\n const updateTimeValue = React.useCallback(\n (newSegmentValue: string | undefined, shouldCreateIfEmpty = false) => {\n const placeholder = segment ? segmentPlaceholder[segment] : DEFAULT_SEGMENT_PLACEHOLDER;\n if (!newSegmentValue || newSegmentValue === placeholder) return;\n if (!timeValue && !shouldCreateIfEmpty) return;\n\n const currentTime = timeValue ?? {};\n const newTime = { ...currentTime };\n\n switch (segment) {\n case \"hour\": {\n const displayHour = Number.parseInt(newSegmentValue, 10);\n if (!Number.isNaN(displayHour)) {\n if (is12Hour) {\n const clampedHour = clamp(displayHour, 1, 12);\n let currentPeriod: Period;\n if (timeValue?.period !== undefined) {\n currentPeriod = timeValue.period;\n } else if (timeValue?.hour !== undefined) {\n currentPeriod = to12Hour(timeValue.hour).period;\n } else {\n const now = new Date();\n currentPeriod = to12Hour(now.getHours()).period;\n }\n const hour24 = to24Hour(clampedHour, currentPeriod);\n newTime.hour = hour24;\n if (timeValue?.period !== undefined) {\n newTime.period = timeValue.period;\n }\n } else {\n newTime.hour = clamp(displayHour, 0, 23);\n }\n }\n break;\n }\n case \"minute\": {\n const minute = Number.parseInt(newSegmentValue, 10);\n if (!Number.isNaN(minute)) {\n newTime.minute = clamp(minute, 0, 59);\n }\n break;\n }\n case \"second\": {\n const second = Number.parseInt(newSegmentValue, 10);\n if (!Number.isNaN(second)) {\n newTime.second = clamp(second, 0, 59);\n }\n break;\n }\n case \"period\": {\n if (newSegmentValue === \"AM\" || newSegmentValue === \"PM\") {\n newTime.period = newSegmentValue;\n if (timeValue && timeValue.hour !== undefined) {\n const currentDisplay = to12Hour(timeValue.hour);\n newTime.hour = to24Hour(currentDisplay.hour, newSegmentValue);\n }\n }\n break;\n }\n }\n\n const newValue = formatTimeValue(newTime, showSeconds);\n store.setState(\"value\", newValue);\n },\n [timeValue, segment, is12Hour, showSeconds, store, segmentPlaceholder]\n );\n\n const onBlur = React.useCallback(\n (event: React.FocusEvent<InputElement>) => {\n onBlurProp?.(event);\n if (event.defaultPrevented) return;\n\n setIsEditing(false);\n\n const placeholder = segment ? segmentPlaceholder[segment] : DEFAULT_SEGMENT_PLACEHOLDER;\n if (editValue && editValue !== placeholder && editValue.length > 0) {\n let valueToUpdate = editValue;\n\n if (segment !== \"period\") {\n if (editValue.length === 2) {\n valueToUpdate = editValue;\n } else if (editValue.length === 1) {\n const numValue = Number.parseInt(editValue, 10);\n if (!Number.isNaN(numValue)) {\n valueToUpdate = numValue.toString().padStart(2, \"0\");\n }\n }\n }\n\n updateTimeValue(valueToUpdate, true);\n\n // Ô còn trống sau khi rời một ô đã gõ → lấp bằng giờ hiện tại (hành vi gốc).\n queueMicrotask(() => {\n const currentTimeValue = parseTimeString(store.getState().value);\n if (currentTimeValue) {\n const now = new Date();\n const newTime = { ...currentTimeValue };\n let needsUpdate = false;\n\n if (newTime.hour === undefined) {\n newTime.hour = now.getHours();\n needsUpdate = true;\n }\n\n if (newTime.minute === undefined) {\n newTime.minute = now.getMinutes();\n needsUpdate = true;\n }\n\n if (showSeconds && newTime.second === undefined) {\n newTime.second = now.getSeconds();\n needsUpdate = true;\n }\n\n if (needsUpdate) {\n const newValue = formatTimeValue(newTime, showSeconds);\n store.setState(\"value\", newValue);\n }\n }\n });\n }\n\n setEditValue(getSegmentValue());\n setPendingDigit(null);\n },\n [onBlurProp, editValue, updateTimeValue, getSegmentValue, segment, segmentPlaceholder, showSeconds, store]\n );\n\n const onChange = React.useCallback(\n (event: React.ChangeEvent<InputElement>) => {\n onChangeProp?.(event);\n if (event.defaultPrevented) return;\n\n let newValue = event.target.value;\n\n const placeholder = segment ? segmentPlaceholder[segment] : DEFAULT_SEGMENT_PLACEHOLDER;\n if (editValue === placeholder && newValue.length > 0 && newValue !== placeholder) {\n newValue = newValue.replace(new RegExp(`^${placeholder}`), \"\");\n }\n\n if (segment === \"period\") {\n const newPeriod = getPeriodFromKey(newValue.charAt(0), labels);\n\n if (newPeriod) {\n setEditValue(newPeriod);\n updateTimeValue(newPeriod, true);\n queueMicrotask(() => {\n inputRef.current?.select();\n });\n }\n return;\n }\n\n if (segment === \"hour\" || segment === \"minute\" || segment === \"second\") {\n newValue = newValue.replace(/\\D/g, \"\");\n }\n\n if (newValue.length > 2) {\n newValue = newValue.slice(0, 2);\n }\n if (segment === \"hour\" || segment === \"minute\" || segment === \"second\") {\n const numValue = Number.parseInt(newValue, 10);\n\n if (!Number.isNaN(numValue) && newValue.length > 0) {\n if (pendingDigit !== null && newValue.length === 1) {\n const twoDigitValue = pendingDigit + newValue;\n const combinedNum = Number.parseInt(twoDigitValue, 10);\n\n if (!Number.isNaN(combinedNum)) {\n const paddedValue = combinedNum.toString().padStart(2, \"0\");\n setEditValue(paddedValue);\n updateTimeValue(paddedValue, true);\n setPendingDigit(null);\n\n queueMicrotask(() => {\n if (segment) {\n const nextInputRef = inputGroupContext.getNextInput(segment);\n if (nextInputRef?.current) {\n nextInputRef.current.focus();\n nextInputRef.current.select();\n }\n }\n });\n return;\n }\n }\n\n const maxFirstDigit = segment === \"hour\" ? (is12Hour ? 1 : 2) : 5;\n\n const firstDigit = Number.parseInt(newValue[0] ?? \"0\", 10);\n const shouldAutoAdvance = firstDigit > maxFirstDigit;\n\n if (newValue.length === 1) {\n if (shouldAutoAdvance) {\n const paddedValue = numValue.toString().padStart(2, \"0\");\n setEditValue(paddedValue);\n updateTimeValue(paddedValue, true);\n setPendingDigit(null);\n\n queueMicrotask(() => {\n if (segment) {\n const nextInputRef = inputGroupContext.getNextInput(segment);\n if (nextInputRef?.current) {\n nextInputRef.current.focus();\n nextInputRef.current.select();\n }\n }\n });\n } else {\n const paddedValue = numValue.toString().padStart(2, \"0\");\n setEditValue(paddedValue);\n setPendingDigit(newValue);\n queueMicrotask(() => {\n inputRef.current?.select();\n });\n }\n } else if (newValue.length === 2) {\n const paddedValue = numValue.toString().padStart(2, \"0\");\n setEditValue(paddedValue);\n updateTimeValue(paddedValue, true);\n setPendingDigit(null);\n\n queueMicrotask(() => {\n if (segment) {\n const nextInputRef = inputGroupContext.getNextInput(segment);\n if (nextInputRef?.current) {\n nextInputRef.current.focus();\n nextInputRef.current.select();\n }\n }\n });\n }\n } else if (newValue.length === 0) {\n setEditValue(\"\");\n setPendingDigit(null);\n }\n }\n },\n [\n segment,\n updateTimeValue,\n onChangeProp,\n editValue,\n is12Hour,\n inputGroupContext,\n pendingDigit,\n segmentPlaceholder,\n labels\n ]\n );\n\n const onClick = React.useCallback(\n (event: React.MouseEvent<InputElement>) => {\n onClickProp?.(event);\n if (event.defaultPrevented) return;\n\n event.currentTarget.select();\n },\n [onClickProp]\n );\n\n const onFocus = React.useCallback(\n (event: React.FocusEvent<InputElement>) => {\n onFocusProp?.(event);\n if (event.defaultPrevented) return;\n\n setIsEditing(true);\n setPendingDigit(null);\n\n if (openOnFocus && !store.getState().open) {\n store.setState(\"openedViaFocus\", true);\n store.setState(\"open\", true);\n }\n\n queueMicrotask(() => event.target.select());\n },\n [onFocusProp, openOnFocus, store]\n );\n\n const onKeyDown = React.useCallback(\n (event: React.KeyboardEvent<InputElement>) => {\n onKeyDownProp?.(event);\n if (event.defaultPrevented) return;\n\n if (event.key === \"ArrowLeft\" || event.key === \"ArrowRight\") {\n event.preventDefault();\n\n const goToPrevious = event.key === \"ArrowLeft\";\n const inputGroup = inputRef.current?.closest('[data-slot=\"time-picker-input-group\"]');\n\n if (inputGroup && inputRef.current) {\n const allInputs = Array.from(inputGroup.querySelectorAll('input[type=\"text\"]')) as HTMLInputElement[];\n const currentIdx = allInputs.indexOf(inputRef.current);\n\n if (currentIdx !== -1) {\n const targetIdx = goToPrevious\n ? Math.max(0, currentIdx - 1)\n : Math.min(allInputs.length - 1, currentIdx + 1);\n\n const targetInput = allInputs[targetIdx];\n if (targetInput && targetInput !== inputRef.current) {\n targetInput.focus();\n targetInput.select();\n }\n }\n }\n return;\n }\n\n if (event.key === \"Backspace\" || event.key === \"Delete\") {\n const input = inputRef.current;\n if (input && input.selectionStart === 0 && input.selectionEnd === input.value.length) {\n event.preventDefault();\n const placeholder = segment ? segmentPlaceholder[segment] : DEFAULT_SEGMENT_PLACEHOLDER;\n setEditValue(placeholder);\n setPendingDigit(null);\n\n if (timeValue) {\n const newTime = { ...timeValue };\n switch (segment) {\n case \"hour\":\n delete newTime.hour;\n break;\n case \"minute\":\n delete newTime.minute;\n break;\n case \"second\":\n delete newTime.second;\n break;\n case \"period\":\n delete newTime.period;\n break;\n }\n\n if (\n newTime.hour !== undefined ||\n newTime.minute !== undefined ||\n newTime.second !== undefined ||\n newTime.period !== undefined\n ) {\n const newValue = formatTimeValue(newTime, showSeconds);\n store.setState(\"value\", newValue);\n } else {\n store.setState(\"value\", \"\");\n }\n } else {\n store.setState(\"value\", \"\");\n }\n\n queueMicrotask(() => {\n inputRef.current?.select();\n });\n return;\n }\n }\n\n if (segment === \"period\") {\n const newPeriodFromKey = getPeriodFromKey(event.key, labels);\n if (newPeriodFromKey) {\n event.preventDefault();\n setEditValue(newPeriodFromKey);\n updateTimeValue(newPeriodFromKey, true);\n queueMicrotask(() => {\n inputRef.current?.select();\n });\n } else if (event.key === \"ArrowUp\" || event.key === \"ArrowDown\") {\n event.preventDefault();\n const placeholder = segmentPlaceholder.period;\n const currentPeriod = editValue === placeholder || editValue === \"\" ? \"AM\" : editValue;\n const newPeriod = currentPeriod === \"AM\" || currentPeriod === \"A\" ? \"PM\" : \"AM\";\n setEditValue(newPeriod);\n updateTimeValue(newPeriod, true);\n queueMicrotask(() => {\n inputRef.current?.select();\n });\n }\n return;\n }\n\n if (event.key === \"Tab\") {\n const placeholder = segment ? segmentPlaceholder[segment] : DEFAULT_SEGMENT_PLACEHOLDER;\n if (editValue && editValue.length > 0 && editValue !== placeholder) {\n if (editValue.length === 2) {\n updateTimeValue(editValue, true);\n } else if (editValue.length === 1) {\n const numValue = Number.parseInt(editValue, 10);\n if (!Number.isNaN(numValue)) {\n const paddedValue = numValue.toString().padStart(2, \"0\");\n updateTimeValue(paddedValue, true);\n }\n }\n }\n return;\n }\n\n if (event.key === \"Enter\") {\n event.preventDefault();\n const placeholder = segment ? segmentPlaceholder[segment] : DEFAULT_SEGMENT_PLACEHOLDER;\n if (editValue && editValue.length > 0 && editValue !== placeholder) {\n if (editValue.length === 2) {\n updateTimeValue(editValue, true);\n } else if (editValue.length === 1) {\n const numValue = Number.parseInt(editValue, 10);\n if (!Number.isNaN(numValue)) {\n const paddedValue = numValue.toString().padStart(2, \"0\");\n updateTimeValue(paddedValue, true);\n }\n }\n }\n queueMicrotask(() => {\n inputRef.current?.select();\n });\n }\n\n if (event.key === \"Escape\") {\n event.preventDefault();\n setEditValue(getSegmentValue());\n inputRef.current?.blur();\n }\n\n if (event.key === \"ArrowUp\") {\n event.preventDefault();\n const placeholder = segment ? segmentPlaceholder[segment] : DEFAULT_SEGMENT_PLACEHOLDER;\n if (editValue === placeholder || editValue === \"\") {\n const defaultValue = segment === \"hour\" ? (is12Hour ? 12 : 0) : 0;\n const formattedValue = defaultValue.toString().padStart(2, \"0\");\n setEditValue(formattedValue);\n updateTimeValue(formattedValue, true);\n queueMicrotask(() => {\n inputRef.current?.select();\n });\n return;\n }\n const currentValue = Number.parseInt(editValue, 10);\n if (!Number.isNaN(currentValue)) {\n let newValue: number;\n switch (segment) {\n case \"hour\":\n if (is12Hour) {\n newValue = currentValue === 12 ? 1 : currentValue + 1;\n } else {\n newValue = currentValue === 23 ? 0 : currentValue + 1;\n }\n break;\n case \"minute\":\n case \"second\":\n newValue = currentValue === 59 ? 0 : currentValue + 1;\n break;\n default:\n return;\n }\n const formattedValue = newValue.toString().padStart(2, \"0\");\n setEditValue(formattedValue);\n updateTimeValue(formattedValue, true);\n queueMicrotask(() => {\n inputRef.current?.select();\n });\n }\n }\n\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n const placeholder = segment ? segmentPlaceholder[segment] : DEFAULT_SEGMENT_PLACEHOLDER;\n if (editValue === placeholder || editValue === \"\") {\n const defaultValue = segment === \"hour\" ? (is12Hour ? 12 : 23) : 59;\n const formattedValue = defaultValue.toString().padStart(2, \"0\");\n setEditValue(formattedValue);\n updateTimeValue(formattedValue, true);\n queueMicrotask(() => {\n inputRef.current?.select();\n });\n return;\n }\n const currentValue = Number.parseInt(editValue, 10);\n if (!Number.isNaN(currentValue)) {\n let newValue: number;\n switch (segment) {\n case \"hour\":\n if (is12Hour) {\n newValue = currentValue === 1 ? 12 : currentValue - 1;\n } else {\n newValue = currentValue === 0 ? 23 : currentValue - 1;\n }\n break;\n case \"minute\":\n case \"second\":\n newValue = currentValue === 0 ? 59 : currentValue - 1;\n break;\n default:\n return;\n }\n const formattedValue = newValue.toString().padStart(2, \"0\");\n setEditValue(formattedValue);\n updateTimeValue(formattedValue, true);\n queueMicrotask(() => {\n inputRef.current?.select();\n });\n }\n }\n },\n [\n onKeyDownProp,\n editValue,\n segment,\n is12Hour,\n getSegmentValue,\n updateTimeValue,\n showSeconds,\n timeValue,\n store,\n segmentPlaceholder,\n labels\n ]\n );\n\n /*\n * ⚠ Khác thượng nguồn: ở đồng hồ 24 giờ bản gốc VẪN vẽ ô buổi (in \"PM\" cạnh \"14:30\"), và gõ `A`\n * vào đó biến 14:30 thành 02:30 — trong khi cột `TimePickerPeriod` của chính nó tự ẩn ở chế độ\n * này. Mọi demo thượng nguồn đều đặt sẵn `<TimePickerInput segment=\"period\" />`, và mặc định\n * của Comitor là 24 giờ, nên ô buổi ẩn theo cùng luật với cột. Đặt SAU mọi hook.\n */\n if (segment === \"period\" && !is12Hour) return null;\n\n const displayValue = isEditing ? editValue : getSegmentValue();\n\n const segmentWidth = segment ? `var(--time-picker-${segment}-input-width)` : \"2ch\";\n\n return (\n <input\n type=\"text\"\n inputMode={segment === \"period\" ? \"text\" : \"numeric\"}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n spellCheck={false}\n translate=\"no\"\n /*\n * ⚠ Khác thượng nguồn: bản gốc không đặt tên cho ô nào — trình đọc màn hình đọc bốn ô\n * \"sửa văn bản, 14\" liền nhau mà không biết ô nào là giờ, ô nào là phút. Tên lấy từ\n * `labels` (mặc định \"Giờ\"/\"Phút\"/\"Giây\"/\"Buổi\"); `aria-label` của app vẫn đè được.\n * `aria-invalid` cũng vậy: bản gốc chỉ tô viền đỏ (`data-invalid`) mà không báo cho AT.\n */\n aria-label={labels[segment]}\n aria-invalid={invalid || undefined}\n {...inputProps}\n disabled={isDisabled}\n readOnly={isReadOnly}\n className={cn(\n \"inline-flex h-full items-center justify-center border-0 bg-transparent text-center text-sm tabular-nums transition-colors outline-none focus:bg-transparent disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n style={{ width: segmentWidth, ...style }}\n ref={composedRef}\n value={segment === \"period\" ? getPeriodLabel(displayValue, labels) : displayValue}\n onBlur={onBlur}\n onChange={onChange}\n onClick={onClick}\n onFocus={onFocus}\n onKeyDown={onKeyDown}\n />\n );\n}\n\ntype TimePickerTriggerProps = ButtonProps;\n\nfunction TimePickerTrigger(props: TimePickerTriggerProps) {\n const { className, children, disabled: disabledProp, ref, ...triggerProps } = props;\n\n const { triggerId, disabled, labels, triggerRef } = useTimePickerContext(TRIGGER_NAME);\n\n const isDisabled = disabledProp || disabled;\n\n const composedRef = useComposedRefs(ref, triggerRef);\n\n return (\n <PopoverTrigger\n type=\"button\"\n id={triggerId}\n data-slot=\"time-picker-trigger\"\n disabled={isDisabled}\n ref={composedRef}\n {...triggerProps}\n className={cn(\n // ⚠ Khác thượng nguồn: thêm viền focus theo khuôn `Button` của gói — bản gốc không có kiểu\n // focus nào, và viền mặc định của trình duyệt bị lớp nền `outline-ring/50` pha còn gold 50%.\n \"ml-auto flex items-center rounded-sm text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-2 disabled:pointer-events-none [&>svg:not([class*='size-'])]:size-4\",\n className\n )}\n >\n {/*\n * ⚠ Khác thượng nguồn: nút mặc định chỉ có icon đồng hồ nên là một nút KHÔNG TÊN. Tên đi qua\n * `sr-only` (cùng khuôn nút mở lịch của `DatePicker`), không qua `aria-label`, để khi app\n * truyền `children` có chữ thì chữ đó là tên — không bị một nhãn ẩn đè lên.\n */}\n {children ?? (\n <>\n <Clock aria-hidden=\"true\" />\n <span className=\"sr-only\">{labels.openPicker}</span>\n </>\n )}\n </PopoverTrigger>\n );\n}\n\ninterface TimePickerGroupContextValue {\n getColumns: () => ColumnData[];\n onColumnRegister: (column: ColumnData) => void;\n onColumnUnregister: (id: string) => void;\n}\n\nconst TimePickerGroupContext = React.createContext<TimePickerGroupContextValue | null>(null);\n\nfunction useTimePickerGroupContext(consumerName: string) {\n const context = React.useContext(TimePickerGroupContext);\n if (!context) {\n // Bản gốc báo `TimePicker`; thứ thật sự cung cấp context này là `TimePickerContent`.\n throw new Error(`\\`${consumerName}\\` phải nằm bên trong \\`${CONTENT_NAME}\\``);\n }\n return context;\n}\n\ninterface TimePickerContentProps extends DivProps, React.ComponentProps<typeof PopoverContent> {}\n\nfunction TimePickerContent(props: TimePickerContentProps) {\n const {\n side = \"bottom\",\n align = \"start\",\n sideOffset = 6,\n className,\n onOpenAutoFocus: onOpenAutoFocusProp,\n onInteractOutside: onInteractOutsideProp,\n ...contentProps\n } = props;\n\n const store = useStoreContext(CONTENT_NAME);\n const { openOnFocus, inputGroupRef } = useTimePickerContext(CONTENT_NAME);\n const columnsRef = React.useRef<Map<string, Omit<ColumnData, \"id\">>>(new Map());\n\n const onColumnRegister = React.useCallback((column: ColumnData) => {\n columnsRef.current.set(column.id, column);\n }, []);\n\n const onColumnUnregister = React.useCallback((id: string) => {\n columnsRef.current.delete(id);\n }, []);\n\n const getColumns = React.useCallback(() => {\n const columns = Array.from(columnsRef.current.entries())\n .map(([id, { ref, getSelectedItemRef, getItems }]) => ({\n id,\n ref,\n getSelectedItemRef,\n getItems\n }))\n .filter((c) => c.ref.current !== null);\n return sortNodes(columns);\n }, []);\n\n const groupContextValue = React.useMemo<TimePickerGroupContextValue>(\n () => ({\n getColumns,\n onColumnRegister,\n onColumnUnregister\n }),\n [getColumns, onColumnRegister, onColumnUnregister]\n );\n\n const onOpenAutoFocus: NonNullable<PopoverContentProps[\"onOpenAutoFocus\"]> = React.useCallback(\n (event) => {\n onOpenAutoFocusProp?.(event);\n if (event.defaultPrevented) return;\n\n event.preventDefault();\n\n const { openedViaFocus } = store.getState();\n\n // Mở vì ô nhập được focus (`openOnFocus`) → để focus yên ở ô nhập.\n if (openedViaFocus) {\n store.setState(\"openedViaFocus\", false);\n return;\n }\n\n const columns = getColumns();\n const firstColumn = columns[0];\n\n if (!firstColumn) return;\n\n const items = firstColumn.getItems();\n const selectedItem = items.find((item) => item.selected);\n\n const candidateRefs = selectedItem\n ? [selectedItem.ref, ...items.map((item) => item.ref)]\n : items.map((item) => item.ref);\n\n focusFirst(candidateRefs, false);\n },\n [onOpenAutoFocusProp, getColumns, store]\n );\n\n const onInteractOutside: NonNullable<PopoverContentProps[\"onInteractOutside\"]> = React.useCallback(\n (event) => {\n onInteractOutsideProp?.(event);\n if (event.defaultPrevented) return;\n\n // `openOnFocus`: bấm vào nhóm ô không được tính là \"bấm ra ngoài\" rồi đóng bảng chọn.\n if (openOnFocus && inputGroupRef.current) {\n const target = event.target;\n if (!(target instanceof Node)) return;\n const isInsideInputGroup = inputGroupRef.current.contains(target);\n\n if (isInsideInputGroup) {\n event.preventDefault();\n }\n }\n },\n [onInteractOutsideProp, openOnFocus, inputGroupRef]\n );\n\n return (\n <TimePickerGroupContext.Provider value={groupContextValue}>\n <PopoverContent\n data-slot=\"time-picker-content\"\n side={side}\n align={align}\n sideOffset={sideOffset}\n {...contentProps}\n className={cn(\"flex w-auto max-w-(--radix-popover-trigger-width) p-0\", className)}\n onOpenAutoFocus={onOpenAutoFocus}\n onInteractOutside={onInteractOutside}\n />\n </TimePickerGroupContext.Provider>\n );\n}\n\ninterface TimePickerColumnContextValue {\n getItems: () => ItemData[];\n onItemRegister: (value: number | string, ref: React.RefObject<ColumnItemElement | null>, selected: boolean) => void;\n onItemUnregister: (value: number | string) => void;\n}\n\nconst TimePickerColumnContext = React.createContext<TimePickerColumnContextValue | null>(null);\n\nfunction useTimePickerColumnContext(consumerName: string) {\n const context = React.useContext(TimePickerColumnContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` phải nằm bên trong một cột (\\`${COLUMN_NAME}\\`)`);\n }\n return context;\n}\n\ninterface TimePickerColumnProps extends DivProps {}\n\nfunction TimePickerColumn(props: TimePickerColumnProps) {\n const { children, className, ref, ...columnProps } = props;\n\n const columnId = React.useId();\n const columnRef = React.useRef<ColumnElement | null>(null);\n const composedRef = useComposedRefs(ref, columnRef);\n\n const itemsRef = React.useRef<\n Map<\n number | string,\n {\n ref: React.RefObject<ColumnItemElement | null>;\n selected: boolean;\n }\n >\n >(new Map());\n\n const groupContext = useTimePickerGroupContext(COLUMN_NAME);\n\n const onItemRegister = React.useCallback(\n (value: number | string, ref: React.RefObject<HTMLButtonElement | null>, selected: boolean) => {\n itemsRef.current.set(value, { ref, selected });\n },\n []\n );\n\n const onItemUnregister = React.useCallback((value: number | string) => {\n itemsRef.current.delete(value);\n }, []);\n\n const getItems = React.useCallback(() => {\n const items = Array.from(itemsRef.current.entries())\n .map(([value, { ref, selected }]) => ({\n value,\n ref,\n selected\n }))\n .filter((item) => item.ref.current);\n return sortNodes(items);\n }, []);\n\n const getSelectedItemRef = React.useCallback(() => {\n const items = getItems();\n return items.find((item) => item.selected)?.ref ?? null;\n }, [getItems]);\n\n useIsomorphicLayoutEffect(() => {\n groupContext.onColumnRegister({\n id: columnId,\n ref: columnRef,\n getSelectedItemRef,\n getItems\n });\n return () => groupContext.onColumnUnregister(columnId);\n }, [groupContext, columnId, getSelectedItemRef, getItems]);\n\n const columnContextValue = React.useMemo<TimePickerColumnContextValue>(\n () => ({\n getItems,\n onItemRegister,\n onItemUnregister\n }),\n [getItems, onItemRegister, onItemUnregister]\n );\n\n return (\n <TimePickerColumnContext.Provider value={columnContextValue}>\n {/*\n * ⚠ Khác thượng nguồn: bản gốc là một `div` trần chứa các `button` trần — trình đọc màn hình\n * đọc \"14, nút\" mà không biết đó là cột GIỜ hay PHÚT, cũng không biết mục nào ĐANG CHỌN.\n * Cột là `listbox` (tên do `TimePickerHour`/`…Minute`/`…` truyền xuống), mục là `option`\n * có `aria-selected` — đúng với hành vi sẵn có: mũi tên lên/xuống vừa di focus vừa chọn.\n */}\n <div\n role=\"listbox\"\n ref={composedRef}\n data-slot=\"time-picker-column\"\n {...columnProps}\n className={cn(\"flex flex-col gap-1 p-1 not-last:border-r\", className)}\n >\n {children}\n </div>\n </TimePickerColumnContext.Provider>\n );\n}\n\ninterface TimePickerColumnItemProps extends ButtonProps {\n value: number | string;\n selected?: boolean;\n format?: SegmentFormat;\n}\n\nfunction TimePickerColumnItem(props: TimePickerColumnItemProps) {\n const { value, selected = false, format = \"numeric\", className, children, ref, ...itemProps } = props;\n\n const itemRef = React.useRef<ColumnItemElement | null>(null);\n const composedRef = useComposedRefs(ref, itemRef);\n const columnContext = useTimePickerColumnContext(COLUMN_ITEM_NAME);\n const groupContext = useTimePickerGroupContext(COLUMN_ITEM_NAME);\n\n useIsomorphicLayoutEffect(() => {\n columnContext.onItemRegister(value, itemRef, selected);\n return () => columnContext.onItemUnregister(value);\n }, [columnContext, value, selected]);\n\n useIsomorphicLayoutEffect(() => {\n if (selected && itemRef.current) {\n itemRef.current.scrollIntoView({ block: \"nearest\" });\n }\n }, [selected]);\n\n const onClick = React.useCallback(\n (event: React.MouseEvent<ColumnItemElement>) => {\n itemProps.onClick?.(event);\n if (event.defaultPrevented) return;\n\n itemRef.current?.focus();\n },\n [itemProps.onClick]\n );\n\n const onKeyDown = React.useCallback(\n (event: React.KeyboardEvent<ColumnItemElement>) => {\n itemProps.onKeyDown?.(event);\n if (event.defaultPrevented) return;\n\n if (event.key === \"ArrowUp\" || event.key === \"ArrowDown\") {\n event.preventDefault();\n const items = columnContext.getItems().sort((a, b) => {\n if (typeof a.value === \"number\" && typeof b.value === \"number\") {\n return a.value - b.value;\n }\n return 0;\n });\n const currentIndex = items.findIndex((item) => item.value === value);\n\n let nextIndex: number;\n if (event.key === \"ArrowUp\") {\n nextIndex = currentIndex > 0 ? currentIndex - 1 : items.length - 1;\n } else {\n nextIndex = currentIndex < items.length - 1 ? currentIndex + 1 : 0;\n }\n\n const nextItem = items[nextIndex];\n nextItem?.ref.current?.focus();\n nextItem?.ref.current?.click();\n } else if ((event.key === \"Tab\" || event.key === \"ArrowLeft\" || event.key === \"ArrowRight\") && groupContext) {\n event.preventDefault();\n\n queueMicrotask(() => {\n const columns = groupContext.getColumns();\n\n if (columns.length === 0) return;\n\n const currentColumnIndex = columns.findIndex((c) => c.ref.current?.contains(itemRef.current) ?? false);\n\n if (currentColumnIndex === -1) return;\n\n const goToPrevious = event.key === \"ArrowLeft\" || (event.key === \"Tab\" && event.shiftKey);\n\n const nextColumnIndex = goToPrevious\n ? currentColumnIndex > 0\n ? currentColumnIndex - 1\n : columns.length - 1\n : currentColumnIndex < columns.length - 1\n ? currentColumnIndex + 1\n : 0;\n\n const nextColumn = columns[nextColumnIndex];\n if (nextColumn?.ref.current) {\n const items = nextColumn.getItems();\n const selectedItem = items.find((item) => item.selected);\n\n const candidateRefs = selectedItem\n ? [selectedItem.ref, ...items.map((item) => item.ref)]\n : items.map((item) => item.ref);\n\n focusFirst(candidateRefs, false);\n }\n });\n }\n },\n [itemProps.onKeyDown, columnContext, groupContext, value]\n );\n\n const formattedValue =\n typeof value === \"number\" && format === \"2-digit\" ? value.toString().padStart(2, \"0\") : value.toString();\n\n return (\n <button\n type=\"button\"\n // Xem chú thích ở `TimePickerColumn`: mục là `option`, trạng thái chọn đi qua `aria-selected`.\n role=\"option\"\n aria-selected={selected}\n {...itemProps}\n ref={composedRef}\n data-selected={selected ? \"\" : undefined}\n className={cn(\n /*\n * ⚠ Khác thượng nguồn: focus đi theo khuôn `Checkbox`/`Calendar` của gói (`focus-visible`,\n * có offset — mục đang chọn tô nền vàng, quầng vàng dính sát nền vàng thì không thấy);\n * mục đang chọn dùng cặp token của control BẬT `--control-on` / `--control-check` thay\n * `bg-primary text-primary-foreground` — cùng lý do và số đo với ô ngày đang chọn của\n * `Calendar` (chú thích đầu `calendar.tsx`). Hover chỉ áp cho mục CHƯA chọn\n * (`not-data-selected:`) thay vì để `data-selected:hover:` ghi đè lại: cùng kết quả trên\n * màn hình, nhưng cách cũ khiến `pnpm lint:a11y` ghép chữ hover `--accent-foreground`\n * với nền mục đang chọn (1,39:1 ở dark) — một cặp không bao giờ xuất hiện.\n */\n \"w-full rounded px-3 py-1.5 text-left text-sm not-data-selected:hover:bg-accent not-data-selected:hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/50 focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n \"data-selected:bg-control-on data-selected:text-control-check\",\n className\n )}\n onClick={onClick}\n onKeyDown={onKeyDown}\n >\n {/* ⚠ Khác thượng nguồn: nhận `children` (cột buổi cần in \"SA\"/\"CH\" thay mã \"AM\"/\"PM\"). */}\n {children ?? formattedValue}\n </button>\n );\n}\n\ninterface TimePickerHourProps extends DivProps {\n format?: SegmentFormat;\n}\n\nfunction TimePickerHour(props: TimePickerHourProps) {\n const { asChild, format = \"numeric\", className, ...hourProps } = props;\n\n const { is12Hour, hourStep, showSeconds, disabled, readOnly, labels } = useTimePickerContext(HOUR_NAME);\n const store = useStoreContext(HOUR_NAME);\n\n const value = useStore((state) => state.value);\n const timeValue = parseTimeString(value);\n\n const hours = Array.from(\n {\n length: is12Hour ? Math.ceil(12 / hourStep) : Math.ceil(24 / hourStep)\n },\n (_, i) => {\n if (is12Hour) {\n const hour = (i * hourStep) % 12;\n return hour === 0 ? 12 : hour;\n }\n return i * hourStep;\n }\n );\n\n const onHourSelect = React.useCallback(\n (displayHour: number) => {\n /*\n * ⚠ Khác thượng nguồn: bản gốc cho cột đổi giá trị cả khi `readOnly`/`disabled` — bảng chọn\n * vẫn mở được (nút mở chỉ khoá theo `disabled`, `openOnFocus` không xét gì), nên một ô\n * \"chỉ đọc\" vẫn sửa được bằng chuột. `TimePickerClear` của chính nó đã chặn đúng hai cờ\n * này; bốn cột nay chặn theo cùng luật.\n */\n if (disabled || readOnly) return;\n\n const now = new Date();\n const currentTime = timeValue ?? {};\n\n let hour24 = displayHour;\n if (is12Hour) {\n let currentPeriod: Period;\n if (timeValue?.period !== undefined) {\n currentPeriod = timeValue.period;\n } else if (timeValue?.hour !== undefined) {\n currentPeriod = to12Hour(timeValue.hour).period;\n } else {\n currentPeriod = to12Hour(now.getHours()).period;\n }\n hour24 = to24Hour(displayHour, currentPeriod);\n }\n\n const newTime = { ...currentTime, hour: hour24 };\n if (timeValue && timeValue.period !== undefined) {\n newTime.period = timeValue.period;\n }\n\n if (newTime.minute === undefined) {\n newTime.minute = now.getMinutes();\n }\n\n if (showSeconds && newTime.second === undefined) {\n newTime.second = now.getSeconds();\n }\n\n const newValue = formatTimeValue(newTime, showSeconds);\n store.setState(\"value\", newValue);\n },\n [timeValue, showSeconds, is12Hour, disabled, readOnly, store]\n );\n\n const now = new Date();\n const referenceHour = timeValue?.hour ?? now.getHours();\n const displayHour = is12Hour ? to12Hour(referenceHour).hour : referenceHour;\n\n const HourPrimitive = asChild ? Slot : TimePickerColumn;\n\n return (\n <HourPrimitive\n data-slot=\"time-picker-hour\"\n aria-label={labels.hour}\n {...hourProps}\n className={cn(\"scrollbar-none flex max-h-[200px] flex-col gap-1 overflow-y-auto p-1\", className)}\n >\n {hours.map((hour) => (\n <TimePickerColumnItem\n key={hour}\n value={hour}\n selected={displayHour === hour}\n format={format}\n onClick={() => onHourSelect(hour)}\n />\n ))}\n </HourPrimitive>\n );\n}\n\ninterface TimePickerMinuteProps extends DivProps {\n format?: SegmentFormat;\n}\n\nfunction TimePickerMinute(props: TimePickerMinuteProps) {\n const { asChild, format = \"2-digit\", className, ...minuteProps } = props;\n\n const { minuteStep, showSeconds, disabled, readOnly, labels } = useTimePickerContext(MINUTE_NAME);\n const store = useStoreContext(MINUTE_NAME);\n\n const value = useStore((state) => state.value);\n const timeValue = parseTimeString(value);\n\n const minutes = Array.from({ length: Math.ceil(60 / minuteStep) }, (_, i) => i * minuteStep);\n\n const onMinuteSelect = React.useCallback(\n (minute: number) => {\n // Chặn `readOnly`/`disabled` — xem `TimePickerHour`.\n if (disabled || readOnly) return;\n\n const now = new Date();\n const currentTime = timeValue ?? {};\n const newTime = { ...currentTime, minute };\n\n if (newTime.hour === undefined) {\n newTime.hour = now.getHours();\n }\n\n if (showSeconds && newTime.second === undefined) {\n newTime.second = now.getSeconds();\n }\n\n const newValue = formatTimeValue(newTime, showSeconds);\n store.setState(\"value\", newValue);\n },\n [timeValue, showSeconds, disabled, readOnly, store]\n );\n\n const MinutePrimitive = asChild ? Slot : TimePickerColumn;\n\n const now = new Date();\n const referenceMinute = timeValue?.minute ?? now.getMinutes();\n\n return (\n <MinutePrimitive\n data-slot=\"time-picker-minute\"\n aria-label={labels.minute}\n {...minuteProps}\n className={cn(\"scrollbar-none flex max-h-[200px] flex-col gap-1 overflow-y-auto p-1\", className)}\n >\n {minutes.map((minute) => (\n <TimePickerColumnItem\n key={minute}\n value={minute}\n selected={referenceMinute === minute}\n format={format}\n onClick={() => onMinuteSelect(minute)}\n />\n ))}\n </MinutePrimitive>\n );\n}\n\ninterface TimePickerSecondProps extends DivProps {\n format?: SegmentFormat;\n}\n\nfunction TimePickerSecond(props: TimePickerSecondProps) {\n const { asChild, format = \"2-digit\", className, ...secondProps } = props;\n\n const { secondStep, disabled, readOnly, labels } = useTimePickerContext(SECOND_NAME);\n const store = useStoreContext(SECOND_NAME);\n\n const value = useStore((state) => state.value);\n const timeValue = parseTimeString(value);\n\n const seconds = Array.from({ length: Math.ceil(60 / secondStep) }, (_, i) => i * secondStep);\n\n const onSecondSelect = React.useCallback(\n (second: number) => {\n // Chặn `readOnly`/`disabled` — xem `TimePickerHour`.\n if (disabled || readOnly) return;\n\n const now = new Date();\n const currentTime = timeValue ?? {};\n const newTime = { ...currentTime, second };\n\n if (newTime.hour === undefined) {\n newTime.hour = now.getHours();\n }\n\n if (newTime.minute === undefined) {\n newTime.minute = now.getMinutes();\n }\n\n const newValue = formatTimeValue(newTime, true);\n store.setState(\"value\", newValue);\n },\n [timeValue, disabled, readOnly, store]\n );\n\n const SecondPrimitive = asChild ? Slot : TimePickerColumn;\n\n const now = new Date();\n const referenceSecond = timeValue?.second ?? now.getSeconds();\n\n return (\n <SecondPrimitive\n data-slot=\"time-picker-second\"\n aria-label={labels.second}\n {...secondProps}\n className={cn(\"scrollbar-none flex max-h-[200px] flex-col gap-1 overflow-y-auto p-1\", className)}\n >\n {seconds.map((second) => (\n <TimePickerColumnItem\n key={second}\n value={second}\n selected={referenceSecond === second}\n format={format}\n onClick={() => onSecondSelect(second)}\n />\n ))}\n </SecondPrimitive>\n );\n}\n\ntype TimePickerPeriodProps = DivProps;\n\nfunction TimePickerPeriod(props: TimePickerPeriodProps) {\n const { asChild, className, ...periodProps } = props;\n\n const { is12Hour, showSeconds, disabled, readOnly, labels } = useTimePickerContext(PERIOD_NAME);\n const store = useStoreContext(PERIOD_NAME);\n\n const value = useStore((state) => state.value);\n const timeValue = parseTimeString(value);\n\n const onPeriodToggle = React.useCallback(\n (period: Period) => {\n // Chặn `readOnly`/`disabled` — xem `TimePickerHour`.\n if (disabled || readOnly) return;\n\n const now = new Date();\n const currentTime = timeValue ?? {};\n\n const currentHour = currentTime.hour !== undefined ? currentTime.hour : now.getHours();\n const currentDisplay = to12Hour(currentHour);\n const new24Hour = to24Hour(currentDisplay.hour, period);\n\n const newTime = { ...currentTime, hour: new24Hour };\n\n if (newTime.minute === undefined) {\n newTime.minute = now.getMinutes();\n }\n\n if (showSeconds && newTime.second === undefined) {\n newTime.second = now.getSeconds();\n }\n\n const newValue = formatTimeValue(newTime, showSeconds);\n store.setState(\"value\", newValue);\n },\n [timeValue, showSeconds, disabled, readOnly, store]\n );\n\n if (!is12Hour) return null;\n\n const now = new Date();\n const referenceHour = timeValue?.hour ?? now.getHours();\n const currentPeriod = to12Hour(referenceHour).period;\n\n const PeriodPrimitive = asChild ? Slot : TimePickerColumn;\n\n return (\n <PeriodPrimitive\n data-slot=\"time-picker-period\"\n aria-label={labels.period}\n {...periodProps}\n className={cn(\"flex flex-col gap-1 p-1\", className)}\n >\n {PERIODS.map((period) => (\n <TimePickerColumnItem\n key={period}\n value={period}\n selected={currentPeriod === period}\n onClick={() => onPeriodToggle(period)}\n >\n {getPeriodLabel(period, labels)}\n </TimePickerColumnItem>\n ))}\n </PeriodPrimitive>\n );\n}\n\ninterface TimePickerSeparatorProps extends React.ComponentProps<\"span\"> {\n asChild?: boolean;\n}\n\nfunction TimePickerSeparator(props: TimePickerSeparatorProps) {\n const { asChild, children, ...separatorProps } = props;\n\n const SeparatorPrimitive = asChild ? Slot : \"span\";\n\n return (\n <SeparatorPrimitive aria-hidden=\"true\" data-slot=\"time-picker-separator\" {...separatorProps}>\n {children ?? \":\"}\n </SeparatorPrimitive>\n );\n}\n\ntype TimePickerClearProps = ButtonProps;\n\nfunction TimePickerClear(props: TimePickerClearProps) {\n const { asChild, className, children, disabled: disabledProp, ...clearProps } = props;\n\n const { disabled, readOnly, labels } = useTimePickerContext(CLEAR_NAME);\n const store = useStoreContext(CLEAR_NAME);\n\n const isDisabled = disabledProp || disabled;\n\n const onClick = React.useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n clearProps.onClick?.(event);\n if (event.defaultPrevented) return;\n\n event.preventDefault();\n if (disabled || readOnly) return;\n store.setState(\"value\", \"\");\n },\n [clearProps.onClick, disabled, readOnly, store]\n );\n\n const ClearPrimitive = asChild ? Slot : \"button\";\n\n return (\n <ClearPrimitive\n type=\"button\"\n data-slot=\"time-picker-clear\"\n disabled={isDisabled}\n {...clearProps}\n className={cn(\n // Viền focus theo khuôn `Button` — xem `TimePickerTrigger`.\n \"inline-flex items-center justify-center rounded-sm text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n className\n )}\n onClick={onClick}\n >\n {children ?? labels.clear}\n </ClearPrimitive>\n );\n}\n\nexport {\n TimePicker,\n TimePickerClear,\n type TimePickerClearProps,\n TimePickerContent,\n type TimePickerContentProps,\n TimePickerHour,\n type TimePickerHourProps,\n TimePickerInput,\n TimePickerInputGroup,\n type TimePickerInputGroupProps,\n type TimePickerInputProps,\n TimePickerLabel,\n type TimePickerLabelProps,\n TimePickerMinute,\n type TimePickerMinuteProps,\n TimePickerPeriod,\n type TimePickerPeriodProps,\n type TimePickerProps,\n TimePickerSecond,\n type TimePickerSecondProps,\n TimePickerSeparator,\n type TimePickerSeparatorProps,\n TimePickerTrigger,\n type TimePickerTriggerProps,\n useStore as useTimePicker\n};\n"],"mappings":"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","names":["value","ref","displayHour","now"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/ui/time-picker.tsx"],"sourcesContent":["\"use client\";\n\n/*\n * Port từ Dice UI (https://diceui.com/docs/components/time-picker) — MIT, © 2024 Sadman Sakib.\n * Giữ nguyên cấu trúc thượng nguồn để còn đối chiếu ngược được; mọi chỗ đổi đều có chú thích.\n */\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { Clock } from \"lucide-react\";\nimport * as React from \"react\";\nimport { useComitorLabels, useComitorLocale } from \"../../i18n/locale-provider.js\";\nimport { cn } from \"../../lib/cn.js\";\nimport { useComposedRefs } from \"../../lib/compose-refs.js\";\nimport { useAsRef } from \"../../lib/use-as-ref.js\";\nimport { useIsomorphicLayoutEffect } from \"../../lib/use-isomorphic-layout-effect.js\";\nimport { useLazyRef } from \"../../lib/use-lazy-ref.js\";\nimport { VisuallyHiddenInput } from \"../../lib/visually-hidden-input.js\";\nimport { Popover, PopoverAnchor, PopoverContent, PopoverTrigger } from \"./popover.js\";\nimport type { TimePickerLabels } from \"./time-picker-constants.js\";\n\nconst ROOT_NAME = \"TimePicker\";\nconst LABEL_NAME = \"TimePickerLabel\";\nconst INPUT_GROUP_NAME = \"TimePickerInputGroup\";\nconst INPUT_NAME = \"TimePickerInput\";\nconst TRIGGER_NAME = \"TimePickerTrigger\";\nconst CONTENT_NAME = \"TimePickerContent\";\nconst COLUMN_NAME = \"TimePickerColumn\";\nconst COLUMN_ITEM_NAME = \"TimePickerColumnItem\";\nconst HOUR_NAME = \"TimePickerHour\";\nconst MINUTE_NAME = \"TimePickerMinute\";\nconst SECOND_NAME = \"TimePickerSecond\";\nconst PERIOD_NAME = \"TimePickerPeriod\";\nconst CLEAR_NAME = \"TimePickerClear\";\n\nconst DEFAULT_STEP = 1;\nconst DEFAULT_SEGMENT_PLACEHOLDER = \"--\";\nconst SEGMENTS: Segment[] = [\"hour\", \"minute\", \"second\", \"period\"];\nconst PERIODS = [\"AM\", \"PM\"] as const;\n\ntype Segment = \"hour\" | \"minute\" | \"second\" | \"period\";\ntype SegmentFormat = \"numeric\" | \"2-digit\";\ntype Period = (typeof PERIODS)[number];\n\ninterface DivProps extends React.ComponentProps<\"div\"> {\n asChild?: boolean;\n}\n\ninterface ButtonProps extends React.ComponentProps<\"button\"> {\n asChild?: boolean;\n}\n\ntype PopoverContentProps = React.ComponentProps<typeof PopoverContent>;\n\ntype InputGroupElement = React.ComponentRef<typeof TimePickerInputGroup>;\ntype InputElement = React.ComponentRef<typeof TimePickerInput>;\ntype TriggerElement = React.ComponentRef<typeof TimePickerTrigger>;\ntype ColumnElement = React.ComponentRef<typeof TimePickerColumn>;\ntype ColumnItemElement = React.ComponentRef<typeof TimePickerColumnItem>;\n\ninterface TimeValue {\n hour?: number;\n minute?: number;\n second?: number;\n period?: Period;\n}\n\ninterface ItemData {\n value: number | string;\n ref: React.RefObject<ColumnItemElement | null>;\n selected: boolean;\n}\n\ninterface ColumnData {\n id: string;\n ref: React.RefObject<ColumnElement | null>;\n getSelectedItemRef: () => React.RefObject<ColumnItemElement | null> | null;\n getItems: () => ItemData[];\n}\n\nfunction focusFirst(candidates: React.RefObject<ColumnItemElement | null>[], preventScroll = false) {\n const PREVIOUSLY_FOCUSED_ELEMENT = document.activeElement;\n for (const candidateRef of candidates) {\n const candidate = candidateRef.current;\n if (!candidate) continue;\n if (candidate === PREVIOUSLY_FOCUSED_ELEMENT) return;\n candidate.focus({ preventScroll });\n if (document.activeElement !== PREVIOUSLY_FOCUSED_ELEMENT) return;\n }\n}\n\nfunction sortNodes<T extends { ref: React.RefObject<Element | null> }>(items: T[]): T[] {\n return items.sort((a, b) => {\n const elementA = a.ref.current;\n const elementB = b.ref.current;\n if (!elementA || !elementB) return 0;\n const position = elementA.compareDocumentPosition(elementB);\n if (position & Node.DOCUMENT_POSITION_FOLLOWING) {\n return -1;\n }\n if (position & Node.DOCUMENT_POSITION_PRECEDING) {\n return 1;\n }\n return 0;\n });\n}\n\nfunction getIs12Hour(locale?: string): boolean {\n const testDate = new Date(2000, 0, 1, 13, 0, 0);\n const formatted = new Intl.DateTimeFormat(locale, {\n hour: \"numeric\"\n }).format(testDate);\n\n return /am|pm/i.test(formatted) || !formatted.includes(\"13\");\n}\n\nfunction parseTimeString(timeString: string | undefined): TimeValue | null {\n if (!timeString) return null;\n\n const parts = timeString.split(\":\");\n if (parts.length < 2) return null;\n\n const result: TimeValue = {};\n\n if (parts[0] && parts[0] !== DEFAULT_SEGMENT_PLACEHOLDER) {\n const hour = Number.parseInt(parts[0], 10);\n if (!Number.isNaN(hour) && hour >= 0 && hour <= 23) {\n result.hour = hour;\n }\n }\n\n if (parts[1] && parts[1] !== DEFAULT_SEGMENT_PLACEHOLDER) {\n const minute = Number.parseInt(parts[1], 10);\n if (!Number.isNaN(minute) && minute >= 0 && minute <= 59) {\n result.minute = minute;\n }\n }\n\n if (parts[2] && parts[2] !== DEFAULT_SEGMENT_PLACEHOLDER) {\n const second = Number.parseInt(parts[2], 10);\n if (!Number.isNaN(second) && second >= 0 && second <= 59) {\n result.second = second;\n }\n }\n if (result.hour === undefined && result.minute === undefined && result.second === undefined) {\n return null;\n }\n\n return result;\n}\n\nfunction formatTimeValue(value: TimeValue, showSeconds: boolean): string {\n const hourStr = value.hour !== undefined ? value.hour.toString().padStart(2, \"0\") : DEFAULT_SEGMENT_PLACEHOLDER;\n const minuteStr = value.minute !== undefined ? value.minute.toString().padStart(2, \"0\") : DEFAULT_SEGMENT_PLACEHOLDER;\n const secondStr = value.second !== undefined ? value.second.toString().padStart(2, \"0\") : DEFAULT_SEGMENT_PLACEHOLDER;\n\n if (showSeconds) {\n return `${hourStr}:${minuteStr}:${secondStr}`;\n }\n return `${hourStr}:${minuteStr}`;\n}\n\nfunction to12Hour(hour24: number): { hour: number; period: Period } {\n const period: Period = hour24 >= 12 ? \"PM\" : \"AM\";\n const hour = hour24 % 12 || 12;\n return { hour, period };\n}\n\nfunction to24Hour(hour12: number, period: Period): number {\n if (hour12 === 12) {\n return period === \"PM\" ? 12 : 0;\n }\n return period === \"PM\" ? hour12 + 12 : hour12;\n}\n\nfunction clamp(value: number, min: number, max: number) {\n return Math.min(Math.max(value, min), max);\n}\n\n/*\n * ⚠ Khác thượng nguồn: bản gốc in thẳng mã buổi \"AM\"/\"PM\" ra ô và ra cột. Ở đây mã buổi vẫn là\n * thứ chạy trong state (`editValue`, `updateTimeValue`) — chỉ lúc VẼ mới đổi sang nhãn hiển thị\n * (`labels.am`/`labels.pm` — \"AM\"/\"PM\" ở tiếng Anh, \"SA\"/\"CH\" ở tiếng Việt), nên logic bàn phím\n * của thượng nguồn giữ nguyên.\n */\nfunction getPeriodLabel(value: string, labels: Pick<TimePickerLabels, \"am\" | \"pm\">): string {\n if (value === \"AM\") return labels.am;\n if (value === \"PM\") return labels.pm;\n return value;\n}\n\n/*\n * ⚠ Khác thượng nguồn: bản gốc chỉ nhận `A`/`1` → AM và `P`/`2` → PM (viết thẳng ở hai chỗ).\n * Nhãn tiếng Việt là \"SA\"/\"CH\" thì người dùng sẽ gõ `S`/`C`, nên ký tự đầu của nhãn cũng là phím\n * tắt. Phím của thượng nguồn được xét TRƯỚC và vẫn chạy.\n */\nfunction getPeriodFromKey(key: string, labels: Pick<TimePickerLabels, \"am\" | \"pm\">): Period | null {\n const lowerKey = key.toLowerCase();\n if (lowerKey === \"a\" || lowerKey === \"1\") return \"AM\";\n if (lowerKey === \"p\" || lowerKey === \"2\") return \"PM\";\n if (lowerKey.length !== 1) return null;\n if (lowerKey === labels.am.charAt(0).toLowerCase()) return \"AM\";\n if (lowerKey === labels.pm.charAt(0).toLowerCase()) return \"PM\";\n return null;\n}\n\ninterface StoreState {\n value: string;\n open: boolean;\n openedViaFocus: boolean;\n}\n\ninterface Store {\n subscribe: (callback: () => void) => () => void;\n getState: () => StoreState;\n setState: <K extends keyof StoreState>(key: K, value: StoreState[K]) => void;\n notify: () => void;\n}\n\nconst StoreContext = React.createContext<Store | null>(null);\n\nfunction useStoreContext(consumerName: string) {\n const context = React.useContext(StoreContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` phải nằm bên trong \\`${ROOT_NAME}\\``);\n }\n return context;\n}\n\nfunction useStore<T>(selector: (state: StoreState) => T, ogStore?: Store | null): T {\n const contextStore = React.useContext(StoreContext);\n\n const store = ogStore ?? contextStore;\n\n if (!store) {\n throw new Error(`\\`useTimePicker\\` phải được gọi bên trong \\`${ROOT_NAME}\\``);\n }\n\n const getSnapshot = React.useCallback(() => selector(store.getState()), [store, selector]);\n\n return React.useSyncExternalStore(store.subscribe, getSnapshot, getSnapshot);\n}\n\ntype SegmentPlaceholder =\n | string\n | {\n hour?: string;\n minute?: string;\n second?: string;\n period?: string;\n };\n\ninterface TimePickerContextValue {\n id: string;\n inputGroupId: string;\n labelId: string;\n triggerId: string;\n inputGroupRef: React.RefObject<InputGroupElement | null>;\n triggerRef: React.RefObject<TriggerElement | null>;\n openOnFocus: boolean;\n inputGroupClickAction: \"focus\" | \"open\";\n onInputGroupChange: (inputGroup: InputGroupElement | null) => void;\n disabled: boolean;\n readOnly: boolean;\n required: boolean;\n invalid: boolean;\n showSeconds: boolean;\n is12Hour: boolean;\n minuteStep: number;\n secondStep: number;\n hourStep: number;\n segmentPlaceholder: {\n hour: string;\n minute: string;\n second: string;\n period: string;\n };\n labels: TimePickerLabels;\n min?: string;\n max?: string;\n}\n\nconst TimePickerContext = React.createContext<TimePickerContextValue | null>(null);\n\nfunction useTimePickerContext(consumerName: string) {\n const context = React.useContext(TimePickerContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` phải nằm bên trong \\`${ROOT_NAME}\\``);\n }\n return context;\n}\n\ninterface TimePickerProps extends DivProps {\n /** Giá trị có kiểm soát, LUÔN ở dạng 24 giờ: `\"HH:mm\"` hoặc `\"HH:mm:ss\"` — bất kể đồng hồ hiển thị. */\n value?: string;\n /** Giá trị ban đầu (không kiểm soát), cùng định dạng với `value`. */\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** Mở bảng chọn ngay khi một ô được focus. Mặc định `false`. */\n openOnFocus?: boolean;\n /** Bấm vào khoảng trống của nhóm ô: `\"focus\"` (mặc định) focus ô đầu, `\"open\"` mở bảng chọn. */\n inputGroupClickAction?: \"focus\" | \"open\";\n /**\n * ⚠ Thượng nguồn nhận `min`/`max` và đưa vào context nhưng CHƯA áp dụng ở đâu cả — không chặn\n * gõ, không làm mờ mục trong cột. Giữ để khớp API gốc; muốn ràng buộc khung giờ (ca làm, giờ\n * hành chính) thì app phải tự kiểm ở `onValueChange` / tầng validate của form.\n */\n min?: string;\n /** Xem `min`. */\n max?: string;\n hourStep?: number;\n minuteStep?: number;\n secondStep?: number;\n /** Chữ giữ chỗ của ô trống — một chuỗi cho mọi ô, hoặc từng ô. Mặc định `\"--\"`. */\n segmentPlaceholder?: SegmentPlaceholder;\n /**\n * Locale BCP 47 quyết định đồng hồ 12 hay 24 giờ — CHỈ vậy, không dịch nhãn (nhãn theo\n * `ComitorLocaleProvider`, xem `labels`).\n *\n * Không truyền thì lấy `locale` của `ComitorLocaleProvider`: không có provider → `\"en\"` → 12 giờ\n * (\"AM\"/\"PM\"); `\"vi\"` → 24 giờ; `\"en-GB\"` → 24 giờ. Trước `3.0.0` mặc định cứng là `\"vi-VN\"`.\n *\n * ⚠ Khác thượng nguồn: bản gốc để `undefined`, tức theo locale của MÔI TRƯỜNG CHẠY — xem chú\n * thích ở chỗ đọc prop này trong `TimePicker`. Muốn theo trình duyệt: truyền `navigator.language`\n * — nhưng chỉ sau khi hydrate, vì server không biết giá trị đó.\n */\n locale?: string;\n /**\n * Chuỗi hiển thị và nhãn trình đọc màn hình (tên từng ô, nhãn buổi, tên nút mở, nút xoá). Không\n * truyền thì theo namespace `timePicker` của `ComitorLocaleProvider` (mặc định tiếng Anh). Thêm\n * so với thượng nguồn.\n */\n labels?: Partial<TimePickerLabels>;\n name?: string;\n disabled?: boolean;\n invalid?: boolean;\n readOnly?: boolean;\n required?: boolean;\n showSeconds?: boolean;\n}\n\nfunction TimePicker(props: TimePickerProps) {\n const {\n value: valueProp,\n defaultValue,\n onValueChange,\n open,\n defaultOpen,\n onOpenChange,\n openOnFocus = false,\n inputGroupClickAction = \"focus\",\n min,\n max,\n hourStep = DEFAULT_STEP,\n minuteStep = DEFAULT_STEP,\n secondStep = DEFAULT_STEP,\n segmentPlaceholder = DEFAULT_SEGMENT_PLACEHOLDER,\n locale: localeProp,\n labels: labelsProp,\n name,\n asChild,\n disabled = false,\n invalid = false,\n readOnly = false,\n required = false,\n showSeconds = false,\n className,\n children,\n id,\n ...rootProps\n } = props;\n\n /*\n * ⚠ Khác thượng nguồn: bản gốc để `locale` là `undefined`, tức đồng hồ 12/24 giờ suy từ locale\n * của MÔI TRƯỜNG CHẠY — máy chủ Node thường là `en-US` (12 giờ) còn trình duyệt người dùng Việt là\n * `vi` (24 giờ), nên cùng \"14:30\" server in \"02\" còn client in \"14\": lệch hydrate (cùng lý do\n * `Calendar` bỏ `\"default\"`). Ở đây mặc định là `locale` của `ComitorLocaleProvider` — cùng một\n * giá trị ở cả hai phía. `Intl.DateTimeFormat(\"vi\", { hour: \"numeric\" })` in \"13 giờ\" cho 13:00\n * → `getIs12Hour` trả `false`; `\"en\"` in \"1 PM\" → `true`. Trước `3.0.0` mặc định cứng là `\"vi-VN\"`.\n */\n const { locale: providerLocale } = useComitorLocale();\n const locale = localeProp ?? providerLocale;\n\n const instanceId = React.useId();\n const rootId = id ?? instanceId;\n const inputGroupId = React.useId();\n const labelId = React.useId();\n const triggerId = React.useId();\n\n const inputGroupRef = React.useRef<InputGroupElement>(null);\n const triggerRef = React.useRef<TriggerElement>(null);\n\n const [inputGroup, setInputGroup] = React.useState<InputGroupElement | null>(null);\n const isFormControl = inputGroup ? !!inputGroup.closest(\"form\") : true;\n\n const listenersRef = useLazyRef(() => new Set<() => void>());\n const stateRef = useLazyRef<StoreState>(() => ({\n value: valueProp ?? defaultValue ?? \"\",\n open: open ?? defaultOpen ?? false,\n openedViaFocus: false\n }));\n\n const propsRef = useAsRef({ onValueChange, onOpenChange });\n\n const store: Store = React.useMemo(() => {\n return {\n subscribe: (cb) => {\n listenersRef.current.add(cb);\n return () => listenersRef.current.delete(cb);\n },\n getState: () => stateRef.current,\n setState: (key, value) => {\n if (Object.is(stateRef.current[key], value)) return;\n\n if (key === \"value\" && typeof value === \"string\") {\n stateRef.current.value = value;\n propsRef.current.onValueChange?.(value);\n } else if (key === \"open\" && typeof value === \"boolean\") {\n stateRef.current.open = value;\n propsRef.current.onOpenChange?.(value);\n if (!value) {\n stateRef.current.openedViaFocus = false;\n }\n } else {\n stateRef.current[key] = value;\n }\n\n store.notify();\n },\n notify: () => {\n for (const cb of listenersRef.current) {\n cb();\n }\n }\n };\n }, [listenersRef, stateRef, propsRef]);\n\n const value = useStore((state) => state.value, store);\n\n useIsomorphicLayoutEffect(() => {\n if (valueProp !== undefined) {\n store.setState(\"value\", valueProp);\n }\n }, [valueProp]);\n\n useIsomorphicLayoutEffect(() => {\n if (open !== undefined) {\n store.setState(\"open\", open);\n }\n }, [open]);\n\n const storeOpen = useStore((state) => state.open, store);\n\n const onPopoverOpenChange = React.useCallback((newOpen: boolean) => store.setState(\"open\", newOpen), [store]);\n\n const is12Hour = React.useMemo(() => getIs12Hour(locale), [locale]);\n\n const normalizedPlaceholder = React.useMemo(() => {\n if (typeof segmentPlaceholder === \"string\") {\n return {\n hour: segmentPlaceholder,\n minute: segmentPlaceholder,\n second: segmentPlaceholder,\n period: segmentPlaceholder\n };\n }\n return {\n hour: segmentPlaceholder.hour ?? DEFAULT_SEGMENT_PLACEHOLDER,\n minute: segmentPlaceholder.minute ?? DEFAULT_SEGMENT_PLACEHOLDER,\n second: segmentPlaceholder.second ?? DEFAULT_SEGMENT_PLACEHOLDER,\n period: segmentPlaceholder.period ?? DEFAULT_SEGMENT_PLACEHOLDER\n };\n }, [segmentPlaceholder]);\n\n const labels = useComitorLabels(\"timePicker\", labelsProp);\n\n const rootContext = React.useMemo<TimePickerContextValue>(\n () => ({\n id: rootId,\n inputGroupId,\n labelId,\n triggerId,\n inputGroupRef,\n triggerRef,\n openOnFocus,\n inputGroupClickAction,\n onInputGroupChange: setInputGroup,\n disabled,\n readOnly,\n required,\n invalid,\n showSeconds,\n is12Hour,\n minuteStep,\n secondStep,\n hourStep,\n segmentPlaceholder: normalizedPlaceholder,\n labels,\n min,\n max\n }),\n [\n rootId,\n inputGroupId,\n labelId,\n triggerId,\n openOnFocus,\n inputGroupClickAction,\n disabled,\n readOnly,\n required,\n invalid,\n showSeconds,\n is12Hour,\n minuteStep,\n secondStep,\n hourStep,\n normalizedPlaceholder,\n labels,\n min,\n max\n ]\n );\n\n const RootPrimitive = asChild ? Slot : \"div\";\n\n return (\n <>\n <StoreContext.Provider value={store}>\n <TimePickerContext.Provider value={rootContext}>\n <Popover open={storeOpen} onOpenChange={onPopoverOpenChange}>\n <RootPrimitive\n data-slot=\"time-picker\"\n data-disabled={disabled ? \"\" : undefined}\n data-invalid={invalid ? \"\" : undefined}\n {...rootProps}\n className={cn(\"relative\", className)}\n >\n {children}\n </RootPrimitive>\n </Popover>\n </TimePickerContext.Provider>\n </StoreContext.Provider>\n {isFormControl && (\n <VisuallyHiddenInput\n type=\"hidden\"\n control={inputGroup}\n name={name}\n value={value}\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n />\n )}\n </>\n );\n}\n\ninterface TimePickerLabelProps extends React.ComponentProps<\"label\"> {\n asChild?: boolean;\n}\n\nfunction TimePickerLabel(props: TimePickerLabelProps) {\n const { asChild, className, ...labelProps } = props;\n\n const { labelId } = useTimePickerContext(LABEL_NAME);\n\n const LabelPrimitive = asChild ? Slot : \"label\";\n\n return (\n <LabelPrimitive\n data-slot=\"time-picker-label\"\n {...labelProps}\n /*\n * ⚠ Khác thượng nguồn: bản gốc đặt `htmlFor={labelId}` mà KHÔNG phần tử nào mang\n * `id={labelId}` — nhóm ô trỏ `aria-labelledby={labelId}` vào hư không nên trình đọc màn\n * hình đọc một nhóm không tên, và `htmlFor` trỏ vào chính một id không tồn tại. Nhãn giờ\n * MANG id đó; `htmlFor` (nếu app cần) đi qua `labelProps`.\n */\n id={labelId}\n className={cn(\n \"text-sm leading-none font-medium peer-disabled:cursor-not-allowed peer-disabled:opacity-70\",\n className\n )}\n />\n );\n}\n\ninterface TimePickerInputGroupContextValue {\n onInputRegister: (segment: Segment, ref: React.RefObject<InputElement | null>) => void;\n onInputUnregister: (segment: Segment) => void;\n getNextInput: (currentSegment: Segment) => React.RefObject<InputElement | null> | null;\n}\n\nconst TimePickerInputGroupContext = React.createContext<TimePickerInputGroupContextValue | null>(null);\n\nfunction useTimePickerInputGroupContext(consumerName: string) {\n const context = React.useContext(TimePickerInputGroupContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` phải nằm bên trong \\`${INPUT_GROUP_NAME}\\``);\n }\n return context;\n}\n\ntype TimePickerInputGroupProps = DivProps;\n\nfunction TimePickerInputGroup(props: TimePickerInputGroupProps) {\n const {\n onPointerDown: onPointerDownProp,\n onClick: onClickProp,\n asChild,\n className,\n style,\n ref,\n ...inputGroupProps\n } = props;\n\n const {\n inputGroupId,\n labelId,\n onInputGroupChange,\n disabled,\n readOnly,\n invalid,\n segmentPlaceholder,\n labels,\n inputGroupRef,\n triggerRef,\n inputGroupClickAction\n } = useTimePickerContext(INPUT_GROUP_NAME);\n\n const store = useStoreContext(INPUT_GROUP_NAME);\n\n const composedRef = useComposedRefs(ref, inputGroupRef, onInputGroupChange);\n\n const inputRefsMap = React.useRef<Map<Segment, React.RefObject<InputElement | null>>>(new Map());\n\n const onInputRegister = React.useCallback((segment: Segment, ref: React.RefObject<InputElement | null>) => {\n inputRefsMap.current.set(segment, ref);\n }, []);\n\n const onInputUnregister = React.useCallback((segment: Segment) => {\n inputRefsMap.current.delete(segment);\n }, []);\n\n const getNextInput = React.useCallback((currentSegment: Segment): React.RefObject<InputElement | null> | null => {\n const segmentOrder: Segment[] = [\"hour\", \"minute\", \"second\", \"period\"];\n const currentIndex = segmentOrder.indexOf(currentSegment);\n\n if (currentIndex === -1 || currentIndex === segmentOrder.length - 1) {\n return null;\n }\n\n for (let i = currentIndex + 1; i < segmentOrder.length; i++) {\n const nextSegment = segmentOrder[i];\n if (nextSegment) {\n const nextRef = inputRefsMap.current.get(nextSegment);\n if (nextRef?.current) {\n return nextRef;\n }\n }\n }\n\n return null;\n }, []);\n\n const onPointerDown = React.useCallback(\n (event: React.PointerEvent<InputGroupElement>) => {\n onPointerDownProp?.(event);\n if (disabled || readOnly || event.defaultPrevented) return;\n\n const target = event.target as HTMLElement;\n\n if (target.tagName === \"INPUT\" || target.closest(\"input\")) {\n return;\n }\n\n if (triggerRef.current?.contains(target)) {\n return;\n }\n\n event.preventDefault();\n },\n [onPointerDownProp, disabled, readOnly, triggerRef]\n );\n\n const onClick = React.useCallback(\n (event: React.MouseEvent<InputGroupElement>) => {\n onClickProp?.(event);\n if (disabled || readOnly || event.defaultPrevented) return;\n\n const target = event.target as HTMLElement;\n\n if (target.tagName === \"INPUT\" || target.closest(\"input\")) {\n return;\n }\n\n if (triggerRef.current?.contains(target)) {\n return;\n }\n\n if (inputGroupClickAction === \"open\") {\n store.setState(\"open\", true);\n } else {\n const activeElement = document.activeElement;\n const isInputAlreadyFocused =\n activeElement && activeElement.tagName === \"INPUT\" && inputGroupRef.current?.contains(activeElement);\n\n if (!isInputAlreadyFocused) {\n for (const segment of SEGMENTS) {\n const inputRef = inputRefsMap.current.get(segment);\n if (inputRef?.current) {\n inputRef.current.focus();\n inputRef.current.select();\n break;\n }\n }\n }\n }\n },\n [onClickProp, disabled, readOnly, inputGroupClickAction, store, triggerRef, inputGroupRef]\n );\n\n const inputGroupContextValue = React.useMemo<TimePickerInputGroupContextValue>(\n () => ({\n onInputRegister,\n onInputUnregister,\n getNextInput\n }),\n [onInputRegister, onInputUnregister, getNextInput]\n );\n\n const InputGroupPrimitive = asChild ? Slot : \"div\";\n\n return (\n <TimePickerInputGroupContext.Provider value={inputGroupContextValue}>\n <PopoverAnchor asChild>\n <InputGroupPrimitive\n role=\"group\"\n id={inputGroupId}\n aria-labelledby={labelId}\n data-slot=\"time-picker-input-group\"\n data-disabled={disabled ? \"\" : undefined}\n data-invalid={invalid ? \"\" : undefined}\n {...inputGroupProps}\n className={cn(\n /*\n * ⚠ Khác thượng nguồn: khung ô đi theo `Input` của gói (ô ngày của `DatePicker` là\n * một `Input`, và hai thứ này hay đứng chung một hàng biểu mẫu): `h-9` thay `h-10`,\n * bỏ `shadow-xs`, hover đậm viền `--control-edge-strong`, focus viền\n * `--primary-ink` + quầng `ring-2 ring-ring/50` KHÔNG offset (quy ước họ ô nhập —\n * xem `InputGroup`), lỗi viền `--destructive-ink`. Số đo ở chú thích đầu `input.tsx`.\n */\n \"flex h-9 w-full cursor-text items-center gap-0.5 rounded-md border border-input bg-background px-3 py-2 text-sm text-foreground transition-colors duration-150 ease-out outline-none hover:border-control-edge-strong\",\n \"has-[input:focus]:border-primary-ink has-[input:focus]:ring-2 has-[input:focus]:ring-ring/50\",\n invalid &&\n \"border-destructive-ink hover:border-destructive-ink has-[input:focus]:border-destructive-ink has-[input:focus]:ring-destructive/30\",\n /*\n * ⚠ Khác thượng nguồn: bản gốc ghép `disabled && \"cursor-not-allowed opacity-50\"` —\n * lớp gắn VÔ ĐIỀU KIỆN vào chuỗi, nên `pnpm lint:a11y` đo viền/chữ lúc NGHỈ đã nhân\n * 50% (viền 1,75:1, chữ 3,49:1 ✗). Neo vào `:disabled` gốc của các ô con (cổng miễn\n * trừ đúng nhánh này — WCAG 1.4.3/1.4.11 không đòi tương phản cho control vô hiệu);\n * `disabled` ở gốc khoá MỌI ô nên hai cách cho cùng kết quả. Thêm `bg-muted` theo `Input`.\n */\n \"has-[input:disabled]:cursor-not-allowed has-[input:disabled]:bg-muted has-[input:disabled]:opacity-50\",\n className\n )}\n style={\n {\n \"--time-picker-hour-input-width\": `${segmentPlaceholder.hour.length}ch`,\n \"--time-picker-minute-input-width\": `${segmentPlaceholder.minute.length}ch`,\n \"--time-picker-second-input-width\": `${segmentPlaceholder.second.length}ch`,\n // ⚠ Khác thượng nguồn: tính cả độ dài nhãn buổi (`labels.am`/`labels.pm`) — bản gốc\n // chỉ có \"AM\"/\"PM\" 2 ký tự nên ghim sàn 2; nhãn do app đặt có thể dài hơn.\n \"--time-picker-period-input-width\": `${Math.max(segmentPlaceholder.period.length, labels.am.length, labels.pm.length, 2) + 0.5}ch`,\n ...style\n } as React.CSSProperties\n }\n ref={composedRef}\n onPointerDown={onPointerDown}\n onClick={onClick}\n />\n </PopoverAnchor>\n </TimePickerInputGroupContext.Provider>\n );\n}\n\ninterface TimePickerInputProps extends Omit<React.ComponentProps<\"input\">, \"type\" | \"value\"> {\n segment: Segment;\n}\n\nfunction TimePickerInput(props: TimePickerInputProps) {\n const {\n segment,\n onBlur: onBlurProp,\n onChange: onChangeProp,\n onClick: onClickProp,\n onFocus: onFocusProp,\n onKeyDown: onKeyDownProp,\n disabled: disabledProp,\n readOnly: readOnlyProp,\n className,\n style,\n ref,\n ...inputProps\n } = props;\n\n const { is12Hour, showSeconds, disabled, readOnly, invalid, segmentPlaceholder, labels, openOnFocus } =\n useTimePickerContext(INPUT_NAME);\n const store = useStoreContext(INPUT_NAME);\n const inputGroupContext = useTimePickerInputGroupContext(INPUT_NAME);\n\n const isDisabled = disabledProp || disabled;\n const isReadOnly = readOnlyProp || readOnly;\n\n const value = useStore((state) => state.value);\n const timeValue = parseTimeString(value);\n\n const inputRef = React.useRef<HTMLInputElement>(null);\n const composedRef = useComposedRefs(ref, inputRef);\n\n useIsomorphicLayoutEffect(() => {\n if (segment) {\n inputGroupContext.onInputRegister(segment as Segment, inputRef);\n return () => inputGroupContext.onInputUnregister(segment as Segment);\n }\n }, [inputGroupContext, segment]);\n\n const getSegmentValue = React.useCallback(() => {\n if (!timeValue) {\n if (!segment) return \"\";\n return segmentPlaceholder[segment];\n }\n switch (segment) {\n case \"hour\": {\n if (timeValue.hour === undefined) return segmentPlaceholder.hour;\n if (is12Hour) {\n return to12Hour(timeValue.hour).hour.toString().padStart(2, \"0\");\n }\n return timeValue.hour.toString().padStart(2, \"0\");\n }\n case \"minute\":\n if (timeValue.minute === undefined) return segmentPlaceholder.minute;\n return timeValue.minute.toString().padStart(2, \"0\");\n case \"second\":\n if (timeValue.second === undefined) return segmentPlaceholder.second;\n return timeValue.second.toString().padStart(2, \"0\");\n case \"period\": {\n if (!timeValue || timeValue.hour === undefined) return segmentPlaceholder.period;\n return to12Hour(timeValue.hour).period;\n }\n default:\n return \"\";\n }\n }, [timeValue, segment, is12Hour, segmentPlaceholder]);\n\n const [editValue, setEditValue] = React.useState(getSegmentValue());\n const [isEditing, setIsEditing] = React.useState(false);\n const [pendingDigit, setPendingDigit] = React.useState<string | null>(null);\n\n React.useEffect(() => {\n if (!isEditing) {\n setEditValue(getSegmentValue());\n setPendingDigit(null);\n }\n }, [getSegmentValue, isEditing]);\n\n const updateTimeValue = React.useCallback(\n (newSegmentValue: string | undefined, shouldCreateIfEmpty = false) => {\n const placeholder = segment ? segmentPlaceholder[segment] : DEFAULT_SEGMENT_PLACEHOLDER;\n if (!newSegmentValue || newSegmentValue === placeholder) return;\n if (!timeValue && !shouldCreateIfEmpty) return;\n\n const currentTime = timeValue ?? {};\n const newTime = { ...currentTime };\n\n switch (segment) {\n case \"hour\": {\n const displayHour = Number.parseInt(newSegmentValue, 10);\n if (!Number.isNaN(displayHour)) {\n if (is12Hour) {\n const clampedHour = clamp(displayHour, 1, 12);\n let currentPeriod: Period;\n if (timeValue?.period !== undefined) {\n currentPeriod = timeValue.period;\n } else if (timeValue?.hour !== undefined) {\n currentPeriod = to12Hour(timeValue.hour).period;\n } else {\n const now = new Date();\n currentPeriod = to12Hour(now.getHours()).period;\n }\n const hour24 = to24Hour(clampedHour, currentPeriod);\n newTime.hour = hour24;\n if (timeValue?.period !== undefined) {\n newTime.period = timeValue.period;\n }\n } else {\n newTime.hour = clamp(displayHour, 0, 23);\n }\n }\n break;\n }\n case \"minute\": {\n const minute = Number.parseInt(newSegmentValue, 10);\n if (!Number.isNaN(minute)) {\n newTime.minute = clamp(minute, 0, 59);\n }\n break;\n }\n case \"second\": {\n const second = Number.parseInt(newSegmentValue, 10);\n if (!Number.isNaN(second)) {\n newTime.second = clamp(second, 0, 59);\n }\n break;\n }\n case \"period\": {\n if (newSegmentValue === \"AM\" || newSegmentValue === \"PM\") {\n newTime.period = newSegmentValue;\n if (timeValue && timeValue.hour !== undefined) {\n const currentDisplay = to12Hour(timeValue.hour);\n newTime.hour = to24Hour(currentDisplay.hour, newSegmentValue);\n }\n }\n break;\n }\n }\n\n const newValue = formatTimeValue(newTime, showSeconds);\n store.setState(\"value\", newValue);\n },\n [timeValue, segment, is12Hour, showSeconds, store, segmentPlaceholder]\n );\n\n const onBlur = React.useCallback(\n (event: React.FocusEvent<InputElement>) => {\n onBlurProp?.(event);\n if (event.defaultPrevented) return;\n\n setIsEditing(false);\n\n const placeholder = segment ? segmentPlaceholder[segment] : DEFAULT_SEGMENT_PLACEHOLDER;\n if (editValue && editValue !== placeholder && editValue.length > 0) {\n let valueToUpdate = editValue;\n\n if (segment !== \"period\") {\n if (editValue.length === 2) {\n valueToUpdate = editValue;\n } else if (editValue.length === 1) {\n const numValue = Number.parseInt(editValue, 10);\n if (!Number.isNaN(numValue)) {\n valueToUpdate = numValue.toString().padStart(2, \"0\");\n }\n }\n }\n\n updateTimeValue(valueToUpdate, true);\n\n // Ô còn trống sau khi rời một ô đã gõ → lấp bằng giờ hiện tại (hành vi gốc).\n queueMicrotask(() => {\n const currentTimeValue = parseTimeString(store.getState().value);\n if (currentTimeValue) {\n const now = new Date();\n const newTime = { ...currentTimeValue };\n let needsUpdate = false;\n\n if (newTime.hour === undefined) {\n newTime.hour = now.getHours();\n needsUpdate = true;\n }\n\n if (newTime.minute === undefined) {\n newTime.minute = now.getMinutes();\n needsUpdate = true;\n }\n\n if (showSeconds && newTime.second === undefined) {\n newTime.second = now.getSeconds();\n needsUpdate = true;\n }\n\n if (needsUpdate) {\n const newValue = formatTimeValue(newTime, showSeconds);\n store.setState(\"value\", newValue);\n }\n }\n });\n }\n\n setEditValue(getSegmentValue());\n setPendingDigit(null);\n },\n [onBlurProp, editValue, updateTimeValue, getSegmentValue, segment, segmentPlaceholder, showSeconds, store]\n );\n\n const onChange = React.useCallback(\n (event: React.ChangeEvent<InputElement>) => {\n onChangeProp?.(event);\n if (event.defaultPrevented) return;\n\n let newValue = event.target.value;\n\n const placeholder = segment ? segmentPlaceholder[segment] : DEFAULT_SEGMENT_PLACEHOLDER;\n if (editValue === placeholder && newValue.length > 0 && newValue !== placeholder) {\n newValue = newValue.replace(new RegExp(`^${placeholder}`), \"\");\n }\n\n if (segment === \"period\") {\n const newPeriod = getPeriodFromKey(newValue.charAt(0), labels);\n\n if (newPeriod) {\n setEditValue(newPeriod);\n updateTimeValue(newPeriod, true);\n queueMicrotask(() => {\n inputRef.current?.select();\n });\n }\n return;\n }\n\n if (segment === \"hour\" || segment === \"minute\" || segment === \"second\") {\n newValue = newValue.replace(/\\D/g, \"\");\n }\n\n if (newValue.length > 2) {\n newValue = newValue.slice(0, 2);\n }\n if (segment === \"hour\" || segment === \"minute\" || segment === \"second\") {\n const numValue = Number.parseInt(newValue, 10);\n\n if (!Number.isNaN(numValue) && newValue.length > 0) {\n if (pendingDigit !== null && newValue.length === 1) {\n const twoDigitValue = pendingDigit + newValue;\n const combinedNum = Number.parseInt(twoDigitValue, 10);\n\n if (!Number.isNaN(combinedNum)) {\n const paddedValue = combinedNum.toString().padStart(2, \"0\");\n setEditValue(paddedValue);\n updateTimeValue(paddedValue, true);\n setPendingDigit(null);\n\n queueMicrotask(() => {\n if (segment) {\n const nextInputRef = inputGroupContext.getNextInput(segment);\n if (nextInputRef?.current) {\n nextInputRef.current.focus();\n nextInputRef.current.select();\n }\n }\n });\n return;\n }\n }\n\n const maxFirstDigit = segment === \"hour\" ? (is12Hour ? 1 : 2) : 5;\n\n const firstDigit = Number.parseInt(newValue[0] ?? \"0\", 10);\n const shouldAutoAdvance = firstDigit > maxFirstDigit;\n\n if (newValue.length === 1) {\n if (shouldAutoAdvance) {\n const paddedValue = numValue.toString().padStart(2, \"0\");\n setEditValue(paddedValue);\n updateTimeValue(paddedValue, true);\n setPendingDigit(null);\n\n queueMicrotask(() => {\n if (segment) {\n const nextInputRef = inputGroupContext.getNextInput(segment);\n if (nextInputRef?.current) {\n nextInputRef.current.focus();\n nextInputRef.current.select();\n }\n }\n });\n } else {\n const paddedValue = numValue.toString().padStart(2, \"0\");\n setEditValue(paddedValue);\n setPendingDigit(newValue);\n queueMicrotask(() => {\n inputRef.current?.select();\n });\n }\n } else if (newValue.length === 2) {\n const paddedValue = numValue.toString().padStart(2, \"0\");\n setEditValue(paddedValue);\n updateTimeValue(paddedValue, true);\n setPendingDigit(null);\n\n queueMicrotask(() => {\n if (segment) {\n const nextInputRef = inputGroupContext.getNextInput(segment);\n if (nextInputRef?.current) {\n nextInputRef.current.focus();\n nextInputRef.current.select();\n }\n }\n });\n }\n } else if (newValue.length === 0) {\n setEditValue(\"\");\n setPendingDigit(null);\n }\n }\n },\n [\n segment,\n updateTimeValue,\n onChangeProp,\n editValue,\n is12Hour,\n inputGroupContext,\n pendingDigit,\n segmentPlaceholder,\n labels\n ]\n );\n\n const onClick = React.useCallback(\n (event: React.MouseEvent<InputElement>) => {\n onClickProp?.(event);\n if (event.defaultPrevented) return;\n\n event.currentTarget.select();\n },\n [onClickProp]\n );\n\n const onFocus = React.useCallback(\n (event: React.FocusEvent<InputElement>) => {\n onFocusProp?.(event);\n if (event.defaultPrevented) return;\n\n setIsEditing(true);\n setPendingDigit(null);\n\n if (openOnFocus && !store.getState().open) {\n store.setState(\"openedViaFocus\", true);\n store.setState(\"open\", true);\n }\n\n queueMicrotask(() => event.target.select());\n },\n [onFocusProp, openOnFocus, store]\n );\n\n const onKeyDown = React.useCallback(\n (event: React.KeyboardEvent<InputElement>) => {\n onKeyDownProp?.(event);\n if (event.defaultPrevented) return;\n\n if (event.key === \"ArrowLeft\" || event.key === \"ArrowRight\") {\n event.preventDefault();\n\n const goToPrevious = event.key === \"ArrowLeft\";\n const inputGroup = inputRef.current?.closest('[data-slot=\"time-picker-input-group\"]');\n\n if (inputGroup && inputRef.current) {\n const allInputs = Array.from(inputGroup.querySelectorAll('input[type=\"text\"]')) as HTMLInputElement[];\n const currentIdx = allInputs.indexOf(inputRef.current);\n\n if (currentIdx !== -1) {\n const targetIdx = goToPrevious\n ? Math.max(0, currentIdx - 1)\n : Math.min(allInputs.length - 1, currentIdx + 1);\n\n const targetInput = allInputs[targetIdx];\n if (targetInput && targetInput !== inputRef.current) {\n targetInput.focus();\n targetInput.select();\n }\n }\n }\n return;\n }\n\n if (event.key === \"Backspace\" || event.key === \"Delete\") {\n const input = inputRef.current;\n if (input && input.selectionStart === 0 && input.selectionEnd === input.value.length) {\n event.preventDefault();\n const placeholder = segment ? segmentPlaceholder[segment] : DEFAULT_SEGMENT_PLACEHOLDER;\n setEditValue(placeholder);\n setPendingDigit(null);\n\n if (timeValue) {\n const newTime = { ...timeValue };\n switch (segment) {\n case \"hour\":\n delete newTime.hour;\n break;\n case \"minute\":\n delete newTime.minute;\n break;\n case \"second\":\n delete newTime.second;\n break;\n case \"period\":\n delete newTime.period;\n break;\n }\n\n if (\n newTime.hour !== undefined ||\n newTime.minute !== undefined ||\n newTime.second !== undefined ||\n newTime.period !== undefined\n ) {\n const newValue = formatTimeValue(newTime, showSeconds);\n store.setState(\"value\", newValue);\n } else {\n store.setState(\"value\", \"\");\n }\n } else {\n store.setState(\"value\", \"\");\n }\n\n queueMicrotask(() => {\n inputRef.current?.select();\n });\n return;\n }\n }\n\n if (segment === \"period\") {\n const newPeriodFromKey = getPeriodFromKey(event.key, labels);\n if (newPeriodFromKey) {\n event.preventDefault();\n setEditValue(newPeriodFromKey);\n updateTimeValue(newPeriodFromKey, true);\n queueMicrotask(() => {\n inputRef.current?.select();\n });\n } else if (event.key === \"ArrowUp\" || event.key === \"ArrowDown\") {\n event.preventDefault();\n const placeholder = segmentPlaceholder.period;\n const currentPeriod = editValue === placeholder || editValue === \"\" ? \"AM\" : editValue;\n const newPeriod = currentPeriod === \"AM\" || currentPeriod === \"A\" ? \"PM\" : \"AM\";\n setEditValue(newPeriod);\n updateTimeValue(newPeriod, true);\n queueMicrotask(() => {\n inputRef.current?.select();\n });\n }\n return;\n }\n\n if (event.key === \"Tab\") {\n const placeholder = segment ? segmentPlaceholder[segment] : DEFAULT_SEGMENT_PLACEHOLDER;\n if (editValue && editValue.length > 0 && editValue !== placeholder) {\n if (editValue.length === 2) {\n updateTimeValue(editValue, true);\n } else if (editValue.length === 1) {\n const numValue = Number.parseInt(editValue, 10);\n if (!Number.isNaN(numValue)) {\n const paddedValue = numValue.toString().padStart(2, \"0\");\n updateTimeValue(paddedValue, true);\n }\n }\n }\n return;\n }\n\n if (event.key === \"Enter\") {\n event.preventDefault();\n const placeholder = segment ? segmentPlaceholder[segment] : DEFAULT_SEGMENT_PLACEHOLDER;\n if (editValue && editValue.length > 0 && editValue !== placeholder) {\n if (editValue.length === 2) {\n updateTimeValue(editValue, true);\n } else if (editValue.length === 1) {\n const numValue = Number.parseInt(editValue, 10);\n if (!Number.isNaN(numValue)) {\n const paddedValue = numValue.toString().padStart(2, \"0\");\n updateTimeValue(paddedValue, true);\n }\n }\n }\n queueMicrotask(() => {\n inputRef.current?.select();\n });\n }\n\n if (event.key === \"Escape\") {\n event.preventDefault();\n setEditValue(getSegmentValue());\n inputRef.current?.blur();\n }\n\n if (event.key === \"ArrowUp\") {\n event.preventDefault();\n const placeholder = segment ? segmentPlaceholder[segment] : DEFAULT_SEGMENT_PLACEHOLDER;\n if (editValue === placeholder || editValue === \"\") {\n const defaultValue = segment === \"hour\" ? (is12Hour ? 12 : 0) : 0;\n const formattedValue = defaultValue.toString().padStart(2, \"0\");\n setEditValue(formattedValue);\n updateTimeValue(formattedValue, true);\n queueMicrotask(() => {\n inputRef.current?.select();\n });\n return;\n }\n const currentValue = Number.parseInt(editValue, 10);\n if (!Number.isNaN(currentValue)) {\n let newValue: number;\n switch (segment) {\n case \"hour\":\n if (is12Hour) {\n newValue = currentValue === 12 ? 1 : currentValue + 1;\n } else {\n newValue = currentValue === 23 ? 0 : currentValue + 1;\n }\n break;\n case \"minute\":\n case \"second\":\n newValue = currentValue === 59 ? 0 : currentValue + 1;\n break;\n default:\n return;\n }\n const formattedValue = newValue.toString().padStart(2, \"0\");\n setEditValue(formattedValue);\n updateTimeValue(formattedValue, true);\n queueMicrotask(() => {\n inputRef.current?.select();\n });\n }\n }\n\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n const placeholder = segment ? segmentPlaceholder[segment] : DEFAULT_SEGMENT_PLACEHOLDER;\n if (editValue === placeholder || editValue === \"\") {\n const defaultValue = segment === \"hour\" ? (is12Hour ? 12 : 23) : 59;\n const formattedValue = defaultValue.toString().padStart(2, \"0\");\n setEditValue(formattedValue);\n updateTimeValue(formattedValue, true);\n queueMicrotask(() => {\n inputRef.current?.select();\n });\n return;\n }\n const currentValue = Number.parseInt(editValue, 10);\n if (!Number.isNaN(currentValue)) {\n let newValue: number;\n switch (segment) {\n case \"hour\":\n if (is12Hour) {\n newValue = currentValue === 1 ? 12 : currentValue - 1;\n } else {\n newValue = currentValue === 0 ? 23 : currentValue - 1;\n }\n break;\n case \"minute\":\n case \"second\":\n newValue = currentValue === 0 ? 59 : currentValue - 1;\n break;\n default:\n return;\n }\n const formattedValue = newValue.toString().padStart(2, \"0\");\n setEditValue(formattedValue);\n updateTimeValue(formattedValue, true);\n queueMicrotask(() => {\n inputRef.current?.select();\n });\n }\n }\n },\n [\n onKeyDownProp,\n editValue,\n segment,\n is12Hour,\n getSegmentValue,\n updateTimeValue,\n showSeconds,\n timeValue,\n store,\n segmentPlaceholder,\n labels\n ]\n );\n\n /*\n * ⚠ Khác thượng nguồn: ở đồng hồ 24 giờ bản gốc VẪN vẽ ô buổi (in \"PM\" cạnh \"14:30\"), và gõ `A`\n * vào đó biến 14:30 thành 02:30 — trong khi cột `TimePickerPeriod` của chính nó tự ẩn ở chế độ\n * này. Mọi demo thượng nguồn đều đặt sẵn `<TimePickerInput segment=\"period\" />`, và tiếng Việt\n * (cũng như `en-GB`) chạy 24 giờ, nên ô buổi ẩn theo cùng luật với cột. Đặt SAU mọi hook.\n */\n if (segment === \"period\" && !is12Hour) return null;\n\n const displayValue = isEditing ? editValue : getSegmentValue();\n\n const segmentWidth = segment ? `var(--time-picker-${segment}-input-width)` : \"2ch\";\n\n return (\n <input\n type=\"text\"\n inputMode={segment === \"period\" ? \"text\" : \"numeric\"}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n spellCheck={false}\n translate=\"no\"\n /*\n * ⚠ Khác thượng nguồn: bản gốc không đặt tên cho ô nào — trình đọc màn hình đọc bốn ô\n * \"sửa văn bản, 14\" liền nhau mà không biết ô nào là giờ, ô nào là phút. Tên lấy từ\n * `labels` (namespace `timePicker`: \"Hour\"/\"Minute\"/\"Second\"/\"AM/PM\" ở tiếng Anh); `aria-label`\n * của app vẫn đè được.\n * `aria-invalid` cũng vậy: bản gốc chỉ tô viền đỏ (`data-invalid`) mà không báo cho AT.\n */\n aria-label={labels[segment]}\n aria-invalid={invalid || undefined}\n {...inputProps}\n disabled={isDisabled}\n readOnly={isReadOnly}\n className={cn(\n \"inline-flex h-full items-center justify-center border-0 bg-transparent text-center text-sm tabular-nums transition-colors outline-none focus:bg-transparent disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n style={{ width: segmentWidth, ...style }}\n ref={composedRef}\n value={segment === \"period\" ? getPeriodLabel(displayValue, labels) : displayValue}\n onBlur={onBlur}\n onChange={onChange}\n onClick={onClick}\n onFocus={onFocus}\n onKeyDown={onKeyDown}\n />\n );\n}\n\ntype TimePickerTriggerProps = ButtonProps;\n\nfunction TimePickerTrigger(props: TimePickerTriggerProps) {\n const { className, children, disabled: disabledProp, ref, ...triggerProps } = props;\n\n const { triggerId, disabled, labels, triggerRef } = useTimePickerContext(TRIGGER_NAME);\n\n const isDisabled = disabledProp || disabled;\n\n const composedRef = useComposedRefs(ref, triggerRef);\n\n return (\n <PopoverTrigger\n type=\"button\"\n id={triggerId}\n data-slot=\"time-picker-trigger\"\n disabled={isDisabled}\n ref={composedRef}\n {...triggerProps}\n className={cn(\n // ⚠ Khác thượng nguồn: thêm viền focus theo khuôn `Button` của gói — bản gốc không có kiểu\n // focus nào, và viền mặc định của trình duyệt bị lớp nền `outline-ring/50` pha còn gold 50%.\n \"ml-auto flex items-center rounded-sm text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-2 disabled:pointer-events-none [&>svg:not([class*='size-'])]:size-4\",\n className\n )}\n >\n {/*\n * ⚠ Khác thượng nguồn: nút mặc định chỉ có icon đồng hồ nên là một nút KHÔNG TÊN. Tên đi qua\n * `sr-only` (cùng khuôn nút mở lịch của `DatePicker`), không qua `aria-label`, để khi app\n * truyền `children` có chữ thì chữ đó là tên — không bị một nhãn ẩn đè lên.\n */}\n {children ?? (\n <>\n <Clock aria-hidden=\"true\" />\n <span className=\"sr-only\">{labels.openPicker}</span>\n </>\n )}\n </PopoverTrigger>\n );\n}\n\ninterface TimePickerGroupContextValue {\n getColumns: () => ColumnData[];\n onColumnRegister: (column: ColumnData) => void;\n onColumnUnregister: (id: string) => void;\n}\n\nconst TimePickerGroupContext = React.createContext<TimePickerGroupContextValue | null>(null);\n\nfunction useTimePickerGroupContext(consumerName: string) {\n const context = React.useContext(TimePickerGroupContext);\n if (!context) {\n // Bản gốc báo `TimePicker`; thứ thật sự cung cấp context này là `TimePickerContent`.\n throw new Error(`\\`${consumerName}\\` phải nằm bên trong \\`${CONTENT_NAME}\\``);\n }\n return context;\n}\n\ninterface TimePickerContentProps extends DivProps, React.ComponentProps<typeof PopoverContent> {}\n\nfunction TimePickerContent(props: TimePickerContentProps) {\n const {\n side = \"bottom\",\n align = \"start\",\n sideOffset = 6,\n className,\n onOpenAutoFocus: onOpenAutoFocusProp,\n onInteractOutside: onInteractOutsideProp,\n ...contentProps\n } = props;\n\n const store = useStoreContext(CONTENT_NAME);\n const { openOnFocus, inputGroupRef } = useTimePickerContext(CONTENT_NAME);\n const columnsRef = React.useRef<Map<string, Omit<ColumnData, \"id\">>>(new Map());\n\n const onColumnRegister = React.useCallback((column: ColumnData) => {\n columnsRef.current.set(column.id, column);\n }, []);\n\n const onColumnUnregister = React.useCallback((id: string) => {\n columnsRef.current.delete(id);\n }, []);\n\n const getColumns = React.useCallback(() => {\n const columns = Array.from(columnsRef.current.entries())\n .map(([id, { ref, getSelectedItemRef, getItems }]) => ({\n id,\n ref,\n getSelectedItemRef,\n getItems\n }))\n .filter((c) => c.ref.current !== null);\n return sortNodes(columns);\n }, []);\n\n const groupContextValue = React.useMemo<TimePickerGroupContextValue>(\n () => ({\n getColumns,\n onColumnRegister,\n onColumnUnregister\n }),\n [getColumns, onColumnRegister, onColumnUnregister]\n );\n\n const onOpenAutoFocus: NonNullable<PopoverContentProps[\"onOpenAutoFocus\"]> = React.useCallback(\n (event) => {\n onOpenAutoFocusProp?.(event);\n if (event.defaultPrevented) return;\n\n event.preventDefault();\n\n const { openedViaFocus } = store.getState();\n\n // Mở vì ô nhập được focus (`openOnFocus`) → để focus yên ở ô nhập.\n if (openedViaFocus) {\n store.setState(\"openedViaFocus\", false);\n return;\n }\n\n const columns = getColumns();\n const firstColumn = columns[0];\n\n if (!firstColumn) return;\n\n const items = firstColumn.getItems();\n const selectedItem = items.find((item) => item.selected);\n\n const candidateRefs = selectedItem\n ? [selectedItem.ref, ...items.map((item) => item.ref)]\n : items.map((item) => item.ref);\n\n focusFirst(candidateRefs, false);\n },\n [onOpenAutoFocusProp, getColumns, store]\n );\n\n const onInteractOutside: NonNullable<PopoverContentProps[\"onInteractOutside\"]> = React.useCallback(\n (event) => {\n onInteractOutsideProp?.(event);\n if (event.defaultPrevented) return;\n\n // `openOnFocus`: bấm vào nhóm ô không được tính là \"bấm ra ngoài\" rồi đóng bảng chọn.\n if (openOnFocus && inputGroupRef.current) {\n const target = event.target;\n if (!(target instanceof Node)) return;\n const isInsideInputGroup = inputGroupRef.current.contains(target);\n\n if (isInsideInputGroup) {\n event.preventDefault();\n }\n }\n },\n [onInteractOutsideProp, openOnFocus, inputGroupRef]\n );\n\n return (\n <TimePickerGroupContext.Provider value={groupContextValue}>\n <PopoverContent\n data-slot=\"time-picker-content\"\n side={side}\n align={align}\n sideOffset={sideOffset}\n {...contentProps}\n className={cn(\"flex w-auto max-w-(--radix-popover-trigger-width) p-0\", className)}\n onOpenAutoFocus={onOpenAutoFocus}\n onInteractOutside={onInteractOutside}\n />\n </TimePickerGroupContext.Provider>\n );\n}\n\ninterface TimePickerColumnContextValue {\n getItems: () => ItemData[];\n onItemRegister: (value: number | string, ref: React.RefObject<ColumnItemElement | null>, selected: boolean) => void;\n onItemUnregister: (value: number | string) => void;\n}\n\nconst TimePickerColumnContext = React.createContext<TimePickerColumnContextValue | null>(null);\n\nfunction useTimePickerColumnContext(consumerName: string) {\n const context = React.useContext(TimePickerColumnContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` phải nằm bên trong một cột (\\`${COLUMN_NAME}\\`)`);\n }\n return context;\n}\n\ninterface TimePickerColumnProps extends DivProps {}\n\nfunction TimePickerColumn(props: TimePickerColumnProps) {\n const { children, className, ref, ...columnProps } = props;\n\n const columnId = React.useId();\n const columnRef = React.useRef<ColumnElement | null>(null);\n const composedRef = useComposedRefs(ref, columnRef);\n\n const itemsRef = React.useRef<\n Map<\n number | string,\n {\n ref: React.RefObject<ColumnItemElement | null>;\n selected: boolean;\n }\n >\n >(new Map());\n\n const groupContext = useTimePickerGroupContext(COLUMN_NAME);\n\n const onItemRegister = React.useCallback(\n (value: number | string, ref: React.RefObject<HTMLButtonElement | null>, selected: boolean) => {\n itemsRef.current.set(value, { ref, selected });\n },\n []\n );\n\n const onItemUnregister = React.useCallback((value: number | string) => {\n itemsRef.current.delete(value);\n }, []);\n\n const getItems = React.useCallback(() => {\n const items = Array.from(itemsRef.current.entries())\n .map(([value, { ref, selected }]) => ({\n value,\n ref,\n selected\n }))\n .filter((item) => item.ref.current);\n return sortNodes(items);\n }, []);\n\n const getSelectedItemRef = React.useCallback(() => {\n const items = getItems();\n return items.find((item) => item.selected)?.ref ?? null;\n }, [getItems]);\n\n useIsomorphicLayoutEffect(() => {\n groupContext.onColumnRegister({\n id: columnId,\n ref: columnRef,\n getSelectedItemRef,\n getItems\n });\n return () => groupContext.onColumnUnregister(columnId);\n }, [groupContext, columnId, getSelectedItemRef, getItems]);\n\n const columnContextValue = React.useMemo<TimePickerColumnContextValue>(\n () => ({\n getItems,\n onItemRegister,\n onItemUnregister\n }),\n [getItems, onItemRegister, onItemUnregister]\n );\n\n return (\n <TimePickerColumnContext.Provider value={columnContextValue}>\n {/*\n * ⚠ Khác thượng nguồn: bản gốc là một `div` trần chứa các `button` trần — trình đọc màn hình\n * đọc \"14, nút\" mà không biết đó là cột GIỜ hay PHÚT, cũng không biết mục nào ĐANG CHỌN.\n * Cột là `listbox` (tên do `TimePickerHour`/`…Minute`/`…` truyền xuống), mục là `option`\n * có `aria-selected` — đúng với hành vi sẵn có: mũi tên lên/xuống vừa di focus vừa chọn.\n */}\n <div\n role=\"listbox\"\n ref={composedRef}\n data-slot=\"time-picker-column\"\n {...columnProps}\n className={cn(\"flex flex-col gap-1 p-1 not-last:border-r\", className)}\n >\n {children}\n </div>\n </TimePickerColumnContext.Provider>\n );\n}\n\ninterface TimePickerColumnItemProps extends ButtonProps {\n value: number | string;\n selected?: boolean;\n format?: SegmentFormat;\n}\n\nfunction TimePickerColumnItem(props: TimePickerColumnItemProps) {\n const { value, selected = false, format = \"numeric\", className, children, ref, ...itemProps } = props;\n\n const itemRef = React.useRef<ColumnItemElement | null>(null);\n const composedRef = useComposedRefs(ref, itemRef);\n const columnContext = useTimePickerColumnContext(COLUMN_ITEM_NAME);\n const groupContext = useTimePickerGroupContext(COLUMN_ITEM_NAME);\n\n useIsomorphicLayoutEffect(() => {\n columnContext.onItemRegister(value, itemRef, selected);\n return () => columnContext.onItemUnregister(value);\n }, [columnContext, value, selected]);\n\n useIsomorphicLayoutEffect(() => {\n if (selected && itemRef.current) {\n itemRef.current.scrollIntoView({ block: \"nearest\" });\n }\n }, [selected]);\n\n const onClick = React.useCallback(\n (event: React.MouseEvent<ColumnItemElement>) => {\n itemProps.onClick?.(event);\n if (event.defaultPrevented) return;\n\n itemRef.current?.focus();\n },\n [itemProps.onClick]\n );\n\n const onKeyDown = React.useCallback(\n (event: React.KeyboardEvent<ColumnItemElement>) => {\n itemProps.onKeyDown?.(event);\n if (event.defaultPrevented) return;\n\n if (event.key === \"ArrowUp\" || event.key === \"ArrowDown\") {\n event.preventDefault();\n const items = columnContext.getItems().sort((a, b) => {\n if (typeof a.value === \"number\" && typeof b.value === \"number\") {\n return a.value - b.value;\n }\n return 0;\n });\n const currentIndex = items.findIndex((item) => item.value === value);\n\n let nextIndex: number;\n if (event.key === \"ArrowUp\") {\n nextIndex = currentIndex > 0 ? currentIndex - 1 : items.length - 1;\n } else {\n nextIndex = currentIndex < items.length - 1 ? currentIndex + 1 : 0;\n }\n\n const nextItem = items[nextIndex];\n nextItem?.ref.current?.focus();\n nextItem?.ref.current?.click();\n } else if ((event.key === \"Tab\" || event.key === \"ArrowLeft\" || event.key === \"ArrowRight\") && groupContext) {\n event.preventDefault();\n\n queueMicrotask(() => {\n const columns = groupContext.getColumns();\n\n if (columns.length === 0) return;\n\n const currentColumnIndex = columns.findIndex((c) => c.ref.current?.contains(itemRef.current) ?? false);\n\n if (currentColumnIndex === -1) return;\n\n const goToPrevious = event.key === \"ArrowLeft\" || (event.key === \"Tab\" && event.shiftKey);\n\n const nextColumnIndex = goToPrevious\n ? currentColumnIndex > 0\n ? currentColumnIndex - 1\n : columns.length - 1\n : currentColumnIndex < columns.length - 1\n ? currentColumnIndex + 1\n : 0;\n\n const nextColumn = columns[nextColumnIndex];\n if (nextColumn?.ref.current) {\n const items = nextColumn.getItems();\n const selectedItem = items.find((item) => item.selected);\n\n const candidateRefs = selectedItem\n ? [selectedItem.ref, ...items.map((item) => item.ref)]\n : items.map((item) => item.ref);\n\n focusFirst(candidateRefs, false);\n }\n });\n }\n },\n [itemProps.onKeyDown, columnContext, groupContext, value]\n );\n\n const formattedValue =\n typeof value === \"number\" && format === \"2-digit\" ? value.toString().padStart(2, \"0\") : value.toString();\n\n return (\n <button\n type=\"button\"\n // Xem chú thích ở `TimePickerColumn`: mục là `option`, trạng thái chọn đi qua `aria-selected`.\n role=\"option\"\n aria-selected={selected}\n {...itemProps}\n ref={composedRef}\n data-selected={selected ? \"\" : undefined}\n className={cn(\n /*\n * ⚠ Khác thượng nguồn: focus đi theo khuôn `Checkbox`/`Calendar` của gói (`focus-visible`,\n * có offset — mục đang chọn tô nền vàng, quầng vàng dính sát nền vàng thì không thấy);\n * mục đang chọn dùng cặp token của control BẬT `--control-on` / `--control-check` thay\n * `bg-primary text-primary-foreground` — cùng lý do và số đo với ô ngày đang chọn của\n * `Calendar` (chú thích đầu `calendar.tsx`). Hover chỉ áp cho mục CHƯA chọn\n * (`not-data-selected:`) thay vì để `data-selected:hover:` ghi đè lại: cùng kết quả trên\n * màn hình, nhưng cách cũ khiến `pnpm lint:a11y` ghép chữ hover `--accent-foreground`\n * với nền mục đang chọn (1,39:1 ở dark) — một cặp không bao giờ xuất hiện.\n */\n \"w-full rounded px-3 py-1.5 text-left text-sm not-data-selected:hover:bg-accent not-data-selected:hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/50 focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n \"data-selected:bg-control-on data-selected:text-control-check\",\n className\n )}\n onClick={onClick}\n onKeyDown={onKeyDown}\n >\n {/* ⚠ Khác thượng nguồn: nhận `children` (cột buổi in `labels.am`/`labels.pm` thay mã \"AM\"/\"PM\"). */}\n {children ?? formattedValue}\n </button>\n );\n}\n\ninterface TimePickerHourProps extends DivProps {\n format?: SegmentFormat;\n}\n\nfunction TimePickerHour(props: TimePickerHourProps) {\n const { asChild, format = \"numeric\", className, ...hourProps } = props;\n\n const { is12Hour, hourStep, showSeconds, disabled, readOnly, labels } = useTimePickerContext(HOUR_NAME);\n const store = useStoreContext(HOUR_NAME);\n\n const value = useStore((state) => state.value);\n const timeValue = parseTimeString(value);\n\n const hours = Array.from(\n {\n length: is12Hour ? Math.ceil(12 / hourStep) : Math.ceil(24 / hourStep)\n },\n (_, i) => {\n if (is12Hour) {\n const hour = (i * hourStep) % 12;\n return hour === 0 ? 12 : hour;\n }\n return i * hourStep;\n }\n );\n\n const onHourSelect = React.useCallback(\n (displayHour: number) => {\n /*\n * ⚠ Khác thượng nguồn: bản gốc cho cột đổi giá trị cả khi `readOnly`/`disabled` — bảng chọn\n * vẫn mở được (nút mở chỉ khoá theo `disabled`, `openOnFocus` không xét gì), nên một ô\n * \"chỉ đọc\" vẫn sửa được bằng chuột. `TimePickerClear` của chính nó đã chặn đúng hai cờ\n * này; bốn cột nay chặn theo cùng luật.\n */\n if (disabled || readOnly) return;\n\n const now = new Date();\n const currentTime = timeValue ?? {};\n\n let hour24 = displayHour;\n if (is12Hour) {\n let currentPeriod: Period;\n if (timeValue?.period !== undefined) {\n currentPeriod = timeValue.period;\n } else if (timeValue?.hour !== undefined) {\n currentPeriod = to12Hour(timeValue.hour).period;\n } else {\n currentPeriod = to12Hour(now.getHours()).period;\n }\n hour24 = to24Hour(displayHour, currentPeriod);\n }\n\n const newTime = { ...currentTime, hour: hour24 };\n if (timeValue && timeValue.period !== undefined) {\n newTime.period = timeValue.period;\n }\n\n if (newTime.minute === undefined) {\n newTime.minute = now.getMinutes();\n }\n\n if (showSeconds && newTime.second === undefined) {\n newTime.second = now.getSeconds();\n }\n\n const newValue = formatTimeValue(newTime, showSeconds);\n store.setState(\"value\", newValue);\n },\n [timeValue, showSeconds, is12Hour, disabled, readOnly, store]\n );\n\n const now = new Date();\n const referenceHour = timeValue?.hour ?? now.getHours();\n const displayHour = is12Hour ? to12Hour(referenceHour).hour : referenceHour;\n\n const HourPrimitive = asChild ? Slot : TimePickerColumn;\n\n return (\n <HourPrimitive\n data-slot=\"time-picker-hour\"\n aria-label={labels.hour}\n {...hourProps}\n className={cn(\"scrollbar-none flex max-h-[200px] flex-col gap-1 overflow-y-auto p-1\", className)}\n >\n {hours.map((hour) => (\n <TimePickerColumnItem\n key={hour}\n value={hour}\n selected={displayHour === hour}\n format={format}\n onClick={() => onHourSelect(hour)}\n />\n ))}\n </HourPrimitive>\n );\n}\n\ninterface TimePickerMinuteProps extends DivProps {\n format?: SegmentFormat;\n}\n\nfunction TimePickerMinute(props: TimePickerMinuteProps) {\n const { asChild, format = \"2-digit\", className, ...minuteProps } = props;\n\n const { minuteStep, showSeconds, disabled, readOnly, labels } = useTimePickerContext(MINUTE_NAME);\n const store = useStoreContext(MINUTE_NAME);\n\n const value = useStore((state) => state.value);\n const timeValue = parseTimeString(value);\n\n const minutes = Array.from({ length: Math.ceil(60 / minuteStep) }, (_, i) => i * minuteStep);\n\n const onMinuteSelect = React.useCallback(\n (minute: number) => {\n // Chặn `readOnly`/`disabled` — xem `TimePickerHour`.\n if (disabled || readOnly) return;\n\n const now = new Date();\n const currentTime = timeValue ?? {};\n const newTime = { ...currentTime, minute };\n\n if (newTime.hour === undefined) {\n newTime.hour = now.getHours();\n }\n\n if (showSeconds && newTime.second === undefined) {\n newTime.second = now.getSeconds();\n }\n\n const newValue = formatTimeValue(newTime, showSeconds);\n store.setState(\"value\", newValue);\n },\n [timeValue, showSeconds, disabled, readOnly, store]\n );\n\n const MinutePrimitive = asChild ? Slot : TimePickerColumn;\n\n const now = new Date();\n const referenceMinute = timeValue?.minute ?? now.getMinutes();\n\n return (\n <MinutePrimitive\n data-slot=\"time-picker-minute\"\n aria-label={labels.minute}\n {...minuteProps}\n className={cn(\"scrollbar-none flex max-h-[200px] flex-col gap-1 overflow-y-auto p-1\", className)}\n >\n {minutes.map((minute) => (\n <TimePickerColumnItem\n key={minute}\n value={minute}\n selected={referenceMinute === minute}\n format={format}\n onClick={() => onMinuteSelect(minute)}\n />\n ))}\n </MinutePrimitive>\n );\n}\n\ninterface TimePickerSecondProps extends DivProps {\n format?: SegmentFormat;\n}\n\nfunction TimePickerSecond(props: TimePickerSecondProps) {\n const { asChild, format = \"2-digit\", className, ...secondProps } = props;\n\n const { secondStep, disabled, readOnly, labels } = useTimePickerContext(SECOND_NAME);\n const store = useStoreContext(SECOND_NAME);\n\n const value = useStore((state) => state.value);\n const timeValue = parseTimeString(value);\n\n const seconds = Array.from({ length: Math.ceil(60 / secondStep) }, (_, i) => i * secondStep);\n\n const onSecondSelect = React.useCallback(\n (second: number) => {\n // Chặn `readOnly`/`disabled` — xem `TimePickerHour`.\n if (disabled || readOnly) return;\n\n const now = new Date();\n const currentTime = timeValue ?? {};\n const newTime = { ...currentTime, second };\n\n if (newTime.hour === undefined) {\n newTime.hour = now.getHours();\n }\n\n if (newTime.minute === undefined) {\n newTime.minute = now.getMinutes();\n }\n\n const newValue = formatTimeValue(newTime, true);\n store.setState(\"value\", newValue);\n },\n [timeValue, disabled, readOnly, store]\n );\n\n const SecondPrimitive = asChild ? Slot : TimePickerColumn;\n\n const now = new Date();\n const referenceSecond = timeValue?.second ?? now.getSeconds();\n\n return (\n <SecondPrimitive\n data-slot=\"time-picker-second\"\n aria-label={labels.second}\n {...secondProps}\n className={cn(\"scrollbar-none flex max-h-[200px] flex-col gap-1 overflow-y-auto p-1\", className)}\n >\n {seconds.map((second) => (\n <TimePickerColumnItem\n key={second}\n value={second}\n selected={referenceSecond === second}\n format={format}\n onClick={() => onSecondSelect(second)}\n />\n ))}\n </SecondPrimitive>\n );\n}\n\ntype TimePickerPeriodProps = DivProps;\n\nfunction TimePickerPeriod(props: TimePickerPeriodProps) {\n const { asChild, className, ...periodProps } = props;\n\n const { is12Hour, showSeconds, disabled, readOnly, labels } = useTimePickerContext(PERIOD_NAME);\n const store = useStoreContext(PERIOD_NAME);\n\n const value = useStore((state) => state.value);\n const timeValue = parseTimeString(value);\n\n const onPeriodToggle = React.useCallback(\n (period: Period) => {\n // Chặn `readOnly`/`disabled` — xem `TimePickerHour`.\n if (disabled || readOnly) return;\n\n const now = new Date();\n const currentTime = timeValue ?? {};\n\n const currentHour = currentTime.hour !== undefined ? currentTime.hour : now.getHours();\n const currentDisplay = to12Hour(currentHour);\n const new24Hour = to24Hour(currentDisplay.hour, period);\n\n const newTime = { ...currentTime, hour: new24Hour };\n\n if (newTime.minute === undefined) {\n newTime.minute = now.getMinutes();\n }\n\n if (showSeconds && newTime.second === undefined) {\n newTime.second = now.getSeconds();\n }\n\n const newValue = formatTimeValue(newTime, showSeconds);\n store.setState(\"value\", newValue);\n },\n [timeValue, showSeconds, disabled, readOnly, store]\n );\n\n if (!is12Hour) return null;\n\n const now = new Date();\n const referenceHour = timeValue?.hour ?? now.getHours();\n const currentPeriod = to12Hour(referenceHour).period;\n\n const PeriodPrimitive = asChild ? Slot : TimePickerColumn;\n\n return (\n <PeriodPrimitive\n data-slot=\"time-picker-period\"\n aria-label={labels.period}\n {...periodProps}\n className={cn(\"flex flex-col gap-1 p-1\", className)}\n >\n {PERIODS.map((period) => (\n <TimePickerColumnItem\n key={period}\n value={period}\n selected={currentPeriod === period}\n onClick={() => onPeriodToggle(period)}\n >\n {getPeriodLabel(period, labels)}\n </TimePickerColumnItem>\n ))}\n </PeriodPrimitive>\n );\n}\n\ninterface TimePickerSeparatorProps extends React.ComponentProps<\"span\"> {\n asChild?: boolean;\n}\n\nfunction TimePickerSeparator(props: TimePickerSeparatorProps) {\n const { asChild, children, ...separatorProps } = props;\n\n const SeparatorPrimitive = asChild ? Slot : \"span\";\n\n return (\n <SeparatorPrimitive aria-hidden=\"true\" data-slot=\"time-picker-separator\" {...separatorProps}>\n {children ?? \":\"}\n </SeparatorPrimitive>\n );\n}\n\ntype TimePickerClearProps = ButtonProps;\n\nfunction TimePickerClear(props: TimePickerClearProps) {\n const { asChild, className, children, disabled: disabledProp, ...clearProps } = props;\n\n const { disabled, readOnly, labels } = useTimePickerContext(CLEAR_NAME);\n const store = useStoreContext(CLEAR_NAME);\n\n const isDisabled = disabledProp || disabled;\n\n const onClick = React.useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n clearProps.onClick?.(event);\n if (event.defaultPrevented) return;\n\n event.preventDefault();\n if (disabled || readOnly) return;\n store.setState(\"value\", \"\");\n },\n [clearProps.onClick, disabled, readOnly, store]\n );\n\n const ClearPrimitive = asChild ? Slot : \"button\";\n\n return (\n <ClearPrimitive\n type=\"button\"\n data-slot=\"time-picker-clear\"\n disabled={isDisabled}\n {...clearProps}\n className={cn(\n // Viền focus theo khuôn `Button` — xem `TimePickerTrigger`.\n \"inline-flex items-center justify-center rounded-sm text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n className\n )}\n onClick={onClick}\n >\n {children ?? labels.clear}\n </ClearPrimitive>\n );\n}\n\nexport {\n TimePicker,\n TimePickerClear,\n type TimePickerClearProps,\n TimePickerContent,\n type TimePickerContentProps,\n TimePickerHour,\n type TimePickerHourProps,\n TimePickerInput,\n TimePickerInputGroup,\n type TimePickerInputGroupProps,\n type TimePickerInputProps,\n TimePickerLabel,\n type TimePickerLabelProps,\n TimePickerMinute,\n type TimePickerMinuteProps,\n TimePickerPeriod,\n type TimePickerPeriodProps,\n type TimePickerProps,\n TimePickerSecond,\n type TimePickerSecondProps,\n TimePickerSeparator,\n type TimePickerSeparatorProps,\n TimePickerTrigger,\n type TimePickerTriggerProps,\n useStore as useTimePicker\n};\n"],"mappings":"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","names":["value","ref","displayHour","now"]}
|
|
@@ -6,7 +6,7 @@ import * as React from 'react';
|
|
|
6
6
|
/** Toggle (Radix) — nút bật/tắt hai trạng thái, dùng cho thanh công cụ. */
|
|
7
7
|
declare const toggleVariants: (props?: ({
|
|
8
8
|
variant?: "default" | "outline" | null | undefined;
|
|
9
|
-
size?: "
|
|
9
|
+
size?: "default" | "sm" | "lg" | null | undefined;
|
|
10
10
|
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
11
11
|
type ToggleVariantProps = VariantProps<typeof toggleVariants>;
|
|
12
12
|
type ToggleProps = React.ComponentProps<typeof TogglePrimitive.Root> & ToggleVariantProps;
|
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
* `src/chart/chart-colors.ts`. Barrel xuất module này TRỰC TIẾP; `tour.tsx` chỉ `import`.
|
|
7
7
|
*/
|
|
8
8
|
/**
|
|
9
|
-
* Chuỗi hiển thị và chuỗi a11y của `Tour
|
|
9
|
+
* Chuỗi hiển thị và chuỗi a11y của `Tour`. Theo `ComitorLocaleProvider` (mặc định tiếng Anh, bảng
|
|
10
|
+
* tiếng Việt dựng sẵn); truyền `labels` cho `Tour` để ghi đè từng khoá.
|
|
10
11
|
*
|
|
11
12
|
* ⚠ Thượng nguồn (Dice UI) chôn cứng chuỗi tiếng Anh trong từng nút ("Previous", "Next",
|
|
12
13
|
* "Finish", "Skip", "Close tour") và bộ đếm `1 / 5`. Gói dùng chung cho MỌI app Comitor nên
|
|
@@ -33,7 +34,11 @@ interface TourLabels {
|
|
|
33
34
|
*/
|
|
34
35
|
stepCounter: (current: number, total: number) => string;
|
|
35
36
|
}
|
|
36
|
-
/**
|
|
37
|
+
/**
|
|
38
|
+
* Nhãn TIẾNG ANH mặc định (từ `3.0.0`; trước đó là tiếng Việt). Bảng tiếng Việt:
|
|
39
|
+
* `comitorMessagesVi.tour`. Component không đọc thẳng hằng này — nó đọc bảng của
|
|
40
|
+
* `ComitorLocaleProvider`; hằng ở đây để app trải ra khi tự dựng nhãn.
|
|
41
|
+
*/
|
|
37
42
|
declare const DEFAULT_TOUR_LABELS: TourLabels;
|
|
38
43
|
|
|
39
44
|
export { DEFAULT_TOUR_LABELS, type TourLabels };
|
|
@@ -1,11 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
prev: "Quay l\u1EA1i",
|
|
4
|
-
next: "Ti\u1EBFp theo",
|
|
5
|
-
finish: "Ho\xE0n t\u1EA5t",
|
|
6
|
-
skip: "B\u1ECF qua",
|
|
7
|
-
stepCounter: (current, total) => `B\u01B0\u1EDBc ${current}/${total}`
|
|
8
|
-
};
|
|
1
|
+
import { tourEn } from "../../i18n/namespaces/tour.js";
|
|
2
|
+
const DEFAULT_TOUR_LABELS = { ...tourEn };
|
|
9
3
|
export {
|
|
10
4
|
DEFAULT_TOUR_LABELS
|
|
11
5
|
};
|