@octohirono/stitch-design-system 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. package/README.md +7 -0
  2. package/dist/components/Accordion/Accordion.d.ts +45 -0
  3. package/dist/components/Accordion/Accordion.js +26 -0
  4. package/dist/components/Accordion/accordion.module.js +4 -0
  5. package/dist/components/Accordion/index.d.ts +2 -0
  6. package/dist/components/AlertDialog/AlertDialog.d.ts +45 -0
  7. package/dist/components/AlertDialog/AlertDialog.js +32 -0
  8. package/dist/components/AlertDialog/alert-dialog.module.js +4 -0
  9. package/dist/components/AlertDialog/index.d.ts +2 -0
  10. package/dist/components/AspectRatio/AspectRatio.d.ts +29 -0
  11. package/dist/components/AspectRatio/AspectRatio.js +15 -0
  12. package/dist/components/AspectRatio/aspect-ratio.module.js +4 -0
  13. package/dist/components/AspectRatio/index.d.ts +2 -0
  14. package/dist/components/Avatar/Avatar.d.ts +42 -0
  15. package/dist/components/Avatar/Avatar.js +21 -0
  16. package/dist/components/Avatar/avatar.module.js +13 -0
  17. package/dist/components/Avatar/index.d.ts +2 -0
  18. package/dist/components/Button/Button.d.ts +60 -0
  19. package/dist/components/Button/Button.js +22 -0
  20. package/dist/components/Button/button.module.js +19 -0
  21. package/dist/components/Button/index.d.ts +2 -0
  22. package/dist/components/Card/Card.d.ts +50 -0
  23. package/dist/components/Card/Card.js +21 -0
  24. package/dist/components/Card/card.module.js +22 -0
  25. package/dist/components/Card/index.d.ts +2 -0
  26. package/dist/components/Checkbox/Checkbox.d.ts +45 -0
  27. package/dist/components/Checkbox/Checkbox.js +56 -0
  28. package/dist/components/Checkbox/checkbox.module.js +17 -0
  29. package/dist/components/Checkbox/index.d.ts +2 -0
  30. package/dist/components/CodeBlock/CodeBlock.d.ts +10 -0
  31. package/dist/components/CodeBlock/CodeBlock.js +50 -0
  32. package/dist/components/CodeBlock/codeblock.module.js +17 -0
  33. package/dist/components/CodeBlock/index.d.ts +2 -0
  34. package/dist/components/Collapse/Collapse.d.ts +38 -0
  35. package/dist/components/Collapse/Collapse.js +50 -0
  36. package/dist/components/Collapse/collapse.module.js +13 -0
  37. package/dist/components/Collapse/index.d.ts +2 -0
  38. package/dist/components/ContextMenu/ContextMenu.d.ts +47 -0
  39. package/dist/components/ContextMenu/ContextMenu.js +50 -0
  40. package/dist/components/ContextMenu/context-menu.module.js +13 -0
  41. package/dist/components/ContextMenu/index.d.ts +2 -0
  42. package/dist/components/Divider/Divider.d.ts +50 -0
  43. package/dist/components/Divider/Divider.js +23 -0
  44. package/dist/components/Divider/divider.module.js +14 -0
  45. package/dist/components/Divider/index.d.ts +2 -0
  46. package/dist/components/Drawer/Drawer.d.ts +36 -0
  47. package/dist/components/Drawer/Drawer.js +76 -0
  48. package/dist/components/Drawer/drawer.module.js +21 -0
  49. package/dist/components/Drawer/index.d.ts +2 -0
  50. package/dist/components/DropdownMenu/DropdownMenu.d.ts +55 -0
  51. package/dist/components/DropdownMenu/DropdownMenu.js +54 -0
  52. package/dist/components/DropdownMenu/dropdown-menu.module.js +13 -0
  53. package/dist/components/DropdownMenu/index.d.ts +2 -0
  54. package/dist/components/Form/Form.d.ts +20 -0
  55. package/dist/components/Form/Form.js +105 -0
  56. package/dist/components/Form/FormItem.d.ts +3 -0
  57. package/dist/components/Form/FormItem.js +96 -0
  58. package/dist/components/Form/context.d.ts +22 -0
  59. package/dist/components/Form/context.js +5 -0
  60. package/dist/components/Form/form.module.js +25 -0
  61. package/dist/components/Form/index.d.ts +7 -0
  62. package/dist/components/Form/types.d.ts +164 -0
  63. package/dist/components/Form/types.js +6 -0
  64. package/dist/components/Form/useForm.d.ts +15 -0
  65. package/dist/components/Form/useForm.js +188 -0
  66. package/dist/components/Form/validators.d.ts +3 -0
  67. package/dist/components/Form/validators.js +73 -0
  68. package/dist/components/HoverCard/HoverCard.d.ts +47 -0
  69. package/dist/components/HoverCard/HoverCard.js +26 -0
  70. package/dist/components/HoverCard/hover-card.module.js +9 -0
  71. package/dist/components/HoverCard/index.d.ts +2 -0
  72. package/dist/components/Icon/Icon.d.ts +100 -0
  73. package/dist/components/Icon/Icon.js +150 -0
  74. package/dist/components/Icon/icon.module.js +7 -0
  75. package/dist/components/Icon/index.d.ts +2 -0
  76. package/dist/components/Image/Image.d.ts +50 -0
  77. package/dist/components/Image/Image.js +95 -0
  78. package/dist/components/Image/image.module.js +27 -0
  79. package/dist/components/Image/index.d.ts +2 -0
  80. package/dist/components/Input/Input.d.ts +41 -0
  81. package/dist/components/Input/Input.js +62 -0
  82. package/dist/components/Input/index.d.ts +2 -0
  83. package/dist/components/Input/input.module.js +17 -0
  84. package/dist/components/Label/Label.d.ts +28 -0
  85. package/dist/components/Label/Label.js +15 -0
  86. package/dist/components/Label/index.d.ts +2 -0
  87. package/dist/components/Label/label.module.js +4 -0
  88. package/dist/components/Loading/Loading.d.ts +22 -0
  89. package/dist/components/Loading/Loading.js +32 -0
  90. package/dist/components/Loading/index.d.ts +2 -0
  91. package/dist/components/Loading/loading.module.js +14 -0
  92. package/dist/components/Menubar/Menubar.d.ts +64 -0
  93. package/dist/components/Menubar/Menubar.js +70 -0
  94. package/dist/components/Menubar/index.d.ts +2 -0
  95. package/dist/components/Menubar/menubar.module.js +15 -0
  96. package/dist/components/Modal/Modal.d.ts +38 -0
  97. package/dist/components/Modal/Modal.js +68 -0
  98. package/dist/components/Modal/index.d.ts +2 -0
  99. package/dist/components/Modal/modal.module.js +13 -0
  100. package/dist/components/NavigationMenu/NavigationMenu.d.ts +47 -0
  101. package/dist/components/NavigationMenu/NavigationMenu.js +47 -0
  102. package/dist/components/NavigationMenu/index.d.ts +2 -0
  103. package/dist/components/NavigationMenu/navigation-menu.module.js +16 -0
  104. package/dist/components/Notification/Notification.d.ts +14 -0
  105. package/dist/components/Notification/Notification.js +87 -0
  106. package/dist/components/Notification/NotificationPortal.d.ts +29 -0
  107. package/dist/components/Notification/NotificationPortal.js +90 -0
  108. package/dist/components/Notification/index.d.ts +4 -0
  109. package/dist/components/Notification/notification.module.js +31 -0
  110. package/dist/components/Notification/types.d.ts +44 -0
  111. package/dist/components/OtpField/OtpField.d.ts +40 -0
  112. package/dist/components/OtpField/OtpField.js +20 -0
  113. package/dist/components/OtpField/index.d.ts +2 -0
  114. package/dist/components/OtpField/otp-field.module.js +7 -0
  115. package/dist/components/PasswordInput/PasswordInput.d.ts +36 -0
  116. package/dist/components/PasswordInput/PasswordInput.js +28 -0
  117. package/dist/components/PasswordInput/index.d.ts +2 -0
  118. package/dist/components/PasswordInput/password-input.module.js +4 -0
  119. package/dist/components/Popover/Popover.d.ts +42 -0
  120. package/dist/components/Popover/Popover.js +24 -0
  121. package/dist/components/Popover/index.d.ts +2 -0
  122. package/dist/components/Popover/popover.module.js +9 -0
  123. package/dist/components/Progress/Progress.d.ts +44 -0
  124. package/dist/components/Progress/Progress.js +55 -0
  125. package/dist/components/Progress/index.d.ts +2 -0
  126. package/dist/components/Progress/progress.module.js +21 -0
  127. package/dist/components/Radio/Radio.d.ts +47 -0
  128. package/dist/components/Radio/Radio.js +102 -0
  129. package/dist/components/Radio/index.d.ts +2 -0
  130. package/dist/components/Radio/radio.module.js +17 -0
  131. package/dist/components/ScrollArea/ScrollArea.d.ts +34 -0
  132. package/dist/components/ScrollArea/ScrollArea.js +34 -0
  133. package/dist/components/ScrollArea/index.d.ts +2 -0
  134. package/dist/components/ScrollArea/scroll-area.module.js +10 -0
  135. package/dist/components/Select/Select.d.ts +54 -0
  136. package/dist/components/Select/Select.js +118 -0
  137. package/dist/components/Select/index.d.ts +2 -0
  138. package/dist/components/Select/select.module.js +24 -0
  139. package/dist/components/Skeleton/Skeleton.d.ts +71 -0
  140. package/dist/components/Skeleton/Skeleton.js +147 -0
  141. package/dist/components/Skeleton/index.d.ts +2 -0
  142. package/dist/components/Skeleton/skeleton.module.js +16 -0
  143. package/dist/components/Slider/Slider.d.ts +58 -0
  144. package/dist/components/Slider/Slider.js +33 -0
  145. package/dist/components/Slider/index.d.ts +2 -0
  146. package/dist/components/Slider/slider.module.js +9 -0
  147. package/dist/components/Switch/Switch.d.ts +50 -0
  148. package/dist/components/Switch/Switch.js +43 -0
  149. package/dist/components/Switch/index.d.ts +2 -0
  150. package/dist/components/Switch/switch.module.js +15 -0
  151. package/dist/components/Table/Table.d.ts +65 -0
  152. package/dist/components/Table/Table.js +75 -0
  153. package/dist/components/Table/index.d.ts +2 -0
  154. package/dist/components/Table/table.module.js +21 -0
  155. package/dist/components/Tabs/Tabs.d.ts +37 -0
  156. package/dist/components/Tabs/Tabs.js +68 -0
  157. package/dist/components/Tabs/index.d.ts +2 -0
  158. package/dist/components/Tabs/tabs.module.js +13 -0
  159. package/dist/components/Tag/Tag.d.ts +67 -0
  160. package/dist/components/Tag/Tag.js +54 -0
  161. package/dist/components/Tag/index.d.ts +2 -0
  162. package/dist/components/Tag/tag.module.js +28 -0
  163. package/dist/components/Toggle/Toggle.d.ts +39 -0
  164. package/dist/components/Toggle/Toggle.js +29 -0
  165. package/dist/components/Toggle/index.d.ts +2 -0
  166. package/dist/components/Toggle/toggle.module.js +7 -0
  167. package/dist/components/ToggleGroup/ToggleGroup.d.ts +88 -0
  168. package/dist/components/ToggleGroup/ToggleGroup.js +42 -0
  169. package/dist/components/ToggleGroup/index.d.ts +2 -0
  170. package/dist/components/ToggleGroup/toggle-group.module.js +8 -0
  171. package/dist/components/Toolbar/Toolbar.d.ts +116 -0
  172. package/dist/components/Toolbar/Toolbar.js +72 -0
  173. package/dist/components/Toolbar/index.d.ts +2 -0
  174. package/dist/components/Toolbar/toolbar.module.js +14 -0
  175. package/dist/components/Tooltip/Tooltip.d.ts +41 -0
  176. package/dist/components/Tooltip/Tooltip.js +38 -0
  177. package/dist/components/Tooltip/index.d.ts +2 -0
  178. package/dist/components/Tooltip/tooltip.module.js +21 -0
  179. package/dist/components/_internal/useOverlay.d.ts +15 -0
  180. package/dist/components/_internal/useOverlay.js +55 -0
  181. package/dist/index.d.ts +82 -0
  182. package/dist/index.js +43 -0
  183. package/dist/style.css +3693 -0
  184. package/package.json +36 -0
@@ -0,0 +1,24 @@
1
+ import e from "./popover.module.js";
2
+ import "react";
3
+ import t from "clsx";
4
+ import { jsx as n, jsxs as r } from "react/jsx-runtime";
5
+ import { Popover as i } from "radix-ui";
6
+ //#region packages/react/src/components/Popover/Popover.tsx
7
+ var a = ({ trigger: a, children: o, open: s, defaultOpen: c, onOpenChange: l, sideOffset: u = 8, className: d, "aria-label": f, "aria-labelledby": p }) => /* @__PURE__ */ r(i.Root, {
8
+ open: s,
9
+ defaultOpen: c,
10
+ onOpenChange: l,
11
+ children: [/* @__PURE__ */ n(i.Trigger, {
12
+ asChild: !0,
13
+ children: a
14
+ }), /* @__PURE__ */ n(i.Portal, { children: /* @__PURE__ */ r(i.Content, {
15
+ className: t(e.content, d),
16
+ sideOffset: u,
17
+ "aria-label": f,
18
+ "aria-labelledby": p,
19
+ children: [o, /* @__PURE__ */ n(i.Arrow, { className: e.arrow })]
20
+ }) })]
21
+ });
22
+ a.displayName = "Popover";
23
+ //#endregion
24
+ export { a as Popover };
@@ -0,0 +1,2 @@
1
+ export { Popover } from './Popover';
2
+ export type { PopoverProps } from './Popover';
@@ -0,0 +1,9 @@
1
+ //#region packages/react/src/components/Popover/popover.module.less
2
+ var e = "_content_hwtib_1", t = "_arrow_hwtib_26", n = {
3
+ content: e,
4
+ "stitch-popover-in": "_stitch-popover-in_hwtib_1",
5
+ "stitch-popover-out": "_stitch-popover-out_hwtib_1",
6
+ arrow: t
7
+ };
8
+ //#endregion
9
+ export { t as arrow, e as content, n as default };
@@ -0,0 +1,44 @@
1
+ import React from 'react';
2
+ export type ProgressSize = 'small' | 'middle' | 'large';
3
+ /**
4
+ * 百分比文字位置
5
+ * - inside: 在 bar 内部(fill 段内右对齐,跟随 fill;fill 过窄时退到 track 末端)
6
+ * - right: 在 bar 右侧
7
+ * - top: 在 bar 上方
8
+ */
9
+ export type ProgressInfoPosition = 'inside' | 'right' | 'top';
10
+ export interface ProgressProps {
11
+ /** 当前百分比,0–100 */
12
+ percent: number;
13
+ /**
14
+ * 尺寸
15
+ * @default 'middle'
16
+ */
17
+ size?: ProgressSize;
18
+ /**
19
+ * 是否显示百分比文字
20
+ * @default true
21
+ */
22
+ showInfo?: boolean;
23
+ /**
24
+ * 百分比文字位置
25
+ * @default 'inside'
26
+ */
27
+ infoPosition?: ProgressInfoPosition;
28
+ /** 自定义文字格式化(默认 `${percent}%`;对齐 Ant v5 `format`) */
29
+ format?: (percent: number) => React.ReactNode;
30
+ /**
31
+ * 进度条 fill 宽度动画时长(秒),0 = 不动画;不影响斜纹滚动
32
+ * @default 0.6
33
+ */
34
+ duration?: number;
35
+ /** 透传到根元素 */
36
+ className?: string;
37
+ /** 透传到根元素 */
38
+ style?: React.CSSProperties;
39
+ /** 无可见标题时给 progressbar 一个无障碍标签(WCAG aria-progressbar-name 必需) */
40
+ 'aria-label'?: string;
41
+ /** 关联外部可见标题的 id */
42
+ 'aria-labelledby'?: string;
43
+ }
44
+ export declare const Progress: React.FC<ProgressProps>;
@@ -0,0 +1,55 @@
1
+ import e from "./progress.module.js";
2
+ import { useMemo as t } from "react";
3
+ import n from "clsx";
4
+ import { jsx as r, jsxs as i } from "react/jsx-runtime";
5
+ //#region packages/react/src/components/Progress/Progress.tsx
6
+ var a = {
7
+ small: e["size-small"],
8
+ middle: e["size-middle"],
9
+ large: e["size-large"]
10
+ }, o = 18, s = ({ percent: s, size: c = "middle", showInfo: l = !0, infoPosition: u = "inside", format: d, duration: f = .6, className: p, style: m, "aria-label": h, "aria-labelledby": g }) => {
11
+ let _ = t(() => typeof s != "number" || Number.isNaN(s) ? 0 : Math.max(0, Math.min(100, s)), [s]), v = t(() => d ? d(_) : `${Math.round(_)}%`, [d, _]), y = {
12
+ width: `${_}%`,
13
+ transitionDuration: `${f}s`
14
+ }, b = l && u === "inside", x = b && _ >= o, S = n(e.progress, p), C = n(e.track, a[c]), w = n(e.fill, f === 0 && e.noTransition), T = n(e.body, u === "top" ? "" : e.noGap), E = typeof v == "string" ? v : void 0, D = /* @__PURE__ */ i("div", {
15
+ className: C,
16
+ children: [/* @__PURE__ */ r("div", {
17
+ className: w,
18
+ style: y,
19
+ children: x && /* @__PURE__ */ r("span", {
20
+ className: e.infoInside,
21
+ children: v
22
+ })
23
+ }), b && !x && /* @__PURE__ */ r("span", {
24
+ className: n(e.infoInside, e.infoOutside),
25
+ children: v
26
+ })]
27
+ });
28
+ return /* @__PURE__ */ r("div", {
29
+ className: S,
30
+ style: m,
31
+ role: "progressbar",
32
+ "aria-label": h,
33
+ "aria-labelledby": g,
34
+ "aria-valuemin": 0,
35
+ "aria-valuemax": 100,
36
+ "aria-valuenow": Math.round(_),
37
+ "aria-valuetext": E,
38
+ children: u === "top" ? /* @__PURE__ */ i("div", {
39
+ className: T,
40
+ children: [l && /* @__PURE__ */ r("div", {
41
+ className: n(e.info, e.top),
42
+ children: v
43
+ }), D]
44
+ }) : /* @__PURE__ */ i("div", {
45
+ className: e.row,
46
+ children: [D, l && u === "right" && /* @__PURE__ */ r("div", {
47
+ className: n(e.info, e.right),
48
+ children: v
49
+ })]
50
+ })
51
+ });
52
+ };
53
+ s.displayName = "Progress";
54
+ //#endregion
55
+ export { s as Progress };
@@ -0,0 +1,2 @@
1
+ export { Progress } from './Progress';
2
+ export type { ProgressProps, ProgressSize, ProgressInfoPosition, } from './Progress';
@@ -0,0 +1,21 @@
1
+ //#region packages/react/src/components/Progress/progress.module.less
2
+ var e = "_progress_1oxpl_1", t = "_body_1oxpl_11", n = "_noGap_1oxpl_19", r = "_row_1oxpl_22", i = "_info_1oxpl_30", a = "_right_1oxpl_38", o = "_top_1oxpl_42", s = "_track_1oxpl_45", c = "_fill_1oxpl_65", l = "_noTransition_1oxpl_83", u = "_infoInside_1oxpl_94", d = "_infoOutside_1oxpl_107", f = {
3
+ progress: e,
4
+ body: t,
5
+ noGap: n,
6
+ row: r,
7
+ info: i,
8
+ right: a,
9
+ top: o,
10
+ track: s,
11
+ "size-small": "_size-small_1oxpl_55",
12
+ "size-middle": "_size-middle_1oxpl_59",
13
+ "size-large": "_size-large_1oxpl_62",
14
+ fill: c,
15
+ "stitch-progress-stripe": "_stitch-progress-stripe_1oxpl_1",
16
+ noTransition: l,
17
+ infoInside: u,
18
+ infoOutside: d
19
+ };
20
+ //#endregion
21
+ export { t as body, f as default, c as fill, i as info, u as infoInside, d as infoOutside, n as noGap, l as noTransition, e as progress, a as right, r as row, o as top, s as track };
@@ -0,0 +1,47 @@
1
+ import React from 'react';
2
+ export type RadioSize = 'small' | 'middle' | 'large';
3
+ export interface RadioOption {
4
+ /** 选项标签 */
5
+ label: React.ReactNode;
6
+ /** 选项值 */
7
+ value: string | number;
8
+ /** 是否禁用该选项 */
9
+ disabled?: boolean;
10
+ }
11
+ /**
12
+ * 单选组(Ant `Radio.Group` 语义):`options` + **标量** `value` / `defaultValue`
13
+ * + `onChange(单个值)`。与 Checkbox(多选、值为数组)成对——单选用圆点标记、多选用勾,
14
+ * 靠**标记**区分而非盒形状。
15
+ *
16
+ * 跨-prop 注意事项:
17
+ * - **受控/非受控双模式**:给 `value` 由父管,只给 `defaultValue` 组件自管。
18
+ * - **radiogroup 键盘(WAI-ARIA 模式)**:容器 `role="radiogroup"`,每个
19
+ * `<input type="radio">` 共享同一 `name`;整组一个 Tab 停靠点(roving tabindex,焦点落
20
+ * 选中项 / 无选中落首项),方向键 ↑↓←→ 在启用项间移动焦点并**即时选中**,Home/End 跳首尾
21
+ * 启用项(禁用项自动跳过);`:focus-visible` 焦点环走 `--stitch-focus-ring`。
22
+ * - **选中标记走 `<Icon name="dot">`**(实心圆点,装饰 `aria-hidden`),非裸 `<svg>`;点色随
23
+ * `--stitch-accent-text`(与填充面成对比)。选中态为纯淡入,无爆闪/勾线动画。
24
+ * - **圆角复用表单控件档 `--stitch-radius-input`**(与 Checkbox 同源,随主题变)——radio 惯常
25
+ * 正圆,但组件禁写死圆角,故交由主题的 input 圆角档决定。
26
+ */
27
+ export interface RadioProps {
28
+ /** 选中的值(受控) */
29
+ value?: string | number;
30
+ /** 默认选中的值(非受控) */
31
+ defaultValue?: string | number;
32
+ /** 选项列表 */
33
+ options: RadioOption[];
34
+ /** 尺寸 */
35
+ size?: RadioSize;
36
+ /** 禁用全部 */
37
+ disabled?: boolean;
38
+ /** 布局方向 */
39
+ direction?: 'horizontal' | 'vertical';
40
+ /** 变化回调 */
41
+ onChange?: (value: string | number) => void;
42
+ /** 自定义类名 */
43
+ className?: string;
44
+ /** 自定义样式 */
45
+ style?: React.CSSProperties;
46
+ }
47
+ export declare const Radio: React.FC<RadioProps>;
@@ -0,0 +1,102 @@
1
+ import { Icon as e } from "../Icon/Icon.js";
2
+ import t from "./radio.module.js";
3
+ import { useCallback as n, useEffect as r, useId as i, useMemo as a, useRef as o, useState as s } from "react";
4
+ import c from "clsx";
5
+ import { jsx as l, jsxs as u } from "react/jsx-runtime";
6
+ //#region packages/react/src/components/Radio/Radio.tsx
7
+ var d = {
8
+ small: 12,
9
+ middle: 15,
10
+ large: 19
11
+ }, f = ({ value: f, defaultValue: p, options: m, size: h = "middle", disabled: g = !1, direction: _ = "horizontal", onChange: v, className: y, style: b }) => {
12
+ let [x, S] = s(p), C = f !== void 0, w = C ? f : x, T = `stitch-radio-${i().replace(/:/g, "")}`, E = o([]), [D, O] = s(() => {
13
+ let e = m.findIndex((e) => e.value === w);
14
+ return e >= 0 ? e : 0;
15
+ });
16
+ r(() => {
17
+ let e = m.findIndex((e) => e.value === w);
18
+ e >= 0 && O(e);
19
+ }, [w]);
20
+ let k = a(() => m.map((e, t) => ({
21
+ opt: e,
22
+ idx: t
23
+ })).filter(({ opt: e }) => !g && !e.disabled).map(({ idx: e }) => e), [m, g]), A = a(() => k.indexOf(D), [k, D]), j = n((e, t) => {
24
+ g || t || (C || S(e), v?.(e));
25
+ }, [
26
+ g,
27
+ C,
28
+ v
29
+ ]), M = n((e) => {
30
+ if (k.length === 0) return;
31
+ let t = -1;
32
+ switch (e.key) {
33
+ case "ArrowRight":
34
+ case "ArrowDown":
35
+ e.preventDefault(), t = (A + 1) % k.length;
36
+ break;
37
+ case "ArrowLeft":
38
+ case "ArrowUp":
39
+ e.preventDefault(), t = (A - 1 + k.length) % k.length;
40
+ break;
41
+ case "Home":
42
+ e.preventDefault(), t = 0;
43
+ break;
44
+ case "End":
45
+ e.preventDefault(), t = k.length - 1;
46
+ break;
47
+ default: return;
48
+ }
49
+ if (t >= 0) {
50
+ let e = k[t];
51
+ O(e), j(m[e].value, m[e].disabled), E.current[e]?.focus();
52
+ }
53
+ }, [
54
+ k,
55
+ A,
56
+ m,
57
+ j
58
+ ]);
59
+ return /* @__PURE__ */ l("div", {
60
+ role: "radiogroup",
61
+ className: c(t.radioGroup, t[_], g && t.groupDisabled, y),
62
+ style: b,
63
+ onKeyDown: M,
64
+ children: m.map((n, r) => {
65
+ let i = w === n.value, a = g || n.disabled, o = r === D && !a, s = `${T}-${r}`;
66
+ return /* @__PURE__ */ u("label", {
67
+ className: c(t.radioItem, t[h], {
68
+ [t.checked]: i,
69
+ [t.disabled]: a
70
+ }),
71
+ children: [/* @__PURE__ */ u("span", {
72
+ className: t.cbx,
73
+ children: [/* @__PURE__ */ l("input", {
74
+ id: s,
75
+ ref: (e) => {
76
+ E.current[r] = e;
77
+ },
78
+ type: "radio",
79
+ name: T,
80
+ checked: i,
81
+ disabled: a,
82
+ tabIndex: o ? 0 : -1,
83
+ onChange: () => j(n.value, n.disabled),
84
+ onFocus: () => {
85
+ a || O(r);
86
+ }
87
+ }), /* @__PURE__ */ l(e, {
88
+ name: "dot",
89
+ size: d[h],
90
+ className: t.dot
91
+ })]
92
+ }), /* @__PURE__ */ l("span", {
93
+ className: t.label,
94
+ children: n.label
95
+ })]
96
+ }, String(n.value));
97
+ })
98
+ });
99
+ };
100
+ f.displayName = "Radio";
101
+ //#endregion
102
+ export { f as Radio };
@@ -0,0 +1,2 @@
1
+ export { Radio } from './Radio';
2
+ export type { RadioProps, RadioOption, RadioSize } from './Radio';
@@ -0,0 +1,17 @@
1
+ //#region packages/react/src/components/Radio/radio.module.less
2
+ var e = "_radioGroup_11jg7_1", t = "_horizontal_11jg7_7", n = "_vertical_11jg7_10", r = "_radioItem_11jg7_14", i = "_small_11jg7_22", a = "_label_11jg7_25", o = "_middle_11jg7_28", s = "_large_11jg7_34", c = "_cbx_11jg7_40", l = "_dot_11jg7_67", u = "_disabled_11jg7_97", d = "_groupDisabled_11jg7_111", f = {
3
+ radioGroup: e,
4
+ horizontal: t,
5
+ vertical: n,
6
+ radioItem: r,
7
+ small: i,
8
+ label: a,
9
+ middle: o,
10
+ large: s,
11
+ cbx: c,
12
+ dot: l,
13
+ disabled: u,
14
+ groupDisabled: d
15
+ };
16
+ //#endregion
17
+ export { c as cbx, f as default, u as disabled, l as dot, d as groupDisabled, t as horizontal, a as label, s as large, o as middle, e as radioGroup, r as radioItem, i as small, n as vertical };
@@ -0,0 +1,34 @@
1
+ import React from 'react';
2
+ export type ScrollAreaOrientation = 'vertical' | 'horizontal' | 'both';
3
+ /**
4
+ * 自定义滚动区(无 Ant 对应):给内容区套一层样式统一的滚动条,抹平各浏览器原生滚动条的
5
+ * 视觉差异。**纯样式增强件**——只包一层滚动条外观,不改 `children` 的内容语义、不新增交互,
6
+ * 使用者仍在 `children` 里放任意可滚动内容、由 `className`/`style` 定容器高度或最大高度。
7
+ *
8
+ * 跨-prop 注意事项:
9
+ * - **高度/尺寸由使用者给**:组件本身不设高度;容器需可溢出才出滚动条,故必须由使用者经
10
+ * `style`(如 `{ height }` / `{ maxHeight }`)或 `className` 约束尺寸,否则内容撑开不滚动。
11
+ * - **`orientation` → 渲哪条滚动条**:`vertical`(默认)只纵向、`horizontal` 只横向、`both`
12
+ * 纵横两条 + 右下角块(`Corner`)。这是本组件唯一的分支逻辑。
13
+ * - **溢出才现条**:底层 `type="auto"`——仅当内容在对应方向溢出时才渲出滚动条(贴近原生
14
+ * 语义),不溢出不占位。
15
+ * - **Less 皮**:`Scrollbar` 走透明槽、`Thumb` 走 `--stitch-text-muted` 中性中灰(近原生
16
+ * 手柄)+ hover/拖动加深到 `--stitch-text-secondary`,圆角走 `--stitch-radius-button`;
17
+ * 状态由底层挂的 `data-state`/
18
+ * `data-orientation` 描,组件不自持 state。
19
+ * - **键盘/焦点/滚动/ARIA** 全归底层原语,组件不重复实现(纯外观层,非新增交互)。
20
+ */
21
+ export interface ScrollAreaProps {
22
+ /** 可滚动内容(放进 Viewport,语义原样保留) */
23
+ children?: React.ReactNode;
24
+ /**
25
+ * 滚动方向:决定渲哪条滚动条
26
+ * @default 'vertical'
27
+ */
28
+ orientation?: ScrollAreaOrientation;
29
+ /** 自定义类名(挂到根容器;配 style 定高度/最大高度) */
30
+ className?: string;
31
+ /** 行内样式(挂到根容器;使用者在此定 height / maxHeight 令内容可溢出) */
32
+ style?: React.CSSProperties;
33
+ }
34
+ export declare const ScrollArea: React.FC<ScrollAreaProps>;
@@ -0,0 +1,34 @@
1
+ import e from "./scroll-area.module.js";
2
+ import "react";
3
+ import t from "clsx";
4
+ import { jsx as n, jsxs as r } from "react/jsx-runtime";
5
+ import { ScrollArea as i } from "radix-ui";
6
+ //#region packages/react/src/components/ScrollArea/ScrollArea.tsx
7
+ var a = ({ children: a, orientation: o = "vertical", className: s, style: c }) => {
8
+ let l = o === "vertical" || o === "both", u = o === "horizontal" || o === "both";
9
+ return /* @__PURE__ */ r(i.Root, {
10
+ className: t(e.root, s),
11
+ style: c,
12
+ type: "auto",
13
+ children: [
14
+ /* @__PURE__ */ n(i.Viewport, {
15
+ className: e.viewport,
16
+ children: a
17
+ }),
18
+ l && /* @__PURE__ */ n(i.Scrollbar, {
19
+ className: e.scrollbar,
20
+ orientation: "vertical",
21
+ children: /* @__PURE__ */ n(i.Thumb, { className: e.thumb })
22
+ }),
23
+ u && /* @__PURE__ */ n(i.Scrollbar, {
24
+ className: e.scrollbar,
25
+ orientation: "horizontal",
26
+ children: /* @__PURE__ */ n(i.Thumb, { className: e.thumb })
27
+ }),
28
+ o === "both" && /* @__PURE__ */ n(i.Corner, { className: e.corner })
29
+ ]
30
+ });
31
+ };
32
+ a.displayName = "ScrollArea";
33
+ //#endregion
34
+ export { a as ScrollArea };
@@ -0,0 +1,2 @@
1
+ export { ScrollArea } from './ScrollArea';
2
+ export type { ScrollAreaProps, ScrollAreaOrientation } from './ScrollArea';
@@ -0,0 +1,10 @@
1
+ //#region packages/react/src/components/ScrollArea/scroll-area.module.less
2
+ var e = "_root_1mbik_1", t = "_viewport_1mbik_5", n = "_scrollbar_1mbik_10", r = "_thumb_1mbik_28", i = "_corner_1mbik_49", a = {
3
+ root: e,
4
+ viewport: t,
5
+ scrollbar: n,
6
+ thumb: r,
7
+ corner: i
8
+ };
9
+ //#endregion
10
+ export { i as corner, a as default, e as root, n as scrollbar, r as thumb, t as viewport };
@@ -0,0 +1,54 @@
1
+ import React from 'react';
2
+ export type SelectSize = 'small' | 'middle' | 'large';
3
+ export interface SelectOption {
4
+ /** 选项标签 */
5
+ label: React.ReactNode;
6
+ /** 选项值 */
7
+ value: string | number;
8
+ /** 是否禁用该选项 */
9
+ disabled?: boolean;
10
+ }
11
+ /**
12
+ * 单选下拉(Ant `Select` 语义):`options`(`{label, value, disabled?}`)+ **标量**
13
+ * `value` / `defaultValue`(`string | number`)+ `onChange(单个值)` + `placeholder` +
14
+ * `size` + `disabled`。
15
+ *
16
+ * 跨-prop 注意事项:
17
+ * - **受控/非受控双模式**:给 `value` 由父管,只给 `defaultValue` 组件自管。`size`
18
+ * (`small`/`middle`/`large`)走 `--stitch-height-*`,与表单控件族对齐。
19
+ * - **a11y 角色链**:trigger `role="combobox"` + `aria-haspopup="listbox"` + `aria-expanded`
20
+ * + `aria-controls`(展开时指向 listbox)+ `aria-activedescendant`(当前高亮项);浮层
21
+ * `role="listbox"`,每项 `role="option"` + `aria-selected`;禁用项 `aria-disabled`。
22
+ * - **键盘**:闭合时 Enter/Space/↑/↓ 打开;展开时 ↑↓ 在**启用项**间移动高亮(禁用项跳过、首尾
23
+ * wrap),Home/End 跳首尾启用项,Enter/Space 选中当前高亮,Esc 关闭并把焦点还给 trigger;
24
+ * trigger `:focus-visible` 焦点环走 `--stitch-focus-ring`。
25
+ * - **图标走 `<Icon>` 非裸 `<svg>`**:箭头 `<Icon name="chevron-down">`(`size="1em"` 跟随字号,
26
+ * 展开 `rotate(180deg)` + 转 accent 色),选中项尾随 `<Icon name="check">`。
27
+ * - **标准正下方展开**:浮层在 trigger 正下方展开(`top:100%`,`max-height` + 滚动),非侧向弹出/
28
+ * 视口翻转定位——这是标准化取舍,保证可预期的下拉手感。
29
+ */
30
+ export interface SelectProps {
31
+ /** 选项列表 */
32
+ options: SelectOption[];
33
+ /** 选中的值(受控) */
34
+ value?: string | number;
35
+ /** 默认选中的值(非受控) */
36
+ defaultValue?: string | number;
37
+ /** 值变化回调 */
38
+ onChange?: (value: string | number) => void;
39
+ /** 占位提示(未选中时显示) */
40
+ placeholder?: string;
41
+ /** 尺寸 */
42
+ size?: SelectSize;
43
+ /** 禁用整个选择器 */
44
+ disabled?: boolean;
45
+ /** 自定义类名(挂在根节点) */
46
+ className?: string;
47
+ /** 自定义样式(挂在根节点) */
48
+ style?: React.CSSProperties;
49
+ /** 无可见 label 时的无障碍标签 */
50
+ 'aria-label'?: string;
51
+ /** 关联外部可见 label 的 id */
52
+ 'aria-labelledby'?: string;
53
+ }
54
+ export declare const Select: React.FC<SelectProps>;
@@ -0,0 +1,118 @@
1
+ import { Icon as e } from "../Icon/Icon.js";
2
+ import t from "./select.module.js";
3
+ import { useCallback as n, useEffect as r, useId as i, useMemo as a, useRef as o, useState as s } from "react";
4
+ import c from "clsx";
5
+ import { jsx as l, jsxs as u } from "react/jsx-runtime";
6
+ //#region packages/react/src/components/Select/Select.tsx
7
+ var d = ({ options: d, value: f, defaultValue: p, onChange: m, placeholder: h = "请选择", size: g = "middle", disabled: _ = !1, className: v, style: y, "aria-label": b, "aria-labelledby": x }) => {
8
+ let [S, C] = s(p), w = f !== void 0, T = w ? f : S, [E, D] = s(!1), [O, k] = s(null), A = o(null), j = o(null), M = `stitch-select-${i().replace(/:/g, "")}`, N = `${M}-listbox`, P = (e) => `${M}-option-${e}`, F = d.find((e) => e.value === T), I = F ? F.label : h, L = F !== void 0, R = a(() => d.filter((e) => !e.disabled).map((e) => e.value), [d]);
9
+ r(() => {
10
+ if (!E) return;
11
+ let e = (e) => {
12
+ A.current && !A.current.contains(e.target) && D(!1);
13
+ };
14
+ return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
15
+ }, [E]), r(() => {
16
+ if (E) {
17
+ let e = R[0] ?? null;
18
+ k(T != null && R.includes(T) ? T : e);
19
+ } else k(null);
20
+ }, [E]);
21
+ let z = n((e) => {
22
+ w || C(e), m?.(e), D(!1), j.current?.focus();
23
+ }, [w, m]), B = (e) => {
24
+ if (!R.length) return;
25
+ let t = O == null ? -1 : R.indexOf(O), n = t < 0 ? e === 1 ? 0 : R.length - 1 : (t + e + R.length) % R.length;
26
+ k(R[n]);
27
+ };
28
+ return /* @__PURE__ */ u("div", {
29
+ ref: A,
30
+ className: c(t.wrapper, _ && t.disabled, v),
31
+ style: y,
32
+ onKeyDown: (e) => {
33
+ if (_) return;
34
+ let { key: t } = e;
35
+ if (!E) {
36
+ (t === "Enter" || t === " " || t === "ArrowDown" || t === "ArrowUp") && (e.preventDefault(), D(!0));
37
+ return;
38
+ }
39
+ switch (t) {
40
+ case "Escape":
41
+ e.preventDefault(), D(!1), j.current?.focus();
42
+ break;
43
+ case "ArrowDown":
44
+ e.preventDefault(), B(1);
45
+ break;
46
+ case "ArrowUp":
47
+ e.preventDefault(), B(-1);
48
+ break;
49
+ case "Home":
50
+ e.preventDefault(), R.length && k(R[0]);
51
+ break;
52
+ case "End":
53
+ e.preventDefault(), R.length && k(R[R.length - 1]);
54
+ break;
55
+ case "Enter":
56
+ case " ": e.preventDefault(), O != null && z(O);
57
+ }
58
+ },
59
+ children: [/* @__PURE__ */ u("div", {
60
+ ref: j,
61
+ className: c(t.trigger, t[g], E && t.open),
62
+ onClick: () => !_ && D((e) => !e),
63
+ role: "combobox",
64
+ "aria-haspopup": "listbox",
65
+ "aria-expanded": E,
66
+ "aria-controls": E ? N : void 0,
67
+ "aria-activedescendant": E && O != null ? P(O) : void 0,
68
+ "aria-disabled": _ || void 0,
69
+ "aria-label": b,
70
+ "aria-labelledby": x,
71
+ tabIndex: _ ? -1 : 0,
72
+ children: [/* @__PURE__ */ l("span", {
73
+ className: L ? t.value : t.placeholder,
74
+ children: I
75
+ }), /* @__PURE__ */ l(e, {
76
+ name: "chevron-down",
77
+ size: "1em",
78
+ className: c(t.arrow, E && t.arrowOpen)
79
+ })]
80
+ }), E && /* @__PURE__ */ l("div", {
81
+ className: t.dropdown,
82
+ role: "listbox",
83
+ id: N,
84
+ "aria-label": b,
85
+ "aria-labelledby": x,
86
+ "aria-activedescendant": O == null ? void 0 : P(O),
87
+ children: d.map((n) => {
88
+ let r = T === n.value, i = O === n.value;
89
+ return /* @__PURE__ */ u("div", {
90
+ id: P(n.value),
91
+ role: "option",
92
+ "aria-selected": r,
93
+ "aria-disabled": n.disabled || void 0,
94
+ className: c(t.option, {
95
+ [t.optionActive]: i,
96
+ [t.optionSelected]: r,
97
+ [t.optionDisabled]: n.disabled
98
+ }),
99
+ onClick: () => !n.disabled && z(n.value),
100
+ onMouseEnter: () => {
101
+ n.disabled || k(n.value);
102
+ },
103
+ children: [/* @__PURE__ */ l("span", {
104
+ className: t.optionLabel,
105
+ children: n.label
106
+ }), r && /* @__PURE__ */ l(e, {
107
+ name: "check",
108
+ size: "1em",
109
+ className: t.checkMark
110
+ })]
111
+ }, String(n.value));
112
+ })
113
+ })]
114
+ });
115
+ };
116
+ d.displayName = "Select";
117
+ //#endregion
118
+ export { d as Select };
@@ -0,0 +1,2 @@
1
+ export { Select } from './Select';
2
+ export type { SelectProps, SelectOption, SelectSize } from './Select';
@@ -0,0 +1,24 @@
1
+ //#region packages/react/src/components/Select/select.module.less
2
+ var e = "_wrapper_13o0n_1", t = "_trigger_13o0n_8", n = "_open_13o0n_30", r = "_small_13o0n_33", i = "_middle_13o0n_38", a = "_large_13o0n_43", o = "_value_13o0n_48", s = "_placeholder_13o0n_55", c = "_arrow_13o0n_62", l = "_arrowOpen_13o0n_67", u = "_dropdown_13o0n_71", d = "_dropdownFadeIn_13o0n_1", f = "_option_13o0n_98", p = "_optionLabel_13o0n_111", m = "_optionActive_13o0n_115", h = "_optionSelected_13o0n_118", g = "_checkMark_13o0n_122", _ = "_optionDisabled_13o0n_126", v = "_disabled_13o0n_133", y = {
3
+ wrapper: e,
4
+ trigger: t,
5
+ open: n,
6
+ small: r,
7
+ middle: i,
8
+ large: a,
9
+ value: o,
10
+ placeholder: s,
11
+ arrow: c,
12
+ arrowOpen: l,
13
+ dropdown: u,
14
+ dropdownFadeIn: d,
15
+ option: f,
16
+ optionLabel: p,
17
+ optionActive: m,
18
+ optionSelected: h,
19
+ checkMark: g,
20
+ optionDisabled: _,
21
+ disabled: v
22
+ };
23
+ //#endregion
24
+ export { c as arrow, l as arrowOpen, g as checkMark, y as default, v as disabled, u as dropdown, d as dropdownFadeIn, a as large, i as middle, n as open, f as option, m as optionActive, _ as optionDisabled, p as optionLabel, h as optionSelected, s as placeholder, r as small, t as trigger, o as value, e as wrapper };