@ubie/vitals-ui-business 0.0.0 → 0.2.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 (110) hide show
  1. package/.storybook/main.ts +23 -0
  2. package/.storybook/preview.tsx +37 -0
  3. package/.storybook/vitest.setup.ts +6 -0
  4. package/CHANGELOG.md +29 -0
  5. package/dist/index.cjs +57 -0
  6. package/dist/index.d.cts +15 -0
  7. package/dist/index.d.cts.map +1 -0
  8. package/dist/index.d.mts +15 -0
  9. package/dist/index.d.mts.map +1 -0
  10. package/dist/index.mjs +20 -0
  11. package/dist/index.mjs.map +1 -0
  12. package/package.json +46 -8
  13. package/src/UbieConfigProvider.tsx +12 -0
  14. package/src/index.ts +6 -0
  15. package/src/stories/Button.stories.tsx +73 -0
  16. package/src/stories/ant-design-x/Actions.stories.tsx +73 -0
  17. package/src/stories/ant-design-x/Attachments.stories.tsx +101 -0
  18. package/src/stories/ant-design-x/Bubble.stories.tsx +78 -0
  19. package/src/stories/ant-design-x/CodeHighlighter.stories.tsx +86 -0
  20. package/src/stories/ant-design-x/Conversations.stories.tsx +87 -0
  21. package/src/stories/ant-design-x/FileCard.stories.tsx +70 -0
  22. package/src/stories/ant-design-x/Folder.stories.tsx +113 -0
  23. package/src/stories/ant-design-x/Mermaid.stories.tsx +81 -0
  24. package/src/stories/ant-design-x/Notification.stories.tsx +96 -0
  25. package/src/stories/ant-design-x/Prompts.stories.tsx +79 -0
  26. package/src/stories/ant-design-x/Sender.stories.tsx +50 -0
  27. package/src/stories/ant-design-x/SenderSwitch.stories.tsx +48 -0
  28. package/src/stories/ant-design-x/Sources.stories.tsx +62 -0
  29. package/src/stories/ant-design-x/Suggestion.stories.tsx +96 -0
  30. package/src/stories/ant-design-x/Think.stories.tsx +45 -0
  31. package/src/stories/ant-design-x/ThoughtChain.stories.tsx +98 -0
  32. package/src/stories/ant-design-x/Welcome.stories.tsx +78 -0
  33. package/src/stories/ant-design-x/XProvider.stories.tsx +76 -0
  34. package/src/stories/components/Affix.stories.tsx +33 -0
  35. package/src/stories/components/Alert.stories.tsx +35 -0
  36. package/src/stories/components/Anchor.stories.tsx +69 -0
  37. package/src/stories/components/App.stories.tsx +42 -0
  38. package/src/stories/components/AutoComplete.stories.tsx +48 -0
  39. package/src/stories/components/Avatar.stories.tsx +45 -0
  40. package/src/stories/components/BackTop.stories.tsx +42 -0
  41. package/src/stories/components/Badge.stories.tsx +49 -0
  42. package/src/stories/components/BorderBeam.stories.tsx +85 -0
  43. package/src/stories/components/Breadcrumb.stories.tsx +52 -0
  44. package/src/stories/components/Calendar.stories.tsx +50 -0
  45. package/src/stories/components/Card.stories.tsx +49 -0
  46. package/src/stories/components/Carousel.stories.tsx +65 -0
  47. package/src/stories/components/Cascader.stories.tsx +51 -0
  48. package/src/stories/components/Checkbox.stories.tsx +47 -0
  49. package/src/stories/components/Col.stories.tsx +56 -0
  50. package/src/stories/components/Collapse.stories.tsx +46 -0
  51. package/src/stories/components/ColorPicker.stories.tsx +43 -0
  52. package/src/stories/components/ConfigProvider.stories.tsx +53 -0
  53. package/src/stories/components/DatePicker.stories.tsx +45 -0
  54. package/src/stories/components/Descriptions.stories.tsx +45 -0
  55. package/src/stories/components/Divider.stories.tsx +49 -0
  56. package/src/stories/components/Drawer.stories.tsx +64 -0
  57. package/src/stories/components/Dropdown.stories.tsx +44 -0
  58. package/src/stories/components/Empty.stories.tsx +44 -0
  59. package/src/stories/components/Flex.stories.tsx +55 -0
  60. package/src/stories/components/FloatButton.stories.tsx +70 -0
  61. package/src/stories/components/Form.stories.tsx +69 -0
  62. package/src/stories/components/Grid.stories.tsx +71 -0
  63. package/src/stories/components/Image.stories.tsx +48 -0
  64. package/src/stories/components/Input.stories.tsx +50 -0
  65. package/src/stories/components/InputNumber.stories.tsx +46 -0
  66. package/src/stories/components/Layout.stories.tsx +70 -0
  67. package/src/stories/components/List.stories.tsx +57 -0
  68. package/src/stories/components/Masonry.stories.tsx +58 -0
  69. package/src/stories/components/Mentions.stories.tsx +63 -0
  70. package/src/stories/components/Menu.stories.tsx +56 -0
  71. package/src/stories/components/Message.stories.tsx +79 -0
  72. package/src/stories/components/Modal.stories.tsx +57 -0
  73. package/src/stories/components/Notification.stories.tsx +85 -0
  74. package/src/stories/components/Pagination.stories.tsx +39 -0
  75. package/src/stories/components/Popconfirm.stories.tsx +67 -0
  76. package/src/stories/components/Popover.stories.tsx +68 -0
  77. package/src/stories/components/Progress.stories.tsx +61 -0
  78. package/src/stories/components/QRCode.stories.tsx +47 -0
  79. package/src/stories/components/Radio.stories.tsx +50 -0
  80. package/src/stories/components/Rate.stories.tsx +39 -0
  81. package/src/stories/components/Result.stories.tsx +54 -0
  82. package/src/stories/components/Row.stories.tsx +62 -0
  83. package/src/stories/components/Segmented.stories.tsx +48 -0
  84. package/src/stories/components/Select.stories.tsx +55 -0
  85. package/src/stories/components/Skeleton.stories.tsx +43 -0
  86. package/src/stories/components/Slider.stories.tsx +49 -0
  87. package/src/stories/components/Space.stories.tsx +51 -0
  88. package/src/stories/components/Spin.stories.tsx +40 -0
  89. package/src/stories/components/Splitter.stories.tsx +61 -0
  90. package/src/stories/components/Statistic.stories.tsx +38 -0
  91. package/src/stories/components/Steps.stories.tsx +44 -0
  92. package/src/stories/components/Switch.stories.tsx +39 -0
  93. package/src/stories/components/Table.stories.tsx +72 -0
  94. package/src/stories/components/Tabs.stories.tsx +44 -0
  95. package/src/stories/components/Tag.stories.tsx +52 -0
  96. package/src/stories/components/TimePicker.stories.tsx +45 -0
  97. package/src/stories/components/Timeline.stories.tsx +48 -0
  98. package/src/stories/components/Tooltip.stories.tsx +44 -0
  99. package/src/stories/components/Tour.stories.tsx +59 -0
  100. package/src/stories/components/Transfer.stories.tsx +102 -0
  101. package/src/stories/components/Tree.stories.tsx +38 -0
  102. package/src/stories/components/TreeSelect.stories.tsx +52 -0
  103. package/src/stories/components/Typography.stories.tsx +53 -0
  104. package/src/stories/components/UbieConfigProvider.stories.tsx +62 -0
  105. package/src/stories/components/Upload.stories.tsx +64 -0
  106. package/src/stories/components/Watermark.stories.tsx +49 -0
  107. package/src/stories/storyHelpers.tsx +85 -0
  108. package/tsconfig.json +9 -0
  109. package/vite.config.ts +32 -0
  110. package/README.md +0 -45
@@ -0,0 +1,23 @@
1
+ import type { StorybookConfig } from "@storybook/react-vite";
2
+
3
+ const config: StorybookConfig = {
4
+ stories: ["../src/**/*.mdx", "../src/**/*.stories.@(js|jsx|mjs|ts|tsx)"],
5
+ addons: [
6
+ "@storybook/addon-vitest",
7
+ "@storybook/addon-a11y",
8
+ "@storybook/addon-docs",
9
+ "@storybook/addon-onboarding",
10
+ ],
11
+ framework: "@storybook/react-vite",
12
+ managerHead: (head) => `${head}
13
+ <script>
14
+ if (!window.location.search) {
15
+ window.location.replace(
16
+ window.location.pathname + "?path=/story/components-button--primary",
17
+ );
18
+ }
19
+ </script>
20
+ `,
21
+ };
22
+
23
+ export default config;
@@ -0,0 +1,37 @@
1
+ import React, { useRef } from "react";
2
+ import type { Preview } from "@storybook/react-vite";
3
+
4
+ import { UbieConfigProvider } from "../src";
5
+
6
+ function StoryDecorator({ Story }: { Story: React.ComponentType }) {
7
+ const popupContainerRef = useRef<HTMLDivElement>(null);
8
+
9
+ return (
10
+ <div ref={popupContainerRef} style={{ isolation: "isolate", minHeight: "100%" }}>
11
+ <UbieConfigProvider
12
+ getPopupContainer={(triggerNode) =>
13
+ triggerNode?.parentElement ?? popupContainerRef.current ?? document.body
14
+ }
15
+ >
16
+ <Story />
17
+ </UbieConfigProvider>
18
+ </div>
19
+ );
20
+ }
21
+
22
+ const preview: Preview = {
23
+ parameters: {
24
+ controls: {
25
+ matchers: {
26
+ color: /(background|color)$/i,
27
+ date: /Date$/i,
28
+ },
29
+ },
30
+ a11y: {
31
+ test: "todo",
32
+ },
33
+ },
34
+ decorators: [(Story) => <StoryDecorator Story={Story} />],
35
+ };
36
+
37
+ export default preview;
@@ -0,0 +1,6 @@
1
+ import * as a11yAddonAnnotations from "@storybook/addon-a11y/preview";
2
+ import { setProjectAnnotations } from "@storybook/react-vite";
3
+
4
+ import * as projectAnnotations from "./preview";
5
+
6
+ setProjectAnnotations([a11yAddonAnnotations, projectAnnotations]);
package/CHANGELOG.md ADDED
@@ -0,0 +1,29 @@
1
+ # @ubie/vitals-ui-business
2
+
3
+ ## 0.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 4b911f2: Re-export the Ant Design X public API, with its conflicting `notification` and `version` exports available as `xNotification` and `xVersion`.
8
+
9
+ Update Ant Design to 6.5.1, add Ant Design X 2.8.0, and document the new Ant Design `BorderBeam` component and every visual Ant Design X root export in Storybook.
10
+
11
+ ### Patch Changes
12
+
13
+ - @ubie/vitals-antd-theme@0.0.8
14
+
15
+ ## 0.1.0
16
+
17
+ ### Minor Changes
18
+
19
+ - c28598e: `@ubie/vitals-ui-business` を初回公開します。
20
+ - Ant Design の root public exports を透過的に再公開
21
+ - Vitals theme を基底に利用側設定を拡張できる `UbieConfigProvider` と `UbieConfigProviderProps` を追加
22
+ - facade package を side-effect-free として宣言し、未使用 Provider/theme branch の tree-shaking を可能にする
23
+ - `@ubie/vitals-antd-theme` の package build で ESM と CommonJS の両形式を生成し、ESM-only の token dependency を output へ bundle
24
+ - `@ubie/vitals-antd-theme` を side-effect-free として宣言し、未使用 theme branch の tree-shaking を可能にする
25
+
26
+ ### Patch Changes
27
+
28
+ - Updated dependencies [c28598e]
29
+ - @ubie/vitals-antd-theme@0.0.7
package/dist/index.cjs ADDED
@@ -0,0 +1,57 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ let _ant_design_x = require("@ant-design/x");
3
+ let antd = require("antd");
4
+ let _ubie_vitals_antd_theme = require("@ubie/vitals-antd-theme");
5
+ let react_jsx_runtime = require("react/jsx-runtime");
6
+ //#region src/UbieConfigProvider.tsx
7
+ function UbieConfigProvider({ children, ...configProviderProps }) {
8
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(antd.ConfigProvider, {
9
+ theme: _ubie_vitals_antd_theme.antdTheme,
10
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(antd.ConfigProvider, {
11
+ ...configProviderProps,
12
+ children
13
+ })
14
+ });
15
+ }
16
+ //#endregion
17
+ exports.UbieConfigProvider = UbieConfigProvider;
18
+ Object.defineProperty(exports, "notification", {
19
+ enumerable: true,
20
+ get: function() {
21
+ return antd.notification;
22
+ }
23
+ });
24
+ Object.defineProperty(exports, "version", {
25
+ enumerable: true,
26
+ get: function() {
27
+ return antd.version;
28
+ }
29
+ });
30
+ Object.defineProperty(exports, "xNotification", {
31
+ enumerable: true,
32
+ get: function() {
33
+ return _ant_design_x.notification;
34
+ }
35
+ });
36
+ Object.defineProperty(exports, "xVersion", {
37
+ enumerable: true,
38
+ get: function() {
39
+ return _ant_design_x.version;
40
+ }
41
+ });
42
+ Object.keys(_ant_design_x).forEach(function(k) {
43
+ if (k !== "default" && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
44
+ enumerable: true,
45
+ get: function() {
46
+ return _ant_design_x[k];
47
+ }
48
+ });
49
+ });
50
+ Object.keys(antd).forEach(function(k) {
51
+ if (k !== "default" && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
52
+ enumerable: true,
53
+ get: function() {
54
+ return antd[k];
55
+ }
56
+ });
57
+ });
@@ -0,0 +1,15 @@
1
+ import { notification as xNotification, version as xVersion } from "@ant-design/x";
2
+ import { ConfigProviderProps, notification, version } from "antd";
3
+ import * as _$react_jsx_runtime0 from "react/jsx-runtime";
4
+ export * from "@ant-design/x";
5
+ export * from "antd";
6
+
7
+ //#region src/UbieConfigProvider.d.ts
8
+ type UbieConfigProviderProps = ConfigProviderProps;
9
+ declare function UbieConfigProvider({
10
+ children,
11
+ ...configProviderProps
12
+ }: UbieConfigProviderProps): _$react_jsx_runtime0.JSX.Element;
13
+ //#endregion
14
+ export { UbieConfigProvider, type UbieConfigProviderProps, notification, version, xNotification, xVersion };
15
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/UbieConfigProvider.tsx"],"mappings":";;;;;;;KAGY,uBAAA,GAA0B,mBAAA;AAAA,iBAEtB,kBAAA,CAAA;EAAqB,QAAA;EAAA,GAAa;AAAA,GAAuB,uBAAA,GAAuB,oBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -0,0 +1,15 @@
1
+ import { notification as xNotification, version as xVersion } from "@ant-design/x";
2
+ import { ConfigProviderProps, notification, version } from "antd";
3
+ import * as _$react_jsx_runtime0 from "react/jsx-runtime";
4
+ export * from "@ant-design/x";
5
+ export * from "antd";
6
+
7
+ //#region src/UbieConfigProvider.d.ts
8
+ type UbieConfigProviderProps = ConfigProviderProps;
9
+ declare function UbieConfigProvider({
10
+ children,
11
+ ...configProviderProps
12
+ }: UbieConfigProviderProps): _$react_jsx_runtime0.JSX.Element;
13
+ //#endregion
14
+ export { UbieConfigProvider, type UbieConfigProviderProps, notification, version, xNotification, xVersion };
15
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/UbieConfigProvider.tsx"],"mappings":";;;;;;;KAGY,uBAAA,GAA0B,mBAAA;AAAA,iBAEtB,kBAAA,CAAA;EAAqB,QAAA;EAAA,GAAa;AAAA,GAAuB,uBAAA,GAAuB,oBAAA,CAAA,GAAA,CAAA,OAAA"}
package/dist/index.mjs ADDED
@@ -0,0 +1,20 @@
1
+ import { notification as xNotification, version as xVersion } from "@ant-design/x";
2
+ import { ConfigProvider, notification, version } from "antd";
3
+ import { antdTheme } from "@ubie/vitals-antd-theme";
4
+ import { jsx } from "react/jsx-runtime";
5
+ export * from "@ant-design/x";
6
+ export * from "antd";
7
+ //#region src/UbieConfigProvider.tsx
8
+ function UbieConfigProvider({ children, ...configProviderProps }) {
9
+ return /* @__PURE__ */ jsx(ConfigProvider, {
10
+ theme: antdTheme,
11
+ children: /* @__PURE__ */ jsx(ConfigProvider, {
12
+ ...configProviderProps,
13
+ children
14
+ })
15
+ });
16
+ }
17
+ //#endregion
18
+ export { UbieConfigProvider, notification, version, xNotification, xVersion };
19
+
20
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/UbieConfigProvider.tsx"],"sourcesContent":["import { antdTheme } from \"@ubie/vitals-antd-theme\";\nimport { ConfigProvider, type ConfigProviderProps } from \"antd\";\n\nexport type UbieConfigProviderProps = ConfigProviderProps;\n\nexport function UbieConfigProvider({ children, ...configProviderProps }: UbieConfigProviderProps) {\n return (\n <ConfigProvider theme={antdTheme}>\n <ConfigProvider {...configProviderProps}>{children}</ConfigProvider>\n </ConfigProvider>\n );\n}\n"],"mappings":";;;;;;;AAKA,SAAgB,mBAAmB,EAAE,UAAU,GAAG,uBAAgD;AAChG,QACE,oBAAC,gBAAD;EAAgB,OAAO;YACrB,oBAAC,gBAAD;GAAgB,GAAI;GAAsB;GAA0B,CAAA;EACrD,CAAA"}
package/package.json CHANGED
@@ -1,10 +1,48 @@
1
1
  {
2
2
  "name": "@ubie/vitals-ui-business",
3
- "version": "0.0.0",
4
- "description": "OIDC trusted publishing setup package for @ubie/vitals-ui-business",
5
- "keywords": [
6
- "oidc",
7
- "trusted-publishing",
8
- "setup"
9
- ]
10
- }
3
+ "version": "0.2.0",
4
+ "description": "Ant Design components with the Ubie Vitals theme for business products",
5
+ "author": "Ubie Inc.",
6
+ "sideEffects": false,
7
+ "main": "./dist/index.cjs",
8
+ "module": "./dist/index.mjs",
9
+ "types": "./dist/index.d.cts",
10
+ "exports": {
11
+ ".": {
12
+ "development": "./src/index.ts",
13
+ "require": "./dist/index.cjs",
14
+ "import": "./dist/index.mjs"
15
+ }
16
+ },
17
+ "dependencies": {
18
+ "@ant-design/x": "^2.8.0",
19
+ "antd": "^6.5.1",
20
+ "@ubie/vitals-antd-theme": "0.0.8"
21
+ },
22
+ "devDependencies": {
23
+ "@storybook/addon-a11y": "10.4.6",
24
+ "@storybook/addon-docs": "10.4.6",
25
+ "@storybook/addon-onboarding": "10.4.6",
26
+ "@storybook/addon-vitest": "10.4.6",
27
+ "@storybook/react-vite": "10.4.6",
28
+ "@types/react": "^19.2.7",
29
+ "@types/react-dom": "^19.2.3",
30
+ "@vitest/coverage-v8": "^4.1.2",
31
+ "dayjs": "^1.11.19",
32
+ "playwright": "^1.57.0",
33
+ "react": "19.2.5",
34
+ "react-dom": "19.2.5",
35
+ "storybook": "10.4.6",
36
+ "vite-plus": "0.1.20",
37
+ "vitest": "npm:@voidzero-dev/vite-plus-test@latest"
38
+ },
39
+ "peerDependencies": {
40
+ "react": ">=18.0.0",
41
+ "react-dom": ">=18.0.0"
42
+ },
43
+ "scripts": {
44
+ "build": "vp pack",
45
+ "dev": "storybook dev -p 6006",
46
+ "build-storybook": "storybook build"
47
+ }
48
+ }
@@ -0,0 +1,12 @@
1
+ import { antdTheme } from "@ubie/vitals-antd-theme";
2
+ import { ConfigProvider, type ConfigProviderProps } from "antd";
3
+
4
+ export type UbieConfigProviderProps = ConfigProviderProps;
5
+
6
+ export function UbieConfigProvider({ children, ...configProviderProps }: UbieConfigProviderProps) {
7
+ return (
8
+ <ConfigProvider theme={antdTheme}>
9
+ <ConfigProvider {...configProviderProps}>{children}</ConfigProvider>
10
+ </ConfigProvider>
11
+ );
12
+ }
package/src/index.ts ADDED
@@ -0,0 +1,6 @@
1
+ export * from "@ant-design/x";
2
+ export * from "antd";
3
+ export { notification as xNotification, version as xVersion } from "@ant-design/x";
4
+ export { notification, version } from "antd";
5
+ export { UbieConfigProvider } from "./UbieConfigProvider";
6
+ export type { UbieConfigProviderProps } from "./UbieConfigProvider";
@@ -0,0 +1,73 @@
1
+ import type { Meta, StoryObj } from "@storybook/react-vite";
2
+
3
+ import { Button, Space } from "../index";
4
+ import { antDesignStoryParameters, StoryFrame } from "./storyHelpers";
5
+
6
+ const meta = {
7
+ title: "Components/Button",
8
+ component: Button,
9
+ tags: ["autodocs"],
10
+ parameters: {
11
+ ...antDesignStoryParameters("button"),
12
+ controls: { disable: false },
13
+ },
14
+ args: {
15
+ children: "Button",
16
+ },
17
+ } satisfies Meta<typeof Button>;
18
+
19
+ export default meta;
20
+
21
+ type Story = StoryObj<typeof meta>;
22
+
23
+ export const Primary: Story = {
24
+ args: {
25
+ type: "primary",
26
+ },
27
+ };
28
+
29
+ export const Default: Story = {};
30
+
31
+ export const Types: Story = {
32
+ parameters: { controls: { disable: true } },
33
+ render: () => (
34
+ <StoryFrame>
35
+ <Space wrap>
36
+ <Button type="primary">Primary</Button>
37
+ <Button>Default</Button>
38
+ <Button type="dashed">Dashed</Button>
39
+ <Button type="text">Text</Button>
40
+ <Button type="link">Link</Button>
41
+ </Space>
42
+ </StoryFrame>
43
+ ),
44
+ };
45
+
46
+ export const Sizes: Story = {
47
+ parameters: { controls: { disable: true } },
48
+ render: () => (
49
+ <StoryFrame>
50
+ <Space align="center">
51
+ <Button size="large">Large</Button>
52
+ <Button>Middle</Button>
53
+ <Button size="small">Small</Button>
54
+ </Space>
55
+ </StoryFrame>
56
+ ),
57
+ };
58
+
59
+ export const IconPlacement: Story = {
60
+ parameters: { controls: { disable: true } },
61
+ render: () => (
62
+ <StoryFrame>
63
+ <Space>
64
+ <Button icon={<span aria-hidden>+</span>} iconPlacement="start">
65
+ Create
66
+ </Button>
67
+ <Button icon={<span aria-hidden>→</span>} iconPlacement="end" type="primary">
68
+ Continue
69
+ </Button>
70
+ </Space>
71
+ </StoryFrame>
72
+ ),
73
+ };
@@ -0,0 +1,73 @@
1
+ import type { Meta, StoryObj } from "@storybook/react-vite";
2
+ import { useState } from "react";
3
+
4
+ import { Actions, type ActionsProps, Flex } from "../../index";
5
+ import { antDesignXStoryParameters, StoryFrame } from "../storyHelpers";
6
+
7
+ const basicItems: ActionsProps["items"] = [
8
+ { key: "retry", icon: <span aria-hidden>↻</span>, label: "Retry" },
9
+ { key: "edit", icon: <span aria-hidden>✎</span>, label: "Edit" },
10
+ ];
11
+
12
+ const nestedItems: ActionsProps["items"] = [
13
+ {
14
+ key: "share",
15
+ icon: <span aria-hidden>↗</span>,
16
+ label: "Share",
17
+ subItems: [
18
+ { key: "workspace", label: "Share to workspace" },
19
+ { key: "email", label: "Send by email" },
20
+ ],
21
+ },
22
+ { key: "archive", icon: <span aria-hidden>□</span>, label: "Archive" },
23
+ ];
24
+
25
+ function InteractiveActions({ items }: { items: ActionsProps["items"] }) {
26
+ const [lastAction, setLastAction] = useState("No action selected");
27
+
28
+ return (
29
+ <Flex vertical gap={16}>
30
+ <Actions items={items} onClick={({ item, key }) => setLastAction(item.label ?? key)} />
31
+ <span aria-live="polite">Last action: {lastAction}</span>
32
+ </Flex>
33
+ );
34
+ }
35
+
36
+ const meta = {
37
+ title: "Ant Design X/Actions",
38
+ component: Actions,
39
+ args: { items: basicItems },
40
+ tags: ["autodocs"],
41
+ parameters: antDesignXStoryParameters("actions"),
42
+ } satisfies Meta<typeof Actions>;
43
+
44
+ export default meta;
45
+ type Story = StoryObj<typeof meta>;
46
+
47
+ export const Basic: Story = {
48
+ render: () => (
49
+ <StoryFrame>
50
+ <InteractiveActions items={basicItems} />
51
+ </StoryFrame>
52
+ ),
53
+ };
54
+
55
+ export const NestedMenu: Story = {
56
+ render: () => (
57
+ <StoryFrame>
58
+ <InteractiveActions items={nestedItems} />
59
+ </StoryFrame>
60
+ ),
61
+ };
62
+
63
+ export const Variants: Story = {
64
+ render: () => (
65
+ <StoryFrame>
66
+ <Flex vertical gap={16}>
67
+ <Actions items={basicItems} variant="borderless" />
68
+ <Actions items={basicItems} variant="filled" />
69
+ <Actions items={basicItems} variant="outlined" />
70
+ </Flex>
71
+ </StoryFrame>
72
+ ),
73
+ };
@@ -0,0 +1,101 @@
1
+ import type { Meta, StoryObj } from "@storybook/react-vite";
2
+ import { useState } from "react";
3
+
4
+ import { Attachments, type AttachmentsProps } from "../../index";
5
+ import { antDesignXStoryParameters, placeholderImage, StoryFrame } from "../storyHelpers";
6
+
7
+ const preventUpload = () => false as const;
8
+
9
+ const fileStates = [
10
+ {
11
+ uid: "brief",
12
+ name: "project-brief.pdf",
13
+ status: "done",
14
+ size: 248_000,
15
+ description: "Approved project brief",
16
+ },
17
+ {
18
+ uid: "research",
19
+ name: "research-notes.docx",
20
+ status: "uploading",
21
+ percent: 64,
22
+ },
23
+ {
24
+ uid: "archive",
25
+ name: "legacy-assets.zip",
26
+ status: "error",
27
+ response: "The archive could not be processed.",
28
+ },
29
+ {
30
+ uid: "cover",
31
+ name: "report-cover.svg",
32
+ status: "done",
33
+ thumbUrl: placeholderImage("Report"),
34
+ },
35
+ ] satisfies NonNullable<AttachmentsProps["items"]>;
36
+
37
+ function RemovableAttachments() {
38
+ const [items, setItems] = useState(fileStates.filter((item) => item.status === "done"));
39
+
40
+ return (
41
+ <Attachments
42
+ beforeUpload={preventUpload}
43
+ items={items}
44
+ onRemove={(file) => {
45
+ setItems((current) => current.filter((item) => item.uid !== file.uid));
46
+ return true;
47
+ }}
48
+ overflow="wrap"
49
+ />
50
+ );
51
+ }
52
+
53
+ const meta = {
54
+ title: "Ant Design X/Attachments",
55
+ component: Attachments,
56
+ tags: ["autodocs"],
57
+ parameters: antDesignXStoryParameters(
58
+ "attachments",
59
+ "All examples use local fixture data and prevent uploads.",
60
+ ),
61
+ } satisfies Meta<typeof Attachments>;
62
+
63
+ export default meta;
64
+ type Story = StoryObj<typeof meta>;
65
+
66
+ export const FileStates: Story = {
67
+ render: () => (
68
+ <StoryFrame style={{ width: 720 }}>
69
+ <Attachments beforeUpload={preventUpload} items={fileStates} overflow="wrap" />
70
+ </StoryFrame>
71
+ ),
72
+ };
73
+
74
+ export const RemovableList: Story = {
75
+ render: () => (
76
+ <StoryFrame style={{ width: 720 }}>
77
+ <RemovableAttachments />
78
+ </StoryFrame>
79
+ ),
80
+ };
81
+
82
+ export const DisabledDropArea: Story = {
83
+ render: () => (
84
+ <StoryFrame>
85
+ <Attachments
86
+ beforeUpload={preventUpload}
87
+ disabled
88
+ items={[]}
89
+ placeholder={{
90
+ icon: (
91
+ <span style={{ fontSize: 28 }} aria-hidden>
92
+ ↑
93
+ </span>
94
+ ),
95
+ title: "Drop reference files here",
96
+ description: "File selection is disabled in this Storybook example.",
97
+ }}
98
+ />
99
+ </StoryFrame>
100
+ ),
101
+ };
@@ -0,0 +1,78 @@
1
+ import type { Meta, StoryObj } from "@storybook/react-vite";
2
+
3
+ import { Avatar, Bubble, type BubbleListProps, Flex } from "../../index";
4
+ import { antDesignXStoryParameters, StoryFrame } from "../storyHelpers";
5
+
6
+ const conversationItems: BubbleListProps["items"] = [
7
+ {
8
+ key: "welcome",
9
+ role: "system",
10
+ content: "New conversation started",
11
+ },
12
+ {
13
+ key: "question",
14
+ role: "user",
15
+ content: "Summarize the latest project update.",
16
+ },
17
+ {
18
+ key: "answer",
19
+ role: "ai",
20
+ content: "The project is on schedule, with research complete and implementation underway.",
21
+ },
22
+ {
23
+ key: "milestone",
24
+ role: "divider",
25
+ content: "Today",
26
+ },
27
+ ];
28
+
29
+ const meta = {
30
+ title: "Ant Design X/Bubble",
31
+ component: Bubble,
32
+ args: { content: "" },
33
+ tags: ["autodocs"],
34
+ parameters: antDesignXStoryParameters("bubble"),
35
+ } satisfies Meta<typeof Bubble>;
36
+
37
+ export default meta;
38
+ type Story = StoryObj<typeof meta>;
39
+
40
+ export const Basic: Story = {
41
+ render: () => (
42
+ <StoryFrame>
43
+ <Bubble
44
+ avatar={<Avatar>AI</Avatar>}
45
+ content="Hello! How can I help with your project today?"
46
+ footer="Generated locally for this preview"
47
+ header="Project assistant"
48
+ />
49
+ </StoryFrame>
50
+ ),
51
+ };
52
+
53
+ export const ConversationList: Story = {
54
+ render: () => (
55
+ <StoryFrame style={{ height: 420, width: 720 }}>
56
+ <Bubble.List
57
+ items={conversationItems}
58
+ role={{
59
+ ai: { avatar: <Avatar>AI</Avatar>, placement: "start" },
60
+ user: { avatar: <Avatar>YO</Avatar>, placement: "end" },
61
+ }}
62
+ />
63
+ </StoryFrame>
64
+ ),
65
+ };
66
+
67
+ export const VariantsAndShapes: Story = {
68
+ render: () => (
69
+ <StoryFrame>
70
+ <Flex vertical gap={16}>
71
+ <Bubble content="Filled default bubble" variant="filled" />
72
+ <Bubble content="Outlined round bubble" shape="round" variant="outlined" />
73
+ <Bubble content="Shadow corner bubble" placement="end" shape="corner" variant="shadow" />
74
+ <Bubble content="Borderless bubble" variant="borderless" />
75
+ </Flex>
76
+ </StoryFrame>
77
+ ),
78
+ };