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.
Files changed (245) hide show
  1. package/README.md +5 -0
  2. package/lib/components/action/button/README.md +75 -0
  3. package/lib/components/action/button/button.stories.tsx +138 -0
  4. package/lib/components/action/buttonGroup/README.md +79 -0
  5. package/lib/components/action/buttonGroup/buttonGroup.stories.tsx +104 -0
  6. package/lib/components/action/iconButton/README.md +39 -0
  7. package/lib/components/action/iconButton/iconButton.stories.tsx +22 -0
  8. package/lib/components/action/radioList/README.md +98 -0
  9. package/lib/components/action/radioList/radioList.stories.tsx +181 -0
  10. package/lib/components/action/slider/README.md +86 -0
  11. package/lib/components/action/slider/slider.stories.tsx +133 -0
  12. package/lib/components/action/textButton/README.md +34 -0
  13. package/lib/components/action/textButton/textButton.stories.tsx +16 -0
  14. package/lib/components/action/toggle/README.md +39 -0
  15. package/lib/components/action/toggle/toggle.stories.tsx +23 -0
  16. package/lib/components/advanced/collapse/README.md +106 -0
  17. package/lib/components/advanced/collapse/collapse.stories.tsx +165 -0
  18. package/lib/components/advanced/infoWindow/README.md +69 -0
  19. package/lib/components/advanced/infoWindow/infoWindow.stories.tsx +112 -0
  20. package/lib/components/advanced/popUp/README.md +95 -0
  21. package/lib/components/advanced/popUp/popUp.stories.tsx +189 -0
  22. package/lib/components/auth/bareSignIn/README.md +78 -0
  23. package/lib/components/auth/bareSignIn/bareSignIn.stories.tsx +141 -0
  24. package/lib/components/auth/bareSignUp/README.md +130 -0
  25. package/lib/components/auth/bareSignUp/bareSignUp.stories.tsx +159 -0
  26. package/lib/components/auth/signIn/README.md +53 -0
  27. package/lib/components/auth/signIn/signIn.stories.tsx +120 -0
  28. package/lib/components/auth/signUp/README.md +136 -0
  29. package/lib/components/auth/signUp/signUp.stories.tsx +193 -0
  30. package/lib/components/chart/README.md +13 -0
  31. package/lib/components/chart/areaChart/README.md +133 -0
  32. package/lib/components/chart/areaChart/areaChart.stories.tsx +199 -0
  33. package/lib/components/chart/barChart/README.md +193 -0
  34. package/lib/components/chart/barChart/barChart.stories.tsx +318 -0
  35. package/lib/components/chart/boxPlotChart/README.md +124 -0
  36. package/lib/components/chart/boxPlotChart/boxPlotChart.stories.tsx +104 -0
  37. package/lib/components/chart/bubbleChart/README.md +166 -0
  38. package/lib/components/chart/bubbleChart/bubbleChart.stories.tsx +144 -0
  39. package/lib/components/chart/card/README.md +107 -0
  40. package/lib/components/chart/card/card.stories.tsx +89 -0
  41. package/lib/components/chart/ganttChart/README.md +142 -0
  42. package/lib/components/chart/ganttChart/ganttChart.stories.tsx +138 -0
  43. package/lib/components/chart/heatmapChart/README.md +125 -0
  44. package/lib/components/chart/heatmapChart/heatmapChart.stories.tsx +106 -0
  45. package/lib/components/chart/lineChart/README.md +140 -0
  46. package/lib/components/chart/lineChart/lineChart.stories.tsx +152 -0
  47. package/lib/components/chart/pieChart/README.md +117 -0
  48. package/lib/components/chart/pieChart/pieChart.stories.tsx +180 -0
  49. package/lib/components/chart/polarAreaChart/README.md +126 -0
  50. package/lib/components/chart/polarAreaChart/polarAreaChart.stories.tsx +106 -0
  51. package/lib/components/chart/radarChart/README.md +57 -0
  52. package/lib/components/chart/radarChart/radarChart.stories.tsx +36 -0
  53. package/lib/components/chart/radialBar/README.md +152 -0
  54. package/lib/components/chart/radialBar/radialChart.stories.tsx +136 -0
  55. package/lib/components/chart/rangeBarChart/README.md +323 -0
  56. package/lib/components/chart/rangeBarChart/rangeBarChart.stories.tsx +208 -0
  57. package/lib/components/chart/statsCard/README.md +97 -0
  58. package/lib/components/chart/statsCard/statsCard.stories.tsx +183 -0
  59. package/lib/components/chart/treemapChart/README.md +142 -0
  60. package/lib/components/chart/treemapChart/treemapChart.stories.tsx +122 -0
  61. package/lib/components/chat/chatAnchor/README.md +113 -0
  62. package/lib/components/chat/chatAnchor/chatAnchor.stories.tsx +156 -0
  63. package/lib/components/chat/chatBase/README.md +223 -0
  64. package/lib/components/chat/chatBase/chatBase.stories.tsx +306 -0
  65. package/lib/components/chat/chatDashboard/README.md +161 -0
  66. package/lib/components/chat/chatDashboard/chatDashboard.stories.tsx +154 -0
  67. package/lib/components/data/dataGraph/README.md +13 -0
  68. package/lib/components/data/dataGraph/dataGraph.stories.tsx +84 -0
  69. package/lib/components/data/dataReference/README.md +62 -0
  70. package/lib/components/data/dataReference/dataReference.stories.tsx +53 -0
  71. package/lib/components/data/dataTemplate/README.md +903 -0
  72. package/lib/components/data/dataTemplate/dataModule.stories.tsx +196 -0
  73. package/lib/components/data/dataTemplate/dataTemplate.stories.tsx +337 -0
  74. package/lib/components/data/dataWrapper/README.md +1077 -0
  75. package/lib/components/data/dataWrapper/dataWrapper.stories.tsx +831 -0
  76. package/lib/components/data/queryForm/README.md +56 -0
  77. package/lib/components/data/queryForm/queryForm.stories.tsx +85 -0
  78. package/lib/components/data/readQuery/README.md +282 -0
  79. package/lib/components/data/readQuery/readQuery.stories.tsx +256 -0
  80. package/lib/components/data/readQueryHoc/README.md +89 -0
  81. package/lib/components/data/readQueryHoc/readQueryHoc.stories.tsx +33 -0
  82. package/lib/components/data/writeQuery/README.md +178 -0
  83. package/lib/components/data/writeQuery/writeQuery.stories.tsx +209 -0
  84. package/lib/components/design/actionSection/README.md +47 -0
  85. package/lib/components/design/actionSection/actionSection.stories.tsx +74 -0
  86. package/lib/components/design/banner/README.md +43 -0
  87. package/lib/components/design/banner/banner.stories.tsx +34 -0
  88. package/lib/components/design/bannerAction/README.md +44 -0
  89. package/lib/components/design/bannerAction/bannerAction.stories.tsx +25 -0
  90. package/lib/components/design/blogSection/README.md +111 -0
  91. package/lib/components/design/blogSection/blogSection.stories.tsx +72 -0
  92. package/lib/components/design/carouselSection/README.md +82 -0
  93. package/lib/components/design/carouselSection/carouselSection.stories.tsx +52 -0
  94. package/lib/components/design/designList/README.md +60 -0
  95. package/lib/components/design/designList/designList.stories.tsx +44 -0
  96. package/lib/components/design/faq/README.md +121 -0
  97. package/lib/components/design/faq/faq.stories.tsx +103 -0
  98. package/lib/components/design/fileGrid/README.md +87 -0
  99. package/lib/components/design/fileGrid/fileGrid.stories.tsx +110 -0
  100. package/lib/components/design/fileViewer/README.md +40 -0
  101. package/lib/components/design/fileViewer/fileViewer.stories.tsx +28 -0
  102. package/lib/components/design/footerSection/README.md +62 -0
  103. package/lib/components/design/footerSection/footerSection.stories.tsx +84 -0
  104. package/lib/components/design/googleReview/README.md +45 -0
  105. package/lib/components/design/googleReview/googleReview.stories.tsx +33 -0
  106. package/lib/components/design/heroSection/README.md +48 -0
  107. package/lib/components/design/heroSection/heroSection.stories.tsx +85 -0
  108. package/lib/components/design/iconList/README.md +60 -0
  109. package/lib/components/design/iconList/iconList.stories.tsx +41 -0
  110. package/lib/components/design/imageGallery/README.md +56 -0
  111. package/lib/components/design/imageGallery/imageGallery.stories.tsx +45 -0
  112. package/lib/components/design/imageZoom/README.md +47 -0
  113. package/lib/components/design/imageZoom/imageZoom.stories.tsx +30 -0
  114. package/lib/components/design/leftContent/README.md +47 -0
  115. package/lib/components/design/leftContent/leftContent.stories.tsx +32 -0
  116. package/lib/components/design/logoCloud/README.md +42 -0
  117. package/lib/components/design/logoCloud/logoCloud.stories.tsx +44 -0
  118. package/lib/components/design/onboarding/README.md +100 -0
  119. package/lib/components/design/onboarding/onboarding.stories.tsx +113 -0
  120. package/lib/components/design/pricing/README.md +112 -0
  121. package/lib/components/design/pricing/pricing.stories.tsx +86 -0
  122. package/lib/components/design/rightContent/README.md +47 -0
  123. package/lib/components/design/rightContent/rightContent.stories.tsx +32 -0
  124. package/lib/components/design/sectionList/README.md +51 -0
  125. package/lib/components/design/sectionList/sectionList.stories.tsx +35 -0
  126. package/lib/components/design/teams/README.md +62 -0
  127. package/lib/components/design/teams/teams.stories.tsx +61 -0
  128. package/lib/components/display/alert/README.md +82 -0
  129. package/lib/components/display/alert/alert.stories.tsx +71 -0
  130. package/lib/components/display/calendar/README.md +113 -0
  131. package/lib/components/display/calendar/calendar.stories.tsx +159 -0
  132. package/lib/components/display/clipboard/README.md +36 -0
  133. package/lib/components/display/clipboard/clipboard.stories.tsx +32 -0
  134. package/lib/components/display/detailList/README.md +61 -0
  135. package/lib/components/display/detailList/detailList.stories.tsx +131 -0
  136. package/lib/components/display/drawer/README.md +74 -0
  137. package/lib/components/display/drawer/drawer.stories.tsx +66 -0
  138. package/lib/components/display/emptyState/README.md +38 -0
  139. package/lib/components/display/emptyState/emptyState.stories.tsx +22 -0
  140. package/lib/components/display/feeds/README.md +80 -0
  141. package/lib/components/display/feeds/feeds.stories.tsx +75 -0
  142. package/lib/components/display/flexTable/README.md +160 -0
  143. package/lib/components/display/flexTable/flexTable.stories.tsx +313 -0
  144. package/lib/components/display/grid/README.md +121 -0
  145. package/lib/components/display/grid/grid.stories.tsx +234 -0
  146. package/lib/components/display/kanban/README.md +78 -0
  147. package/lib/components/display/kanban/kanban.stories.tsx +133 -0
  148. package/lib/components/display/list/README.md +109 -0
  149. package/lib/components/display/list/list.stories.tsx +188 -0
  150. package/lib/components/display/loading/README.md +25 -0
  151. package/lib/components/display/loading/loading.stories.tsx +15 -0
  152. package/lib/components/display/mapView/README.md +99 -0
  153. package/lib/components/display/mapView/mapView.stories.tsx +225 -0
  154. package/lib/components/display/modal/README.md +43 -0
  155. package/lib/components/display/modal/modal.stories.tsx +81 -0
  156. package/lib/components/display/notification/README.md +43 -0
  157. package/lib/components/display/notification/notification.stories.tsx +30 -0
  158. package/lib/components/display/progress/README.md +25 -0
  159. package/lib/components/display/progress/progress.stories.tsx +15 -0
  160. package/lib/components/display/stepper/README.md +96 -0
  161. package/lib/components/display/stepper/stepper.stories.tsx +175 -0
  162. package/lib/components/display/table/README.md +176 -0
  163. package/lib/components/display/table/table.stories.tsx +330 -0
  164. package/lib/components/display/tag/README.md +74 -0
  165. package/lib/components/display/tag/tag.stories.tsx +79 -0
  166. package/lib/components/input/address/README.md +132 -0
  167. package/lib/components/input/address/address.stories.tsx +147 -0
  168. package/lib/components/input/canvas/README.md +131 -0
  169. package/lib/components/input/canvas/canvas.stories.tsx +165 -0
  170. package/lib/components/input/checkbox/README.md +61 -0
  171. package/lib/components/input/checkbox/checkbox.stories.tsx +30 -0
  172. package/lib/components/input/datePicker/README.md +124 -0
  173. package/lib/components/input/datePicker/datePicker.stories.tsx +197 -0
  174. package/lib/components/input/form/README.md +55 -0
  175. package/lib/components/input/form/form.stories.tsx +143 -0
  176. package/lib/components/input/markdown/README.md +146 -0
  177. package/lib/components/input/markdown/markdown.stories.tsx +40 -0
  178. package/lib/components/input/monthYearPicker/README.md +69 -0
  179. package/lib/components/input/monthYearPicker/monthYearPicker.stories.tsx +47 -0
  180. package/lib/components/input/netPromoterScore/README.md +52 -0
  181. package/lib/components/input/netPromoterScore/netPromoterScore.stories.tsx +30 -0
  182. package/lib/components/input/rating/README.md +51 -0
  183. package/lib/components/input/rating/rating.stories.tsx +30 -0
  184. package/lib/components/input/select/README.md +108 -0
  185. package/lib/components/input/select/select.stories.tsx +286 -0
  186. package/lib/components/input/signature/README.md +106 -0
  187. package/lib/components/input/signature/signature.stories.tsx +188 -0
  188. package/lib/components/input/textArea/README.md +55 -0
  189. package/lib/components/input/textArea/textArea.stories.tsx +30 -0
  190. package/lib/components/input/textInput/README.md +81 -0
  191. package/lib/components/input/textInput/textinput.stories.tsx +231 -0
  192. package/lib/components/input/uploadInput/README.md +134 -0
  193. package/lib/components/input/uploadInput/uploadInput.stories.tsx +193 -0
  194. package/lib/components/navigation/bars/README.md +40 -0
  195. package/lib/components/navigation/bars/bars.stories.tsx +85 -0
  196. package/lib/components/navigation/bottomTab/README.md +53 -0
  197. package/lib/components/navigation/bottomTab/bottomTab.stories.tsx +32 -0
  198. package/lib/components/navigation/breadcrumb/README.md +48 -0
  199. package/lib/components/navigation/breadcrumb/breadcrumb.stories.tsx +27 -0
  200. package/lib/components/navigation/header/README.md +149 -0
  201. package/lib/components/navigation/header/header.stories.tsx +107 -0
  202. package/lib/components/navigation/leftNav/README.md +91 -0
  203. package/lib/components/navigation/leftNav/leftNav.stories.tsx +106 -0
  204. package/lib/components/navigation/tabs/README.md +75 -0
  205. package/lib/components/navigation/tabs/tabs.stories.tsx +60 -0
  206. package/lib/components/structure/column/README.md +40 -0
  207. package/lib/components/structure/column/column.stories.tsx +26 -0
  208. package/lib/components/structure/container/README.md +34 -0
  209. package/lib/components/structure/container/container.stories.tsx +19 -0
  210. package/lib/components/structure/link/README.md +55 -0
  211. package/lib/components/structure/link/link.stories.tsx +30 -0
  212. package/lib/components/structure/text/README.md +42 -0
  213. package/lib/components/structure/text/text.stories.tsx +39 -0
  214. package/lib/components/template/authPage/authPage.stories.tsx +68 -0
  215. package/lib/components/template/landingPage/landingPage.stories.tsx +288 -0
  216. package/lib/components/template/productListing/productListing.stories.tsx +297 -0
  217. package/lib/components/template/productOverview/productOverview.stories.tsx +194 -0
  218. package/lib/components/template/shoppingCart/shoppingCart.stories.tsx +252 -0
  219. package/lib/components/template/userHomePage/userHomePage.stories.tsx +605 -0
  220. package/lib/components/template/userRankingDashboard/userRankingDashboard.stories.tsx +481 -0
  221. package/lib/mcp/server.d.ts +2 -0
  222. package/lib/mcp/server.d.ts.map +1 -0
  223. package/lib/mcp/server.js +33 -0
  224. package/lib/mcp/server.js.map +1 -0
  225. package/lib/mcp/tools/getBackendComponent.d.ts +13 -0
  226. package/lib/mcp/tools/getBackendComponent.d.ts.map +1 -0
  227. package/lib/mcp/tools/getBackendComponent.js +119 -0
  228. package/lib/mcp/tools/getBackendComponent.js.map +1 -0
  229. package/lib/mcp/tools/getComponent.d.ts +17 -0
  230. package/lib/mcp/tools/getComponent.d.ts.map +1 -0
  231. package/lib/mcp/tools/getComponent.js +118 -0
  232. package/lib/mcp/tools/getComponent.js.map +1 -0
  233. package/lib/mcp/tools/listComponents.d.ts +13 -0
  234. package/lib/mcp/tools/listComponents.d.ts.map +1 -0
  235. package/lib/mcp/tools/listComponents.js +113 -0
  236. package/lib/mcp/tools/listComponents.js.map +1 -0
  237. package/lib/mcp/tools/listTemplates.d.ts +13 -0
  238. package/lib/mcp/tools/listTemplates.d.ts.map +1 -0
  239. package/lib/mcp/tools/listTemplates.js +68 -0
  240. package/lib/mcp/tools/listTemplates.js.map +1 -0
  241. package/lib/mcp/tools/suggestTemplate.d.ts +17 -0
  242. package/lib/mcp/tools/suggestTemplate.d.ts.map +1 -0
  243. package/lib/mcp/tools/suggestTemplate.js +212 -0
  244. package/lib/mcp/tools/suggestTemplate.js.map +1 -0
  245. package/package.json +23 -0
@@ -0,0 +1,605 @@
1
+ import { storiesOf } from "@storybook/react";
2
+ import React, { useState } from "react";
3
+ import { Button } from "../../action/button";
4
+ import { ActionSection } from "../../design/actionSection";
5
+ import { FAQContent } from "../../design/faq";
6
+ import { FooterSection } from "../../design/footerSection";
7
+ import { GoogleReview } from "../../design/googleReview";
8
+ import { IconList } from "../../design/iconList";
9
+ import { Grid, GridClass } from "../../display/grid";
10
+ import { Modal } from "../../display/modal";
11
+ import { Select } from "../../input/select";
12
+ import { TextInput } from "../../input/textInput";
13
+ import { Container } from "../../structure/container";
14
+ import { Header } from "../../navigation/header";
15
+ import "../../../index.css";
16
+ import { Disclosure, Menu, Popover, Transition } from "@headlessui/react";
17
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
18
+ const Logo = require("../../../assets/logo.png");
19
+
20
+ const stories = storiesOf("Template", module);
21
+
22
+ const QUAL_ITEMS = [
23
+ {
24
+ title: "Own a Property",
25
+ desc: "Perfect, that means our service is a great fit.",
26
+ icon: (
27
+ <svg
28
+ className="w-6 h-6"
29
+ fill="none"
30
+ viewBox="0 0 24 24"
31
+ stroke="currentColor"
32
+ >
33
+ <path
34
+ strokeLinecap="round"
35
+ strokeLinejoin="round"
36
+ strokeWidth={2}
37
+ d="M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6"
38
+ />
39
+ </svg>
40
+ ),
41
+ },
42
+ {
43
+ title: "Monthly Electricity Bill Over RM 200",
44
+ desc: "The higher your bill, the more you stand to save with solar.",
45
+ icon: (
46
+ <svg
47
+ className="w-6 h-6"
48
+ fill="none"
49
+ viewBox="0 0 24 24"
50
+ stroke="currentColor"
51
+ >
52
+ <path
53
+ strokeLinecap="round"
54
+ strokeLinejoin="round"
55
+ strokeWidth={2}
56
+ d="M13 10V3L4 14h7v7l9-11h-7z"
57
+ />
58
+ </svg>
59
+ ),
60
+ },
61
+ ];
62
+
63
+ const USE_CASE_ITEMS = [
64
+ {
65
+ id: "user-1",
66
+ percentage: "90%",
67
+ imageSrc:
68
+ "https://images.unsplash.com/photo-1494790108377-be9c29b29330?auto=format&fit=facearea&facepad=2&w=400&h=300&q=80",
69
+ name: "Sarah Lim",
70
+ location: "Petaling Jaya, Selangor",
71
+ totalSaving: "RM 450/mo",
72
+ monthlySaving: "RM 45/mo",
73
+ videoUrl: "",
74
+ },
75
+ {
76
+ id: "user-2",
77
+ percentage: "50%",
78
+ imageSrc:
79
+ "https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?auto=format&fit=facearea&facepad=2&w=400&h=300&q=80",
80
+ name: "Ahmad Razif",
81
+ location: "Johor Bahru, Johor",
82
+ totalSaving: "RM 320/mo",
83
+ monthlySaving: "RM 160/mo",
84
+ videoUrl: "",
85
+ },
86
+ {
87
+ id: "user-3",
88
+ percentage: "60%",
89
+ imageSrc:
90
+ "https://images.unsplash.com/photo-1550525811-e5869dd03032?auto=format&fit=facearea&facepad=2&w=400&h=300&q=80",
91
+ name: "Priya Nair",
92
+ location: "George Town, Penang",
93
+ totalSaving: "RM 380/mo",
94
+ monthlySaving: "RM 152/mo",
95
+ videoUrl: "",
96
+ },
97
+ ];
98
+
99
+ const WHY_ITEMS = [
100
+ {
101
+ image:
102
+ "https://images.unsplash.com/photo-1519244703995-f4e0f30006d5?auto=format&fit=crop&w=128&h=128&q=80",
103
+ title: "Lorem ipsum dolor sit amet.",
104
+ desc: "Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.",
105
+ },
106
+ {
107
+ image:
108
+ "https://images.unsplash.com/photo-1517841905240-472988babdf9?auto=format&fit=crop&w=128&h=128&q=80",
109
+ title: "Consectetur adipiscing elit.",
110
+ desc: "Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua ut enim ad minim veniam.",
111
+ },
112
+ {
113
+ image:
114
+ "https://images.unsplash.com/photo-1505840717430-882ce147ef2d?auto=format&fit=crop&w=128&h=128&q=80",
115
+ title: "Ut enim ad minim veniam.",
116
+ desc: "Quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat duis aute.",
117
+ },
118
+ ];
119
+
120
+ const HOW_IT_WORKS_STEPS = [
121
+ {
122
+ title: "Step 1: Get a Free Quote",
123
+ description:
124
+ "Fill in your details and we'll prepare a custom proposal for you.",
125
+ icon: (
126
+ <svg
127
+ className="w-6 h-6"
128
+ fill="none"
129
+ viewBox="0 0 24 24"
130
+ stroke="currentColor"
131
+ >
132
+ <path
133
+ strokeLinecap="round"
134
+ strokeLinejoin="round"
135
+ strokeWidth={2}
136
+ d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"
137
+ />
138
+ </svg>
139
+ ),
140
+ },
141
+ {
142
+ title: "Step 2: Professional Installation",
143
+ description: "Our certified team handles your request quickly and cleanly.",
144
+ icon: (
145
+ <svg
146
+ className="w-6 h-6"
147
+ fill="none"
148
+ viewBox="0 0 24 24"
149
+ stroke="currentColor"
150
+ >
151
+ <path
152
+ strokeLinecap="round"
153
+ strokeLinejoin="round"
154
+ strokeWidth={2}
155
+ d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"
156
+ />
157
+ </svg>
158
+ ),
159
+ },
160
+ {
161
+ title: "Step 3: Start Saving",
162
+ description: "Track your progress and savings directly in the app.",
163
+ icon: (
164
+ <svg
165
+ className="w-6 h-6"
166
+ fill="none"
167
+ viewBox="0 0 24 24"
168
+ stroke="currentColor"
169
+ >
170
+ <path
171
+ strokeLinecap="round"
172
+ strokeLinejoin="round"
173
+ strokeWidth={2}
174
+ d="M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z"
175
+ />
176
+ </svg>
177
+ ),
178
+ },
179
+ ];
180
+
181
+ const FAQ_LIST = [
182
+ {
183
+ question: "How does the system work?",
184
+ answer:
185
+ "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
186
+ },
187
+ {
188
+ question: "What is the payback period?",
189
+ answer:
190
+ "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.",
191
+ },
192
+ {
193
+ question: "How much do I need to invest?",
194
+ answer:
195
+ "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.",
196
+ },
197
+ {
198
+ question: "By how much will my costs be reduced?",
199
+ answer:
200
+ "Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
201
+ },
202
+ ];
203
+
204
+ const PRODUCT_CARDS: GridClass[] = [
205
+ {
206
+ id: "product-a",
207
+ title: "Solar PV System",
208
+ description: "Generate your own clean electricity",
209
+ },
210
+ {
211
+ id: "product-b",
212
+ title: "Solar + Battery Storage",
213
+ description: "Generate and store energy for round-the-clock savings",
214
+ },
215
+ ];
216
+
217
+ const PRODUCT_GRID_ITEMS: { [id: string]: React.ReactElement } = {
218
+ "product-a": (
219
+ <div className="flex flex-col rounded-xl overflow-hidden shadow-md bg-white">
220
+ <img
221
+ src="https://images.unsplash.com/photo-1508514177221-188b1cf16e9d?auto=format&fit=crop&w=600&h=300&q=80"
222
+ alt="Product A"
223
+ className="h-48 w-full object-cover"
224
+ />
225
+ <div className="p-6 flex flex-col gap-y-2">
226
+ <p className="text-lg font-semibold text-gray-900">Solar PV System</p>
227
+ <p className="text-sm text-gray-500">Model: Jinko Tiger Neo 580W</p>
228
+ <p className="text-sm text-gray-500">System Size: 8 kWp · 14 panels</p>
229
+ <p className="text-2xl font-bold text-primary-600 mt-2">
230
+ Save RM 280/mo
231
+ </p>
232
+ <span className="inline-block mt-1 px-3 py-1 bg-primary-100 text-primary-700 text-xs font-semibold rounded-full w-fit">
233
+ ~70% savings
234
+ </span>
235
+ </div>
236
+ </div>
237
+ ),
238
+ "product-b": (
239
+ <div className="flex flex-col rounded-xl overflow-hidden shadow-md bg-white">
240
+ <img
241
+ src="https://images.unsplash.com/photo-1466611653911-95081537e5b7?auto=format&fit=crop&w=600&h=300&q=80"
242
+ alt="Product B"
243
+ className="h-48 w-full object-cover"
244
+ />
245
+ <div className="p-6 flex flex-col gap-y-2">
246
+ <p className="text-lg font-semibold text-gray-900">
247
+ Solar + Battery Storage
248
+ </p>
249
+ <p className="text-sm text-gray-500">
250
+ Model: Jinko Tiger Neo 580W + Growatt 10kWh
251
+ </p>
252
+ <p className="text-sm text-gray-500">System Size: 10 kWp · 18 panels</p>
253
+ <p className="text-2xl font-bold text-primary-600 mt-2">
254
+ Save RM 380/mo
255
+ </p>
256
+ <span className="inline-block mt-1 px-3 py-1 bg-primary-100 text-primary-700 text-xs font-semibold rounded-full w-fit">
257
+ ~90% savings
258
+ </span>
259
+ </div>
260
+ </div>
261
+ ),
262
+ };
263
+
264
+ stories.add("User Home Page", () => {
265
+ const [videoModal, setVideoModal] = useState(false);
266
+ const [videoUrl, setVideoUrl] = useState("");
267
+
268
+ const gridItems: GridClass[] = USE_CASE_ITEMS.map((item) => ({
269
+ id: item.id,
270
+ title: item.name,
271
+ description: item.location,
272
+ imageUrl: item.imageSrc,
273
+ extra: item,
274
+ }));
275
+
276
+ const customGridItems: { [id: string]: React.ReactElement } = {};
277
+ USE_CASE_ITEMS.forEach((item) => {
278
+ customGridItems[item.id] = (
279
+ <div className="w-72 h-full flex flex-col rounded-3xl shadow-lg overflow-hidden lg:w-full hover:shadow-xl">
280
+ <img
281
+ src={item.imageSrc}
282
+ alt={item.name}
283
+ className="h-48 object-cover rounded-t-3xl"
284
+ />
285
+ <div className="-mt-6 p-6 bg-primary-900 text-white">
286
+ <h1 className="text-5xl font-bold">{item.percentage}</h1>
287
+ <p>reduction in bill</p>
288
+ <p className="text-primary-300 text-xl font-semibold">
289
+ From {item.totalSaving} to {item.monthlySaving}
290
+ </p>
291
+ <div className="mt-8 flex justify-between items-center">
292
+ <div className="text-sm text-gray-300">
293
+ <p>{item.name}</p>
294
+ <p>{item.location}</p>
295
+ </div>
296
+ {item.videoUrl && (
297
+ <button
298
+ onClick={() => {
299
+ setVideoUrl(item.videoUrl!);
300
+ setVideoModal(true);
301
+ }}
302
+ className="text-primary-300 hover:text-white"
303
+ >
304
+ <svg
305
+ className="w-8 h-8"
306
+ fill="currentColor"
307
+ viewBox="0 0 24 24"
308
+ >
309
+ <path d="M8 5v14l11-7z" />
310
+ </svg>
311
+ </button>
312
+ )}
313
+ </div>
314
+ </div>
315
+ </div>
316
+ );
317
+ });
318
+
319
+ return (
320
+ <div className="bg-white">
321
+ <Header
322
+ defaultNav="/"
323
+ page="Headphones"
324
+ logo={Logo}
325
+ navigation={[
326
+ { name: "Home", href: "#" },
327
+ { name: "Products", href: "#" },
328
+ { name: "Calculator", href: "#" },
329
+ { name: "About Us", href: "#" },
330
+ ]}
331
+ lib={{ Disclosure, Menu, Transition, Popover }}
332
+ />
333
+ <div
334
+ className="relative h-screen bg-cover bg-top"
335
+ style={{
336
+ backgroundImage:
337
+ "url(https://images.unsplash.com/photo-1508514177221-188b1cf16e9d?auto=format&fit=crop&w=1920&q=80)",
338
+ }}
339
+ >
340
+ <div className="absolute inset-0 bg-black/40 z-0" />
341
+ <div className="relative z-10 h-full flex flex-col items-center justify-center text-center px-4">
342
+ <p className="mb-4 text-xl font-medium text-primary-200 sm:text-2xl md:text-3xl">
343
+ Malaysia's Leading Solar Energy Provider
344
+ </p>
345
+ <h1 className="text-3xl font-bold text-white mb-8 max-w-3xl md:text-5xl">
346
+ Cut Your Electricity Bill by Up to 90%
347
+ </h1>
348
+ <div className="mb-6 text-lg text-gray-200 max-w-xl">
349
+ {[
350
+ "How much can I save by switching to solar?",
351
+ "What is the payback period for solar panels?",
352
+ "How do I get started with solar installation?",
353
+ ].map((q, i) => (
354
+ <p key={i} className="mb-1 italic">
355
+ "{q}"
356
+ </p>
357
+ ))}
358
+ </div>
359
+ <Button text="GET STARTED" type="normal" onClick={() => {}} />
360
+ </div>
361
+ </div>
362
+
363
+ <div id="use-case-section">
364
+ <Modal
365
+ open={videoModal}
366
+ renderContent={() => (
367
+ <iframe
368
+ width="100%"
369
+ height="500"
370
+ src={videoUrl}
371
+ title="Video"
372
+ allowFullScreen
373
+ />
374
+ )}
375
+ onClose={() => setVideoModal(false)}
376
+ maxWidth="4xl"
377
+ />
378
+ <Container className="pb-20 pt-10">
379
+ <div className="flex flex-col justify-center items-center text-center">
380
+ <h1 className="text-xl md:text-3xl">If you meet both criteria,</h1>
381
+ <h1 className="text-3xl font-semibold text-primary-800 md:text-5xl md:mt-2">
382
+ You are a qualified applicant!
383
+ </h1>
384
+ </div>
385
+ <div className="mt-8 flex flex-col gap-y-4 md:flex-row md:gap-x-8">
386
+ {QUAL_ITEMS.map((item, i) => (
387
+ <div
388
+ key={i}
389
+ className="p-6 flex flex-1 gap-x-4 items-start bg-white rounded-xl shadow-lg hover:shadow-xl md:p-10"
390
+ >
391
+ <div className="h-fit flex-shrink-0 text-primary-600">
392
+ {item.icon}
393
+ </div>
394
+ <div className="flex flex-col gap-y-1">
395
+ <p className="text-xl font-medium leading-none lg:text-2xl">
396
+ {item.title}
397
+ </p>
398
+ <p className="text-sm text-gray-500 lg:text-base">
399
+ {item.desc}
400
+ </p>
401
+ </div>
402
+ </div>
403
+ ))}
404
+ </div>
405
+ <div className="mt-14">
406
+ <Grid
407
+ data={gridItems}
408
+ hidePagination
409
+ loading={false}
410
+ customGridItems={customGridItems}
411
+ itemClassName="mb-5 !bg-gray-50 shadow-none w-full"
412
+ gridColClassName="mb-0 gap-6 grid-cols-1 sm:grid-cols-3 md:gap-8"
413
+ horizontalScroll
414
+ />
415
+ </div>
416
+ </Container>
417
+ </div>
418
+
419
+ <Container bgColor="bg-gray-100" className="py-16">
420
+ <h2 className="text-3xl font-semibold text-primary-800 text-center md:text-5xl">
421
+ Why Choose Us?
422
+ </h2>
423
+ <div className="my-14 gap-y-6 grid sm:grid-cols-2 sm:gap-x-6 md:mt-20 lg:grid-cols-3 lg:gap-x-8">
424
+ {WHY_ITEMS.map((item, i) => (
425
+ <div key={i}>
426
+ <div className="justify-center flex">
427
+ <img
428
+ src={item.image}
429
+ alt={item.title}
430
+ className="mb-6 w-20 h-20 rounded-full object-cover md:mb-8 md:w-32 md:h-32"
431
+ />
432
+ </div>
433
+ <p className="mb-2 text-xl text-primary-800 text-center font-medium md:text-2xl">
434
+ {item.title}
435
+ </p>
436
+ <p className="text-sm text-center md:text-base">{item.desc}</p>
437
+ </div>
438
+ ))}
439
+ </div>
440
+ </Container>
441
+
442
+ <div id="calculator-section">
443
+ <Container bgColor="bg-white" className="py-14">
444
+ <div className="text-center mb-10">
445
+ <h2 className="text-3xl font-semibold text-primary-800 md:text-5xl">
446
+ Solar Savings Calculator
447
+ </h2>
448
+ <p className="mt-3 text-gray-500 text-base">
449
+ Estimate your savings based on your property and usage details.
450
+ </p>
451
+ </div>
452
+ <div className="bg-primary-900 rounded-xl px-8 py-5 mb-8">
453
+ <p className="text-white font-semibold text-lg">
454
+ Let Us Know Your Details
455
+ </p>
456
+ </div>
457
+ <p className="text-sm font-semibold text-gray-700 mb-4 uppercase tracking-wide">
458
+ B. Property Details
459
+ </p>
460
+ <div className="grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4">
461
+ <Select
462
+ label="Roof Type"
463
+ value="option-a"
464
+ options={[
465
+ { key: "option-a", label: "Flat Roof" },
466
+ { key: "option-b", label: "Pitched Roof" },
467
+ { key: "option-c", label: "Metal Roof" },
468
+ ]}
469
+ />
470
+ <Select
471
+ label="Electricity Tariff"
472
+ value="option-a"
473
+ options={[
474
+ { key: "option-a", label: "Residential (TNB)" },
475
+ { key: "option-b", label: "Commercial (TNB)" },
476
+ { key: "option-c", label: "Industrial (TNB)" },
477
+ ]}
478
+ />
479
+ <Select
480
+ label="Grid Connection"
481
+ value="option-a"
482
+ options={[
483
+ { key: "option-a", label: "Single Phase" },
484
+ { key: "option-b", label: "Three Phase" },
485
+ ]}
486
+ />
487
+ <TextInput
488
+ label="Monthly Bill (RM)"
489
+ type="number"
490
+ value="500"
491
+ placeholder="e.g. 500"
492
+ />
493
+ </div>
494
+ <div className="mt-12 mb-4 text-center">
495
+ <h3 className="text-2xl font-semibold text-primary-800 md:text-3xl">
496
+ Comparison between Solar PV System and Solar + Battery Storage
497
+ </h3>
498
+ <p className="mt-2 text-gray-500 text-sm">
499
+ Based on your inputs, here are the recommended options for you.
500
+ </p>
501
+ </div>
502
+ <Grid
503
+ data={PRODUCT_CARDS}
504
+ loading={false}
505
+ hidePagination
506
+ customGridItems={PRODUCT_GRID_ITEMS}
507
+ itemClassName="!bg-gray-50 shadow-none"
508
+ gridColClassName="gap-6 grid-cols-1 sm:grid-cols-2"
509
+ />
510
+ </Container>
511
+ </div>
512
+
513
+ <div className="w-full flex flex-col bg-primary-900 lg:flex-row">
514
+ <div className="hidden overflow-hidden lg:w-1/2 lg:block">
515
+ <img
516
+ src="https://images.unsplash.com/photo-1508514177221-188b1cf16e9d?auto=format&fit=crop&w=800&q=80"
517
+ alt="how it works"
518
+ className="w-full h-full object-cover"
519
+ />
520
+ </div>
521
+ <div className="w-full flex flex-col justify-center text-white p-8 md:p-14 lg:w-1/2">
522
+ <h1 className="text-2xl font-semibold mb-8 sm:text-3xl md:text-4xl">
523
+ How it works
524
+ </h1>
525
+ <IconList
526
+ iconList={HOW_IT_WORKS_STEPS.map((step) => ({
527
+ name: step.title,
528
+ content: step.description,
529
+ icon: step.icon,
530
+ }))}
531
+ className="text-white [&_p]:text-white [&_dd]:text-gray-200"
532
+ />
533
+ <Button
534
+ text="GET A FREE QUOTE"
535
+ type="light"
536
+ size="small"
537
+ onClick={() => {}}
538
+ className="mt-8 w-full sm:w-fit"
539
+ />
540
+ </div>
541
+ </div>
542
+
543
+ <Container bgColor="bg-gray-50" className="py-14">
544
+ <h2 className="mb-14 text-3xl font-semibold text-primary-800 text-center md:text-5xl">
545
+ Frequently Asked Questions (FAQ)
546
+ </h2>
547
+ <div className="bg-white rounded-3xl text-primary-900 shadow-xl">
548
+ <FAQContent faqList={FAQ_LIST} />
549
+ </div>
550
+ </Container>
551
+
552
+ <Container bgColor="bg-white" className="py-10">
553
+ <h2 className="text-3xl font-semibold text-primary-800 text-center md:text-5xl">
554
+ See what our customers say about us!
555
+ </h2>
556
+ <div className="mt-10">
557
+ <GoogleReview placeId="" minRatingScore={4} />
558
+ </div>
559
+ </Container>
560
+
561
+ <Container bgColor="bg-white" className="py-10">
562
+ <ActionSection
563
+ title="Interested to save money? Switch today!"
564
+ buttonText="GET A FREE QUOTE"
565
+ backgroundImgSrc="https://images.unsplash.com/photo-1508514177221-188b1cf16e9d?auto=format&fit=crop&w=1920&q=80"
566
+ backgroundImgStyle={{ bgPosition: "bottom" }}
567
+ onClick={() => {}}
568
+ />
569
+ </Container>
570
+
571
+ <FooterSection
572
+ linkType="external"
573
+ caption={`© ${new Date().getFullYear()} SolarSave. All rights reserved.`}
574
+ footerList={[
575
+ {
576
+ title: "SolarSave",
577
+ subList: [
578
+ { name: "About Us", link: "/about" },
579
+ { name: "How It Works", link: "/how-it-works" },
580
+ { name: "Terms & Conditions", link: "/terms" },
581
+ { name: "Privacy Policy", link: "/privacy" },
582
+ ],
583
+ },
584
+ {
585
+ title: "My Account",
586
+ subList: [
587
+ { name: "Sign In", link: "/signIn" },
588
+ { name: "FAQ", link: "/faq" },
589
+ ],
590
+ },
591
+ ]}
592
+ logoCloud={
593
+ <div>
594
+ <div className="flex items-center space-x-2 mb-3">
595
+ <span className="font-semibold text-gray-900">SolarSave</span>
596
+ </div>
597
+ <p className="text-sm text-gray-500">
598
+ Lorem ipsum dolor sit amet consectetur adipiscing elit.
599
+ </p>
600
+ </div>
601
+ }
602
+ />
603
+ </div>
604
+ );
605
+ });