From ea2683da009ea915f31d710aeaa27ff4b3488a0e Mon Sep 17 00:00:00 2001 From: Katalina Okano Date: Sat, 10 Oct 2020 12:53:46 -0400 Subject: [PATCH] feat(design-system): pre-port of roleypoly/ui --- src/design-system/BUILD.bazel | 8 ++ .../demo-discord/DemoDiscord.story.tsx | 7 + .../demo-discord/DemoDiscord.styled.ts | 67 +++++++++ .../molecules/demo-discord/DemoDiscord.tsx | 53 +++++++ .../molecules/demo-discord/index.ts | 1 + .../demo-picker/DemoPicker.story.tsx | 7 + .../molecules/demo-picker/DemoPicker.tsx | 46 ++++++ .../molecules/demo-picker/index.ts | 1 + src/design-system/molecules/footer/Flags.tsx | 94 ++++++++++++ .../molecules/footer/Footer.story.tsx | 7 + .../molecules/footer/Footer.styled.ts | 30 ++++ src/design-system/molecules/footer/Footer.tsx | 27 ++++ src/design-system/molecules/footer/index.ts | 1 + .../molecules/guild-nav/GuildNav.story.tsx | 18 +++ .../molecules/guild-nav/GuildNav.styled.ts | 21 +++ .../molecules/guild-nav/GuildNav.tsx | 64 +++++++++ .../molecules/guild-nav/index.ts | 1 + .../molecules/molecules.story.tsx | 2 + .../molecules/nav-slug/NavSlug.story.tsx | 9 ++ .../molecules/nav-slug/NavSlug.styled.ts | 16 +++ .../molecules/nav-slug/NavSlug.tsx | 18 +++ src/design-system/molecules/nav-slug/index.ts | 1 + .../picker-category/PickerCategory.story.tsx | 36 +++++ .../picker-category/PickerCategory.styled.tsx | 20 +++ .../picker-category/PickerCategory.tsx | 64 +++++++++ .../molecules/picker-category/index.ts | 1 + .../PreauthGreeting.story.tsx | 8 ++ .../preauth-greeting/PreauthGreeting.tsx | 31 ++++ .../molecules/preauth-greeting/index.ts | 1 + .../PreauthSecretCode.spec.tsx | 37 +++++ .../PreauthSecretCode.story.tsx | 8 ++ .../preauth-secret-code/PreauthSecretCode.tsx | 46 ++++++ .../molecules/preauth-secret-code/index.ts | 1 + .../reset-submit/ResetSubmit.spec.tsx | 23 +++ .../reset-submit/ResetSubmit.story.tsx | 9 ++ .../reset-submit/ResetSubmit.styled.ts | 19 +++ .../molecules/reset-submit/ResetSubmit.tsx | 42 ++++++ .../molecules/reset-submit/index.ts | 1 + .../server-masthead/ServerMasthead.spec.tsx | 19 +++ .../server-masthead/ServerMasthead.story.tsx | 9 ++ .../server-masthead/ServerMasthead.styled.ts | 36 +++++ .../server-masthead/ServerMasthead.tsx | 36 +++++ .../molecules/server-masthead/index.ts | 1 + .../UserAvatarGroup.story.tsx | 13 ++ .../UserAvatarGroup.styled.ts | 29 ++++ .../user-avatar-group/UserAvatarGroup.tsx | 24 ++++ .../molecules/user-avatar-group/index.ts | 1 + .../user-popover/UserPopover.story.tsx | 13 ++ .../user-popover/UserPopover.styled.ts | 33 +++++ .../molecules/user-popover/UserPopover.tsx | 30 ++++ .../molecules/user-popover/index.ts | 1 + .../organisms/app-shell/AppShell.story.tsx | 18 +++ .../organisms/app-shell/AppShell.styled.tsx | 22 +++ .../organisms/app-shell/AppShell.tsx | 41 ++++++ .../organisms/app-shell/index.ts | 1 + .../error-banner/ErrorBanner.story.tsx | 16 +++ .../error-banner/ErrorBanner.styled.ts | 40 ++++++ .../organisms/error-banner/ErrorBanner.tsx | 24 ++++ .../organisms/error-banner/index.ts | 1 + .../help-page-base/HelpPageBase.story.tsx | 19 +++ .../organisms/help-page-base/HelpPageBase.tsx | 21 +++ .../organisms/help-page-base/index.ts | 1 + .../help-why-no-roles/WhyNoRoles.story.tsx | 10 ++ .../help-why-no-roles/WhyNoRoles.styled.ts | 35 +++++ .../help-why-no-roles/WhyNoRoles.tsx | 83 +++++++++++ .../organisms/help-why-no-roles/index.ts | 1 + .../organisms/landing/Landing.story.tsx | 7 + .../organisms/landing/Landing.styled.ts | 31 ++++ .../organisms/landing/Landing.tsx | 38 +++++ src/design-system/organisms/landing/index.ts | 1 + .../organisms/masthead/Authed.tsx | 99 +++++++++++++ .../organisms/masthead/Guest.tsx | 39 +++++ .../organisms/masthead/Masthead.story.tsx | 17 +++ .../organisms/masthead/Masthead.styled.tsx | 91 ++++++++++++ src/design-system/organisms/masthead/index.ts | 2 + .../organisms/organisms.story.tsx | 2 + .../organisms/preauth/Preauth.story.tsx | 32 +++++ .../organisms/preauth/Preauth.tsx | 57 ++++++++ .../organisms/role-picker/RolePicker.spec.tsx | 43 ++++++ .../role-picker/RolePicker.story.tsx | 45 ++++++ .../role-picker/RolePicker.styled.tsx | 34 +++++ .../organisms/role-picker/RolePicker.tsx | 135 ++++++++++++++++++ .../organisms/role-picker/index.ts | 1 + .../templates/auth-login/AuthLogin.story.tsx | 18 +++ .../templates/auth-login/AuthLogin.tsx | 14 ++ .../templates/auth-login/index.ts | 1 + .../templates/errors/Errors.story.tsx | 10 ++ src/design-system/templates/errors/Errors.tsx | 26 ++++ .../templates/errors/errorStrings.ts | 66 +++++++++ src/design-system/templates/errors/index.ts | 1 + .../templates/help-page/HelpPage.story.tsx | 12 ++ .../templates/help-page/HelpPage.tsx | 15 ++ .../templates/landing/Landing.story.tsx | 7 + .../templates/landing/Landing.tsx | 9 ++ src/design-system/templates/landing/index.ts | 1 + .../role-picker/RolePicker.story.tsx | 35 +++++ .../templates/role-picker/RolePicker.tsx | 25 ++++ .../templates/role-picker/index.ts | 1 + 98 files changed, 2339 insertions(+) create mode 100644 src/design-system/BUILD.bazel create mode 100644 src/design-system/molecules/demo-discord/DemoDiscord.story.tsx create mode 100644 src/design-system/molecules/demo-discord/DemoDiscord.styled.ts create mode 100644 src/design-system/molecules/demo-discord/DemoDiscord.tsx create mode 100644 src/design-system/molecules/demo-discord/index.ts create mode 100644 src/design-system/molecules/demo-picker/DemoPicker.story.tsx create mode 100644 src/design-system/molecules/demo-picker/DemoPicker.tsx create mode 100644 src/design-system/molecules/demo-picker/index.ts create mode 100644 src/design-system/molecules/footer/Flags.tsx create mode 100644 src/design-system/molecules/footer/Footer.story.tsx create mode 100644 src/design-system/molecules/footer/Footer.styled.ts create mode 100644 src/design-system/molecules/footer/Footer.tsx create mode 100644 src/design-system/molecules/footer/index.ts create mode 100644 src/design-system/molecules/guild-nav/GuildNav.story.tsx create mode 100644 src/design-system/molecules/guild-nav/GuildNav.styled.ts create mode 100644 src/design-system/molecules/guild-nav/GuildNav.tsx create mode 100644 src/design-system/molecules/guild-nav/index.ts create mode 100644 src/design-system/molecules/molecules.story.tsx create mode 100644 src/design-system/molecules/nav-slug/NavSlug.story.tsx create mode 100644 src/design-system/molecules/nav-slug/NavSlug.styled.ts create mode 100644 src/design-system/molecules/nav-slug/NavSlug.tsx create mode 100644 src/design-system/molecules/nav-slug/index.ts create mode 100644 src/design-system/molecules/picker-category/PickerCategory.story.tsx create mode 100644 src/design-system/molecules/picker-category/PickerCategory.styled.tsx create mode 100644 src/design-system/molecules/picker-category/PickerCategory.tsx create mode 100644 src/design-system/molecules/picker-category/index.ts create mode 100644 src/design-system/molecules/preauth-greeting/PreauthGreeting.story.tsx create mode 100644 src/design-system/molecules/preauth-greeting/PreauthGreeting.tsx create mode 100644 src/design-system/molecules/preauth-greeting/index.ts create mode 100644 src/design-system/molecules/preauth-secret-code/PreauthSecretCode.spec.tsx create mode 100644 src/design-system/molecules/preauth-secret-code/PreauthSecretCode.story.tsx create mode 100644 src/design-system/molecules/preauth-secret-code/PreauthSecretCode.tsx create mode 100644 src/design-system/molecules/preauth-secret-code/index.ts create mode 100644 src/design-system/molecules/reset-submit/ResetSubmit.spec.tsx create mode 100644 src/design-system/molecules/reset-submit/ResetSubmit.story.tsx create mode 100644 src/design-system/molecules/reset-submit/ResetSubmit.styled.ts create mode 100644 src/design-system/molecules/reset-submit/ResetSubmit.tsx create mode 100644 src/design-system/molecules/reset-submit/index.ts create mode 100644 src/design-system/molecules/server-masthead/ServerMasthead.spec.tsx create mode 100644 src/design-system/molecules/server-masthead/ServerMasthead.story.tsx create mode 100644 src/design-system/molecules/server-masthead/ServerMasthead.styled.ts create mode 100644 src/design-system/molecules/server-masthead/ServerMasthead.tsx create mode 100644 src/design-system/molecules/server-masthead/index.ts create mode 100644 src/design-system/molecules/user-avatar-group/UserAvatarGroup.story.tsx create mode 100644 src/design-system/molecules/user-avatar-group/UserAvatarGroup.styled.ts create mode 100644 src/design-system/molecules/user-avatar-group/UserAvatarGroup.tsx create mode 100644 src/design-system/molecules/user-avatar-group/index.ts create mode 100644 src/design-system/molecules/user-popover/UserPopover.story.tsx create mode 100644 src/design-system/molecules/user-popover/UserPopover.styled.ts create mode 100644 src/design-system/molecules/user-popover/UserPopover.tsx create mode 100644 src/design-system/molecules/user-popover/index.ts create mode 100644 src/design-system/organisms/app-shell/AppShell.story.tsx create mode 100644 src/design-system/organisms/app-shell/AppShell.styled.tsx create mode 100644 src/design-system/organisms/app-shell/AppShell.tsx create mode 100644 src/design-system/organisms/app-shell/index.ts create mode 100644 src/design-system/organisms/error-banner/ErrorBanner.story.tsx create mode 100644 src/design-system/organisms/error-banner/ErrorBanner.styled.ts create mode 100644 src/design-system/organisms/error-banner/ErrorBanner.tsx create mode 100644 src/design-system/organisms/error-banner/index.ts create mode 100644 src/design-system/organisms/help-page-base/HelpPageBase.story.tsx create mode 100644 src/design-system/organisms/help-page-base/HelpPageBase.tsx create mode 100644 src/design-system/organisms/help-page-base/index.ts create mode 100644 src/design-system/organisms/help-why-no-roles/WhyNoRoles.story.tsx create mode 100644 src/design-system/organisms/help-why-no-roles/WhyNoRoles.styled.ts create mode 100644 src/design-system/organisms/help-why-no-roles/WhyNoRoles.tsx create mode 100644 src/design-system/organisms/help-why-no-roles/index.ts create mode 100644 src/design-system/organisms/landing/Landing.story.tsx create mode 100644 src/design-system/organisms/landing/Landing.styled.ts create mode 100644 src/design-system/organisms/landing/Landing.tsx create mode 100644 src/design-system/organisms/landing/index.ts create mode 100644 src/design-system/organisms/masthead/Authed.tsx create mode 100644 src/design-system/organisms/masthead/Guest.tsx create mode 100644 src/design-system/organisms/masthead/Masthead.story.tsx create mode 100644 src/design-system/organisms/masthead/Masthead.styled.tsx create mode 100644 src/design-system/organisms/masthead/index.ts create mode 100644 src/design-system/organisms/organisms.story.tsx create mode 100644 src/design-system/organisms/preauth/Preauth.story.tsx create mode 100644 src/design-system/organisms/preauth/Preauth.tsx create mode 100644 src/design-system/organisms/role-picker/RolePicker.spec.tsx create mode 100644 src/design-system/organisms/role-picker/RolePicker.story.tsx create mode 100644 src/design-system/organisms/role-picker/RolePicker.styled.tsx create mode 100644 src/design-system/organisms/role-picker/RolePicker.tsx create mode 100644 src/design-system/organisms/role-picker/index.ts create mode 100644 src/design-system/templates/auth-login/AuthLogin.story.tsx create mode 100644 src/design-system/templates/auth-login/AuthLogin.tsx create mode 100644 src/design-system/templates/auth-login/index.ts create mode 100644 src/design-system/templates/errors/Errors.story.tsx create mode 100644 src/design-system/templates/errors/Errors.tsx create mode 100644 src/design-system/templates/errors/errorStrings.ts create mode 100644 src/design-system/templates/errors/index.ts create mode 100644 src/design-system/templates/help-page/HelpPage.story.tsx create mode 100644 src/design-system/templates/help-page/HelpPage.tsx create mode 100644 src/design-system/templates/landing/Landing.story.tsx create mode 100644 src/design-system/templates/landing/Landing.tsx create mode 100644 src/design-system/templates/landing/index.ts create mode 100644 src/design-system/templates/role-picker/RolePicker.story.tsx create mode 100644 src/design-system/templates/role-picker/RolePicker.tsx create mode 100644 src/design-system/templates/role-picker/index.ts diff --git a/src/design-system/BUILD.bazel b/src/design-system/BUILD.bazel new file mode 100644 index 0000000..bfd29b8 --- /dev/null +++ b/src/design-system/BUILD.bazel @@ -0,0 +1,8 @@ +load("@npm//@bazel/typescript:index.bzl", "ts_library") + +package(default_visibility = ["//visibility:public"]) + +ts_library( + name = "lib", + srcs = glob(["*.ts"]), +) diff --git a/src/design-system/molecules/demo-discord/DemoDiscord.story.tsx b/src/design-system/molecules/demo-discord/DemoDiscord.story.tsx new file mode 100644 index 0000000..601267d --- /dev/null +++ b/src/design-system/molecules/demo-discord/DemoDiscord.story.tsx @@ -0,0 +1,7 @@ +import { moleculeStories } from 'molecules/molecules.story'; +import * as React from 'react'; +import { DemoDiscord } from './DemoDiscord'; + +const story = moleculeStories('Landing Demos', module); + +story.add('Discord', () => ); diff --git a/src/design-system/molecules/demo-discord/DemoDiscord.styled.ts b/src/design-system/molecules/demo-discord/DemoDiscord.styled.ts new file mode 100644 index 0000000..b0c2c72 --- /dev/null +++ b/src/design-system/molecules/demo-discord/DemoDiscord.styled.ts @@ -0,0 +1,67 @@ +import styled, { keyframes } from 'styled-components'; +import { palette } from 'atoms/colors'; + +export const Base = styled.div` + background-color: ${palette.discord100}; + border: solid 1px rgba(0, 0, 0, 0.15); + border-radius: 3px; + padding: 10px; + user-select: none; +`; + +export const Timestamp = styled.span` + padding: 0 5px; + font-size: 0.7em; + opacity: 0.3; +`; + +export const TextParts = styled.span` + padding: 0 5px; +`; + +export const Username = styled(TextParts)` + &:hover { + text-decoration: underline; + cursor: pointer; + } +`; + +export const InputBox = styled.div` + margin-top: 10px; + background-color: ${palette.discord200}; + padding: 7px 10px; + border-radius: 3px; +`; + +const lineBlink = keyframes` + 0% { + opacity: 1; + } + + 40% { + opacity: 1; + } + + 60% { + opacity: 0; + } + + 100% { + opacity: 0; + } +`; + +export const Line = styled.div` + background-color: ${palette.grey600}; + width: 1px; + height: 1.5em; + display: inline-block; + position: absolute; + right: -5px; + animation: ${lineBlink} 0.5s ease-in-out infinite alternate-reverse; +`; + +export const InputTextAlignment = styled.div` + position: relative; + display: inline-block; +`; diff --git a/src/design-system/molecules/demo-discord/DemoDiscord.tsx b/src/design-system/molecules/demo-discord/DemoDiscord.tsx new file mode 100644 index 0000000..5b207c3 --- /dev/null +++ b/src/design-system/molecules/demo-discord/DemoDiscord.tsx @@ -0,0 +1,53 @@ +import * as React from 'react'; +import { + Base, + Timestamp, + TextParts, + Username, + InputBox, + Line, + InputTextAlignment, +} from './DemoDiscord.styled'; +import { demoData } from 'hack/fixtures/demoData'; +import { Typist } from 'atoms/typist'; + +export const DemoDiscord = () => { + const time = new Date(); + const timeString = time.toTimeString(); + + const [easterEggCount, setEasterEggCount] = React.useState(0); + + return ( + + + {time.getHours() % 12}:{timeString.slice(3, 5)}  + {time.getHours() <= 12 ? 'AM' : 'PM'} + + setEasterEggCount(easterEggCount + 1)}> + okano cat + + + {easterEggCount >= 15 + ? `NYAAAAAAA${'A'.repeat(easterEggCount - 15)}` + : easterEggCount >= 11 + ? `I'm.. I'm gonna...` + : easterEggCount >= 10 + ? `S-senpai... Be careful...` + : easterEggCount >= 5 + ? `H-hey... Stop that..` + : `Hey, I'd like some roles!`} + + + +   + `.iam ${role.name}`)} + /> + + + + + ); +}; diff --git a/src/design-system/molecules/demo-discord/index.ts b/src/design-system/molecules/demo-discord/index.ts new file mode 100644 index 0000000..70e62cb --- /dev/null +++ b/src/design-system/molecules/demo-discord/index.ts @@ -0,0 +1 @@ +export * from './DemoDiscord'; diff --git a/src/design-system/molecules/demo-picker/DemoPicker.story.tsx b/src/design-system/molecules/demo-picker/DemoPicker.story.tsx new file mode 100644 index 0000000..6411423 --- /dev/null +++ b/src/design-system/molecules/demo-picker/DemoPicker.story.tsx @@ -0,0 +1,7 @@ +import * as React from 'react'; +import { moleculeStories } from 'molecules/molecules.story'; +import { DemoPicker } from './DemoPicker'; + +const story = moleculeStories('Landing Demos', module); + +story.add('Picker', () => ); diff --git a/src/design-system/molecules/demo-picker/DemoPicker.tsx b/src/design-system/molecules/demo-picker/DemoPicker.tsx new file mode 100644 index 0000000..5137e86 --- /dev/null +++ b/src/design-system/molecules/demo-picker/DemoPicker.tsx @@ -0,0 +1,46 @@ +import * as React from 'react'; +import { Role } from 'atoms/role'; +import { Role as RPCRole } from '@roleypoly/rpc/shared'; +import styled from 'styled-components'; +import { demoData } from 'hack/fixtures/demoData'; + +const Container = styled.div` + display: flex; + flex-wrap: wrap; + justify-content: center; + align-items: center; + align-content: center; + height: 95px; +`; + +const RoleWrap = styled.div` + padding: 2.5px; + display: inline-block; +`; + +export const DemoPicker = () => { + const [selectedStates, setSelectedStates] = React.useState< + { + [key in RPCRole.AsObject['id']]: boolean; + } + >(demoData.reduce((acc, role) => ({ ...acc, [role.id]: false }), {})); + + return ( + + {demoData.map((role) => ( + + { + setSelectedStates({ + ...selectedStates, + [role.id]: !selectedStates[role.id], + }); + }} + /> + + ))} + + ); +}; diff --git a/src/design-system/molecules/demo-picker/index.ts b/src/design-system/molecules/demo-picker/index.ts new file mode 100644 index 0000000..1b9c7d3 --- /dev/null +++ b/src/design-system/molecules/demo-picker/index.ts @@ -0,0 +1 @@ +export * from './DemoPicker'; diff --git a/src/design-system/molecules/footer/Flags.tsx b/src/design-system/molecules/footer/Flags.tsx new file mode 100644 index 0000000..3acfee4 --- /dev/null +++ b/src/design-system/molecules/footer/Flags.tsx @@ -0,0 +1,94 @@ +import * as React from 'react'; + +type FlagsProps = { + width?: number | string; + height?: number | string; +}; + +export const Flags = (props: FlagsProps) => ( + + + + + + + + + + + + + + + + + + + + + + + + + + + +); diff --git a/src/design-system/molecules/footer/Footer.story.tsx b/src/design-system/molecules/footer/Footer.story.tsx new file mode 100644 index 0000000..20c6f0d --- /dev/null +++ b/src/design-system/molecules/footer/Footer.story.tsx @@ -0,0 +1,7 @@ +import * as React from 'react'; +import { moleculeStories } from 'molecules/molecules.story'; +import { Footer } from './Footer'; + +const story = moleculeStories('Footer', module); + +story.add('Basic', () =>