mirror of
https://github.com/roleypoly/roleypoly.git
synced 2025-06-16 09:39:09 +00:00
Refactor node packages to yarn workspaces & ditch next.js for CRA. (#161)
* chore: restructure project into yarn workspaces, remove next * fix tests, remove webapp from terraform * remove more ui deployment bits * remove pages, fix FUNDING.yml * remove isomorphism * remove next providers * fix linting issues * feat: start basis of new web ui system on CRA * chore: move types to @roleypoly/types package * chore: move src/common/utils to @roleypoly/misc-utils * chore: remove roleypoly/ path remappers * chore: renmove vercel config * chore: re-add worker-types to api package * chore: fix type linting scope for api * fix(web): craco should include all of packages dir * fix(ci): change api webpack path for wrangler * chore: remove GAR actions from CI * chore: update codeql job * chore: test better github dar matcher in lint-staged
This commit is contained in:
parent
49e308507e
commit
2ff6588030
328 changed files with 16624 additions and 3525 deletions
|
@ -0,0 +1,68 @@
|
|||
import * as React from 'react';
|
||||
import { mediaQueryDefs } from './Breakpoints';
|
||||
import { BreakpointContext, ScreenSize } from './Context';
|
||||
|
||||
const resetScreen: ScreenSize = {
|
||||
onSmallScreen: false,
|
||||
onTablet: false,
|
||||
onDesktop: false,
|
||||
};
|
||||
|
||||
export class BreakpointsProvider extends React.Component<{}, ScreenSize> {
|
||||
public state = {
|
||||
...resetScreen,
|
||||
onSmallScreen: true,
|
||||
};
|
||||
|
||||
private mediaQueries: { [key in keyof ScreenSize]: MediaQueryList } = {
|
||||
onSmallScreen: window.matchMedia(
|
||||
mediaQueryDefs.onSmallScreen.replace('@media screen and', '')
|
||||
),
|
||||
onTablet: window.matchMedia(
|
||||
mediaQueryDefs.onTablet.replace('@media screen and', '')
|
||||
),
|
||||
onDesktop: window.matchMedia(
|
||||
mediaQueryDefs.onDesktop.replace('@media screen and', '')
|
||||
),
|
||||
};
|
||||
|
||||
componentDidMount() {
|
||||
Object.entries(this.mediaQueries).forEach(([key, mediaQuery]) =>
|
||||
mediaQuery.addEventListener('change', this.handleMediaEvent)
|
||||
);
|
||||
}
|
||||
|
||||
componentWillUnmount() {
|
||||
Object.entries(this.mediaQueries).forEach(([key, mediaQuery]) =>
|
||||
mediaQuery.removeEventListener('change', this.handleMediaEvent)
|
||||
);
|
||||
}
|
||||
|
||||
handleMediaEvent = (event: MediaQueryListEvent) => {
|
||||
console.log('handleMediaEvent', { event });
|
||||
this.setState({
|
||||
...resetScreen,
|
||||
...this.calculateScreen(),
|
||||
});
|
||||
};
|
||||
|
||||
calculateScreen = () => {
|
||||
if (this.mediaQueries.onDesktop.matches) {
|
||||
return { onDesktop: true };
|
||||
}
|
||||
|
||||
if (this.mediaQueries.onTablet.matches) {
|
||||
return { onTablet: true };
|
||||
}
|
||||
|
||||
return { onSmallScreen: true };
|
||||
};
|
||||
|
||||
render() {
|
||||
return (
|
||||
<BreakpointContext.Provider value={{ screenSize: { ...this.state } }}>
|
||||
{this.props.children}
|
||||
</BreakpointContext.Provider>
|
||||
);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
import * as React from 'react';
|
||||
import { BreakpointsProvider } from './BreakpointProvider';
|
||||
import { BreakpointDebugTool } from './DebugTool';
|
||||
|
||||
export default {
|
||||
title: 'Atoms/Breakpoints',
|
||||
decorators: [(story) => <BreakpointsProvider>{story()}</BreakpointsProvider>],
|
||||
component: BreakpointDebugTool,
|
||||
};
|
||||
|
||||
export const DebugTool = () => <BreakpointDebugTool />;
|
34
packages/design-system/atoms/breakpoints/Breakpoints.ts
Normal file
34
packages/design-system/atoms/breakpoints/Breakpoints.ts
Normal file
|
@ -0,0 +1,34 @@
|
|||
export const breakpoints = {
|
||||
onTablet: 768,
|
||||
onDesktop: 1024,
|
||||
};
|
||||
|
||||
export const mediaQueryDefs = {
|
||||
onSmallScreen: `@media screen and (max-width: ${breakpoints.onTablet - 1}px)`,
|
||||
onTablet: `@media screen and (min-width: ${breakpoints.onTablet}px)`,
|
||||
onDesktop: `@media screen and (min-width: ${breakpoints.onDesktop}px)`,
|
||||
};
|
||||
|
||||
export const onTablet = (...expressions: any) => {
|
||||
return `
|
||||
${mediaQueryDefs.onTablet} {
|
||||
${expressions.join()}
|
||||
}
|
||||
`;
|
||||
};
|
||||
|
||||
export const onDesktop = (...expressions: any) => {
|
||||
return `
|
||||
${mediaQueryDefs.onDesktop} {
|
||||
${expressions.join()}
|
||||
}
|
||||
`;
|
||||
};
|
||||
|
||||
export const onSmallScreen = (...expressions: any) => {
|
||||
return `
|
||||
${mediaQueryDefs.onSmallScreen} {
|
||||
${expressions.join()}
|
||||
}
|
||||
`;
|
||||
};
|
27
packages/design-system/atoms/breakpoints/Context.ts
Normal file
27
packages/design-system/atoms/breakpoints/Context.ts
Normal file
|
@ -0,0 +1,27 @@
|
|||
import { withContext } from '@roleypoly/misc-utils/withContext';
|
||||
import * as React from 'react';
|
||||
|
||||
export type ScreenSize = {
|
||||
onSmallScreen: boolean;
|
||||
onTablet: boolean;
|
||||
onDesktop: boolean;
|
||||
};
|
||||
|
||||
export type BreakpointProps = {
|
||||
screenSize: ScreenSize;
|
||||
};
|
||||
|
||||
const defaultScreenSize: BreakpointProps = {
|
||||
screenSize: {
|
||||
onSmallScreen: true,
|
||||
onDesktop: false,
|
||||
onTablet: false,
|
||||
},
|
||||
};
|
||||
|
||||
export const BreakpointContext = React.createContext(defaultScreenSize);
|
||||
|
||||
export const useBreakpointContext = () => React.useContext(BreakpointContext);
|
||||
|
||||
export const withBreakpoints = <T>(Component: React.ComponentType<T>) =>
|
||||
withContext(BreakpointContext, Component as any);
|
56
packages/design-system/atoms/breakpoints/DebugTool.tsx
Normal file
56
packages/design-system/atoms/breakpoints/DebugTool.tsx
Normal file
|
@ -0,0 +1,56 @@
|
|||
import * as React from 'react';
|
||||
import styled from 'styled-components';
|
||||
import { onDesktop, onTablet } from './Breakpoints';
|
||||
import { useBreakpointContext } from './Context';
|
||||
|
||||
const DebuggerPosition = styled.div`
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
font-family: monospace;
|
||||
& > div {
|
||||
display: flex;
|
||||
}
|
||||
`;
|
||||
|
||||
const OnSmallScreen = styled.div`
|
||||
display: block;
|
||||
`;
|
||||
|
||||
const OnTablet = styled.div`
|
||||
display: none;
|
||||
${onTablet(`display: block;`)}
|
||||
`;
|
||||
|
||||
const OnDesktop = styled.div`
|
||||
display: none;
|
||||
${onDesktop`display: block;`}
|
||||
`;
|
||||
|
||||
const CSSBreakpointDebugger = () => (
|
||||
<div>
|
||||
<OnSmallScreen style={{ backgroundColor: 'red' }}>S</OnSmallScreen>
|
||||
<OnTablet style={{ backgroundColor: 'green' }}>T</OnTablet>
|
||||
<OnDesktop style={{ backgroundColor: 'blue' }}>D</OnDesktop>
|
||||
</div>
|
||||
);
|
||||
|
||||
const JSBreakpointDebugger = () => {
|
||||
const {
|
||||
screenSize: { onTablet, onDesktop, onSmallScreen },
|
||||
} = useBreakpointContext();
|
||||
|
||||
return (
|
||||
<div>
|
||||
{onSmallScreen && <div style={{ backgroundColor: 'red' }}>S</div>}
|
||||
{onTablet && <div style={{ backgroundColor: 'green' }}>T</div>}
|
||||
{onDesktop && <div style={{ backgroundColor: 'blue' }}>D</div>}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
export const BreakpointDebugTool = () => (
|
||||
<DebuggerPosition>
|
||||
<JSBreakpointDebugger />
|
||||
<CSSBreakpointDebugger />
|
||||
</DebuggerPosition>
|
||||
);
|
3
packages/design-system/atoms/breakpoints/index.ts
Normal file
3
packages/design-system/atoms/breakpoints/index.ts
Normal file
|
@ -0,0 +1,3 @@
|
|||
export * from './BreakpointProvider';
|
||||
export * from './Breakpoints';
|
||||
export * from './Context';
|
Loading…
Add table
Add a link
Reference in a new issue