@mezzanine-ui/react 1.0.0-rc.5 → 1.0.0-rc.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (213) hide show
  1. package/Accordion/Accordion.d.ts +36 -0
  2. package/Accordion/Accordion.js +37 -1
  3. package/AlertBanner/AlertBanner.d.ts +30 -1
  4. package/AlertBanner/AlertBanner.js +56 -12
  5. package/AutoComplete/AutoComplete.d.ts +75 -11
  6. package/AutoComplete/AutoComplete.js +145 -25
  7. package/AutoComplete/AutoCompleteInside.d.ts +54 -0
  8. package/AutoComplete/AutoCompleteInside.js +17 -0
  9. package/AutoComplete/useAutoCompleteKeyboard.d.ts +2 -1
  10. package/AutoComplete/useAutoCompleteKeyboard.js +4 -1
  11. package/Backdrop/Backdrop.d.ts +33 -1
  12. package/Backdrop/Backdrop.js +33 -1
  13. package/Badge/Badge.d.ts +26 -1
  14. package/Badge/Badge.js +26 -1
  15. package/Badge/typings.d.ts +15 -0
  16. package/Breadcrumb/BreadcrumbDropdown.d.ts +1 -1
  17. package/Breadcrumb/BreadcrumbOverflowMenuDropdown.d.ts +1 -1
  18. package/Breadcrumb/typings.d.ts +1 -1
  19. package/Button/Button.d.ts +26 -1
  20. package/Button/Button.js +33 -5
  21. package/COMPONENTS.md +267 -0
  22. package/Calendar/useCalendarControls.d.ts +18 -0
  23. package/Calendar/useCalendarControls.js +18 -0
  24. package/Card/FourThumbnailCard.js +1 -1
  25. package/Card/SingleThumbnailCard.js +1 -1
  26. package/Checkbox/Checkbox.d.ts +30 -1
  27. package/Checkbox/Checkbox.js +54 -4
  28. package/Checkbox/CheckboxGroup.d.ts +39 -1
  29. package/Checkbox/CheckboxGroup.js +49 -3
  30. package/Cropper/Cropper.d.ts +2 -2
  31. package/Cropper/Cropper.js +2 -3
  32. package/Cropper/CropperElement.js +1 -1
  33. package/Cropper/utils/cropper-calculations.d.ts +1 -1
  34. package/Cropper/utils/cropper-calculations.js +16 -14
  35. package/DatePicker/DatePicker.d.ts +36 -2
  36. package/DatePicker/DatePicker.js +36 -2
  37. package/DateRangePicker/useDateRangePickerValue.d.ts +24 -0
  38. package/DateRangePicker/useDateRangePickerValue.js +24 -0
  39. package/Description/Description.d.ts +1 -1
  40. package/Description/Description.js +1 -1
  41. package/Description/DescriptionTitle.d.ts +6 -1
  42. package/Description/DescriptionTitle.js +2 -2
  43. package/Drawer/Drawer.d.ts +78 -33
  44. package/Drawer/Drawer.js +72 -34
  45. package/Dropdown/Dropdown.d.ts +63 -1
  46. package/Dropdown/Dropdown.js +203 -9
  47. package/Dropdown/DropdownItem.d.ts +26 -2
  48. package/Dropdown/DropdownItem.js +91 -43
  49. package/Dropdown/DropdownItemCard.d.ts +3 -2
  50. package/Dropdown/DropdownItemCard.js +8 -5
  51. package/Dropdown/DropdownStatus.d.ts +2 -2
  52. package/Dropdown/DropdownStatus.js +3 -2
  53. package/Dropdown/dropdownKeydownHandler.d.ts +6 -0
  54. package/Dropdown/dropdownKeydownHandler.js +14 -7
  55. package/Empty/icons/EmptyMainInitialDataIcon.js +1 -1
  56. package/Empty/icons/EmptyMainNotificationIcon.js +1 -1
  57. package/Empty/icons/EmptyMainResultIcon.js +1 -1
  58. package/Empty/icons/EmptyMainSystemIcon.js +1 -1
  59. package/FilterArea/Filter.d.ts +25 -2
  60. package/FilterArea/Filter.js +43 -2
  61. package/FilterArea/FilterArea.d.ts +43 -4
  62. package/FilterArea/FilterArea.js +39 -4
  63. package/FilterArea/FilterAreaContext.d.ts +6 -0
  64. package/FilterArea/FilterAreaContext.js +6 -0
  65. package/FilterArea/FilterLine.d.ts +19 -0
  66. package/FilterArea/FilterLine.js +19 -0
  67. package/FilterArea/index.d.ts +2 -2
  68. package/FilterArea/index.js +1 -1
  69. package/Form/FormField.d.ts +43 -2
  70. package/Form/FormField.js +40 -3
  71. package/Form/typings.d.ts +2 -0
  72. package/Form/useAutoCompleteValueControl.d.ts +20 -0
  73. package/Form/useAutoCompleteValueControl.js +20 -0
  74. package/Form/useCheckboxControlValue.d.ts +19 -0
  75. package/Form/useCheckboxControlValue.js +19 -0
  76. package/Form/useControlValueState.d.ts +16 -0
  77. package/Form/useControlValueState.js +16 -0
  78. package/Form/useCustomControlValue.d.ts +17 -0
  79. package/Form/useCustomControlValue.js +17 -0
  80. package/Form/useInputControlValue.d.ts +19 -0
  81. package/Form/useInputControlValue.js +19 -0
  82. package/Form/useInputWithClearControlValue.d.ts +20 -0
  83. package/Form/useInputWithClearControlValue.js +20 -0
  84. package/Form/useRadioControlValue.d.ts +19 -0
  85. package/Form/useRadioControlValue.js +19 -0
  86. package/Form/useSelectValueControl.d.ts +19 -0
  87. package/Form/useSelectValueControl.js +19 -0
  88. package/Form/useSwitchControlValue.d.ts +18 -0
  89. package/Form/useSwitchControlValue.js +18 -0
  90. package/Icon/Icon.d.ts +23 -1
  91. package/Icon/Icon.js +23 -1
  92. package/Input/Input.d.ts +31 -1
  93. package/Input/Input.js +31 -1
  94. package/Input/SpinnerButton/SpinnerButton.js +1 -1
  95. package/Message/Message.d.ts +56 -6
  96. package/Message/Message.js +59 -52
  97. package/Modal/Modal.d.ts +76 -4
  98. package/Modal/Modal.js +117 -6
  99. package/Modal/ModalBodyForVerification.js +3 -1
  100. package/Modal/ModalFooter.d.ts +21 -6
  101. package/Modal/ModalHeader.d.ts +50 -11
  102. package/Modal/ModalHeader.js +1 -1
  103. package/Modal/index.d.ts +1 -1
  104. package/Navigation/Navigation.js +20 -11
  105. package/Navigation/NavigationHeader.js +2 -1
  106. package/Navigation/NavigationIconButton.d.ts +8 -0
  107. package/Navigation/NavigationIconButton.js +2 -2
  108. package/Navigation/NavigationOption.js +6 -3
  109. package/Navigation/NavigationOverflowMenu.js +9 -6
  110. package/Navigation/NavigationUserMenu.js +3 -1
  111. package/Navigation/context.d.ts +1 -0
  112. package/NotificationCenter/NotificationCenter.d.ts +59 -9
  113. package/NotificationCenter/NotificationCenter.js +150 -54
  114. package/NotificationCenter/NotificationCenterDrawer.d.ts +56 -6
  115. package/NotificationCenter/NotificationCenterDrawer.js +6 -8
  116. package/NotificationCenter/index.d.ts +1 -1
  117. package/OverflowTooltip/OverflowTooltip.js +46 -5
  118. package/PageFooter/PageFooter.d.ts +1 -1
  119. package/PageFooter/PageFooter.js +8 -16
  120. package/Pagination/Pagination.d.ts +38 -1
  121. package/Pagination/Pagination.js +38 -1
  122. package/Pagination/PaginationPageSize.js +1 -1
  123. package/Pagination/usePagination.d.ts +20 -0
  124. package/Pagination/usePagination.js +20 -0
  125. package/Progress/Progress.d.ts +24 -1
  126. package/Progress/Progress.js +24 -1
  127. package/README.md +82 -0
  128. package/Radio/Radio.d.ts +35 -1
  129. package/Radio/Radio.js +50 -12
  130. package/Radio/RadioGroup.d.ts +2 -2
  131. package/Radio/RadioGroupContext.d.ts +3 -2
  132. package/Section/SectionGroup.d.ts +20 -0
  133. package/Section/SectionGroup.js +16 -0
  134. package/Section/index.d.ts +2 -0
  135. package/Section/index.js +1 -0
  136. package/Select/Select.d.ts +55 -1
  137. package/Select/Select.js +37 -2
  138. package/Select/typings.d.ts +9 -0
  139. package/{Selection/Selection.d.ts → SelectionCard/SelectionCard.d.ts} +23 -11
  140. package/{Selection/Selection.js → SelectionCard/SelectionCard.js} +14 -14
  141. package/SelectionCard/SelectionCardGroup.d.ts +28 -0
  142. package/SelectionCard/index.d.ts +12 -0
  143. package/SelectionCard/index.js +5 -0
  144. package/Separator/Separator.d.ts +19 -1
  145. package/Separator/Separator.js +19 -1
  146. package/Slider/Slider.d.ts +11 -0
  147. package/Slider/useSlider.d.ts +21 -0
  148. package/Spin/Spin.d.ts +14 -5
  149. package/Spin/Spin.js +6 -8
  150. package/Stepper/Stepper.d.ts +34 -1
  151. package/Stepper/Stepper.js +34 -1
  152. package/Stepper/useStepper.d.ts +18 -0
  153. package/Stepper/useStepper.js +18 -0
  154. package/Tab/Tab.d.ts +33 -1
  155. package/Tab/Tab.js +33 -1
  156. package/Table/Table.d.ts +51 -3
  157. package/Table/Table.js +52 -4
  158. package/Table/hooks/useTableDataSource.d.ts +4 -4
  159. package/Table/hooks/useTableDataSource.js +1 -1
  160. package/Tag/Tag.d.ts +27 -1
  161. package/Tag/Tag.js +27 -1
  162. package/Tag/typings.d.ts +28 -0
  163. package/Textarea/Textarea.d.ts +28 -1
  164. package/Textarea/Textarea.js +25 -1
  165. package/TimePicker/TimePicker.js +1 -1
  166. package/TimeRangePicker/TimeRangePicker.js +1 -1
  167. package/Toggle/Toggle.d.ts +34 -1
  168. package/Toggle/Toggle.js +34 -1
  169. package/Tooltip/Tooltip.d.ts +39 -1
  170. package/Tooltip/Tooltip.js +39 -1
  171. package/Tooltip/useDelayMouseEnterLeave.d.ts +17 -0
  172. package/Tooltip/useDelayMouseEnterLeave.js +17 -0
  173. package/Typography/Typography.d.ts +23 -1
  174. package/Typography/Typography.js +23 -1
  175. package/Upload/Upload.d.ts +13 -7
  176. package/Upload/Upload.js +55 -20
  177. package/Upload/UploadItem.d.ts +3 -3
  178. package/Upload/UploadItem.js +11 -8
  179. package/Upload/UploadPictureCard.d.ts +5 -0
  180. package/Upload/UploadPictureCard.js +10 -6
  181. package/Upload/Uploader.d.ts +32 -31
  182. package/Upload/Uploader.js +10 -9
  183. package/hooks/useClickAway.d.ts +16 -0
  184. package/hooks/useClickAway.js +16 -0
  185. package/hooks/useComposeRefs.d.ts +15 -0
  186. package/hooks/useComposeRefs.js +15 -0
  187. package/hooks/useDocumentEscapeKeyDown.d.ts +15 -0
  188. package/hooks/useDocumentEscapeKeyDown.js +15 -0
  189. package/hooks/useDocumentEvents.d.ts +16 -0
  190. package/hooks/useDocumentEvents.js +16 -0
  191. package/hooks/useDocumentTabKeyDown.d.ts +15 -0
  192. package/hooks/useDocumentTabKeyDown.js +15 -0
  193. package/hooks/useIsomorphicLayoutEffect.d.ts +16 -0
  194. package/hooks/useIsomorphicLayoutEffect.js +16 -0
  195. package/hooks/useLastCallback.d.ts +15 -0
  196. package/hooks/useLastCallback.js +15 -0
  197. package/hooks/useLastValue.d.ts +18 -0
  198. package/hooks/useLastValue.js +18 -0
  199. package/hooks/usePreviousValue.d.ts +14 -0
  200. package/hooks/usePreviousValue.js +14 -0
  201. package/hooks/useScrollLock.d.ts +6 -4
  202. package/hooks/useScrollLock.js +6 -4
  203. package/hooks/useTopStack.d.ts +17 -0
  204. package/hooks/useTopStack.js +17 -0
  205. package/hooks/useWindowWidth.d.ts +14 -0
  206. package/hooks/useWindowWidth.js +14 -0
  207. package/index.d.ts +6 -4
  208. package/index.js +3 -2
  209. package/llms.txt +200 -0
  210. package/package.json +5 -4
  211. package/Selection/SelectionGroup.d.ts +0 -28
  212. package/Selection/index.d.ts +0 -12
  213. package/Selection/index.js +0 -5
@@ -45,7 +45,7 @@ export type BreadcrumbLinkItemProps = Omit<NativeElementPropsWithoutKeyAndRef<'a
45
45
  */
46
46
  target?: '_blank' | '_parent' | '_self' | '_top' | string;
47
47
  };
48
- export type BreadcrumbDropdownProps = Omit<DropdownProps, 'children'> & {
48
+ export type BreadcrumbDropdownProps = Omit<DropdownProps, 'children' | 'onScroll'> & {
49
49
  className?: string;
50
50
  current?: boolean;
51
51
  href?: never;
@@ -2,7 +2,32 @@ import { ComponentOverridableForwardRefComponentPropsFactory } from '../utils/js
2
2
  import { ButtonComponent, ButtonPropsBase } from './typings';
3
3
  export type ButtonProps<C extends ButtonComponent = 'button'> = ComponentOverridableForwardRefComponentPropsFactory<ButtonComponent, C, ButtonPropsBase>;
4
4
  /**
5
- * The react component for `mezzanine` button.
5
+ * 通用按鈕元件,支援多種外觀變體與尺寸。
6
+ *
7
+ * 可透過 `variant` 控制外觀(如 `base-primary`、`outlined-primary`、`text-primary` 等),
8
+ * 透過 `iconType` 決定圖示的位置(`leading`、`trailing` 或 `icon-only`)。
9
+ * 當 `iconType` 為 `icon-only` 時,`children` 會作為 Tooltip 的提示文字顯示。
10
+ * 支援 `loading` 狀態,以及透過 `component` prop 將根元素替換為任意元件(例如 `<a>`)。
11
+ *
12
+ * @example
13
+ * ```tsx
14
+ * import Button from '@mezzanine-ui/react/Button';
15
+ * import { PlusIcon, ArrowRightIcon } from '@mezzanine-ui/icons';
16
+ *
17
+ * // 基本用法
18
+ * <Button variant="base-primary">送出</Button>
19
+ *
20
+ * // 帶有前置圖示
21
+ * <Button icon={PlusIcon} iconType="leading" variant="outlined-primary">新增項目</Button>
22
+ *
23
+ * // 僅圖示(hover 時顯示 Tooltip)
24
+ * <Button icon={PlusIcon} iconType="icon-only">新增</Button>
25
+ *
26
+ * // 以 <a> 標籤渲染(多型態用法)
27
+ * <Button component="a" href="/dashboard" icon={ArrowRightIcon} iconType="trailing">前往儀表板</Button>
28
+ * ```
29
+ *
30
+ * @see {@link ButtonGroup} 用於將多個 Button 水平排列為群組
6
31
  */
7
32
  declare const Button: import("react").ForwardRefExoticComponent<Omit<Omit<import("../utils/jsx-types").ComponentPropsWithoutKeyAndRef<"button">, keyof ButtonPropsBase> & ButtonPropsBase, "component"> & {
8
33
  component?: ButtonComponent | undefined;
package/Button/Button.js CHANGED
@@ -1,21 +1,46 @@
1
1
  'use client';
2
2
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
3
3
  import { forwardRef } from 'react';
4
- import { SpinnerIcon } from '@mezzanine-ui/icons';
5
4
  import { buttonClasses } from '@mezzanine-ui/core/button';
6
- import Icon from '../Icon/Icon.js';
5
+ import Spin from '../Spin/Spin.js';
7
6
  import Tooltip from '../Tooltip/Tooltip.js';
7
+ import Icon from '../Icon/Icon.js';
8
8
  import cx from 'clsx';
9
9
 
10
10
  /**
11
- * The react component for `mezzanine` button.
11
+ * 通用按鈕元件,支援多種外觀變體與尺寸。
12
+ *
13
+ * 可透過 `variant` 控制外觀(如 `base-primary`、`outlined-primary`、`text-primary` 等),
14
+ * 透過 `iconType` 決定圖示的位置(`leading`、`trailing` 或 `icon-only`)。
15
+ * 當 `iconType` 為 `icon-only` 時,`children` 會作為 Tooltip 的提示文字顯示。
16
+ * 支援 `loading` 狀態,以及透過 `component` prop 將根元素替換為任意元件(例如 `<a>`)。
17
+ *
18
+ * @example
19
+ * ```tsx
20
+ * import Button from '@mezzanine-ui/react/Button';
21
+ * import { PlusIcon, ArrowRightIcon } from '@mezzanine-ui/icons';
22
+ *
23
+ * // 基本用法
24
+ * <Button variant="base-primary">送出</Button>
25
+ *
26
+ * // 帶有前置圖示
27
+ * <Button icon={PlusIcon} iconType="leading" variant="outlined-primary">新增項目</Button>
28
+ *
29
+ * // 僅圖示(hover 時顯示 Tooltip)
30
+ * <Button icon={PlusIcon} iconType="icon-only">新增</Button>
31
+ *
32
+ * // 以 <a> 標籤渲染(多型態用法)
33
+ * <Button component="a" href="/dashboard" icon={ArrowRightIcon} iconType="trailing">前往儀表板</Button>
34
+ * ```
35
+ *
36
+ * @see {@link ButtonGroup} 用於將多個 Button 水平排列為群組
12
37
  */
13
38
  const Button = forwardRef(function Button(props, ref) {
14
39
  const { children, className, component: Component = 'button', disabled = false, disabledTooltip = false, icon, iconType, loading = false, onClick, size = 'main', tooltipPosition = 'bottom', variant = 'base-primary', ...rest } = props;
15
40
  const isIconOnly = iconType === 'icon-only';
16
41
  const showTooltip = isIconOnly && !disabledTooltip && Boolean(children);
17
42
  // Loading 狀態下的 icon
18
- const loadingIcon = jsx(Icon, { icon: SpinnerIcon, spin: true, size: 16 });
43
+ const loadingIcon = jsx(Spin, { loading: true, size: "minor" });
19
44
  // 渲染 icon 內容
20
45
  const renderIcon = () => {
21
46
  if (loading) {
@@ -36,7 +61,10 @@ const Button = forwardRef(function Button(props, ref) {
36
61
  if (!disabled && !loading && onClick) {
37
62
  onClick(event);
38
63
  }
39
- }, onMouseEnter: tooltipProps === null || tooltipProps === void 0 ? void 0 : tooltipProps.onMouseEnter, onMouseLeave: tooltipProps === null || tooltipProps === void 0 ? void 0 : tooltipProps.onMouseLeave, children: loading ? (renderIcon()) : (jsxs(Fragment, { children: [(iconType === 'leading' || isIconOnly) && renderIcon(), !isIconOnly && children, iconType === 'trailing' && renderIcon()] })) }));
64
+ }, ...(tooltipProps && {
65
+ onMouseEnter: tooltipProps.onMouseEnter,
66
+ onMouseLeave: tooltipProps.onMouseLeave,
67
+ }), children: loading ? (renderIcon()) : (jsxs(Fragment, { children: [(iconType === 'leading' || isIconOnly) && renderIcon(), !isIconOnly && children, iconType === 'trailing' && renderIcon()] })) }));
40
68
  if (showTooltip) {
41
69
  return (jsx(Tooltip, { options: { placement: tooltipPosition }, title: children, children: (tooltipProps) => buttonElement(tooltipProps) }));
42
70
  }
package/COMPONENTS.md ADDED
@@ -0,0 +1,267 @@
1
+ # Mezzanine UI 元件目錄
2
+
3
+ > 此檔案為 AI 工具最佳化的元件索引,幫助快速定位元件用途與搭配關係。
4
+
5
+ ## General(基礎)
6
+
7
+ | 元件 | 匯入名稱 | 說明 |
8
+ | ---------------- | ------------------ | ------------------------------------------------------------------------------------- |
9
+ | Button | `Button` | 動作觸發按鈕,支援 primary / secondary / ghost / destructive / inverse 變體與多種尺寸 |
10
+ | ButtonGroup | `ButtonGroup` | 將多個 Button 組合為群組,支援水平或垂直排列 |
11
+ | Cropper | `Cropper` | 圖片裁切元件,支援自訂裁切區域與輸出尺寸 |
12
+ | Icon | `Icon` | SVG 圖示元件,搭配 `@mezzanine-ui/icons` 使用,支援顏色與大小控制 |
13
+ | Layout | `Layout` | 頁面整體佈局容器,提供左側面板、主要內容區、右側面板的三欄結構 |
14
+ | LayoutLeftPanel | `LayoutLeftPanel` | 佈局左側面板區塊 |
15
+ | LayoutMain | `LayoutMain` | 佈局主要內容區塊 |
16
+ | LayoutRightPanel | `LayoutRightPanel` | 佈局右側面板區塊 |
17
+ | Separator | `Separator` | 水平或垂直分隔線,用於視覺上區隔內容區塊 |
18
+ | Typography | `Typography` | 文字排版元件,支援 h1–h6 / body / caption 等語意層級與顏色變體 |
19
+
20
+ ## Navigation(導航)
21
+
22
+ | 元件 | 匯入名稱 | 說明 |
23
+ | ------------------------ | -------------------------- | ------------------------------------------------------------ |
24
+ | Breadcrumb | `Breadcrumb` | 麵包屑導航,顯示當前頁面的層級路徑,可自訂分隔符 |
25
+ | Drawer | `Drawer` | 側邊抽屜,從螢幕四個方向滑入,搭配 Portal 與 Backdrop 使用 |
26
+ | Navigation | `Navigation` | 側邊主導航容器,包含標頭、選項群組、頁尾區域 |
27
+ | NavigationFooter | `NavigationFooter` | 導航頁尾區域,通常放置帳號資訊或設定入口 |
28
+ | NavigationHeader | `NavigationHeader` | 導航標頭區域,通常放置 Logo 或品牌名稱 |
29
+ | NavigationIconButton | `NavigationIconButton` | 導航中的圖示按鈕,用於收合或觸發動作 |
30
+ | NavigationOption | `NavigationOption` | 導航中的單一選項連結 |
31
+ | NavigationOptionCategory | `NavigationOptionCategory` | 導航選項群組標題,用於分類導航項目 |
32
+ | NavigationUserMenu | `NavigationUserMenu` | 導航中的使用者選單,顯示頭像與帳號資訊 |
33
+ | PageFooter | `PageFooter` | 頁面底部頁尾區塊 |
34
+ | PageHeader | `PageHeader` | 頁面頂部標頭區塊,通常包含頁面標題與操作按鈕 |
35
+ | Step | `Step` | Stepper 中的單一步驟節點 |
36
+ | Stepper | `Stepper` | 步驟條元件,引導使用者完成多步驟流程,搭配 `useStepper` hook |
37
+ | Tab | `Tab` | 分頁容器,管理多個 TabItem 的切換狀態 |
38
+ | TabItem | `TabItem` | 分頁中的單一頁籤項目 |
39
+
40
+ ## Data Display(資料展示)
41
+
42
+ | 元件 | 匯入名稱 | 說明 |
43
+ | --------------------------- | ----------------------------- | ---------------------------------------------------------------------------------- |
44
+ | Accordion | `Accordion` | 手風琴展開/收合元件,包含標題與內容區域 |
45
+ | AccordionActions | `AccordionActions` | Accordion 底部操作按鈕區域 |
46
+ | AccordionContent | `AccordionContent` | Accordion 展開後的內容區域 |
47
+ | AccordionGroup | `AccordionGroup` | 將多個 Accordion 組合為群組 |
48
+ | AccordionTitle | `AccordionTitle` | Accordion 的標題列,點擊可切換展開狀態 |
49
+ | Badge | `Badge` | 徽章元件,顯示數字或狀態標記 |
50
+ | BadgeContainer | `BadgeContainer` | 將 Badge 疊加在子元件右上角的容器 |
51
+ | BaseCard | `BaseCard` | 基礎卡片元件,支援縮圖、動作選單、toggle 等多種配置 |
52
+ | BaseCardSkeleton | `BaseCardSkeleton` | BaseCard 的骨架屏載入佔位元件 |
53
+ | CardGroup | `CardGroup` | 卡片群組容器,支援 grid 佈局與載入狀態 |
54
+ | FourThumbnailCard | `FourThumbnailCard` | 四縮圖卡片,適合展示多媒體內容集合 |
55
+ | FourThumbnailCardSkeleton | `FourThumbnailCardSkeleton` | FourThumbnailCard 的骨架屏 |
56
+ | QuickActionCard | `QuickActionCard` | 快速操作卡片,支援圖示與標題兩種模式 |
57
+ | QuickActionCardSkeleton | `QuickActionCardSkeleton` | QuickActionCard 的骨架屏 |
58
+ | SingleThumbnailCard | `SingleThumbnailCard` | 單縮圖卡片,適合展示單一媒體項目 |
59
+ | SingleThumbnailCardSkeleton | `SingleThumbnailCardSkeleton` | SingleThumbnailCard 的骨架屏 |
60
+ | Thumbnail | `Thumbnail` | 縮圖元件,用於卡片內部呈現圖片預覽 |
61
+ | Description | `Description` | 描述列表元件,以 key-value 形式呈現資料 |
62
+ | DescriptionContent | `DescriptionContent` | 描述列表的值(value)欄位 |
63
+ | DescriptionGroup | `DescriptionGroup` | 描述列表群組,管理多個 Description 的佈局 |
64
+ | DescriptionTitle | `DescriptionTitle` | 描述列表的鍵(key)欄位 |
65
+ | Empty | `Empty` | 空狀態元件,在無資料時顯示提示圖示與文字 |
66
+ | OverflowCounterTag | `OverflowCounterTag` | 顯示溢出項目計數的標籤,搭配 OverflowTooltip 使用 |
67
+ | Pagination | `Pagination` | 分頁元件,包含頁碼、跳頁、每頁筆數等子元件,搭配 `usePagination` hook |
68
+ | PaginationItem | `PaginationItem` | 分頁中的單一頁碼項目 |
69
+ | PaginationJumper | `PaginationJumper` | 分頁中的跳頁輸入框 |
70
+ | PaginationPageSize | `PaginationPageSize` | 分頁中的每頁筆數選擇器 |
71
+ | Section | `Section` | 內容分區元件,提供標題與內容的區塊佈局 |
72
+ | Table | `Table` | 功能完整的表格元件,支援排序、篩選、選取、展開、虛擬捲動、拖曳、固定欄、可調欄寬等 |
73
+ | Tag | `Tag` | 標籤元件,用於分類或標記,支援多種顏色與可關閉 |
74
+ | TagGroup | `TagGroup` | 標籤群組容器 |
75
+ | Tooltip | `Tooltip` | 文字提示泡泡,懸停時顯示說明文字,基於 Popper 定位 |
76
+
77
+ ## Data Entry(資料輸入)
78
+
79
+ | 元件 | 匯入名稱 | 說明 | 相關 Hooks |
80
+ | ------------------------- | --------------------------- | ---------------------------------------------------------------------------------------- | --------------------------------------------------------- |
81
+ | AutoComplete | `AutoComplete` | 自動完成輸入,輸入時透過 Dropdown 顯示建議選項 | `useAutoCompleteValueControl` |
82
+ | CheckAll | `CheckAll` | 「全選」核取方塊,與 CheckboxGroup 配合管理全選/取消全選狀態 | `useCheckboxControlValue` |
83
+ | Checkbox | `Checkbox` | 核取方塊,支援 indeterminate 狀態 | `useCheckboxControlValue` |
84
+ | CheckboxGroup | `CheckboxGroup` | 核取方塊群組,管理多個選項的勾選狀態,支援水平/垂直排列 | `useCheckboxControlValue` |
85
+ | DatePicker | `DatePicker` | 日期選擇器,點擊觸發 Calendar 面板選取日期 | `usePickerValue` |
86
+ | DatePickerCalendar | `DatePickerCalendar` | DatePicker 內部的日曆面板,可獨立使用 | — |
87
+ | DateRangePicker | `DateRangePicker` | 日期範圍選擇器,選取起始與結束日期 | `useDateRangePickerValue`, `useDateRangeCalendarControls` |
88
+ | DateRangePickerCalendar | `DateRangePickerCalendar` | DateRangePicker 內部的雙月日曆面板,可獨立使用 | — |
89
+ | DateTimePicker | `DateTimePicker` | 日期時間選擇器,同時選取日期與時間 | `usePickerValue` |
90
+ | DateTimeRangePicker | `DateTimeRangePicker` | 日期時間範圍選擇器,選取起始與結束的日期時間 | — |
91
+ | Filter | `Filter` | 單一篩選條件元件,搭配 FilterArea 使用 | — |
92
+ | FilterArea | `FilterArea` | 篩選器容器,管理多個 FilterLine 的展示與收合 | — |
93
+ | FilterLine | `FilterLine` | 篩選器中的單行條件列,包含多個 Filter | — |
94
+ | FormControlContext | `FormControlContext` | Form 的 React Context Provider,向下傳遞 label/hint/error 等表單控制狀態 | — |
95
+ | FormField | `FormField` | 表單欄位包裝器,提供 label、hint、error 的標準化佈局,包裝任何輸入元件 | — |
96
+ | FormHintText | `FormHintText` | 表單欄位的提示說明文字 | — |
97
+ | FormLabel | `FormLabel` | 表單欄位的標籤文字 | — |
98
+ | Input | `Input` | 文字輸入框,支援 clearable、number、password、search、select、measure、action 等多種變體 | `useInputControlValue`, `useInputWithClearControlValue` |
99
+ | MultipleDatePicker | `MultipleDatePicker` | 多選日期選擇器,可選取多個不連續日期 | `useMultipleDatePickerValue` |
100
+ | MultipleDatePickerTrigger | `MultipleDatePickerTrigger` | MultipleDatePicker 的觸發輸入區域,可獨立使用 | — |
101
+ | PickerTrigger | `PickerTrigger` | 選取器的觸發輸入框基底元件 | `usePickerValue`, `usePickerDocumentEventClose` |
102
+ | RangePickerTrigger | `RangePickerTrigger` | 範圍選取器的雙輸入框觸發元件 | — |
103
+ | Radio | `Radio` | 單選按鈕 | `useRadioControlValue` |
104
+ | RadioGroup | `RadioGroup` | 單選按鈕群組,管理互斥選取,支援水平/垂直排列 | `useRadioControlValue` |
105
+ | Cascader | `Cascader` | 級聯選擇器,支援多層次的樹狀選項選取 | — |
106
+ | CascaderPanel | `CascaderPanel` | Cascader 內部的選項面板,可獨立使用 | — |
107
+ | Select | `Select` | 下拉選擇器,支援單選與多選,透過 Dropdown 呈現選項 | `useSelectValueControl` |
108
+ | SelectControlContext | `SelectControlContext` | Select 的受控狀態 Context | — |
109
+ | SelectTrigger | `SelectTrigger` | Select 的觸發輸入區域,可獨立組合使用 | — |
110
+ | SelectTriggerTags | `SelectTriggerTags` | 多選 Select 的標籤顯示區域 | — |
111
+ | SelectionCard | `SelectionCard` | 可選取的卡片元件,作為 Checkbox/Radio 的卡片式替代 | — |
112
+ | Slider | `Slider` | 滑桿元件,支援單點與範圍兩種模式 | `useSlider` |
113
+ | Toggle | `Toggle` | 切換開關元件,用於表示開/關二元狀態 | `useSwitchControlValue` |
114
+ | Textarea | `Textarea` | 多行文字輸入框,支援自動調整高度與字數限制 | `useInputControlValue` |
115
+ | TextField | `TextField` | 文字欄位基底元件,提供通用的邊框/尺寸/狀態樣式 | — |
116
+ | TimePicker | `TimePicker` | 時間選擇器,點擊觸發 TimePanel 面板選取時間 | `usePickerValue` |
117
+ | TimePickerPanel | `TimePickerPanel` | TimePicker 內部的時間面板,可獨立使用 | — |
118
+ | TimeRangePicker | `TimeRangePicker` | 時間範圍選擇器,選取起始與結束時間 | `useTimeRangePickerValue` |
119
+ | Upload | `Upload` | 檔案上傳元件,支援點擊與拖曳上傳 | — |
120
+ | UploadItem | `UploadItem` | 上傳列表中的單一檔案項目,顯示檔名與上傳狀態 | — |
121
+ | UploadPictureCard | `UploadPictureCard` | 圖片上傳的卡片式預覽元件 | — |
122
+ | Uploader | `Uploader` | 上傳觸發區域基底元件,可自訂觸發按鈕樣式 | — |
123
+
124
+ ## Feedback(回饋)
125
+
126
+ | 元件 | 匯入名稱 | 說明 |
127
+ | ------------------------ | -------------------------- | --------------------------------------------------------------------- |
128
+ | InlineMessage | `InlineMessage` | 行內訊息提示,支援 success / warning / error / info 嚴重程度 |
129
+ | InlineMessageGroup | `InlineMessageGroup` | 多則行內訊息的群組顯示 |
130
+ | Message | `Message` | 全域訊息通知,從頁面頂部彈出,自動消失 |
131
+ | Modal | `Modal` | 對話框,使用 Portal 渲染在 DOM 外層,包含 Header、Body、Footer 子元件 |
132
+ | ModalBodyForVerification | `ModalBodyForVerification` | 用於確認/刪除操作的 Modal Body,含警告圖示 |
133
+ | ModalFooter | `ModalFooter` | Modal 底部操作按鈕區域 |
134
+ | ModalHeader | `ModalHeader` | Modal 頂部標題區域 |
135
+ | NotificationCenter | `NotificationCenter` | 通知中心面板,展示系統通知列表 |
136
+ | Progress | `Progress` | 進度條元件,支援 line / circle 兩種類型與多種狀態 |
137
+ | ResultState | `ResultState` | 結果狀態頁,顯示操作成功/失敗/空等結果情境 |
138
+ | Skeleton | `Skeleton` | 骨架屏佔位元件,在內容載入前顯示灰色佔位區塊 |
139
+ | Spin | `Spin` | 載入中旋轉動畫,支援包裹子元件或獨立使用 |
140
+
141
+ ## Others(其他)
142
+
143
+ | 元件 | 匯入名稱 | 說明 |
144
+ | -------------- | ---------------- | -------------------------------------------------- |
145
+ | AlertBanner | `AlertBanner` | 警示橫幅,固定於頁面頂部,用於系統級別的重要通知 |
146
+ | Anchor | `Anchor` | 錨點連結元件,用於頁面內跳轉 |
147
+ | AnchorGroup | `AnchorGroup` | 錨點群組,管理多個 Anchor 並同步捲動位置的高亮狀態 |
148
+ | Backdrop | `Backdrop` | 遮罩背景層,用於 Modal、Drawer 等覆蓋元件的背景 |
149
+ | FloatingButton | `FloatingButton` | 懸浮操作按鈕,固定在頁面右下角,觸發主要操作 |
150
+
151
+ ## Utility(工具)
152
+
153
+ | 元件 | 匯入名稱 | 說明 |
154
+ | ---------------------- | ------------------------ | ------------------------------------------------------------------------------------ |
155
+ | Calendar | `Calendar` | 完整日曆元件,支援日/週/月/季/半年/年視圖切換 |
156
+ | RangeCalendar | `RangeCalendar` | 範圍日曆,支援選取起始至結束日期範圍 |
157
+ | CalendarCell | `CalendarCell` | 日曆中的單一日期格子 |
158
+ | CalendarConfigProvider | `CalendarConfigProvider` | 日曆全域設定提供者,設定語系與格式 |
159
+ | CalendarControls | `CalendarControls` | 日曆的月份/年份切換控制列 |
160
+ | CalendarDayOfWeek | `CalendarDayOfWeek` | 日曆的週幾標題列 |
161
+ | CalendarDays | `CalendarDays` | 日曆的日期格子區域 |
162
+ | CalendarHalfYears | `CalendarHalfYears` | 日曆的半年視圖 |
163
+ | CalendarMonths | `CalendarMonths` | 日曆的月份視圖 |
164
+ | CalendarQuarters | `CalendarQuarters` | 日曆的季度視圖 |
165
+ | CalendarWeeks | `CalendarWeeks` | 日曆的週視圖 |
166
+ | CalendarYears | `CalendarYears` | 日曆的年份視圖 |
167
+ | Dropdown | `Dropdown` | 下拉選單面板,由 Select、AutoComplete、Cascader 等元件內部使用 |
168
+ | DropdownAction | `DropdownAction` | Dropdown 中的操作按鈕項目 |
169
+ | DropdownItem | `DropdownItem` | Dropdown 中的標準選項項目 |
170
+ | DropdownItemCard | `DropdownItemCard` | Dropdown 中的卡片式選項項目 |
171
+ | DropdownStatus | `DropdownStatus` | Dropdown 的狀態提示顯示(空狀態、載入中等) |
172
+ | Popper | `Popper` | 定位浮層元件,基於 Floating UI,Tooltip / Dropdown 的定位基底 |
173
+ | Portal | `Portal` | 將子元件渲染到指定 DOM 節點,Modal、Drawer 使用此元件脫離文件流 |
174
+ | TimePanel | `TimePanel` | 時間選取面板,包含時/分/秒的滾輪選取 |
175
+ | TimePanelColumn | `TimePanelColumn` | TimePanel 中的單一時間欄(時、分或秒)的滾輪列 |
176
+ | Transition | `Transition` | 動畫過渡基底元件,提供 Collapse / Fade / Rotate / Scale / Slide / Translate 六種動畫 |
177
+ | Collapse | `Collapse` | 收合展開動畫(高度過渡) |
178
+ | Fade | `Fade` | 淡入淡出動畫 |
179
+ | Rotate | `Rotate` | 旋轉動畫 |
180
+ | Scale | `Scale` | 縮放動畫 |
181
+ | Slide | `Slide` | 滑動動畫,Drawer 使用此元件進行進出場 |
182
+ | Translate | `Translate` | 位移動畫 |
183
+
184
+ ---
185
+
186
+ ## 元件關係圖
187
+
188
+ - **Select** 內部使用 Dropdown 呈現選項面板,SelectTrigger 作為輸入觸發區域
189
+ - **AutoComplete** 使用 Dropdown 顯示建議選項,Input 作為觸發器
190
+ - **Cascader** 使用 Dropdown 呈現樹狀選項面板,CascaderPanel 為面板主體
191
+ - **FormField** 包裝任何輸入元件(Input、Select、Checkbox 等),透過 FormControlContext 向下傳遞 label / hint / error 狀態
192
+ - **Modal** 使用 Portal 渲染在 DOM 樹外層,Backdrop 作為遮罩背景
193
+ - **Drawer** 使用 Portal + Backdrop + Slide 動畫組合呈現側邊抽屜
194
+ - **DatePicker** 內部使用 Calendar + PickerTrigger
195
+ - **DateRangePicker** 內部使用 RangeCalendar + RangePickerTrigger
196
+ - **DateTimePicker** 內部使用 Calendar + TimePanel + PickerTrigger
197
+ - **DateTimeRangePicker** 內部使用 RangeCalendar + TimePanel + RangePickerTrigger
198
+ - **TimePicker** 內部使用 TimePanel + PickerTrigger
199
+ - **TimeRangePicker** 內部使用 TimePanel + RangePickerTrigger
200
+ - **MultipleDatePicker** 使用 Calendar + MultipleDatePickerTrigger
201
+ - **Table** 可搭配 Pagination 進行分頁;搭配 `useTableRowSelection` 管理列選取;搭配 `useTableDataSource` 管理資料
202
+ - **Tooltip** 使用 Popper 定位浮層,`useDelayMouseEnterLeave` 管理延遲顯示
203
+ - **Navigation** 由 NavigationHeader、NavigationOptionCategory、NavigationOption、NavigationFooter、NavigationUserMenu 組合構成
204
+ - **Accordion** 由 AccordionTitle、AccordionContent、AccordionActions 組合;AccordionGroup 管理多個 Accordion
205
+ - **Description** 由 DescriptionTitle、DescriptionContent 組合;DescriptionGroup 管理多組
206
+ - **Upload** 由 Uploader(觸發區)、UploadItem(列表項)、UploadPictureCard(圖片預覽卡)組合
207
+ - **Stepper** 由多個 Step 組合,搭配 `useStepper` hook 管理當前步驟狀態
208
+ - **Pagination** 可組合 PaginationItem、PaginationJumper、PaginationPageSize,搭配 `usePagination` hook
209
+ - **FilterArea** 由 FilterLine 與 Filter 組合,管理多行篩選條件
210
+ - **AnchorGroup** 包含多個 Anchor,監聽捲動事件同步高亮當前錨點
211
+
212
+ ---
213
+
214
+ ## Form Hook ↔ 元件對應
215
+
216
+ | Hook | 搭配元件 | 用途 |
217
+ | ------------------------------- | ----------------------- | -------------------------- |
218
+ | `useInputControlValue` | Input、Textarea | 受控字串值管理 |
219
+ | `useInputWithClearControlValue` | Input(clearable) | 含清除按鈕的受控輸入值管理 |
220
+ | `useSelectValueControl` | Select | 受控單選 / 多選值管理 |
221
+ | `useCheckboxControlValue` | Checkbox、CheckboxGroup | 受控勾選狀態管理 |
222
+ | `useRadioControlValue` | Radio、RadioGroup | 受控 radio 選取管理 |
223
+ | `useSwitchControlValue` | Toggle | 受控開關狀態管理 |
224
+ | `useAutoCompleteValueControl` | AutoComplete | 受控自動完成值管理 |
225
+ | `useCustomControlValue` | 任意元件 | 泛用受控值 hook |
226
+ | `useControlValueState` | 任意元件 | 基礎受控 / 非受控狀態管理 |
227
+
228
+ ---
229
+
230
+ ## 通用 Hooks
231
+
232
+ | Hook | 說明 |
233
+ | ------------------------------ | ----------------------------------------------------- |
234
+ | `useClickAway` | 偵測點擊元件外部區域 |
235
+ | `useComposeRefs` | 合併多個 ref |
236
+ | `useDocumentEscapeKeyDown` | 監聽全域 Escape 鍵事件 |
237
+ | `useDocumentEvents` | 監聽全域 DOM 事件 |
238
+ | `useDocumentTabKeyDown` | 監聽全域 Tab 鍵事件 |
239
+ | `useIsomorphicLayoutEffect` | SSR 安全的 `useLayoutEffect` |
240
+ | `useLastCallback` | 保持 callback 參照穩定,避免 stale closure |
241
+ | `useLastValue` | 取得最新的值參照 |
242
+ | `usePreviousValue` | 取得前一次渲染的值 |
243
+ | `useScrollLock` | 鎖定頁面捲動(Modal、Drawer 開啟時使用) |
244
+ | `useTopStack` | 管理 z-index 堆疊順序(覆蓋元件使用) |
245
+ | `useWindowWidth` | 監聽視窗寬度變化 |
246
+ | `useDelayMouseEnterLeave` | 延遲觸發 mouseEnter / mouseLeave(Tooltip 使用) |
247
+ | `useStepper` | 管理 Stepper 的當前步驟與流程控制 |
248
+ | `usePagination` | 管理分頁狀態(當前頁、總頁數計算) |
249
+ | `useSlider` | 管理 Slider 的拖曳與值計算 |
250
+ | `usePickerValue` | 管理選取器(DatePicker、TimePicker 等)的開關與值狀態 |
251
+ | `usePickerDocumentEventClose` | 偵測點擊外部或按 Escape 關閉選取器面板 |
252
+ | `useTabKeyClose` | 按 Tab 鍵關閉選取器面板 |
253
+ | `useDateRangePickerValue` | 管理日期範圍選取器的值狀態 |
254
+ | `useDateRangeCalendarControls` | 管理日期範圍日曆的月份切換 |
255
+ | `useMultipleDatePickerValue` | 管理多選日期選擇器的值狀態 |
256
+ | `useTimeRangePickerValue` | 管理時間範圍選擇器的值狀態 |
257
+ | `useCalendarContext` | 取得 Calendar 的 Context 值 |
258
+ | `useCalendarControlModifiers` | 提供日曆控制列的日期修改函數 |
259
+ | `useCalendarControls` | 管理日曆的月份 / 年份切換狀態 |
260
+ | `useCalendarModeStack` | 管理日曆視圖模式的堆疊切換(日→月→年) |
261
+ | `useRangeCalendarControls` | 管理範圍日曆的月份切換 |
262
+ | `useModalContainer` | 取得 Modal 的 Portal 容器節點 |
263
+ | `useTableContext` | 取得 Table 的主要 Context |
264
+ | `useTableDataContext` | 取得 Table 的資料 Context |
265
+ | `useTableSuperContext` | 取得 Table 的上層 Context |
266
+ | `useTableDataSource` | 管理 Table 的資料來源、排序與篩選 |
267
+ | `useTableRowSelection` | 管理 Table 的列選取狀態 |
@@ -1,4 +1,22 @@
1
1
  import { DateType, CalendarMode } from '@mezzanine-ui/core/calendar';
2
+ /**
3
+ * 管理日曆導航控制項狀態的 Hook。
4
+ *
5
+ * 維護目前顯示的參考日期(`referenceDate`)與顯示模式(`currentMode`),
6
+ * 並提供上一頁、下一頁、雙箭頭跳轉以及切換至月份/年份選擇模式等操作。
7
+ *
8
+ * @example
9
+ * ```tsx
10
+ * import { useCalendarControls } from '@mezzanine-ui/react';
11
+ *
12
+ * const {
13
+ * currentMode, referenceDate,
14
+ * onPrev, onNext, onMonthControlClick, onYearControlClick, popModeStack,
15
+ * } = useCalendarControls(today, 'day');
16
+ * ```
17
+ *
18
+ * @see {@link Calendar} 搭配的元件
19
+ */
2
20
  export declare function useCalendarControls(referenceDateProp: DateType, mode?: CalendarMode): {
3
21
  currentMode: CalendarMode;
4
22
  onMonthControlClick: () => void;
@@ -3,6 +3,24 @@ import { useState, useEffect, useMemo, useCallback } from 'react';
3
3
  import { useCalendarControlModifiers } from './useCalendarControlModifiers.js';
4
4
  import { useCalendarModeStack } from './useCalendarModeStack.js';
5
5
 
6
+ /**
7
+ * 管理日曆導航控制項狀態的 Hook。
8
+ *
9
+ * 維護目前顯示的參考日期(`referenceDate`)與顯示模式(`currentMode`),
10
+ * 並提供上一頁、下一頁、雙箭頭跳轉以及切換至月份/年份選擇模式等操作。
11
+ *
12
+ * @example
13
+ * ```tsx
14
+ * import { useCalendarControls } from '@mezzanine-ui/react';
15
+ *
16
+ * const {
17
+ * currentMode, referenceDate,
18
+ * onPrev, onNext, onMonthControlClick, onYearControlClick, popModeStack,
19
+ * } = useCalendarControls(today, 'day');
20
+ * ```
21
+ *
22
+ * @see {@link Calendar} 搭配的元件
23
+ */
6
24
  function useCalendarControls(referenceDateProp, mode) {
7
25
  const [referenceDate, setReferenceDate] = useState(referenceDateProp);
8
26
  useEffect(() => {
@@ -66,7 +66,7 @@ const FourThumbnailCard = forwardRef(function FourThumbnailCard(props, ref) {
66
66
  };
67
67
  // Filter out type-specific props before spreading
68
68
  const { actionName: _actionName, onActionClick: _onActionClick, onOptionSelect: _onOptionSelect, options: _options, type: _type, ...componentProps } = rest;
69
- return (jsxs(Component, { ...componentProps, ref: ref, className: cx(cardClasses.thumbnail, className), children: [jsxs("div", { className: cardClasses.fourThumbnail, children: [tag && jsx("div", { className: cardClasses.thumbnailTag, children: tag }), hasPersonalAction && currentPersonalActionIcon && (jsx("button", { "aria-label": "Personal Action", className: cardClasses.thumbnailPersonalAction, onClick: handlePersonalActionClick, type: "button", children: jsx(Icon, { icon: currentPersonalActionIcon, size: 24 }) })), thumbnails, emptyPlaceholders] }), jsx(ThumbnailCardInfo, { filetype: filetype, subtitle: subtitle, title: title, type: type, ...getInfoProps() })] }));
69
+ return (jsxs(Component, { ...componentProps, ref: ref, className: cx(cardClasses.thumbnail, className), children: [jsxs("div", { className: cardClasses.fourThumbnail, children: [tag && jsx("div", { className: cardClasses.thumbnailTag, children: tag }), hasPersonalAction && currentPersonalActionIcon && (jsx("button", { "aria-label": "Personal Action", className: cardClasses.thumbnailPersonalAction, onClick: handlePersonalActionClick, type: "button", children: jsx(Icon, { icon: currentPersonalActionIcon, size: 16 }) })), thumbnails, emptyPlaceholders] }), jsx(ThumbnailCardInfo, { filetype: filetype, subtitle: subtitle, title: title, type: type, ...getInfoProps() })] }));
70
70
  });
71
71
  FourThumbnailCard.displayName = 'FourThumbnailCard';
72
72
 
@@ -37,7 +37,7 @@ const SingleThumbnailCard = forwardRef(function SingleThumbnailCard(props, ref)
37
37
  };
38
38
  // Filter out type-specific props before spreading
39
39
  const { actionName: _actionName, onActionClick: _onActionClick, onOptionSelect: _onOptionSelect, options: _options, type: _type, ...componentProps } = rest;
40
- return (jsxs(Component, { ...componentProps, ref: ref, className: cx(cardClasses.thumbnail, className), children: [jsxs("div", { className: cardClasses.singleThumbnail, children: [tag && jsx("div", { className: cardClasses.thumbnailTag, children: tag }), hasPersonalAction && currentPersonalActionIcon && (jsx("button", { "aria-label": "Personal Action", className: cardClasses.thumbnailPersonalAction, onClick: handlePersonalActionClick, type: "button", children: jsx(Icon, { icon: currentPersonalActionIcon, size: 24 }) })), child, jsx("div", { className: cardClasses.singleThumbnailOverlay })] }), jsx(ThumbnailCardInfo, { filetype: filetype, subtitle: subtitle, title: title, type: type, ...getInfoProps() })] }));
40
+ return (jsxs(Component, { ...componentProps, ref: ref, className: cx(cardClasses.thumbnail, className), children: [jsxs("div", { className: cardClasses.singleThumbnail, children: [tag && jsx("div", { className: cardClasses.thumbnailTag, children: tag }), hasPersonalAction && currentPersonalActionIcon && (jsx("button", { "aria-label": "Personal Action", className: cardClasses.thumbnailPersonalAction, onClick: handlePersonalActionClick, type: "button", children: jsx(Icon, { icon: currentPersonalActionIcon, size: 16 }) })), child, jsx("div", { className: cardClasses.singleThumbnailOverlay })] }), jsx(ThumbnailCardInfo, { filetype: filetype, subtitle: subtitle, title: title, type: type, ...getInfoProps() })] }));
41
41
  });
42
42
  SingleThumbnailCard.displayName = 'SingleThumbnailCard';
43
43
 
@@ -126,7 +126,36 @@ export interface CheckboxProps extends Omit<NativeElementPropsWithoutKeyAndRef<'
126
126
  size?: CheckboxSize<NonNullable<CheckboxPropsBase['mode']>>;
127
127
  }
128
128
  /**
129
- * The react component for `mezzanine` checkbox.
129
+ * 核取方塊元件,支援預設(default)與晶片(chip)兩種模式。
130
+ *
131
+ * 提供受控與非受控兩種使用方式,可透過 `checked`/`defaultChecked` 切換狀態。
132
+ * 在 `CheckboxGroup` 內使用時,必須提供 `value` 屬性;支援 `indeterminate` 中間狀態
133
+ * 及 `withEditInput` 勾選後顯示附加輸入框的功能。
134
+ *
135
+ * @example
136
+ * ```tsx
137
+ * import Checkbox from '@mezzanine-ui/react/Checkbox';
138
+ *
139
+ * // 基本用法(非受控)
140
+ * <Checkbox label="同意條款" defaultChecked />
141
+ *
142
+ * // 受控用法
143
+ * const [checked, setChecked] = useState(false);
144
+ * <Checkbox
145
+ * checked={checked}
146
+ * label="訂閱電子報"
147
+ * onChange={(e) => setChecked(e.target.checked)}
148
+ * />
149
+ *
150
+ * // Chip 模式
151
+ * <Checkbox label="熱門" mode="chip" size="sub" />
152
+ *
153
+ * // 含附加輸入框
154
+ * <Checkbox label="其他" withEditInput editableInput={{ placeholder: '請輸入其他選項' }} />
155
+ * ```
156
+ *
157
+ * @see {@link CheckboxGroup} 管理多個核取方塊的群組元件
158
+ * @see {@link useCheckboxControlValue} 核取方塊受控值的自訂 Hook
130
159
  */
131
160
  declare const Checkbox: import("react").ForwardRefExoticComponent<CheckboxProps & import("react").RefAttributes<HTMLLabelElement>>;
132
161
  export default Checkbox;
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
  import { jsxs, jsx } from 'react/jsx-runtime';
3
- import { forwardRef, useContext, useId, useEffect, useMemo, useRef } from 'react';
3
+ import { forwardRef, useContext, useId, useEffect, useMemo, useRef, useCallback } from 'react';
4
4
  import { checkboxClasses } from '@mezzanine-ui/core/checkbox';
5
5
  import { CheckedIcon } from '@mezzanine-ui/icons';
6
6
  import { useCheckboxControlValue } from '../Form/useCheckboxControlValue.js';
@@ -12,7 +12,36 @@ import Input from '../Input/Input.js';
12
12
  import cx from 'clsx';
13
13
 
14
14
  /**
15
- * The react component for `mezzanine` checkbox.
15
+ * 核取方塊元件,支援預設(default)與晶片(chip)兩種模式。
16
+ *
17
+ * 提供受控與非受控兩種使用方式,可透過 `checked`/`defaultChecked` 切換狀態。
18
+ * 在 `CheckboxGroup` 內使用時,必須提供 `value` 屬性;支援 `indeterminate` 中間狀態
19
+ * 及 `withEditInput` 勾選後顯示附加輸入框的功能。
20
+ *
21
+ * @example
22
+ * ```tsx
23
+ * import Checkbox from '@mezzanine-ui/react/Checkbox';
24
+ *
25
+ * // 基本用法(非受控)
26
+ * <Checkbox label="同意條款" defaultChecked />
27
+ *
28
+ * // 受控用法
29
+ * const [checked, setChecked] = useState(false);
30
+ * <Checkbox
31
+ * checked={checked}
32
+ * label="訂閱電子報"
33
+ * onChange={(e) => setChecked(e.target.checked)}
34
+ * />
35
+ *
36
+ * // Chip 模式
37
+ * <Checkbox label="熱門" mode="chip" size="sub" />
38
+ *
39
+ * // 含附加輸入框
40
+ * <Checkbox label="其他" withEditInput editableInput={{ placeholder: '請輸入其他選項' }} />
41
+ * ```
42
+ *
43
+ * @see {@link CheckboxGroup} 管理多個核取方塊的群組元件
44
+ * @see {@link useCheckboxControlValue} 核取方塊受控值的自訂 Hook
16
45
  */
17
46
  const Checkbox = forwardRef(function Checkbox(props, ref) {
18
47
  const checkboxGroup = useContext(CheckboxGroupContext);
@@ -81,6 +110,24 @@ const Checkbox = forwardRef(function Checkbox(props, ref) {
81
110
  };
82
111
  }, [withEditInput, editableInput, resolvedName, finalInputId]);
83
112
  const shouldShowEditableInput = withEditInput && defaultEditableInput;
113
+ const prevIsCheckedRef = useRef(isChecked);
114
+ useEffect(() => {
115
+ if (isChecked && !prevIsCheckedRef.current && shouldShowEditableInput && editableInputRef.current) {
116
+ editableInputRef.current.focus();
117
+ }
118
+ prevIsCheckedRef.current = isChecked;
119
+ }, [isChecked, shouldShowEditableInput]);
120
+ const handleEditableInputMouseDown = useCallback((event) => {
121
+ var _a, _b;
122
+ (_b = (_a = defaultEditableInput === null || defaultEditableInput === void 0 ? void 0 : defaultEditableInput.inputProps) === null || _a === void 0 ? void 0 : _a.onMouseDown) === null || _b === void 0 ? void 0 : _b.call(_a, event);
123
+ if (event.defaultPrevented) {
124
+ return;
125
+ }
126
+ if (!isChecked && !disabled && inputElementRef.current) {
127
+ event.preventDefault(); // 阻止原生 focus-on-mousedown,讓 useEffect 統一控制 focus 時機
128
+ inputElementRef.current.click();
129
+ }
130
+ }, [defaultEditableInput, disabled, isChecked]);
84
131
  return (jsxs("div", { className: cx(checkboxClasses.host, className, {
85
132
  [checkboxClasses.checked]: isChecked,
86
133
  [checkboxClasses.indeterminate]: isIndeterminate,
@@ -90,10 +137,13 @@ const Checkbox = forwardRef(function Checkbox(props, ref) {
90
137
  }, checkboxClasses.size(size)), children: [jsxs("label", { ref: ref, ...rest, className: checkboxClasses.labelContainer, children: [jsx("div", { className: checkboxClasses.inputContainer, children: jsxs("div", { className: checkboxClasses.inputContent, children: [jsx("input", { ...restInputProps, "aria-checked": isIndeterminate ? 'mixed' : checked, "aria-disabled": disabled, checked: isChecked, className: checkboxClasses.input, disabled: disabled, id: finalInputId, name: resolvedName, onChange: onChange, ref: composedInputRef, type: "checkbox", value: value }), mode === 'chip' && isChecked && (jsx(Icon, { "aria-hidden": "true", className: cx(checkboxClasses.icon, checkboxClasses.chipIcon), color: "brand", icon: CheckedIcon, size: 16 })), mode !== 'chip' && isChecked && (jsx(Icon, { "aria-hidden": "true", className: checkboxClasses.icon, color: "fixed-light", icon: CheckedIcon, size: 9 })), mode !== 'chip' && isIndeterminate && (jsx("span", { "aria-hidden": "true", className: checkboxClasses.indeterminateLine }))] }) }), (label || description) && (jsxs("span", { className: checkboxClasses.textContainer, children: [label && (jsx(Typography, { className: checkboxClasses.label, color: labelColor, variant: "label-primary", children: label })), description && mode !== 'chip' && !shouldShowEditableInput && (jsx(Typography, { className: checkboxClasses.description, color: "text-neutral", variant: "caption", children: description }))] }))] }), shouldShowEditableInput &&
91
138
  defaultEditableInput &&
92
139
  mode !== 'chip' &&
93
- !indeterminate && (jsx("div", { className: checkboxClasses.editableInputContainer, children: jsx(Input, { ...defaultEditableInput, ...((!isChecked || disabled) &&
140
+ !indeterminate && (jsx("label", { className: checkboxClasses.editableInputContainer, htmlFor: finalInputId, children: jsx(Input, { ...defaultEditableInput, ...(disabled &&
94
141
  defaultEditableInput.disabled !== true
95
142
  ? { disabled: true }
96
- : {}), inputRef: composeRefs([
143
+ : {}), inputProps: {
144
+ ...defaultEditableInput.inputProps,
145
+ onMouseDown: handleEditableInputMouseDown,
146
+ }, inputRef: composeRefs([
97
147
  defaultEditableInput.inputRef,
98
148
  editableInputRef,
99
149
  ]), variant: "base" }) }))] }));