@qijenchen/design-system 0.1.0-beta.10
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 +163 -0
- package/dist/components/Accordion/accordion.d.ts +37 -0
- package/dist/components/Accordion/accordion.d.ts.map +1 -0
- package/dist/components/Accordion/accordion.js +78 -0
- package/dist/components/Accordion/accordion.js.map +1 -0
- package/dist/components/Alert/alert.d.ts +47 -0
- package/dist/components/Alert/alert.d.ts.map +1 -0
- package/dist/components/Alert/alert.js +132 -0
- package/dist/components/Alert/alert.js.map +1 -0
- package/dist/components/AppShell/_demo-helpers.d.ts +49 -0
- package/dist/components/AppShell/_demo-helpers.d.ts.map +1 -0
- package/dist/components/AppShell/app-shell.d.ts +76 -0
- package/dist/components/AppShell/app-shell.d.ts.map +1 -0
- package/dist/components/AppShell/app-shell.js +214 -0
- package/dist/components/AppShell/app-shell.js.map +1 -0
- package/dist/components/AspectRatio/aspect-ratio.d.ts +40 -0
- package/dist/components/AspectRatio/aspect-ratio.d.ts.map +1 -0
- package/dist/components/AspectRatio/aspect-ratio.js +23 -0
- package/dist/components/AspectRatio/aspect-ratio.js.map +1 -0
- package/dist/components/Avatar/avatar.d.ts +85 -0
- package/dist/components/Avatar/avatar.d.ts.map +1 -0
- package/dist/components/Avatar/avatar.js +195 -0
- package/dist/components/Avatar/avatar.js.map +1 -0
- package/dist/components/Badge/badge.d.ts +43 -0
- package/dist/components/Badge/badge.d.ts.map +1 -0
- package/dist/components/Badge/badge.js +69 -0
- package/dist/components/Badge/badge.js.map +1 -0
- package/dist/components/Breadcrumb/breadcrumb.d.ts +163 -0
- package/dist/components/Breadcrumb/breadcrumb.d.ts.map +1 -0
- package/dist/components/Breadcrumb/breadcrumb.js +300 -0
- package/dist/components/Breadcrumb/breadcrumb.js.map +1 -0
- package/dist/components/BulkActionBar/bulk-action-bar.d.ts +46 -0
- package/dist/components/BulkActionBar/bulk-action-bar.d.ts.map +1 -0
- package/dist/components/BulkActionBar/bulk-action-bar.js +78 -0
- package/dist/components/BulkActionBar/bulk-action-bar.js.map +1 -0
- package/dist/components/Button/button-group.d.ts +49 -0
- package/dist/components/Button/button-group.d.ts.map +1 -0
- package/dist/components/Button/button-group.js +46 -0
- package/dist/components/Button/button-group.js.map +1 -0
- package/dist/components/Button/button.d.ts +203 -0
- package/dist/components/Button/button.d.ts.map +1 -0
- package/dist/components/Button/button.js +309 -0
- package/dist/components/Button/button.js.map +1 -0
- package/dist/components/Calendar/calendar.d.ts +81 -0
- package/dist/components/Calendar/calendar.d.ts.map +1 -0
- package/dist/components/Calendar/calendar.js +282 -0
- package/dist/components/Calendar/calendar.js.map +1 -0
- package/dist/components/Carousel/carousel.d.ts +61 -0
- package/dist/components/Carousel/carousel.d.ts.map +1 -0
- package/dist/components/Carousel/carousel.js +276 -0
- package/dist/components/Carousel/carousel.js.map +1 -0
- package/dist/components/Chart/chart.d.ts +94 -0
- package/dist/components/Chart/chart.d.ts.map +1 -0
- package/dist/components/Chart/chart.js +233 -0
- package/dist/components/Chart/chart.js.map +1 -0
- package/dist/components/Checkbox/checkbox-group.d.ts +58 -0
- package/dist/components/Checkbox/checkbox-group.d.ts.map +1 -0
- package/dist/components/Checkbox/checkbox-group.js +28 -0
- package/dist/components/Checkbox/checkbox-group.js.map +1 -0
- package/dist/components/Checkbox/checkbox.d.ts +73 -0
- package/dist/components/Checkbox/checkbox.d.ts.map +1 -0
- package/dist/components/Checkbox/checkbox.js +125 -0
- package/dist/components/Checkbox/checkbox.js.map +1 -0
- package/dist/components/Chip/chip.d.ts +54 -0
- package/dist/components/Chip/chip.d.ts.map +1 -0
- package/dist/components/Chip/chip.js +224 -0
- package/dist/components/Chip/chip.js.map +1 -0
- package/dist/components/CircularProgress/circular-progress.d.ts +40 -0
- package/dist/components/CircularProgress/circular-progress.d.ts.map +1 -0
- package/dist/components/CircularProgress/circular-progress.js +118 -0
- package/dist/components/CircularProgress/circular-progress.js.map +1 -0
- package/dist/components/Coachmark/coachmark.d.ts +100 -0
- package/dist/components/Coachmark/coachmark.d.ts.map +1 -0
- package/dist/components/Coachmark/coachmark.js +107 -0
- package/dist/components/Coachmark/coachmark.js.map +1 -0
- package/dist/components/Combobox/combobox.d.ts +150 -0
- package/dist/components/Combobox/combobox.d.ts.map +1 -0
- package/dist/components/Combobox/combobox.js +595 -0
- package/dist/components/Combobox/combobox.js.map +1 -0
- package/dist/components/Command/command.d.ts +106 -0
- package/dist/components/Command/command.d.ts.map +1 -0
- package/dist/components/Command/command.js +123 -0
- package/dist/components/Command/command.js.map +1 -0
- package/dist/components/DataTable/active-editor-controller.d.ts +66 -0
- package/dist/components/DataTable/active-editor-controller.d.ts.map +1 -0
- package/dist/components/DataTable/cell-registry.d.ts +37 -0
- package/dist/components/DataTable/cell-registry.d.ts.map +1 -0
- package/dist/components/DataTable/cell-registry.js +377 -0
- package/dist/components/DataTable/cell-registry.js.map +1 -0
- package/dist/components/DataTable/column-types.d.ts +145 -0
- package/dist/components/DataTable/column-types.d.ts.map +1 -0
- package/dist/components/DataTable/column-types.js +17 -0
- package/dist/components/DataTable/column-types.js.map +1 -0
- package/dist/components/DataTable/data-table-column-visibility-panel.d.ts +49 -0
- package/dist/components/DataTable/data-table-column-visibility-panel.d.ts.map +1 -0
- package/dist/components/DataTable/data-table-filter-panel.d.ts +30 -0
- package/dist/components/DataTable/data-table-filter-panel.d.ts.map +1 -0
- package/dist/components/DataTable/data-table-interaction-layer.d.ts +78 -0
- package/dist/components/DataTable/data-table-interaction-layer.d.ts.map +1 -0
- package/dist/components/DataTable/data-table-interaction-layer.js +220 -0
- package/dist/components/DataTable/data-table-interaction-layer.js.map +1 -0
- package/dist/components/DataTable/data-table-sort-manager.d.ts +19 -0
- package/dist/components/DataTable/data-table-sort-manager.d.ts.map +1 -0
- package/dist/components/DataTable/data-table.d.ts +181 -0
- package/dist/components/DataTable/data-table.d.ts.map +1 -0
- package/dist/components/DataTable/data-table.js +1851 -0
- package/dist/components/DataTable/data-table.js.map +1 -0
- package/dist/components/DataTable/filter-operators.d.ts +116 -0
- package/dist/components/DataTable/filter-operators.d.ts.map +1 -0
- package/dist/components/DataTable/filter-tree.d.ts +66 -0
- package/dist/components/DataTable/filter-tree.d.ts.map +1 -0
- package/dist/components/DataTable/lib/column-meta.d.ts +49 -0
- package/dist/components/DataTable/lib/column-meta.d.ts.map +1 -0
- package/dist/components/DateGrid/date-grid.d.ts +61 -0
- package/dist/components/DateGrid/date-grid.d.ts.map +1 -0
- package/dist/components/DateGrid/date-grid.js +168 -0
- package/dist/components/DateGrid/date-grid.js.map +1 -0
- package/dist/components/DatePicker/date-picker.d.ts +119 -0
- package/dist/components/DatePicker/date-picker.d.ts.map +1 -0
- package/dist/components/DatePicker/date-picker.js +743 -0
- package/dist/components/DatePicker/date-picker.js.map +1 -0
- package/dist/components/DescriptionList/description-list.d.ts +60 -0
- package/dist/components/DescriptionList/description-list.d.ts.map +1 -0
- package/dist/components/DescriptionList/description-list.js +77 -0
- package/dist/components/DescriptionList/description-list.js.map +1 -0
- package/dist/components/Dialog/dialog.d.ts +54 -0
- package/dist/components/Dialog/dialog.d.ts.map +1 -0
- package/dist/components/Dialog/dialog.js +151 -0
- package/dist/components/Dialog/dialog.js.map +1 -0
- package/dist/components/DropdownMenu/dropdown-menu.d.ts +111 -0
- package/dist/components/DropdownMenu/dropdown-menu.d.ts.map +1 -0
- package/dist/components/DropdownMenu/dropdown-menu.js +288 -0
- package/dist/components/DropdownMenu/dropdown-menu.js.map +1 -0
- package/dist/components/Empty/empty.d.ts +40 -0
- package/dist/components/Empty/empty.d.ts.map +1 -0
- package/dist/components/Empty/empty.js +66 -0
- package/dist/components/Empty/empty.js.map +1 -0
- package/dist/components/Field/field-context.d.ts +77 -0
- package/dist/components/Field/field-context.d.ts.map +1 -0
- package/dist/components/Field/field-context.js +37 -0
- package/dist/components/Field/field-context.js.map +1 -0
- package/dist/components/Field/field-types.d.ts +5 -0
- package/dist/components/Field/field-types.d.ts.map +1 -0
- package/dist/components/Field/field-types.js +13 -0
- package/dist/components/Field/field-types.js.map +1 -0
- package/dist/components/Field/field-wrapper.d.ts +17 -0
- package/dist/components/Field/field-wrapper.d.ts.map +1 -0
- package/dist/components/Field/field-wrapper.js +252 -0
- package/dist/components/Field/field-wrapper.js.map +1 -0
- package/dist/components/Field/field.d.ts +127 -0
- package/dist/components/Field/field.d.ts.map +1 -0
- package/dist/components/Field/field.js +295 -0
- package/dist/components/Field/field.js.map +1 -0
- package/dist/components/FieldControlGroup/field-control-group.d.ts +74 -0
- package/dist/components/FieldControlGroup/field-control-group.d.ts.map +1 -0
- package/dist/components/FieldControlGroup/field-control-group.js +62 -0
- package/dist/components/FieldControlGroup/field-control-group.js.map +1 -0
- package/dist/components/FileItem/file-item.d.ts +44 -0
- package/dist/components/FileItem/file-item.d.ts.map +1 -0
- package/dist/components/FileItem/file-item.js +202 -0
- package/dist/components/FileItem/file-item.js.map +1 -0
- package/dist/components/FileUpload/file-upload.d.ts +97 -0
- package/dist/components/FileUpload/file-upload.d.ts.map +1 -0
- package/dist/components/FileUpload/file-upload.js +231 -0
- package/dist/components/FileUpload/file-upload.js.map +1 -0
- package/dist/components/FileViewer/file-viewer-types.d.ts +73 -0
- package/dist/components/FileViewer/file-viewer-types.d.ts.map +1 -0
- package/dist/components/FileViewer/file-viewer.d.ts +82 -0
- package/dist/components/FileViewer/file-viewer.d.ts.map +1 -0
- package/dist/components/FileViewer/file-viewer.js +752 -0
- package/dist/components/FileViewer/file-viewer.js.map +1 -0
- package/dist/components/FileViewer/image-renderer.d.ts +9 -0
- package/dist/components/FileViewer/image-renderer.d.ts.map +1 -0
- package/dist/components/FileViewer/image-renderer.js +165 -0
- package/dist/components/FileViewer/image-renderer.js.map +1 -0
- package/dist/components/HoverCard/hover-card.d.ts +30 -0
- package/dist/components/HoverCard/hover-card.d.ts.map +1 -0
- package/dist/components/HoverCard/hover-card.js +61 -0
- package/dist/components/HoverCard/hover-card.js.map +1 -0
- package/dist/components/Input/input.d.ts +72 -0
- package/dist/components/Input/input.d.ts.map +1 -0
- package/dist/components/Input/input.js +148 -0
- package/dist/components/Input/input.js.map +1 -0
- package/dist/components/LinkInput/link-input.d.ts +46 -0
- package/dist/components/LinkInput/link-input.d.ts.map +1 -0
- package/dist/components/LinkInput/link-input.js +215 -0
- package/dist/components/LinkInput/link-input.js.map +1 -0
- package/dist/components/Menu/menu-item.d.ts +83 -0
- package/dist/components/Menu/menu-item.d.ts.map +1 -0
- package/dist/components/Menu/menu-item.js +209 -0
- package/dist/components/Menu/menu-item.js.map +1 -0
- package/dist/components/NameCard/name-card.d.ts +85 -0
- package/dist/components/NameCard/name-card.d.ts.map +1 -0
- package/dist/components/NameCard/name-card.js +153 -0
- package/dist/components/NameCard/name-card.js.map +1 -0
- package/dist/components/Notice/notice.d.ts +69 -0
- package/dist/components/Notice/notice.d.ts.map +1 -0
- package/dist/components/Notice/notice.js +121 -0
- package/dist/components/Notice/notice.js.map +1 -0
- package/dist/components/NumberInput/number-input.d.ts +57 -0
- package/dist/components/NumberInput/number-input.d.ts.map +1 -0
- package/dist/components/NumberInput/number-input.js +131 -0
- package/dist/components/NumberInput/number-input.js.map +1 -0
- package/dist/components/OverflowIndicator/overflow-indicator.d.ts +23 -0
- package/dist/components/OverflowIndicator/overflow-indicator.d.ts.map +1 -0
- package/dist/components/OverflowIndicator/overflow-indicator.js +111 -0
- package/dist/components/OverflowIndicator/overflow-indicator.js.map +1 -0
- package/dist/components/PeoplePicker/avatar-stack-overflow.d.ts +57 -0
- package/dist/components/PeoplePicker/avatar-stack-overflow.d.ts.map +1 -0
- package/dist/components/PeoplePicker/avatar-stack-overflow.js +35 -0
- package/dist/components/PeoplePicker/avatar-stack-overflow.js.map +1 -0
- package/dist/components/PeoplePicker/people-picker-helpers.d.ts +7 -0
- package/dist/components/PeoplePicker/people-picker-helpers.d.ts.map +1 -0
- package/dist/components/PeoplePicker/people-picker-helpers.js +25 -0
- package/dist/components/PeoplePicker/people-picker-helpers.js.map +1 -0
- package/dist/components/PeoplePicker/people-picker.d.ts +77 -0
- package/dist/components/PeoplePicker/people-picker.d.ts.map +1 -0
- package/dist/components/PeoplePicker/people-picker.js +263 -0
- package/dist/components/PeoplePicker/people-picker.js.map +1 -0
- package/dist/components/PeoplePicker/person-display.d.ts +66 -0
- package/dist/components/PeoplePicker/person-display.d.ts.map +1 -0
- package/dist/components/PeoplePicker/person-display.js +203 -0
- package/dist/components/PeoplePicker/person-display.js.map +1 -0
- package/dist/components/Popover/popover.d.ts +50 -0
- package/dist/components/Popover/popover.d.ts.map +1 -0
- package/dist/components/Popover/popover.js +113 -0
- package/dist/components/Popover/popover.js.map +1 -0
- package/dist/components/ProgressBar/progress-bar.d.ts +37 -0
- package/dist/components/ProgressBar/progress-bar.d.ts.map +1 -0
- package/dist/components/ProgressBar/progress-bar.js +86 -0
- package/dist/components/ProgressBar/progress-bar.js.map +1 -0
- package/dist/components/RadioGroup/radio-group.d.ts +78 -0
- package/dist/components/RadioGroup/radio-group.d.ts.map +1 -0
- package/dist/components/RadioGroup/radio-group.js +153 -0
- package/dist/components/RadioGroup/radio-group.js.map +1 -0
- package/dist/components/Rating/rating.d.ts +46 -0
- package/dist/components/Rating/rating.d.ts.map +1 -0
- package/dist/components/Rating/rating.js +179 -0
- package/dist/components/Rating/rating.js.map +1 -0
- package/dist/components/ScrollArea/scroll-area.d.ts +45 -0
- package/dist/components/ScrollArea/scroll-area.d.ts.map +1 -0
- package/dist/components/ScrollArea/scroll-area.js +65 -0
- package/dist/components/ScrollArea/scroll-area.js.map +1 -0
- package/dist/components/SegmentedControl/segmented-control.d.ts +102 -0
- package/dist/components/SegmentedControl/segmented-control.d.ts.map +1 -0
- package/dist/components/SegmentedControl/segmented-control.js +171 -0
- package/dist/components/SegmentedControl/segmented-control.js.map +1 -0
- package/dist/components/Select/select.d.ts +102 -0
- package/dist/components/Select/select.d.ts.map +1 -0
- package/dist/components/Select/select.js +435 -0
- package/dist/components/Select/select.js.map +1 -0
- package/dist/components/SelectMenu/select-menu.d.ts +103 -0
- package/dist/components/SelectMenu/select-menu.d.ts.map +1 -0
- package/dist/components/SelectMenu/select-menu.js +239 -0
- package/dist/components/SelectMenu/select-menu.js.map +1 -0
- package/dist/components/SelectionControl/selection-item.d.ts +69 -0
- package/dist/components/SelectionControl/selection-item.d.ts.map +1 -0
- package/dist/components/SelectionControl/selection-item.js +142 -0
- package/dist/components/SelectionControl/selection-item.js.map +1 -0
- package/dist/components/Separator/separator.d.ts +17 -0
- package/dist/components/Separator/separator.d.ts.map +1 -0
- package/dist/components/Separator/separator.js +39 -0
- package/dist/components/Separator/separator.js.map +1 -0
- package/dist/components/Sheet/sheet.d.ts +56 -0
- package/dist/components/Sheet/sheet.d.ts.map +1 -0
- package/dist/components/Sheet/sheet.js +145 -0
- package/dist/components/Sheet/sheet.js.map +1 -0
- package/dist/components/Sidebar/sidebar.d.ts +195 -0
- package/dist/components/Sidebar/sidebar.d.ts.map +1 -0
- package/dist/components/Sidebar/sidebar.js +826 -0
- package/dist/components/Sidebar/sidebar.js.map +1 -0
- package/dist/components/Skeleton/skeleton.d.ts +16 -0
- package/dist/components/Skeleton/skeleton.d.ts.map +1 -0
- package/dist/components/Skeleton/skeleton.js +30 -0
- package/dist/components/Skeleton/skeleton.js.map +1 -0
- package/dist/components/Slider/slider.d.ts +48 -0
- package/dist/components/Slider/slider.d.ts.map +1 -0
- package/dist/components/Slider/slider.js +108 -0
- package/dist/components/Slider/slider.js.map +1 -0
- package/dist/components/Steps/steps.d.ts +71 -0
- package/dist/components/Steps/steps.d.ts.map +1 -0
- package/dist/components/Steps/steps.js +583 -0
- package/dist/components/Steps/steps.js.map +1 -0
- package/dist/components/Switch/switch.d.ts +112 -0
- package/dist/components/Switch/switch.d.ts.map +1 -0
- package/dist/components/Switch/switch.js +179 -0
- package/dist/components/Switch/switch.js.map +1 -0
- package/dist/components/Tabs/tabs.d.ts +104 -0
- package/dist/components/Tabs/tabs.d.ts.map +1 -0
- package/dist/components/Tabs/tabs.js +316 -0
- package/dist/components/Tabs/tabs.js.map +1 -0
- package/dist/components/Tag/tag.d.ts +86 -0
- package/dist/components/Tag/tag.d.ts.map +1 -0
- package/dist/components/Tag/tag.js +172 -0
- package/dist/components/Tag/tag.js.map +1 -0
- package/dist/components/Textarea/textarea.d.ts +74 -0
- package/dist/components/Textarea/textarea.d.ts.map +1 -0
- package/dist/components/Textarea/textarea.js +224 -0
- package/dist/components/Textarea/textarea.js.map +1 -0
- package/dist/components/TimePicker/time-columns.d.ts +46 -0
- package/dist/components/TimePicker/time-columns.d.ts.map +1 -0
- package/dist/components/TimePicker/time-columns.js +173 -0
- package/dist/components/TimePicker/time-columns.js.map +1 -0
- package/dist/components/TimePicker/time-picker.d.ts +94 -0
- package/dist/components/TimePicker/time-picker.d.ts.map +1 -0
- package/dist/components/TimePicker/time-picker.js +253 -0
- package/dist/components/TimePicker/time-picker.js.map +1 -0
- package/dist/components/Toast/toast.d.ts +61 -0
- package/dist/components/Toast/toast.d.ts.map +1 -0
- package/dist/components/Toast/toast.js +76 -0
- package/dist/components/Toast/toast.js.map +1 -0
- package/dist/components/Tooltip/tooltip.d.ts +20 -0
- package/dist/components/Tooltip/tooltip.d.ts.map +1 -0
- package/dist/components/Tooltip/tooltip.js +53 -0
- package/dist/components/Tooltip/tooltip.js.map +1 -0
- package/dist/components/TreeView/tree-view.d.ts +166 -0
- package/dist/components/TreeView/tree-view.d.ts.map +1 -0
- package/dist/components/TreeView/tree-view.js +617 -0
- package/dist/components/TreeView/tree-view.js.map +1 -0
- package/dist/hooks/use-controllable.d.ts +16 -0
- package/dist/hooks/use-controllable.d.ts.map +1 -0
- package/dist/hooks/use-controllable.js +26 -0
- package/dist/hooks/use-controllable.js.map +1 -0
- package/dist/hooks/use-is-narrow-viewport.d.ts +2 -0
- package/dist/hooks/use-is-narrow-viewport.d.ts.map +1 -0
- package/dist/hooks/use-is-narrow-viewport.js +19 -0
- package/dist/hooks/use-is-narrow-viewport.js.map +1 -0
- package/dist/hooks/use-is-touch-device.d.ts +8 -0
- package/dist/hooks/use-is-touch-device.d.ts.map +1 -0
- package/dist/hooks/use-is-touch-device.js +16 -0
- package/dist/hooks/use-is-touch-device.js.map +1 -0
- package/dist/hooks/use-overflow-items.d.ts +124 -0
- package/dist/hooks/use-overflow-items.d.ts.map +1 -0
- package/dist/hooks/use-overflow-items.js +97 -0
- package/dist/hooks/use-overflow-items.js.map +1 -0
- package/dist/index.d.ts +74 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +371 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/drag-visual.d.ts +158 -0
- package/dist/lib/drag-visual.d.ts.map +1 -0
- package/dist/lib/drag-visual.js +96 -0
- package/dist/lib/drag-visual.js.map +1 -0
- package/dist/lib/i18n/i18n-context.d.ts +105 -0
- package/dist/lib/i18n/i18n-context.d.ts.map +1 -0
- package/dist/lib/multi-select-ordering.d.ts +54 -0
- package/dist/lib/multi-select-ordering.d.ts.map +1 -0
- package/dist/lib/multi-select-ordering.js +13 -0
- package/dist/lib/multi-select-ordering.js.map +1 -0
- package/dist/lib/utils.d.ts +12 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +79 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/patterns/element-anatomy/item-anatomy.d.ts +370 -0
- package/dist/patterns/element-anatomy/item-anatomy.d.ts.map +1 -0
- package/dist/patterns/element-anatomy/item-anatomy.js +272 -0
- package/dist/patterns/element-anatomy/item-anatomy.js.map +1 -0
- package/dist/patterns/header-canonical/chrome-header.d.ts +80 -0
- package/dist/patterns/header-canonical/chrome-header.d.ts.map +1 -0
- package/dist/patterns/header-canonical/chrome-header.js +75 -0
- package/dist/patterns/header-canonical/chrome-header.js.map +1 -0
- package/dist/patterns/horizontal-overflow/horizontal-overflow.d.ts +101 -0
- package/dist/patterns/horizontal-overflow/horizontal-overflow.d.ts.map +1 -0
- package/dist/patterns/horizontal-overflow/horizontal-overflow.js +105 -0
- package/dist/patterns/horizontal-overflow/horizontal-overflow.js.map +1 -0
- package/dist/patterns/overlay-surface/overlay-surface.d.ts +28 -0
- package/dist/patterns/overlay-surface/overlay-surface.d.ts.map +1 -0
- package/dist/patterns/overlay-surface/overlay-surface.js +85 -0
- package/dist/patterns/overlay-surface/overlay-surface.js.map +1 -0
- package/dist/patterns/resize-handle/resize-handle.d.ts +102 -0
- package/dist/patterns/resize-handle/resize-handle.d.ts.map +1 -0
- package/dist/patterns/resize-handle/resize-handle.js +74 -0
- package/dist/patterns/resize-handle/resize-handle.js.map +1 -0
- package/dist/react-day-picker.css +457 -0
- package/dist/stories-helpers/anatomy/anatomy-utils.d.ts +40 -0
- package/dist/stories-helpers/anatomy/anatomy-utils.d.ts.map +1 -0
- package/dist/tokens/elevation/overlay-geometry.d.ts +12 -0
- package/dist/tokens/elevation/overlay-geometry.d.ts.map +1 -0
- package/dist/tokens/elevation/overlay-geometry.js +7 -0
- package/dist/tokens/elevation/overlay-geometry.js.map +1 -0
- package/dist/tokens/motion/motion.d.ts +15 -0
- package/dist/tokens/motion/motion.d.ts.map +1 -0
- package/dist/tokens/motion/motion.js +9 -0
- package/dist/tokens/motion/motion.js.map +1 -0
- package/dist/tokens/uiSize/icon-size.d.ts +53 -0
- package/dist/tokens/uiSize/icon-size.d.ts.map +1 -0
- package/package.json +92 -0
- package/src/README.md +32 -0
- package/src/components/Accordion/accordion.tsx +104 -0
- package/src/components/Alert/alert.tsx +188 -0
- package/src/components/AppShell/_demo-helpers.tsx +198 -0
- package/src/components/AppShell/app-shell.tsx +364 -0
- package/src/components/AspectRatio/aspect-ratio.tsx +58 -0
- package/src/components/Avatar/avatar.tsx +368 -0
- package/src/components/Badge/badge.tsx +104 -0
- package/src/components/Breadcrumb/breadcrumb.tsx +619 -0
- package/src/components/BulkActionBar/bulk-action-bar.tsx +156 -0
- package/src/components/Button/button-group.tsx +96 -0
- package/src/components/Button/button.tsx +539 -0
- package/src/components/Calendar/calendar.tsx +411 -0
- package/src/components/Carousel/carousel.tsx +371 -0
- package/src/components/Chart/chart.tsx +376 -0
- package/src/components/Checkbox/checkbox-group.tsx +94 -0
- package/src/components/Checkbox/checkbox.tsx +237 -0
- package/src/components/Chip/chip.tsx +359 -0
- package/src/components/CircularProgress/circular-progress.tsx +204 -0
- package/src/components/Coachmark/coachmark.tsx +255 -0
- package/src/components/Combobox/combobox.tsx +826 -0
- package/src/components/Command/command.tsx +187 -0
- package/src/components/DataTable/active-editor-controller.ts +72 -0
- package/src/components/DataTable/cell-registry.tsx +520 -0
- package/src/components/DataTable/column-types.ts +180 -0
- package/src/components/DataTable/data-table-column-visibility-panel.tsx +261 -0
- package/src/components/DataTable/data-table-filter-panel.tsx +813 -0
- package/src/components/DataTable/data-table-interaction-layer.tsx +483 -0
- package/src/components/DataTable/data-table-sort-manager.tsx +210 -0
- package/src/components/DataTable/data-table.css +165 -0
- package/src/components/DataTable/data-table.tsx +2924 -0
- package/src/components/DataTable/filter-operators.ts +225 -0
- package/src/components/DataTable/filter-tree.ts +313 -0
- package/src/components/DataTable/lib/column-meta.ts +79 -0
- package/src/components/DateGrid/date-grid.tsx +209 -0
- package/src/components/DatePicker/date-picker.tsx +1114 -0
- package/src/components/DescriptionList/description-list.tsx +141 -0
- package/src/components/Dialog/dialog.tsx +267 -0
- package/src/components/DropdownMenu/dropdown-menu.tsx +475 -0
- package/src/components/Empty/empty.tsx +108 -0
- package/src/components/Field/field-context.ts +136 -0
- package/src/components/Field/field-types.ts +52 -0
- package/src/components/Field/field-wrapper.tsx +348 -0
- package/src/components/Field/field.tsx +535 -0
- package/src/components/FieldControlGroup/field-control-group.tsx +136 -0
- package/src/components/FileItem/file-item.tsx +322 -0
- package/src/components/FileUpload/file-upload.tsx +326 -0
- package/src/components/FileViewer/file-viewer-types.ts +76 -0
- package/src/components/FileViewer/file-viewer.tsx +1065 -0
- package/src/components/FileViewer/image-renderer.tsx +256 -0
- package/src/components/HoverCard/hover-card.tsx +79 -0
- package/src/components/Input/input.tsx +233 -0
- package/src/components/LinkInput/link-input.tsx +304 -0
- package/src/components/Menu/menu-item.tsx +334 -0
- package/src/components/NameCard/name-card.tsx +319 -0
- package/src/components/Notice/notice.tsx +196 -0
- package/src/components/NumberInput/number-input.tsx +203 -0
- package/src/components/OverflowIndicator/overflow-indicator.tsx +156 -0
- package/src/components/PeoplePicker/avatar-stack-overflow.ts +100 -0
- package/src/components/PeoplePicker/people-picker-helpers.ts +76 -0
- package/src/components/PeoplePicker/people-picker.tsx +455 -0
- package/src/components/PeoplePicker/person-display.tsx +358 -0
- package/src/components/Popover/popover.tsx +183 -0
- package/src/components/ProgressBar/progress-bar.tsx +157 -0
- package/src/components/README.md +58 -0
- package/src/components/RadioGroup/radio-group.tsx +261 -0
- package/src/components/Rating/rating.tsx +295 -0
- package/src/components/ScrollArea/scroll-area.tsx +110 -0
- package/src/components/SegmentedControl/segmented-control.tsx +304 -0
- package/src/components/Select/select.tsx +658 -0
- package/src/components/SelectMenu/select-menu.tsx +430 -0
- package/src/components/SelectionControl/selection-item.tsx +261 -0
- package/src/components/Separator/separator.tsx +48 -0
- package/src/components/Sheet/sheet.tsx +240 -0
- package/src/components/Sidebar/sidebar.tsx +1280 -0
- package/src/components/Skeleton/skeleton.tsx +35 -0
- package/src/components/Slider/slider.tsx +158 -0
- package/src/components/Steps/steps.tsx +850 -0
- package/src/components/Switch/switch.tsx +285 -0
- package/src/components/Tabs/tabs.tsx +515 -0
- package/src/components/Tag/tag.tsx +246 -0
- package/src/components/Textarea/textarea.tsx +280 -0
- package/src/components/TimePicker/time-columns.tsx +260 -0
- package/src/components/TimePicker/time-picker.tsx +419 -0
- package/src/components/Toast/toast.tsx +129 -0
- package/src/components/Tooltip/tooltip.tsx +68 -0
- package/src/components/TreeView/tree-view.tsx +1031 -0
- package/src/hooks/use-controllable.ts +40 -0
- package/src/hooks/use-is-narrow-viewport.ts +19 -0
- package/src/hooks/use-is-touch-device.ts +21 -0
- package/src/hooks/use-overflow-items.ts +256 -0
- package/src/index.ts +85 -0
- package/src/lib/README.md +82 -0
- package/src/lib/drag-visual.ts +272 -0
- package/src/lib/i18n/README.md +60 -0
- package/src/lib/i18n/i18n-context.tsx +129 -0
- package/src/lib/multi-select-ordering.ts +61 -0
- package/src/lib/utils.ts +93 -0
- package/src/patterns/README.md +67 -0
- package/src/patterns/element-anatomy/item-anatomy.tsx +744 -0
- package/src/patterns/header-canonical/chrome-header.tsx +175 -0
- package/src/patterns/header-canonical/header-canonical.css +27 -0
- package/src/patterns/horizontal-overflow/horizontal-overflow.tsx +217 -0
- package/src/patterns/overlay-surface/overlay-surface.tsx +191 -0
- package/src/patterns/resize-handle/resize-handle.tsx +188 -0
- package/src/stories-helpers/anatomy/anatomy-utils.tsx +64 -0
- package/src/styles/preset.css +31 -0
- package/src/styles/tokens.css +35 -0
- package/src/tokens/README.md +53 -0
- package/src/tokens/color/primitives.css +429 -0
- package/src/tokens/color/semantic.css +539 -0
- package/src/tokens/elevation/overlay-geometry.ts +13 -0
- package/src/tokens/layoutSpace/layoutSpace.css +36 -0
- package/src/tokens/motion/motion.css +30 -0
- package/src/tokens/motion/motion.ts +17 -0
- package/src/tokens/opacity/opacity.css +23 -0
- package/src/tokens/radius/radius.css +19 -0
- package/src/tokens/typography/typography.css +118 -0
- package/src/tokens/uiSize/icon-size.ts +52 -0
- package/src/tokens/uiSize/uiSize.css +125 -0
|
@@ -0,0 +1,455 @@
|
|
|
1
|
+
// @benchmark-unverified-blanket: file-level retraction per M22 (d) — claims herein not individually URL-cited; treat as unverified visual/usage rumor unless retrofit per-claim. Hook escape preserved.
|
|
2
|
+
// @placeholder-vocabulary-allow: 1-cycle backward-compat — `placeholder` 已加(trigger empty SSOT),`emptyPlaceholder={emptyText}` forward 仍保留讓既有 consumer 不被 silent break;Combobox line 509 `placeholder ?? emptyPlaceholder` fallback → placeholder 永遠 takes precedence。Future cycle 移除 emptyPlaceholder forward(per field-controls.spec.md 共享 contract b)。
|
|
3
|
+
// @cell-metric-escape-allow: comment describes RETIRED `tagAreaPaddingLeftPx={8}` magic — current code is surface-guarded (`surface === 'form'` only injects `!px-3`; table-cell context untouched, lets naked `!px-[var(--table-cell-px)]` SSOT take over). Hook regex grep'd the comment word, not the live code path. Per (a) fix 2026-05-13 user-approved Path a.
|
|
4
|
+
import * as React from 'react'
|
|
5
|
+
import { ChevronDown } from 'lucide-react'
|
|
6
|
+
import { cn } from '@/lib/utils'
|
|
7
|
+
import type { FieldMode, FieldVariant } from '@/design-system/components/Field/field-types'
|
|
8
|
+
import { fieldWrapperStyles, EMPTY_DISPLAY, nakedCellRowModeAlign } from '@/design-system/components/Field/field-wrapper'
|
|
9
|
+
import { ItemSuffix } from '@/design-system/patterns/element-anatomy/item-anatomy'
|
|
10
|
+
import { useFieldContext, useFieldSurface } from '@/design-system/components/Field/field-context'
|
|
11
|
+
import { Avatar } from '@/design-system/components/Avatar/avatar'
|
|
12
|
+
import { Tag } from '@/design-system/components/Tag/tag'
|
|
13
|
+
import { Select } from '@/design-system/components/Select/select'
|
|
14
|
+
import { Combobox } from '@/design-system/components/Combobox/combobox'
|
|
15
|
+
import { PersonDisplay, MultiPersonDisplay, PersonAvatarTag, buildPersonNameCard, resolvePerson, type PersonValue } from './person-display'
|
|
16
|
+
import {
|
|
17
|
+
getAvatarStackVisibleCount,
|
|
18
|
+
AVATAR_STACK_AVATAR_PX,
|
|
19
|
+
AVATAR_STACK_OVERFLOW_CHIP_PX,
|
|
20
|
+
} from './avatar-stack-overflow'
|
|
21
|
+
// Pure helpers extracted to sibling for file-size budget(2026-05-18,P1 ≤ 500 lines)。
|
|
22
|
+
// 不消費 component closure 的純 constant / 純 mapping function 全部搬走,主檔保留 SSOT-bearing
|
|
23
|
+
// render logic(消費 Combobox / Select / state 等 closure 的部分)。
|
|
24
|
+
// SSOT primitive re-export(backward-compat 對外 import 路徑保持 `./people-picker`)。
|
|
25
|
+
import {
|
|
26
|
+
PEOPLE_PICKER_LENGTH1_WRAPPER_CLASS,
|
|
27
|
+
getPeoplePickerTagWrapperClass,
|
|
28
|
+
personToSelectOption,
|
|
29
|
+
findPerson,
|
|
30
|
+
} from './people-picker-helpers'
|
|
31
|
+
import { ICON_SIZE } from '@/design-system/tokens/uiSize/icon-size'
|
|
32
|
+
export { PEOPLE_PICKER_LENGTH1_WRAPPER_CLASS, getPeoplePickerTagWrapperClass }
|
|
33
|
+
|
|
34
|
+
// ── PeoplePicker ────────────────────────────────────────────────────────────
|
|
35
|
+
// **2026-05-07 v15.6 SSOT 重構 v2**:
|
|
36
|
+
//
|
|
37
|
+
// - **single mode** wraps `<Select searchable selectedItemRenderer>`
|
|
38
|
+
// - **multi mode** 兩種 displayMode(consumer 自選):
|
|
39
|
+
// - **'stack'**(default,baseline 既有視覺)— Avatar 疊合 + `+N` overflow indicator,
|
|
40
|
+
// 不可 wrap。Trigger 自組 + 直接 wrap `<SelectMenu multiple>` primitive,
|
|
41
|
+
// trigger 內 render `<MultiPersonDisplay>` reuse baseline primitive(SSOT)。
|
|
42
|
+
// 對齊 Notion / Linear / Atlassian / Slack 多人 quick-glance idiom。
|
|
43
|
+
// - **'pill'**(opt-in)— 每人 Tag pill,可 wrap。Wrap `<Combobox tagRenderer>`,
|
|
44
|
+
// tagRenderer 用 Tag 元件 `avatar` prop SSOT(不塞 children)。
|
|
45
|
+
// `pillShowAvatar` 控 pill 內是否顯 avatar prefix(default true,false → 純文字 pill)。
|
|
46
|
+
// 對齊 GitHub Reviewers / Combobox tag-input idiom。
|
|
47
|
+
|
|
48
|
+
// **codex P2 fix(2026-05-07 v15.10)**:`extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'>`
|
|
49
|
+
// 讓 consumer 可傳 `id` / `data-testid` / `onBlur` / `onFocus` / `aria-*` 等 HTML root props,
|
|
50
|
+
// component 內部 `...rest` forward 到 trigger 容器(對齊 DS 既有 Combobox / Select 慣例)。
|
|
51
|
+
// `onChange` 衝突走 Omit(本 component 用 PersonValue[] custom signature)。
|
|
52
|
+
export interface PeoplePickerProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {
|
|
53
|
+
/** Field mode(edit / display / readonly / disabled),默認 inherit Field context 或 'edit' */
|
|
54
|
+
mode?: FieldMode
|
|
55
|
+
/** Field chrome variant(對齊 Select / Combobox)*/
|
|
56
|
+
variant?: FieldVariant
|
|
57
|
+
size?: 'sm' | 'md' | 'lg'
|
|
58
|
+
/** 當前已選的人(單選 PersonValue,多選 PersonValue[])*/
|
|
59
|
+
value?: PersonValue | PersonValue[] | null
|
|
60
|
+
/** 值變更 callback(永遠 emit array — single mode 取 [0] 即 single value)*/
|
|
61
|
+
onChange?: (value: PersonValue[]) => void
|
|
62
|
+
/** 可選人員清單(edit mode 下拉顯示)*/
|
|
63
|
+
people?: PersonValue[]
|
|
64
|
+
/** 2026-05-12 Stream C Issue 4 fix(codex Q3 Cluster C):trigger empty placeholder。
|
|
65
|
+
* Default '請選擇人員'。**禁** 將 `emptyText`(search-empty)當 trigger placeholder 傳。 */
|
|
66
|
+
placeholder?: string
|
|
67
|
+
/** 搜尋框 placeholder */
|
|
68
|
+
searchPlaceholder?: string
|
|
69
|
+
/** 搜尋無結果訊息(filtered menu empty)。**僅**用於 SelectMenu noResultsText,
|
|
70
|
+
* 不再 silent 轉 trigger placeholder(2026-05-12 Issue 4 semantic fix)。 */
|
|
71
|
+
emptyText?: string
|
|
72
|
+
className?: string
|
|
73
|
+
disabled?: boolean
|
|
74
|
+
/** Initial open state(uncontrolled)*/
|
|
75
|
+
defaultOpen?: boolean
|
|
76
|
+
/** open state 變更 callback */
|
|
77
|
+
onOpenChange?: (open: boolean) => void
|
|
78
|
+
/**
|
|
79
|
+
* Multi mode 顯示樣式(default 'stack')。Single mode 此 prop 忽略。
|
|
80
|
+
* - 'stack' — Avatar 疊合 + `+N`(空間省、不可 wrap;default)
|
|
81
|
+
* - 'pill' — 每人 Tag pill(可 wrap)
|
|
82
|
+
*/
|
|
83
|
+
multiDisplay?: 'stack' | 'pill'
|
|
84
|
+
/**
|
|
85
|
+
* `multiDisplay='pill'` 模式下是否顯示 avatar prefix(default true)。
|
|
86
|
+
* 設 false → 純文字 pill,進一步節省空間。對齊 Tag 元件 `avatar` prop SSOT。
|
|
87
|
+
*/
|
|
88
|
+
pillShowAvatar?: boolean
|
|
89
|
+
/** Pill 模式下是否允許 wrap(default true)— 對齊 Combobox `wrap` prop */
|
|
90
|
+
pillWrap?: boolean
|
|
91
|
+
/**
|
|
92
|
+
* 搜尋型態(2026-05-12 規則 3 ship,3-mode SSOT 對齊 A1-A5 spec):
|
|
93
|
+
* - `'menu'`(default,backward-compat)— 浮層內搜尋(panel-top search)
|
|
94
|
+
* - `'trigger'`(multi 模式 opt-in)— inline 搜尋(浮層開時 name 拿掉,avatar 後接 input cursor,
|
|
95
|
+
* 類 Combobox inline-trigger idiom)
|
|
96
|
+
* Single mode 永遠 inline-trigger(wrap Select searchable 直接走 inline),此 prop multi 才有意義。
|
|
97
|
+
*/
|
|
98
|
+
searchIn?: 'menu' | 'trigger'
|
|
99
|
+
/**
|
|
100
|
+
* Display 是否渲 ChevronDown + Field naked wrapper(D-path opt-in,2026-05-08)
|
|
101
|
+
* — DataTable cell display↔edit 像素級對齊用。預設 false(裸 PersonDisplay,backward compat)。
|
|
102
|
+
* 設 true 時 display 走 fieldWrapperStyles(naked variant)+ ItemSuffix ChevronDown,
|
|
103
|
+
* 與 edit (Select / Combobox wrapped) 同 DOM 結構,消除 Layer-B padding mismatch。
|
|
104
|
+
*/
|
|
105
|
+
showDisplayEndIcon?: boolean
|
|
106
|
+
/** a11y label */
|
|
107
|
+
'aria-label'?: string
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const PeoplePicker = React.forwardRef<HTMLDivElement, PeoplePickerProps>(function PeoplePicker({
|
|
111
|
+
mode: modeProp,
|
|
112
|
+
variant: variantProp,
|
|
113
|
+
size = 'md',
|
|
114
|
+
value,
|
|
115
|
+
onChange,
|
|
116
|
+
people = [],
|
|
117
|
+
placeholder = '請選擇人員', // i18n-allow: DS default(2026-05-12 Stream C Issue 4)
|
|
118
|
+
searchPlaceholder = '搜尋人員…', // i18n-allow: DS default
|
|
119
|
+
emptyText = '沒有符合的人員', // i18n-allow: DS default — only for SelectMenu noResultsText
|
|
120
|
+
className,
|
|
121
|
+
disabled,
|
|
122
|
+
defaultOpen = false,
|
|
123
|
+
onOpenChange,
|
|
124
|
+
multiDisplay = 'stack',
|
|
125
|
+
pillShowAvatar = true,
|
|
126
|
+
pillWrap = true,
|
|
127
|
+
searchIn = 'menu',
|
|
128
|
+
showDisplayEndIcon = false,
|
|
129
|
+
'aria-label': ariaLabel,
|
|
130
|
+
...rest
|
|
131
|
+
}, ref) {
|
|
132
|
+
const fieldCtx = useFieldContext()
|
|
133
|
+
const surface = useFieldSurface()
|
|
134
|
+
const mode: FieldMode = modeProp ?? fieldCtx?.mode ?? 'edit'
|
|
135
|
+
const resolvedMode: FieldMode = disabled ? 'disabled' : mode
|
|
136
|
+
const resolvedVariant: FieldVariant = variantProp ?? fieldCtx?.variant ?? 'default'
|
|
137
|
+
const isMulti = Array.isArray(value)
|
|
138
|
+
const isEmpty = !value || (isMulti && value.length === 0)
|
|
139
|
+
|
|
140
|
+
// ── mode='display' ────────────────────────────────────────────────────────
|
|
141
|
+
// Default(showDisplayEndIcon=false):裸 PersonDisplay / MultiPersonDisplay — backward compat。
|
|
142
|
+
// Opt-in(showDisplayEndIcon=true,2026-05-08 D-path):Field naked wrapper + ItemSuffix ChevronDown,
|
|
143
|
+
// 與 edit (Select / Combobox wrapped) 同 DOM 結構消除 cell display↔edit 像素偏移。
|
|
144
|
+
if (resolvedMode === 'display') {
|
|
145
|
+
if (!showDisplayEndIcon) {
|
|
146
|
+
if (isEmpty) return <span className="text-fg-muted">{EMPTY_DISPLAY}</span>
|
|
147
|
+
return isMulti
|
|
148
|
+
? <MultiPersonDisplay value={value as PersonValue[]} size={size} measured />
|
|
149
|
+
: <PersonDisplay value={value as PersonValue} size={size} />
|
|
150
|
+
}
|
|
151
|
+
// 2026-05-18 改 import ICON_SIZE SSOT(per user『做完』approval,消除 M17 違反 7+ 重複 ternary)
|
|
152
|
+
const iconSize = ICON_SIZE[size as 'sm' | 'md' | 'lg']
|
|
153
|
+
return (
|
|
154
|
+
<div
|
|
155
|
+
className={cn(fieldWrapperStyles({ mode: 'display', variant: resolvedVariant, size }), className)}
|
|
156
|
+
data-field-mode="display"
|
|
157
|
+
>
|
|
158
|
+
<span className={cn('flex-1 min-w-0 inline-flex items-center', nakedCellRowModeAlign)}>
|
|
159
|
+
{isEmpty
|
|
160
|
+
? <span className="text-fg-muted">{EMPTY_DISPLAY}</span>
|
|
161
|
+
: isMulti
|
|
162
|
+
? <MultiPersonDisplay value={value as PersonValue[]} size={size} measured />
|
|
163
|
+
: <PersonDisplay value={value as PersonValue} size={size} />}
|
|
164
|
+
</span>
|
|
165
|
+
<ItemSuffix className="pointer-events-none">
|
|
166
|
+
<ChevronDown size={iconSize} className="shrink-0 text-fg-muted" aria-hidden />
|
|
167
|
+
</ItemSuffix>
|
|
168
|
+
</div>
|
|
169
|
+
)
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// ── readonly / disabled — Field wrapper chrome,Avatar 視覺保留 ───────────
|
|
173
|
+
if (resolvedMode !== 'edit') {
|
|
174
|
+
return (
|
|
175
|
+
<div
|
|
176
|
+
ref={ref}
|
|
177
|
+
className={cn(fieldWrapperStyles({ mode: resolvedMode, variant: resolvedVariant, size }), className)}
|
|
178
|
+
data-field-mode={resolvedMode}
|
|
179
|
+
aria-label={ariaLabel}
|
|
180
|
+
{...rest}
|
|
181
|
+
>
|
|
182
|
+
<span className={cn('flex-1 min-w-0 inline-flex items-center', nakedCellRowModeAlign, resolvedMode === 'disabled' && 'text-fg-disabled')}>
|
|
183
|
+
{isEmpty
|
|
184
|
+
? <span className="text-fg-muted">{EMPTY_DISPLAY}</span>
|
|
185
|
+
: isMulti
|
|
186
|
+
? <MultiPersonDisplay value={value as PersonValue[]} size={size} measured />
|
|
187
|
+
: <PersonDisplay value={value as PersonValue} size={size} />}
|
|
188
|
+
</span>
|
|
189
|
+
</div>
|
|
190
|
+
)
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// ── edit mode ─────────────────────────────────────────────────────────────
|
|
194
|
+
const selectedNames: string[] = !value
|
|
195
|
+
? []
|
|
196
|
+
: Array.isArray(value)
|
|
197
|
+
? value.map(v => resolvePerson(v).name)
|
|
198
|
+
: [resolvePerson(value).name]
|
|
199
|
+
|
|
200
|
+
// ── single mode → wraps Select ────────────────────────────────────────────
|
|
201
|
+
if (!isMulti) {
|
|
202
|
+
const handleSingleChange = (name: string) => onChange?.([findPerson(people, name)])
|
|
203
|
+
return (
|
|
204
|
+
<Select
|
|
205
|
+
ref={ref as React.Ref<HTMLDivElement>}
|
|
206
|
+
size={size}
|
|
207
|
+
variant={resolvedVariant}
|
|
208
|
+
options={people.map(personToSelectOption)}
|
|
209
|
+
value={selectedNames[0] ?? null}
|
|
210
|
+
onChange={handleSingleChange}
|
|
211
|
+
searchable
|
|
212
|
+
placeholder={placeholder}
|
|
213
|
+
// 2026-05-12 Stream C Issue 4 fix(codex Q3):傳 `placeholder` 給 Select trigger empty。
|
|
214
|
+
// 不再傳 `emptyText`(search-empty semantic 跟 trigger-empty 分離,canonical SSOT)。
|
|
215
|
+
defaultOpen={defaultOpen}
|
|
216
|
+
onOpenChange={onOpenChange}
|
|
217
|
+
className={className}
|
|
218
|
+
aria-label={ariaLabel}
|
|
219
|
+
selectedItemRenderer={(opt) => <PersonDisplay value={findPerson(people, opt.value)} size={size} />}
|
|
220
|
+
// **codex P2 forward**:Select extends `SelectHTMLAttributes<HTMLSelectElement>`,
|
|
221
|
+
// event handler element 型別跟 PeoplePicker `HTMLAttributes<HTMLDivElement>` 不一致
|
|
222
|
+
// (`onCopy` / `onChange` 等)。Runtime spread 等效 — DOM 收到 attrs 不挑剔。
|
|
223
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
224
|
+
// any-allow: rest 含 `onChange: FormEventHandler` 跟 Select onChange signature 衝突 — DOM runtime spread 安全(per codex P2 forward)
|
|
225
|
+
{...(rest as any)}
|
|
226
|
+
/>
|
|
227
|
+
)
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// ── multi 'pill' → wraps Combobox(對齊 GitHub Reviewers / Combobox idiom)────
|
|
231
|
+
if (multiDisplay === 'pill') {
|
|
232
|
+
const handleMultiChange = (next: string[]) => {
|
|
233
|
+
onChange?.(next.map(name => findPerson(people, name)))
|
|
234
|
+
}
|
|
235
|
+
return (
|
|
236
|
+
<Combobox
|
|
237
|
+
ref={ref as React.Ref<HTMLDivElement>}
|
|
238
|
+
size={size}
|
|
239
|
+
variant={resolvedVariant}
|
|
240
|
+
options={people.map(personToSelectOption)}
|
|
241
|
+
value={selectedNames}
|
|
242
|
+
onChange={handleMultiChange}
|
|
243
|
+
searchable
|
|
244
|
+
searchPlaceholder={searchPlaceholder}
|
|
245
|
+
// 2026-05-12 Stream C Issue 4(codex Q3):placeholder = trigger empty hint('請選擇人員')
|
|
246
|
+
// — semantic clean separation;emptyText 不再 silent 轉 trigger placeholder。
|
|
247
|
+
// emptyPlaceholder backward-compat forward(Combobox line 509 `placeholder ?? emptyPlaceholder` fallback)
|
|
248
|
+
// 1 cycle:future 移除 emptyPlaceholder forward,emptyText 改傳 SelectMenu noResultsText。
|
|
249
|
+
placeholder={placeholder}
|
|
250
|
+
emptyPlaceholder={emptyText}
|
|
251
|
+
wrap={pillWrap}
|
|
252
|
+
defaultOpen={defaultOpen}
|
|
253
|
+
onOpenChange={onOpenChange}
|
|
254
|
+
className={className}
|
|
255
|
+
aria-label={ariaLabel}
|
|
256
|
+
// codex P2 forward(see Select branch comment for type-cast rationale)
|
|
257
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
258
|
+
// any-allow: rest 含 `onChange: FormEventHandler` 跟 Combobox onChange signature 衝突 — DOM runtime spread 安全(per codex P2 forward)
|
|
259
|
+
{...(rest as any)}
|
|
260
|
+
// **Tag SSOT canonical**:用 `avatar` prop(不塞 children),Tag 內部統一
|
|
261
|
+
// wrap 進 16×16 圓形 mask container(per Tag tsx line 175)。
|
|
262
|
+
tagRenderer={(item, onRemove) => {
|
|
263
|
+
const p = resolvePerson(findPerson(people, item.value))
|
|
264
|
+
return (
|
|
265
|
+
<Tag
|
|
266
|
+
key={item.value}
|
|
267
|
+
size={size}
|
|
268
|
+
color="neutral"
|
|
269
|
+
// 2026-05-18 7B' fix(per user 拍板「執行」+ Codex Round 3 共識,paired with Combobox L286):
|
|
270
|
+
// 拿掉 `unbounded` 對齊 Tag canonical max-w-40 cap + 內建 ellipsis。PeoplePicker pill 走
|
|
271
|
+
// Combobox tagRenderer slot,SSOT = Tag primitive 視覺(per codex Round 3 verdict)。
|
|
272
|
+
// 人名 99% < 25 chars 不觸發 cap;極端長名(複數姓 + middle name)觸發 ellipsis 是合理 UX。
|
|
273
|
+
avatar={pillShowAvatar
|
|
274
|
+
? <Avatar src={p.avatarUrl} alt={p.name} size={16} hoverCard={buildPersonNameCard(p)} />
|
|
275
|
+
: undefined}
|
|
276
|
+
onDismiss={onRemove}
|
|
277
|
+
>
|
|
278
|
+
{p.name}
|
|
279
|
+
</Tag>
|
|
280
|
+
)
|
|
281
|
+
}}
|
|
282
|
+
/>
|
|
283
|
+
)
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// ── multi 'stack' (default) → wraps Combobox 跟 pill mode 同 SSOT,差別在 tagRenderer 視覺。
|
|
287
|
+
//
|
|
288
|
+
// **2026-05-15 Bug 3 fix(Claude+Codex Step 5 比稿 consensus)**:visible count 走 shared
|
|
289
|
+
// `avatar-stack-overflow` primitive deterministic formula(取代 Combobox DOM offsetWidth-based
|
|
290
|
+
// useOverflowCount + 60px fallback 不 deterministic),pass override 給 Combobox bypass internal
|
|
291
|
+
// measurement。`MultiPersonDisplay`(display path)同 primitive,display + edit 結果一致。
|
|
292
|
+
// 對齊 user verbatim SSOT「同 cell width 同 overflow 判斷」+ codex Q3 consensus shared primitive。
|
|
293
|
+
const handleMultiChange = (next: string[]) => {
|
|
294
|
+
onChange?.(next.map(name => findPerson(people, name)))
|
|
295
|
+
}
|
|
296
|
+
// SSOT visible count compute via formula primitive + ResizeObserver
|
|
297
|
+
const stackContainerRef = React.useRef<HTMLDivElement | null>(null)
|
|
298
|
+
const [stackVisibleCount, setStackVisibleCount] = React.useState<number | undefined>(undefined)
|
|
299
|
+
React.useLayoutEffect(() => {
|
|
300
|
+
// 注:此 effect 只在 multi stack mode 跑(early return if not stack);length<=1 不需 override
|
|
301
|
+
if (!isMulti || selectedNames.length <= 1) {
|
|
302
|
+
setStackVisibleCount(undefined); return
|
|
303
|
+
}
|
|
304
|
+
const root = stackContainerRef.current
|
|
305
|
+
if (!root) return
|
|
306
|
+
// 2026-05-15 ROOT CAUSE FIX(user 抓「之前說的問題都還是存在」):
|
|
307
|
+
// stackContainerRef 透過 mergedStackRef 接 Combobox forwarded ref → root **就是** [role=combobox]
|
|
308
|
+
// div 自己。原 `root.querySelector('[role=combobox]')` 不找 self 永遠 null → trigger=null →
|
|
309
|
+
// tagArea=null → available=0 → setStackVisibleCount(0) → 整 stack 全 overflow → fallback 到
|
|
310
|
+
// Combobox DOM-based useOverflowCount(非 deterministic 那個算法)。修:用 root 自己當 trigger,
|
|
311
|
+
// 從 root 內找 tagArea(flex-1 min-w-0 div)。
|
|
312
|
+
const calc = () => {
|
|
313
|
+
const trigger = root.matches('[role="combobox"]') ? root : root.querySelector<HTMLElement>('[role="combobox"]')
|
|
314
|
+
const tagArea = trigger?.querySelector<HTMLElement>('div[class*="flex-1"][class*="min-w-0"]')
|
|
315
|
+
const available = tagArea?.clientWidth ?? trigger?.clientWidth ?? 0
|
|
316
|
+
const visible = getAvatarStackVisibleCount({
|
|
317
|
+
availablePx: available,
|
|
318
|
+
total: selectedNames.length,
|
|
319
|
+
avatarPx: AVATAR_STACK_AVATAR_PX[size],
|
|
320
|
+
overflowChipPx: AVATAR_STACK_OVERFLOW_CHIP_PX[size],
|
|
321
|
+
})
|
|
322
|
+
setStackVisibleCount(visible)
|
|
323
|
+
}
|
|
324
|
+
calc()
|
|
325
|
+
const ro = new ResizeObserver(calc)
|
|
326
|
+
ro.observe(root)
|
|
327
|
+
return () => ro.disconnect()
|
|
328
|
+
}, [isMulti, multiDisplay, selectedNames.length, size])
|
|
329
|
+
// Merge ref:forward to parent + capture for ResizeObserver
|
|
330
|
+
const mergedStackRef = React.useCallback((el: HTMLDivElement | null) => {
|
|
331
|
+
stackContainerRef.current = el
|
|
332
|
+
if (typeof ref === 'function') ref(el)
|
|
333
|
+
else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = el
|
|
334
|
+
}, [ref])
|
|
335
|
+
|
|
336
|
+
return (
|
|
337
|
+
<Combobox
|
|
338
|
+
ref={mergedStackRef}
|
|
339
|
+
size={size}
|
|
340
|
+
variant={resolvedVariant}
|
|
341
|
+
options={people.map(personToSelectOption)}
|
|
342
|
+
value={selectedNames}
|
|
343
|
+
onChange={handleMultiChange}
|
|
344
|
+
searchable
|
|
345
|
+
searchIn={searchIn}
|
|
346
|
+
searchPlaceholder={searchPlaceholder}
|
|
347
|
+
// 2026-05-12 Stream C Issue 4(codex Q3):placeholder = trigger empty('請選擇人員');emptyText = search-empty(僅 backward-compat forward 1 cycle)
|
|
348
|
+
placeholder={placeholder}
|
|
349
|
+
emptyPlaceholder={emptyText}
|
|
350
|
+
wrap={false}
|
|
351
|
+
defaultOpen={defaultOpen}
|
|
352
|
+
onOpenChange={onOpenChange}
|
|
353
|
+
// 2026-05-13 (a) fix(user 拍 Path a + Layer A density-drift root-cause):
|
|
354
|
+
// 撤掉 `tagAreaPaddingLeftPx={8}` magic — Combobox `tagPadding[size]` 是 density-dependent
|
|
355
|
+
// calc 公式(`(field-height - icon-size) / 2`),只在 md size + default density 才 = 4px;
|
|
356
|
+
// 其他 size/density 漂 6px / 8px → 4+8=12 spec 公式不成立。
|
|
357
|
+
// (a) fix:form context + 有 tag → 改 inject `!px-3`(固定 12px)直接 override `tagPadding[size]`,
|
|
358
|
+
// 達成 GitHub PeoplePicker fixed 12px inset(對齊 cell context 同 13px from cell.left 含 1px border)。
|
|
359
|
+
// - form + 有 tag → `!px-3`(12px 固定 inset)+ tagAreaPaddingLeftPx undefined → field.padL=12 ✓
|
|
360
|
+
// - table-cell + 有 tag → naked variant `!px-[var(--table-cell-px)]` 已是 12px,不 inject ✓
|
|
361
|
+
// - isEmpty → 不 inject,走 Combobox 預設文字 inset(`tagPadding[size]` 公式自然 vertical center)
|
|
362
|
+
className={cn(className, !isEmpty && surface === 'form' && '!px-3')}
|
|
363
|
+
aria-label={ariaLabel}
|
|
364
|
+
// 2026-05-15 Bug 1 fix(Claude+Codex Step 5 比稿 consensus,user verbatim「就 A」):per-length 動態
|
|
365
|
+
// wrapper class — length=1 降階單人視覺需要 width constraint chain(`flex-1 min-w-0 overflow-hidden`),
|
|
366
|
+
// length>=2 stack 視覺保留 overlap(`-ml-0.5 first:ml-0 relative inline-flex group/avatar`)。對齊
|
|
367
|
+
// spec.md §C row 1(length=1 = avatar+人名+ellipsis)+ §D row 1(length>=2 = stack overlap)。
|
|
368
|
+
// 真根因:Combobox `OverflowTagList` 把所有 tagRenderer 結果包 `shrink-0`,加 `inline-flex` 後
|
|
369
|
+
// wrapper 變 intrinsic content-width → PersonDisplay `w-full` resolves to intrinsic → truncate 無效。
|
|
370
|
+
// 修法:length=1 wrapper 改 `flex-1 min-w-0 overflow-hidden` 提供 width constraint 給 PersonDisplay。
|
|
371
|
+
// SSOT helper `getPeoplePickerTagWrapperClass(count)` 集中,future 改 wrapper 行為改一處。
|
|
372
|
+
tagWrapperClassName={getPeoplePickerTagWrapperClass(selectedNames.length)}
|
|
373
|
+
// 2026-05-16 真 root cause fix:overflow chip wrapper 套同 `-ml-0.5` 讓 chip 物理上
|
|
374
|
+
// 跟 avatar 同 slot(等寬同 step,non-overlapping 多 24px 區塊不再 saw)。對齊 user
|
|
375
|
+
// 「avatars 和 +N 都是同尺寸圓形,空間最多容固定數量圓形」物理模型 directive +
|
|
376
|
+
// MUI AvatarGroup / Primer AvatarStack 共識(`AvatarGroup.js` L54-59 same negative margin)。
|
|
377
|
+
overflowWrapperClassName="-ml-0.5 first:ml-0 relative inline-flex"
|
|
378
|
+
tagAreaGapPx={0}
|
|
379
|
+
tagAreaPaddingLeftPx={undefined}
|
|
380
|
+
// 2026-05-12 Round 7 fix(user 抓 image 2「+N tag 應該圓形不是矩形」+ 對齊 GitHub picker idiom):
|
|
381
|
+
// Combobox default `overflowShape='tag'`(矩形 chip,文字 Combobox 慣例);PeoplePicker stack
|
|
382
|
+
// mode pass `'circle'`(圓形 avatar-shape,跟 avatar 一樣大)。對齊 MultiPersonDisplay readonly path
|
|
383
|
+
// 既有 OverflowIndicator default 'circle' SSOT。
|
|
384
|
+
overflowShape="circle"
|
|
385
|
+
// 2026-05-15 Bug 3 fix:formula-based visible count override(避免 Combobox DOM measurement +
|
|
386
|
+
// 60px fallback 不 deterministic)。SSOT in `./avatar-stack-overflow.ts`,display + edit 共用。
|
|
387
|
+
visibleCountOverride={stackVisibleCount}
|
|
388
|
+
// 2026-05-14 I4 fix(per codex+Layer A 共識):hidden items 在 `+N` overflow popover 顯
|
|
389
|
+
// Tag with avatar(對齊 display MultiPersonDisplay popover SSOT,user 抓 display vs edit
|
|
390
|
+
// overflow 視覺不一致)。
|
|
391
|
+
renderHiddenTag={(item) => {
|
|
392
|
+
const p = resolvePerson(findPerson(people, item.value))
|
|
393
|
+
return (
|
|
394
|
+
<Tag
|
|
395
|
+
key={item.value}
|
|
396
|
+
color="neutral"
|
|
397
|
+
size="sm"
|
|
398
|
+
avatar={
|
|
399
|
+
<Avatar
|
|
400
|
+
src={p.avatarUrl}
|
|
401
|
+
alt={p.name}
|
|
402
|
+
size={16}
|
|
403
|
+
hoverCard={buildPersonNameCard(p)}
|
|
404
|
+
/>
|
|
405
|
+
}
|
|
406
|
+
onDismiss={() => {
|
|
407
|
+
onChange?.(selectedNames.filter(n => n !== item.value).map(n => findPerson(people, n)))
|
|
408
|
+
}}
|
|
409
|
+
>
|
|
410
|
+
{p.name}
|
|
411
|
+
</Tag>
|
|
412
|
+
)
|
|
413
|
+
}}
|
|
414
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
415
|
+
// any-allow: rest 含 `onChange: FormEventHandler` 跟 Combobox onChange signature 衝突 — DOM runtime spread 安全(per codex P2 forward)
|
|
416
|
+
{...(rest as any)}
|
|
417
|
+
tagRenderer={(item, onRemove) => {
|
|
418
|
+
const p = resolvePerson(findPerson(people, item.value))
|
|
419
|
+
// 2026-05-12 Q2 fix(user 拍板「multi 只選 1 人時 trigger = avatar + name,跟 single mode 同」):
|
|
420
|
+
// selectedNames.length === 1 → PersonDisplay(avatar + name)代替 PersonAvatarTag(avatar only)。
|
|
421
|
+
// SSOT 對齊 PeoplePicker single mode line 201 selectedItemRenderer。多選 1 人時視覺等同單選,
|
|
422
|
+
// 只在 length > 1 才走 stack(各 avatar 純 chip)。多選 + inline 搜尋場景拿掉 name 改 cursor
|
|
423
|
+
// 是 future 工作(需 PeoplePicker 加 searchIn='trigger' opt-in,當前 wrapped Combobox 走 menu search)。
|
|
424
|
+
if (selectedNames.length === 1) {
|
|
425
|
+
return <PersonDisplay key={item.value} value={p} size={size} />
|
|
426
|
+
}
|
|
427
|
+
return (
|
|
428
|
+
<PersonAvatarTag
|
|
429
|
+
key={item.value}
|
|
430
|
+
person={p}
|
|
431
|
+
size={size}
|
|
432
|
+
onRemove={onRemove}
|
|
433
|
+
/>
|
|
434
|
+
)
|
|
435
|
+
}}
|
|
436
|
+
/>
|
|
437
|
+
)
|
|
438
|
+
})
|
|
439
|
+
PeoplePicker.displayName = 'PeoplePicker'
|
|
440
|
+
|
|
441
|
+
// Story auto-compile metadata
|
|
442
|
+
export const peoplePickerMeta = {
|
|
443
|
+
component: 'PeoplePicker',
|
|
444
|
+
family: 4,
|
|
445
|
+
variants: {},
|
|
446
|
+
sizes: {},
|
|
447
|
+
states: ['default', 'hover', 'active', 'focus-visible', 'disabled'],
|
|
448
|
+
tokens: {
|
|
449
|
+
bg: [],
|
|
450
|
+
fg: ['text-fg-disabled', 'text-fg-muted'],
|
|
451
|
+
ring: [],
|
|
452
|
+
},
|
|
453
|
+
} as const
|
|
454
|
+
|
|
455
|
+
export { PeoplePicker }
|