blixify-ui-web-mcp 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -0
- package/lib/components/action/button/README.md +75 -0
- package/lib/components/action/button/button.stories.tsx +138 -0
- package/lib/components/action/buttonGroup/README.md +79 -0
- package/lib/components/action/buttonGroup/buttonGroup.stories.tsx +104 -0
- package/lib/components/action/iconButton/README.md +39 -0
- package/lib/components/action/iconButton/iconButton.stories.tsx +22 -0
- package/lib/components/action/radioList/README.md +98 -0
- package/lib/components/action/radioList/radioList.stories.tsx +181 -0
- package/lib/components/action/slider/README.md +86 -0
- package/lib/components/action/slider/slider.stories.tsx +133 -0
- package/lib/components/action/textButton/README.md +34 -0
- package/lib/components/action/textButton/textButton.stories.tsx +16 -0
- package/lib/components/action/toggle/README.md +39 -0
- package/lib/components/action/toggle/toggle.stories.tsx +23 -0
- package/lib/components/advanced/collapse/README.md +106 -0
- package/lib/components/advanced/collapse/collapse.stories.tsx +165 -0
- package/lib/components/advanced/infoWindow/README.md +69 -0
- package/lib/components/advanced/infoWindow/infoWindow.stories.tsx +112 -0
- package/lib/components/advanced/popUp/README.md +95 -0
- package/lib/components/advanced/popUp/popUp.stories.tsx +189 -0
- package/lib/components/auth/bareSignIn/README.md +78 -0
- package/lib/components/auth/bareSignIn/bareSignIn.stories.tsx +141 -0
- package/lib/components/auth/bareSignUp/README.md +130 -0
- package/lib/components/auth/bareSignUp/bareSignUp.stories.tsx +159 -0
- package/lib/components/auth/signIn/README.md +53 -0
- package/lib/components/auth/signIn/signIn.stories.tsx +120 -0
- package/lib/components/auth/signUp/README.md +136 -0
- package/lib/components/auth/signUp/signUp.stories.tsx +193 -0
- package/lib/components/chart/README.md +13 -0
- package/lib/components/chart/areaChart/README.md +133 -0
- package/lib/components/chart/areaChart/areaChart.stories.tsx +199 -0
- package/lib/components/chart/barChart/README.md +193 -0
- package/lib/components/chart/barChart/barChart.stories.tsx +318 -0
- package/lib/components/chart/boxPlotChart/README.md +124 -0
- package/lib/components/chart/boxPlotChart/boxPlotChart.stories.tsx +104 -0
- package/lib/components/chart/bubbleChart/README.md +166 -0
- package/lib/components/chart/bubbleChart/bubbleChart.stories.tsx +144 -0
- package/lib/components/chart/card/README.md +107 -0
- package/lib/components/chart/card/card.stories.tsx +89 -0
- package/lib/components/chart/ganttChart/README.md +142 -0
- package/lib/components/chart/ganttChart/ganttChart.stories.tsx +138 -0
- package/lib/components/chart/heatmapChart/README.md +125 -0
- package/lib/components/chart/heatmapChart/heatmapChart.stories.tsx +106 -0
- package/lib/components/chart/lineChart/README.md +140 -0
- package/lib/components/chart/lineChart/lineChart.stories.tsx +152 -0
- package/lib/components/chart/pieChart/README.md +117 -0
- package/lib/components/chart/pieChart/pieChart.stories.tsx +180 -0
- package/lib/components/chart/polarAreaChart/README.md +126 -0
- package/lib/components/chart/polarAreaChart/polarAreaChart.stories.tsx +106 -0
- package/lib/components/chart/radarChart/README.md +57 -0
- package/lib/components/chart/radarChart/radarChart.stories.tsx +36 -0
- package/lib/components/chart/radialBar/README.md +152 -0
- package/lib/components/chart/radialBar/radialChart.stories.tsx +136 -0
- package/lib/components/chart/rangeBarChart/README.md +323 -0
- package/lib/components/chart/rangeBarChart/rangeBarChart.stories.tsx +208 -0
- package/lib/components/chart/statsCard/README.md +97 -0
- package/lib/components/chart/statsCard/statsCard.stories.tsx +183 -0
- package/lib/components/chart/treemapChart/README.md +142 -0
- package/lib/components/chart/treemapChart/treemapChart.stories.tsx +122 -0
- package/lib/components/chat/chatAnchor/README.md +113 -0
- package/lib/components/chat/chatAnchor/chatAnchor.stories.tsx +156 -0
- package/lib/components/chat/chatBase/README.md +223 -0
- package/lib/components/chat/chatBase/chatBase.stories.tsx +306 -0
- package/lib/components/chat/chatDashboard/README.md +161 -0
- package/lib/components/chat/chatDashboard/chatDashboard.stories.tsx +154 -0
- package/lib/components/data/dataGraph/README.md +13 -0
- package/lib/components/data/dataGraph/dataGraph.stories.tsx +84 -0
- package/lib/components/data/dataReference/README.md +62 -0
- package/lib/components/data/dataReference/dataReference.stories.tsx +53 -0
- package/lib/components/data/dataTemplate/README.md +903 -0
- package/lib/components/data/dataTemplate/dataModule.stories.tsx +196 -0
- package/lib/components/data/dataTemplate/dataTemplate.stories.tsx +337 -0
- package/lib/components/data/dataWrapper/README.md +1077 -0
- package/lib/components/data/dataWrapper/dataWrapper.stories.tsx +831 -0
- package/lib/components/data/queryForm/README.md +56 -0
- package/lib/components/data/queryForm/queryForm.stories.tsx +85 -0
- package/lib/components/data/readQuery/README.md +282 -0
- package/lib/components/data/readQuery/readQuery.stories.tsx +256 -0
- package/lib/components/data/readQueryHoc/README.md +89 -0
- package/lib/components/data/readQueryHoc/readQueryHoc.stories.tsx +33 -0
- package/lib/components/data/writeQuery/README.md +178 -0
- package/lib/components/data/writeQuery/writeQuery.stories.tsx +209 -0
- package/lib/components/design/actionSection/README.md +47 -0
- package/lib/components/design/actionSection/actionSection.stories.tsx +74 -0
- package/lib/components/design/banner/README.md +43 -0
- package/lib/components/design/banner/banner.stories.tsx +34 -0
- package/lib/components/design/bannerAction/README.md +44 -0
- package/lib/components/design/bannerAction/bannerAction.stories.tsx +25 -0
- package/lib/components/design/blogSection/README.md +111 -0
- package/lib/components/design/blogSection/blogSection.stories.tsx +72 -0
- package/lib/components/design/carouselSection/README.md +82 -0
- package/lib/components/design/carouselSection/carouselSection.stories.tsx +52 -0
- package/lib/components/design/designList/README.md +60 -0
- package/lib/components/design/designList/designList.stories.tsx +44 -0
- package/lib/components/design/faq/README.md +121 -0
- package/lib/components/design/faq/faq.stories.tsx +103 -0
- package/lib/components/design/fileGrid/README.md +87 -0
- package/lib/components/design/fileGrid/fileGrid.stories.tsx +110 -0
- package/lib/components/design/fileViewer/README.md +40 -0
- package/lib/components/design/fileViewer/fileViewer.stories.tsx +28 -0
- package/lib/components/design/footerSection/README.md +62 -0
- package/lib/components/design/footerSection/footerSection.stories.tsx +84 -0
- package/lib/components/design/googleReview/README.md +45 -0
- package/lib/components/design/googleReview/googleReview.stories.tsx +33 -0
- package/lib/components/design/heroSection/README.md +48 -0
- package/lib/components/design/heroSection/heroSection.stories.tsx +85 -0
- package/lib/components/design/iconList/README.md +60 -0
- package/lib/components/design/iconList/iconList.stories.tsx +41 -0
- package/lib/components/design/imageGallery/README.md +56 -0
- package/lib/components/design/imageGallery/imageGallery.stories.tsx +45 -0
- package/lib/components/design/imageZoom/README.md +47 -0
- package/lib/components/design/imageZoom/imageZoom.stories.tsx +30 -0
- package/lib/components/design/leftContent/README.md +47 -0
- package/lib/components/design/leftContent/leftContent.stories.tsx +32 -0
- package/lib/components/design/logoCloud/README.md +42 -0
- package/lib/components/design/logoCloud/logoCloud.stories.tsx +44 -0
- package/lib/components/design/onboarding/README.md +100 -0
- package/lib/components/design/onboarding/onboarding.stories.tsx +113 -0
- package/lib/components/design/pricing/README.md +112 -0
- package/lib/components/design/pricing/pricing.stories.tsx +86 -0
- package/lib/components/design/rightContent/README.md +47 -0
- package/lib/components/design/rightContent/rightContent.stories.tsx +32 -0
- package/lib/components/design/sectionList/README.md +51 -0
- package/lib/components/design/sectionList/sectionList.stories.tsx +35 -0
- package/lib/components/design/teams/README.md +62 -0
- package/lib/components/design/teams/teams.stories.tsx +61 -0
- package/lib/components/display/alert/README.md +82 -0
- package/lib/components/display/alert/alert.stories.tsx +71 -0
- package/lib/components/display/calendar/README.md +113 -0
- package/lib/components/display/calendar/calendar.stories.tsx +159 -0
- package/lib/components/display/clipboard/README.md +36 -0
- package/lib/components/display/clipboard/clipboard.stories.tsx +32 -0
- package/lib/components/display/detailList/README.md +61 -0
- package/lib/components/display/detailList/detailList.stories.tsx +131 -0
- package/lib/components/display/drawer/README.md +74 -0
- package/lib/components/display/drawer/drawer.stories.tsx +66 -0
- package/lib/components/display/emptyState/README.md +38 -0
- package/lib/components/display/emptyState/emptyState.stories.tsx +22 -0
- package/lib/components/display/feeds/README.md +80 -0
- package/lib/components/display/feeds/feeds.stories.tsx +75 -0
- package/lib/components/display/flexTable/README.md +160 -0
- package/lib/components/display/flexTable/flexTable.stories.tsx +313 -0
- package/lib/components/display/grid/README.md +121 -0
- package/lib/components/display/grid/grid.stories.tsx +234 -0
- package/lib/components/display/kanban/README.md +78 -0
- package/lib/components/display/kanban/kanban.stories.tsx +133 -0
- package/lib/components/display/list/README.md +109 -0
- package/lib/components/display/list/list.stories.tsx +188 -0
- package/lib/components/display/loading/README.md +25 -0
- package/lib/components/display/loading/loading.stories.tsx +15 -0
- package/lib/components/display/mapView/README.md +99 -0
- package/lib/components/display/mapView/mapView.stories.tsx +225 -0
- package/lib/components/display/modal/README.md +43 -0
- package/lib/components/display/modal/modal.stories.tsx +81 -0
- package/lib/components/display/notification/README.md +43 -0
- package/lib/components/display/notification/notification.stories.tsx +30 -0
- package/lib/components/display/progress/README.md +25 -0
- package/lib/components/display/progress/progress.stories.tsx +15 -0
- package/lib/components/display/stepper/README.md +96 -0
- package/lib/components/display/stepper/stepper.stories.tsx +175 -0
- package/lib/components/display/table/README.md +176 -0
- package/lib/components/display/table/table.stories.tsx +330 -0
- package/lib/components/display/tag/README.md +74 -0
- package/lib/components/display/tag/tag.stories.tsx +79 -0
- package/lib/components/input/address/README.md +132 -0
- package/lib/components/input/address/address.stories.tsx +147 -0
- package/lib/components/input/canvas/README.md +131 -0
- package/lib/components/input/canvas/canvas.stories.tsx +165 -0
- package/lib/components/input/checkbox/README.md +61 -0
- package/lib/components/input/checkbox/checkbox.stories.tsx +30 -0
- package/lib/components/input/datePicker/README.md +124 -0
- package/lib/components/input/datePicker/datePicker.stories.tsx +197 -0
- package/lib/components/input/form/README.md +55 -0
- package/lib/components/input/form/form.stories.tsx +143 -0
- package/lib/components/input/markdown/README.md +146 -0
- package/lib/components/input/markdown/markdown.stories.tsx +40 -0
- package/lib/components/input/monthYearPicker/README.md +69 -0
- package/lib/components/input/monthYearPicker/monthYearPicker.stories.tsx +47 -0
- package/lib/components/input/netPromoterScore/README.md +52 -0
- package/lib/components/input/netPromoterScore/netPromoterScore.stories.tsx +30 -0
- package/lib/components/input/rating/README.md +51 -0
- package/lib/components/input/rating/rating.stories.tsx +30 -0
- package/lib/components/input/select/README.md +108 -0
- package/lib/components/input/select/select.stories.tsx +286 -0
- package/lib/components/input/signature/README.md +106 -0
- package/lib/components/input/signature/signature.stories.tsx +188 -0
- package/lib/components/input/textArea/README.md +55 -0
- package/lib/components/input/textArea/textArea.stories.tsx +30 -0
- package/lib/components/input/textInput/README.md +81 -0
- package/lib/components/input/textInput/textinput.stories.tsx +231 -0
- package/lib/components/input/uploadInput/README.md +134 -0
- package/lib/components/input/uploadInput/uploadInput.stories.tsx +193 -0
- package/lib/components/navigation/bars/README.md +40 -0
- package/lib/components/navigation/bars/bars.stories.tsx +85 -0
- package/lib/components/navigation/bottomTab/README.md +53 -0
- package/lib/components/navigation/bottomTab/bottomTab.stories.tsx +32 -0
- package/lib/components/navigation/breadcrumb/README.md +48 -0
- package/lib/components/navigation/breadcrumb/breadcrumb.stories.tsx +27 -0
- package/lib/components/navigation/header/README.md +149 -0
- package/lib/components/navigation/header/header.stories.tsx +107 -0
- package/lib/components/navigation/leftNav/README.md +91 -0
- package/lib/components/navigation/leftNav/leftNav.stories.tsx +106 -0
- package/lib/components/navigation/tabs/README.md +75 -0
- package/lib/components/navigation/tabs/tabs.stories.tsx +60 -0
- package/lib/components/structure/column/README.md +40 -0
- package/lib/components/structure/column/column.stories.tsx +26 -0
- package/lib/components/structure/container/README.md +34 -0
- package/lib/components/structure/container/container.stories.tsx +19 -0
- package/lib/components/structure/link/README.md +55 -0
- package/lib/components/structure/link/link.stories.tsx +30 -0
- package/lib/components/structure/text/README.md +42 -0
- package/lib/components/structure/text/text.stories.tsx +39 -0
- package/lib/components/template/authPage/authPage.stories.tsx +68 -0
- package/lib/components/template/landingPage/landingPage.stories.tsx +288 -0
- package/lib/components/template/productListing/productListing.stories.tsx +297 -0
- package/lib/components/template/productOverview/productOverview.stories.tsx +194 -0
- package/lib/components/template/shoppingCart/shoppingCart.stories.tsx +252 -0
- package/lib/components/template/userHomePage/userHomePage.stories.tsx +605 -0
- package/lib/components/template/userRankingDashboard/userRankingDashboard.stories.tsx +481 -0
- package/lib/mcp/server.d.ts +2 -0
- package/lib/mcp/server.d.ts.map +1 -0
- package/lib/mcp/server.js +33 -0
- package/lib/mcp/server.js.map +1 -0
- package/lib/mcp/tools/getBackendComponent.d.ts +13 -0
- package/lib/mcp/tools/getBackendComponent.d.ts.map +1 -0
- package/lib/mcp/tools/getBackendComponent.js +119 -0
- package/lib/mcp/tools/getBackendComponent.js.map +1 -0
- package/lib/mcp/tools/getComponent.d.ts +17 -0
- package/lib/mcp/tools/getComponent.d.ts.map +1 -0
- package/lib/mcp/tools/getComponent.js +118 -0
- package/lib/mcp/tools/getComponent.js.map +1 -0
- package/lib/mcp/tools/listComponents.d.ts +13 -0
- package/lib/mcp/tools/listComponents.d.ts.map +1 -0
- package/lib/mcp/tools/listComponents.js +113 -0
- package/lib/mcp/tools/listComponents.js.map +1 -0
- package/lib/mcp/tools/listTemplates.d.ts +13 -0
- package/lib/mcp/tools/listTemplates.d.ts.map +1 -0
- package/lib/mcp/tools/listTemplates.js +68 -0
- package/lib/mcp/tools/listTemplates.js.map +1 -0
- package/lib/mcp/tools/suggestTemplate.d.ts +17 -0
- package/lib/mcp/tools/suggestTemplate.d.ts.map +1 -0
- package/lib/mcp/tools/suggestTemplate.js +212 -0
- package/lib/mcp/tools/suggestTemplate.js.map +1 -0
- package/package.json +23 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Drawer
|
|
2
|
+
|
|
3
|
+
<!-- STORY -->
|
|
4
|
+
|
|
5
|
+
<hr>
|
|
6
|
+
|
|
7
|
+
Drawer Component
|
|
8
|
+
|
|
9
|
+
##### Import
|
|
10
|
+
|
|
11
|
+
```js
|
|
12
|
+
import { Drawer } from "blixify-ui-web/components/display/drawer";
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
##### Usage
|
|
16
|
+
|
|
17
|
+
```jsx
|
|
18
|
+
return (
|
|
19
|
+
<div className="flex gap-x-3">
|
|
20
|
+
<Drawer
|
|
21
|
+
cta={
|
|
22
|
+
<div className="w-full flex justify-center">
|
|
23
|
+
<Button text="Bottom Drawer" type="normal" />
|
|
24
|
+
</div>
|
|
25
|
+
}
|
|
26
|
+
content={
|
|
27
|
+
<div className="grid grid-cols-2 gap-4">
|
|
28
|
+
{Array.from({ length: 8 }).map((_, i) => (
|
|
29
|
+
<div key={i} className="h-48 w-full bg-gray-100 rounded-lg" />
|
|
30
|
+
))}
|
|
31
|
+
</div>
|
|
32
|
+
}
|
|
33
|
+
maxHeight="50"
|
|
34
|
+
anchor="bottom"
|
|
35
|
+
title="This is drawer title"
|
|
36
|
+
desc="This is drawer description. Lorem ipsum dolor sit amet, consectetur adipiscing elit. "
|
|
37
|
+
/>
|
|
38
|
+
<Drawer
|
|
39
|
+
cta={
|
|
40
|
+
<div className="w-full flex justify-center">
|
|
41
|
+
<Button text="Right Drawer" type="normal" />
|
|
42
|
+
</div>
|
|
43
|
+
}
|
|
44
|
+
content={
|
|
45
|
+
<div className="grid grid-cols-2 gap-4">
|
|
46
|
+
{Array.from({ length: 8 }).map((_, i) => (
|
|
47
|
+
<div key={i} className="h-48 w-full bg-gray-100 rounded-lg" />
|
|
48
|
+
))}
|
|
49
|
+
</div>
|
|
50
|
+
}
|
|
51
|
+
maxWidth="3xl"
|
|
52
|
+
title="This is drawer title"
|
|
53
|
+
desc="This is drawer description. Lorem ipsum dolor sit amet, consectetur adipiscing elit. "
|
|
54
|
+
/>
|
|
55
|
+
</div>
|
|
56
|
+
);
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
##### Required props
|
|
60
|
+
|
|
61
|
+
| Name | Type | Description |
|
|
62
|
+
| --------- | -------------- | -------------------------------------------- |
|
|
63
|
+
| `cta` | `ReactElement` | The element that triggers the drawer to open |
|
|
64
|
+
| `content` | `ReactElement` | The content to display inside the drawer |
|
|
65
|
+
|
|
66
|
+
##### Optional props
|
|
67
|
+
|
|
68
|
+
| Name | Type | Default | Description |
|
|
69
|
+
| ----------- | -------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------- |
|
|
70
|
+
| `title` | `string` | - | The title displayed at the top of the drawer |
|
|
71
|
+
| `desc` | `string` | - | The description text displayed below the title |
|
|
72
|
+
| `anchor` | `"bottom"` | - | Position of the drawer. If "bottom", drawer slides in from bottom. Otherwise slides in from right |
|
|
73
|
+
| `maxWidth` | `"lg" \| "xl" \| "2xl" \| "3xl" \| "4xl" \| "5xl" \| "6xl" \| "7xl"` | - | Maximum width of the drawer (only applies when anchor is not "bottom") |
|
|
74
|
+
| `maxHeight` | `"50" \| "75" \| "100"` | - | Maximum height of the drawer as viewport height percentage (only applies when anchor is "bottom") |
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { storiesOf } from "@storybook/react";
|
|
2
|
+
import { Drawer } from ".";
|
|
3
|
+
import { Button } from "../../action/button";
|
|
4
|
+
import README from "./README.md";
|
|
5
|
+
|
|
6
|
+
const stories = storiesOf("Display", module);
|
|
7
|
+
|
|
8
|
+
stories.addParameters({
|
|
9
|
+
readme: {
|
|
10
|
+
content: README,
|
|
11
|
+
},
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
stories.add("Drawer", () => {
|
|
15
|
+
return (
|
|
16
|
+
<div className="flex flex-col gap-4">
|
|
17
|
+
<div className="flex gap-x-3">
|
|
18
|
+
<Drawer
|
|
19
|
+
cta={
|
|
20
|
+
<div className="w-full flex justify-center">
|
|
21
|
+
<Button text="Bottom Drawer" type="normal" />
|
|
22
|
+
</div>
|
|
23
|
+
}
|
|
24
|
+
content={
|
|
25
|
+
<div className="grid grid-cols-2 gap-4">
|
|
26
|
+
{Array.from({ length: 8 }).map((_, i) => (
|
|
27
|
+
<div key={i} className="h-48 w-full bg-gray-100 rounded-lg" />
|
|
28
|
+
))}
|
|
29
|
+
</div>
|
|
30
|
+
}
|
|
31
|
+
maxHeight="50"
|
|
32
|
+
anchor="bottom"
|
|
33
|
+
title="This is drawer title"
|
|
34
|
+
desc="This is drawer description. Lorem ipsum dolor sit amet, consectetur adipiscing elit. "
|
|
35
|
+
/>
|
|
36
|
+
<Drawer
|
|
37
|
+
cta={
|
|
38
|
+
<div className="w-full flex justify-center">
|
|
39
|
+
<Button text="Right Drawer" type="normal" />
|
|
40
|
+
</div>
|
|
41
|
+
}
|
|
42
|
+
content={
|
|
43
|
+
<div className="grid grid-cols-2 gap-4">
|
|
44
|
+
{Array.from({ length: 8 }).map((_, i) => (
|
|
45
|
+
<div key={i} className="h-48 w-full bg-gray-100 rounded-lg" />
|
|
46
|
+
))}
|
|
47
|
+
</div>
|
|
48
|
+
}
|
|
49
|
+
maxWidth="3xl"
|
|
50
|
+
title="This is drawer title"
|
|
51
|
+
desc="This is drawer description. Lorem ipsum dolor sit amet, consectetur adipiscing elit. "
|
|
52
|
+
/>
|
|
53
|
+
</div>
|
|
54
|
+
<div className="grid grid-cols-1 gap-4">
|
|
55
|
+
{Array.from({ length: 1 }).map((_, i) => (
|
|
56
|
+
<div key={i} className="h-48 w-full bg-gray-100 rounded-lg" />
|
|
57
|
+
))}
|
|
58
|
+
</div>
|
|
59
|
+
<div className="grid grid-cols-3 gap-4">
|
|
60
|
+
{Array.from({ length: 6 }).map((_, i) => (
|
|
61
|
+
<div key={i} className="h-48 w-full bg-gray-100 rounded-lg" />
|
|
62
|
+
))}
|
|
63
|
+
</div>
|
|
64
|
+
</div>
|
|
65
|
+
);
|
|
66
|
+
});
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Empty State
|
|
2
|
+
|
|
3
|
+
<!-- STORY -->
|
|
4
|
+
|
|
5
|
+
<hr>
|
|
6
|
+
|
|
7
|
+
Empty State when there is no data to display
|
|
8
|
+
|
|
9
|
+
##### Import
|
|
10
|
+
|
|
11
|
+
```js
|
|
12
|
+
import { EmptyState } from "blixify-ui-web/components/display/emptyState";
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
##### Usage
|
|
16
|
+
|
|
17
|
+
```jsx
|
|
18
|
+
return (
|
|
19
|
+
<EmptyState
|
|
20
|
+
text="There is no data to display"
|
|
21
|
+
icon={<InformationCircleIcon className="h-10 text-gray-600" />}
|
|
22
|
+
/>
|
|
23
|
+
);
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
##### Required props
|
|
27
|
+
|
|
28
|
+
| Name | Type | Description |
|
|
29
|
+
| ------ | --------------- | ----------- |
|
|
30
|
+
| `text` | `string` | |
|
|
31
|
+
| `icon` | `React Element` | |
|
|
32
|
+
|
|
33
|
+
##### Optional props
|
|
34
|
+
|
|
35
|
+
| Name | Type | Default | Description |
|
|
36
|
+
| -------------- | ---------------- | ------- | ----------- |
|
|
37
|
+
| `className` | `tailwind class` | "" | |
|
|
38
|
+
| `callToAction` | `React Element` | "" | |
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { InformationCircleIcon } from "@heroicons/react/24/outline";
|
|
2
|
+
import { storiesOf } from "@storybook/react";
|
|
3
|
+
import React from "react";
|
|
4
|
+
import { EmptyState } from ".";
|
|
5
|
+
import README from "./README.md";
|
|
6
|
+
|
|
7
|
+
const stories = storiesOf("Display", module);
|
|
8
|
+
|
|
9
|
+
stories.addParameters({
|
|
10
|
+
readme: {
|
|
11
|
+
content: README,
|
|
12
|
+
},
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
stories.add("Empty State", () => {
|
|
16
|
+
return (
|
|
17
|
+
<EmptyState
|
|
18
|
+
text="There is no data to display"
|
|
19
|
+
icon={<InformationCircleIcon className="h-10 text-gray-600" />}
|
|
20
|
+
/>
|
|
21
|
+
);
|
|
22
|
+
});
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Feeds
|
|
2
|
+
|
|
3
|
+
<!-- STORY -->
|
|
4
|
+
|
|
5
|
+
<hr>
|
|
6
|
+
|
|
7
|
+
Feeds to display timeline content
|
|
8
|
+
|
|
9
|
+
##### Import
|
|
10
|
+
|
|
11
|
+
```js
|
|
12
|
+
import { Feeds } from "blixify-ui-web/components/display/feeds";
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
##### Usage
|
|
16
|
+
|
|
17
|
+
```jsx
|
|
18
|
+
const feeds: Feed[] = [
|
|
19
|
+
{
|
|
20
|
+
iconClass: "bg-gray-400",
|
|
21
|
+
iconType: <UserIcon className="h-5 w-5 text-white" />,
|
|
22
|
+
content: "Sign up a Free Account",
|
|
23
|
+
step: "Step 1",
|
|
24
|
+
addContent: (
|
|
25
|
+
<p className="mt-2 text-sm text-gray-500">
|
|
26
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
|
|
27
|
+
tempor incididunt ut labore et dolore magna aliqua.
|
|
28
|
+
</p>
|
|
29
|
+
),
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
iconClass: "bg-blue-500",
|
|
33
|
+
iconType: <HandThumbUpIcon className="h-5 w-5 text-white" />,
|
|
34
|
+
content: "Notify Arus Oil logistic team once you are ready to sell",
|
|
35
|
+
step: "Step 2",
|
|
36
|
+
addContent: (
|
|
37
|
+
<img
|
|
38
|
+
className="mt-4 w-36 sm:w-56 h-auto"
|
|
39
|
+
src="https://arusoil.com/static/oil_collection_drum-ddf6f26e6fbb1bc058bffb0faa722f51.webp"
|
|
40
|
+
alt=""
|
|
41
|
+
/>
|
|
42
|
+
),
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
iconClass: "bg-green-500",
|
|
46
|
+
iconType: <CheckIcon className="h-5 w-5 text-white" />,
|
|
47
|
+
content: "View payment made to you on Arus Oil App",
|
|
48
|
+
step: "Step 3",
|
|
49
|
+
},
|
|
50
|
+
];
|
|
51
|
+
|
|
52
|
+
return <Feeds content={feeds} />;
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
##### Required props
|
|
56
|
+
|
|
57
|
+
| Name | Type | Description |
|
|
58
|
+
| --------- | ------------ | ----------- |
|
|
59
|
+
| `content` | `Feed Class` | Class |
|
|
60
|
+
|
|
61
|
+
##### Optional props
|
|
62
|
+
|
|
63
|
+
| Name | Type | Default | Description |
|
|
64
|
+
| ------------------ | ------------------------- | ------- | ---------------------------------------------------------------- |
|
|
65
|
+
| `bold` | `boolean` | null | |
|
|
66
|
+
| `darkMode` | `boolean` | null | |
|
|
67
|
+
| `collapsible` | `boolean` | null | Enables collapsible functionality for feed items with addContent |
|
|
68
|
+
| `collapsedIds` | `string[]` | null | Array of feed item IDs that are currently collapsed |
|
|
69
|
+
| `onChangeCollapse` | `(ids: string[]) => void` | null | Callback function called when collapse state changes |
|
|
70
|
+
|
|
71
|
+
##### Feed class
|
|
72
|
+
|
|
73
|
+
| Name | Type | Required | Description |
|
|
74
|
+
| ------------ | ---------------- | -------- | -------------------------------------------------------------- |
|
|
75
|
+
| `iconType` | `React Element` | Yes | |
|
|
76
|
+
| `iconClass` | `tailwind class` | Yes | |
|
|
77
|
+
| `content` | `string` | Yes | |
|
|
78
|
+
| `step` | `string` | Yes | |
|
|
79
|
+
| `addContent` | `React Element` | No | |
|
|
80
|
+
| `id` | `string` | No | Unique identifier for the feed item (required for collapsible) |
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CheckIcon,
|
|
3
|
+
HandThumbUpIcon,
|
|
4
|
+
UserIcon,
|
|
5
|
+
} from "@heroicons/react/24/outline";
|
|
6
|
+
import { storiesOf } from "@storybook/react";
|
|
7
|
+
import React, { useState } from "react";
|
|
8
|
+
import { Feed, Feeds } from ".";
|
|
9
|
+
import README from "./README.md";
|
|
10
|
+
|
|
11
|
+
const stories = storiesOf("Display", module);
|
|
12
|
+
|
|
13
|
+
stories.addParameters({
|
|
14
|
+
readme: {
|
|
15
|
+
content: README,
|
|
16
|
+
},
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
stories.add("Feeds", () => {
|
|
20
|
+
const [collapsedIds, setCollapsedIds] = useState<string[]>(["1"]);
|
|
21
|
+
|
|
22
|
+
const feeds: Feed[] = [
|
|
23
|
+
{
|
|
24
|
+
id: "1",
|
|
25
|
+
iconClass: "bg-gray-400",
|
|
26
|
+
iconType: <UserIcon className="h-5 w-5 text-white" />,
|
|
27
|
+
content: "Sign up a Free Account",
|
|
28
|
+
step: "2025-12-01",
|
|
29
|
+
addContent: (
|
|
30
|
+
<p className="mt-2 text-sm text-gray-500">
|
|
31
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
|
|
32
|
+
eiusmod tempor incididunt ut labore et dolore magna aliqua. Nisl
|
|
33
|
+
tincidunt eget nullam non nisi est sit amet facilisis. Ut porttitor
|
|
34
|
+
leo a diam. Sem viverra aliquet eget sit. Eu facilisis sed odio morbi
|
|
35
|
+
quis commodo odio aenean sed. Id porta nibh venenatis cras sed felis
|
|
36
|
+
eget velit aliquet. Faucibus a pellentesque sit amet porttitor. Tortor
|
|
37
|
+
vitae purus faucibus ornare suspendisse sed nisi lacus sed. Platea
|
|
38
|
+
dictumst quisque sagittis purus sit amet. At consectetur lorem donec
|
|
39
|
+
massa sapien faucibus et molestie ac.
|
|
40
|
+
</p>
|
|
41
|
+
),
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
id: "2",
|
|
45
|
+
iconClass: "bg-blue-500",
|
|
46
|
+
iconType: <HandThumbUpIcon className="h-5 w-5 text-white" />,
|
|
47
|
+
content: "Notify Arus Oil logistic team once you are ready to sell",
|
|
48
|
+
step: "2025-12-11",
|
|
49
|
+
addContent: (
|
|
50
|
+
<img
|
|
51
|
+
className="mt-4 w-36 sm:w-56 h-auto"
|
|
52
|
+
src="https://arusoil.com/static/oil_collection_drum-ddf6f26e6fbb1bc058bffb0faa722f51.webp"
|
|
53
|
+
alt=""
|
|
54
|
+
/>
|
|
55
|
+
),
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
id: "3",
|
|
59
|
+
iconClass: "bg-green-500",
|
|
60
|
+
iconType: <CheckIcon className="h-5 w-5 text-white" />,
|
|
61
|
+
content: "View payment made to you on Arus Oil App",
|
|
62
|
+
step: "2025-12-15",
|
|
63
|
+
},
|
|
64
|
+
];
|
|
65
|
+
|
|
66
|
+
return (
|
|
67
|
+
<Feeds
|
|
68
|
+
bold={true}
|
|
69
|
+
content={feeds}
|
|
70
|
+
collapsible
|
|
71
|
+
collapsedIds={collapsedIds}
|
|
72
|
+
onChangeCollapse={(ids) => setCollapsedIds(ids)}
|
|
73
|
+
/>
|
|
74
|
+
);
|
|
75
|
+
});
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
# FlexTable
|
|
2
|
+
|
|
3
|
+
<!-- STORY -->
|
|
4
|
+
|
|
5
|
+
<hr>
|
|
6
|
+
|
|
7
|
+
A flexible table with category grouping, per-category subtotals, inline editing, computed math columns, and optional validation rules via `flexMathQueries`. Can be used standalone or inside a `Form` for validation.
|
|
8
|
+
|
|
9
|
+
##### Import
|
|
10
|
+
|
|
11
|
+
```js
|
|
12
|
+
import {
|
|
13
|
+
FlexTable,
|
|
14
|
+
FlexTableItem,
|
|
15
|
+
FlexTableColumn,
|
|
16
|
+
} from "blixify-ui-web/display/flexTable";
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
##### Usage
|
|
20
|
+
|
|
21
|
+
Basic editable table:
|
|
22
|
+
|
|
23
|
+
```jsx
|
|
24
|
+
const [data, setData] = useState<FlexTableItem[]>([
|
|
25
|
+
{ id: "1", title: "Investigator Salary", category: "Personnel", year1: 50000, year2: 52000 },
|
|
26
|
+
{ id: "2", title: "Conference Travel", category: "Travel", year1: 5000, year2: 5500 },
|
|
27
|
+
]);
|
|
28
|
+
|
|
29
|
+
const columns: DataStructure[] = [
|
|
30
|
+
{ id: "year1", name: "Year 1", type: "number" },
|
|
31
|
+
{ id: "year2", name: "Year 2", type: "number" },
|
|
32
|
+
];
|
|
33
|
+
|
|
34
|
+
const categoryList = [
|
|
35
|
+
{ title: "Personnel", description: "Staff salaries" },
|
|
36
|
+
{ title: "Travel", description: "Travel expenses" },
|
|
37
|
+
];
|
|
38
|
+
|
|
39
|
+
<FlexTable
|
|
40
|
+
label="Research Budget"
|
|
41
|
+
data={data}
|
|
42
|
+
columns={columns}
|
|
43
|
+
categoryList={categoryList}
|
|
44
|
+
showGrandTotal={true}
|
|
45
|
+
onChangeData={setData}
|
|
46
|
+
/>
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
With Form validation and flexMathQueries:
|
|
50
|
+
|
|
51
|
+
```jsx
|
|
52
|
+
const formRef = useRef(null);
|
|
53
|
+
const tableRef = useRef(null);
|
|
54
|
+
|
|
55
|
+
<Button text="Submit" onClick={() => formRef.current?.handleSubmit()} />
|
|
56
|
+
<Form ref={formRef} refList={[tableRef]}>
|
|
57
|
+
<FlexTable
|
|
58
|
+
ref={tableRef}
|
|
59
|
+
label="Budget"
|
|
60
|
+
data={data}
|
|
61
|
+
columns={columns}
|
|
62
|
+
categoryList={categoryList}
|
|
63
|
+
flexMathQueries={[
|
|
64
|
+
{ type: "categoryPercentage", targetCategory: "Travel", maxPercentage: 30 },
|
|
65
|
+
]}
|
|
66
|
+
onChangeData={setData}
|
|
67
|
+
/>
|
|
68
|
+
</Form>
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Math and list columns:
|
|
72
|
+
|
|
73
|
+
```jsx
|
|
74
|
+
const columns: DataStructure[] = [
|
|
75
|
+
{ id: "year1", name: "Year 1", type: "number" },
|
|
76
|
+
{ id: "mode", name: "Mode", type: "list", listSelection: ["A", "B"] },
|
|
77
|
+
{
|
|
78
|
+
id: "computed",
|
|
79
|
+
name: "Computed",
|
|
80
|
+
type: "math",
|
|
81
|
+
mathExpression: "mode == 'A' ? year1 * 2 : year1 * 3",
|
|
82
|
+
},
|
|
83
|
+
];
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
##### Props
|
|
87
|
+
|
|
88
|
+
| Name | Type | Default | Description |
|
|
89
|
+
| ---------------------- | ------------------------------------------------ | --------------- | ---------------------------------------------------------------------------------------------------------------------- |
|
|
90
|
+
| `data` | `FlexTableItem[]` | `[]` | Row data. Each item must have `id`, `title`, `category`, and any dynamic column keys |
|
|
91
|
+
| `columns` | `DataStructure[]` | — | Column definitions. Supports `type: "number"`, `"text"`, `"textarea"`, `"list"`, `"math"` |
|
|
92
|
+
| `columnList` | `string[]` | — | Legacy: additional predefined column keys to include |
|
|
93
|
+
| `categoryList` | `Array<{ title: string; description?: string }>` | — | Explicit category list with optional descriptions shown in a tooltip. If omitted, categories are derived from the data |
|
|
94
|
+
| `label` | `string` | — | Table heading shown above the table |
|
|
95
|
+
| `labelExtra` | `ReactElement` | — | Extra element rendered next to the label |
|
|
96
|
+
| `infoElement` | `ReactElement` | — | Info element rendered in the table header area |
|
|
97
|
+
| `id` | `string` | — | Used when the component is registered as a form input ref |
|
|
98
|
+
| `disabled` | `boolean` | `false` | Removes all editing controls — no add/remove row, no cell editing, no add column |
|
|
99
|
+
| `showTotal` | `boolean` | `true` | Show a subtotal row at the bottom of each category group |
|
|
100
|
+
| `showGrandTotal` | `boolean` | `false` | Show a grand total row summing all numeric columns across all categories |
|
|
101
|
+
| `hideCategory` | `boolean` | `false` | Hide category grouping and render a flat list of rows |
|
|
102
|
+
| `maxRows` | `number` | — | Maximum rows allowed per category. The add-row button is hidden once the limit is reached |
|
|
103
|
+
| `defaultTitleTemplate` | `string` | — | Default title string pre-filled when a new row is added |
|
|
104
|
+
| `flexMathQueries` | `FlexMathQuery[]` | — | Validation rules evaluated on form submit. See FlexMathQuery below |
|
|
105
|
+
| `darkMode` | `boolean` | `false` | Enable dark mode styling |
|
|
106
|
+
| `darkModeBg` | `string` | `"bg-gray-900"` | Tailwind bg class for the dark mode background |
|
|
107
|
+
| `className` | `string` | — | Additional Tailwind classes for the outer container |
|
|
108
|
+
| `onChangeData` | `(data: FlexTableItem[]) => void` | — | Called whenever a cell value, row add, or row remove changes the data |
|
|
109
|
+
| `onAddColumn` | `(column: FlexTableColumn) => void` | — | Called when the user adds a new column via the add-column modal |
|
|
110
|
+
| `onRemoveColumn` | `(columnKey: string) => void` | — | Called when the user removes a column |
|
|
111
|
+
|
|
112
|
+
##### FlexTableItem
|
|
113
|
+
|
|
114
|
+
| Property | Type | Description |
|
|
115
|
+
| --------------- | ---------------- | ----------------------------------- |
|
|
116
|
+
| `id` | `string` | Unique row identifier |
|
|
117
|
+
| `title` | `string` | Row label shown in the first column |
|
|
118
|
+
| `category` | `string \| null` | Category this row belongs to |
|
|
119
|
+
| `[key: string]` | `any` | Dynamic values keyed by column `id` |
|
|
120
|
+
|
|
121
|
+
##### FlexTableColumn
|
|
122
|
+
|
|
123
|
+
| Property | Type | Description |
|
|
124
|
+
| ---------- | ------------------------------------------------------ | -------------------------------------------- |
|
|
125
|
+
| `key` | `string` | Unique column identifier |
|
|
126
|
+
| `title` | `string` | Column header label |
|
|
127
|
+
| `type` | `"text" \| "number" \| "textarea" \| "math" \| "list"` | Input type for the column |
|
|
128
|
+
| `width` | `string` | Tailwind width class, e.g. `"min-w-[200px]"` |
|
|
129
|
+
| `editable` | `boolean` | Whether the column cells can be edited |
|
|
130
|
+
|
|
131
|
+
##### FlexMathQuery
|
|
132
|
+
|
|
133
|
+
Validation rules passed to `flexMathQueries`. Evaluated when the component is used inside a `Form` and `handleSubmit` is called.
|
|
134
|
+
|
|
135
|
+
| Property | Type | Description |
|
|
136
|
+
| ----------------- | -------------------------------------------- | --------------------------------------------------------------------------------- |
|
|
137
|
+
| `type` | `"categoryPercentage" \| "columnPercentage"` | Validation rule type |
|
|
138
|
+
| `targetCategory` | `string` | (`categoryPercentage` only) The category whose subtotal is checked |
|
|
139
|
+
| `maxPercentage` | `number` | Maximum allowed percentage (0–100) |
|
|
140
|
+
| `targetColumn` | `string` | (`columnPercentage` only) The column whose total is checked |
|
|
141
|
+
| `subtotalColumns` | `string[]` | (`columnPercentage` only) Columns whose totals are summed to form the denominator |
|
|
142
|
+
|
|
143
|
+
> `categoryPercentage`: validates that `sum(targetCategory) / grandTotal <= maxPercentage / 100`
|
|
144
|
+
>
|
|
145
|
+
> `columnPercentage`: validates that `sum(targetColumn) / sum(subtotalColumns) <= maxPercentage / 100`
|
|
146
|
+
|
|
147
|
+
##### Using with Form
|
|
148
|
+
|
|
149
|
+
`FlexTable` implements the form input ref interface. Pass it as a ref in `refList` to include it in form validation:
|
|
150
|
+
|
|
151
|
+
```jsx
|
|
152
|
+
const formRef = useRef(null);
|
|
153
|
+
const tableRef = useRef(null);
|
|
154
|
+
|
|
155
|
+
<Form ref={formRef} refList={[tableRef]}>
|
|
156
|
+
<FlexTable ref={tableRef} ... flexMathQueries={[...]} />
|
|
157
|
+
</Form>
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
Calling `formRef.current.handleSubmit()` will trigger `FlexTable.handleSubmit()`, which runs all `flexMathQueries` and blocks submission if any rule fails.
|