react-miui 0.0.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +46 -0
- package/README.md +10 -1
- package/assets/back.svg +1 -0
- package/dist/components/form/Checkbox.module.scss +13 -6
- package/dist/components/form/Toggle.d.ts +8 -0
- package/dist/components/form/Toggle.d.ts.map +1 -0
- package/dist/components/form/Toggle.js +40 -0
- package/dist/components/form/Toggle.js.map +1 -0
- package/dist/components/form/Toggle.module.scss +46 -0
- package/dist/components/icons/Back.d.ts +7 -0
- package/dist/components/icons/Back.d.ts.map +1 -0
- package/dist/components/icons/Back.js +13 -0
- package/dist/components/icons/Back.js.map +1 -0
- package/dist/components/icons/Checkmark.d.ts.map +1 -1
- package/dist/components/icons/Checkmark.js.map +1 -1
- package/dist/components/icons/Icon.d.ts +12 -0
- package/dist/components/icons/Icon.d.ts.map +1 -0
- package/dist/components/icons/Icon.js +40 -0
- package/dist/components/icons/Icon.js.map +1 -0
- package/dist/components/layout/header/Header.d.ts +13 -0
- package/dist/components/layout/header/Header.d.ts.map +1 -0
- package/dist/components/layout/header/Header.js +43 -0
- package/dist/components/layout/header/Header.js.map +1 -0
- package/dist/components/layout/header/Header.module.scss +89 -0
- package/dist/components/layout/header/HeaderIconAction.d.ts +17 -0
- package/dist/components/layout/header/HeaderIconAction.d.ts.map +1 -0
- package/dist/components/layout/header/HeaderIconAction.js +40 -0
- package/dist/components/layout/header/HeaderIconAction.js.map +1 -0
- package/dist/components/layout/header/HeaderIconAction.module.scss +22 -0
- package/dist/components/layout/header/StickyHeader.d.ts +10 -0
- package/dist/components/layout/header/StickyHeader.d.ts.map +1 -0
- package/dist/components/layout/header/StickyHeader.js +34 -0
- package/dist/components/layout/header/StickyHeader.js.map +1 -0
- package/dist/components/layout/header/StickyHeader.module.scss +18 -0
- package/dist/components/layout/list/Item.d.ts +14 -0
- package/dist/components/layout/list/Item.d.ts.map +1 -0
- package/dist/components/layout/list/Item.js +50 -0
- package/dist/components/layout/list/Item.js.map +1 -0
- package/dist/components/layout/list/Item.module.scss +23 -0
- package/dist/components/layout/list/List.d.ts +4 -0
- package/dist/components/layout/list/List.d.ts.map +1 -0
- package/dist/components/layout/list/List.js +13 -0
- package/dist/components/layout/list/List.js.map +1 -0
- package/dist/components/layout/list/List.module.scss +4 -0
- package/dist/components/ui/action/Action.d.ts +17 -0
- package/dist/components/ui/action/Action.d.ts.map +1 -0
- package/dist/components/ui/action/Action.js +44 -0
- package/dist/components/ui/action/Action.js.map +1 -0
- package/dist/components/ui/action/Action.module.scss +26 -0
- package/dist/components/ui/action/EqualActions.d.ts +7 -0
- package/dist/components/ui/action/EqualActions.d.ts.map +1 -0
- package/dist/components/ui/action/EqualActions.js +23 -0
- package/dist/components/ui/action/EqualActions.js.map +1 -0
- package/dist/components/ui/action/EqualActions.module.scss +6 -0
- package/dist/components/ui/button/Button.d.ts +8 -0
- package/dist/components/ui/button/Button.d.ts.map +1 -0
- package/dist/components/ui/button/Button.js +20 -0
- package/dist/components/ui/button/Button.js.map +1 -0
- package/dist/components/ui/button/Button.module.scss +25 -0
- package/dist/components/ui/directionPad/Button.d.ts +7 -0
- package/dist/components/ui/directionPad/Button.d.ts.map +1 -0
- package/dist/components/ui/directionPad/Button.js +14 -0
- package/dist/components/ui/directionPad/Button.js.map +1 -0
- package/dist/components/ui/directionPad/Middle.d.ts +8 -0
- package/dist/components/ui/directionPad/Middle.d.ts.map +1 -0
- package/dist/components/ui/directionPad/Middle.js +13 -0
- package/dist/components/ui/directionPad/Middle.js.map +1 -0
- package/dist/components/ui/directionPad/Pad.d.ts +12 -0
- package/dist/components/ui/directionPad/Pad.d.ts.map +1 -0
- package/dist/components/ui/directionPad/Pad.js +23 -0
- package/dist/components/ui/directionPad/Pad.js.map +1 -0
- package/dist/components/ui/directionPad/Pad.module.scss +45 -0
- package/dist/demo/Demo.d.ts.map +1 -1
- package/dist/demo/Demo.js +2 -1
- package/dist/demo/Demo.js.map +1 -1
- package/dist/demo/Main.d.ts.map +1 -1
- package/dist/demo/Main.js +36 -8
- package/dist/demo/Main.js.map +1 -1
- package/dist/demo/Main.module.scss +13 -0
- package/dist/demo/Menu.d.ts +6 -1
- package/dist/demo/Menu.d.ts.map +1 -1
- package/dist/demo/Menu.js +20 -4
- package/dist/demo/Menu.js.map +1 -1
- package/dist/demo/Menu.module.scss +30 -8
- package/dist/demo/components/form/Checkbox.d.ts.map +1 -1
- package/dist/demo/components/form/Checkbox.js +3 -2
- package/dist/demo/components/form/Checkbox.js.map +1 -1
- package/dist/demo/components/form/Toggle.d.ts +4 -0
- package/dist/demo/components/form/Toggle.d.ts.map +1 -0
- package/dist/demo/components/form/Toggle.js +65 -0
- package/dist/demo/components/form/Toggle.js.map +1 -0
- package/dist/demo/components/form/Toggle.module.scss +5 -0
- package/dist/demo/components/layout/header/Header.d.ts +8 -0
- package/dist/demo/components/layout/header/Header.d.ts.map +1 -0
- package/dist/demo/components/layout/header/Header.js +60 -0
- package/dist/demo/components/layout/header/Header.js.map +1 -0
- package/dist/demo/components/layout/header/StickyHeader.d.ts +9 -0
- package/dist/demo/components/layout/header/StickyHeader.d.ts.map +1 -0
- package/dist/demo/components/layout/header/StickyHeader.js +73 -0
- package/dist/demo/components/layout/header/StickyHeader.js.map +1 -0
- package/dist/demo/components/layout/list/List.Item.d.ts +4 -0
- package/dist/demo/components/layout/list/List.Item.d.ts.map +1 -0
- package/dist/demo/components/layout/list/List.Item.js +42 -0
- package/dist/demo/components/layout/list/List.Item.js.map +1 -0
- package/dist/demo/components/layout/list/List.Item.module.scss +3 -0
- package/dist/demo/components/ui/action/Action.d.ts +8 -0
- package/dist/demo/components/ui/action/Action.d.ts.map +1 -0
- package/dist/demo/components/ui/action/Action.js +83 -0
- package/dist/demo/components/ui/action/Action.js.map +1 -0
- package/dist/demo/components/ui/action/ActionDemo.module.scss +3 -0
- package/dist/demo/components/ui/button/ButtonDemo.d.ts +4 -0
- package/dist/demo/components/ui/button/ButtonDemo.d.ts.map +1 -0
- package/dist/demo/components/ui/button/ButtonDemo.js +20 -0
- package/dist/demo/components/ui/button/ButtonDemo.js.map +1 -0
- package/dist/demo/components/ui/directionPad/Pad.d.ts +4 -0
- package/dist/demo/components/ui/directionPad/Pad.d.ts.map +1 -0
- package/dist/demo/components/ui/directionPad/Pad.js +49 -0
- package/dist/demo/components/ui/directionPad/Pad.js.map +1 -0
- package/dist/demo/components/ui/icons/Icons.d.ts +4 -0
- package/dist/demo/components/ui/icons/Icons.d.ts.map +1 -0
- package/dist/demo/components/ui/icons/Icons.js +20 -0
- package/dist/demo/components/ui/icons/Icons.js.map +1 -0
- package/dist/demo/components/ui/icons/Icons.module.scss +4 -0
- package/dist/demo/componentsMap.d.ts +13 -0
- package/dist/demo/componentsMap.d.ts.map +1 -0
- package/dist/demo/componentsMap.js +112 -0
- package/dist/demo/componentsMap.js.map +1 -0
- package/dist/demo/utils/makeVariants.d.ts +3 -0
- package/dist/demo/utils/makeVariants.d.ts.map +1 -0
- package/dist/demo/utils/makeVariants.js +14 -0
- package/dist/demo/utils/makeVariants.js.map +1 -0
- package/dist/global.scss +34 -13
- package/dist/index.d.ts +8 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/pages/_app.d.ts.map +1 -1
- package/dist/pages/_app.js +5 -1
- package/dist/pages/_app.js.map +1 -1
- package/dist/pages/react-miui.d.ts +4 -0
- package/dist/pages/react-miui.d.ts.map +1 -0
- package/dist/pages/react-miui.js +11 -0
- package/dist/pages/react-miui.js.map +1 -0
- package/dist/types.d.ts +4 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/docs/assets/js/search.js +1 -1
- package/docs/assets/js/search.json +1 -1
- package/docs/enums/ICON.html +182 -0
- package/docs/index.html +38 -5
- package/docs/modules/StickyHeader.html +159 -0
- package/docs/modules.html +121 -5
- package/docs/pages/Tutorials/Test.html +6 -3
- package/esm/components/form/Checkbox.module.scss +13 -6
- package/esm/components/form/Toggle.d.ts +8 -0
- package/esm/components/form/Toggle.d.ts.map +1 -0
- package/esm/components/form/Toggle.js +15 -0
- package/esm/components/form/Toggle.js.map +1 -0
- package/esm/components/form/Toggle.module.scss +46 -0
- package/esm/components/icons/Back.d.ts +7 -0
- package/esm/components/icons/Back.d.ts.map +1 -0
- package/esm/components/icons/Back.js +7 -0
- package/esm/components/icons/Back.js.map +1 -0
- package/esm/components/icons/Checkmark.d.ts.map +1 -1
- package/esm/components/icons/Checkmark.js.map +1 -1
- package/esm/components/icons/Icon.d.ts +12 -0
- package/esm/components/icons/Icon.d.ts.map +1 -0
- package/esm/components/icons/Icon.js +21 -0
- package/esm/components/icons/Icon.js.map +1 -0
- package/esm/components/layout/header/Header.d.ts +13 -0
- package/esm/components/layout/header/Header.d.ts.map +1 -0
- package/esm/components/layout/header/Header.js +37 -0
- package/esm/components/layout/header/Header.js.map +1 -0
- package/esm/components/layout/header/Header.module.scss +89 -0
- package/esm/components/layout/header/HeaderIconAction.d.ts +17 -0
- package/esm/components/layout/header/HeaderIconAction.d.ts.map +1 -0
- package/esm/components/layout/header/HeaderIconAction.js +23 -0
- package/esm/components/layout/header/HeaderIconAction.js.map +1 -0
- package/esm/components/layout/header/HeaderIconAction.module.scss +22 -0
- package/esm/components/layout/header/StickyHeader.d.ts +10 -0
- package/esm/components/layout/header/StickyHeader.d.ts.map +1 -0
- package/esm/components/layout/header/StickyHeader.js +28 -0
- package/esm/components/layout/header/StickyHeader.js.map +1 -0
- package/esm/components/layout/header/StickyHeader.module.scss +18 -0
- package/esm/components/layout/list/Item.d.ts +14 -0
- package/esm/components/layout/list/Item.d.ts.map +1 -0
- package/esm/components/layout/list/Item.js +33 -0
- package/esm/components/layout/list/Item.js.map +1 -0
- package/esm/components/layout/list/Item.module.scss +23 -0
- package/esm/components/layout/list/List.d.ts +4 -0
- package/esm/components/layout/list/List.d.ts.map +1 -0
- package/esm/components/layout/list/List.js +7 -0
- package/esm/components/layout/list/List.js.map +1 -0
- package/esm/components/layout/list/List.module.scss +4 -0
- package/esm/components/ui/action/Action.d.ts +17 -0
- package/esm/components/ui/action/Action.d.ts.map +1 -0
- package/esm/components/ui/action/Action.js +27 -0
- package/esm/components/ui/action/Action.js.map +1 -0
- package/esm/components/ui/action/Action.module.scss +26 -0
- package/esm/components/ui/action/EqualActions.d.ts +7 -0
- package/esm/components/ui/action/EqualActions.d.ts.map +1 -0
- package/esm/components/ui/action/EqualActions.js +17 -0
- package/esm/components/ui/action/EqualActions.js.map +1 -0
- package/esm/components/ui/action/EqualActions.module.scss +6 -0
- package/esm/components/ui/button/Button.d.ts +8 -0
- package/esm/components/ui/button/Button.d.ts.map +1 -0
- package/esm/components/ui/button/Button.js +14 -0
- package/esm/components/ui/button/Button.js.map +1 -0
- package/esm/components/ui/button/Button.module.scss +25 -0
- package/esm/components/ui/directionPad/Button.d.ts +7 -0
- package/esm/components/ui/directionPad/Button.d.ts.map +1 -0
- package/esm/components/ui/directionPad/Button.js +8 -0
- package/esm/components/ui/directionPad/Button.js.map +1 -0
- package/esm/components/ui/directionPad/Middle.d.ts +8 -0
- package/esm/components/ui/directionPad/Middle.d.ts.map +1 -0
- package/esm/components/ui/directionPad/Middle.js +7 -0
- package/esm/components/ui/directionPad/Middle.js.map +1 -0
- package/esm/components/ui/directionPad/Pad.d.ts +12 -0
- package/esm/components/ui/directionPad/Pad.d.ts.map +1 -0
- package/esm/components/ui/directionPad/Pad.js +17 -0
- package/esm/components/ui/directionPad/Pad.js.map +1 -0
- package/esm/components/ui/directionPad/Pad.module.scss +45 -0
- package/esm/demo/Demo.d.ts.map +1 -1
- package/esm/demo/Demo.js +2 -1
- package/esm/demo/Demo.js.map +1 -1
- package/esm/demo/Main.d.ts.map +1 -1
- package/esm/demo/Main.js +37 -9
- package/esm/demo/Main.js.map +1 -1
- package/esm/demo/Main.module.scss +13 -0
- package/esm/demo/Menu.d.ts +6 -1
- package/esm/demo/Menu.d.ts.map +1 -1
- package/esm/demo/Menu.js +20 -4
- package/esm/demo/Menu.js.map +1 -1
- package/esm/demo/Menu.module.scss +30 -8
- package/esm/demo/components/form/Checkbox.d.ts.map +1 -1
- package/esm/demo/components/form/Checkbox.js +4 -3
- package/esm/demo/components/form/Checkbox.js.map +1 -1
- package/esm/demo/components/form/Toggle.d.ts +4 -0
- package/esm/demo/components/form/Toggle.d.ts.map +1 -0
- package/esm/demo/components/form/Toggle.js +40 -0
- package/esm/demo/components/form/Toggle.js.map +1 -0
- package/esm/demo/components/form/Toggle.module.scss +5 -0
- package/esm/demo/components/layout/header/Header.d.ts +8 -0
- package/esm/demo/components/layout/header/Header.d.ts.map +1 -0
- package/esm/demo/components/layout/header/Header.js +50 -0
- package/esm/demo/components/layout/header/Header.js.map +1 -0
- package/esm/demo/components/layout/header/StickyHeader.d.ts +9 -0
- package/esm/demo/components/layout/header/StickyHeader.d.ts.map +1 -0
- package/esm/demo/components/layout/header/StickyHeader.js +62 -0
- package/esm/demo/components/layout/header/StickyHeader.js.map +1 -0
- package/esm/demo/components/layout/list/List.Item.d.ts +4 -0
- package/esm/demo/components/layout/list/List.Item.d.ts.map +1 -0
- package/esm/demo/components/layout/list/List.Item.js +17 -0
- package/esm/demo/components/layout/list/List.Item.js.map +1 -0
- package/esm/demo/components/layout/list/List.Item.module.scss +3 -0
- package/esm/demo/components/ui/action/Action.d.ts +8 -0
- package/esm/demo/components/ui/action/Action.d.ts.map +1 -0
- package/esm/demo/components/ui/action/Action.js +73 -0
- package/esm/demo/components/ui/action/Action.js.map +1 -0
- package/esm/demo/components/ui/action/ActionDemo.module.scss +3 -0
- package/esm/demo/components/ui/button/ButtonDemo.d.ts +4 -0
- package/esm/demo/components/ui/button/ButtonDemo.d.ts.map +1 -0
- package/esm/demo/components/ui/button/ButtonDemo.js +14 -0
- package/esm/demo/components/ui/button/ButtonDemo.js.map +1 -0
- package/esm/demo/components/ui/directionPad/Pad.d.ts +4 -0
- package/esm/demo/components/ui/directionPad/Pad.d.ts.map +1 -0
- package/esm/demo/components/ui/directionPad/Pad.js +27 -0
- package/esm/demo/components/ui/directionPad/Pad.js.map +1 -0
- package/esm/demo/components/ui/icons/Icons.d.ts +4 -0
- package/esm/demo/components/ui/icons/Icons.d.ts.map +1 -0
- package/esm/demo/components/ui/icons/Icons.js +14 -0
- package/esm/demo/components/ui/icons/Icons.js.map +1 -0
- package/esm/demo/components/ui/icons/Icons.module.scss +4 -0
- package/esm/demo/componentsMap.d.ts +13 -0
- package/esm/demo/componentsMap.d.ts.map +1 -0
- package/esm/demo/componentsMap.js +109 -0
- package/esm/demo/componentsMap.js.map +1 -0
- package/esm/demo/utils/makeVariants.d.ts +3 -0
- package/esm/demo/utils/makeVariants.d.ts.map +1 -0
- package/esm/demo/utils/makeVariants.js +11 -0
- package/esm/demo/utils/makeVariants.js.map +1 -0
- package/esm/global.scss +34 -13
- package/esm/index.d.ts +8 -1
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +8 -1
- package/esm/index.js.map +1 -1
- package/esm/pages/_app.d.ts.map +1 -1
- package/esm/pages/_app.js +5 -1
- package/esm/pages/_app.js.map +1 -1
- package/esm/pages/react-miui.d.ts +4 -0
- package/esm/pages/react-miui.d.ts.map +1 -0
- package/esm/pages/react-miui.js +6 -0
- package/esm/pages/react-miui.js.map +1 -0
- package/esm/types.d.ts +4 -0
- package/esm/types.d.ts.map +1 -0
- package/esm/types.js +2 -0
- package/esm/types.js.map +1 -0
- package/package.json +9 -7
- package/src/components/form/Checkbox.module.scss +13 -6
- package/src/components/form/Toggle.module.scss +46 -0
- package/src/components/form/Toggle.tsx +33 -0
- package/src/components/icons/Back.tsx +15 -0
- package/src/components/icons/Checkmark.tsx +5 -2
- package/src/components/icons/Icon.tsx +30 -0
- package/src/components/layout/header/Header.module.scss +89 -0
- package/src/components/layout/header/Header.tsx +65 -0
- package/src/components/layout/header/HeaderIconAction.module.scss +22 -0
- package/src/components/layout/header/HeaderIconAction.tsx +49 -0
- package/src/components/layout/header/StickyHeader.module.scss +18 -0
- package/src/components/layout/header/StickyHeader.tsx +54 -0
- package/src/components/layout/list/Item.module.scss +23 -0
- package/src/components/layout/list/Item.tsx +50 -0
- package/src/components/layout/list/List.module.scss +4 -0
- package/src/components/layout/list/List.tsx +11 -0
- package/src/components/ui/action/Action.module.scss +26 -0
- package/src/components/ui/action/Action.tsx +58 -0
- package/src/components/ui/action/EqualActions.module.scss +6 -0
- package/src/components/ui/action/EqualActions.tsx +30 -0
- package/src/components/ui/button/Button.module.scss +25 -0
- package/src/components/ui/button/Button.tsx +25 -0
- package/src/components/ui/directionPad/Button.tsx +15 -0
- package/src/components/ui/directionPad/Middle.tsx +16 -0
- package/src/components/ui/directionPad/Pad.module.scss +45 -0
- package/src/components/ui/directionPad/Pad.tsx +35 -0
- package/src/demo/Demo.tsx +2 -1
- package/src/demo/Main.module.scss +13 -0
- package/src/demo/Main.tsx +53 -10
- package/src/demo/Menu.module.scss +30 -8
- package/src/demo/Menu.tsx +33 -7
- package/src/demo/components/form/Checkbox.tsx +7 -3
- package/src/demo/components/form/Toggle.module.scss +5 -0
- package/src/demo/components/form/Toggle.tsx +59 -0
- package/src/demo/components/layout/header/Header.tsx +119 -0
- package/src/demo/components/layout/header/StickyHeader.tsx +85 -0
- package/src/demo/components/layout/list/List.Item.module.scss +3 -0
- package/src/demo/components/layout/list/List.Item.tsx +23 -0
- package/src/demo/components/ui/action/Action.tsx +112 -0
- package/src/demo/components/ui/action/ActionDemo.module.scss +3 -0
- package/src/demo/components/ui/button/ButtonDemo.tsx +18 -0
- package/src/demo/components/ui/directionPad/Pad.tsx +40 -0
- package/src/demo/components/ui/icons/Icons.module.scss +4 -0
- package/src/demo/components/ui/icons/Icons.tsx +25 -0
- package/src/demo/componentsMap.ts +144 -0
- package/src/demo/utils/makeVariants.ts +13 -0
- package/src/global.scss +34 -13
- package/src/index.ts +11 -1
- package/src/pages/_app.tsx +7 -1
- package/src/pages/react-miui.tsx +12 -0
- package/src/types.ts +7 -0
- package/.postcssrc +0 -9
- package/src/pages/index.html +0 -14
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import classnames from "classnames";
|
|
3
|
+
|
|
4
|
+
import { Header } from "./Header.js";
|
|
5
|
+
import styles from "./StickyHeader.module.scss";
|
|
6
|
+
|
|
7
|
+
const err = new TypeError("StickyHeader needs two children - Header and StickyHeader.Content");
|
|
8
|
+
|
|
9
|
+
interface Content {
|
|
10
|
+
Content: React.FC;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
interface Props {
|
|
14
|
+
position?: "top" | "left" | "right" | "bottom";
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const StickyHeader: React.FC<Props> & Content = (props) => {
|
|
18
|
+
const position = props.position || "top";
|
|
19
|
+
|
|
20
|
+
const children = React.Children.toArray(props.children);
|
|
21
|
+
|
|
22
|
+
// eslint-disable-next-line @typescript-eslint/no-magic-numbers
|
|
23
|
+
if (children.length !== 2) {
|
|
24
|
+
throw err;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
let header = children.find(c => typeof c === "object" && "type" in c && c.type === Header),
|
|
28
|
+
content = children.find(c => typeof c === "object" && "type" in c && c.type === StickyHeader.Content);
|
|
29
|
+
|
|
30
|
+
if (!header || !content) {
|
|
31
|
+
throw err;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
header = header as never; // @TODO find a better way to silence TS on cloneElement
|
|
35
|
+
content = content as never;
|
|
36
|
+
|
|
37
|
+
const cls = classnames(styles.stickyHeader, styles[`stickyHeader--${position}`]);
|
|
38
|
+
const contentCls = classnames(styles.stickyHeader__content, styles[`stickyHeader__content--${position}`]);
|
|
39
|
+
|
|
40
|
+
return (
|
|
41
|
+
<div className={cls}>
|
|
42
|
+
{React.cloneElement(header, { position })}
|
|
43
|
+
<div className={contentCls}>
|
|
44
|
+
{content}
|
|
45
|
+
</div>
|
|
46
|
+
</div>
|
|
47
|
+
);
|
|
48
|
+
};
|
|
49
|
+
// eslint-disable-next-line react/no-multi-comp
|
|
50
|
+
StickyHeader.Content = ({ children }) => {
|
|
51
|
+
return <>{children}</>;
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
export { StickyHeader };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
.item {
|
|
2
|
+
list-style-type: none;
|
|
3
|
+
margin: 0;
|
|
4
|
+
padding: 0;
|
|
5
|
+
font-size: 15px;
|
|
6
|
+
|
|
7
|
+
&:not(:first-child) > * {
|
|
8
|
+
border-top: 0.37px solid var(--header-border);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
> * {
|
|
12
|
+
display: block;
|
|
13
|
+
padding: 20px 0;
|
|
14
|
+
text-decoration: none;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.button {
|
|
19
|
+
border: none;
|
|
20
|
+
background: none;
|
|
21
|
+
width: 100%;
|
|
22
|
+
text-align: left;
|
|
23
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import classnames from "classnames";
|
|
3
|
+
|
|
4
|
+
import styles from "./Item.module.scss";
|
|
5
|
+
|
|
6
|
+
interface LinkProps {
|
|
7
|
+
href: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
interface Props {
|
|
11
|
+
href?: string;
|
|
12
|
+
to?: string;
|
|
13
|
+
onClick?: () => void;
|
|
14
|
+
className?: string;
|
|
15
|
+
Link?: React.ComponentClass<LinkProps> | React.FC<LinkProps>;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const Item: React.FC<Props> = (props) => {
|
|
19
|
+
const { className, children, href, to, onClick, Link, ...restProps } = props;
|
|
20
|
+
const cls = classnames(styles.item, className);
|
|
21
|
+
|
|
22
|
+
const liProps = {
|
|
23
|
+
className: cls,
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
if (to) {
|
|
27
|
+
if (!Link) {
|
|
28
|
+
throw new TypeError("`to` prop given without `Link` component");
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return <li {...liProps}><Link href={to} {...restProps}>{children}</Link></li>;
|
|
32
|
+
}
|
|
33
|
+
if (href) {
|
|
34
|
+
const aProps: typeof restProps & { onClick?: Props["onClick"]} = { ...restProps };
|
|
35
|
+
if (onClick) {
|
|
36
|
+
aProps.onClick = onClick;
|
|
37
|
+
}
|
|
38
|
+
return <li {...liProps}><a href={href} {...aProps}>{children}</a></li>;
|
|
39
|
+
}
|
|
40
|
+
if (onClick) {
|
|
41
|
+
return (
|
|
42
|
+
<li {...liProps}>
|
|
43
|
+
<button className={styles.button} onClick={props.onClick} {...restProps}>{children}</button>
|
|
44
|
+
</li>
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
return <li {...liProps}><div {...restProps}>{children}</div></li>;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
export { Item };
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
.action {
|
|
2
|
+
height: calc(102px / var(--ratio-dimensions));
|
|
3
|
+
width: calc(102px / var(--ratio-dimensions));
|
|
4
|
+
border-radius: 100px;
|
|
5
|
+
border: calc(1px / var(--ratio-border)) solid var(--button-border);
|
|
6
|
+
background: white;
|
|
7
|
+
padding: 0;
|
|
8
|
+
display: flex;
|
|
9
|
+
align-items: center;
|
|
10
|
+
justify-content: center;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
.a {
|
|
14
|
+
display: inline-block;
|
|
15
|
+
vertical-align: middle;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.button {
|
|
19
|
+
border: none;
|
|
20
|
+
padding: 0;
|
|
21
|
+
background: none;
|
|
22
|
+
display: inline-flex;
|
|
23
|
+
flex-direction: column;
|
|
24
|
+
align-items: center;
|
|
25
|
+
gap: calc(18px / var(--ratio-dimensions));
|
|
26
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { ReactNode } from "react";
|
|
3
|
+
|
|
4
|
+
import type { ICON } from "../../icons/Icon";
|
|
5
|
+
import { Icon } from "../../icons/Icon";
|
|
6
|
+
import styles from "./Action.module.scss";
|
|
7
|
+
|
|
8
|
+
interface LinkProps { // @TODO extract? - same on list item
|
|
9
|
+
href: string;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
interface Props {
|
|
13
|
+
href?: string;
|
|
14
|
+
to?: string;
|
|
15
|
+
onClick?: () => void;
|
|
16
|
+
icon?: ICON | Exclude<ReactNode, string>;
|
|
17
|
+
Link?: React.ComponentClass<LinkProps> | React.FC<LinkProps>;
|
|
18
|
+
label?: ReactNode;
|
|
19
|
+
// if className ever goes here make sure that `a` gets classnames merged
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const Action: React.VFC<Props> = (props) => {
|
|
23
|
+
const { icon, label, href, to, Link, ...restProps } = props;
|
|
24
|
+
|
|
25
|
+
let iconElem: ReactNode = icon;
|
|
26
|
+
if (typeof icon === "string") {
|
|
27
|
+
iconElem = <Icon name={icon as ICON} />;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const labelElem = label ? <div className={styles.label}>{label}</div> : null;
|
|
31
|
+
|
|
32
|
+
const content = (
|
|
33
|
+
<>
|
|
34
|
+
<div className={styles.action}>{iconElem}</div>
|
|
35
|
+
{labelElem}
|
|
36
|
+
</>
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
if (to) {
|
|
40
|
+
if (!Link) {
|
|
41
|
+
throw new TypeError("`to` prop given without `Link` component");
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return <Link href={to} {...restProps}><a className={styles.a}>{content}</a></Link>;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (href) {
|
|
48
|
+
return <a href={href} className={styles.a} {...restProps}>{content}</a>;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return (
|
|
52
|
+
<button onClick={props.onClick} className={styles.button}>
|
|
53
|
+
{content}
|
|
54
|
+
</button>
|
|
55
|
+
);
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
export { Action };
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Action } from "./Action";
|
|
3
|
+
|
|
4
|
+
import styles from "./EqualActions.module.scss";
|
|
5
|
+
import classnames from "classnames";
|
|
6
|
+
|
|
7
|
+
interface Props {
|
|
8
|
+
className?: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const EqualActions: React.FC<Props> = (props) => {
|
|
12
|
+
React.Children.forEach(props.children, (child) => {
|
|
13
|
+
if (!child || typeof child !== "object" || !("type" in child) || child.type !== Action) {
|
|
14
|
+
throw new TypeError("Every child of EqualActions must be an Action component");
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
19
|
+
const style = {
|
|
20
|
+
"--actions-count": React.Children.count(props.children),
|
|
21
|
+
} as React.CSSProperties;
|
|
22
|
+
|
|
23
|
+
return (
|
|
24
|
+
<div className={classnames(styles.actions, props.className)} style={style}>
|
|
25
|
+
{props.children}
|
|
26
|
+
</div>
|
|
27
|
+
);
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export { EqualActions };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
.btn {
|
|
2
|
+
height: calc(118px / var(--ratio-dimensions));
|
|
3
|
+
background: var(--green1);
|
|
4
|
+
border: calc(1px / var(--ratio-border)) solid var(--green1-darker);
|
|
5
|
+
color: white;
|
|
6
|
+
border-radius: 1000px;
|
|
7
|
+
display: block;
|
|
8
|
+
width: 100%;
|
|
9
|
+
font-size: calc(26px / var(--ratio-font));
|
|
10
|
+
padding: 0 1em;
|
|
11
|
+
|
|
12
|
+
&:disabled {
|
|
13
|
+
opacity: 0.5;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
.btn--inline {
|
|
18
|
+
width: auto;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.btn--outline {
|
|
22
|
+
background: white;
|
|
23
|
+
border-color: var(--button-border);
|
|
24
|
+
color: var(--grey1);
|
|
25
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
|
|
3
|
+
import styles from "./Button.module.scss";
|
|
4
|
+
import classnames from "classnames";
|
|
5
|
+
import { makeVariants } from "../../../demo/utils/makeVariants";
|
|
6
|
+
|
|
7
|
+
interface Props {
|
|
8
|
+
disabled?: boolean;
|
|
9
|
+
variant?: "inline" | "outline";
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const Button: React.FC<Props> = (props) => {
|
|
13
|
+
const variants = makeVariants(props.variant);
|
|
14
|
+
|
|
15
|
+
const cls = classnames(styles.btn, {
|
|
16
|
+
[styles["btn--inline"]]: variants.includes("inline"),
|
|
17
|
+
[styles["btn--outline"]]: variants.includes("outline"),
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
return (
|
|
21
|
+
<button className={cls} disabled={props.disabled}>{props.children}</button>
|
|
22
|
+
);
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export { Button };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
|
|
3
|
+
import styles from "./Pad.module.scss";
|
|
4
|
+
|
|
5
|
+
interface Props {
|
|
6
|
+
onClick?: () => void;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
const PadButton: React.FC<Props> = (props) => {
|
|
10
|
+
return (
|
|
11
|
+
<button {...props} className={styles.pad__button}><span className={styles.pad__dot} /></button>
|
|
12
|
+
);
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export { PadButton };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
|
|
3
|
+
import styles from "./Pad.module.scss";
|
|
4
|
+
|
|
5
|
+
interface Props {
|
|
6
|
+
label?: string;
|
|
7
|
+
onClick?: () => void;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const PadMiddle: React.FC<Props> = (props) => {
|
|
11
|
+
return (
|
|
12
|
+
<button onClick={props.onClick} className={styles.pad__middle}>{props.label}</button>
|
|
13
|
+
);
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export { PadMiddle };
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
.pad {
|
|
2
|
+
display: flex;
|
|
3
|
+
flex-direction: column;
|
|
4
|
+
align-items: center;
|
|
5
|
+
justify-content: center;
|
|
6
|
+
height: 150px;
|
|
7
|
+
border-radius: 666px;
|
|
8
|
+
width: 150px;
|
|
9
|
+
border: 1px solid #aaa;
|
|
10
|
+
background: white;
|
|
11
|
+
|
|
12
|
+
&__line {
|
|
13
|
+
display: flex;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
&__button {
|
|
17
|
+
height: 50px;
|
|
18
|
+
width: 50px;
|
|
19
|
+
margin: 0;
|
|
20
|
+
border-radius: 666px;
|
|
21
|
+
border: none;
|
|
22
|
+
display: block;
|
|
23
|
+
background: none;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
&__middle {
|
|
27
|
+
display: block;
|
|
28
|
+
margin: 0;
|
|
29
|
+
height: 50px;
|
|
30
|
+
width: 50px;
|
|
31
|
+
border: 1px solid #999;
|
|
32
|
+
box-sizing: border-box;
|
|
33
|
+
border-radius: 666px;
|
|
34
|
+
background: none;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
&__dot {
|
|
38
|
+
display: block;
|
|
39
|
+
width: 4px;
|
|
40
|
+
height: 4px;
|
|
41
|
+
border-radius: 666px;
|
|
42
|
+
background: black;
|
|
43
|
+
margin: auto;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
|
|
3
|
+
import { PadButton as Button } from "./Button.js";
|
|
4
|
+
import { PadMiddle as Middle } from "./Middle.js";
|
|
5
|
+
|
|
6
|
+
import styles from "./Pad.module.scss";
|
|
7
|
+
|
|
8
|
+
interface Props {
|
|
9
|
+
onUpPress?: () => void;
|
|
10
|
+
onDownPress?: () => void;
|
|
11
|
+
onLeftPress?: () => void;
|
|
12
|
+
onRightPress?: () => void;
|
|
13
|
+
onMiddlePress?: () => void;
|
|
14
|
+
middleLabel?: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const Pad: React.FC<Props> = (props) => {
|
|
18
|
+
return (
|
|
19
|
+
<div className={styles.pad}>
|
|
20
|
+
<div className={styles.pad__line}>
|
|
21
|
+
<Button onClick={props.onUpPress} />
|
|
22
|
+
</div>
|
|
23
|
+
<div className={styles.pad__line}>
|
|
24
|
+
<Button onClick={props.onLeftPress} />
|
|
25
|
+
<Middle onClick={props.onMiddlePress} label={props.middleLabel} />
|
|
26
|
+
<Button onClick={props.onRightPress} />
|
|
27
|
+
</div>
|
|
28
|
+
<div className={styles.pad__line}>
|
|
29
|
+
<Button onClick={props.onDownPress} />
|
|
30
|
+
</div>
|
|
31
|
+
</div>
|
|
32
|
+
);
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export { Pad as DirectionPad };
|
package/src/demo/Demo.tsx
CHANGED
|
@@ -3,11 +3,12 @@ import React from "react";
|
|
|
3
3
|
import styles from "./Demo.module.scss";
|
|
4
4
|
import { Menu } from "./Menu";
|
|
5
5
|
import { Main } from "./Main";
|
|
6
|
+
import { componentsMap } from "./componentsMap";
|
|
6
7
|
|
|
7
8
|
const Demo: React.FC = (props) => {
|
|
8
9
|
return (
|
|
9
10
|
<div className={styles.container}>
|
|
10
|
-
<Menu />
|
|
11
|
+
<Menu list={componentsMap} />
|
|
11
12
|
<Main />
|
|
12
13
|
</div>
|
|
13
14
|
);
|
|
@@ -8,10 +8,23 @@
|
|
|
8
8
|
.component {
|
|
9
9
|
padding: 20px;
|
|
10
10
|
flex: 1;
|
|
11
|
+
overflow: auto;
|
|
11
12
|
|
|
12
13
|
&--transparent {
|
|
13
14
|
background-position: 0px 0px, 10px 10px;
|
|
14
15
|
background-size: 20px 20px;
|
|
15
16
|
background-image: linear-gradient(45deg, #eee 25%, transparent 25%, transparent 75%, #eee 75%, #eee 100%),linear-gradient(45deg, #eee 25%, white 25%, white 75%, #eee 75%, #eee 100%);
|
|
16
17
|
}
|
|
18
|
+
|
|
19
|
+
&--mobile {
|
|
20
|
+
border-radius: 20px;
|
|
21
|
+
max-width: 400px;
|
|
22
|
+
width: 100%;
|
|
23
|
+
padding: 0;
|
|
24
|
+
margin: 20px 0;
|
|
25
|
+
align-self: center;
|
|
26
|
+
border: 10px solid black;
|
|
27
|
+
border-top-width: 30px;
|
|
28
|
+
position: relative;
|
|
29
|
+
}
|
|
17
30
|
}
|
package/src/demo/Main.tsx
CHANGED
|
@@ -1,15 +1,44 @@
|
|
|
1
|
-
import React, { useState } from "react";
|
|
1
|
+
import React, { useCallback, useState } from "react";
|
|
2
2
|
import classnames from "classnames";
|
|
3
3
|
|
|
4
|
+
import type { AnyComponent } from "../types";
|
|
5
|
+
import type { TheMap, TheMapItem } from "./componentsMap";
|
|
6
|
+
|
|
4
7
|
import styles from "./Main.module.scss";
|
|
5
8
|
|
|
6
|
-
import { CheckboxDemo } from "./components/form/Checkbox";
|
|
7
9
|
import { safeUseHash } from "./utils/safeUseHash";
|
|
10
|
+
import { componentsMap } from "./componentsMap";
|
|
11
|
+
|
|
12
|
+
type BG = "white" | "transparent" | "mobile";
|
|
13
|
+
|
|
14
|
+
interface ComponentInfo {
|
|
15
|
+
Component: AnyComponent;
|
|
16
|
+
name: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const getComponentByHash = (hash: string): ComponentInfo | null => {
|
|
20
|
+
const parts = hash.split("/");
|
|
21
|
+
let obj: TheMap | undefined = componentsMap,
|
|
22
|
+
objItem: TheMapItem | undefined;
|
|
23
|
+
|
|
24
|
+
while (parts.length) {
|
|
25
|
+
const first = parts.shift()!;
|
|
26
|
+
objItem = obj?.[first];
|
|
8
27
|
|
|
9
|
-
|
|
28
|
+
if (!objItem) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
obj = objItem.children;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (objItem?.Component) {
|
|
35
|
+
return {
|
|
36
|
+
name: objItem.name,
|
|
37
|
+
Component: objItem.Component,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
10
40
|
|
|
11
|
-
|
|
12
|
-
checkbox: CheckboxDemo,
|
|
41
|
+
return null;
|
|
13
42
|
};
|
|
14
43
|
|
|
15
44
|
const Main: React.FC = (props) => {
|
|
@@ -17,9 +46,19 @@ const Main: React.FC = (props) => {
|
|
|
17
46
|
|
|
18
47
|
const hash = safeUseHash();
|
|
19
48
|
const hashWithoutHash = hash.substr(1);
|
|
20
|
-
const
|
|
49
|
+
const info = getComponentByHash(hashWithoutHash);
|
|
21
50
|
|
|
22
|
-
|
|
51
|
+
const handleTransparentBg = useCallback(() => {
|
|
52
|
+
setBg("transparent");
|
|
53
|
+
}, []);
|
|
54
|
+
const handleWhiteBg = useCallback(() => {
|
|
55
|
+
setBg("white");
|
|
56
|
+
}, []);
|
|
57
|
+
const handleMobileBg = useCallback(() => {
|
|
58
|
+
setBg("mobile");
|
|
59
|
+
}, []);
|
|
60
|
+
|
|
61
|
+
if (!info) {
|
|
23
62
|
return (
|
|
24
63
|
<div className={styles.container}>
|
|
25
64
|
<h1 className={styles.header}>Hi there</h1>
|
|
@@ -28,15 +67,19 @@ const Main: React.FC = (props) => {
|
|
|
28
67
|
);
|
|
29
68
|
}
|
|
30
69
|
|
|
70
|
+
const Component = info.Component;
|
|
71
|
+
|
|
31
72
|
const componentCls = classnames(styles.component, {
|
|
32
73
|
[styles["component--transparent"]]: bg === "transparent",
|
|
74
|
+
[styles["component--mobile"]]: bg === "mobile",
|
|
33
75
|
});
|
|
34
76
|
|
|
35
77
|
return (
|
|
36
78
|
<div className={styles.container}>
|
|
37
|
-
<h1 className={styles.header}>{
|
|
38
|
-
<button onClick={
|
|
39
|
-
<button onClick={
|
|
79
|
+
<h1 className={styles.header}>{info.name}</h1>
|
|
80
|
+
<button onClick={handleTransparentBg}>Transparent</button>
|
|
81
|
+
<button onClick={handleWhiteBg}>White</button>
|
|
82
|
+
<button onClick={handleMobileBg}>Mobile</button>
|
|
40
83
|
|
|
41
84
|
<div className={componentCls}>
|
|
42
85
|
<Component />
|
|
@@ -1,19 +1,41 @@
|
|
|
1
1
|
.menu {
|
|
2
|
-
|
|
3
|
-
padding:
|
|
2
|
+
margin: 0;
|
|
3
|
+
padding: 0;
|
|
4
4
|
border-right: 1px solid black;
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
ul {
|
|
7
|
+
margin: 0 0 0 15px;
|
|
8
|
+
padding: 0;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
li {
|
|
12
|
+
padding: 0;
|
|
13
|
+
margin: 0;
|
|
14
|
+
list-style-type: none;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
> ul {
|
|
18
|
+
margin: 0;
|
|
7
19
|
display: block;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
> ul > li > a {
|
|
8
23
|
padding: 10px;
|
|
9
|
-
|
|
10
|
-
|
|
24
|
+
text-transform: uppercase;
|
|
25
|
+
font-size: 16px;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
a {
|
|
29
|
+
padding: 5px 10px;
|
|
30
|
+
display: block;
|
|
11
31
|
color: black;
|
|
12
32
|
text-decoration: none;
|
|
13
|
-
|
|
33
|
+
font-size: 14px;
|
|
14
34
|
|
|
15
|
-
|
|
16
|
-
|
|
35
|
+
&:hover {
|
|
36
|
+
background: var(--active-bg);
|
|
17
37
|
}
|
|
38
|
+
|
|
39
|
+
--focus-bg-set: var(--focus-color);
|
|
18
40
|
}
|
|
19
41
|
}
|
package/src/demo/Menu.tsx
CHANGED
|
@@ -1,14 +1,40 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
|
|
3
3
|
import styles from "./Menu.module.scss";
|
|
4
|
+
import type { componentsMap } from "./componentsMap";
|
|
4
5
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
)
|
|
6
|
+
interface Props {
|
|
7
|
+
ancestors?: string[];
|
|
8
|
+
list: typeof componentsMap;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const Menu: React.FC<Props> = (props) => {
|
|
12
|
+
const cmp = Object.entries(props.list).map(([urlHash, component]) => {
|
|
13
|
+
const label = component.name;
|
|
14
|
+
const children = `children` in component && component.children
|
|
15
|
+
? <Menu ancestors={[...props.ancestors!, urlHash]} list={component.children} />
|
|
16
|
+
: null;
|
|
17
|
+
|
|
18
|
+
return (
|
|
19
|
+
<li key={urlHash}>
|
|
20
|
+
<a href={"#" + [...props.ancestors!, urlHash].join("/")}>{label}</a>
|
|
21
|
+
{children}
|
|
22
|
+
</li>
|
|
23
|
+
);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
const contents = <ul>{cmp}</ul>;
|
|
27
|
+
|
|
28
|
+
if (!props.ancestors!.length) {
|
|
29
|
+
cmp.unshift(<li key={"--main"}><a href={"#"}>Main</a></li>);
|
|
30
|
+
return <menu className={styles.menu}>{contents}</menu>;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return contents;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
Menu.defaultProps = {
|
|
37
|
+
ancestors: [],
|
|
12
38
|
};
|
|
13
39
|
|
|
14
40
|
export { Menu };
|