@baishuyun/ai-design 2.0.37 → 2.1.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.storybook/main.ts +31 -31
- package/.storybook/preview.ts +16 -16
- package/CHANGELOG.md +512 -492
- package/components.json +22 -22
- package/package.json +9 -6
- package/scripts/strip-layers.cjs +41 -41
- package/src/components/abs-fullscreen-gradient-bg.tsx +35 -35
- package/src/components/agent-helper/agent-category-select-menu/index.tsx +57 -57
- package/src/components/agent-helper/agent-entry-card/index.tsx +94 -94
- package/src/components/agent-helper/agent-helper-card/index.tsx +179 -179
- package/src/components/agent-helper/agent-helper-card-list/index.tsx +59 -59
- package/src/components/agent-helper/agent-helper-main-layout/index.tsx +60 -60
- package/src/components/agent-helper/agent-sort-select/index.tsx +89 -89
- package/src/components/agent-helper/agent-tag/index.tsx +29 -29
- package/src/components/agent-helper/app-select/index.tsx +559 -559
- package/src/components/agent-helper/condition-group/index.tsx +75 -75
- package/src/components/agent-helper/condition-input/index.tsx +233 -233
- package/src/components/agent-helper/condition-item/index.tsx +237 -237
- package/src/components/agent-helper/condition-quantifier-select/index.tsx +142 -142
- package/src/components/agent-helper/condition-trigger-description/index.tsx +49 -49
- package/src/components/agent-helper/date-picker/calendar-panel.tsx +164 -164
- package/src/components/agent-helper/date-picker/date-input.tsx +91 -91
- package/src/components/agent-helper/date-picker/date-picker.tsx +327 -327
- package/src/components/agent-helper/date-picker/footer-panel.tsx +44 -44
- package/src/components/agent-helper/date-picker/index.ts +3 -3
- package/src/components/agent-helper/date-picker/month-panel.tsx +82 -82
- package/src/components/agent-helper/date-picker/time-panel.tsx +146 -146
- package/src/components/agent-helper/date-picker/types.ts +37 -37
- package/src/components/agent-helper/date-picker/utils.ts +121 -121
- package/src/components/agent-helper/date-picker/year-panel.tsx +86 -86
- package/src/components/agent-helper/exec-log-filter/index.tsx +232 -232
- package/src/components/agent-helper/field-edit-preference-select/index.tsx +291 -291
- package/src/components/agent-helper/field-select/index.tsx +466 -466
- package/src/components/agent-helper/field-value-input/china-address-data.ts +4117 -4117
- package/src/components/agent-helper/field-value-input/display.tsx +71 -71
- package/src/components/agent-helper/field-value-input/icons.tsx +38 -38
- package/src/components/agent-helper/field-value-input/index.tsx +144 -144
- package/src/components/agent-helper/field-value-input/inputs.tsx +247 -247
- package/src/components/agent-helper/field-value-input/picker-inputs.tsx +1141 -1141
- package/src/components/agent-helper/flow-node-action-trigger-select/index.tsx +57 -57
- package/src/components/agent-helper/form-action-trigger-select/index.tsx +60 -60
- package/src/components/agent-helper/form-divider/index.tsx +44 -44
- package/src/components/agent-helper/form-select/index.tsx +732 -732
- package/src/components/agent-helper/monthdays-select/index.tsx +378 -378
- package/src/components/agent-helper/offset-preference-select/index.tsx +268 -268
- package/src/components/agent-helper/offset-type-select/index.tsx +66 -66
- package/src/components/agent-helper/offset-unit-select/index.tsx +54 -54
- package/src/components/agent-helper/placeholder-card/index.tsx +75 -75
- package/src/components/agent-helper/prompt-input/index.tsx +646 -640
- package/src/components/agent-helper/relational-operator-select/index.tsx +179 -179
- package/src/components/agent-helper/repeat-by-type-select/index.tsx +53 -53
- package/src/components/agent-helper/repeat-preference-select/index.tsx +162 -162
- package/src/components/agent-helper/repeat-preference-type-select/index.tsx +58 -58
- package/src/components/agent-helper/search-input/index.tsx +35 -35
- package/src/components/agent-helper/table/index.tsx +114 -114
- package/src/components/agent-helper/trigger-select/index.tsx +121 -121
- package/src/components/agent-helper/trigger-time-preference-select/index.tsx +189 -189
- package/src/components/agent-helper/trigger-time-source-type-select/index.tsx +53 -53
- package/src/components/agent-helper/weekdays-select/index.tsx +230 -230
- package/src/components/agent-scroll-selector.tsx +193 -193
- package/src/components/agent-select.tsx +154 -154
- package/src/components/attachment-part-group.tsx +35 -35
- package/src/components/attachment-part.tsx +296 -296
- package/src/components/attachments-previewer.tsx +272 -272
- package/src/components/base-button.tsx +49 -49
- package/src/components/border-animation.tsx +107 -107
- package/src/components/border-color-animation.tsx +66 -66
- package/src/components/bot-avatar-name.tsx +36 -36
- package/src/components/bot-icon.tsx +23 -23
- package/src/components/bs-entry-select/app-group-folder.tsx +61 -61
- package/src/components/bs-entry-select/bs-entry-select.tsx +296 -296
- package/src/components/bs-entry-select/build-tree.ts +265 -265
- package/src/components/bs-entry-select/entry-item.tsx +45 -45
- package/src/components/bs-entry-select/entry-popover.tsx +99 -99
- package/src/components/bs-entry-select/index.ts +7 -7
- package/src/components/bs-entry-select/other-app-section.tsx +96 -96
- package/src/components/bs-entry-select/scroll-slider.tsx +872 -872
- package/src/components/bs-entry-select/search-input.tsx +4 -4
- package/src/components/bs-entry-select/tree-item-node.tsx +84 -84
- package/src/components/bs-entry-select/types.ts +46 -46
- package/src/components/bs-icons.tsx +1362 -1362
- package/src/components/card-field.tsx +23 -23
- package/src/components/card.tsx +36 -36
- package/src/components/chat-area-header.tsx +65 -65
- package/src/components/check-card.tsx +77 -77
- package/src/components/circle-checker.tsx +66 -66
- package/src/components/collapsible-txt-msg.tsx +75 -75
- package/src/components/collapsible.tsx +9 -9
- package/src/components/confirm-dialog.tsx +139 -139
- package/src/components/date-range-picker.tsx +91 -91
- package/src/components/fake-bot-msg.tsx +51 -51
- package/src/components/field-checker-list-msg.tsx +146 -146
- package/src/components/field-checker.tsx +185 -185
- package/src/components/field-icon.tsx +13 -13
- package/src/components/field-value-checker.tsx +116 -116
- package/src/components/fields-design-info-table.tsx +160 -160
- package/src/components/fields-generating-indicator.tsx +95 -95
- package/src/components/fields-portal.tsx +18 -18
- package/src/components/fields-previewer.tsx +216 -216
- package/src/components/font-icon.tsx +65 -65
- package/src/components/form-info-editor.tsx +263 -263
- package/src/components/formula-tag.tsx +32 -32
- package/src/components/generate-animation.tsx +56 -56
- package/src/components/icon-btn.tsx +43 -43
- package/src/components/icon-card.tsx +67 -67
- package/src/components/icons/calendar-icon.tsx +5 -5
- package/src/components/icons/clear-all-icon.tsx +5 -5
- package/src/components/icons/empty-agent-icon.tsx +93 -93
- package/src/components/icons/empty-table-icon.tsx +104 -104
- package/src/components/icons/grids-icon.tsx +5 -5
- package/src/components/img-part.tsx +27 -27
- package/src/components/legacy-slot.tsx +110 -110
- package/src/components/line-checker.tsx +168 -168
- package/src/components/linear-gradient-border-btn.tsx +48 -48
- package/src/components/linear-gradient-color-bg-animation.tsx +103 -103
- package/src/components/memoized-markdown.tsx +32 -32
- package/src/components/message-content.tsx +21 -21
- package/src/components/number-part.tsx +46 -46
- package/src/components/office-container.tsx +289 -265
- package/src/components/option-item.tsx +27 -27
- package/src/components/output-config-editor.tsx +478 -478
- package/src/components/previewer-header.tsx +270 -270
- package/src/components/primary-confirm-btn.tsx +58 -58
- package/src/components/primary-entry-btn.tsx +48 -48
- package/src/components/radio-card.tsx +63 -63
- package/src/components/scroll-to-bottom-btn.tsx +28 -28
- package/src/components/split-line.tsx +9 -9
- package/src/components/square-checker.tsx +87 -87
- package/src/components/subform-fields-value-checker.tsx +184 -184
- package/src/components/tab-radio-group.tsx +83 -83
- package/src/components/tooltip.tsx +53 -53
- package/src/components/ui/button.tsx +51 -51
- package/src/components/ui/calendar.tsx +57 -57
- package/src/components/ui/dialog.tsx +104 -104
- package/src/components/ui/drawer.tsx +279 -279
- package/src/components/ui/form.tsx +202 -202
- package/src/components/ui/icons.tsx +1267 -1267
- package/src/components/ui/input.tsx +28 -28
- package/src/components/ui/label.tsx +30 -30
- package/src/components/ui/popover.tsx +85 -85
- package/src/components/ui/select.tsx +236 -236
- package/src/components/ui/spinner.tsx +17 -17
- package/src/components/ui/switch.tsx +33 -33
- package/src/components/ui/tabs.tsx +62 -62
- package/src/components/ui/textarea.tsx +28 -28
- package/src/components/ui/tooltip.tsx +53 -53
- package/src/components/user-txt-msg-bubble.tsx +47 -47
- package/src/components/warning-msg.tsx +27 -27
- package/src/const/ui.ts +119 -119
- package/src/css.d.ts +4 -4
- package/src/hooks/use-column-appear.ts +78 -78
- package/src/hooks/use-portal-container.ts +27 -27
- package/src/hooks/use-resizable-width.ts +129 -129
- package/src/hooks/use-select-popover-position.ts +74 -74
- package/src/hooks/use-shadow.ts +127 -127
- package/src/index.ts +226 -226
- package/src/lib/utils.ts +138 -138
- package/src/stories/AbsFullscreenGradientBg.stories.tsx +36 -36
- package/src/stories/AgentCategorySelectMenu.stories.tsx +33 -33
- package/src/stories/AgentEntryCard.stories.tsx +90 -90
- package/src/stories/AgentHelperCard.stories.tsx +105 -105
- package/src/stories/AgentHelperCardList.stories.tsx +120 -120
- package/src/stories/AgentHelperMainLayout.stories.tsx +71 -71
- package/src/stories/AgentScrollSelector.stories.tsx +95 -95
- package/src/stories/AgentSelect.stories.tsx +134 -134
- package/src/stories/AgentTag.stories.tsx +44 -44
- package/src/stories/AppSelect.stories.tsx +250 -250
- package/src/stories/AttachmentPart.stories.tsx +122 -122
- package/src/stories/AttachmentPartGroup.stories.tsx +152 -152
- package/src/stories/AttachmentsPreviewer.stories.tsx +306 -306
- package/src/stories/BaseButton.stories.tsx +33 -33
- package/src/stories/BorderAnimation.stories.tsx +116 -116
- package/src/stories/BorderColorAnimation.stories.tsx +63 -63
- package/src/stories/BotAvatarAndName.stories.ts +24 -24
- package/src/stories/BotIcon.stories.ts +22 -22
- package/src/stories/BsConditionInput.stories.tsx +460 -460
- package/src/stories/BsEntrySelect.stories.tsx +343 -343
- package/src/stories/BsTooltip.stories.tsx +32 -32
- package/src/stories/Card.stories.tsx +28 -28
- package/src/stories/CardField.stories.tsx +87 -87
- package/src/stories/ChatAreaHeader.stories.ts +26 -26
- package/src/stories/CheckCard.stories.tsx +114 -114
- package/src/stories/CircleChecker.stories.tsx +89 -89
- package/src/stories/CollapsibleTextMsg.stories.ts +44 -44
- package/src/stories/ConditionGroup.stories.tsx +216 -216
- package/src/stories/ConditionInput.stories.tsx +502 -502
- package/src/stories/ConditionItem.stories.tsx +163 -163
- package/src/stories/ConditonQuantifierSelect.stories.tsx +54 -54
- package/src/stories/ConditonTriggerDescription.stories.tsx +61 -61
- package/src/stories/ConfirmDialog.stories.tsx +123 -123
- package/src/stories/DataTable.stories.tsx +191 -191
- package/src/stories/DatePicker.stories.tsx +174 -174
- package/src/stories/ExecLogFilter.stories.tsx +145 -145
- package/src/stories/FakeBotMsg.stories.tsx +36 -36
- package/src/stories/FieldEditPreferenceSelect.stories.tsx +161 -161
- package/src/stories/FieldSelect.stories.tsx +228 -228
- package/src/stories/FieldValueInput.stories.tsx +442 -442
- package/src/stories/FlowNodeActionTriggerSelect.stories.tsx +80 -80
- package/src/stories/Form.stories.tsx +302 -302
- package/src/stories/FormActionTriggerSelect.stories.tsx +80 -80
- package/src/stories/FormDivider.stories.tsx +31 -31
- package/src/stories/FormInfoEditor.stories.tsx +173 -173
- package/src/stories/FormSelect.stories.tsx +222 -222
- package/src/stories/FormulaTag.stories.tsx +68 -68
- package/src/stories/GenerateAnimation.stories.ts +20 -20
- package/src/stories/IconBtn.stories.tsx +32 -32
- package/src/stories/IconCard.stories.tsx +35 -35
- package/src/stories/IconLib.tsx +45 -45
- package/src/stories/Icons.stories.ts +22 -22
- package/src/stories/ImgMsgPart.stories.tsx +42 -42
- package/src/stories/Input.stories.tsx +102 -102
- package/src/stories/Label.stories.tsx +66 -66
- package/src/stories/LegacySlot.stories.tsx +56 -56
- package/src/stories/LineChecker.stories.tsx +133 -133
- package/src/stories/LinearGradientBorderBtn.stories.tsx +86 -86
- package/src/stories/LinearGradientColorBgAnimation.stories.tsx +60 -60
- package/src/stories/MemoizedMarkdown.stories.tsx +102 -102
- package/src/stories/MessageContent.stories.tsx +36 -36
- package/src/stories/MonthdaysSelect.stories.tsx +78 -78
- package/src/stories/NumbersMsgPart.stories.tsx +42 -42
- package/src/stories/OfficeContainer.stories.tsx +287 -287
- package/src/stories/OffsetPreferenceSelect.stories.tsx +118 -118
- package/src/stories/OffsetTypeSelect.stories.tsx +75 -75
- package/src/stories/OffsetUnitSelect.stories.tsx +61 -61
- package/src/stories/OptionItem.stories.tsx +77 -77
- package/src/stories/OutputConfigEditor.stories.tsx +96 -96
- package/src/stories/PlaceholderCard.stories.tsx +35 -35
- package/src/stories/PreviewerHeader.stories.tsx +91 -91
- package/src/stories/PrimaryConfirmBtn.stories.tsx +60 -60
- package/src/stories/PrimaryEntryBtn.stories.tsx +74 -74
- package/src/stories/PromptInput.stories.tsx +228 -228
- package/src/stories/RadioCard.stories.tsx +103 -103
- package/src/stories/RelationalOperatorSelect.stories.tsx +61 -61
- package/src/stories/RepeatByTypeSelect.stories.tsx +58 -58
- package/src/stories/RepeatPreferenceSelect.stories.tsx +107 -107
- package/src/stories/RepeatPreferenceTypeSelect.stories.tsx +58 -58
- package/src/stories/ScrollToBottom.stories.tsx +24 -24
- package/src/stories/SearchInput.stories.tsx +50 -50
- package/src/stories/Select.stories.tsx +128 -128
- package/src/stories/SplitLine.stories.tsx +40 -40
- package/src/stories/SquareChecker.stories.tsx +96 -96
- package/src/stories/TabRadioGroup.stories.tsx +84 -84
- package/src/stories/Textarea.stories.tsx +67 -67
- package/src/stories/TriggerSelect.stories.tsx +48 -48
- package/src/stories/TriggerTimePreferenceSelect.stories.tsx +106 -106
- package/src/stories/TriggerTimeSourceTypeSelect.stories.tsx +68 -68
- package/src/stories/UserTextMsgBubble.stories.ts +24 -24
- package/src/stories/WarningMessage.stories.tsx +23 -23
- package/src/stories/WeekdaysSelect.stories.tsx +66 -66
- package/src/stories/assets/demo.css +539 -539
- package/src/stories/assets/demo_index.html +7988 -7988
- package/src/stories/assets/iconfont.css +1377 -1377
- package/src/stories/assets/iconfont.json +2382 -2382
- package/src/stories/assets/iconfont.svg +697 -697
- package/src/stories/collapsible.stories.tsx +47 -47
- package/src/stories/drawer.stories.tsx +196 -196
- package/src/stories/field-checker-list-msg.stories.tsx +95 -95
- package/src/stories/field-checker.stories.tsx +117 -117
- package/src/stories/field-icon.stories.tsx +70 -70
- package/src/stories/field-value-checker.stories.tsx +113 -113
- package/src/stories/fields-design-info-table.stories.tsx +203 -203
- package/src/stories/fields-generating.stories.tsx +41 -41
- package/src/stories/fields-previewer.stories.tsx +77 -77
- package/src/stories/subform-fields-value-checker.stories.tsx +98 -98
- package/src/style.css +226 -226
- package/src/types.ts +8 -8
- package/style.css +3652 -3652
- package/tsconfig.json +13 -13
- package/vite.config.ts +44 -44
|
@@ -1,287 +1,287 @@
|
|
|
1
|
-
import { useState } from "react";
|
|
2
|
-
import type { Meta, StoryObj } from "@storybook/react-vite";
|
|
3
|
-
|
|
4
|
-
import { OfficeContainer, type FullScreenPart } from "../components/office-container";
|
|
5
|
-
|
|
6
|
-
const meta: Meta<typeof OfficeContainer> = {
|
|
7
|
-
title: "AI Office/OfficeContainer",
|
|
8
|
-
component: OfficeContainer,
|
|
9
|
-
tags: ["autodocs"],
|
|
10
|
-
argTypes: {
|
|
11
|
-
onResize: { action: "resized" },
|
|
12
|
-
},
|
|
13
|
-
parameters: {
|
|
14
|
-
layout: "fullscreen",
|
|
15
|
-
},
|
|
16
|
-
decorators: [
|
|
17
|
-
(Story) => (
|
|
18
|
-
<div style={{ height: "100vh", width: "100vw", overflow: "hidden" }}>
|
|
19
|
-
<Story />
|
|
20
|
-
</div>
|
|
21
|
-
),
|
|
22
|
-
],
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
export default meta;
|
|
26
|
-
type Story = StoryObj<typeof meta>;
|
|
27
|
-
|
|
28
|
-
const PlaceholderHeader = ({
|
|
29
|
-
children,
|
|
30
|
-
// bg = "bg-blue-500",
|
|
31
|
-
}: {
|
|
32
|
-
children: React.ReactNode;
|
|
33
|
-
bg?: string;
|
|
34
|
-
}) => (
|
|
35
|
-
<div className={`h-full w-full flex items-center px-4`}>
|
|
36
|
-
<span className="text-sm font-semibold">{children}</span>
|
|
37
|
-
</div>
|
|
38
|
-
);
|
|
39
|
-
|
|
40
|
-
const PlaceholderContent = ({
|
|
41
|
-
children,
|
|
42
|
-
bg = "bg-blue-50",
|
|
43
|
-
}: {
|
|
44
|
-
children: React.ReactNode;
|
|
45
|
-
bg?: string;
|
|
46
|
-
}) => (
|
|
47
|
-
<div className={`h-500 rounded-lg border-2 border-dashed border-gray-300 p-4 text-gray-500 ${bg} m-4`}>
|
|
48
|
-
{children}
|
|
49
|
-
</div>
|
|
50
|
-
);
|
|
51
|
-
|
|
52
|
-
export const Base: Story = {
|
|
53
|
-
args: {
|
|
54
|
-
headerHeight: 64,
|
|
55
|
-
leftColHeaderElement: <PlaceholderHeader>Left Header</PlaceholderHeader>,
|
|
56
|
-
leftColContentElement: (
|
|
57
|
-
<PlaceholderContent>Left Content (scrollable)</PlaceholderContent>
|
|
58
|
-
),
|
|
59
|
-
rightColHeaderElement: (
|
|
60
|
-
<PlaceholderHeader bg="bg-emerald-500">Right Header</PlaceholderHeader>
|
|
61
|
-
),
|
|
62
|
-
rightColContentElement: (
|
|
63
|
-
<PlaceholderContent bg="bg-emerald-50">
|
|
64
|
-
Right Content (scrollable)
|
|
65
|
-
</PlaceholderContent>
|
|
66
|
-
),
|
|
67
|
-
},
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
export const CustomHeaderHeight: Story = {
|
|
71
|
-
args: {
|
|
72
|
-
headerHeight: 96,
|
|
73
|
-
leftColHeaderElement: (
|
|
74
|
-
<PlaceholderHeader>Left Header (96px)</PlaceholderHeader>
|
|
75
|
-
),
|
|
76
|
-
leftColContentElement: <PlaceholderContent>Left Content</PlaceholderContent>,
|
|
77
|
-
rightColHeaderElement: (
|
|
78
|
-
<PlaceholderHeader bg="bg-emerald-500">
|
|
79
|
-
Right Header (96px)
|
|
80
|
-
</PlaceholderHeader>
|
|
81
|
-
),
|
|
82
|
-
rightColContentElement: (
|
|
83
|
-
<PlaceholderContent bg="bg-emerald-50">Right Content</PlaceholderContent>
|
|
84
|
-
),
|
|
85
|
-
},
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
export const RightColResizable: Story = {
|
|
89
|
-
args: {
|
|
90
|
-
rightColWidthRange: [400, 700],
|
|
91
|
-
leftColHeaderElement: (
|
|
92
|
-
<PlaceholderHeader>Left Header (flexible)</PlaceholderHeader>
|
|
93
|
-
),
|
|
94
|
-
leftColContentElement: (
|
|
95
|
-
<PlaceholderContent>
|
|
96
|
-
Left Content — this column now flex-fills remaining space
|
|
97
|
-
</PlaceholderContent>
|
|
98
|
-
),
|
|
99
|
-
rightColHeaderElement: (
|
|
100
|
-
<PlaceholderHeader bg="bg-emerald-500">
|
|
101
|
-
Right Header (resizable)
|
|
102
|
-
</PlaceholderHeader>
|
|
103
|
-
),
|
|
104
|
-
rightColContentElement: (
|
|
105
|
-
<PlaceholderContent bg="bg-emerald-50">
|
|
106
|
-
Right Content — drag the resizer to resize this column (400–700px)
|
|
107
|
-
</PlaceholderContent>
|
|
108
|
-
),
|
|
109
|
-
},
|
|
110
|
-
};
|
|
111
|
-
|
|
112
|
-
export const CustomColumnStyles: Story = {
|
|
113
|
-
args: {
|
|
114
|
-
leftColCls: "bg-amber-50",
|
|
115
|
-
rightColCls: "bg-sky-50",
|
|
116
|
-
leftColHeaderElement: <PlaceholderHeader>Left (amber-50 bg)</PlaceholderHeader>,
|
|
117
|
-
leftColContentElement: (
|
|
118
|
-
<PlaceholderContent bg="bg-amber-100">
|
|
119
|
-
Custom left column background via leftColCls
|
|
120
|
-
</PlaceholderContent>
|
|
121
|
-
),
|
|
122
|
-
rightColHeaderElement: (
|
|
123
|
-
<PlaceholderHeader bg="bg-sky-500">Right (sky-50 bg)</PlaceholderHeader>
|
|
124
|
-
),
|
|
125
|
-
rightColContentElement: (
|
|
126
|
-
<PlaceholderContent bg="bg-sky-100">
|
|
127
|
-
Custom right column background via rightColCls
|
|
128
|
-
</PlaceholderContent>
|
|
129
|
-
),
|
|
130
|
-
},
|
|
131
|
-
};
|
|
132
|
-
|
|
133
|
-
export const FullscreenLeftCol: Story = {
|
|
134
|
-
args: {
|
|
135
|
-
fullscreenPart: "leftCol",
|
|
136
|
-
leftColHeaderElement: <PlaceholderHeader>Left Header (Fullscreen)</PlaceholderHeader>,
|
|
137
|
-
leftColContentElement: (
|
|
138
|
-
<PlaceholderContent>Left Content — now filling the entire viewport</PlaceholderContent>
|
|
139
|
-
),
|
|
140
|
-
rightColHeaderElement: (
|
|
141
|
-
<PlaceholderHeader bg="bg-emerald-500">Right Header (hidden)</PlaceholderHeader>
|
|
142
|
-
),
|
|
143
|
-
rightColContentElement: (
|
|
144
|
-
<PlaceholderContent bg="bg-emerald-50">
|
|
145
|
-
Right Content — hidden when left is fullscreen
|
|
146
|
-
</PlaceholderContent>
|
|
147
|
-
),
|
|
148
|
-
},
|
|
149
|
-
};
|
|
150
|
-
|
|
151
|
-
export const FullscreenRightCol: Story = {
|
|
152
|
-
args: {
|
|
153
|
-
fullscreenPart: "rightCol",
|
|
154
|
-
leftColHeaderElement: <PlaceholderHeader>Left Header (hidden)</PlaceholderHeader>,
|
|
155
|
-
leftColContentElement: (
|
|
156
|
-
<PlaceholderContent>
|
|
157
|
-
Left Content — hidden when right is fullscreen
|
|
158
|
-
</PlaceholderContent>
|
|
159
|
-
),
|
|
160
|
-
rightColHeaderElement: (
|
|
161
|
-
<PlaceholderHeader bg="bg-emerald-500">Right Header (Fullscreen)</PlaceholderHeader>
|
|
162
|
-
),
|
|
163
|
-
rightColContentElement: (
|
|
164
|
-
<PlaceholderContent bg="bg-emerald-50">
|
|
165
|
-
Right Content — now filling the entire viewport
|
|
166
|
-
</PlaceholderContent>
|
|
167
|
-
),
|
|
168
|
-
},
|
|
169
|
-
};
|
|
170
|
-
|
|
171
|
-
const WidthReadout = ({ leftW, rightW }: { leftW: number; rightW: number }) => (
|
|
172
|
-
<div
|
|
173
|
-
style={{
|
|
174
|
-
position: "absolute",
|
|
175
|
-
bottom: 12,
|
|
176
|
-
left: "50%",
|
|
177
|
-
transform: "translateX(-50%)",
|
|
178
|
-
zIndex: 20,
|
|
179
|
-
background: "rgba(0,0,0,0.75)",
|
|
180
|
-
color: "#fff",
|
|
181
|
-
padding: "6px 16px",
|
|
182
|
-
borderRadius: 6,
|
|
183
|
-
fontSize: 13,
|
|
184
|
-
fontFamily: "monospace",
|
|
185
|
-
display: "flex",
|
|
186
|
-
gap: 16,
|
|
187
|
-
}}
|
|
188
|
-
>
|
|
189
|
-
<span>Left: {leftW}px</span>
|
|
190
|
-
<span>Right: {rightW}px</span>
|
|
191
|
-
</div>
|
|
192
|
-
);
|
|
193
|
-
|
|
194
|
-
export const OnResize: Story = {
|
|
195
|
-
render: () => {
|
|
196
|
-
const [widths, setWidths] = useState({ left: 0, right: 0 });
|
|
197
|
-
|
|
198
|
-
return (
|
|
199
|
-
<div style={{ height: "100vh", width: "100vw", position: "relative" }}>
|
|
200
|
-
<OfficeContainer
|
|
201
|
-
rightColWidthRange={[400, 700]}
|
|
202
|
-
leftColHeaderElement={<PlaceholderHeader>Left Header (flexible)</PlaceholderHeader>}
|
|
203
|
-
leftColContentElement={
|
|
204
|
-
<PlaceholderContent>
|
|
205
|
-
Drag the resizer — the width readout at the bottom updates in real time via onResize.
|
|
206
|
-
</PlaceholderContent>
|
|
207
|
-
}
|
|
208
|
-
rightColHeaderElement={
|
|
209
|
-
<PlaceholderHeader bg="bg-emerald-500">Right Header (resizable)</PlaceholderHeader>
|
|
210
|
-
}
|
|
211
|
-
rightColContentElement={
|
|
212
|
-
<PlaceholderContent bg="bg-emerald-50">
|
|
213
|
-
Right column: 400–700px
|
|
214
|
-
</PlaceholderContent>
|
|
215
|
-
}
|
|
216
|
-
onResize={(leftW, rightW) => setWidths({ left: leftW, right: rightW })}
|
|
217
|
-
/>
|
|
218
|
-
<WidthReadout leftW={widths.left} rightW={widths.right} />
|
|
219
|
-
</div>
|
|
220
|
-
);
|
|
221
|
-
},
|
|
222
|
-
};
|
|
223
|
-
|
|
224
|
-
export const ToggleFullscreen: Story = {
|
|
225
|
-
render: () => {
|
|
226
|
-
const [part, setPart] = useState<FullScreenPart>("none");
|
|
227
|
-
|
|
228
|
-
const labels: Record<FullScreenPart, string> = {
|
|
229
|
-
none: "Normal",
|
|
230
|
-
leftCol: "Left Fullscreen",
|
|
231
|
-
rightCol: "Right Fullscreen",
|
|
232
|
-
};
|
|
233
|
-
|
|
234
|
-
return (
|
|
235
|
-
<div style={{ height: "100vh", width: "100vw", display: "flex", flexDirection: "column" }}>
|
|
236
|
-
<div
|
|
237
|
-
style={{
|
|
238
|
-
position: "absolute",
|
|
239
|
-
top: 12,
|
|
240
|
-
left: "50%",
|
|
241
|
-
transform: "translateX(-50%)",
|
|
242
|
-
zIndex: 20,
|
|
243
|
-
display: "flex",
|
|
244
|
-
gap: 8,
|
|
245
|
-
}}
|
|
246
|
-
>
|
|
247
|
-
{(["none", "leftCol", "rightCol"] as FullScreenPart[]).map((p) => (
|
|
248
|
-
<button
|
|
249
|
-
key={p}
|
|
250
|
-
onClick={() => setPart(p)}
|
|
251
|
-
style={{
|
|
252
|
-
padding: "6px 16px",
|
|
253
|
-
borderRadius: 6,
|
|
254
|
-
border: part === p ? "2px solid #0265fc" : "1px solid #d0d0d0",
|
|
255
|
-
background: part === p ? "#e8f0fe" : "#fff",
|
|
256
|
-
cursor: "pointer",
|
|
257
|
-
fontSize: 13,
|
|
258
|
-
fontWeight: part === p ? 600 : 400,
|
|
259
|
-
}}
|
|
260
|
-
>
|
|
261
|
-
{labels[p]}
|
|
262
|
-
</button>
|
|
263
|
-
))}
|
|
264
|
-
</div>
|
|
265
|
-
<div style={{ flex: 1 }}>
|
|
266
|
-
<OfficeContainer
|
|
267
|
-
fullscreenPart={part}
|
|
268
|
-
leftColHeaderElement={<PlaceholderHeader>Left Header</PlaceholderHeader>}
|
|
269
|
-
leftColContentElement={
|
|
270
|
-
<PlaceholderContent>
|
|
271
|
-
Left Content — watch the smooth transition when toggling fullscreen
|
|
272
|
-
</PlaceholderContent>
|
|
273
|
-
}
|
|
274
|
-
rightColHeaderElement={
|
|
275
|
-
<PlaceholderHeader bg="bg-emerald-500">Right Header</PlaceholderHeader>
|
|
276
|
-
}
|
|
277
|
-
rightColContentElement={
|
|
278
|
-
<PlaceholderContent bg="bg-emerald-50">
|
|
279
|
-
Right Content — watch the smooth transition when toggling fullscreen
|
|
280
|
-
</PlaceholderContent>
|
|
281
|
-
}
|
|
282
|
-
/>
|
|
283
|
-
</div>
|
|
284
|
-
</div>
|
|
285
|
-
);
|
|
286
|
-
},
|
|
287
|
-
};
|
|
1
|
+
import { useState } from "react";
|
|
2
|
+
import type { Meta, StoryObj } from "@storybook/react-vite";
|
|
3
|
+
|
|
4
|
+
import { OfficeContainer, type FullScreenPart } from "../components/office-container";
|
|
5
|
+
|
|
6
|
+
const meta: Meta<typeof OfficeContainer> = {
|
|
7
|
+
title: "AI Office/OfficeContainer",
|
|
8
|
+
component: OfficeContainer,
|
|
9
|
+
tags: ["autodocs"],
|
|
10
|
+
argTypes: {
|
|
11
|
+
onResize: { action: "resized" },
|
|
12
|
+
},
|
|
13
|
+
parameters: {
|
|
14
|
+
layout: "fullscreen",
|
|
15
|
+
},
|
|
16
|
+
decorators: [
|
|
17
|
+
(Story) => (
|
|
18
|
+
<div style={{ height: "100vh", width: "100vw", overflow: "hidden" }}>
|
|
19
|
+
<Story />
|
|
20
|
+
</div>
|
|
21
|
+
),
|
|
22
|
+
],
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export default meta;
|
|
26
|
+
type Story = StoryObj<typeof meta>;
|
|
27
|
+
|
|
28
|
+
const PlaceholderHeader = ({
|
|
29
|
+
children,
|
|
30
|
+
// bg = "bg-blue-500",
|
|
31
|
+
}: {
|
|
32
|
+
children: React.ReactNode;
|
|
33
|
+
bg?: string;
|
|
34
|
+
}) => (
|
|
35
|
+
<div className={`h-full w-full flex items-center px-4`}>
|
|
36
|
+
<span className="text-sm font-semibold">{children}</span>
|
|
37
|
+
</div>
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
const PlaceholderContent = ({
|
|
41
|
+
children,
|
|
42
|
+
bg = "bg-blue-50",
|
|
43
|
+
}: {
|
|
44
|
+
children: React.ReactNode;
|
|
45
|
+
bg?: string;
|
|
46
|
+
}) => (
|
|
47
|
+
<div className={`h-500 rounded-lg border-2 border-dashed border-gray-300 p-4 text-gray-500 ${bg} m-4`}>
|
|
48
|
+
{children}
|
|
49
|
+
</div>
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
export const Base: Story = {
|
|
53
|
+
args: {
|
|
54
|
+
headerHeight: 64,
|
|
55
|
+
leftColHeaderElement: <PlaceholderHeader>Left Header</PlaceholderHeader>,
|
|
56
|
+
leftColContentElement: (
|
|
57
|
+
<PlaceholderContent>Left Content (scrollable)</PlaceholderContent>
|
|
58
|
+
),
|
|
59
|
+
rightColHeaderElement: (
|
|
60
|
+
<PlaceholderHeader bg="bg-emerald-500">Right Header</PlaceholderHeader>
|
|
61
|
+
),
|
|
62
|
+
rightColContentElement: (
|
|
63
|
+
<PlaceholderContent bg="bg-emerald-50">
|
|
64
|
+
Right Content (scrollable)
|
|
65
|
+
</PlaceholderContent>
|
|
66
|
+
),
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
export const CustomHeaderHeight: Story = {
|
|
71
|
+
args: {
|
|
72
|
+
headerHeight: 96,
|
|
73
|
+
leftColHeaderElement: (
|
|
74
|
+
<PlaceholderHeader>Left Header (96px)</PlaceholderHeader>
|
|
75
|
+
),
|
|
76
|
+
leftColContentElement: <PlaceholderContent>Left Content</PlaceholderContent>,
|
|
77
|
+
rightColHeaderElement: (
|
|
78
|
+
<PlaceholderHeader bg="bg-emerald-500">
|
|
79
|
+
Right Header (96px)
|
|
80
|
+
</PlaceholderHeader>
|
|
81
|
+
),
|
|
82
|
+
rightColContentElement: (
|
|
83
|
+
<PlaceholderContent bg="bg-emerald-50">Right Content</PlaceholderContent>
|
|
84
|
+
),
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
export const RightColResizable: Story = {
|
|
89
|
+
args: {
|
|
90
|
+
rightColWidthRange: [400, 700],
|
|
91
|
+
leftColHeaderElement: (
|
|
92
|
+
<PlaceholderHeader>Left Header (flexible)</PlaceholderHeader>
|
|
93
|
+
),
|
|
94
|
+
leftColContentElement: (
|
|
95
|
+
<PlaceholderContent>
|
|
96
|
+
Left Content — this column now flex-fills remaining space
|
|
97
|
+
</PlaceholderContent>
|
|
98
|
+
),
|
|
99
|
+
rightColHeaderElement: (
|
|
100
|
+
<PlaceholderHeader bg="bg-emerald-500">
|
|
101
|
+
Right Header (resizable)
|
|
102
|
+
</PlaceholderHeader>
|
|
103
|
+
),
|
|
104
|
+
rightColContentElement: (
|
|
105
|
+
<PlaceholderContent bg="bg-emerald-50">
|
|
106
|
+
Right Content — drag the resizer to resize this column (400–700px)
|
|
107
|
+
</PlaceholderContent>
|
|
108
|
+
),
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
export const CustomColumnStyles: Story = {
|
|
113
|
+
args: {
|
|
114
|
+
leftColCls: "bg-amber-50",
|
|
115
|
+
rightColCls: "bg-sky-50",
|
|
116
|
+
leftColHeaderElement: <PlaceholderHeader>Left (amber-50 bg)</PlaceholderHeader>,
|
|
117
|
+
leftColContentElement: (
|
|
118
|
+
<PlaceholderContent bg="bg-amber-100">
|
|
119
|
+
Custom left column background via leftColCls
|
|
120
|
+
</PlaceholderContent>
|
|
121
|
+
),
|
|
122
|
+
rightColHeaderElement: (
|
|
123
|
+
<PlaceholderHeader bg="bg-sky-500">Right (sky-50 bg)</PlaceholderHeader>
|
|
124
|
+
),
|
|
125
|
+
rightColContentElement: (
|
|
126
|
+
<PlaceholderContent bg="bg-sky-100">
|
|
127
|
+
Custom right column background via rightColCls
|
|
128
|
+
</PlaceholderContent>
|
|
129
|
+
),
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
export const FullscreenLeftCol: Story = {
|
|
134
|
+
args: {
|
|
135
|
+
fullscreenPart: "leftCol",
|
|
136
|
+
leftColHeaderElement: <PlaceholderHeader>Left Header (Fullscreen)</PlaceholderHeader>,
|
|
137
|
+
leftColContentElement: (
|
|
138
|
+
<PlaceholderContent>Left Content — now filling the entire viewport</PlaceholderContent>
|
|
139
|
+
),
|
|
140
|
+
rightColHeaderElement: (
|
|
141
|
+
<PlaceholderHeader bg="bg-emerald-500">Right Header (hidden)</PlaceholderHeader>
|
|
142
|
+
),
|
|
143
|
+
rightColContentElement: (
|
|
144
|
+
<PlaceholderContent bg="bg-emerald-50">
|
|
145
|
+
Right Content — hidden when left is fullscreen
|
|
146
|
+
</PlaceholderContent>
|
|
147
|
+
),
|
|
148
|
+
},
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
export const FullscreenRightCol: Story = {
|
|
152
|
+
args: {
|
|
153
|
+
fullscreenPart: "rightCol",
|
|
154
|
+
leftColHeaderElement: <PlaceholderHeader>Left Header (hidden)</PlaceholderHeader>,
|
|
155
|
+
leftColContentElement: (
|
|
156
|
+
<PlaceholderContent>
|
|
157
|
+
Left Content — hidden when right is fullscreen
|
|
158
|
+
</PlaceholderContent>
|
|
159
|
+
),
|
|
160
|
+
rightColHeaderElement: (
|
|
161
|
+
<PlaceholderHeader bg="bg-emerald-500">Right Header (Fullscreen)</PlaceholderHeader>
|
|
162
|
+
),
|
|
163
|
+
rightColContentElement: (
|
|
164
|
+
<PlaceholderContent bg="bg-emerald-50">
|
|
165
|
+
Right Content — now filling the entire viewport
|
|
166
|
+
</PlaceholderContent>
|
|
167
|
+
),
|
|
168
|
+
},
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
const WidthReadout = ({ leftW, rightW }: { leftW: number; rightW: number }) => (
|
|
172
|
+
<div
|
|
173
|
+
style={{
|
|
174
|
+
position: "absolute",
|
|
175
|
+
bottom: 12,
|
|
176
|
+
left: "50%",
|
|
177
|
+
transform: "translateX(-50%)",
|
|
178
|
+
zIndex: 20,
|
|
179
|
+
background: "rgba(0,0,0,0.75)",
|
|
180
|
+
color: "#fff",
|
|
181
|
+
padding: "6px 16px",
|
|
182
|
+
borderRadius: 6,
|
|
183
|
+
fontSize: 13,
|
|
184
|
+
fontFamily: "monospace",
|
|
185
|
+
display: "flex",
|
|
186
|
+
gap: 16,
|
|
187
|
+
}}
|
|
188
|
+
>
|
|
189
|
+
<span>Left: {leftW}px</span>
|
|
190
|
+
<span>Right: {rightW}px</span>
|
|
191
|
+
</div>
|
|
192
|
+
);
|
|
193
|
+
|
|
194
|
+
export const OnResize: Story = {
|
|
195
|
+
render: () => {
|
|
196
|
+
const [widths, setWidths] = useState({ left: 0, right: 0 });
|
|
197
|
+
|
|
198
|
+
return (
|
|
199
|
+
<div style={{ height: "100vh", width: "100vw", position: "relative" }}>
|
|
200
|
+
<OfficeContainer
|
|
201
|
+
rightColWidthRange={[400, 700]}
|
|
202
|
+
leftColHeaderElement={<PlaceholderHeader>Left Header (flexible)</PlaceholderHeader>}
|
|
203
|
+
leftColContentElement={
|
|
204
|
+
<PlaceholderContent>
|
|
205
|
+
Drag the resizer — the width readout at the bottom updates in real time via onResize.
|
|
206
|
+
</PlaceholderContent>
|
|
207
|
+
}
|
|
208
|
+
rightColHeaderElement={
|
|
209
|
+
<PlaceholderHeader bg="bg-emerald-500">Right Header (resizable)</PlaceholderHeader>
|
|
210
|
+
}
|
|
211
|
+
rightColContentElement={
|
|
212
|
+
<PlaceholderContent bg="bg-emerald-50">
|
|
213
|
+
Right column: 400–700px
|
|
214
|
+
</PlaceholderContent>
|
|
215
|
+
}
|
|
216
|
+
onResize={(leftW, rightW) => setWidths({ left: leftW, right: rightW })}
|
|
217
|
+
/>
|
|
218
|
+
<WidthReadout leftW={widths.left} rightW={widths.right} />
|
|
219
|
+
</div>
|
|
220
|
+
);
|
|
221
|
+
},
|
|
222
|
+
};
|
|
223
|
+
|
|
224
|
+
export const ToggleFullscreen: Story = {
|
|
225
|
+
render: () => {
|
|
226
|
+
const [part, setPart] = useState<FullScreenPart>("none");
|
|
227
|
+
|
|
228
|
+
const labels: Record<FullScreenPart, string> = {
|
|
229
|
+
none: "Normal",
|
|
230
|
+
leftCol: "Left Fullscreen",
|
|
231
|
+
rightCol: "Right Fullscreen",
|
|
232
|
+
};
|
|
233
|
+
|
|
234
|
+
return (
|
|
235
|
+
<div style={{ height: "100vh", width: "100vw", display: "flex", flexDirection: "column" }}>
|
|
236
|
+
<div
|
|
237
|
+
style={{
|
|
238
|
+
position: "absolute",
|
|
239
|
+
top: 12,
|
|
240
|
+
left: "50%",
|
|
241
|
+
transform: "translateX(-50%)",
|
|
242
|
+
zIndex: 20,
|
|
243
|
+
display: "flex",
|
|
244
|
+
gap: 8,
|
|
245
|
+
}}
|
|
246
|
+
>
|
|
247
|
+
{(["none", "leftCol", "rightCol"] as FullScreenPart[]).map((p) => (
|
|
248
|
+
<button
|
|
249
|
+
key={p}
|
|
250
|
+
onClick={() => setPart(p)}
|
|
251
|
+
style={{
|
|
252
|
+
padding: "6px 16px",
|
|
253
|
+
borderRadius: 6,
|
|
254
|
+
border: part === p ? "2px solid #0265fc" : "1px solid #d0d0d0",
|
|
255
|
+
background: part === p ? "#e8f0fe" : "#fff",
|
|
256
|
+
cursor: "pointer",
|
|
257
|
+
fontSize: 13,
|
|
258
|
+
fontWeight: part === p ? 600 : 400,
|
|
259
|
+
}}
|
|
260
|
+
>
|
|
261
|
+
{labels[p]}
|
|
262
|
+
</button>
|
|
263
|
+
))}
|
|
264
|
+
</div>
|
|
265
|
+
<div style={{ flex: 1 }}>
|
|
266
|
+
<OfficeContainer
|
|
267
|
+
fullscreenPart={part}
|
|
268
|
+
leftColHeaderElement={<PlaceholderHeader>Left Header</PlaceholderHeader>}
|
|
269
|
+
leftColContentElement={
|
|
270
|
+
<PlaceholderContent>
|
|
271
|
+
Left Content — watch the smooth transition when toggling fullscreen
|
|
272
|
+
</PlaceholderContent>
|
|
273
|
+
}
|
|
274
|
+
rightColHeaderElement={
|
|
275
|
+
<PlaceholderHeader bg="bg-emerald-500">Right Header</PlaceholderHeader>
|
|
276
|
+
}
|
|
277
|
+
rightColContentElement={
|
|
278
|
+
<PlaceholderContent bg="bg-emerald-50">
|
|
279
|
+
Right Content — watch the smooth transition when toggling fullscreen
|
|
280
|
+
</PlaceholderContent>
|
|
281
|
+
}
|
|
282
|
+
/>
|
|
283
|
+
</div>
|
|
284
|
+
</div>
|
|
285
|
+
);
|
|
286
|
+
},
|
|
287
|
+
};
|