@bloom-housing/ui-components 4.2.3 → 4.3.1-alpha.1
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 +738 -4
- package/README.md +10 -4
- package/index.ts +14 -10
- package/package.json +6 -4
- package/scripts/generate-translations.ts +60 -0
- package/src/actions/Button.docs.mdx +76 -0
- package/src/actions/Button.scss +58 -61
- package/src/authentication/timeout.tsx +1 -0
- package/src/blocks/DashBlock.tsx +5 -3
- package/src/blocks/DashBlocks.scss +4 -1
- package/src/blocks/FormCard.tsx +1 -1
- package/src/forms/FieldGroup.tsx +18 -17
- package/src/global/app-css.scss +7 -0
- package/src/global/markdown.scss +20 -0
- package/src/global/mixins.scss +66 -49
- package/src/global/tables.scss +236 -58
- package/src/global/text.scss +11 -3
- package/src/global/tokens/borders.scss +15 -0
- package/src/global/tokens/colors.scss +64 -0
- package/src/global/tokens/fonts.scss +45 -0
- package/src/global/tokens/screens.scss +6 -0
- package/src/global/tokens/sizes.scss +48 -0
- package/src/headers/Heading.tsx +2 -0
- package/src/headers/PageHeader.docs.mdx +45 -0
- package/src/headers/PageHeader.scss +30 -17
- package/src/headers/PageHeader.tsx +2 -10
- package/src/headers/SiteHeader.tsx +7 -1
- package/src/helpers/MultiLineAddress.tsx +37 -0
- package/src/helpers/OneLineAddress.tsx +21 -0
- package/src/helpers/tableSummaries.tsx +34 -23
- package/src/locales/es.json +165 -33
- package/src/locales/general.json +19 -9
- package/src/locales/tl.json +655 -1
- package/src/locales/vi.json +164 -37
- package/src/locales/zh.json +165 -33
- package/src/navigation/FooterNav.scss +8 -3
- package/src/overlays/Drawer.tsx +11 -3
- package/src/overlays/Modal.tsx +16 -7
- package/src/overlays/Overlay.tsx +4 -3
- package/src/page_components/ApplicationTimeline.scss +36 -0
- package/src/page_components/ApplicationTimeline.tsx +33 -0
- package/src/page_components/forgot-password/FormForgotPassword.tsx +5 -4
- package/src/page_components/listing/AdditionalFees.tsx +38 -31
- package/src/page_components/listing/ListingCard.scss +12 -0
- package/src/page_components/listing/ListingCard.tsx +5 -3
- package/src/page_components/listing/ListingMap.tsx +7 -2
- package/src/page_components/listing/UnitTables.tsx +19 -18
- package/src/page_components/listing/listing_sidebar/Contact.tsx +110 -0
- package/src/page_components/listing/listing_sidebar/ContactAddress.tsx +41 -0
- package/src/page_components/listing/listing_sidebar/GetApplication.tsx +35 -15
- package/src/page_components/listing/listing_sidebar/QuantityRowSection.tsx +46 -0
- package/src/page_components/listing/listing_sidebar/SubmitApplication.tsx +52 -57
- package/src/page_components/listing/listing_sidebar/events/EventSection.tsx +3 -2
- package/src/page_components/sign-in/FormSignIn.tsx +2 -1
- package/src/page_components/sign-in/ResendConfirmationModal.tsx +106 -0
- package/src/prototypes/Swatch.tsx +10 -0
- package/src/tables/CategoryTable.tsx +33 -0
- package/src/tables/GroupedTable.tsx +5 -5
- package/src/tables/MinimalTable.tsx +12 -2
- package/src/tables/StackedTable.tsx +38 -26
- package/src/tables/StandardTable.tsx +26 -10
- package/tailwind.config.js +76 -81
- package/tailwind.tosass.js +2 -1
- package/src/helpers/address.tsx +0 -46
- package/src/page_components/listing/listing_sidebar/LeasingAgent.tsx +0 -72
- package/src/page_components/listing/listing_sidebar/SidebarAddress.tsx +0 -56
- package/src/page_components/listing/listing_sidebar/Waitlist.tsx +0 -49
package/tailwind.config.js
CHANGED
|
@@ -12,106 +12,101 @@ module.exports = {
|
|
|
12
12
|
print: { raw: "print" },
|
|
13
13
|
},
|
|
14
14
|
fontSize: {
|
|
15
|
-
"2xs": "
|
|
16
|
-
xs: "
|
|
17
|
-
sm: "
|
|
18
|
-
tiny: "
|
|
19
|
-
base: "
|
|
20
|
-
lg: "
|
|
21
|
-
xl: "
|
|
22
|
-
"2xl": "
|
|
23
|
-
"3xl": "
|
|
24
|
-
"4xl": "
|
|
25
|
-
"5xl": "
|
|
26
|
-
"6xl": "
|
|
27
|
-
"6.5xl": "
|
|
28
|
-
"7xl": "
|
|
15
|
+
"2xs": "var(--bloom-font-size-2xs)",
|
|
16
|
+
xs: "var(--bloom-font-size-xs)",
|
|
17
|
+
sm: "var(--bloom-font-size-sm)",
|
|
18
|
+
tiny: "var(--bloom-font-size-tiny)",
|
|
19
|
+
base: "var(--bloom-font-size-base)",
|
|
20
|
+
lg: "var(--bloom-font-size-lg)",
|
|
21
|
+
xl: "var(--bloom-font-size-xl)",
|
|
22
|
+
"2xl": "var(--bloom-font-size-2xl)",
|
|
23
|
+
"3xl": "var(--bloom-font-size-3xl)",
|
|
24
|
+
"4xl": "var(--bloom-font-size-4xl)",
|
|
25
|
+
"5xl": "var(--bloom-font-size-5xl)",
|
|
26
|
+
"6xl": "var(--bloom-font-size-6xl)",
|
|
27
|
+
"6.5xl": "var(--bloom-font-size-6_5xl)",
|
|
28
|
+
"7xl": "var(--bloom-font-size-7xl)",
|
|
29
29
|
},
|
|
30
30
|
fontFamily: {
|
|
31
|
-
sans:
|
|
32
|
-
serif:
|
|
33
|
-
"alt-sans":
|
|
31
|
+
sans: "var(--bloom-font-sans)",
|
|
32
|
+
serif: "var(--bloom-font-serif)",
|
|
33
|
+
"alt-sans": "var(--bloom-font-alt-sans)",
|
|
34
34
|
},
|
|
35
35
|
colors: {
|
|
36
|
-
primary: "
|
|
37
|
-
"primary-dark": "
|
|
38
|
-
"primary-darker": "
|
|
39
|
-
"primary-light": "
|
|
40
|
-
"primary-lighter": "
|
|
41
|
-
secondary: "
|
|
42
|
-
alert: "
|
|
43
|
-
"alert-light": "
|
|
44
|
-
"alert-dark": "
|
|
45
|
-
success: "
|
|
46
|
-
"success-light": "
|
|
47
|
-
"success-dark": "
|
|
48
|
-
warn: "
|
|
49
|
-
"warn-light": "
|
|
50
|
-
"warn-dark": "
|
|
51
|
-
"accent-cool": "
|
|
52
|
-
"accent-cool-light": "
|
|
53
|
-
"accent-cool-dark": "
|
|
54
|
-
"accent-warm": "
|
|
55
|
-
"accent-warm-dark": "
|
|
56
|
-
"accent-warm-light": "
|
|
57
|
-
"accent-warm-lighter": "
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
lush: "#99CD00",
|
|
62
|
-
"lush-light": "#F2FFCD",
|
|
63
|
-
"lush-dark": "#7CA700",
|
|
64
|
-
white: "#FFFFFF",
|
|
65
|
-
black: "#000000",
|
|
36
|
+
primary: "var(--bloom-color-primary)",
|
|
37
|
+
"primary-dark": "var(--bloom-color-primary-dark)",
|
|
38
|
+
"primary-darker": "var(--bloom-color-primary-darker)",
|
|
39
|
+
"primary-light": "var(--bloom-color-primary-light)",
|
|
40
|
+
"primary-lighter": "var(--bloom-color-primary-lighter)",
|
|
41
|
+
secondary: "var(--bloom-color-secondary)",
|
|
42
|
+
alert: "var(--bloom-color-alert)",
|
|
43
|
+
"alert-light": "var(--bloom-color-alert-light)",
|
|
44
|
+
"alert-dark": "var(--bloom-color-alert-dark)",
|
|
45
|
+
success: "var(--bloom-color-success)",
|
|
46
|
+
"success-light": "var(--bloom-color-success-light)",
|
|
47
|
+
"success-dark": "var(--bloom-color-success-dark)",
|
|
48
|
+
warn: "var(--bloom-color-warn)",
|
|
49
|
+
"warn-light": "var(--bloom-color-warn-light)",
|
|
50
|
+
"warn-dark": "var(--bloom-color-warn-dark)",
|
|
51
|
+
"accent-cool": "var(--bloom-color-accent-cool)",
|
|
52
|
+
"accent-cool-light": "var(--bloom-color-accent-cool-light)",
|
|
53
|
+
"accent-cool-dark": "var(--bloom-color-accent-cool-dark)",
|
|
54
|
+
"accent-warm": "var(--bloom-color-accent-warm)",
|
|
55
|
+
"accent-warm-dark": "var(--bloom-color-accent-warm-dark)",
|
|
56
|
+
"accent-warm-light": "var(--bloom-color-accent-warm-light)",
|
|
57
|
+
"accent-warm-lighter": "var(--bloom-color-accent-warm-lighter)",
|
|
58
|
+
lush: "var(--bloom-color-lush)",
|
|
59
|
+
white: "var(--bloom-color-white)",
|
|
60
|
+
black: "var(--bloom-color-black)",
|
|
66
61
|
blue: {
|
|
67
|
-
800: "
|
|
68
|
-
700: "
|
|
69
|
-
600: "
|
|
70
|
-
300: "
|
|
71
|
-
200: "
|
|
62
|
+
800: "var(--bloom-color-blue-800)",
|
|
63
|
+
700: "var(--bloom-color-blue-700)",
|
|
64
|
+
600: "var(--bloom-color-blue-600)",
|
|
65
|
+
300: "var(--bloom-color-blue-300)",
|
|
66
|
+
200: "var(--bloom-color-blue-200)",
|
|
72
67
|
},
|
|
73
68
|
red: {
|
|
74
|
-
700: "
|
|
75
|
-
300: "
|
|
69
|
+
700: "var(--bloom-color-red-700)",
|
|
70
|
+
300: "var(--bloom-color-red-300)",
|
|
76
71
|
},
|
|
77
72
|
yellow: {
|
|
78
|
-
700: "
|
|
79
|
-
300: "
|
|
73
|
+
700: "var(--bloom-color-yellow-700)",
|
|
74
|
+
300: "var(--bloom-color-yellow-300)",
|
|
80
75
|
},
|
|
81
76
|
green: {
|
|
82
|
-
700: "
|
|
83
|
-
300: "
|
|
77
|
+
700: "var(--bloom-color-green-700)",
|
|
78
|
+
300: "var(--bloom-color-green-300)",
|
|
84
79
|
},
|
|
85
80
|
teal: {
|
|
86
|
-
700: "
|
|
87
|
-
300: "
|
|
81
|
+
700: "var(--bloom-color-green-700)",
|
|
82
|
+
300: "var(--bloom-color-green-300)",
|
|
88
83
|
},
|
|
89
84
|
gray: {
|
|
90
|
-
950: "
|
|
91
|
-
900: "
|
|
92
|
-
850: "
|
|
93
|
-
800: "
|
|
94
|
-
750: "
|
|
95
|
-
700: "
|
|
96
|
-
600: "
|
|
97
|
-
550: "
|
|
98
|
-
500: "
|
|
99
|
-
450: "
|
|
100
|
-
400: "
|
|
101
|
-
300: "
|
|
102
|
-
200: "
|
|
103
|
-
100: "
|
|
85
|
+
950: "var(--bloom-color-gray-950)",
|
|
86
|
+
900: "var(--bloom-color-gray-900)",
|
|
87
|
+
850: "var(--bloom-color-gray-850)",
|
|
88
|
+
800: "var(--bloom-color-gray-800)",
|
|
89
|
+
750: "var(--bloom-color-gray-750)",
|
|
90
|
+
700: "var(--bloom-color-gray-700)",
|
|
91
|
+
600: "var(--bloom-color-gray-600)",
|
|
92
|
+
550: "var(--bloom-color-gray-550)",
|
|
93
|
+
500: "var(--bloom-color-gray-500)",
|
|
94
|
+
450: "var(--bloom-color-gray-450)",
|
|
95
|
+
400: "var(--bloom-color-gray-400)",
|
|
96
|
+
300: "var(--bloom-color-gray-300)",
|
|
97
|
+
200: "var(--bloom-color-gray-200)",
|
|
98
|
+
100: "var(--bloom-color-gray-100)",
|
|
104
99
|
},
|
|
105
100
|
},
|
|
106
101
|
letterSpacing: {
|
|
107
|
-
tightest: "
|
|
108
|
-
tighter: "
|
|
109
|
-
tight: "
|
|
102
|
+
tightest: "var(--bloom-letter-spacing-tightest)",
|
|
103
|
+
tighter: "var(--bloom-letter-spacing-tighter)",
|
|
104
|
+
tight: "var(--bloom-letter-spacing-tight)",
|
|
110
105
|
normal: "0",
|
|
111
|
-
wide: "
|
|
112
|
-
wider: "
|
|
113
|
-
widest: "
|
|
114
|
-
ultrawide: "
|
|
106
|
+
wide: "var(--bloom-letter-spacing-wide)",
|
|
107
|
+
wider: "var(--bloom-letter-spacing-wider)",
|
|
108
|
+
widest: "var(--bloom-letter-spacing-widest)",
|
|
109
|
+
ultrawide: "var(--bloom-letter-spacing-ultrawide)",
|
|
115
110
|
},
|
|
116
111
|
extend: {
|
|
117
112
|
borderColor: (theme) => ({
|
package/tailwind.tosass.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/* eslint-env node */
|
|
2
2
|
|
|
3
3
|
const tailwindToSassVars = (bloomTheme) => {
|
|
4
|
+
// TODO: we should remove this in favor of just using the new CSS variables
|
|
4
5
|
const bloomColorVars = Object.keys(bloomTheme.theme.colors).map((colorKey) => {
|
|
5
6
|
if (typeof bloomTheme.theme.colors[colorKey] == "object") {
|
|
6
7
|
// create a map variable that can be used by the map-get SCSS function
|
|
@@ -17,7 +18,7 @@ const tailwindToSassVars = (bloomTheme) => {
|
|
|
17
18
|
}
|
|
18
19
|
})
|
|
19
20
|
const bloomScreenVars = Object.keys(bloomTheme.theme.screens).map((screenKey) => {
|
|
20
|
-
return `$
|
|
21
|
+
return `$screen-${screenKey}: ${bloomTheme.theme.screens[screenKey]};`
|
|
21
22
|
})
|
|
22
23
|
|
|
23
24
|
// Uncomment this if you want to debug:
|
package/src/helpers/address.tsx
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import * as React from "react"
|
|
2
|
-
import Markdown from "markdown-to-jsx"
|
|
3
|
-
|
|
4
|
-
export interface Address {
|
|
5
|
-
city?: string
|
|
6
|
-
latitude?: number
|
|
7
|
-
longitude?: number
|
|
8
|
-
placeName?: string
|
|
9
|
-
state?: string
|
|
10
|
-
street2?: string
|
|
11
|
-
street?: string
|
|
12
|
-
zipCode?: string
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
interface AddressProps {
|
|
16
|
-
address: Address
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export const OneLineAddress = (props: AddressProps) => {
|
|
20
|
-
if (!props.address) return null
|
|
21
|
-
|
|
22
|
-
return (
|
|
23
|
-
<>
|
|
24
|
-
{props.address.street},{` `}
|
|
25
|
-
{props.address.city}, {props.address.state} {props.address.zipCode}
|
|
26
|
-
</>
|
|
27
|
-
)
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export const MultiLineAddress = (props: AddressProps) => {
|
|
31
|
-
if (!props.address) return null
|
|
32
|
-
|
|
33
|
-
return (
|
|
34
|
-
<>
|
|
35
|
-
{props.address.placeName && (
|
|
36
|
-
<>
|
|
37
|
-
{props.address.placeName}
|
|
38
|
-
<br />
|
|
39
|
-
</>
|
|
40
|
-
)}
|
|
41
|
-
<Markdown children={props.address.street || ""} />
|
|
42
|
-
<br />
|
|
43
|
-
{props.address.city}, {props.address.state} {props.address.zipCode}
|
|
44
|
-
</>
|
|
45
|
-
)
|
|
46
|
-
}
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import * as React from "react"
|
|
2
|
-
import { SidebarAddress } from "./SidebarAddress"
|
|
3
|
-
import { t } from "../../../helpers/translator"
|
|
4
|
-
import { Icon, IconFillColors } from "../../../icons/Icon"
|
|
5
|
-
import { Listing } from "@bloom-housing/backend-core/types"
|
|
6
|
-
|
|
7
|
-
interface LeasingAgentProps {
|
|
8
|
-
listing: Listing
|
|
9
|
-
managementCompany?: { name: string; website: string }
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
const LeasingAgent = (props: LeasingAgentProps) => {
|
|
13
|
-
const listing = props.listing
|
|
14
|
-
|
|
15
|
-
const phoneNumber = listing.leasingAgentPhone
|
|
16
|
-
? `tel:${listing.leasingAgentPhone.replace(/[-()]/g, "")}`
|
|
17
|
-
: ""
|
|
18
|
-
|
|
19
|
-
let managementWebsite = props.managementCompany?.website
|
|
20
|
-
if (managementWebsite && !managementWebsite.startsWith("http")) {
|
|
21
|
-
managementWebsite = `http://${managementWebsite}`
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
return (
|
|
25
|
-
<section className="aside-block">
|
|
26
|
-
<h4 className="text-caps-underline">{t("leasingAgent.contact")}</h4>
|
|
27
|
-
|
|
28
|
-
{listing.leasingAgentName && <p className="text-xl">{listing.leasingAgentName}</p>}
|
|
29
|
-
{listing.leasingAgentTitle && <p className="text-gray-700">{listing.leasingAgentTitle}</p>}
|
|
30
|
-
{props.managementCompany?.name && (
|
|
31
|
-
<p className="text-gray-700">{props.managementCompany.name}</p>
|
|
32
|
-
)}
|
|
33
|
-
|
|
34
|
-
{listing.leasingAgentPhone && (
|
|
35
|
-
<>
|
|
36
|
-
<p className="mt-5">
|
|
37
|
-
<a href={phoneNumber}>
|
|
38
|
-
<Icon symbol="phone" size="medium" fill={IconFillColors.primary} /> {t("t.call")}{" "}
|
|
39
|
-
{listing.leasingAgentPhone}
|
|
40
|
-
</a>
|
|
41
|
-
</p>
|
|
42
|
-
<p className="text-sm text-gray-700">{t("leasingAgent.dueToHighCallVolume")}</p>
|
|
43
|
-
</>
|
|
44
|
-
)}
|
|
45
|
-
|
|
46
|
-
{listing.leasingAgentEmail && (
|
|
47
|
-
<p className="my-5">
|
|
48
|
-
<a href={`mailto:${listing.leasingAgentEmail}`}>
|
|
49
|
-
<Icon symbol="mail" size="medium" fill={IconFillColors.primary} /> {t("t.email")}
|
|
50
|
-
</a>
|
|
51
|
-
</p>
|
|
52
|
-
)}
|
|
53
|
-
|
|
54
|
-
{managementWebsite && (
|
|
55
|
-
<p className="my-5">
|
|
56
|
-
<a href={managementWebsite} target="_blank" rel="noreferrer noopener">
|
|
57
|
-
<Icon symbol="globe" size="medium" fill={IconFillColors.primary} /> {t("t.website")}
|
|
58
|
-
</a>
|
|
59
|
-
</p>
|
|
60
|
-
)}
|
|
61
|
-
|
|
62
|
-
{listing.leasingAgentAddress && (
|
|
63
|
-
<SidebarAddress
|
|
64
|
-
address={listing.leasingAgentAddress}
|
|
65
|
-
officeHours={listing.leasingAgentOfficeHours}
|
|
66
|
-
/>
|
|
67
|
-
)}
|
|
68
|
-
</section>
|
|
69
|
-
)
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
export { LeasingAgent as default, LeasingAgent }
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import * as React from "react"
|
|
2
|
-
import ReactDOMServer from "react-dom/server"
|
|
3
|
-
import { Icon, IconFillColors } from "../../../icons/Icon"
|
|
4
|
-
import { OneLineAddress, MultiLineAddress, Address } from "../../../helpers/address"
|
|
5
|
-
import { t } from "../../../helpers/translator"
|
|
6
|
-
import Markdown from "markdown-to-jsx"
|
|
7
|
-
|
|
8
|
-
export interface SidebarAddressProps {
|
|
9
|
-
address?: Address
|
|
10
|
-
officeHours?: string
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
const SidebarAddress = (props: SidebarAddressProps) => {
|
|
14
|
-
const { address, officeHours } = props
|
|
15
|
-
let mainAddress = null
|
|
16
|
-
let googleMapsHref = ""
|
|
17
|
-
let hours = <></>
|
|
18
|
-
|
|
19
|
-
if (address?.street) {
|
|
20
|
-
const oneLineAddress = <OneLineAddress address={address} />
|
|
21
|
-
mainAddress = <MultiLineAddress address={address} />
|
|
22
|
-
|
|
23
|
-
googleMapsHref =
|
|
24
|
-
"https://www.google.com/maps/place/" + ReactDOMServer.renderToStaticMarkup(oneLineAddress)
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
if (officeHours) {
|
|
28
|
-
hours = (
|
|
29
|
-
<>
|
|
30
|
-
<h3 className="text-caps-tiny ">{t("leasingAgent.officeHours")}</h3>
|
|
31
|
-
<div className="text-gray-800 text-tiny markdown">
|
|
32
|
-
<Markdown children={officeHours} options={{ disableParsingRawHTML: true }} />
|
|
33
|
-
</div>
|
|
34
|
-
</>
|
|
35
|
-
)
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
return (
|
|
39
|
-
<>
|
|
40
|
-
{address?.street && (
|
|
41
|
-
<>
|
|
42
|
-
<p className="text-gray-700 mb-1">{mainAddress}</p>
|
|
43
|
-
<p className="mb-4">
|
|
44
|
-
<a href={googleMapsHref} className="inline-block pt-1" target="_blank">
|
|
45
|
-
<Icon symbol="map" size="medium" fill={IconFillColors.primary} />{" "}
|
|
46
|
-
{t("t.getDirections")}
|
|
47
|
-
</a>
|
|
48
|
-
</p>
|
|
49
|
-
</>
|
|
50
|
-
)}
|
|
51
|
-
{hours}
|
|
52
|
-
</>
|
|
53
|
-
)
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
export { SidebarAddress as default, SidebarAddress }
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import * as React from "react"
|
|
2
|
-
import { t } from "../../../helpers/translator"
|
|
3
|
-
|
|
4
|
-
export interface WaitlistProps {
|
|
5
|
-
isWaitlistOpen: boolean
|
|
6
|
-
waitlistMaxSize?: number | null
|
|
7
|
-
waitlistCurrentSize?: number | null
|
|
8
|
-
waitlistOpenSpots?: number | null
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
const WaitlistItem = (props: { className?: string; value: number; text: string }) => (
|
|
12
|
-
<li className={`uppercase text-gray-800 text-tiny ${props.className}`}>
|
|
13
|
-
<span className="text-right w-12 inline-block pr-2">{props.value}</span>
|
|
14
|
-
<span>{props.text}</span>
|
|
15
|
-
</li>
|
|
16
|
-
)
|
|
17
|
-
|
|
18
|
-
const Waitlist = (props: WaitlistProps) => {
|
|
19
|
-
if (!props.isWaitlistOpen) return <></>
|
|
20
|
-
|
|
21
|
-
return (
|
|
22
|
-
<section className="aside-block is-tinted">
|
|
23
|
-
<h4 className="text-caps-tiny">{t("listings.waitlist.unitsAndWaitlist")}</h4>
|
|
24
|
-
<div>
|
|
25
|
-
<p className="text-tiny text-gray-800 pb-3">{t("listings.waitlist.submitAnApplication")}</p>
|
|
26
|
-
<ul>
|
|
27
|
-
{props.waitlistCurrentSize !== null && props.waitlistCurrentSize !== undefined && (
|
|
28
|
-
<WaitlistItem
|
|
29
|
-
value={props.waitlistCurrentSize}
|
|
30
|
-
text={t("listings.waitlist.currentSize")}
|
|
31
|
-
/>
|
|
32
|
-
)}
|
|
33
|
-
{props.waitlistOpenSpots !== null && props.waitlistOpenSpots !== undefined && (
|
|
34
|
-
<WaitlistItem
|
|
35
|
-
value={props.waitlistOpenSpots}
|
|
36
|
-
text={t("listings.waitlist.openSlots")}
|
|
37
|
-
className={"font-semibold"}
|
|
38
|
-
/>
|
|
39
|
-
)}
|
|
40
|
-
{props.waitlistMaxSize != null && (
|
|
41
|
-
<WaitlistItem value={props.waitlistMaxSize} text={t("listings.waitlist.finalSize")} />
|
|
42
|
-
)}
|
|
43
|
-
</ul>
|
|
44
|
-
</div>
|
|
45
|
-
</section>
|
|
46
|
-
)
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
export { Waitlist as default, Waitlist }
|