@dtdot/lego 0.17.8 → 0.17.12
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/build/components/InlineCard/InlineCard.component.d.ts +2 -1
- package/build/components/InlineCard/InlineCard.component.js +47 -3
- package/build/components/InlineCard/InlineCard.stories.d.ts +1 -0
- package/build/components/InlineCard/InlineCard.stories.js +25 -3
- package/build/components/InlineCard/InlineCardSelection.component.d.ts +9 -0
- package/build/components/InlineCard/InlineCardSelection.component.js +28 -0
- package/build/components/InlineCard/_InlineCardSelection.context.d.ts +8 -0
- package/build/components/InlineCard/_InlineCardSelection.context.js +6 -0
- package/build/components/Menu/Menu.component.js +2 -0
- package/build/components/MinimalMenu/MinimalMenu.component.d.ts +10 -0
- package/build/components/MinimalMenu/MinimalMenu.component.js +16 -0
- package/build/components/MinimalMenu/MinimalMenu.stories.d.ts +5 -0
- package/build/components/MinimalMenu/MinimalMenu.stories.js +46 -0
- package/build/components/MinimalMenu/_MinimalMenuItem.component.d.ts +9 -0
- package/build/components/MinimalMenu/_MinimalMenuItem.component.js +12 -0
- package/build/components/MinimalMenu/_MinimalMenuPage.component.d.ts +6 -0
- package/build/components/MinimalMenu/_MinimalMenuPage.component.js +12 -0
- package/build/components/MinimalMenu/desktop/_DesktopMinimalMenuContainer.component.d.ts +6 -0
- package/build/components/MinimalMenu/desktop/_DesktopMinimalMenuContainer.component.js +17 -0
- package/build/components/MinimalMenu/desktop/_DesktopMinimalMenuItem.component.d.ts +9 -0
- package/build/components/MinimalMenu/desktop/_DesktopMinimalMenuItem.component.js +42 -0
- package/build/components/MinimalMenu/desktop/_DesktopMinimalMenuPage.component.d.ts +6 -0
- package/build/components/MinimalMenu/desktop/_DesktopMinimalMenuPage.component.js +9 -0
- package/build/components/MinimalMenu/mobile/_MobileMenu.constants.d.ts +5 -0
- package/build/components/MinimalMenu/mobile/_MobileMenu.constants.js +1 -0
- package/build/components/MinimalMenu/mobile/_MobileMenuBump.component.d.ts +3 -0
- package/build/components/MinimalMenu/mobile/_MobileMenuBump.component.js +4 -0
- package/build/components/MinimalMenu/mobile/_MobileMenuBump.context.d.ts +6 -0
- package/build/components/MinimalMenu/mobile/_MobileMenuBump.context.js +6 -0
- package/build/components/MinimalMenu/mobile/_MobileMinimalMenuContainer.component.d.ts +6 -0
- package/build/components/MinimalMenu/mobile/_MobileMinimalMenuContainer.component.js +41 -0
- package/build/components/MinimalMenu/mobile/_MobileMinimalMenuItem.component.d.ts +9 -0
- package/build/components/MinimalMenu/mobile/_MobileMinimalMenuItem.component.js +42 -0
- package/build/components/MinimalMenu/mobile/_MobileMinimalMenuPage.component.d.ts +6 -0
- package/build/components/MinimalMenu/mobile/_MobileMinimalMenuPage.component.js +9 -0
- package/build/hooks/useWindowDimensions.d.ts +4 -0
- package/build/hooks/useWindowDimensions.js +19 -0
- package/build/index.d.ts +2 -0
- package/build/index.js +2 -0
- package/build/responsive/responsive.d.ts +1 -0
- package/build/responsive/responsive.js +12 -0
- package/package.json +3 -2
|
@@ -6,12 +6,13 @@ export declare type DragVariant = Status;
|
|
|
6
6
|
export interface InlineCardProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
7
7
|
children: React.ReactNode;
|
|
8
8
|
size?: InlineCardSize;
|
|
9
|
+
value?: string;
|
|
9
10
|
gestureLeftIcon?: IconProp;
|
|
10
11
|
gestureLeftVariant?: DragVariant;
|
|
11
12
|
onGestureLeft?: () => void;
|
|
12
13
|
}
|
|
13
14
|
declare const InlineCard: {
|
|
14
|
-
({ children, size, onClick, gestureLeftIcon, gestureLeftVariant, onGestureLeft, }: InlineCardProps): JSX.Element;
|
|
15
|
+
({ children, size, value, onClick, gestureLeftIcon, gestureLeftVariant, onGestureLeft, }: InlineCardProps): JSX.Element;
|
|
15
16
|
Media: ({ children }: import("./_InlineCardMedia.component").InlineCardMediaProps) => JSX.Element;
|
|
16
17
|
Content: ({ children, center }: import("./_InlineCardContent.component").InlineCardContentProps) => JSX.Element;
|
|
17
18
|
Meta: ({ children }: import("./_InlineCardMeta.component").InlineCardMetaProps) => JSX.Element;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { motion, useMotionValue, useTransform } from 'framer-motion';
|
|
2
|
-
import React, { useState } from 'react';
|
|
2
|
+
import React, { useContext, useState } from 'react';
|
|
3
3
|
import styled, { useTheme } from 'styled-components';
|
|
4
4
|
import useMeasure from 'react-use-measure';
|
|
5
5
|
import { responsive } from '../..';
|
|
@@ -8,6 +8,8 @@ import InlineCardContent from './_InlineCardContent.component';
|
|
|
8
8
|
import InlineCardMedia from './_InlineCardMedia.component';
|
|
9
9
|
import InlineCardMeta from './_InlineCardMeta.component';
|
|
10
10
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
11
|
+
import InlineCardSelectionContext from './_InlineCardSelection.context';
|
|
12
|
+
import { faCheck } from '@fortawesome/free-solid-svg-icons';
|
|
11
13
|
const CardWrapper = styled.div `
|
|
12
14
|
position: relative;
|
|
13
15
|
height: 64px;
|
|
@@ -75,7 +77,38 @@ const CardActionBackground = styled(motion.div) `
|
|
|
75
77
|
left: 0;
|
|
76
78
|
pointer-events: none;
|
|
77
79
|
`;
|
|
78
|
-
const
|
|
80
|
+
const SelectChecked = styled.div `
|
|
81
|
+
position: absolute;
|
|
82
|
+
top: 0;
|
|
83
|
+
right: 0;
|
|
84
|
+
|
|
85
|
+
width: 0;
|
|
86
|
+
height: 0;
|
|
87
|
+
|
|
88
|
+
border-bottom: 48px solid transparent;
|
|
89
|
+
border-right: 48px solid ${(props) => props.theme.colours.statusInfo.main};
|
|
90
|
+
`;
|
|
91
|
+
const SelectIconContainer = styled.div `
|
|
92
|
+
position: absolute;
|
|
93
|
+
left: 0;
|
|
94
|
+
right: 0;
|
|
95
|
+
|
|
96
|
+
width: 48px;
|
|
97
|
+
height: 48px;
|
|
98
|
+
|
|
99
|
+
display: flex;
|
|
100
|
+
justify-content: center;
|
|
101
|
+
align-items: center;
|
|
102
|
+
|
|
103
|
+
padding-left: 16px;
|
|
104
|
+
padding-bottom: 16px;
|
|
105
|
+
|
|
106
|
+
color: ${(props) => props.theme.colours.statusInfo.contrast};
|
|
107
|
+
`;
|
|
108
|
+
const InlineCard = ({ children, size, value, onClick, gestureLeftIcon, gestureLeftVariant, onGestureLeft, }) => {
|
|
109
|
+
const { value: selectedValues, onToggle } = useContext(InlineCardSelectionContext);
|
|
110
|
+
const isSelectable = !!onToggle;
|
|
111
|
+
const isSelected = selectedValues?.length && value && selectedValues.includes(value);
|
|
79
112
|
const theme = useTheme();
|
|
80
113
|
const x = useMotionValue(0);
|
|
81
114
|
const [ref, bounds] = useMeasure();
|
|
@@ -90,9 +123,20 @@ const InlineCard = ({ children, size, onClick, gestureLeftIcon, gestureLeftVaria
|
|
|
90
123
|
onGestureLeft();
|
|
91
124
|
}
|
|
92
125
|
};
|
|
126
|
+
const handleClick = (e) => {
|
|
127
|
+
if (onClick) {
|
|
128
|
+
onClick(e);
|
|
129
|
+
}
|
|
130
|
+
if (onToggle && value) {
|
|
131
|
+
onToggle(value);
|
|
132
|
+
}
|
|
133
|
+
};
|
|
93
134
|
return (React.createElement(CardWrapper, { size: size },
|
|
94
135
|
React.createElement(CardActionBackground, { style: { opacity, backgroundColor: gestureLeftTheme.main } }, gestureLeftIcon && (React.createElement(FontAwesomeIcon, { style: { fontSize: '20px', color: gestureLeftTheme.contrast }, icon: gestureLeftIcon }))),
|
|
95
|
-
React.createElement(CardOuter, { drag: onGestureLeft ? 'x' : undefined, onDragEnd: handleDragEnd, ref: ref, style: { x }, animate: { x: gestureLeftActivated ? -bounds.width : undefined, opacity: gestureLeftActivated ? 0 : undefined }, dragConstraints: { left: 0, right: 0 }, usePointer: !!onClick, onClick:
|
|
136
|
+
React.createElement(CardOuter, { drag: onGestureLeft ? 'x' : undefined, onDragEnd: handleDragEnd, ref: ref, style: { x }, animate: { x: gestureLeftActivated ? -bounds.width : undefined, opacity: gestureLeftActivated ? 0 : undefined }, dragConstraints: { left: 0, right: 0 }, usePointer: !!onClick || isSelectable, onClick: handleClick }, children),
|
|
137
|
+
isSelectable && isSelected ? (React.createElement(SelectChecked, null,
|
|
138
|
+
React.createElement(SelectIconContainer, null,
|
|
139
|
+
React.createElement(FontAwesomeIcon, { icon: faCheck })))) : null));
|
|
96
140
|
};
|
|
97
141
|
InlineCard.Media = InlineCardMedia;
|
|
98
142
|
InlineCard.Content = InlineCardContent;
|
|
@@ -2,5 +2,6 @@
|
|
|
2
2
|
import { Meta } from '@storybook/react/types-6-0';
|
|
3
3
|
export declare const Standard: () => JSX.Element;
|
|
4
4
|
export declare const WithDrag: () => JSX.Element;
|
|
5
|
+
export declare const WithSelection: () => JSX.Element;
|
|
5
6
|
declare const _default: Meta<import("@storybook/react/types-6-0").Args>;
|
|
6
7
|
export default _default;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import React from 'react';
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
2
|
import { faCheckCircle, faExclamationTriangle, faInfoCircle, faTimes } from '@fortawesome/free-solid-svg-icons';
|
|
3
|
-
import { Badge, InlineCard, InlineCardGroup } from '../..';
|
|
3
|
+
import { Badge, FocusLayout, Form, InlineCard, InlineCardGroup } from '../..';
|
|
4
|
+
import InlineCardSelection from './InlineCardSelection.component';
|
|
4
5
|
export const Standard = () => (React.createElement(InlineCardGroup, null,
|
|
5
6
|
React.createElement(InlineCard, null,
|
|
6
7
|
React.createElement(InlineCard.Content, null, "Some content")),
|
|
@@ -14,7 +15,7 @@ export const Standard = () => (React.createElement(InlineCardGroup, null,
|
|
|
14
15
|
React.createElement(InlineCard.Content, null, "Clickable card"),
|
|
15
16
|
React.createElement(InlineCard.Meta, null,
|
|
16
17
|
React.createElement(Badge, { variant: 'info' }, "Clickable")))));
|
|
17
|
-
export const WithDrag = () => (React.createElement(
|
|
18
|
+
export const WithDrag = () => (React.createElement(FocusLayout, null,
|
|
18
19
|
React.createElement(InlineCardGroup, null,
|
|
19
20
|
React.createElement(InlineCard, { onGestureLeft: () => console.log('Gesture left triggered'), gestureLeftIcon: faCheckCircle, gestureLeftVariant: 'success' },
|
|
20
21
|
React.createElement(InlineCard.Content, null, "A success gesture")),
|
|
@@ -24,6 +25,27 @@ export const WithDrag = () => (React.createElement("div", { style: { maxWidth: '
|
|
|
24
25
|
React.createElement(InlineCard.Content, null, "A warning gesture")),
|
|
25
26
|
React.createElement(InlineCard, { onGestureLeft: () => console.log('Gesture left triggered'), gestureLeftIcon: faTimes, gestureLeftVariant: 'danger' },
|
|
26
27
|
React.createElement(InlineCard.Content, null, "A danger gesture")))));
|
|
28
|
+
export const WithSelection = () => {
|
|
29
|
+
const [value, setValue] = useState({ animals: ['lama'] });
|
|
30
|
+
return (React.createElement(FocusLayout, null,
|
|
31
|
+
React.createElement(Form, { value: value, onChange: setValue },
|
|
32
|
+
React.createElement(InlineCardSelection, { name: 'animals' },
|
|
33
|
+
React.createElement(InlineCardGroup, null,
|
|
34
|
+
React.createElement(InlineCard, { value: 'camel' },
|
|
35
|
+
React.createElement(InlineCard.Media, null,
|
|
36
|
+
React.createElement("img", { src: 'http://3.bp.blogspot.com/-m2w1bFhTLMs/Uyh0xlVCluI/AAAAAAAACjw/G4IhU8b0RhY/w1200-h630-p-k-nu/368692.jpg' })),
|
|
37
|
+
React.createElement(InlineCard.Content, null, "A cranky camel")),
|
|
38
|
+
React.createElement(InlineCard, { value: 'eagle' },
|
|
39
|
+
React.createElement(InlineCard.Media, null,
|
|
40
|
+
React.createElement("img", { src: 'https://www.hakaimagazine.com/wp-content/uploads/header-bald-eagle-nests.jpg' })),
|
|
41
|
+
React.createElement(InlineCard.Content, null, "An eager eagle")),
|
|
42
|
+
React.createElement(InlineCard, { value: 'lama' },
|
|
43
|
+
React.createElement(InlineCard.Media, null,
|
|
44
|
+
React.createElement("img", { src: 'https://external-preview.redd.it/3KAYF01HBUX-QKwcpo89kHPzScRoZPXZN7o02JepX8E.jpg?auto=webp&s=08bbddec975a8af76de43a33001604099fb0168d' })),
|
|
45
|
+
React.createElement(InlineCard.Content, null, "A lazy lama")),
|
|
46
|
+
React.createElement(InlineCard, { value: 'iguana' },
|
|
47
|
+
React.createElement(InlineCard.Content, null, "An invisible iguana")))))));
|
|
48
|
+
};
|
|
27
49
|
export default {
|
|
28
50
|
title: 'Components/InlineCard',
|
|
29
51
|
component: InlineCard,
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface InlineCardSelectionProps {
|
|
3
|
+
children: React.ReactNode;
|
|
4
|
+
name: string;
|
|
5
|
+
value?: string[];
|
|
6
|
+
onChange?: (value: string[]) => void;
|
|
7
|
+
}
|
|
8
|
+
declare const InlineCardSelection: ({ children, name, value: propsValue, onChange: propsOnChange, }: InlineCardSelectionProps) => JSX.Element;
|
|
9
|
+
export default InlineCardSelection;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import React, { useCallback } from 'react';
|
|
2
|
+
import useFormNode from '../Form/useFormNode.hook';
|
|
3
|
+
import InlineCardSelectionContext from './_InlineCardSelection.context';
|
|
4
|
+
const InlineCardSelection = ({ children, name, value: propsValue, onChange: propsOnChange, }) => {
|
|
5
|
+
const { value: contextValue, onChange: contextOnChange } = useFormNode(name);
|
|
6
|
+
const value = contextValue || propsValue || [];
|
|
7
|
+
const wrappedOnChange = useCallback((val) => {
|
|
8
|
+
if (propsOnChange) {
|
|
9
|
+
propsOnChange(val);
|
|
10
|
+
}
|
|
11
|
+
if (contextOnChange) {
|
|
12
|
+
contextOnChange(val);
|
|
13
|
+
}
|
|
14
|
+
}, [propsOnChange, contextOnChange]);
|
|
15
|
+
const handleToggle = (_value) => {
|
|
16
|
+
if (!value) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
if (value.includes(_value)) {
|
|
20
|
+
wrappedOnChange(value.filter((val) => val !== _value));
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
wrappedOnChange([...value, _value]);
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
return (React.createElement(InlineCardSelectionContext.Provider, { value: { value, onToggle: handleToggle } }, children));
|
|
27
|
+
};
|
|
28
|
+
export default InlineCardSelection;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
export declare type CardSize = 'fill' | 'xs' | 'sm' | 'md' | 'lg';
|
|
3
|
+
interface InlineCardSelectionContextProps {
|
|
4
|
+
value?: string[];
|
|
5
|
+
onToggle?: (value: string) => void;
|
|
6
|
+
}
|
|
7
|
+
declare const InlineCardSelectionContext: import("react").Context<InlineCardSelectionContextProps>;
|
|
8
|
+
export default InlineCardSelectionContext;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface MinimalMenuProps {
|
|
3
|
+
children: React.ReactNode;
|
|
4
|
+
}
|
|
5
|
+
declare const MinimalMenu: {
|
|
6
|
+
({ children }: MinimalMenuProps): JSX.Element;
|
|
7
|
+
Item: ({ icon, active, onClick }: import("./_MinimalMenuItem.component").MinimalMenuItemProps) => JSX.Element;
|
|
8
|
+
Page: ({ children }: import("./_MinimalMenuPage.component").MinimalMenuPageProps) => JSX.Element;
|
|
9
|
+
};
|
|
10
|
+
export default MinimalMenu;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { useIsScreenSize } from '../../responsive/responsive';
|
|
3
|
+
import DesktopMinimalMenuContainer from './desktop/_DesktopMinimalMenuContainer.component';
|
|
4
|
+
import MobileMinimalMenuContainer from './mobile/_MobileMinimalMenuContainer.component';
|
|
5
|
+
import MinimalMenuItem from './_MinimalMenuItem.component';
|
|
6
|
+
import MinimalMenuPage from './_MinimalMenuPage.component';
|
|
7
|
+
const MinimalMenu = ({ children }) => {
|
|
8
|
+
const isMobile = useIsScreenSize('mobile');
|
|
9
|
+
if (isMobile) {
|
|
10
|
+
return React.createElement(MobileMinimalMenuContainer, null, children);
|
|
11
|
+
}
|
|
12
|
+
return React.createElement(DesktopMinimalMenuContainer, null, children);
|
|
13
|
+
};
|
|
14
|
+
MinimalMenu.Item = MinimalMenuItem;
|
|
15
|
+
MinimalMenu.Page = MinimalMenuPage;
|
|
16
|
+
export default MinimalMenu;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
|
+
import { menuHelpers, MinimalMenu, PaddedLayout, Text } from '../..';
|
|
3
|
+
import { faCalendarAlt, faCogs, faHamburger } from '@fortawesome/free-solid-svg-icons';
|
|
4
|
+
export const Standard = () => {
|
|
5
|
+
const [route, setRoute] = useState('/eat');
|
|
6
|
+
return (React.createElement(React.Fragment, null,
|
|
7
|
+
React.createElement(MinimalMenu, null,
|
|
8
|
+
React.createElement(MinimalMenu.Item, { icon: faHamburger, active: menuHelpers.isActiveItem([/\/eat/g], route), onClick: () => setRoute('/eat') }),
|
|
9
|
+
React.createElement(MinimalMenu.Item, { icon: faCalendarAlt, active: menuHelpers.isActiveItem([/\/plan/g], route), onClick: () => setRoute('/plan') }),
|
|
10
|
+
React.createElement(MinimalMenu.Item, { icon: faCogs, active: menuHelpers.isActiveItem([/\/manage/g], route), onClick: () => setRoute('/manage') })),
|
|
11
|
+
React.createElement(MinimalMenu.Page, null,
|
|
12
|
+
React.createElement(PaddedLayout, null,
|
|
13
|
+
React.createElement(Text, null,
|
|
14
|
+
"Suspendisse sit amet pellentesque nisi. Quisque eget velit sit amet mauris tincidunt dictum id et ex. Integer pulvinar tellus id viverra finibus. Cras dapibus diam a ante eleifend, ac ultrices ligula vestibulum. Nulla gravida ante nec mi tristique, vel elementum arcu volutpat. Nunc in lorem id ligula sodales tincidunt non ut ipsum. Fusce risus eros, dapibus sed lacus et, faucibus auctor purus. Nulla sed rhoncus ligula, at porttitor tellus. Aliquam vitae gravida quam. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque quis tempus risus.",
|
|
15
|
+
React.createElement("br", null),
|
|
16
|
+
React.createElement("br", null),
|
|
17
|
+
"Nullam tincidunt mauris ut lectus auctor aliquam. Aenean ornare mi et sollicitudin suscipit. Integer eu nulla at turpis molestie malesuada. Maecenas non consectetur massa. Nunc dui magna, imperdiet placerat bibendum ac, accumsan non lorem. Proin vulputate magna nisl, vel convallis elit iaculis quis. Proin maximus ante non ante vehicula sodales. Aliquam dui nisi, posuere vitae urna in, porta aliquet tellus. Curabitur commodo diam nec erat luctus, quis pharetra diam ultricies. Fusce sagittis libero lorem, convallis tristique mi egestas fermentum. Sed eu erat ut eros porttitor sollicitudin. Vivamus facilisis felis odio, ac tristique enim blandit a. Aliquam tincidunt iaculis sapien, sed vulputate mauris luctus ac. Donec aliquet ullamcorper orci quis tempor. Curabitur ac felis nulla.",
|
|
18
|
+
React.createElement("br", null),
|
|
19
|
+
React.createElement("br", null),
|
|
20
|
+
"Aenean vestibulum aliquam purus ut fringilla. Maecenas aliquet a nunc eget scelerisque. Mauris varius dignissim velit, vitae faucibus massa posuere sit amet. Nulla rutrum enim tellus, eget interdum massa ultricies sed. Proin pulvinar odio non lectus scelerisque, et varius nisl blandit. Donec nisl ante, ultricies eu volutpat ut, dapibus sed ex. Aliquam risus ex, porttitor vel commodo in, convallis laoreet dolor. Proin pretium neque pretium, laoreet dolor ultrices, vulputate sapien. Aenean rutrum lorem non mauris egestas accumsan.",
|
|
21
|
+
React.createElement("br", null),
|
|
22
|
+
React.createElement("br", null),
|
|
23
|
+
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean nibh lorem, mattis sed dolor ac, malesuada maximus lorem. Proin hendrerit maximus ipsum, eu laoreet erat congue a. Duis pellentesque leo sed nisi mattis, a sollicitudin sapien ornare. Mauris efficitur nulla metus. Etiam felis velit, mollis eget fringilla nec, venenatis non libero. Suspendisse at arcu rhoncus, tristique ex nec, blandit enim. Vivamus rutrum, felis faucibus vulputate vulputate, lacus quam sollicitudin eros, non consequat velit neque in lorem. Ut hendrerit lectus vel quam placerat tincidunt. Ut auctor tortor elit, ac aliquam orci pellentesque efficitur. Morbi eget sollicitudin est. Donec ullamcorper velit ipsum, non dapibus nisi vulputate ac. Proin dapibus, mi ac scelerisque sollicitudin, turpis augue hendrerit metus, eget dignissim justo lectus id urna. Vivamus massa ipsum, posuere eu risus non, ultrices convallis tellus. Mauris et egestas erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Donec sagittis porttitor nisi a gravida.",
|
|
24
|
+
React.createElement("br", null),
|
|
25
|
+
React.createElement("br", null),
|
|
26
|
+
"Donec mollis nisl quis scelerisque suscipit. Suspendisse eget risus ornare lorem convallis gravida sit amet id nisi. Duis venenatis tortor vitae facilisis auctor. Nulla in pretium odio, et aliquet dui. Sed non venenatis ex. Praesent felis sem, tincidunt et ligula sit amet, vulputate tincidunt tellus. Nam quis eros quis justo aliquet tempus. Nulla imperdiet bibendum velit, eu elementum felis cursus ut. Curabitur eget dui et urna vehicula porttitor sit amet vitae risus. Nulla vitae lacus id quam gravida volutpat at eu elit. Quisque efficitur hendrerit purus, sed viverra elit cursus non. Nunc at scelerisque eros, ut posuere erat. Suspendisse egestas volutpat orci, id ornare nisi aliquet vel.",
|
|
27
|
+
React.createElement("br", null),
|
|
28
|
+
React.createElement("br", null),
|
|
29
|
+
"Donec ultrices lectus lectus, eget mollis nisi venenatis vitae. Morbi cursus quis sapien ut ultrices. Quisque placerat, massa ut accumsan tempor, purus leo sollicitudin leo, eu auctor mauris quam nec nisl. Donec eu dignissim erat. Aenean bibendum blandit leo, sed posuere risus euismod eu. Ut dignissim nisl ex, eget condimentum turpis auctor in. Fusce tristique neque accumsan diam suscipit, vel blandit lorem sodales. Etiam ut tincidunt nisi, ut aliquet felis. Suspendisse vestibulum, velit imperdiet tempor varius, lectus massa consectetur lacus, sagittis scelerisque ante enim non metus. Donec nunc nisl, fermentum scelerisque ornare nec, congue id velit. Praesent vehicula dolor nisl, vel sollicitudin nisl ullamcorper sit amet. Maecenas nec ante eu dui interdum mollis. Maecenas urna enim, maximus et ligula at, aliquet varius arcu. Ut justo arcu, commodo iaculis est ut, ornare posuere arcu.",
|
|
30
|
+
React.createElement("br", null),
|
|
31
|
+
React.createElement("br", null),
|
|
32
|
+
"Curabitur at nunc et erat placerat laoreet aliquet in eros. Proin sagittis dolor libero, ut ultrices elit euismod vitae. Phasellus non tellus tellus. Morbi sit amet auctor lacus. Maecenas commodo sagittis ex nec eleifend. Mauris sit amet augue a sapien vulputate rhoncus. Donec dignissim finibus erat, sit amet suscipit arcu blandit non. Sed pulvinar tincidunt volutpat. Proin pretium leo non enim pretium, vitae porttitor felis pellentesque. Nam tincidunt euismod arcu quis aliquam. Maecenas in lorem et tortor sagittis efficitur. Vestibulum est odio, tristique eget massa vitae, porta tincidunt magna. Curabitur tempus velit ut auctor auctor. Integer ultricies lorem vitae nibh convallis, ac placerat tellus rutrum.",
|
|
33
|
+
React.createElement("br", null),
|
|
34
|
+
React.createElement("br", null),
|
|
35
|
+
"Curabitur ac lorem vitae lorem convallis tincidunt. Aenean luctus, dolor et blandit consectetur, odio risus lacinia ante, non auctor libero turpis accumsan metus. Donec accumsan vitae lacus a varius. Aliquam ac ultricies massa. Praesent vel lacus tempus, interdum nisi eget, varius justo. Pellentesque nec mauris ac dolor fringilla pulvinar. Sed sollicitudin nec lectus nec condimentum. Maecenas molestie blandit ipsum ut finibus. Cras eu nibh congue, porta metus vel, pellentesque tellus.",
|
|
36
|
+
React.createElement("br", null),
|
|
37
|
+
React.createElement("br", null),
|
|
38
|
+
"Morbi feugiat, arcu vel ultricies ultrices, justo odio faucibus purus, vel pharetra augue metus nec purus. Suspendisse sit amet leo ipsum. Vivamus ut velit ut ante consectetur vehicula ut at mi. Nam et ex at nisl ullamcorper maximus nec vel est. Fusce ut est neque. Vivamus dictum, ipsum porta varius tempus, arcu diam sollicitudin risus, in vulputate est orci sit amet ligula. Donec a est vel lacus consectetur dictum.")))));
|
|
39
|
+
};
|
|
40
|
+
export default {
|
|
41
|
+
title: 'Components/MinimalMenu',
|
|
42
|
+
component: MinimalMenu,
|
|
43
|
+
parameters: {
|
|
44
|
+
layout: 'fullscreen',
|
|
45
|
+
},
|
|
46
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import { IconProp } from '@fortawesome/fontawesome-svg-core';
|
|
3
|
+
export interface MinimalMenuItemProps {
|
|
4
|
+
icon?: IconProp;
|
|
5
|
+
active?: boolean;
|
|
6
|
+
onClick?: () => void;
|
|
7
|
+
}
|
|
8
|
+
declare const MinimalMenuItem: ({ icon, active, onClick }: MinimalMenuItemProps) => JSX.Element;
|
|
9
|
+
export default MinimalMenuItem;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { useIsScreenSize } from '../../responsive/responsive';
|
|
3
|
+
import MobileMinimalMenuItem from './mobile/_MobileMinimalMenuItem.component';
|
|
4
|
+
import DesktopMinimalMenuItem from './desktop/_DesktopMinimalMenuItem.component';
|
|
5
|
+
const MinimalMenuItem = ({ icon, active, onClick }) => {
|
|
6
|
+
const isMobile = useIsScreenSize('mobile');
|
|
7
|
+
if (isMobile) {
|
|
8
|
+
return React.createElement(MobileMinimalMenuItem, { icon: icon, active: active, onClick: onClick });
|
|
9
|
+
}
|
|
10
|
+
return React.createElement(DesktopMinimalMenuItem, { icon: icon, active: active, onClick: onClick });
|
|
11
|
+
};
|
|
12
|
+
export default MinimalMenuItem;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { useIsScreenSize } from '../../responsive/responsive';
|
|
3
|
+
import MobileMinimalMenuPage from './mobile/_MobileMinimalMenuPage.component';
|
|
4
|
+
import DesktopMinimalMenuPage from './desktop/_DesktopMinimalMenuPage.component';
|
|
5
|
+
const MinimalMenuPage = ({ children }) => {
|
|
6
|
+
const isMobile = useIsScreenSize('mobile');
|
|
7
|
+
if (isMobile) {
|
|
8
|
+
return React.createElement(MobileMinimalMenuPage, null, children);
|
|
9
|
+
}
|
|
10
|
+
return React.createElement(DesktopMinimalMenuPage, null, children);
|
|
11
|
+
};
|
|
12
|
+
export default MinimalMenuPage;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import styled from 'styled-components';
|
|
3
|
+
const DesktopMinimalMenuOuter = styled.div `
|
|
4
|
+
position: fixed;
|
|
5
|
+
top: 0;
|
|
6
|
+
left: 0;
|
|
7
|
+
|
|
8
|
+
width: 64px;
|
|
9
|
+
height: 100%;
|
|
10
|
+
z-index: 10;
|
|
11
|
+
|
|
12
|
+
background-color: ${(props) => props.theme.colours.cardBackground};
|
|
13
|
+
`;
|
|
14
|
+
const DesktopMinimalMenuContainer = ({ children }) => {
|
|
15
|
+
return React.createElement(DesktopMinimalMenuOuter, null, children);
|
|
16
|
+
};
|
|
17
|
+
export default DesktopMinimalMenuContainer;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import { IconProp } from '@fortawesome/fontawesome-svg-core';
|
|
3
|
+
export interface DesktopMinimalMenuItemProps {
|
|
4
|
+
icon?: IconProp;
|
|
5
|
+
active?: boolean;
|
|
6
|
+
onClick?: () => void;
|
|
7
|
+
}
|
|
8
|
+
declare const DesktopMinimalMenuItem: ({ icon, active, onClick }: DesktopMinimalMenuItemProps) => JSX.Element;
|
|
9
|
+
export default DesktopMinimalMenuItem;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
2
|
+
import { motion } from 'framer-motion';
|
|
3
|
+
import React, { useMemo } from 'react';
|
|
4
|
+
import styled, { useTheme } from 'styled-components';
|
|
5
|
+
const ItemContainer = styled(motion.div) `
|
|
6
|
+
position: relative;
|
|
7
|
+
|
|
8
|
+
color: ${(props) => props.theme.colours.defaultFont};
|
|
9
|
+
font-size: 28px;
|
|
10
|
+
cursor: pointer;
|
|
11
|
+
|
|
12
|
+
width: 64px;
|
|
13
|
+
height: 64px;
|
|
14
|
+
display: flex;
|
|
15
|
+
justify-content: center;
|
|
16
|
+
align-items: center;
|
|
17
|
+
`;
|
|
18
|
+
const MenuIconBar = styled(motion.div) `
|
|
19
|
+
position: absolute;
|
|
20
|
+
top: 2px;
|
|
21
|
+
left: 2px;
|
|
22
|
+
|
|
23
|
+
height: 60px;
|
|
24
|
+
`;
|
|
25
|
+
const iconContainerVariants = {
|
|
26
|
+
// hover: { x: 2 },
|
|
27
|
+
active: { x: 2 },
|
|
28
|
+
hoverActive: { x: 2 },
|
|
29
|
+
};
|
|
30
|
+
const DesktopMinimalMenuItem = ({ icon, active, onClick }) => {
|
|
31
|
+
const theme = useTheme();
|
|
32
|
+
const barVariants = useMemo(() => ({
|
|
33
|
+
hover: { opacity: 1, backgroundColor: theme.colours.defaultBorder, width: 4 },
|
|
34
|
+
active: { opacity: 1, backgroundColor: theme.colours.primary.main, width: 4 },
|
|
35
|
+
hoverActive: { opacity: 1, backgroundColor: theme.colours.primary.main, width: 4 },
|
|
36
|
+
}), [theme]);
|
|
37
|
+
return (React.createElement(ItemContainer, { whileHover: active ? 'hoverActive' : 'hover', animate: active ? 'active' : undefined, onClick: onClick },
|
|
38
|
+
React.createElement(MenuIconBar, { style: { backgroundColor: theme.colours.cardBackground, opacity: 0 }, variants: barVariants, transition: { type: 'spring', duration: 0.3 } }),
|
|
39
|
+
icon && (React.createElement(motion.div, { variants: iconContainerVariants },
|
|
40
|
+
React.createElement(FontAwesomeIcon, { icon: icon })))));
|
|
41
|
+
};
|
|
42
|
+
export default DesktopMinimalMenuItem;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import styled from 'styled-components';
|
|
3
|
+
const PageOuter = styled.div `
|
|
4
|
+
padding-left: 64px;
|
|
5
|
+
`;
|
|
6
|
+
const DesktopMinimalMenuPage = ({ children }) => {
|
|
7
|
+
return React.createElement(PageOuter, null, children);
|
|
8
|
+
};
|
|
9
|
+
export default DesktopMinimalMenuPage;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const mobileMenuDefaultTransition = { type: 'spring', duration: 0.2, bounce: 0 };
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
const MobileMenuBump = () => (React.createElement("svg", { width: '86', height: '24', viewBox: '0 0 86 24', fill: 'none', xmlns: 'http://www.w3.org/2000/svg' },
|
|
3
|
+
React.createElement("path", { d: 'M86 19C86 26.6902 62.4543 22.5 41.5 22.5C22 22 0 25.1902 0 19C9 18.1902 9.91176 16.75 17.5 10.5C25.0882 4.25 31.6176 0.0597534 43 0.0597534C54.3824 0.0597534 61.4118 4.75 69 11C76.5882 17.25 79.5 18.1902 86 19Z' })));
|
|
4
|
+
export default MobileMenuBump;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { motion } from 'framer-motion';
|
|
2
|
+
import React, { useState } from 'react';
|
|
3
|
+
import styled from 'styled-components';
|
|
4
|
+
import { mobileMenuDefaultTransition } from './_MobileMenu.constants';
|
|
5
|
+
import MobileMenuBump from './_MobileMenuBump.component';
|
|
6
|
+
import MobileMenuBumpContext from './_MobileMenuBump.context';
|
|
7
|
+
const MobileMinimalMenuOuter = styled.div `
|
|
8
|
+
position: fixed;
|
|
9
|
+
bottom: 0;
|
|
10
|
+
left: 0;
|
|
11
|
+
|
|
12
|
+
width: 100%;
|
|
13
|
+
height: 48px;
|
|
14
|
+
z-index: 10;
|
|
15
|
+
|
|
16
|
+
display: flex;
|
|
17
|
+
justify-content: space-evenly;
|
|
18
|
+
|
|
19
|
+
background-color: ${(props) => props.theme.colours.cardBackground};
|
|
20
|
+
`;
|
|
21
|
+
const AnimatedMenuBumpContainer = styled(motion.div) `
|
|
22
|
+
position: fixed;
|
|
23
|
+
bottom: 46px;
|
|
24
|
+
left: 0;
|
|
25
|
+
|
|
26
|
+
width: 86px;
|
|
27
|
+
height: 24px;
|
|
28
|
+
|
|
29
|
+
svg {
|
|
30
|
+
fill: ${(props) => props.theme.colours.cardBackground};
|
|
31
|
+
}
|
|
32
|
+
`;
|
|
33
|
+
const MobileMinimalMenuContainer = ({ children }) => {
|
|
34
|
+
const [bumpX, setBumpX] = useState(0);
|
|
35
|
+
return (React.createElement(MobileMenuBumpContext.Provider, { value: { setBumpX } },
|
|
36
|
+
React.createElement(MobileMinimalMenuOuter, null,
|
|
37
|
+
React.createElement(AnimatedMenuBumpContainer, { animate: { opacity: bumpX ? 1 : 0, x: bumpX ? bumpX - 86 / 2 : undefined, y: bumpX ? 0 : 100 }, transition: mobileMenuDefaultTransition },
|
|
38
|
+
React.createElement(MobileMenuBump, null)),
|
|
39
|
+
children)));
|
|
40
|
+
};
|
|
41
|
+
export default MobileMinimalMenuContainer;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import { IconProp } from '@fortawesome/fontawesome-svg-core';
|
|
3
|
+
export interface MobileMinimalMenuItemProps {
|
|
4
|
+
icon?: IconProp;
|
|
5
|
+
active?: boolean;
|
|
6
|
+
onClick?: () => void;
|
|
7
|
+
}
|
|
8
|
+
declare const MobileMinimalMenuItem: ({ icon, active, onClick }: MobileMinimalMenuItemProps) => JSX.Element;
|
|
9
|
+
export default MobileMinimalMenuItem;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import React, { useContext, useEffect, useRef } from 'react';
|
|
2
|
+
import styled from 'styled-components';
|
|
3
|
+
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
4
|
+
import { motion } from 'framer-motion';
|
|
5
|
+
import MobileMenuBumpContext from './_MobileMenuBump.context';
|
|
6
|
+
import { mobileMenuDefaultTransition } from './_MobileMenu.constants';
|
|
7
|
+
import useWindowDimensions from '../../../hooks/useWindowDimensions';
|
|
8
|
+
const ItemContainer = styled.div `
|
|
9
|
+
position: relative;
|
|
10
|
+
|
|
11
|
+
color: ${(props) => props.theme.colours.defaultFont};
|
|
12
|
+
cursor: pointer;
|
|
13
|
+
|
|
14
|
+
width: 48px;
|
|
15
|
+
height: 48px;
|
|
16
|
+
display: flex;
|
|
17
|
+
justify-content: center;
|
|
18
|
+
align-items: center;
|
|
19
|
+
`;
|
|
20
|
+
const iconContainerVariants = {
|
|
21
|
+
active: { fontSize: '28px', y: -8 },
|
|
22
|
+
};
|
|
23
|
+
const MobileMinimalMenuItem = ({ icon, active, onClick }) => {
|
|
24
|
+
const { width } = useWindowDimensions();
|
|
25
|
+
const { setBumpX } = useContext(MobileMenuBumpContext);
|
|
26
|
+
const itemRef = useRef(null);
|
|
27
|
+
useEffect(() => {
|
|
28
|
+
if (active && width > 0) {
|
|
29
|
+
const left = itemRef.current?.offsetLeft;
|
|
30
|
+
const center = left ? left + 48 / 2 : undefined;
|
|
31
|
+
setBumpX(center);
|
|
32
|
+
}
|
|
33
|
+
return () => {
|
|
34
|
+
if (active) {
|
|
35
|
+
setBumpX(undefined);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
}, [active, setBumpX, width]);
|
|
39
|
+
return (React.createElement(ItemContainer, { onClick: onClick, ref: itemRef }, icon && (React.createElement(motion.div, { animate: active ? 'active' : undefined, style: { fontSize: '20px' }, variants: iconContainerVariants, transition: mobileMenuDefaultTransition },
|
|
40
|
+
React.createElement(FontAwesomeIcon, { icon: icon })))));
|
|
41
|
+
};
|
|
42
|
+
export default MobileMinimalMenuItem;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import styled from 'styled-components';
|
|
3
|
+
const PageOuter = styled.div `
|
|
4
|
+
padding-bottom: 64px;
|
|
5
|
+
`;
|
|
6
|
+
const MobileMinimalMenuPage = ({ children }) => {
|
|
7
|
+
return React.createElement(PageOuter, null, children);
|
|
8
|
+
};
|
|
9
|
+
export default MobileMinimalMenuPage;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { useState, useEffect } from 'react';
|
|
2
|
+
function getWindowDimensions() {
|
|
3
|
+
const { innerWidth: width, innerHeight: height } = window;
|
|
4
|
+
return {
|
|
5
|
+
width,
|
|
6
|
+
height,
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
export default function useWindowDimensions() {
|
|
10
|
+
const [windowDimensions, setWindowDimensions] = useState(getWindowDimensions());
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
function handleResize() {
|
|
13
|
+
setWindowDimensions(getWindowDimensions());
|
|
14
|
+
}
|
|
15
|
+
window.addEventListener('resize', handleResize);
|
|
16
|
+
return () => window.removeEventListener('resize', handleResize);
|
|
17
|
+
}, []);
|
|
18
|
+
return windowDimensions;
|
|
19
|
+
}
|
package/build/index.d.ts
CHANGED
|
@@ -14,12 +14,14 @@ export { default as Notifications } from './components/Notifications/Notificatio
|
|
|
14
14
|
export { default as ImageUpload } from './components/ImageUpload/ImageUpload.component';
|
|
15
15
|
export { default as InlineCard } from './components/InlineCard/InlineCard.component';
|
|
16
16
|
export { default as InlineCardGroup } from './components/InlineCard/InlineCardGroup.component';
|
|
17
|
+
export { default as InlineCardSelection } from './components/InlineCard/InlineCardSelection.component';
|
|
17
18
|
export { default as Input } from './components/Input/Input.component';
|
|
18
19
|
export { default as Heading } from './components/Heading/Heading.component';
|
|
19
20
|
export { default as LiveInput } from './components/LiveInput/LiveInput.component';
|
|
20
21
|
export { default as LiveList } from './components/LiveList/LiveList.component';
|
|
21
22
|
export { default as Loader } from './components/Loader/Loader.component';
|
|
22
23
|
export { default as Menu } from './components/Menu/Menu.component';
|
|
24
|
+
export { default as MinimalMenu } from './components/MinimalMenu/MinimalMenu.component';
|
|
23
25
|
export { default as Modal } from './components/Modal/Modal.component';
|
|
24
26
|
export { default as PageHeader } from './components/PageHeader/PageHeader.component';
|
|
25
27
|
export { default as ProfileImage } from './components/ProfileImage/ProfileImage.component';
|
package/build/index.js
CHANGED
|
@@ -14,12 +14,14 @@ export { default as Notifications } from './components/Notifications/Notificatio
|
|
|
14
14
|
export { default as ImageUpload } from './components/ImageUpload/ImageUpload.component';
|
|
15
15
|
export { default as InlineCard } from './components/InlineCard/InlineCard.component';
|
|
16
16
|
export { default as InlineCardGroup } from './components/InlineCard/InlineCardGroup.component';
|
|
17
|
+
export { default as InlineCardSelection } from './components/InlineCard/InlineCardSelection.component';
|
|
17
18
|
export { default as Input } from './components/Input/Input.component';
|
|
18
19
|
export { default as Heading } from './components/Heading/Heading.component';
|
|
19
20
|
export { default as LiveInput } from './components/LiveInput/LiveInput.component';
|
|
20
21
|
export { default as LiveList } from './components/LiveList/LiveList.component';
|
|
21
22
|
export { default as Loader } from './components/Loader/Loader.component';
|
|
22
23
|
export { default as Menu } from './components/Menu/Menu.component';
|
|
24
|
+
export { default as MinimalMenu } from './components/MinimalMenu/MinimalMenu.component';
|
|
23
25
|
export { default as Modal } from './components/Modal/Modal.component';
|
|
24
26
|
export { default as PageHeader } from './components/PageHeader/PageHeader.component';
|
|
25
27
|
export { default as ProfileImage } from './components/ProfileImage/ProfileImage.component';
|
|
@@ -6,6 +6,7 @@ export interface IStyleBoundFunctions {
|
|
|
6
6
|
}
|
|
7
7
|
declare function useStylesFor(screenSize: ScreenSize): IStyleBoundFunctions;
|
|
8
8
|
declare function getWidthFor(screenSize: ScreenSize): string;
|
|
9
|
+
export declare function useIsScreenSize(screenSize: ScreenSize): boolean;
|
|
9
10
|
declare const _default: {
|
|
10
11
|
useStylesFor: typeof useStylesFor;
|
|
11
12
|
getWidthFor: typeof getWidthFor;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import useWindowDimensions from '../hooks/useWindowDimensions';
|
|
1
2
|
const responsiveScreens = {
|
|
2
3
|
mobile: {
|
|
3
4
|
min: 0,
|
|
@@ -60,4 +61,15 @@ function getWidthFor(screenSize) {
|
|
|
60
61
|
}
|
|
61
62
|
return `${screenDefinition.max}px`;
|
|
62
63
|
}
|
|
64
|
+
export function useIsScreenSize(screenSize) {
|
|
65
|
+
const { width } = useWindowDimensions();
|
|
66
|
+
if (!screenSize) {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
const screenDefinition = responsiveScreens[screenSize];
|
|
70
|
+
if (!screenDefinition) {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
return width >= screenDefinition.min && width <= screenDefinition.max;
|
|
74
|
+
}
|
|
63
75
|
export default { useStylesFor, getWidthFor };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dtdot/lego",
|
|
3
|
-
"version": "0.17.
|
|
3
|
+
"version": "0.17.12",
|
|
4
4
|
"description": "Some reusable components for building my applications",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -40,6 +40,7 @@
|
|
|
40
40
|
"eslint-plugin-prettier": "^3.4.1",
|
|
41
41
|
"eslint-plugin-react": "^7.28.0",
|
|
42
42
|
"eslint-plugin-react-hooks": "^4.3.0",
|
|
43
|
+
"framer-motion": "^6.2.6",
|
|
43
44
|
"prettier": "^2.5.1",
|
|
44
45
|
"prettier-eslint": "^12.0.0",
|
|
45
46
|
"react": "^17.0.2",
|
|
@@ -49,6 +50,7 @@
|
|
|
49
50
|
"typescript": "^4.5.5"
|
|
50
51
|
},
|
|
51
52
|
"peerDependencies": {
|
|
53
|
+
"framer-motion": "^6.2.6",
|
|
52
54
|
"react": "^17.0.1",
|
|
53
55
|
"react-dom": "^17.0.1",
|
|
54
56
|
"styled-components": "^5.2.1"
|
|
@@ -57,7 +59,6 @@
|
|
|
57
59
|
"@fortawesome/fontawesome-svg-core": "^1.2.32",
|
|
58
60
|
"@fortawesome/free-solid-svg-icons": "^5.15.4",
|
|
59
61
|
"@fortawesome/react-fontawesome": "^0.1.13",
|
|
60
|
-
"framer-motion": "^6.2.6",
|
|
61
62
|
"identicon.js": "^2.3.3",
|
|
62
63
|
"qrcode": "^1.5.0",
|
|
63
64
|
"react-use-measure": "^2.1.1",
|