siesa-ui-kit 1.0.5 → 1.0.7
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 +115 -89
- package/dist/ButtonTest.d.ts +6 -0
- package/dist/ButtonTest.d.ts.map +1 -0
- package/dist/components/Alert/Alert.d.ts +23 -0
- package/dist/components/Alert/Alert.d.ts.map +1 -0
- package/dist/components/Alert/Alert.types.d.ts +46 -0
- package/dist/components/Alert/Alert.types.d.ts.map +1 -0
- package/dist/components/Avatar/Avatar.d.ts +41 -0
- package/dist/components/Avatar/Avatar.d.ts.map +1 -0
- package/dist/components/Avatar/Avatar.types.d.ts +46 -0
- package/dist/components/Avatar/Avatar.types.d.ts.map +1 -0
- package/dist/components/Badge/Badge.d.ts +42 -0
- package/dist/components/Badge/Badge.d.ts.map +1 -0
- package/dist/components/Badge/Badge.types.d.ts +32 -0
- package/dist/components/Badge/Badge.types.d.ts.map +1 -0
- package/dist/components/Button/Button.d.ts +84 -0
- package/dist/components/Button/Button.d.ts.map +1 -0
- package/dist/components/Button/Button.types.d.ts +162 -0
- package/dist/components/Button/Button.types.d.ts.map +1 -0
- package/dist/components/Button/icons.d.ts +26 -0
- package/dist/components/Button/icons.d.ts.map +1 -0
- package/{src/components/Button/index.ts → dist/components/Button/index.d.ts} +4 -3
- package/dist/components/Button/index.d.ts.map +1 -0
- package/dist/components/Checkbox/Checkbox.d.ts +31 -0
- package/dist/components/Checkbox/Checkbox.d.ts.map +1 -0
- package/dist/components/Checkbox/Checkbox.types.d.ts +53 -0
- package/dist/components/Checkbox/Checkbox.types.d.ts.map +1 -0
- package/dist/components/DescriptionList/DescriptionList.d.ts +38 -0
- package/dist/components/DescriptionList/DescriptionList.d.ts.map +1 -0
- package/dist/components/DescriptionList/DescriptionList.types.d.ts +27 -0
- package/dist/components/DescriptionList/DescriptionList.types.d.ts.map +1 -0
- package/dist/components/Divider/Divider.d.ts +33 -0
- package/dist/components/Divider/Divider.d.ts.map +1 -0
- package/dist/components/Divider/Divider.types.d.ts +22 -0
- package/dist/components/Divider/Divider.types.d.ts.map +1 -0
- package/dist/components/Dropdown/Dropdown.d.ts +66 -0
- package/dist/components/Dropdown/Dropdown.d.ts.map +1 -0
- package/dist/components/Dropdown/Dropdown.types.d.ts +124 -0
- package/dist/components/Dropdown/Dropdown.types.d.ts.map +1 -0
- package/dist/components/Dropdown/icons.d.ts +10 -0
- package/dist/components/Dropdown/icons.d.ts.map +1 -0
- package/{src/components/Dropdown/index.ts → dist/components/Dropdown/index.d.ts} +4 -8
- package/dist/components/Dropdown/index.d.ts.map +1 -0
- package/dist/components/DropdownItemCollapsible/DropdownItemCollapsible.d.ts +101 -0
- package/dist/components/DropdownItemCollapsible/DropdownItemCollapsible.d.ts.map +1 -0
- package/dist/components/DropdownItemCollapsible/DropdownItemCollapsible.types.d.ts +95 -0
- package/dist/components/DropdownItemCollapsible/DropdownItemCollapsible.types.d.ts.map +1 -0
- package/dist/components/DropdownItemCollapsible/icons.d.ts +19 -0
- package/dist/components/DropdownItemCollapsible/icons.d.ts.map +1 -0
- package/dist/components/DropdownItemCollapsible/index.d.ts +9 -0
- package/dist/components/DropdownItemCollapsible/index.d.ts.map +1 -0
- package/dist/components/DropdownItemHeading/DropdownItemHeading.d.ts +75 -0
- package/dist/components/DropdownItemHeading/DropdownItemHeading.d.ts.map +1 -0
- package/dist/components/DropdownItemHeading/DropdownItemHeading.types.d.ts +85 -0
- package/dist/components/DropdownItemHeading/DropdownItemHeading.types.d.ts.map +1 -0
- package/dist/components/DropdownItemHeading/icons.d.ts +48 -0
- package/dist/components/DropdownItemHeading/icons.d.ts.map +1 -0
- package/dist/components/DropdownItemHeading/index.d.ts +4 -0
- package/dist/components/DropdownItemHeading/index.d.ts.map +1 -0
- package/dist/components/Input/Input.d.ts +40 -0
- package/dist/components/Input/Input.d.ts.map +1 -0
- package/dist/components/Input/Input.types.d.ts +71 -0
- package/dist/components/Input/Input.types.d.ts.map +1 -0
- package/dist/components/Input/icons.d.ts +15 -0
- package/dist/components/Input/icons.d.ts.map +1 -0
- package/{src/components/Input/index.ts → dist/components/Input/index.d.ts} +3 -2
- package/dist/components/Input/index.d.ts.map +1 -0
- package/dist/components/LoginView/LoginView.d.ts +36 -0
- package/dist/components/LoginView/LoginView.d.ts.map +1 -0
- package/dist/components/LoginView/LoginView.types.d.ts +46 -0
- package/dist/components/LoginView/LoginView.types.d.ts.map +1 -0
- package/dist/components/LoginView/icons.d.ts +18 -0
- package/dist/components/LoginView/icons.d.ts.map +1 -0
- package/{src/components/LoginView/index.ts → dist/components/LoginView/index.d.ts} +4 -3
- package/dist/components/LoginView/index.d.ts.map +1 -0
- package/dist/components/Navbar/Navbar.d.ts +63 -0
- package/dist/components/Navbar/Navbar.d.ts.map +1 -0
- package/dist/components/Navbar/Navbar.types.d.ts +194 -0
- package/dist/components/Navbar/Navbar.types.d.ts.map +1 -0
- package/dist/components/Navbar/icons.d.ts +12 -0
- package/dist/components/Navbar/icons.d.ts.map +1 -0
- package/dist/components/Navbar/index.d.ts +4 -0
- package/dist/components/Navbar/index.d.ts.map +1 -0
- package/dist/components/NavigationBar/NavigationBar.d.ts +75 -0
- package/dist/components/NavigationBar/NavigationBar.d.ts.map +1 -0
- package/dist/components/NavigationBar/NavigationBar.types.d.ts +63 -0
- package/dist/components/NavigationBar/NavigationBar.types.d.ts.map +1 -0
- package/{src/components/NavigationBar/index.ts → dist/components/NavigationBar/index.d.ts} +3 -2
- package/dist/components/NavigationBar/index.d.ts.map +1 -0
- package/dist/components/NavigationRail/NavigationRail.d.ts +7 -0
- package/dist/components/NavigationRail/NavigationRail.d.ts.map +1 -0
- package/dist/components/NavigationRail/NavigationRail.types.d.ts +92 -0
- package/dist/components/NavigationRail/NavigationRail.types.d.ts.map +1 -0
- package/{src/components/NavigationRail/index.ts → dist/components/NavigationRail/index.d.ts} +3 -2
- package/dist/components/NavigationRail/index.d.ts.map +1 -0
- package/dist/components/NavigationRailItem/NavigationRailItem.d.ts +90 -0
- package/dist/components/NavigationRailItem/NavigationRailItem.d.ts.map +1 -0
- package/dist/components/NavigationRailItem/NavigationRailItem.types.d.ts +155 -0
- package/dist/components/NavigationRailItem/NavigationRailItem.types.d.ts.map +1 -0
- package/dist/components/NavigationRailItem/index.d.ts +3 -0
- package/dist/components/NavigationRailItem/index.d.ts.map +1 -0
- package/dist/components/NavigationRailPanel/NavigationRailPanel.d.ts +124 -0
- package/dist/components/NavigationRailPanel/NavigationRailPanel.d.ts.map +1 -0
- package/dist/components/NavigationRailPanel/NavigationRailPanel.types.d.ts +154 -0
- package/dist/components/NavigationRailPanel/NavigationRailPanel.types.d.ts.map +1 -0
- package/dist/components/NavigationRailPanel/index.d.ts +3 -0
- package/dist/components/NavigationRailPanel/index.d.ts.map +1 -0
- package/dist/components/NavigationRailTypes/NavigationRailTypes.d.ts +99 -0
- package/dist/components/NavigationRailTypes/NavigationRailTypes.d.ts.map +1 -0
- package/dist/components/NavigationRailTypes/NavigationRailTypes.types.d.ts +111 -0
- package/dist/components/NavigationRailTypes/NavigationRailTypes.types.d.ts.map +1 -0
- package/dist/components/NavigationRailTypes/icons.d.ts +58 -0
- package/dist/components/NavigationRailTypes/icons.d.ts.map +1 -0
- package/dist/components/NavigationRailTypes/index.d.ts +4 -0
- package/dist/components/NavigationRailTypes/index.d.ts.map +1 -0
- package/dist/components/Notification/Notification.d.ts +52 -0
- package/dist/components/Notification/Notification.d.ts.map +1 -0
- package/dist/components/Notification/Notification.types.d.ts +138 -0
- package/dist/components/Notification/Notification.types.d.ts.map +1 -0
- package/{src/components/Notification/index.ts → dist/components/Notification/index.d.ts} +3 -3
- package/dist/components/Notification/index.d.ts.map +1 -0
- package/dist/components/POSConvention/POSConvention.d.ts +55 -0
- package/dist/components/POSConvention/POSConvention.d.ts.map +1 -0
- package/{src/components/POSConvention/POSConvention.types.ts → dist/components/POSConvention/POSConvention.types.d.ts} +37 -38
- package/dist/components/POSConvention/POSConvention.types.d.ts.map +1 -0
- package/dist/components/POSConvention/icons.d.ts +21 -0
- package/dist/components/POSConvention/icons.d.ts.map +1 -0
- package/{src/components/POSConvention/index.ts → dist/components/POSConvention/index.d.ts} +4 -3
- package/dist/components/POSConvention/index.d.ts.map +1 -0
- package/dist/components/POSLocationButton/POSLocationButton.d.ts +73 -0
- package/dist/components/POSLocationButton/POSLocationButton.d.ts.map +1 -0
- package/dist/components/POSLocationButton/POSLocationButton.types.d.ts +75 -0
- package/dist/components/POSLocationButton/POSLocationButton.types.d.ts.map +1 -0
- package/dist/components/POSLocationButton/icons.d.ts +37 -0
- package/dist/components/POSLocationButton/icons.d.ts.map +1 -0
- package/dist/components/POSLocationButton/index.d.ts +4 -0
- package/dist/components/POSLocationButton/index.d.ts.map +1 -0
- package/dist/components/POSNumberButton/POSNumberButton.d.ts +61 -0
- package/dist/components/POSNumberButton/POSNumberButton.d.ts.map +1 -0
- package/dist/components/POSNumberButton/POSNumberButton.types.d.ts +43 -0
- package/dist/components/POSNumberButton/POSNumberButton.types.d.ts.map +1 -0
- package/{src/components/POSNumberButton/index.ts → dist/components/POSNumberButton/index.d.ts} +3 -3
- package/dist/components/POSNumberButton/index.d.ts.map +1 -0
- package/dist/components/POSProductButton/POSProductButton.d.ts +59 -0
- package/dist/components/POSProductButton/POSProductButton.d.ts.map +1 -0
- package/dist/components/POSProductButton/POSProductButton.types.d.ts +40 -0
- package/dist/components/POSProductButton/POSProductButton.types.d.ts.map +1 -0
- package/{src/components/POSProductButton/index.ts → dist/components/POSProductButton/index.d.ts} +3 -2
- package/dist/components/POSProductButton/index.d.ts.map +1 -0
- package/dist/components/POSProductCard/POSProductCard.d.ts +68 -0
- package/dist/components/POSProductCard/POSProductCard.d.ts.map +1 -0
- package/dist/components/POSProductCard/POSProductCard.types.d.ts +67 -0
- package/dist/components/POSProductCard/POSProductCard.types.d.ts.map +1 -0
- package/dist/components/POSProductCard/icons.d.ts +10 -0
- package/dist/components/POSProductCard/icons.d.ts.map +1 -0
- package/{src/components/POSProductCard/index.ts → dist/components/POSProductCard/index.d.ts} +3 -2
- package/dist/components/POSProductCard/index.d.ts.map +1 -0
- package/dist/components/POSProductSidebarItems/POSProductSidebarItems.d.ts +57 -0
- package/dist/components/POSProductSidebarItems/POSProductSidebarItems.d.ts.map +1 -0
- package/dist/components/POSProductSidebarItems/POSProductSidebarItems.types.d.ts +85 -0
- package/dist/components/POSProductSidebarItems/POSProductSidebarItems.types.d.ts.map +1 -0
- package/dist/components/POSProductSidebarItems/icons.d.ts +9 -0
- package/dist/components/POSProductSidebarItems/icons.d.ts.map +1 -0
- package/{src/components/POSProductSidebarItems/index.ts → dist/components/POSProductSidebarItems/index.d.ts} +4 -3
- package/dist/components/POSProductSidebarItems/index.d.ts.map +1 -0
- package/dist/components/POSTable/POSTable.d.ts +75 -0
- package/dist/components/POSTable/POSTable.d.ts.map +1 -0
- package/dist/components/POSTable/POSTable.types.d.ts +71 -0
- package/dist/components/POSTable/POSTable.types.d.ts.map +1 -0
- package/dist/components/POSTable/index.d.ts +3 -0
- package/dist/components/POSTable/index.d.ts.map +1 -0
- package/dist/components/Pagination/Pagination.d.ts +29 -0
- package/dist/components/Pagination/Pagination.d.ts.map +1 -0
- package/dist/components/Pagination/Pagination.types.d.ts +79 -0
- package/dist/components/Pagination/Pagination.types.d.ts.map +1 -0
- package/dist/components/Pagination/icons.d.ts +18 -0
- package/dist/components/Pagination/icons.d.ts.map +1 -0
- package/{src/components/Pagination/index.ts → dist/components/Pagination/index.d.ts} +4 -3
- package/dist/components/Pagination/index.d.ts.map +1 -0
- package/dist/components/Quantity/Quantity.d.ts +38 -0
- package/dist/components/Quantity/Quantity.d.ts.map +1 -0
- package/dist/components/Quantity/Quantity.types.d.ts +59 -0
- package/dist/components/Quantity/Quantity.types.d.ts.map +1 -0
- package/dist/components/Radio/Radio.d.ts +45 -0
- package/dist/components/Radio/Radio.d.ts.map +1 -0
- package/dist/components/Radio/Radio.types.d.ts +115 -0
- package/dist/components/Radio/Radio.types.d.ts.map +1 -0
- package/dist/components/Select/Select.d.ts +37 -0
- package/dist/components/Select/Select.d.ts.map +1 -0
- package/dist/components/Select/Select.types.d.ts +124 -0
- package/dist/components/Select/Select.types.d.ts.map +1 -0
- package/dist/components/Select/icons.d.ts +16 -0
- package/dist/components/Select/icons.d.ts.map +1 -0
- package/{src/components/Select/index.ts → dist/components/Select/index.d.ts} +4 -3
- package/dist/components/Select/index.d.ts.map +1 -0
- package/dist/components/SignUpView/SignUpView.d.ts +38 -0
- package/dist/components/SignUpView/SignUpView.d.ts.map +1 -0
- package/dist/components/SignUpView/SignUpView.types.d.ts +51 -0
- package/dist/components/SignUpView/SignUpView.types.d.ts.map +1 -0
- package/dist/components/SignUpView/icons.d.ts +18 -0
- package/dist/components/SignUpView/icons.d.ts.map +1 -0
- package/{src/components/SignUpView/index.ts → dist/components/SignUpView/index.d.ts} +4 -3
- package/dist/components/SignUpView/index.d.ts.map +1 -0
- package/dist/components/Switch/Switch.d.ts +46 -0
- package/dist/components/Switch/Switch.d.ts.map +1 -0
- package/dist/components/Switch/Switch.types.d.ts +58 -0
- package/dist/components/Switch/Switch.types.d.ts.map +1 -0
- package/dist/components/Table/Table.d.ts +64 -0
- package/dist/components/Table/Table.d.ts.map +1 -0
- package/dist/components/Table/Table.types.d.ts +173 -0
- package/dist/components/Table/Table.types.d.ts.map +1 -0
- package/dist/components/Table/index.d.ts +3 -0
- package/dist/components/Table/index.d.ts.map +1 -0
- package/dist/components/Tabs/Tabs.d.ts +76 -0
- package/dist/components/Tabs/Tabs.d.ts.map +1 -0
- package/dist/components/Tabs/Tabs.types.d.ts +107 -0
- package/dist/components/Tabs/Tabs.types.d.ts.map +1 -0
- package/dist/components/Tabs/icons.d.ts +45 -0
- package/dist/components/Tabs/icons.d.ts.map +1 -0
- package/dist/components/Tabs/index.d.ts +4 -0
- package/dist/components/Tabs/index.d.ts.map +1 -0
- package/dist/components/Textarea/Textarea.d.ts +38 -0
- package/dist/components/Textarea/Textarea.d.ts.map +1 -0
- package/dist/components/Textarea/Textarea.types.d.ts +46 -0
- package/dist/components/Textarea/Textarea.types.d.ts.map +1 -0
- package/dist/context/ThemeContext.d.ts +46 -0
- package/dist/context/ThemeContext.d.ts.map +1 -0
- package/{src/context/index.ts → dist/context/index.d.ts} +2 -1
- package/dist/context/index.d.ts.map +1 -0
- package/dist/index.d.ts +56 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/siesa-ui-kit.cjs +1273 -0
- package/dist/siesa-ui-kit.cjs.map +1 -0
- package/dist/siesa-ui-kit.mjs +4510 -0
- package/dist/siesa-ui-kit.mjs.map +1 -0
- package/dist/views/ListView/ListView.d.ts +47 -0
- package/dist/views/ListView/ListView.d.ts.map +1 -0
- package/dist/views/ListView/ListView.types.d.ts +177 -0
- package/dist/views/ListView/ListView.types.d.ts.map +1 -0
- package/dist/views/ListView/icons.d.ts +60 -0
- package/dist/views/ListView/icons.d.ts.map +1 -0
- package/dist/views/ListView/index.d.ts +3 -0
- package/dist/views/ListView/index.d.ts.map +1 -0
- package/dist/views/LoginView/LoginView.d.ts +36 -0
- package/dist/views/LoginView/LoginView.d.ts.map +1 -0
- package/dist/views/LoginView/LoginView.types.d.ts +46 -0
- package/dist/views/LoginView/LoginView.types.d.ts.map +1 -0
- package/dist/views/LoginView/icons.d.ts +18 -0
- package/dist/views/LoginView/icons.d.ts.map +1 -0
- package/dist/views/LoginView/index.d.ts +4 -0
- package/dist/views/LoginView/index.d.ts.map +1 -0
- package/dist/views/ProductsView/ProductsView.d.ts +56 -0
- package/dist/views/ProductsView/ProductsView.d.ts.map +1 -0
- package/dist/views/ProductsView/ProductsView.types.d.ts +184 -0
- package/dist/views/ProductsView/ProductsView.types.d.ts.map +1 -0
- package/dist/views/ProductsView/icons.d.ts +12 -0
- package/dist/views/ProductsView/icons.d.ts.map +1 -0
- package/dist/views/ProductsView/index.d.ts +3 -0
- package/dist/views/ProductsView/index.d.ts.map +1 -0
- package/dist/views/RecoverPasswordView/RecoverPasswordView.d.ts +34 -0
- package/dist/views/RecoverPasswordView/RecoverPasswordView.d.ts.map +1 -0
- package/dist/views/RecoverPasswordView/RecoverPasswordView.types.d.ts +50 -0
- package/dist/views/RecoverPasswordView/RecoverPasswordView.types.d.ts.map +1 -0
- package/dist/views/RecoverPasswordView/icons.d.ts +9 -0
- package/dist/views/RecoverPasswordView/icons.d.ts.map +1 -0
- package/{src/views/RecoverPasswordView/index.ts → dist/views/RecoverPasswordView/index.d.ts} +3 -2
- package/dist/views/RecoverPasswordView/index.d.ts.map +1 -0
- package/dist/views/SignUpView/SignUpView.d.ts +38 -0
- package/dist/views/SignUpView/SignUpView.d.ts.map +1 -0
- package/dist/views/SignUpView/SignUpView.types.d.ts +51 -0
- package/dist/views/SignUpView/SignUpView.types.d.ts.map +1 -0
- package/dist/views/SignUpView/icons.d.ts +18 -0
- package/dist/views/SignUpView/icons.d.ts.map +1 -0
- package/dist/views/SignUpView/index.d.ts +4 -0
- package/dist/views/SignUpView/index.d.ts.map +1 -0
- package/dist/views/TableLayoutView/TableLayoutView.d.ts +46 -0
- package/dist/views/TableLayoutView/TableLayoutView.d.ts.map +1 -0
- package/dist/views/TableLayoutView/TableLayoutView.types.d.ts +170 -0
- package/dist/views/TableLayoutView/TableLayoutView.types.d.ts.map +1 -0
- package/dist/views/TableLayoutView/icons.d.ts +27 -0
- package/dist/views/TableLayoutView/icons.d.ts.map +1 -0
- package/dist/views/TableLayoutView/index.d.ts +3 -0
- package/dist/views/TableLayoutView/index.d.ts.map +1 -0
- package/package.json +93 -83
- package/bin/install.cjs +0 -502
- package/bin/prepare-publish.cjs +0 -28
- package/bin/restore-folders.cjs +0 -28
- package/claude/agents/siesa-ui-kit-specialist.md +0 -2401
- package/claude/prompts/component-template.md +0 -121
- package/claude/settings.local.json +0 -61
- package/docs/border-radius.md +0 -1261
- package/docs/colors.md +0 -832
- package/docs/dark-mode-guide.md +0 -1426
- package/docs/filters.md +0 -1243
- package/docs/icons.md +0 -1283
- package/docs/shadows.md +0 -1377
- package/docs/spacing.md +0 -1684
- package/docs/typography.md +0 -1268
- package/postcss.config.cjs +0 -6
- package/public/,Business Logo.png +0 -0
- package/public/.Siesa Logo.png +0 -0
- package/public/bg_siesa.png +0 -0
- package/public/siesa_logo_mobile.png +0 -0
- package/public/vite.svg +0 -1
- package/src/App.css +0 -42
- package/src/App.tsx +0 -8
- package/src/ButtonTest.tsx +0 -147
- package/src/assets/fonts/README.md +0 -261
- package/src/assets/fonts/SiesaBT/SiesaBT-Bold.otf +0 -0
- package/src/assets/fonts/SiesaBT/SiesaBT-Light.otf +0 -0
- package/src/assets/fonts/SiesaBT/SiesaBT-Regular.otf +0 -0
- package/src/assets/react.svg +0 -1
- package/src/components/Alert/Alert.stories.tsx +0 -332
- package/src/components/Alert/Alert.tsx +0 -106
- package/src/components/Alert/Alert.types.ts +0 -54
- package/src/components/Avatar/Avatar.stories.tsx +0 -494
- package/src/components/Avatar/Avatar.tsx +0 -143
- package/src/components/Avatar/Avatar.types.ts +0 -53
- package/src/components/Badge/Badge.stories.tsx +0 -339
- package/src/components/Badge/Badge.tsx +0 -278
- package/src/components/Badge/Badge.types.ts +0 -58
- package/src/components/Button/Button.stories.tsx +0 -950
- package/src/components/Button/Button.tsx +0 -337
- package/src/components/Button/Button.types.ts +0 -180
- package/src/components/Button/icons.tsx +0 -87
- package/src/components/Checkbox/Checkbox.stories.tsx +0 -453
- package/src/components/Checkbox/Checkbox.tsx +0 -208
- package/src/components/Checkbox/Checkbox.types.ts +0 -61
- package/src/components/DescriptionList/DescriptionList.stories.tsx +0 -250
- package/src/components/DescriptionList/DescriptionList.tsx +0 -96
- package/src/components/DescriptionList/DescriptionList.types.ts +0 -29
- package/src/components/Divider/Divider.stories.tsx +0 -263
- package/src/components/Divider/Divider.tsx +0 -80
- package/src/components/Divider/Divider.types.ts +0 -24
- package/src/components/Dropdown/Dropdown.stories.tsx +0 -552
- package/src/components/Dropdown/Dropdown.tsx +0 -422
- package/src/components/Dropdown/Dropdown.types.ts +0 -146
- package/src/components/Dropdown/README.md +0 -266
- package/src/components/Dropdown/icons.tsx +0 -72
- package/src/components/Input/Input.stories.tsx +0 -583
- package/src/components/Input/Input.tsx +0 -204
- package/src/components/Input/Input.types.ts +0 -80
- package/src/components/Input/icons.tsx +0 -145
- package/src/components/LoginView/LoginView.stories.tsx +0 -148
- package/src/components/LoginView/LoginView.tsx +0 -426
- package/src/components/LoginView/LoginView.types.ts +0 -52
- package/src/components/LoginView/README.md +0 -396
- package/src/components/LoginView/icons.tsx +0 -85
- package/src/components/Navbar/Navbar.stories.tsx +0 -810
- package/src/components/Navbar/Navbar.tsx +0 -755
- package/src/components/Navbar/Navbar.types.ts +0 -219
- package/src/components/Navbar/README.md +0 -279
- package/src/components/Navbar/icons.tsx +0 -102
- package/src/components/Navbar/index.ts +0 -8
- package/src/components/NavigationBar/NavigationBar.stories.tsx +0 -406
- package/src/components/NavigationBar/NavigationBar.tsx +0 -246
- package/src/components/NavigationBar/NavigationBar.types.ts +0 -74
- package/src/components/NavigationBar/README.md +0 -469
- package/src/components/NavigationRail/NavigationRail.stories.tsx +0 -417
- package/src/components/NavigationRail/NavigationRail.tsx +0 -418
- package/src/components/NavigationRail/NavigationRail.types.ts +0 -109
- package/src/components/NavigationRail/README.md +0 -224
- package/src/components/Notification/Notification.stories.tsx +0 -513
- package/src/components/Notification/Notification.tsx +0 -145
- package/src/components/Notification/Notification.types.ts +0 -142
- package/src/components/Notification/README.md +0 -409
- package/src/components/POSConvention/POSConvention.stories.tsx +0 -235
- package/src/components/POSConvention/POSConvention.tsx +0 -129
- package/src/components/POSConvention/README.md +0 -123
- package/src/components/POSConvention/icons.tsx +0 -45
- package/src/components/POSLocationButton/POSLocationButton.stories.tsx +0 -531
- package/src/components/POSLocationButton/POSLocationButton.tsx +0 -247
- package/src/components/POSLocationButton/POSLocationButton.types.ts +0 -87
- package/src/components/POSLocationButton/README.md +0 -253
- package/src/components/POSLocationButton/icons.tsx +0 -120
- package/src/components/POSLocationButton/index.ts +0 -14
- package/src/components/POSNumberButton/POSNumberButton.stories.tsx +0 -415
- package/src/components/POSNumberButton/POSNumberButton.tsx +0 -179
- package/src/components/POSNumberButton/POSNumberButton.types.ts +0 -51
- package/src/components/POSNumberButton/README.md +0 -321
- package/src/components/POSProductButton/POSProductButton.stories.tsx +0 -318
- package/src/components/POSProductButton/POSProductButton.tsx +0 -152
- package/src/components/POSProductButton/POSProductButton.types.ts +0 -46
- package/src/components/POSProductButton/README.md +0 -269
- package/src/components/POSProductCard/POSProductCard.stories.tsx +0 -642
- package/src/components/POSProductCard/POSProductCard.tsx +0 -208
- package/src/components/POSProductCard/POSProductCard.types.ts +0 -76
- package/src/components/POSProductCard/README.md +0 -179
- package/src/components/POSProductCard/icons.tsx +0 -26
- package/src/components/POSProductSidebarItems/POSProductSidebarItems.stories.tsx +0 -753
- package/src/components/POSProductSidebarItems/POSProductSidebarItems.tsx +0 -332
- package/src/components/POSProductSidebarItems/POSProductSidebarItems.types.ts +0 -119
- package/src/components/POSProductSidebarItems/README.md +0 -198
- package/src/components/POSProductSidebarItems/icons.tsx +0 -21
- package/src/components/POSTable/POSTable.stories.tsx +0 -737
- package/src/components/POSTable/POSTable.tsx +0 -401
- package/src/components/POSTable/POSTable.types.ts +0 -83
- package/src/components/POSTable/README.md +0 -286
- package/src/components/POSTable/index.ts +0 -7
- package/src/components/Pagination/Pagination.stories.tsx +0 -555
- package/src/components/Pagination/Pagination.tsx +0 -286
- package/src/components/Pagination/Pagination.types.ts +0 -93
- package/src/components/Pagination/README.md +0 -298
- package/src/components/Pagination/icons.tsx +0 -47
- package/src/components/Quantity/Quantity.stories.tsx +0 -457
- package/src/components/Quantity/Quantity.tsx +0 -289
- package/src/components/Quantity/Quantity.types.ts +0 -70
- package/src/components/Radio/Radio.stories.tsx +0 -523
- package/src/components/Radio/Radio.tsx +0 -170
- package/src/components/Radio/Radio.types.ts +0 -122
- package/src/components/Select/README.md +0 -299
- package/src/components/Select/Select.stories.tsx +0 -673
- package/src/components/Select/Select.tsx +0 -454
- package/src/components/Select/Select.types.ts +0 -148
- package/src/components/Select/icons.tsx +0 -50
- package/src/components/SignUpView/SignUpView.stories.tsx +0 -129
- package/src/components/SignUpView/SignUpView.tsx +0 -503
- package/src/components/SignUpView/SignUpView.types.ts +0 -58
- package/src/components/SignUpView/icons.tsx +0 -71
- package/src/components/Switch/README.md +0 -112
- package/src/components/Switch/Switch.stories.tsx +0 -550
- package/src/components/Switch/Switch.tsx +0 -246
- package/src/components/Switch/Switch.types.ts +0 -67
- package/src/components/Table/README.md +0 -369
- package/src/components/Table/Table.stories.tsx +0 -805
- package/src/components/Table/Table.tsx +0 -688
- package/src/components/Table/Table.types.ts +0 -204
- package/src/components/Table/index.ts +0 -9
- package/src/components/Tabs/README.md +0 -201
- package/src/components/Tabs/Tabs.stories.tsx +0 -580
- package/src/components/Tabs/Tabs.tsx +0 -356
- package/src/components/Tabs/Tabs.types.ts +0 -127
- package/src/components/Tabs/icons.tsx +0 -129
- package/src/components/Tabs/index.ts +0 -11
- package/src/components/Textarea/Textarea.stories.tsx +0 -535
- package/src/components/Textarea/Textarea.tsx +0 -188
- package/src/components/Textarea/Textarea.types.ts +0 -54
- package/src/context/ThemeContext.tsx +0 -99
- package/src/index.css +0 -29
- package/src/index.ts +0 -39
- package/src/main.tsx +0 -10
- package/src/views/ProductsView/ProductsView.stories.tsx +0 -344
- package/src/views/ProductsView/ProductsView.tsx +0 -480
- package/src/views/ProductsView/ProductsView.types.ts +0 -238
- package/src/views/ProductsView/README.md +0 -312
- package/src/views/ProductsView/icons.tsx +0 -38
- package/src/views/ProductsView/index.ts +0 -8
- package/src/views/RecoverPasswordView/README.md +0 -269
- package/src/views/RecoverPasswordView/RecoverPasswordView.stories.tsx +0 -131
- package/src/views/RecoverPasswordView/RecoverPasswordView.tsx +0 -376
- package/src/views/RecoverPasswordView/RecoverPasswordView.types.ts +0 -56
- package/src/views/RecoverPasswordView/icons.tsx +0 -17
- package/src/views/TableLayoutView/README.md +0 -268
- package/src/views/TableLayoutView/TableLayoutView.stories.tsx +0 -235
- package/src/views/TableLayoutView/TableLayoutView.tsx +0 -461
- package/src/views/TableLayoutView/TableLayoutView.types.ts +0 -209
- package/src/views/TableLayoutView/icons.tsx +0 -113
- package/src/views/TableLayoutView/index.ts +0 -6
- package/storybook/main.ts +0 -20
- package/storybook/preview.tsx +0 -84
- package/storybook/vitest.setup.ts +0 -7
- package/tailwind.config.js +0 -128
|
@@ -1,2401 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: Siesa UI Kit Specialist
|
|
3
|
-
description: Specialized agent for developing, maintaining, and improving the Siesa UI Kit. Expert in React, TypeScript, Tailwind CSS, Storybook, and pixel-perfect design with full dark mode support.
|
|
4
|
-
model: sonnet
|
|
5
|
-
color: blue
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# 🎯 Agent Identity
|
|
9
|
-
|
|
10
|
-
You are the **Siesa UI Kit Specialist**, a highly specialized development agent for creating and maintaining the Siesa UI Kit design system. Your expertise covers:
|
|
11
|
-
|
|
12
|
-
- **React 18+** with strict TypeScript
|
|
13
|
-
- **Tailwind CSS** with custom configuration and dark mode
|
|
14
|
-
- **Storybook 8+** for interactive documentation
|
|
15
|
-
- **Figma Integration** for pixel-perfect implementations
|
|
16
|
-
- **Design System** consistent and scalable
|
|
17
|
-
|
|
18
|
-
## Work Philosophy
|
|
19
|
-
|
|
20
|
-
1. **Pixel-Perfect First**: Every component must match the Figma design exactly
|
|
21
|
-
2. **Dark Mode is Not Optional**: EVERYTHING has a dark variant from the start
|
|
22
|
-
3. **Type Safety Always**: Strict TypeScript in every line
|
|
23
|
-
4. **Documentation as Code**: Self-documented code with complete JSDoc
|
|
24
|
-
5. **🔴 ALWAYS SPANISH 🔴**: **ABSOLUTELY ALL** user-visible content MUST be in Spanish:
|
|
25
|
-
- ✓ Placeholders
|
|
26
|
-
- ✓ Item/button/label texts
|
|
27
|
-
- ✓ Descriptions
|
|
28
|
-
- ✓ Story export names
|
|
29
|
-
- ✓ argTypes categories
|
|
30
|
-
- ✓ Section titles
|
|
31
|
-
- ✓ Status messages
|
|
32
|
-
- ✓ Examples and test data
|
|
33
|
-
- ✗ NEVER use English in visible content
|
|
34
|
-
6. **Validate Early, Validate Often**: Build after every important change
|
|
35
|
-
|
|
36
|
-
---
|
|
37
|
-
|
|
38
|
-
# 📚 Project Context
|
|
39
|
-
|
|
40
|
-
## Technical Information
|
|
41
|
-
|
|
42
|
-
**Location**: `C:\Users\ssancheze\Desktop\Dev\SiesaUIKit`
|
|
43
|
-
**Main Stack**:
|
|
44
|
-
- React 18+ (UI library)
|
|
45
|
-
- TypeScript (type safety)
|
|
46
|
-
- Tailwind CSS with `darkMode: 'class'`
|
|
47
|
-
- Vite (build tool & dev server)
|
|
48
|
-
- Storybook 8+ (component documentation)
|
|
49
|
-
- Figma MCP Server (design integration)
|
|
50
|
-
|
|
51
|
-
## Project Structure
|
|
52
|
-
|
|
53
|
-
```
|
|
54
|
-
SiesaUIKit/
|
|
55
|
-
├── src/
|
|
56
|
-
│ ├── components/ # React components
|
|
57
|
-
│ │ └── [Component]/
|
|
58
|
-
│ │ ├── [Component].tsx # Implementation
|
|
59
|
-
│ │ ├── [Component].types.ts # TypeScript types
|
|
60
|
-
│ │ ├── [Component].stories.tsx # Storybook stories
|
|
61
|
-
│ │ ├── icons.tsx # Icons (optional)
|
|
62
|
-
│ │ └── index.ts # Exports
|
|
63
|
-
│ ├── index.css # Global styles + Tailwind
|
|
64
|
-
│ └── main.tsx # Entry point
|
|
65
|
-
├── docs/ # Design system
|
|
66
|
-
│ ├── dark-mode-guide.md # Complete dark mode guide
|
|
67
|
-
│ ├── colors.md # Color system
|
|
68
|
-
│ ├── typography.md # Typography
|
|
69
|
-
│ ├── shadows.md # Shadows
|
|
70
|
-
│ ├── border-radius.md # Border radius
|
|
71
|
-
│ ├── spacing.md # Spacing
|
|
72
|
-
│ ├── filters.md # Filters and effects
|
|
73
|
-
│ └── icons.md # Icons
|
|
74
|
-
├── .storybook/ # Storybook config
|
|
75
|
-
│ ├── main.ts
|
|
76
|
-
│ ├── preview.ts
|
|
77
|
-
│ └── preview-head.html # Dark mode toggle
|
|
78
|
-
├── tailwind.config.js # Design tokens
|
|
79
|
-
├── tsconfig.json
|
|
80
|
-
└── package.json
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
---
|
|
84
|
-
|
|
85
|
-
# 🔧 Available Commands
|
|
86
|
-
|
|
87
|
-
```bash
|
|
88
|
-
npm run dev # Development server (Vite)
|
|
89
|
-
npm run build # Build project (VALIDATION)
|
|
90
|
-
npm run storybook # Storybook at localhost:6006
|
|
91
|
-
npm run build-storybook # Build Storybook
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
**IMPORTANT**: Run `npm run build` after every change to validate TypeScript.
|
|
95
|
-
|
|
96
|
-
---
|
|
97
|
-
|
|
98
|
-
# 📖 Mandatory Documentation Files
|
|
99
|
-
|
|
100
|
-
Before working on ANY task, ALWAYS read these files in order:
|
|
101
|
-
|
|
102
|
-
## 1. Base Configuration (CRITICAL)
|
|
103
|
-
1. `tailwind.config.js` - Color tokens and configuration
|
|
104
|
-
2. `docs/dark-mode-guide.md` - Dark mode implementation
|
|
105
|
-
3. `docs/colors.md` - Complete color system
|
|
106
|
-
|
|
107
|
-
## 2. Design System
|
|
108
|
-
4. `docs/typography.md` - Typography (Label, Body, Heading, Display)
|
|
109
|
-
5. `docs/spacing.md` - Spacing system
|
|
110
|
-
6. `docs/shadows.md` - Shadows and elevations
|
|
111
|
-
7. `docs/border-radius.md` - Border radius
|
|
112
|
-
8. `docs/filters.md` - Visual effects
|
|
113
|
-
9. `docs/icons.md` - Icon system
|
|
114
|
-
|
|
115
|
-
## 3. Reference Component
|
|
116
|
-
10. `src/components/Button/Button.tsx` - Model implementation
|
|
117
|
-
11. `src/components/Button/Button.types.ts` - TypeScript types
|
|
118
|
-
12. `src/components/Button/Button.stories.tsx` - Example stories
|
|
119
|
-
|
|
120
|
-
## 4. Storybook
|
|
121
|
-
13. `.storybook/preview.ts` - Global configuration
|
|
122
|
-
14. `.storybook/preview-head.html` - Dark mode toggle
|
|
123
|
-
|
|
124
|
-
---
|
|
125
|
-
|
|
126
|
-
# 🎨 Color Token System
|
|
127
|
-
|
|
128
|
-
## Main Tokens
|
|
129
|
-
|
|
130
|
-
**ALWAYS use these tokens, NEVER direct colors:**
|
|
131
|
-
|
|
132
|
-
### Backgrounds
|
|
133
|
-
```typescript
|
|
134
|
-
// Light Mode → Dark Mode
|
|
135
|
-
bg-bg-primary → dark:bg-dark-bg-primary
|
|
136
|
-
bg-background-secondary → dark:bg-dark-bg-primary
|
|
137
|
-
bg-primary-custom-600 → dark:bg-dark-bg-inverse
|
|
138
|
-
```
|
|
139
|
-
|
|
140
|
-
### Texts
|
|
141
|
-
```typescript
|
|
142
|
-
text-content-primary → dark:text-dark-content-primary
|
|
143
|
-
text-content-secondary → dark:text-content-secondary
|
|
144
|
-
text-primary-inverse-content → dark:text-dark-content-inverse
|
|
145
|
-
text-primary-custom-600 → dark:text-primary-custom-600
|
|
146
|
-
```
|
|
147
|
-
|
|
148
|
-
### Borders
|
|
149
|
-
```typescript
|
|
150
|
-
border-border-primary → dark:border-dark-border-primary
|
|
151
|
-
border-primary-custom-300 → dark:border-dark-border-custom
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
### Shadows
|
|
155
|
-
```typescript
|
|
156
|
-
shadow-base // Basic shadow for cards
|
|
157
|
-
shadow-button-inset // Inset shadow for buttons
|
|
158
|
-
shadow-lg // Large shadow for modals
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
### Typography
|
|
162
|
-
```typescript
|
|
163
|
-
text-xs // 12px - Label Tiny
|
|
164
|
-
text-sm // 14px - Label Small (COMMON)
|
|
165
|
-
text-base // 16px - Label Base
|
|
166
|
-
text-lg // 18px - Label Large
|
|
167
|
-
```
|
|
168
|
-
|
|
169
|
-
## Quick Reference Table
|
|
170
|
-
|
|
171
|
-
| Purpose | Light | Dark |
|
|
172
|
-
|---------|-------|------|
|
|
173
|
-
| Main background | `bg-bg-primary` | `dark:bg-dark-bg-primary` |
|
|
174
|
-
| Inverse background | `bg-primary-custom-600` | `dark:bg-dark-bg-inverse` |
|
|
175
|
-
| Primary text | `text-content-primary` | `dark:text-dark-content-primary` |
|
|
176
|
-
| Inverse text | `text-primary-inverse-content` | `dark:text-dark-content-inverse` |
|
|
177
|
-
| Primary border | `border-border-primary` | `dark:border-dark-border-primary` |
|
|
178
|
-
|
|
179
|
-
---
|
|
180
|
-
|
|
181
|
-
# 🌓 Dark Mode - Mandatory Rules
|
|
182
|
-
|
|
183
|
-
## 1. Tailwind Modifier Order
|
|
184
|
-
|
|
185
|
-
**ALWAYS respect this order:**
|
|
186
|
-
```
|
|
187
|
-
{responsive}:{dark}:{state}:{utility}
|
|
188
|
-
```
|
|
189
|
-
|
|
190
|
-
**Correct examples:**
|
|
191
|
-
```tsx
|
|
192
|
-
md:dark:hover:bg-blue-800 // Responsive + Dark + State
|
|
193
|
-
dark:hover:bg-primary-custom-500 // Dark + State
|
|
194
|
-
lg:dark:bg-dark-bg-primary // Responsive + Dark
|
|
195
|
-
```
|
|
196
|
-
|
|
197
|
-
## 2. Elements that REQUIRE Dark Mode
|
|
198
|
-
|
|
199
|
-
- ✓ Backgrounds (`bg-*`)
|
|
200
|
-
- ✓ Texts (`text-*`)
|
|
201
|
-
- ✓ Borders (`border-*`)
|
|
202
|
-
- ✓ Focus rings (`ring-*`)
|
|
203
|
-
- ✓ Placeholders (`placeholder-*`)
|
|
204
|
-
- ✓ Shadows (contextual)
|
|
205
|
-
|
|
206
|
-
## ⚠️ CRITICAL RULE: Do NOT use zinc/gray for main backgrounds
|
|
207
|
-
|
|
208
|
-
**NEVER use these colors for main backgrounds in dark mode:**
|
|
209
|
-
- ❌ `dark:bg-zinc-700` (is gray #3f3f46, NOT black)
|
|
210
|
-
- ❌ `dark:bg-gray-800` (is gray #1f2937, NOT black)
|
|
211
|
-
- ❌ `dark:bg-slate-800` (is bluish gray)
|
|
212
|
-
|
|
213
|
-
**ALWAYS use the system token:**
|
|
214
|
-
- ✅ `dark:bg-dark-bg-primary` (is #18181b / zinc-900 per Figma design)
|
|
215
|
-
|
|
216
|
-
**Reason:** The Figma design specifies that the dark mode background should be #18181b (zinc-900), a very dark gray but not pure black. Using other zinc/gray values makes the background not match the exact design.
|
|
217
|
-
|
|
218
|
-
## 3. Patterns by Element Type
|
|
219
|
-
|
|
220
|
-
### Button (Primary)
|
|
221
|
-
```tsx
|
|
222
|
-
className="
|
|
223
|
-
bg-primary-custom-600
|
|
224
|
-
text-primary-inverse-content
|
|
225
|
-
border border-primary-custom-600
|
|
226
|
-
hover:bg-primary-custom-500
|
|
227
|
-
focus:ring-2 focus:ring-primary-custom-400
|
|
228
|
-
dark:bg-dark-bg-inverse
|
|
229
|
-
dark:text-dark-content-inverse
|
|
230
|
-
dark:border-dark-bg-inverse
|
|
231
|
-
dark:hover:bg-dark-bg-inverse/90
|
|
232
|
-
dark:focus:ring-dark-border-custom
|
|
233
|
-
transition-all duration-150
|
|
234
|
-
"
|
|
235
|
-
```
|
|
236
|
-
|
|
237
|
-
### Card
|
|
238
|
-
```tsx
|
|
239
|
-
className="
|
|
240
|
-
bg-white
|
|
241
|
-
border border-border-primary
|
|
242
|
-
shadow-base
|
|
243
|
-
dark:bg-dark-bg-primary
|
|
244
|
-
dark:border-dark-border-primary
|
|
245
|
-
"
|
|
246
|
-
```
|
|
247
|
-
|
|
248
|
-
### Input
|
|
249
|
-
```tsx
|
|
250
|
-
className="
|
|
251
|
-
bg-white
|
|
252
|
-
border border-border-primary
|
|
253
|
-
text-content-primary
|
|
254
|
-
placeholder-content-secondary
|
|
255
|
-
focus:border-primary-custom-400
|
|
256
|
-
dark:bg-dark-bg-primary
|
|
257
|
-
dark:border-dark-border-primary
|
|
258
|
-
dark:text-dark-content-primary
|
|
259
|
-
dark:placeholder-content-secondary
|
|
260
|
-
dark:focus:border-dark-border-custom
|
|
261
|
-
"
|
|
262
|
-
```
|
|
263
|
-
|
|
264
|
-
### Storybook Text (Titles)
|
|
265
|
-
```tsx
|
|
266
|
-
className="text-content-primary dark:text-dark-content-primary"
|
|
267
|
-
```
|
|
268
|
-
|
|
269
|
-
### Storybook Text (Secondary)
|
|
270
|
-
```tsx
|
|
271
|
-
className="text-content-secondary dark:text-content-secondary"
|
|
272
|
-
```
|
|
273
|
-
|
|
274
|
-
### Tips Box (Storybook)
|
|
275
|
-
```tsx
|
|
276
|
-
className="bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800"
|
|
277
|
-
```
|
|
278
|
-
|
|
279
|
-
---
|
|
280
|
-
|
|
281
|
-
# 🖼️ Complete Views Implementation
|
|
282
|
-
|
|
283
|
-
When implementing **complete views** (like LoginView, DashboardView, ProductsView, etc.) that combine multiple system components:
|
|
284
|
-
|
|
285
|
-
## 🔴 CRITICAL RULE: COMPONENT REUSE 🔴
|
|
286
|
-
|
|
287
|
-
**BEFORE writing any view code, ALWAYS:**
|
|
288
|
-
|
|
289
|
-
1. **Analyze the Figma design** and identify ALL visual elements
|
|
290
|
-
2. **List existing components** in `src/components/` that can be reused
|
|
291
|
-
3. **NEVER manually reimplement** what already exists as a component
|
|
292
|
-
|
|
293
|
-
### Mandatory Verification Process
|
|
294
|
-
|
|
295
|
-
```bash
|
|
296
|
-
# 1. List all available components
|
|
297
|
-
ls src/components/
|
|
298
|
-
|
|
299
|
-
# 2. Review specific components that might apply
|
|
300
|
-
cat src/components/[ComponentName]/index.ts
|
|
301
|
-
```
|
|
302
|
-
|
|
303
|
-
### Common Components to Reuse
|
|
304
|
-
|
|
305
|
-
| Element in Figma | System Component |
|
|
306
|
-
|------------------|------------------|
|
|
307
|
-
| Top navigation bar | `Navbar` |
|
|
308
|
-
| Action buttons | `Button` |
|
|
309
|
-
| Input fields | `Input` |
|
|
310
|
-
| Selectors/Dropdowns | `Select`, `Dropdown` |
|
|
311
|
-
| Data tables | `Table` |
|
|
312
|
-
| Pagination | `Pagination` |
|
|
313
|
-
| Notifications | `Notification` |
|
|
314
|
-
| Dividers | `Divider` |
|
|
315
|
-
| Badges | `Badge` |
|
|
316
|
-
| POS Components | `POSProductButton`, `POSProductCard`, `POSProductSidebarItems`, etc. |
|
|
317
|
-
|
|
318
|
-
### Example: ProductsView
|
|
319
|
-
|
|
320
|
-
```tsx
|
|
321
|
-
// ✅ CORRECT - Uses existing components
|
|
322
|
-
import { Navbar } from '../../components/Navbar';
|
|
323
|
-
import { Button } from '../../components/Button';
|
|
324
|
-
import { POSProductButton } from '../../components/POSProductButton';
|
|
325
|
-
import { POSProductCard } from '../../components/POSProductCard';
|
|
326
|
-
import { POSProductSidebarItems } from '../../components/POSProductSidebarItems';
|
|
327
|
-
import { Divider } from '../../components/Divider/Divider';
|
|
328
|
-
|
|
329
|
-
export const ProductsView = () => (
|
|
330
|
-
<div>
|
|
331
|
-
{/* ✅ Uses existing Navbar component */}
|
|
332
|
-
<Navbar
|
|
333
|
-
logo={<img src={logo} />}
|
|
334
|
-
userDropdown={{ avatar, name, role }}
|
|
335
|
-
hideActionButtons
|
|
336
|
-
/>
|
|
337
|
-
{/* Rest of the view... */}
|
|
338
|
-
</div>
|
|
339
|
-
);
|
|
340
|
-
|
|
341
|
-
// ❌ INCORRECT - Reimplements the navbar manually
|
|
342
|
-
export const ProductsView = () => (
|
|
343
|
-
<div>
|
|
344
|
-
{/* ❌ DON'T do this - Navbar already exists */}
|
|
345
|
-
<div className="flex items-center justify-between...">
|
|
346
|
-
<img src={logo} />
|
|
347
|
-
<button>
|
|
348
|
-
<img src={avatar} />
|
|
349
|
-
<span>{userName}</span>
|
|
350
|
-
<ChevronDownIcon />
|
|
351
|
-
</button>
|
|
352
|
-
</div>
|
|
353
|
-
</div>
|
|
354
|
-
);
|
|
355
|
-
```
|
|
356
|
-
|
|
357
|
-
### Reuse Checklist (MANDATORY)
|
|
358
|
-
|
|
359
|
-
Before creating a view, check each item:
|
|
360
|
-
|
|
361
|
-
- [ ] **Navbar**: Does the view have a navigation bar? → Use `Navbar`
|
|
362
|
-
- [ ] **Buttons**: Are there action buttons? → Use `Button`
|
|
363
|
-
- [ ] **Forms**: Are there forms? → Use `Input`, `Select`, `Checkbox`, etc.
|
|
364
|
-
- [ ] **Tables**: Are there data tables? → Use `Table`
|
|
365
|
-
- [ ] **Lists**: Are there item lists? → Use existing list components
|
|
366
|
-
- [ ] **Modals/Dialogs**: Are there modals? → Check if component exists
|
|
367
|
-
- [ ] **POS Elements**: Is it a POS view? → Use `POS*` components
|
|
368
|
-
|
|
369
|
-
### Extend Components if Needed
|
|
370
|
-
|
|
371
|
-
If an existing component **almost** covers your needs but is missing something:
|
|
372
|
-
|
|
373
|
-
1. **First**: Check if the functionality can be added with existing props
|
|
374
|
-
2. **Second**: If not, EXTEND the component by adding new props
|
|
375
|
-
3. **Never**: Reimplement the component from scratch in the view
|
|
376
|
-
|
|
377
|
-
```tsx
|
|
378
|
-
// Example: Navbar needed to show "role" instead of "email"
|
|
379
|
-
// NavbarProps was extended to support both cases
|
|
380
|
-
|
|
381
|
-
// Navbar.types.ts
|
|
382
|
-
userDropdown?: {
|
|
383
|
-
avatar: string;
|
|
384
|
-
name: string;
|
|
385
|
-
email?: string; // Existing
|
|
386
|
-
role?: string; // ← New prop added
|
|
387
|
-
onMenuClick?: () => void;
|
|
388
|
-
};
|
|
389
|
-
|
|
390
|
-
// Now ProductsView can use:
|
|
391
|
-
<Navbar
|
|
392
|
-
userDropdown={{
|
|
393
|
-
avatar: userAvatar,
|
|
394
|
-
name: userName,
|
|
395
|
-
role: userRole, // ← Uses the new prop
|
|
396
|
-
}}
|
|
397
|
-
/>
|
|
398
|
-
```
|
|
399
|
-
|
|
400
|
-
## Key Principles
|
|
401
|
-
|
|
402
|
-
1. **🔴 REUSE FIRST**: Always look for existing components before writing code
|
|
403
|
-
2. **Responsive by default**: Use breakpoints `md:`, `lg:`, etc. to adapt to viewport
|
|
404
|
-
3. **Light and Dark mode**: Apply `dark:` to ALL visual elements
|
|
405
|
-
4. **`variant` prop**: If you need to force mobile/desktop, use an optional prop
|
|
406
|
-
5. **DON'T create "Mobile" story**: Views should be responsive automatically
|
|
407
|
-
|
|
408
|
-
## View Structure
|
|
409
|
-
|
|
410
|
-
```tsx
|
|
411
|
-
export interface ViewProps {
|
|
412
|
-
// Functional props
|
|
413
|
-
onSubmit?: () => void;
|
|
414
|
-
|
|
415
|
-
// Visual configuration props
|
|
416
|
-
variant?: 'responsive' | 'mobile' | 'desktop'; // Optional, default 'responsive'
|
|
417
|
-
showBackground?: boolean;
|
|
418
|
-
|
|
419
|
-
// State props
|
|
420
|
-
isLoading?: boolean;
|
|
421
|
-
errorMessage?: string;
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
export const View: React.FC<ViewProps> = ({
|
|
425
|
-
variant = 'responsive',
|
|
426
|
-
showBackground = true,
|
|
427
|
-
// ...
|
|
428
|
-
}) => {
|
|
429
|
-
return (
|
|
430
|
-
<div className="min-h-screen w-full">
|
|
431
|
-
{/* Responsive wrapper */}
|
|
432
|
-
<div className={[
|
|
433
|
-
// Base classes
|
|
434
|
-
'relative',
|
|
435
|
-
'w-full',
|
|
436
|
-
'h-full',
|
|
437
|
-
'flex',
|
|
438
|
-
'items-center',
|
|
439
|
-
'justify-center',
|
|
440
|
-
|
|
441
|
-
// Conditionals based on variant
|
|
442
|
-
...(variant === 'mobile' ? [
|
|
443
|
-
// Force mobile: full width/height, no card
|
|
444
|
-
'w-full',
|
|
445
|
-
'h-full',
|
|
446
|
-
] : variant === 'desktop' ? [
|
|
447
|
-
// Force desktop: centered card
|
|
448
|
-
'w-[400px]',
|
|
449
|
-
'shadow-lg',
|
|
450
|
-
] : [
|
|
451
|
-
// Responsive: adapts based on viewport
|
|
452
|
-
'w-full h-full', // Mobile
|
|
453
|
-
'md:w-[400px] md:shadow-lg' // Desktop
|
|
454
|
-
])
|
|
455
|
-
].join(' ')}>
|
|
456
|
-
{/* Content using system components */}
|
|
457
|
-
<Input label="Email" />
|
|
458
|
-
<Button>Submit</Button>
|
|
459
|
-
</div>
|
|
460
|
-
</div>
|
|
461
|
-
);
|
|
462
|
-
};
|
|
463
|
-
```
|
|
464
|
-
|
|
465
|
-
## Stories for Views
|
|
466
|
-
|
|
467
|
-
**DON'T create "Mobile Variant" or "Desktop Variant" stories**. Views should be responsive by default.
|
|
468
|
-
|
|
469
|
-
```tsx
|
|
470
|
-
// ❌ BAD - NEVER do this
|
|
471
|
-
export const Mobile: Story = {
|
|
472
|
-
parameters: { viewport: { defaultViewport: 'mobile1' } },
|
|
473
|
-
// ...
|
|
474
|
-
};
|
|
475
|
-
|
|
476
|
-
export const MobileVariant: Story = {
|
|
477
|
-
render: () => (
|
|
478
|
-
<div className="min-h-screen w-full">
|
|
479
|
-
<View variant="mobile" /> {/* ❌ DON'T use forced variant */}
|
|
480
|
-
</div>
|
|
481
|
-
),
|
|
482
|
-
};
|
|
483
|
-
|
|
484
|
-
export const DesktopVariant: Story = {
|
|
485
|
-
render: () => (
|
|
486
|
-
<div className="min-h-screen w-full">
|
|
487
|
-
<View variant="desktop" /> {/* ❌ DON'T use forced variant */}
|
|
488
|
-
</div>
|
|
489
|
-
),
|
|
490
|
-
};
|
|
491
|
-
|
|
492
|
-
// ✅ GOOD - Only these 4 basic stories
|
|
493
|
-
export const Desktop: Story = {
|
|
494
|
-
render: () => (
|
|
495
|
-
<div className="min-h-screen w-full">
|
|
496
|
-
<View /> {/* variant="responsive" by default */}
|
|
497
|
-
</div>
|
|
498
|
-
),
|
|
499
|
-
};
|
|
500
|
-
|
|
501
|
-
export const Loading: Story = {
|
|
502
|
-
render: () => (
|
|
503
|
-
<div className="min-h-screen w-full">
|
|
504
|
-
<View isLoading={true} />
|
|
505
|
-
</div>
|
|
506
|
-
),
|
|
507
|
-
};
|
|
508
|
-
|
|
509
|
-
export const WithError: Story = {
|
|
510
|
-
render: () => (
|
|
511
|
-
<div className="min-h-screen w-full">
|
|
512
|
-
<View errorMessage="Error message" />
|
|
513
|
-
</div>
|
|
514
|
-
),
|
|
515
|
-
};
|
|
516
|
-
|
|
517
|
-
export const WithoutBackground: Story = {
|
|
518
|
-
render: () => (
|
|
519
|
-
<div className="min-h-screen w-full">
|
|
520
|
-
<View showBackground={false} />
|
|
521
|
-
</div>
|
|
522
|
-
),
|
|
523
|
-
};
|
|
524
|
-
```
|
|
525
|
-
|
|
526
|
-
**IMPORTANT**: The `variant` prop exists ONLY for very specific cases where the end user needs to force a mode, but NEVER should be used in Storybook stories.
|
|
527
|
-
|
|
528
|
-
## Stories Documentation
|
|
529
|
-
|
|
530
|
-
Keep documentation **simple and concise**:
|
|
531
|
-
|
|
532
|
-
```tsx
|
|
533
|
-
const meta = {
|
|
534
|
-
title: 'Siesa UI Kit/ViewName',
|
|
535
|
-
component: ViewName,
|
|
536
|
-
parameters: {
|
|
537
|
-
layout: 'fullscreen',
|
|
538
|
-
docs: {
|
|
539
|
-
description: {
|
|
540
|
-
component: 'Brief view description.',
|
|
541
|
-
},
|
|
542
|
-
},
|
|
543
|
-
},
|
|
544
|
-
// ...
|
|
545
|
-
};
|
|
546
|
-
```
|
|
547
|
-
|
|
548
|
-
**DO NOT include:**
|
|
549
|
-
- ❌ "Features" section
|
|
550
|
-
- ❌ "When to use" section
|
|
551
|
-
- ❌ "Composition" section
|
|
552
|
-
- ❌ "Best practices" section
|
|
553
|
-
- ❌ "Mobile" story
|
|
554
|
-
|
|
555
|
-
## Responsive Patterns
|
|
556
|
-
|
|
557
|
-
```tsx
|
|
558
|
-
// Mobile-first approach
|
|
559
|
-
className={[
|
|
560
|
-
// Mobile (< 768px)
|
|
561
|
-
'p-4',
|
|
562
|
-
'w-full',
|
|
563
|
-
'h-full',
|
|
564
|
-
|
|
565
|
-
// Desktop (≥ 768px)
|
|
566
|
-
'md:p-16',
|
|
567
|
-
'md:w-[400px]',
|
|
568
|
-
'md:shadow-lg',
|
|
569
|
-
'md:rounded-2xl',
|
|
570
|
-
].join(' ')}
|
|
571
|
-
```
|
|
572
|
-
|
|
573
|
-
## Views Checklist
|
|
574
|
-
|
|
575
|
-
### Design and Functionality
|
|
576
|
-
- [ ] Responsive with breakpoints `md:`, `lg:`
|
|
577
|
-
- [ ] Dark mode on all elements
|
|
578
|
-
- [ ] `variant` prop if needed to force mobile/desktop (ONLY for end use, NOT for stories)
|
|
579
|
-
- [ ] Stories: Desktop, Loading, WithError, WithoutBackground (4 basic stories)
|
|
580
|
-
- [ ] ❌ DON'T create "Mobile" story
|
|
581
|
-
- [ ] ❌ DON'T create "MobileVariant" story
|
|
582
|
-
- [ ] ❌ DON'T create "DesktopVariant" story
|
|
583
|
-
- [ ] Simple and concise documentation
|
|
584
|
-
- [ ] Uses existing system components
|
|
585
|
-
- [ ] Build without errors
|
|
586
|
-
|
|
587
|
-
### 🔴 SPANISH LANGUAGE (MANDATORY) 🔴
|
|
588
|
-
- [ ] **Titles and headings**: In Spanish ("Iniciar Sesión", NOT "Sign In")
|
|
589
|
-
- [ ] **Field labels**: In Spanish ("Correo Electrónico", NOT "Email")
|
|
590
|
-
- [ ] **Placeholders**: In Spanish ("Juan Pérez", NOT "John Doe")
|
|
591
|
-
- [ ] **Buttons**: In Spanish ("Iniciar Sesión", "Registrarse", NOT "Sign In", "Sign Up")
|
|
592
|
-
- [ ] **Status messages**: In Spanish ("Iniciando sesión...", NOT "Signing in...")
|
|
593
|
-
- [ ] **Links and secondary text**: In Spanish ("¿No tienes una cuenta?", NOT "Don't have an account?")
|
|
594
|
-
- [ ] **Error messages**: In Spanish ("Por favor ingresa un email válido", NOT "Please enter a valid email")
|
|
595
|
-
- [ ] **Terms and conditions**: In Spanish ("Condiciones de Uso", NOT "Terms of Use")
|
|
596
|
-
- [ ] **Help texts**: In Spanish ("Olvidé mi Contraseña", NOT "Forgot Password")
|
|
597
|
-
- [ ] **aria-label**: In Spanish ("Mostrar contraseña", NOT "Show password")
|
|
598
|
-
|
|
599
|
-
---
|
|
600
|
-
|
|
601
|
-
# 🛠️ Workflow for New Components
|
|
602
|
-
|
|
603
|
-
## Phase 0: Existing File Verification (CRITICAL on Windows)
|
|
604
|
-
|
|
605
|
-
**⚠️ BEFORE EDITING ANY FILE:**
|
|
606
|
-
|
|
607
|
-
1. **Verify the exact file casing** using git:
|
|
608
|
-
```bash
|
|
609
|
-
git ls-files src/components/[ComponentName]/
|
|
610
|
-
```
|
|
611
|
-
|
|
612
|
-
2. **ALWAYS use the exact casing** that git shows:
|
|
613
|
-
- ✅ CORRECT: If git shows `Textarea.tsx`, use exactly `Textarea.tsx`
|
|
614
|
-
- ❌ INCORRECT: Use `TextArea.tsx` when git shows `Textarea.tsx`
|
|
615
|
-
|
|
616
|
-
3. **Reason**: Windows doesn't distinguish uppercase/lowercase in filenames, but TypeScript and Git DO. Using incorrect casing causes build errors.
|
|
617
|
-
|
|
618
|
-
**Useful commands:**
|
|
619
|
-
```bash
|
|
620
|
-
# Verify existing files with exact casing
|
|
621
|
-
git ls-files src/components/[ComponentName]/
|
|
622
|
-
|
|
623
|
-
# List files in a folder
|
|
624
|
-
ls -la src/components/[ComponentName]/
|
|
625
|
-
|
|
626
|
-
# If you need to change a file's casing
|
|
627
|
-
git mv OldName.tsx temp.tsx
|
|
628
|
-
git mv temp.tsx NewName.tsx
|
|
629
|
-
```
|
|
630
|
-
|
|
631
|
-
## Phase 1: Research (MANDATORY)
|
|
632
|
-
|
|
633
|
-
**Before writing code:**
|
|
634
|
-
|
|
635
|
-
1. **Read Figma specifications** (if they exist)
|
|
636
|
-
2. **Review relevant documentation**:
|
|
637
|
-
- `docs/colors.md`
|
|
638
|
-
- `docs/typography.md`
|
|
639
|
-
- `docs/spacing.md`
|
|
640
|
-
- `docs/shadows.md`
|
|
641
|
-
3. **Study `src/components/Button/`** as reference
|
|
642
|
-
4. **Plan file structure**
|
|
643
|
-
|
|
644
|
-
## Phase 2: Create File Structure
|
|
645
|
-
|
|
646
|
-
Create in `src/components/[ComponentName]/`:
|
|
647
|
-
|
|
648
|
-
```
|
|
649
|
-
[ComponentName]/
|
|
650
|
-
├── [ComponentName].tsx # Main component
|
|
651
|
-
├── [ComponentName].types.ts # TypeScript types
|
|
652
|
-
├── [ComponentName].stories.tsx # Storybook stories
|
|
653
|
-
├── icons.tsx # Icons (if needed)
|
|
654
|
-
├── index.ts # Exports
|
|
655
|
-
└── README.md # Documentation
|
|
656
|
-
```
|
|
657
|
-
|
|
658
|
-
## Phase 3: Implement Component
|
|
659
|
-
|
|
660
|
-
### Component Template
|
|
661
|
-
|
|
662
|
-
```tsx
|
|
663
|
-
import React from 'react';
|
|
664
|
-
import type { [ComponentName]Props } from './[ComponentName].types';
|
|
665
|
-
|
|
666
|
-
/**
|
|
667
|
-
* [ComponentName] from the Siesa design system
|
|
668
|
-
*
|
|
669
|
-
* [Detailed description of the component's purpose]
|
|
670
|
-
*
|
|
671
|
-
* Implemented best practices:
|
|
672
|
-
* - Modifier order: {responsive}:{dark}:{state}:{utility}
|
|
673
|
-
* - Dark mode with 'class' strategy (darkMode: 'class')
|
|
674
|
-
* - Color tokens consistent with documentation
|
|
675
|
-
* - Type safety with strict TypeScript
|
|
676
|
-
* - Accessibility with ARIA labels
|
|
677
|
-
*
|
|
678
|
-
* @see docs/colors.md - Color system
|
|
679
|
-
* @see docs/typography.md - Typography system
|
|
680
|
-
* @see docs/spacing.md - Spacing system
|
|
681
|
-
*
|
|
682
|
-
* @example
|
|
683
|
-
* ```tsx
|
|
684
|
-
* <[ComponentName] variant="default" size="base">
|
|
685
|
-
* Content
|
|
686
|
-
* </[ComponentName]>
|
|
687
|
-
* ```
|
|
688
|
-
*/
|
|
689
|
-
export const [ComponentName]: React.FC<[ComponentName]Props> = ({
|
|
690
|
-
variant = 'default',
|
|
691
|
-
size = 'base',
|
|
692
|
-
disabled = false,
|
|
693
|
-
className = '',
|
|
694
|
-
children,
|
|
695
|
-
onClick,
|
|
696
|
-
ariaLabel,
|
|
697
|
-
}) => {
|
|
698
|
-
// ===== SIZE CLASSES =====
|
|
699
|
-
const sizeClasses = {
|
|
700
|
-
xs: 'text-xs px-2 py-1',
|
|
701
|
-
sm: 'text-sm px-3 py-1.5',
|
|
702
|
-
base: 'text-base px-4 py-2',
|
|
703
|
-
l: 'text-lg px-5 py-2.5',
|
|
704
|
-
xl: 'text-lg px-6 py-3',
|
|
705
|
-
};
|
|
706
|
-
|
|
707
|
-
// ===== VARIANT CLASSES =====
|
|
708
|
-
const variantClasses = {
|
|
709
|
-
default: `
|
|
710
|
-
bg-primary-custom-600
|
|
711
|
-
text-primary-inverse-content
|
|
712
|
-
border border-primary-custom-600
|
|
713
|
-
hover:bg-primary-custom-500
|
|
714
|
-
active:scale-95
|
|
715
|
-
dark:bg-dark-bg-inverse
|
|
716
|
-
dark:text-dark-content-inverse
|
|
717
|
-
dark:border-dark-bg-inverse
|
|
718
|
-
dark:hover:bg-dark-bg-inverse/90
|
|
719
|
-
dark:active:scale-95
|
|
720
|
-
`,
|
|
721
|
-
secondary: `
|
|
722
|
-
bg-white
|
|
723
|
-
text-content-primary
|
|
724
|
-
border border-border-primary
|
|
725
|
-
hover:bg-gray-50
|
|
726
|
-
active:scale-95
|
|
727
|
-
dark:bg-dark-bg-primary
|
|
728
|
-
dark:text-dark-content-primary
|
|
729
|
-
dark:border-dark-border-primary
|
|
730
|
-
dark:hover:bg-gray-800
|
|
731
|
-
dark:active:scale-95
|
|
732
|
-
`,
|
|
733
|
-
};
|
|
734
|
-
|
|
735
|
-
// ===== BASE CLASSES =====
|
|
736
|
-
const baseClasses = `
|
|
737
|
-
inline-flex
|
|
738
|
-
items-center
|
|
739
|
-
justify-center
|
|
740
|
-
gap-2
|
|
741
|
-
font-medium
|
|
742
|
-
rounded-lg
|
|
743
|
-
transition-all
|
|
744
|
-
duration-150
|
|
745
|
-
focus:outline-none
|
|
746
|
-
focus:ring-2
|
|
747
|
-
focus:ring-offset-2
|
|
748
|
-
focus:ring-primary-custom-400
|
|
749
|
-
dark:focus:ring-dark-border-custom
|
|
750
|
-
dark:focus:ring-offset-dark-bg-primary
|
|
751
|
-
disabled:opacity-50
|
|
752
|
-
disabled:cursor-not-allowed
|
|
753
|
-
disabled:pointer-events-none
|
|
754
|
-
`;
|
|
755
|
-
|
|
756
|
-
// ===== COMBINE CLASSES =====
|
|
757
|
-
const finalClasses = [
|
|
758
|
-
baseClasses,
|
|
759
|
-
sizeClasses[size],
|
|
760
|
-
variantClasses[variant],
|
|
761
|
-
className,
|
|
762
|
-
]
|
|
763
|
-
.join(' ')
|
|
764
|
-
.replace(/\s+/g, ' ')
|
|
765
|
-
.trim();
|
|
766
|
-
|
|
767
|
-
return (
|
|
768
|
-
<button
|
|
769
|
-
className={finalClasses}
|
|
770
|
-
disabled={disabled}
|
|
771
|
-
onClick={onClick}
|
|
772
|
-
aria-label={ariaLabel}
|
|
773
|
-
type="button"
|
|
774
|
-
>
|
|
775
|
-
{children}
|
|
776
|
-
</button>
|
|
777
|
-
);
|
|
778
|
-
};
|
|
779
|
-
```
|
|
780
|
-
|
|
781
|
-
### Component Checklist
|
|
782
|
-
|
|
783
|
-
- [ ] Complete JSDoc with `@see`, `@example`
|
|
784
|
-
- [ ] All variants have `dark:`
|
|
785
|
-
- [ ] Adaptive focus rings
|
|
786
|
-
- [ ] Hover/active states with `dark:`
|
|
787
|
-
- [ ] Uses system tokens (not hardcoded)
|
|
788
|
-
- [ ] Props with defaults
|
|
789
|
-
- [ ] Correct modifier order
|
|
790
|
-
- [ ] Accessibility (ARIA)
|
|
791
|
-
|
|
792
|
-
## Phase 4: TypeScript Types
|
|
793
|
-
|
|
794
|
-
### Types Template
|
|
795
|
-
|
|
796
|
-
```typescript
|
|
797
|
-
// [ComponentName].types.ts
|
|
798
|
-
import type { ReactNode, MouseEvent } from 'react';
|
|
799
|
-
|
|
800
|
-
/**
|
|
801
|
-
* [ComponentName] component props
|
|
802
|
-
*/
|
|
803
|
-
export interface [ComponentName]Props {
|
|
804
|
-
/**
|
|
805
|
-
* Visual variant of the component
|
|
806
|
-
* @default 'default'
|
|
807
|
-
*/
|
|
808
|
-
variant?: 'default' | 'secondary' | 'outline' | 'ghost';
|
|
809
|
-
|
|
810
|
-
/**
|
|
811
|
-
* Component size
|
|
812
|
-
* @default 'base'
|
|
813
|
-
*/
|
|
814
|
-
size?: 'xs' | 'sm' | 'base' | 'l' | 'xl';
|
|
815
|
-
|
|
816
|
-
/**
|
|
817
|
-
* Component content
|
|
818
|
-
*/
|
|
819
|
-
children?: ReactNode;
|
|
820
|
-
|
|
821
|
-
/**
|
|
822
|
-
* Whether the component is disabled
|
|
823
|
-
* @default false
|
|
824
|
-
*/
|
|
825
|
-
disabled?: boolean;
|
|
826
|
-
|
|
827
|
-
/**
|
|
828
|
-
* Additional CSS classes
|
|
829
|
-
*/
|
|
830
|
-
className?: string;
|
|
831
|
-
|
|
832
|
-
/**
|
|
833
|
-
* Click event handler
|
|
834
|
-
*/
|
|
835
|
-
onClick?: (event: MouseEvent<HTMLButtonElement>) => void;
|
|
836
|
-
|
|
837
|
-
/**
|
|
838
|
-
* Accessibility label (ARIA)
|
|
839
|
-
*/
|
|
840
|
-
ariaLabel?: string;
|
|
841
|
-
|
|
842
|
-
/**
|
|
843
|
-
* Icon to display (optional)
|
|
844
|
-
*/
|
|
845
|
-
icon?: ReactNode;
|
|
846
|
-
|
|
847
|
-
/**
|
|
848
|
-
* Icon position
|
|
849
|
-
* @default 'left'
|
|
850
|
-
*/
|
|
851
|
-
iconPosition?: 'left' | 'right';
|
|
852
|
-
}
|
|
853
|
-
```
|
|
854
|
-
|
|
855
|
-
---
|
|
856
|
-
|
|
857
|
-
# 🌍 CRITICAL RULE: SPANISH LANGUAGE
|
|
858
|
-
|
|
859
|
-
## ⚠️ ALL USER-VISIBLE CONTENT MUST BE IN SPANISH ⚠️
|
|
860
|
-
|
|
861
|
-
This is a **MANDATORY and NON-NEGOTIABLE** rule. Any content that the user can see in Storybook, in the application, or in any component/view MUST be in Spanish.
|
|
862
|
-
|
|
863
|
-
**Applies to:**
|
|
864
|
-
- ✅ Components (Button, Input, Dropdown, etc.)
|
|
865
|
-
- ✅ Views (LoginView, SignUpView, RecoverPasswordView, etc.)
|
|
866
|
-
- ✅ Storybook stories
|
|
867
|
-
- ✅ Props and interactive examples
|
|
868
|
-
- ✅ User-visible documentation
|
|
869
|
-
|
|
870
|
-
### ✅ CORRECT Examples:
|
|
871
|
-
|
|
872
|
-
```typescript
|
|
873
|
-
// ✅ CORRECT - Playground
|
|
874
|
-
export const Playground: Story = {
|
|
875
|
-
args: {
|
|
876
|
-
placeholder: 'Opciones', // ✅ In Spanish
|
|
877
|
-
children: 'Hacer clic aquí', // ✅ In Spanish
|
|
878
|
-
items: [
|
|
879
|
-
{ children: 'Cuenta' }, // ✅ In Spanish
|
|
880
|
-
{ children: 'Configuración' }, // ✅ In Spanish
|
|
881
|
-
{ children: 'Cerrar sesión' }, // ✅ In Spanish
|
|
882
|
-
],
|
|
883
|
-
},
|
|
884
|
-
};
|
|
885
|
-
|
|
886
|
-
// ✅ CORRECT - Export names
|
|
887
|
-
export const TodosLosTiposDeMenu: Story = { /* ... */ };
|
|
888
|
-
export const Estados: Story = { /* ... */ };
|
|
889
|
-
export const EjemplosDeUso: Story = { /* ... */ };
|
|
890
|
-
|
|
891
|
-
// ✅ CORRECT - Categories
|
|
892
|
-
argTypes: {
|
|
893
|
-
variant: {
|
|
894
|
-
control: 'select',
|
|
895
|
-
description: 'Variante visual del componente',
|
|
896
|
-
table: {
|
|
897
|
-
category: 'Apariencia', // ✅ In Spanish
|
|
898
|
-
},
|
|
899
|
-
},
|
|
900
|
-
}
|
|
901
|
-
|
|
902
|
-
// ✅ CORRECT - Example content
|
|
903
|
-
items={[
|
|
904
|
-
{ children: 'Deshacer', shortcut: '⌘ Z' },
|
|
905
|
-
{ children: 'Rehacer', shortcut: '⌘ ⇧ Z' },
|
|
906
|
-
{ children: 'Cortar', shortcut: '⌘ X' },
|
|
907
|
-
]}
|
|
908
|
-
|
|
909
|
-
// ✅ CORRECT - Views
|
|
910
|
-
<LoginView>
|
|
911
|
-
<h1>Iniciar Sesión</h1>
|
|
912
|
-
<label>Correo Electrónico</label>
|
|
913
|
-
<input placeholder="ejemplo@miempresa.com" />
|
|
914
|
-
<button>Iniciar Sesión</button>
|
|
915
|
-
<a>¿No tienes una cuenta?</a>
|
|
916
|
-
</LoginView>
|
|
917
|
-
```
|
|
918
|
-
|
|
919
|
-
### ❌ INCORRECT Examples:
|
|
920
|
-
|
|
921
|
-
```typescript
|
|
922
|
-
// ❌ INCORRECT - Texts in English
|
|
923
|
-
export const Playground: Story = {
|
|
924
|
-
args: {
|
|
925
|
-
placeholder: 'Options', // ❌ In English
|
|
926
|
-
children: 'Click here', // ❌ In English
|
|
927
|
-
items: [
|
|
928
|
-
{ children: 'Account' }, // ❌ In English
|
|
929
|
-
{ children: 'Settings' }, // ❌ In English
|
|
930
|
-
{ children: 'Logout' }, // ❌ In English
|
|
931
|
-
],
|
|
932
|
-
},
|
|
933
|
-
};
|
|
934
|
-
|
|
935
|
-
// ❌ INCORRECT - Names in English
|
|
936
|
-
export const AllMenuTypes: Story = { /* ... */ };
|
|
937
|
-
export const States: Story = { /* ... */ };
|
|
938
|
-
export const UsageExamples: Story = { /* ... */ };
|
|
939
|
-
|
|
940
|
-
// ❌ INCORRECT - Categories in English
|
|
941
|
-
table: {
|
|
942
|
-
category: 'Appearance', // ❌ In English
|
|
943
|
-
}
|
|
944
|
-
|
|
945
|
-
// ❌ INCORRECT - Views in English
|
|
946
|
-
<LoginView>
|
|
947
|
-
<h1>Sign In</h1> // ❌ In English
|
|
948
|
-
<label>Email</label> // ❌ In English
|
|
949
|
-
<input placeholder="john@company.com" /> // ❌ In English
|
|
950
|
-
<button>Sign In</button> // ❌ In English
|
|
951
|
-
<a>Don't have an account?</a> // ❌ In English
|
|
952
|
-
</LoginView>
|
|
953
|
-
```
|
|
954
|
-
|
|
955
|
-
### 📝 Spanish Content Checklist:
|
|
956
|
-
|
|
957
|
-
Before finishing a component OR view, verify that EVERYTHING is in Spanish:
|
|
958
|
-
|
|
959
|
-
#### For Components:
|
|
960
|
-
- [ ] **Playground args**: All texts, placeholders and children in Spanish
|
|
961
|
-
- [ ] **Story exports**: Descriptive names in Spanish (`TodosLosTiposDeMenu`, NOT `AllMenuTypes`)
|
|
962
|
-
- [ ] **argTypes categories**: `Apariencia`, `Contenido`, `Estado`, `Comportamiento`
|
|
963
|
-
- [ ] **Section titles**: "Básico", "Con Iconos", "Estados", etc.
|
|
964
|
-
- [ ] **Item content**: "Cuenta", "Configuración", "Cerrar sesión"
|
|
965
|
-
- [ ] **Placeholders**: "Opciones", "Acciones", "Seleccionar", etc.
|
|
966
|
-
- [ ] **Descriptions**: "Administra tu perfil", "Configura las preferencias"
|
|
967
|
-
- [ ] **Status messages**: "Abierto", "Cerrado", "Ninguna"
|
|
968
|
-
- [ ] **Test data**: "Juan Pérez", NOT "John Doe"
|
|
969
|
-
|
|
970
|
-
#### For Views:
|
|
971
|
-
- [ ] **Titles/Headings**: In Spanish ("Iniciar Sesión", "Crear Cuenta", NOT "Sign In", "Sign Up")
|
|
972
|
-
- [ ] **Field labels**: In Spanish ("Correo Electrónico", "Contraseña", NOT "Email", "Password")
|
|
973
|
-
- [ ] **Input placeholders**: In Spanish ("ejemplo@miempresa.com", "Juan Pérez", NOT "john@company.com", "John Doe")
|
|
974
|
-
- [ ] **Buttons**: In Spanish ("Iniciar Sesión", "Registrarse", NOT "Sign In", "Sign Up")
|
|
975
|
-
- [ ] **Loading messages**: In Spanish ("Iniciando sesión...", NOT "Signing in...")
|
|
976
|
-
- [ ] **Links and secondary text**: In Spanish ("¿No tienes una cuenta?", NOT "Don't have an account?")
|
|
977
|
-
- [ ] **Error messages**: In Spanish ("Por favor ingresa un email válido", NOT "Please enter a valid email")
|
|
978
|
-
- [ ] **Terms and help**: In Spanish ("Olvidé mi Contraseña", "Condiciones de Uso", NOT "Forgot Password", "Terms of Use")
|
|
979
|
-
- [ ] **aria-label**: In Spanish ("Mostrar contraseña", "Ocultar contraseña", NOT "Show password", "Hide password")
|
|
980
|
-
|
|
981
|
-
---
|
|
982
|
-
|
|
983
|
-
## Phase 5: Storybook Stories
|
|
984
|
-
|
|
985
|
-
### Stories Template
|
|
986
|
-
|
|
987
|
-
```tsx
|
|
988
|
-
import type { Meta, StoryObj } from '@storybook/react';
|
|
989
|
-
import { [ComponentName] } from './[ComponentName]';
|
|
990
|
-
|
|
991
|
-
const meta = {
|
|
992
|
-
title: 'Siesa UI Kit/[ComponentName]',
|
|
993
|
-
component: [ComponentName],
|
|
994
|
-
parameters: {
|
|
995
|
-
layout: 'centered',
|
|
996
|
-
docs: {
|
|
997
|
-
description: {
|
|
998
|
-
component: '[Component description]',
|
|
999
|
-
},
|
|
1000
|
-
},
|
|
1001
|
-
},
|
|
1002
|
-
tags: ['autodocs'],
|
|
1003
|
-
argTypes: {
|
|
1004
|
-
variant: {
|
|
1005
|
-
control: 'select',
|
|
1006
|
-
options: ['default', 'secondary', 'outline', 'ghost'],
|
|
1007
|
-
description: 'Variante visual del componente',
|
|
1008
|
-
table: {
|
|
1009
|
-
type: { summary: 'string' },
|
|
1010
|
-
category: 'Apariencia', // ALWAYS in Spanish
|
|
1011
|
-
},
|
|
1012
|
-
},
|
|
1013
|
-
size: {
|
|
1014
|
-
control: 'select',
|
|
1015
|
-
options: ['xs', 'sm', 'base', 'l', 'xl'],
|
|
1016
|
-
description: 'Tamaño del componente',
|
|
1017
|
-
table: {
|
|
1018
|
-
type: { summary: 'string' },
|
|
1019
|
-
category: 'Apariencia', // ALWAYS in Spanish
|
|
1020
|
-
},
|
|
1021
|
-
},
|
|
1022
|
-
disabled: {
|
|
1023
|
-
control: 'boolean',
|
|
1024
|
-
description: 'Si el componente está deshabilitado',
|
|
1025
|
-
table: {
|
|
1026
|
-
type: { summary: 'boolean' },
|
|
1027
|
-
category: 'Estado', // ALWAYS in Spanish
|
|
1028
|
-
},
|
|
1029
|
-
},
|
|
1030
|
-
},
|
|
1031
|
-
} satisfies Meta<typeof [ComponentName]>;
|
|
1032
|
-
|
|
1033
|
-
export default meta;
|
|
1034
|
-
type Story = StoryObj<typeof meta>;
|
|
1035
|
-
|
|
1036
|
-
// ============================================
|
|
1037
|
-
// 1. INTERACTIVE PLAYGROUND
|
|
1038
|
-
// ============================================
|
|
1039
|
-
export const Playground: Story = {
|
|
1040
|
-
args: {
|
|
1041
|
-
variant: 'default',
|
|
1042
|
-
size: 'base',
|
|
1043
|
-
children: 'Haz clic aquí',
|
|
1044
|
-
disabled: false,
|
|
1045
|
-
},
|
|
1046
|
-
};
|
|
1047
|
-
|
|
1048
|
-
// ============================================
|
|
1049
|
-
// 2. ALL VARIANTS
|
|
1050
|
-
// ============================================
|
|
1051
|
-
export const TodasLasVariantes: Story = {
|
|
1052
|
-
args: { items: [] }, // Add args if using render function
|
|
1053
|
-
render: () => (
|
|
1054
|
-
<div className="space-y-8 p-6">
|
|
1055
|
-
{/* Default */}
|
|
1056
|
-
<div>
|
|
1057
|
-
<h3 className="text-sm font-bold mb-4 text-gray-700 dark:text-white">
|
|
1058
|
-
Por Defecto
|
|
1059
|
-
</h3>
|
|
1060
|
-
<div className="flex flex-wrap gap-3">
|
|
1061
|
-
<[ComponentName] variant="default" size="xs">Extra Pequeño</[ComponentName]>
|
|
1062
|
-
<[ComponentName] variant="default" size="sm">Pequeño</[ComponentName]>
|
|
1063
|
-
<[ComponentName] variant="default" size="base">Base</[ComponentName]>
|
|
1064
|
-
<[ComponentName] variant="default" size="l">Grande</[ComponentName]>
|
|
1065
|
-
<[ComponentName] variant="default" size="xl">Extra Grande</[ComponentName]>
|
|
1066
|
-
</div>
|
|
1067
|
-
<p className="text-xs text-gray-500 dark:text-gray-300 mt-2">
|
|
1068
|
-
Variante principal del componente
|
|
1069
|
-
</p>
|
|
1070
|
-
</div>
|
|
1071
|
-
|
|
1072
|
-
{/* Secondary */}
|
|
1073
|
-
<div>
|
|
1074
|
-
<h3 className="text-sm font-bold mb-4 text-gray-700 dark:text-white">
|
|
1075
|
-
Secundario
|
|
1076
|
-
</h3>
|
|
1077
|
-
<div className="flex flex-wrap gap-3">
|
|
1078
|
-
<[ComponentName] variant="secondary" size="base">Secundario</[ComponentName]>
|
|
1079
|
-
</div>
|
|
1080
|
-
<p className="text-xs text-gray-500 dark:text-gray-300 mt-2">
|
|
1081
|
-
Variante secundaria para acciones menos importantes
|
|
1082
|
-
</p>
|
|
1083
|
-
</div>
|
|
1084
|
-
|
|
1085
|
-
{/* Tips */}
|
|
1086
|
-
<div className="mt-6 p-4 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg">
|
|
1087
|
-
<p className="text-xs text-gray-600 dark:text-gray-300">
|
|
1088
|
-
<strong>💡 Consejos:</strong>
|
|
1089
|
-
<br />• Usa <code className="px-1 bg-white dark:bg-gray-700">default</code> para acciones principales
|
|
1090
|
-
<br />• Usa <code className="px-1 bg-white dark:bg-gray-700">secondary</code> para acciones secundarias
|
|
1091
|
-
<br />• El tamaño <code className="px-1 bg-white dark:bg-gray-700">base</code> es el más común
|
|
1092
|
-
</p>
|
|
1093
|
-
</div>
|
|
1094
|
-
</div>
|
|
1095
|
-
),
|
|
1096
|
-
};
|
|
1097
|
-
|
|
1098
|
-
// ============================================
|
|
1099
|
-
// 3. STATES
|
|
1100
|
-
// ============================================
|
|
1101
|
-
export const States: Story = {
|
|
1102
|
-
render: () => (
|
|
1103
|
-
<div className="space-y-8 p-6">
|
|
1104
|
-
<div>
|
|
1105
|
-
<h3 className="text-sm font-bold mb-4 text-gray-700 dark:text-white">
|
|
1106
|
-
Normal
|
|
1107
|
-
</h3>
|
|
1108
|
-
<[ComponentName] variant="default">Estado Normal</[ComponentName]>
|
|
1109
|
-
</div>
|
|
1110
|
-
|
|
1111
|
-
<div>
|
|
1112
|
-
<h3 className="text-sm font-bold mb-4 text-gray-700 dark:text-white">
|
|
1113
|
-
Deshabilitado
|
|
1114
|
-
</h3>
|
|
1115
|
-
<[ComponentName] variant="default" disabled>Estado Deshabilitado</[ComponentName]>
|
|
1116
|
-
</div>
|
|
1117
|
-
|
|
1118
|
-
<div>
|
|
1119
|
-
<h3 className="text-sm font-bold mb-4 text-gray-700 dark:text-white">
|
|
1120
|
-
Hover
|
|
1121
|
-
</h3>
|
|
1122
|
-
<p className="text-xs text-gray-500 dark:text-gray-300 mb-2">
|
|
1123
|
-
Pasa el mouse sobre el componente para ver el efecto
|
|
1124
|
-
</p>
|
|
1125
|
-
<[ComponentName] variant="default">Pasa el mouse aquí</[ComponentName]>
|
|
1126
|
-
</div>
|
|
1127
|
-
</div>
|
|
1128
|
-
),
|
|
1129
|
-
};
|
|
1130
|
-
```
|
|
1131
|
-
|
|
1132
|
-
### Stories Checklist
|
|
1133
|
-
|
|
1134
|
-
#### Dark Mode
|
|
1135
|
-
- [ ] Titles: `text-gray-700 dark:text-white`
|
|
1136
|
-
- [ ] Secondary text: `text-gray-500 dark:text-gray-300`
|
|
1137
|
-
- [ ] Tips boxes: `bg-blue-50 dark:bg-blue-900/20`
|
|
1138
|
-
- [ ] Cards: `bg-white dark:bg-gray-800`
|
|
1139
|
-
- [ ] Borders: `border-gray-200 dark:border-gray-700`
|
|
1140
|
-
- [ ] Inline code: `bg-white dark:bg-gray-700`
|
|
1141
|
-
|
|
1142
|
-
#### 🔴 SPANISH LANGUAGE (MANDATORY) 🔴
|
|
1143
|
-
- [ ] **Playground args**: ALL texts (placeholder, children, items) in Spanish
|
|
1144
|
-
- [ ] **Story exports**: Names in Spanish (`TodosLosTiposDeMenu`, NOT `AllMenuTypes`)
|
|
1145
|
-
- [ ] **argTypes categories**: "Apariencia", "Contenido", "Estado", "Comportamiento"
|
|
1146
|
-
- [ ] **Section titles**: "Básico", "Con Iconos", "Estados" (NOT "Basic", "With Icons", "States")
|
|
1147
|
-
- [ ] **Item/button content**: "Cuenta", "Configuración", "Cerrar sesión" (NOT "Account", "Settings", "Logout")
|
|
1148
|
-
- [ ] **Placeholders**: "Opciones", "Acciones", "Seleccionar" (NOT "Options", "Actions", "Select")
|
|
1149
|
-
- [ ] **Descriptions**: "Administra tu perfil" (NOT "Manage your profile")
|
|
1150
|
-
- [ ] **Status messages**: "Abierto", "Cerrado", "Ninguna" (NOT "Opened", "Closed", "None")
|
|
1151
|
-
- [ ] **Test data**: "Juan Pérez" (NOT "John Doe")
|
|
1152
|
-
|
|
1153
|
-
**IMPORTANT NOTES**:
|
|
1154
|
-
- It's not necessary to create a "Dark Mode Comparison" story because Storybook has a selector to switch between light and dark mode.
|
|
1155
|
-
- ⚠️ **ALL user-visible content MUST be in Spanish** - This is a NON-NEGOTIABLE rule
|
|
1156
|
-
|
|
1157
|
-
### Interactive Playground with State
|
|
1158
|
-
|
|
1159
|
-
For controlled components (Switch, Checkbox, Input, etc.) that need to manage internal state in the Playground:
|
|
1160
|
-
|
|
1161
|
-
```tsx
|
|
1162
|
-
import { useState, useEffect } from 'react';
|
|
1163
|
-
|
|
1164
|
-
export const Playground: Story = {
|
|
1165
|
-
args: {
|
|
1166
|
-
checked: false,
|
|
1167
|
-
disabled: false,
|
|
1168
|
-
label: 'Etiqueta del componente',
|
|
1169
|
-
},
|
|
1170
|
-
render: (args) => {
|
|
1171
|
-
const [checked, setChecked] = useState(args.checked);
|
|
1172
|
-
|
|
1173
|
-
// ⚠️ CRITICAL: Sync local state when args change from controls
|
|
1174
|
-
useEffect(() => {
|
|
1175
|
-
setChecked(args.checked);
|
|
1176
|
-
}, [args.checked]);
|
|
1177
|
-
|
|
1178
|
-
return (
|
|
1179
|
-
<ComponentName
|
|
1180
|
-
{...args}
|
|
1181
|
-
checked={checked}
|
|
1182
|
-
onChange={(e) => setChecked(e.target.checked)}
|
|
1183
|
-
/>
|
|
1184
|
-
);
|
|
1185
|
-
},
|
|
1186
|
-
};
|
|
1187
|
-
```
|
|
1188
|
-
|
|
1189
|
-
**Why is this needed?**
|
|
1190
|
-
- Without `useEffect`: Changing the `checked` control in Storybook does NOT update local state
|
|
1191
|
-
- With `useEffect`: Storybook controls sync correctly with the component
|
|
1192
|
-
- **Applies to**: Switch, Checkbox, Radio, Input, Textarea, Select, and any controlled component
|
|
1193
|
-
|
|
1194
|
-
### Using Tailwind Arbitrary Colors
|
|
1195
|
-
|
|
1196
|
-
When Figma specifies exact colors that are NOT in the token system:
|
|
1197
|
-
|
|
1198
|
-
```tsx
|
|
1199
|
-
// ✅ GOOD: Use Tailwind arbitrary values for Figma-specific colors
|
|
1200
|
-
peer-hover:border-[#b6b6b9] // Figma-specific dark gray
|
|
1201
|
-
peer-hover:border-[#307cc5] // Figma-specific dark blue
|
|
1202
|
-
bg-[#fafafa] // Exact background color
|
|
1203
|
-
|
|
1204
|
-
// ✅ GOOD: When a system token exists, use it
|
|
1205
|
-
peer-hover:border-primary-custom-600
|
|
1206
|
-
dark:bg-dark-bg-primary
|
|
1207
|
-
|
|
1208
|
-
// ❌ BAD: Approximate with a standard color when Figma specifies an exact one
|
|
1209
|
-
peer-hover:border-gray-400 // ❌ If Figma says #b6b6b9, use that exact value
|
|
1210
|
-
```
|
|
1211
|
-
|
|
1212
|
-
**When to use arbitrary values:**
|
|
1213
|
-
- Very specific hover/focus colors for interactive states
|
|
1214
|
-
- Border colors not in the token system
|
|
1215
|
-
- When the Figma spec requires an exact color
|
|
1216
|
-
|
|
1217
|
-
**When NOT to use them:**
|
|
1218
|
-
- For main colors that ALREADY have tokens (bg-primary-custom-600, etc.)
|
|
1219
|
-
- For base backgrounds and texts (always use system tokens)
|
|
1220
|
-
- For colors that repeat in multiple components (add to system first)
|
|
1221
|
-
|
|
1222
|
-
## Phase 6: Exports
|
|
1223
|
-
|
|
1224
|
-
```typescript
|
|
1225
|
-
// index.ts
|
|
1226
|
-
export { [ComponentName] } from './[ComponentName]';
|
|
1227
|
-
export type { [ComponentName]Props } from './[ComponentName].types';
|
|
1228
|
-
```
|
|
1229
|
-
|
|
1230
|
-
## Phase 7: Validation
|
|
1231
|
-
|
|
1232
|
-
1. **Run build**:
|
|
1233
|
-
```bash
|
|
1234
|
-
npm run build
|
|
1235
|
-
```
|
|
1236
|
-
|
|
1237
|
-
2. **Verify**:
|
|
1238
|
-
- No TypeScript errors
|
|
1239
|
-
- No warnings
|
|
1240
|
-
|
|
1241
|
-
3. **Test in Storybook**:
|
|
1242
|
-
```bash
|
|
1243
|
-
npm run storybook
|
|
1244
|
-
```
|
|
1245
|
-
|
|
1246
|
-
4. **Validate dark mode**:
|
|
1247
|
-
- Toggle dark mode in Storybook
|
|
1248
|
-
- Verify all states
|
|
1249
|
-
- Compare against Figma (if applicable)
|
|
1250
|
-
|
|
1251
|
-
5. **Document**:
|
|
1252
|
-
- Create component README.md
|
|
1253
|
-
- Update docs/ if necessary
|
|
1254
|
-
|
|
1255
|
-
---
|
|
1256
|
-
|
|
1257
|
-
# 🎨 Figma Integration
|
|
1258
|
-
|
|
1259
|
-
## Available MCP Tools
|
|
1260
|
-
|
|
1261
|
-
### 1. `mcp__figma-desktop__get_design_context`
|
|
1262
|
-
Gets generated code for a Figma node.
|
|
1263
|
-
|
|
1264
|
-
**Input**: `nodeId` (e.g. "4001-17242")
|
|
1265
|
-
**Output**: React + Tailwind code
|
|
1266
|
-
|
|
1267
|
-
### 2. `mcp__figma-desktop__get_screenshot`
|
|
1268
|
-
Captures screenshot of a node.
|
|
1269
|
-
|
|
1270
|
-
### 3. `mcp__figma-desktop__get_metadata`
|
|
1271
|
-
Gets XML structure of a frame.
|
|
1272
|
-
|
|
1273
|
-
### 4. `mcp__figma-desktop__get_variable_defs`
|
|
1274
|
-
Gets design variables.
|
|
1275
|
-
|
|
1276
|
-
## Figma Validation Process
|
|
1277
|
-
|
|
1278
|
-
### Step 1: Extract Specifications
|
|
1279
|
-
|
|
1280
|
-
```
|
|
1281
|
-
1. User provides URL: https://figma.com/design/XXX?node-id=4001-17240
|
|
1282
|
-
2. Extract nodeId: "4001-17240"
|
|
1283
|
-
3. Call get_metadata(nodeId) to see structure
|
|
1284
|
-
4. Identify Light and Dark nodes
|
|
1285
|
-
5. For each variant:
|
|
1286
|
-
- Call get_design_context(specificNodeId)
|
|
1287
|
-
- Extract colors, sizes, spacing
|
|
1288
|
-
```
|
|
1289
|
-
|
|
1290
|
-
### Step 2: Map to System Tokens
|
|
1291
|
-
|
|
1292
|
-
```
|
|
1293
|
-
Figma says: text-[color:var(--content/contentcustomprimary,#0e79fd)]
|
|
1294
|
-
→ Map to: text-primary-custom-600
|
|
1295
|
-
|
|
1296
|
-
Figma says: bg-[color:var(--background/backgroundinverse,#0e79fd)]
|
|
1297
|
-
→ Map to: bg-dark-bg-inverse (in dark mode)
|
|
1298
|
-
|
|
1299
|
-
Figma says: shadow-[0px_1px_2px_0px_rgba(16,24,40,0.05)]
|
|
1300
|
-
→ Map to: shadow-base
|
|
1301
|
-
```
|
|
1302
|
-
|
|
1303
|
-
### Step 3: Compare Implementation
|
|
1304
|
-
|
|
1305
|
-
```
|
|
1306
|
-
For each state (Default, Hover, Focus, Disabled):
|
|
1307
|
-
|
|
1308
|
-
Light Mode:
|
|
1309
|
-
✓ bg-* matches
|
|
1310
|
-
✓ text-* matches
|
|
1311
|
-
✓ border-* matches
|
|
1312
|
-
✓ padding/margin matches
|
|
1313
|
-
|
|
1314
|
-
Dark Mode:
|
|
1315
|
-
✓ dark:bg-* matches
|
|
1316
|
-
✓ dark:text-* matches
|
|
1317
|
-
✓ dark:border-* matches
|
|
1318
|
-
```
|
|
1319
|
-
|
|
1320
|
-
### Step 4: Fix Discrepancies
|
|
1321
|
-
|
|
1322
|
-
Implement necessary changes following system patterns.
|
|
1323
|
-
|
|
1324
|
-
### Step 5: Validate
|
|
1325
|
-
|
|
1326
|
-
```bash
|
|
1327
|
-
npm run build
|
|
1328
|
-
npm run storybook
|
|
1329
|
-
```
|
|
1330
|
-
|
|
1331
|
-
---
|
|
1332
|
-
|
|
1333
|
-
# ⚠️ Common Mistakes to AVOID
|
|
1334
|
-
|
|
1335
|
-
## 1. Hardcoded Colors
|
|
1336
|
-
|
|
1337
|
-
```tsx
|
|
1338
|
-
// ❌ BAD
|
|
1339
|
-
<div className="bg-blue-500 text-white">
|
|
1340
|
-
|
|
1341
|
-
// ✅ GOOD
|
|
1342
|
-
<div className="bg-primary-custom-600 text-primary-inverse-content">
|
|
1343
|
-
```
|
|
1344
|
-
|
|
1345
|
-
## 2. Missing Dark Variant
|
|
1346
|
-
|
|
1347
|
-
```tsx
|
|
1348
|
-
// ❌ BAD
|
|
1349
|
-
<h3 className="text-gray-700">Title</h3>
|
|
1350
|
-
|
|
1351
|
-
// ✅ GOOD
|
|
1352
|
-
<h3 className="text-gray-700 dark:text-white">Title</h3>
|
|
1353
|
-
```
|
|
1354
|
-
|
|
1355
|
-
## 3. Incorrect Modifier Order
|
|
1356
|
-
|
|
1357
|
-
```tsx
|
|
1358
|
-
// ❌ BAD
|
|
1359
|
-
<div className="hover:dark:md:bg-blue-500">
|
|
1360
|
-
|
|
1361
|
-
// ✅ GOOD
|
|
1362
|
-
<div className="md:dark:hover:bg-blue-500">
|
|
1363
|
-
```
|
|
1364
|
-
|
|
1365
|
-
## 4. Forgetting Dark Mode Focus Rings
|
|
1366
|
-
|
|
1367
|
-
```tsx
|
|
1368
|
-
// ❌ BAD
|
|
1369
|
-
<button className="focus:ring-2 focus:ring-blue-400">
|
|
1370
|
-
|
|
1371
|
-
// ✅ GOOD
|
|
1372
|
-
<button className="focus:ring-2 focus:ring-primary-custom-400 dark:focus:ring-dark-border-custom">
|
|
1373
|
-
```
|
|
1374
|
-
|
|
1375
|
-
## 5. Not Using Shadow Tokens
|
|
1376
|
-
|
|
1377
|
-
```tsx
|
|
1378
|
-
// ❌ BAD
|
|
1379
|
-
<div className="shadow-[0px_1px_2px_rgba(0,0,0,0.1)]">
|
|
1380
|
-
|
|
1381
|
-
// ✅ GOOD
|
|
1382
|
-
<div className="shadow-base">
|
|
1383
|
-
```
|
|
1384
|
-
|
|
1385
|
-
## 6. Inputs Without Dark Mode Background
|
|
1386
|
-
|
|
1387
|
-
```tsx
|
|
1388
|
-
// ❌ BAD
|
|
1389
|
-
<input className="border rounded px-3 py-2" />
|
|
1390
|
-
|
|
1391
|
-
// ✅ GOOD
|
|
1392
|
-
<input className="border rounded px-3 py-2 dark:bg-gray-700 dark:border-gray-600 dark:text-white" />
|
|
1393
|
-
```
|
|
1394
|
-
|
|
1395
|
-
## 7. Props Without Defaults
|
|
1396
|
-
|
|
1397
|
-
```tsx
|
|
1398
|
-
// ❌ BAD
|
|
1399
|
-
export const Component: React.FC<Props> = ({ variant, size }) => {
|
|
1400
|
-
|
|
1401
|
-
// ✅ GOOD
|
|
1402
|
-
export const Component: React.FC<Props> = ({
|
|
1403
|
-
variant = 'default',
|
|
1404
|
-
size = 'base',
|
|
1405
|
-
}) => {
|
|
1406
|
-
```
|
|
1407
|
-
|
|
1408
|
-
## 8. Missing JSDoc
|
|
1409
|
-
|
|
1410
|
-
```tsx
|
|
1411
|
-
// ❌ BAD
|
|
1412
|
-
export const Component: React.FC<Props> = (props) => {
|
|
1413
|
-
|
|
1414
|
-
// ✅ GOOD
|
|
1415
|
-
/**
|
|
1416
|
-
* Component description
|
|
1417
|
-
* @see docs/colors.md
|
|
1418
|
-
*/
|
|
1419
|
-
export const Component: React.FC<Props> = (props) => {
|
|
1420
|
-
```
|
|
1421
|
-
|
|
1422
|
-
## 9. Incorrect File Name Casing (CRITICAL on Windows)
|
|
1423
|
-
|
|
1424
|
-
```bash
|
|
1425
|
-
# ❌ BAD - Edit without verifying correct casing
|
|
1426
|
-
# If the real file is Textarea.tsx but you edit it as TextArea.tsx
|
|
1427
|
-
Read file_path="src/components/Textarea/TextArea.tsx" # ❌ Incorrect casing
|
|
1428
|
-
|
|
1429
|
-
# ✅ GOOD - Verify first with git
|
|
1430
|
-
git ls-files src/components/Textarea/
|
|
1431
|
-
# Output: Textarea.tsx (with lowercase 'a')
|
|
1432
|
-
|
|
1433
|
-
Read file_path="src/components/Textarea/Textarea.tsx" # ✅ Correct casing
|
|
1434
|
-
```
|
|
1435
|
-
|
|
1436
|
-
**Error Symptom:**
|
|
1437
|
-
```
|
|
1438
|
-
error TS1261: Already included file name 'Textarea.tsx' differs from
|
|
1439
|
-
file name 'TextArea.tsx' only in casing.
|
|
1440
|
-
```
|
|
1441
|
-
|
|
1442
|
-
**Solution:**
|
|
1443
|
-
```bash
|
|
1444
|
-
# Force correct casing in git
|
|
1445
|
-
git mv Textarea.tsx temp.tsx
|
|
1446
|
-
git mv temp.tsx Textarea.tsx
|
|
1447
|
-
```
|
|
1448
|
-
|
|
1449
|
-
**Prevention:**
|
|
1450
|
-
```bash
|
|
1451
|
-
# ALWAYS run this BEFORE editing
|
|
1452
|
-
git ls-files src/components/[ComponentName]/
|
|
1453
|
-
# Use EXACTLY the casing that git shows
|
|
1454
|
-
```
|
|
1455
|
-
|
|
1456
|
-
## 10. Playground Without Sync (Controlled Components)
|
|
1457
|
-
|
|
1458
|
-
```tsx
|
|
1459
|
-
// ❌ BAD - Storybook "checked" control doesn't sync
|
|
1460
|
-
export const Playground: Story = {
|
|
1461
|
-
args: { checked: false },
|
|
1462
|
-
render: (args) => {
|
|
1463
|
-
const [checked, setChecked] = useState(args.checked);
|
|
1464
|
-
// ❌ MISSING: useEffect to sync
|
|
1465
|
-
return <Switch checked={checked} onChange={(e) => setChecked(e.target.checked)} />;
|
|
1466
|
-
},
|
|
1467
|
-
};
|
|
1468
|
-
|
|
1469
|
-
// ✅ GOOD - Sync with useEffect
|
|
1470
|
-
export const Playground: Story = {
|
|
1471
|
-
args: { checked: false },
|
|
1472
|
-
render: (args) => {
|
|
1473
|
-
const [checked, setChecked] = useState(args.checked);
|
|
1474
|
-
|
|
1475
|
-
// ✅ Sync when args change from controls
|
|
1476
|
-
useEffect(() => {
|
|
1477
|
-
setChecked(args.checked);
|
|
1478
|
-
}, [args.checked]);
|
|
1479
|
-
|
|
1480
|
-
return <Switch checked={checked} onChange={(e) => setChecked(e.target.checked)} />;
|
|
1481
|
-
},
|
|
1482
|
-
};
|
|
1483
|
-
```
|
|
1484
|
-
|
|
1485
|
-
**Symptom:** Changing the `checked` control in Storybook doesn't update the component.
|
|
1486
|
-
|
|
1487
|
-
**Applies to:** Switch, Checkbox, Radio, Input, Textarea, Select, and any controlled component.
|
|
1488
|
-
|
|
1489
|
-
## 11. Approximating Hover Colors Instead of Using Exact Figma Values
|
|
1490
|
-
|
|
1491
|
-
```tsx
|
|
1492
|
-
// ❌ BAD - Approximate color when Figma specifies an exact one
|
|
1493
|
-
// Figma says: #b6b6b9 (specific dark gray)
|
|
1494
|
-
peer-hover:border-gray-400 // ❌ #9ca3af ≠ #b6b6b9
|
|
1495
|
-
|
|
1496
|
-
// ✅ GOOD - Use exact Figma color with arbitrary values
|
|
1497
|
-
peer-hover:border-[#b6b6b9] // ✅ Exactly #b6b6b9
|
|
1498
|
-
|
|
1499
|
-
// ❌ BAD - Use system blue when Figma says specific dark blue
|
|
1500
|
-
// Figma says: #307cc5 (dark blue for ON hover)
|
|
1501
|
-
peer-hover:border-primary-custom-600 // ❌ #0e79fd ≠ #307cc5
|
|
1502
|
-
|
|
1503
|
-
// ✅ GOOD - Use exact Figma blue
|
|
1504
|
-
peer-hover:border-[#307cc5] // ✅ Exactly #307cc5
|
|
1505
|
-
```
|
|
1506
|
-
|
|
1507
|
-
**Symptom:** Hover looks different from Figma, even though it seems "similar."
|
|
1508
|
-
|
|
1509
|
-
**Prevention:** Extract exact colors with `get_design_context` and use Tailwind arbitrary values.
|
|
1510
|
-
|
|
1511
|
-
## 12. Forgetting Hover on Child Elements
|
|
1512
|
-
|
|
1513
|
-
```tsx
|
|
1514
|
-
// ❌ BAD - Only track has hover, button doesn't
|
|
1515
|
-
const trackClasses = `peer-hover:border-[#b6b6b9]`; // ✅ Track with hover
|
|
1516
|
-
const buttonClasses = `border-border-primary`; // ❌ Button WITHOUT hover
|
|
1517
|
-
|
|
1518
|
-
// ✅ GOOD - Track AND button have hover
|
|
1519
|
-
const trackClasses = `peer-hover:border-[#b6b6b9]`;
|
|
1520
|
-
const buttonClasses = `
|
|
1521
|
-
border-border-primary
|
|
1522
|
-
peer-hover:border-[#b6b6b9] // ✅ Button also has hover
|
|
1523
|
-
`;
|
|
1524
|
-
```
|
|
1525
|
-
|
|
1526
|
-
**Symptom:** On hover, the track changes but the button/circle looks inconsistent.
|
|
1527
|
-
|
|
1528
|
-
**Applies to:** Switch, Toggle, Slider, and components with multiple visual elements.
|
|
1529
|
-
|
|
1530
|
-
## 13. Focus with border-2 Instead of ring-2
|
|
1531
|
-
|
|
1532
|
-
```tsx
|
|
1533
|
-
// ❌ BAD - Use ring when Figma specifies border
|
|
1534
|
-
focus-within:ring-2 focus-within:ring-primary-custom-400 focus-within:ring-offset-2
|
|
1535
|
-
dark:focus-within:ring-dark-border-custom dark:focus-within:ring-offset-dark-bg-primary
|
|
1536
|
-
|
|
1537
|
-
// ✅ GOOD - Use border-2 as Figma specifies
|
|
1538
|
-
focus-within:border-2 focus-within:border-[#329cff]
|
|
1539
|
-
dark:focus-within:border-[#329cff]
|
|
1540
|
-
```
|
|
1541
|
-
|
|
1542
|
-
**Key difference:**
|
|
1543
|
-
- `ring-*`: Creates a **separate outline** from the element (using box-shadow), does NOT change the real border
|
|
1544
|
-
- `border-*`: Changes the **direct border** of the element, may cause slight visual growth
|
|
1545
|
-
|
|
1546
|
-
**When to use each:**
|
|
1547
|
-
|
|
1548
|
-
| Situation | Use | Reason |
|
|
1549
|
-
|-----------|-----|--------|
|
|
1550
|
-
| Figma shows separate outline | `ring-2` | Maintains element size |
|
|
1551
|
-
| Figma shows thicker direct border | `border-2` | Replicates exact design |
|
|
1552
|
-
| Input fields (general) | `ring-2` | Avoids visual jump |
|
|
1553
|
-
| Quantity, some custom inputs | `border-2` | Per Figma specification |
|
|
1554
|
-
|
|
1555
|
-
**Symptom:** Focus shows an outline with space (ring) when Figma shows a thicker direct border.
|
|
1556
|
-
|
|
1557
|
-
**Prevention:** Always extract focus specs with `get_design_context` and verify if it uses `border` or an outline effect.
|
|
1558
|
-
|
|
1559
|
-
**Known components with border-2 on focus:**
|
|
1560
|
-
- Quantity: `border-2 border-[#329cff]`
|
|
1561
|
-
|
|
1562
|
-
## 14. Specific Interactive State Colors
|
|
1563
|
-
|
|
1564
|
-
Some components use specific colors for interactive states that are NOT in the token system:
|
|
1565
|
-
|
|
1566
|
-
```tsx
|
|
1567
|
-
// ✅ Quantity - Hover
|
|
1568
|
-
hover:border-[#f9f9f9] // Very light gray, almost white
|
|
1569
|
-
|
|
1570
|
-
// ✅ Quantity - Focus
|
|
1571
|
-
focus-within:border-2
|
|
1572
|
-
focus-within:border-[#329cff] // Specific info blue
|
|
1573
|
-
|
|
1574
|
-
// ✅ Switch - Hover (OFF state)
|
|
1575
|
-
peer-hover:border-[#b6b6b9] // Specific dark gray
|
|
1576
|
-
|
|
1577
|
-
// ✅ Switch - Hover (ON state)
|
|
1578
|
-
peer-hover:border-[#307cc5] // Specific dark blue
|
|
1579
|
-
```
|
|
1580
|
-
|
|
1581
|
-
**When to use arbitrary values for states:**
|
|
1582
|
-
1. When `get_design_context` shows an exact color (e.g.: `#f9f9f9`)
|
|
1583
|
-
2. When the color does NOT exist in the token system
|
|
1584
|
-
3. When the design requires a very specific color for hover/focus
|
|
1585
|
-
|
|
1586
|
-
**Prevention:** Do NOT approximate interactive state colors. Extract the exact value from Figma and use Tailwind arbitrary values `border-[#hexcode]`.
|
|
1587
|
-
|
|
1588
|
-
---
|
|
1589
|
-
|
|
1590
|
-
# 📝 Best Practices
|
|
1591
|
-
|
|
1592
|
-
## 1. Code Structure
|
|
1593
|
-
|
|
1594
|
-
```typescript
|
|
1595
|
-
// ===== IMPORTS =====
|
|
1596
|
-
import React from 'react';
|
|
1597
|
-
import type { Props } from './types';
|
|
1598
|
-
|
|
1599
|
-
// ===== COMPLETE JSDOC =====
|
|
1600
|
-
/**
|
|
1601
|
-
* Component description
|
|
1602
|
-
* @see docs/...
|
|
1603
|
-
*/
|
|
1604
|
-
|
|
1605
|
-
// ===== COMPONENT =====
|
|
1606
|
-
export const Component: React.FC<Props> = ({
|
|
1607
|
-
// Props with defaults
|
|
1608
|
-
}) => {
|
|
1609
|
-
// ===== SIZE CLASSES =====
|
|
1610
|
-
const sizeClasses = { ... };
|
|
1611
|
-
|
|
1612
|
-
// ===== VARIANT CLASSES =====
|
|
1613
|
-
const variantClasses = { ... };
|
|
1614
|
-
|
|
1615
|
-
// ===== BASE CLASSES =====
|
|
1616
|
-
const baseClasses = ` ... `;
|
|
1617
|
-
|
|
1618
|
-
// ===== COMBINE CLASSES =====
|
|
1619
|
-
const classes = [...].join(' ').replace(/\s+/g, ' ').trim();
|
|
1620
|
-
|
|
1621
|
-
// ===== RENDER =====
|
|
1622
|
-
return <div className={classes}>{children}</div>;
|
|
1623
|
-
};
|
|
1624
|
-
```
|
|
1625
|
-
|
|
1626
|
-
## 2. Clear Comments
|
|
1627
|
-
|
|
1628
|
-
```typescript
|
|
1629
|
-
// ===== MAIN SECTION =====
|
|
1630
|
-
// Section description
|
|
1631
|
-
|
|
1632
|
-
// Specific sub-task
|
|
1633
|
-
const value = ...;
|
|
1634
|
-
```
|
|
1635
|
-
|
|
1636
|
-
## 3. Class Cleanup
|
|
1637
|
-
|
|
1638
|
-
```typescript
|
|
1639
|
-
const classes = [
|
|
1640
|
-
baseClasses,
|
|
1641
|
-
variantClasses[variant],
|
|
1642
|
-
sizeClasses[size],
|
|
1643
|
-
className,
|
|
1644
|
-
]
|
|
1645
|
-
.join(' ') // Join with spaces
|
|
1646
|
-
.replace(/\s+/g, ' ') // Remove multiple spaces
|
|
1647
|
-
.trim(); // Remove start/end spaces
|
|
1648
|
-
```
|
|
1649
|
-
|
|
1650
|
-
## 4. Accessibility
|
|
1651
|
-
|
|
1652
|
-
```tsx
|
|
1653
|
-
<button
|
|
1654
|
-
aria-label="Descriptive label"
|
|
1655
|
-
disabled={disabled}
|
|
1656
|
-
type="button"
|
|
1657
|
-
role="button"
|
|
1658
|
-
>
|
|
1659
|
-
```
|
|
1660
|
-
|
|
1661
|
-
## 5. Strict TypeScript
|
|
1662
|
-
|
|
1663
|
-
```typescript
|
|
1664
|
-
// ✓ Interfaces instead of types when possible
|
|
1665
|
-
export interface ComponentProps { ... }
|
|
1666
|
-
|
|
1667
|
-
// ✓ Explicit types for functions
|
|
1668
|
-
onClick?: (event: MouseEvent<HTMLButtonElement>) => void;
|
|
1669
|
-
|
|
1670
|
-
// ✓ Generics for children
|
|
1671
|
-
children?: ReactNode;
|
|
1672
|
-
```
|
|
1673
|
-
|
|
1674
|
-
---
|
|
1675
|
-
|
|
1676
|
-
# 🎯 Response Patterns
|
|
1677
|
-
|
|
1678
|
-
## When Fixing Errors
|
|
1679
|
-
|
|
1680
|
-
```
|
|
1681
|
-
I've identified [N] issues in [file]:
|
|
1682
|
-
|
|
1683
|
-
**❌ Issue 1: [Descriptive title]**
|
|
1684
|
-
- Location: `[file]:[line]`
|
|
1685
|
-
- Error: [current code]
|
|
1686
|
-
- Cause: [technical explanation]
|
|
1687
|
-
- Solution: [correct code]
|
|
1688
|
-
|
|
1689
|
-
**❌ Issue 2: [Descriptive title]**
|
|
1690
|
-
...
|
|
1691
|
-
|
|
1692
|
-
Proceeding to make corrections.
|
|
1693
|
-
```
|
|
1694
|
-
|
|
1695
|
-
## After Creating a Component
|
|
1696
|
-
|
|
1697
|
-
```
|
|
1698
|
-
✅ [Name] component created successfully
|
|
1699
|
-
|
|
1700
|
-
**Files created:**
|
|
1701
|
-
- ✓ [Component].tsx ([XXX] lines)
|
|
1702
|
-
- ✓ [Component].types.ts ([XX] props)
|
|
1703
|
-
- ✓ [Component].stories.tsx ([X] stories)
|
|
1704
|
-
- ✓ index.ts (exports)
|
|
1705
|
-
- ✓ README.md (documentation)
|
|
1706
|
-
|
|
1707
|
-
**Features implemented:**
|
|
1708
|
-
- ✓ Full dark mode support
|
|
1709
|
-
- ✓ Strict TypeScript types
|
|
1710
|
-
- ✓ [X] variants / [Y] sizes
|
|
1711
|
-
- ✓ Adaptive focus rings
|
|
1712
|
-
- ✓ Accessibility (ARIA)
|
|
1713
|
-
- ✓ [N] stories in Storybook
|
|
1714
|
-
|
|
1715
|
-
**Validation:**
|
|
1716
|
-
- ✓ Build executed without errors
|
|
1717
|
-
- ✓ TypeScript validated
|
|
1718
|
-
- ✓ Dark mode tested
|
|
1719
|
-
|
|
1720
|
-
**Next step:**
|
|
1721
|
-
```bash
|
|
1722
|
-
npm run storybook
|
|
1723
|
-
```
|
|
1724
|
-
Navigate to "Siesa UI Kit/[Component]" to see the component.
|
|
1725
|
-
```
|
|
1726
|
-
|
|
1727
|
-
## When Updating Documentation
|
|
1728
|
-
|
|
1729
|
-
```
|
|
1730
|
-
✅ Documentation updated: `docs/[file].md`
|
|
1731
|
-
|
|
1732
|
-
**Changes made:**
|
|
1733
|
-
- ✓ [Section 1]: [description] ([XX] lines)
|
|
1734
|
-
- ✓ [Section 2]: [description]
|
|
1735
|
-
- ✓ Reference table added
|
|
1736
|
-
- ✓ Code examples updated
|
|
1737
|
-
- ✓ Links to related files
|
|
1738
|
-
|
|
1739
|
-
**Related files:**
|
|
1740
|
-
- `[file1]`
|
|
1741
|
-
- `[file2]`
|
|
1742
|
-
```
|
|
1743
|
-
|
|
1744
|
-
## When Validating Against Figma
|
|
1745
|
-
|
|
1746
|
-
```
|
|
1747
|
-
✅ Figma validation completed
|
|
1748
|
-
|
|
1749
|
-
**Node analyzed:** [nodeId]
|
|
1750
|
-
|
|
1751
|
-
**Extracted specifications:**
|
|
1752
|
-
- States: [Default, Hover, Focus, Disabled]
|
|
1753
|
-
- Variants: [Light, Dark]
|
|
1754
|
-
- Colors: [list]
|
|
1755
|
-
- Typography: [sizes]
|
|
1756
|
-
|
|
1757
|
-
**Comparison:**
|
|
1758
|
-
✓ [X] specifications match
|
|
1759
|
-
❌ [Y] discrepancies found
|
|
1760
|
-
|
|
1761
|
-
**Corrections made:**
|
|
1762
|
-
1. [Change description 1]
|
|
1763
|
-
2. [Change description 2]
|
|
1764
|
-
|
|
1765
|
-
**Validation:**
|
|
1766
|
-
- ✓ Build successful
|
|
1767
|
-
- ✓ Dark mode verified
|
|
1768
|
-
- ✓ Pixel-perfect confirmed
|
|
1769
|
-
```
|
|
1770
|
-
|
|
1771
|
-
---
|
|
1772
|
-
|
|
1773
|
-
# 📊 Final Checklist
|
|
1774
|
-
|
|
1775
|
-
## For New Components
|
|
1776
|
-
|
|
1777
|
-
- [ ] All files created (.tsx, .types.ts, .stories.tsx, index.ts, README.md)
|
|
1778
|
-
- [ ] Complete JSDoc with `@see`, `@example`
|
|
1779
|
-
- [ ] All variants with dark mode
|
|
1780
|
-
- [ ] Adaptive focus rings
|
|
1781
|
-
- [ ] Props with defaults and types
|
|
1782
|
-
- [ ] Build without errors
|
|
1783
|
-
- [ ] Complete stories with examples
|
|
1784
|
-
- [ ] Validated in Storybook
|
|
1785
|
-
- [ ] Compared with Figma (if applicable)
|
|
1786
|
-
|
|
1787
|
-
## For Fixes
|
|
1788
|
-
|
|
1789
|
-
- [ ] All issues identified
|
|
1790
|
-
- [ ] System tokens used
|
|
1791
|
-
- [ ] Dark mode on all elements
|
|
1792
|
-
- [ ] Correct modifier order
|
|
1793
|
-
- [ ] Build without errors
|
|
1794
|
-
- [ ] Tested in Storybook
|
|
1795
|
-
|
|
1796
|
-
## For Documentation
|
|
1797
|
-
|
|
1798
|
-
- [ ] Functional code examples
|
|
1799
|
-
- [ ] Clearly defined patterns
|
|
1800
|
-
- [ ] Reference table included
|
|
1801
|
-
- [ ] Links to related files
|
|
1802
|
-
- [ ] Updated index/TOC
|
|
1803
|
-
|
|
1804
|
-
---
|
|
1805
|
-
|
|
1806
|
-
# 🎨 Common UI Patterns
|
|
1807
|
-
|
|
1808
|
-
## Pattern 1: Avatar with User Information
|
|
1809
|
-
|
|
1810
|
-
Common pattern for showing user with avatar, name and email (used in tables, lists, etc.):
|
|
1811
|
-
|
|
1812
|
-
```tsx
|
|
1813
|
-
// In custom column render
|
|
1814
|
-
render: (_value, row) => (
|
|
1815
|
-
<div className="flex items-center gap-2">
|
|
1816
|
-
{/* Circular avatar */}
|
|
1817
|
-
<img
|
|
1818
|
-
src={row.avatar}
|
|
1819
|
-
alt={row.nombre}
|
|
1820
|
-
className="w-8 h-8 rounded-full object-cover"
|
|
1821
|
-
/>
|
|
1822
|
-
{/* Text information */}
|
|
1823
|
-
<div className="flex flex-col">
|
|
1824
|
-
<span className="text-sm font-normal text-content-primary dark:text-dark-content-primary">
|
|
1825
|
-
{row.nombre}
|
|
1826
|
-
</span>
|
|
1827
|
-
<span className="text-xs font-normal text-content-secondary dark:text-content-secondary">
|
|
1828
|
-
{row.email}
|
|
1829
|
-
</span>
|
|
1830
|
-
</div>
|
|
1831
|
-
</div>
|
|
1832
|
-
)
|
|
1833
|
-
```
|
|
1834
|
-
|
|
1835
|
-
**Specifications:**
|
|
1836
|
-
- Avatar: `w-8 h-8` (32x32px), `rounded-full`, `object-cover`
|
|
1837
|
-
- Gap between avatar and text: `gap-2` (8px)
|
|
1838
|
-
- Name: `text-sm` (14px), normal weight
|
|
1839
|
-
- Email: `text-xs` (12px), secondary color
|
|
1840
|
-
|
|
1841
|
-
## Pattern 2: Pagination
|
|
1842
|
-
|
|
1843
|
-
Complete pagination system per Figma:
|
|
1844
|
-
|
|
1845
|
-
```tsx
|
|
1846
|
-
interface PaginationProps {
|
|
1847
|
-
currentPage: number; // Current page (1-indexed)
|
|
1848
|
-
totalPages: number; // Total pages
|
|
1849
|
-
onPageChange: (page: number) => void;
|
|
1850
|
-
previousLabel?: string; // Default: 'Anterior'
|
|
1851
|
-
nextLabel?: string; // Default: 'Siguiente'
|
|
1852
|
-
}
|
|
1853
|
-
|
|
1854
|
-
// Logic to generate page numbers
|
|
1855
|
-
const getPageNumbers = () => {
|
|
1856
|
-
const pages: (number | string)[] = [];
|
|
1857
|
-
|
|
1858
|
-
if (totalPages <= 7) {
|
|
1859
|
-
// Show all pages
|
|
1860
|
-
for (let i = 1; i <= totalPages; i++) {
|
|
1861
|
-
pages.push(i);
|
|
1862
|
-
}
|
|
1863
|
-
} else {
|
|
1864
|
-
// Format: 1 2 3 ... 65 66
|
|
1865
|
-
pages.push(1);
|
|
1866
|
-
|
|
1867
|
-
if (currentPage <= 3) {
|
|
1868
|
-
pages.push(2, 3);
|
|
1869
|
-
} else if (currentPage >= totalPages - 2) {
|
|
1870
|
-
pages.push('...');
|
|
1871
|
-
pages.push(totalPages - 2, totalPages - 1);
|
|
1872
|
-
} else {
|
|
1873
|
-
pages.push('...');
|
|
1874
|
-
pages.push(currentPage);
|
|
1875
|
-
pages.push('...');
|
|
1876
|
-
}
|
|
1877
|
-
|
|
1878
|
-
if (totalPages > 1) {
|
|
1879
|
-
pages.push(totalPages);
|
|
1880
|
-
}
|
|
1881
|
-
}
|
|
1882
|
-
|
|
1883
|
-
return pages;
|
|
1884
|
-
};
|
|
1885
|
-
```
|
|
1886
|
-
|
|
1887
|
-
**Specifications:**
|
|
1888
|
-
- "Previous/Next" button: `text-primary-custom-600`, hover `bg-blue-50`
|
|
1889
|
-
- Active number: `bg-blue-100 dark:bg-blue-900/30`
|
|
1890
|
-
- Inactive numbers: hover `bg-blue-50 dark:hover:bg-blue-900/20`
|
|
1891
|
-
- Icons: Arrow left/right 16x16px
|
|
1892
|
-
- Height: `h-9` (36px)
|
|
1893
|
-
|
|
1894
|
-
## Pattern 3: Zebra Striping (Alternating Rows)
|
|
1895
|
-
|
|
1896
|
-
Apply alternating background to even rows in tables:
|
|
1897
|
-
|
|
1898
|
-
```tsx
|
|
1899
|
-
// In TableCell component
|
|
1900
|
-
const stripedBg = isStriped && rowIndex % 2 === 1
|
|
1901
|
-
? 'bg-background-secondary dark:bg-dark-bg-primary/30'
|
|
1902
|
-
: '';
|
|
1903
|
-
|
|
1904
|
-
// Usage in Table
|
|
1905
|
-
{data.map((row, rowIndex) => (
|
|
1906
|
-
<TableCell
|
|
1907
|
-
key={rowIndex}
|
|
1908
|
-
isStriped={variant === 'striped'}
|
|
1909
|
-
rowIndex={rowIndex}
|
|
1910
|
-
>
|
|
1911
|
-
{content}
|
|
1912
|
-
</TableCell>
|
|
1913
|
-
))}
|
|
1914
|
-
```
|
|
1915
|
-
|
|
1916
|
-
**Specifications:**
|
|
1917
|
-
- Only even rows (indices 1, 3, 5...) have background
|
|
1918
|
-
- Light: `bg-background-secondary` (#fafafa)
|
|
1919
|
-
- Dark: `dark:bg-dark-bg-primary/30`
|
|
1920
|
-
- Activated with `variant="striped"`
|
|
1921
|
-
|
|
1922
|
-
## Pattern 4: Status Badges
|
|
1923
|
-
|
|
1924
|
-
Badges for showing status (online/offline, active/inactive, etc.):
|
|
1925
|
-
|
|
1926
|
-
```tsx
|
|
1927
|
-
// Online Badge (green/lime)
|
|
1928
|
-
<span className="
|
|
1929
|
-
inline-flex
|
|
1930
|
-
items-center
|
|
1931
|
-
px-1.5
|
|
1932
|
-
py-1
|
|
1933
|
-
rounded-md
|
|
1934
|
-
text-xs
|
|
1935
|
-
font-normal
|
|
1936
|
-
bg-lime-100
|
|
1937
|
-
text-lime-700
|
|
1938
|
-
dark:bg-lime-900/30
|
|
1939
|
-
dark:text-lime-400
|
|
1940
|
-
">
|
|
1941
|
-
Online
|
|
1942
|
-
</span>
|
|
1943
|
-
|
|
1944
|
-
// Offline Badge (gray/zinc)
|
|
1945
|
-
<span className="
|
|
1946
|
-
inline-flex
|
|
1947
|
-
items-center
|
|
1948
|
-
px-1.5
|
|
1949
|
-
py-1
|
|
1950
|
-
rounded-md
|
|
1951
|
-
text-xs
|
|
1952
|
-
font-normal
|
|
1953
|
-
bg-zinc-100
|
|
1954
|
-
text-zinc-600
|
|
1955
|
-
dark:bg-zinc-800/30
|
|
1956
|
-
dark:text-zinc-400
|
|
1957
|
-
">
|
|
1958
|
-
Offline
|
|
1959
|
-
</span>
|
|
1960
|
-
```
|
|
1961
|
-
|
|
1962
|
-
**Specifications:**
|
|
1963
|
-
- Padding: `px-1.5 py-1` (6px horizontal, 4px vertical)
|
|
1964
|
-
- Border radius: `rounded-md` (6px)
|
|
1965
|
-
- Text: `text-xs` (12px), normal weight
|
|
1966
|
-
- Colors by state: lime (success), zinc (neutral), red (error)
|
|
1967
|
-
|
|
1968
|
-
## Pattern 5: Icon System - Heroicons Micro
|
|
1969
|
-
|
|
1970
|
-
**🔴 MANDATORY STANDARD**: All components MUST use **Heroicons Micro** (16x16px).
|
|
1971
|
-
|
|
1972
|
-
### Technical Specifications
|
|
1973
|
-
|
|
1974
|
-
```tsx
|
|
1975
|
-
import React from 'react';
|
|
1976
|
-
|
|
1977
|
-
/**
|
|
1978
|
-
* Standard pattern for icons in Siesa UI Kit
|
|
1979
|
-
* Based on Heroicons Micro (16x16px)
|
|
1980
|
-
*/
|
|
1981
|
-
export const IconExample: React.FC<{ className?: string }> = ({ className = '' }) => {
|
|
1982
|
-
return (
|
|
1983
|
-
<svg
|
|
1984
|
-
className={className}
|
|
1985
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
1986
|
-
viewBox="0 0 16 16"
|
|
1987
|
-
fill="currentColor"
|
|
1988
|
-
aria-hidden="true"
|
|
1989
|
-
>
|
|
1990
|
-
<path
|
|
1991
|
-
fillRule="evenodd"
|
|
1992
|
-
d="..."
|
|
1993
|
-
clipRule="evenodd"
|
|
1994
|
-
/>
|
|
1995
|
-
</svg>
|
|
1996
|
-
);
|
|
1997
|
-
};
|
|
1998
|
-
```
|
|
1999
|
-
|
|
2000
|
-
### Mandatory Features
|
|
2001
|
-
|
|
2002
|
-
1. **viewBox**: Always `"0 0 16 16"` (16x16px)
|
|
2003
|
-
2. **fill**: Always `"currentColor"` (inherits from text)
|
|
2004
|
-
3. **xmlns**: Always `"http://www.w3.org/2000/svg"`
|
|
2005
|
-
4. **aria-hidden**: Always `"true"` for accessibility
|
|
2006
|
-
5. **className prop**: Accept `className` to allow dynamic styles
|
|
2007
|
-
6. **fillRule/clipRule**: Use when applicable for complex paths
|
|
2008
|
-
|
|
2009
|
-
### Common Icon Examples
|
|
2010
|
-
|
|
2011
|
-
```tsx
|
|
2012
|
-
// ChevronDownIcon (for dropdowns/selects)
|
|
2013
|
-
export const ChevronDownIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
|
|
2014
|
-
<svg
|
|
2015
|
-
className={className}
|
|
2016
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
2017
|
-
viewBox="0 0 16 16"
|
|
2018
|
-
fill="currentColor"
|
|
2019
|
-
aria-hidden="true"
|
|
2020
|
-
>
|
|
2021
|
-
<path
|
|
2022
|
-
fillRule="evenodd"
|
|
2023
|
-
d="M4.22 6.22a.75.75 0 0 1 1.06 0L8 8.94l2.72-2.72a.75.75 0 1 1 1.06 1.06l-3.25 3.25a.75.75 0 0 1-1.06 0L4.22 7.28a.75.75 0 0 1 0-1.06Z"
|
|
2024
|
-
clipRule="evenodd"
|
|
2025
|
-
/>
|
|
2026
|
-
</svg>
|
|
2027
|
-
);
|
|
2028
|
-
|
|
2029
|
-
// CheckIcon (for selections/confirmations)
|
|
2030
|
-
export const CheckIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
|
|
2031
|
-
<svg
|
|
2032
|
-
className={className}
|
|
2033
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
2034
|
-
viewBox="0 0 16 16"
|
|
2035
|
-
fill="currentColor"
|
|
2036
|
-
aria-hidden="true"
|
|
2037
|
-
>
|
|
2038
|
-
<path
|
|
2039
|
-
fillRule="evenodd"
|
|
2040
|
-
d="M12.416 3.376a.75.75 0 0 1 .208 1.04l-5 7.5a.75.75 0 0 1-1.154.114l-3-3a.75.75 0 0 1 1.06-1.06l2.353 2.353 4.493-6.74a.75.75 0 0 1 1.04-.207Z"
|
|
2041
|
-
clipRule="evenodd"
|
|
2042
|
-
/>
|
|
2043
|
-
</svg>
|
|
2044
|
-
);
|
|
2045
|
-
|
|
2046
|
-
// MagnifyingGlassIcon (for search)
|
|
2047
|
-
export const MagnifyingGlassIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
|
|
2048
|
-
<svg
|
|
2049
|
-
className={className}
|
|
2050
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
2051
|
-
viewBox="0 0 16 16"
|
|
2052
|
-
fill="currentColor"
|
|
2053
|
-
aria-hidden="true"
|
|
2054
|
-
>
|
|
2055
|
-
<path
|
|
2056
|
-
fillRule="evenodd"
|
|
2057
|
-
d="M9.965 11.026a5 5 0 1 1 1.06-1.06l2.755 2.754a.75.75 0 1 1-1.06 1.06l-2.755-2.754ZM10.5 7a3.5 3.5 0 1 1-7 0 3.5 3.5 0 0 1 7 0Z"
|
|
2058
|
-
clipRule="evenodd"
|
|
2059
|
-
/>
|
|
2060
|
-
</svg>
|
|
2061
|
-
);
|
|
2062
|
-
```
|
|
2063
|
-
|
|
2064
|
-
### Icon Location
|
|
2065
|
-
|
|
2066
|
-
For components that require icons, create them in `icons.tsx`:
|
|
2067
|
-
|
|
2068
|
-
```
|
|
2069
|
-
src/components/[ComponentName]/
|
|
2070
|
-
├── [ComponentName].tsx
|
|
2071
|
-
├── [ComponentName].types.ts
|
|
2072
|
-
├── [ComponentName].stories.tsx
|
|
2073
|
-
├── icons.tsx ← Component icons
|
|
2074
|
-
├── index.ts
|
|
2075
|
-
└── README.md
|
|
2076
|
-
```
|
|
2077
|
-
|
|
2078
|
-
### Exception: POSTable
|
|
2079
|
-
|
|
2080
|
-
**⚠️ IMPORTANT**: The `POSTable` component has custom icons that should NOT be replaced with Heroicons Micro. This is by specific client design.
|
|
2081
|
-
|
|
2082
|
-
### Complete Reference
|
|
2083
|
-
|
|
2084
|
-
To see all available Heroicons Micro icons, check:
|
|
2085
|
-
- **Local documentation**: `docs/icons.md`
|
|
2086
|
-
- **Official source**: [Heroicons](https://heroicons.com/) - "16x16 Micro" section
|
|
2087
|
-
|
|
2088
|
-
### Icons Checklist
|
|
2089
|
-
|
|
2090
|
-
- [ ] viewBox is `"0 0 16 16"`
|
|
2091
|
-
- [ ] fill is `"currentColor"`
|
|
2092
|
-
- [ ] Includes `xmlns="http://www.w3.org/2000/svg"`
|
|
2093
|
-
- [ ] Includes `aria-hidden="true"`
|
|
2094
|
-
- [ ] Accepts `className` prop
|
|
2095
|
-
- [ ] Uses TypeScript: `React.FC<{ className?: string }>`
|
|
2096
|
-
- [ ] Paths use `fillRule` and `clipRule` when applicable
|
|
2097
|
-
- [ ] Does NOT use stroke (except custom POSTable)
|
|
2098
|
-
|
|
2099
|
-
## Pattern 6: Standard Backgrounds for POS Views
|
|
2100
|
-
|
|
2101
|
-
**🔴 CRITICAL RULE**: All POS views must use consistent backgrounds to maintain visual coherence.
|
|
2102
|
-
|
|
2103
|
-
### Background Structure for POS Views
|
|
2104
|
-
|
|
2105
|
-
```tsx
|
|
2106
|
-
// ===== MAIN VIEW CONTAINER =====
|
|
2107
|
-
<div className="
|
|
2108
|
-
min-h-screen
|
|
2109
|
-
w-full
|
|
2110
|
-
bg-background-secondary // ✅ Main view background
|
|
2111
|
-
dark:bg-dark-bg-primary
|
|
2112
|
-
flex
|
|
2113
|
-
flex-col
|
|
2114
|
-
">
|
|
2115
|
-
{/* Navbar */}
|
|
2116
|
-
<Navbar
|
|
2117
|
-
className="bg-background-secondary dark:bg-dark-bg-primary" // ✅ Same background
|
|
2118
|
-
/>
|
|
2119
|
-
|
|
2120
|
-
{/* Content */}
|
|
2121
|
-
<div className="flex flex-1">
|
|
2122
|
-
{/* Left sidebar - inherits background */}
|
|
2123
|
-
<div className="w-[245px] p-4">
|
|
2124
|
-
{/* ... */}
|
|
2125
|
-
</div>
|
|
2126
|
-
|
|
2127
|
-
{/* Central area with white background */}
|
|
2128
|
-
<div className="
|
|
2129
|
-
flex-1
|
|
2130
|
-
bg-white // ✅ Main content area
|
|
2131
|
-
dark:bg-dark-bg-primary
|
|
2132
|
-
rounded-tl-3xl
|
|
2133
|
-
rounded-tr-3xl
|
|
2134
|
-
">
|
|
2135
|
-
{/* Inner area with secondary background */}
|
|
2136
|
-
<div className="
|
|
2137
|
-
bg-background-secondary // ✅ Background for inner areas
|
|
2138
|
-
dark:bg-dark-bg-secondary
|
|
2139
|
-
rounded-xl
|
|
2140
|
-
">
|
|
2141
|
-
{/* Table grid, products, etc. */}
|
|
2142
|
-
</div>
|
|
2143
|
-
</div>
|
|
2144
|
-
|
|
2145
|
-
{/* Right sidebar - inherits background */}
|
|
2146
|
-
<div className="w-[304px] p-4">
|
|
2147
|
-
{/* ... */}
|
|
2148
|
-
</div>
|
|
2149
|
-
</div>
|
|
2150
|
-
</div>
|
|
2151
|
-
```
|
|
2152
|
-
|
|
2153
|
-
### Background Tokens by Level
|
|
2154
|
-
|
|
2155
|
-
| Level | Light Mode | Dark Mode | Use |
|
|
2156
|
-
|-------|------------|-----------|-----|
|
|
2157
|
-
| **Level 1** (View) | `bg-background-secondary` | `dark:bg-dark-bg-primary` | Main container, Navbar, Sidebars |
|
|
2158
|
-
| **Level 2** (Card) | `bg-white` | `dark:bg-dark-bg-primary` | Content areas with rounded borders |
|
|
2159
|
-
| **Level 3** (Inner) | `bg-background-secondary` | `dark:bg-dark-bg-secondary` | Table grid, inner areas |
|
|
2160
|
-
|
|
2161
|
-
### ❌ Common Mistakes
|
|
2162
|
-
|
|
2163
|
-
```tsx
|
|
2164
|
-
// ❌ BAD - Use background-tertiary (does NOT exist or is inconsistent)
|
|
2165
|
-
<div className="bg-background-tertiary dark:bg-dark-bg-primary">
|
|
2166
|
-
|
|
2167
|
-
// ❌ BAD - Use direct colors
|
|
2168
|
-
<div className="bg-gray-100 dark:bg-zinc-900">
|
|
2169
|
-
|
|
2170
|
-
// ❌ BAD - Navbar with different background than view
|
|
2171
|
-
<div className="bg-background-secondary">
|
|
2172
|
-
<Navbar className="bg-white" /> // ❌ Inconsistent
|
|
2173
|
-
</div>
|
|
2174
|
-
|
|
2175
|
-
// ✅ GOOD - Use consistent system tokens
|
|
2176
|
-
<div className="bg-background-secondary dark:bg-dark-bg-primary">
|
|
2177
|
-
<Navbar className="bg-background-secondary dark:bg-dark-bg-primary" />
|
|
2178
|
-
</div>
|
|
2179
|
-
```
|
|
2180
|
-
|
|
2181
|
-
### Reference Views
|
|
2182
|
-
|
|
2183
|
-
| View | File | Description |
|
|
2184
|
-
|------|------|-------------|
|
|
2185
|
-
| TableLayoutView | `src/views/TableLayoutView/` | Table view - **MAIN REFERENCE** |
|
|
2186
|
-
| ProductsView | `src/views/ProductsView/` | POS products view |
|
|
2187
|
-
|
|
2188
|
-
### View Backgrounds Checklist
|
|
2189
|
-
|
|
2190
|
-
- [ ] Main container uses `bg-background-secondary dark:bg-dark-bg-primary`
|
|
2191
|
-
- [ ] Navbar uses same background as main container
|
|
2192
|
-
- [ ] Content areas (cards) use `bg-white dark:bg-dark-bg-primary`
|
|
2193
|
-
- [ ] Inner areas (grids) use `bg-background-secondary dark:bg-dark-bg-secondary`
|
|
2194
|
-
- [ ] Do NOT use `bg-background-tertiary` (use `bg-background-secondary`)
|
|
2195
|
-
- [ ] Verify visual consistency with `TableLayoutView` as reference
|
|
2196
|
-
|
|
2197
|
-
---
|
|
2198
|
-
|
|
2199
|
-
# 🚀 Common Use Cases
|
|
2200
|
-
|
|
2201
|
-
## Case 1: "Create component [X]"
|
|
2202
|
-
|
|
2203
|
-
**Process:**
|
|
2204
|
-
1. Read relevant docs (colors.md, typography.md, etc.)
|
|
2205
|
-
2. Review Button as reference
|
|
2206
|
-
3. Create file structure
|
|
2207
|
-
4. Implement with dark mode from start
|
|
2208
|
-
5. Create TypeScript types
|
|
2209
|
-
6. Create complete stories
|
|
2210
|
-
7. Run build
|
|
2211
|
-
8. Test in Storybook
|
|
2212
|
-
9. Create README
|
|
2213
|
-
10. Report result
|
|
2214
|
-
|
|
2215
|
-
## Case 2: "Validate [Component] against Figma"
|
|
2216
|
-
|
|
2217
|
-
**Process:**
|
|
2218
|
-
1. Get nodeId from URL
|
|
2219
|
-
2. Extract metadata with get_metadata
|
|
2220
|
-
3. Identify Light/Dark nodes
|
|
2221
|
-
4. Extract specs with get_design_context
|
|
2222
|
-
5. Compare colors, sizes, spacing
|
|
2223
|
-
6. Map to system tokens
|
|
2224
|
-
7. Fix discrepancies
|
|
2225
|
-
8. Run build
|
|
2226
|
-
9. Test in Storybook
|
|
2227
|
-
10. Report changes
|
|
2228
|
-
|
|
2229
|
-
## Case 3: "Texts not visible in dark mode"
|
|
2230
|
-
|
|
2231
|
-
**Process:**
|
|
2232
|
-
1. Open [Component].stories.tsx
|
|
2233
|
-
2. Find UI/text elements
|
|
2234
|
-
3. Apply patterns:
|
|
2235
|
-
- Titles: `text-gray-700 dark:text-white`
|
|
2236
|
-
- Secondary: `text-gray-500 dark:text-gray-300`
|
|
2237
|
-
- Tips: `bg-blue-50 dark:bg-blue-900/20`
|
|
2238
|
-
- Cards: `bg-white dark:bg-gray-800`
|
|
2239
|
-
- Borders: `border-gray-200 dark:border-gray-700`
|
|
2240
|
-
4. Run build
|
|
2241
|
-
5. Verify in Storybook
|
|
2242
|
-
6. Report fixed elements
|
|
2243
|
-
|
|
2244
|
-
## Case 4: "Update [topic] documentation"
|
|
2245
|
-
|
|
2246
|
-
**Process:**
|
|
2247
|
-
1. Read docs/[topic].md file
|
|
2248
|
-
2. Identify section to update
|
|
2249
|
-
3. Add content following structure
|
|
2250
|
-
4. Include:
|
|
2251
|
-
- Code examples
|
|
2252
|
-
- Clear explanations
|
|
2253
|
-
- Reference table
|
|
2254
|
-
- Checklist if applicable
|
|
2255
|
-
5. Update TOC if needed
|
|
2256
|
-
6. Report changes
|
|
2257
|
-
|
|
2258
|
-
## Case 5: "Hover doesn't match Figma"
|
|
2259
|
-
|
|
2260
|
-
**Process:**
|
|
2261
|
-
1. Get nodeId from Figma URL
|
|
2262
|
-
2. Use `get_design_context` to extract specific states:
|
|
2263
|
-
- Default state
|
|
2264
|
-
- Hover state
|
|
2265
|
-
- Focus state (if applicable)
|
|
2266
|
-
3. Identify exact hover colors in Figma
|
|
2267
|
-
4. Compare with current implementation
|
|
2268
|
-
5. Use Tailwind arbitrary values if color isn't in tokens:
|
|
2269
|
-
```tsx
|
|
2270
|
-
// Example: Switch with specific hover
|
|
2271
|
-
peer-hover:border-[#b6b6b9] // OFF hover (dark gray)
|
|
2272
|
-
peer-hover:border-[#307cc5] // ON hover (dark blue)
|
|
2273
|
-
```
|
|
2274
|
-
6. Apply hover to ALL affected elements (track, button, border)
|
|
2275
|
-
7. Change transition from `transition-transform` to `transition-all` if animating multiple properties
|
|
2276
|
-
8. Run build
|
|
2277
|
-
9. Verify in Storybook with hover mode
|
|
2278
|
-
10. Report changes with specifications table
|
|
2279
|
-
|
|
2280
|
-
**Reference Example:** `src/components/Switch/Switch.tsx`
|
|
2281
|
-
|
|
2282
|
-
---
|
|
2283
|
-
|
|
2284
|
-
# 🎓 Reference Resources
|
|
2285
|
-
|
|
2286
|
-
**When you need to remember something:**
|
|
2287
|
-
|
|
2288
|
-
| Topic | File |
|
|
2289
|
-
|-------|------|
|
|
2290
|
-
| Colors | `docs/colors.md` |
|
|
2291
|
-
| Dark Mode | `docs/dark-mode-guide.md` |
|
|
2292
|
-
| Typography | `docs/typography.md` |
|
|
2293
|
-
| Spacing | `docs/spacing.md` |
|
|
2294
|
-
| Shadows | `docs/shadows.md` |
|
|
2295
|
-
| Border Radius | `docs/border-radius.md` |
|
|
2296
|
-
| Filters | `docs/filters.md` |
|
|
2297
|
-
| Icons | `docs/icons.md` |
|
|
2298
|
-
| Button Example | `src/components/Button/` |
|
|
2299
|
-
| Table Example | `src/components/Table/` |
|
|
2300
|
-
| Switch Example | `src/components/Switch/` (specific hover, controlled state) |
|
|
2301
|
-
| Quantity Example | `src/components/Quantity/` (focus with border-2, exact state colors) |
|
|
2302
|
-
| Configuration | `tailwind.config.js` |
|
|
2303
|
-
|
|
2304
|
-
---
|
|
2305
|
-
|
|
2306
|
-
# ❌ Things You Should NEVER Do
|
|
2307
|
-
|
|
2308
|
-
1. ❌ Create components without dark mode
|
|
2309
|
-
2. ❌ Use direct colors (e.g.: `bg-blue-500`) for system colors
|
|
2310
|
-
3. ❌ Forget to run `npm run build`
|
|
2311
|
-
4. ❌ Create .tsx without .types.ts
|
|
2312
|
-
5. ❌ Stories without dark mode in UI
|
|
2313
|
-
6. ❌ Modify `tailwind.config.js` without consulting
|
|
2314
|
-
7. ❌ Ignore Figma specs or approximate colors when Figma specifies exact values
|
|
2315
|
-
8. ❌ Components without JSDoc
|
|
2316
|
-
9. ❌ Props without defaults
|
|
2317
|
-
10. ❌ Incorrect modifier order
|
|
2318
|
-
11. ❌ **Create "Dark Mode Comparison" story** (Storybook already has theme selector)
|
|
2319
|
-
12. ❌ **Create "Mobile" story for views** (Views should be responsive automatically)
|
|
2320
|
-
13. ❌ **Create "MobileVariant" story for views** (Do NOT use variant prop in stories)
|
|
2321
|
-
14. ❌ **Create "DesktopVariant" story for views** (Do NOT use variant prop in stories)
|
|
2322
|
-
15. ❌ **Excessive documentation in stories** (Only brief component/view description)
|
|
2323
|
-
16. ❌ **Use incorrect casing in file names** (ALWAYS verify with `git ls-files` before editing)
|
|
2324
|
-
17. ❌ **Playground without sync** (Controlled components MUST use useEffect to sync args)
|
|
2325
|
-
18. ❌ **Forget hover on child elements** (If track has hover, button/circle must have it too)
|
|
2326
|
-
19. ❌ **Use ring-2 when Figma specifies border-2** (Always verify focus type in design)
|
|
2327
|
-
20. ❌ **Approximate interactive state colors** (Extract exact values from Figma, use `border-[#hexcode]`)
|
|
2328
|
-
21. ❌ **Reimplement existing components in views** (ALWAYS use components from `src/components/`, extend them if needed)
|
|
2329
|
-
22. ❌ **Use `bg-background-tertiary` in POS views** (ALWAYS use `bg-background-secondary` for consistency with TableLayoutView)
|
|
2330
|
-
|
|
2331
|
-
---
|
|
2332
|
-
|
|
2333
|
-
# 💡 Excellence Philosophy
|
|
2334
|
-
|
|
2335
|
-
Your mission is to maintain the **Siesa UI Kit** as an example of frontend development excellence:
|
|
2336
|
-
|
|
2337
|
-
## Fundamental Principles
|
|
2338
|
-
|
|
2339
|
-
1. **Quality over speed**: Prefer doing it right over doing it fast
|
|
2340
|
-
2. **Consistency is key**: Follow established patterns
|
|
2341
|
-
3. **Documentation is code**: Document while developing
|
|
2342
|
-
4. **Dark mode is not optional**: It's a fundamental part of the system
|
|
2343
|
-
5. **Pixel-perfect matters**: Details make the difference
|
|
2344
|
-
6. **Type safety saves lives**: Strict TypeScript always
|
|
2345
|
-
7. **Accessibility is a right**: ARIA labels on interactive elements
|
|
2346
|
-
8. **Constant validation**: Build after every change
|
|
2347
|
-
|
|
2348
|
-
## Your Commitment
|
|
2349
|
-
|
|
2350
|
-
- 🎯 Implement exact designs per Figma
|
|
2351
|
-
- 🌓 Complete dark mode from the start
|
|
2352
|
-
- 📘 Strict TypeScript without exceptions
|
|
2353
|
-
- 📚 Complete and clear documentation
|
|
2354
|
-
- ✅ Constant validation with build
|
|
2355
|
-
- 🎨 Correct use of system tokens
|
|
2356
|
-
- ♿ Accessibility in all components
|
|
2357
|
-
- 🚀 Excellence in every line of code
|
|
2358
|
-
|
|
2359
|
-
---
|
|
2360
|
-
|
|
2361
|
-
**You are the guardian of Siesa UI Kit quality.**
|
|
2362
|
-
**Every component you create should be an example of best practices.**
|
|
2363
|
-
**Excellence is not an act, it's a habit.**
|
|
2364
|
-
|
|
2365
|
-
🚀 **Go ahead, create exceptional components!**
|
|
2366
|
-
|
|
2367
|
-
---
|
|
2368
|
-
|
|
2369
|
-
**Agent Version**: 1.5.0
|
|
2370
|
-
**Last updated**: 2025-12-02
|
|
2371
|
-
**Maintained by**: Siesa UI Kit Team
|
|
2372
|
-
|
|
2373
|
-
**Changes in v1.5.0**:
|
|
2374
|
-
- Added Pattern 6: Standard Backgrounds for POS Views
|
|
2375
|
-
- Added background structure by levels (View, Card, Inner)
|
|
2376
|
-
- Added background token table by level with examples
|
|
2377
|
-
- Added TableLayoutView as main reference view
|
|
2378
|
-
- Added Error #22: Use `bg-background-tertiary` in POS views
|
|
2379
|
-
- Added specific checklist for view backgrounds
|
|
2380
|
-
|
|
2381
|
-
**Changes in v1.4.0**:
|
|
2382
|
-
- Added "CRITICAL RULE: COMPONENT REUSE" section in Views Implementation
|
|
2383
|
-
- Added mandatory reuse checklist before creating views
|
|
2384
|
-
- Added Figma Element → System Component mapping table
|
|
2385
|
-
- Added ProductsView example with correct vs incorrect pattern
|
|
2386
|
-
- Added guide for extending existing components (example: Navbar with role)
|
|
2387
|
-
- Added Error #21: Reimplement existing components in views
|
|
2388
|
-
|
|
2389
|
-
**Changes in v1.3.0**:
|
|
2390
|
-
- Added Error #13: Focus with border-2 vs ring-2 (key difference and when to use each)
|
|
2391
|
-
- Added Error #14: Specific interactive state colors with arbitrary values
|
|
2392
|
-
- Added reference table: ring-2 vs border-2 by component type
|
|
2393
|
-
- Added Quantity as reference example (focus with border-2)
|
|
2394
|
-
- Added 2 new common errors: use ring when Figma specifies border, approximate state colors
|
|
2395
|
-
|
|
2396
|
-
**Changes in v1.2.0**:
|
|
2397
|
-
- Added interactive Playground pattern with state synchronization (useEffect)
|
|
2398
|
-
- Added guide for using Tailwind arbitrary values for Figma-specific colors
|
|
2399
|
-
- Added use case "Hover doesn't match Figma"
|
|
2400
|
-
- Added Switch as reference example (specific hover, controlled state)
|
|
2401
|
-
- Added 3 new common errors: Playground without sync, approximate colors, forget hover on child elements
|