* Add round and square buttons * Allow some style for buttons, add icons * Change text selection color * Center button text, whoops * Outer layout, some primitive updates * WIP * onboarding feed prefs (#2590) * add `style` to toggle label to modify text style * Revert "add `style` to toggle label to modify text style" This reverts commit 8f4b517b8585ca64a4bf44f6cb40ac070ece8932. * following feed prefs * remove unnecessary memo * reusable divider component * org imports * add finished screen * Theme SelectedAccountCard * Require at least 3 interests * Placeholder save logic * WIP algo feeds * Improve lineHeight handling, add RichText, improve Link by adding InlineLink * Inherit lineHeight in heading comps * Algo feeds mostly good * Topical feeds ish * Layout cleanup * Improve button styles * moderation prefs for onboarding (#2594) * WIP algo feeds * modify controlalbelgroup typing for easy .map() * adjust padding on button * add moderation screen * add moderation screen * add moderation screen --------- Co-authored-by: Eric Bailey <git@esb.lol> * Fix toggle button styles * A11y props on outer portal * Put it all on red * New data shape * Handle mock data * Bulk write (not yet) * Remove interests validation * Clean up interests * i18n layout and first step * Clean up suggested follows screen * Clean up following step * Clean up algo feeds step * Clean up topical feeds * Add skeleton for feed card * WIP moderation step * cleanup moderation styles (#2605) * cleanup moderation styles * fix(?) toggle button group styles * adjust toggle to fit any screen * Some more cleanup * Icons * ToggleButton tweaks * Reset * Hook up data * Better suggestions * Bulk write * Some logging * Use new api * Concat topical feeds * Metrics * Disable links in RichText, feedcards * Tweak primary feed cards * Update metrics * Fix layout shift * Fix ToggleButton again, whoops * Error state * Bump api package, ensure interests are saved * Better fix for autofill * i18n, button positions * Remove unused export * Add default prefs object * Fix overflow in user cards * Add 2 lines of bios to suggested accounts cards * Nits * Don't resolve facets by default * Update storybook * Disable flag for now * Remove age dialog from moderations step * Improvements and tweaks to new onboarding --------- Co-authored-by: Hailey <153161762+haileyok@users.noreply.github.com> Co-authored-by: Paul Frazee <pfrazee@gmail.com>
194 lines
3.8 KiB
TypeScript
194 lines
3.8 KiB
TypeScript
import React from 'react'
|
|
import {Text as RNText, TextStyle, TextProps} from 'react-native'
|
|
|
|
import {useTheme, atoms, web, flatten} from '#/alf'
|
|
|
|
/**
|
|
* Util to calculate lineHeight from a text size atom and a leading atom
|
|
*
|
|
* Example:
|
|
* `leading(atoms.text_md, atoms.leading_normal)` // => 24
|
|
*/
|
|
export function leading<
|
|
Size extends {fontSize?: number},
|
|
Leading extends {lineHeight?: number},
|
|
>(textSize: Size, leading: Leading) {
|
|
const size = textSize?.fontSize || atoms.text_md.fontSize
|
|
const lineHeight = leading?.lineHeight || atoms.leading_normal.lineHeight
|
|
return size * lineHeight
|
|
}
|
|
|
|
/**
|
|
* Ensures that `lineHeight` defaults to a relative value of `1`, or applies
|
|
* other relative leading atoms.
|
|
*
|
|
* If the `lineHeight` value is > 2, we assume it's an absolute value and
|
|
* returns it as-is.
|
|
*/
|
|
function normalizeTextStyles(styles: TextStyle[]) {
|
|
const s = flatten(styles)
|
|
// should always be defined on these components
|
|
const fontSize = s.fontSize || atoms.text_md.fontSize
|
|
|
|
if (s?.lineHeight) {
|
|
if (s.lineHeight <= 2) {
|
|
s.lineHeight = fontSize * s.lineHeight
|
|
}
|
|
} else {
|
|
s.lineHeight = fontSize
|
|
}
|
|
|
|
return s
|
|
}
|
|
|
|
export function Text({style, ...rest}: TextProps) {
|
|
const t = useTheme()
|
|
const s = normalizeTextStyles([atoms.text_sm, t.atoms.text, flatten(style)])
|
|
return <RNText style={s} {...rest} />
|
|
}
|
|
|
|
export function H1({style, ...rest}: TextProps) {
|
|
const t = useTheme()
|
|
const attr =
|
|
web({
|
|
role: 'heading',
|
|
'aria-level': 1,
|
|
}) || {}
|
|
return (
|
|
<RNText
|
|
{...attr}
|
|
{...rest}
|
|
style={normalizeTextStyles([
|
|
atoms.text_5xl,
|
|
atoms.font_bold,
|
|
t.atoms.text,
|
|
flatten(style),
|
|
])}
|
|
/>
|
|
)
|
|
}
|
|
|
|
export function H2({style, ...rest}: TextProps) {
|
|
const t = useTheme()
|
|
const attr =
|
|
web({
|
|
role: 'heading',
|
|
'aria-level': 2,
|
|
}) || {}
|
|
return (
|
|
<RNText
|
|
{...attr}
|
|
{...rest}
|
|
style={normalizeTextStyles([
|
|
atoms.text_4xl,
|
|
atoms.font_bold,
|
|
t.atoms.text,
|
|
flatten(style),
|
|
])}
|
|
/>
|
|
)
|
|
}
|
|
|
|
export function H3({style, ...rest}: TextProps) {
|
|
const t = useTheme()
|
|
const attr =
|
|
web({
|
|
role: 'heading',
|
|
'aria-level': 3,
|
|
}) || {}
|
|
return (
|
|
<RNText
|
|
{...attr}
|
|
{...rest}
|
|
style={normalizeTextStyles([
|
|
atoms.text_3xl,
|
|
atoms.font_bold,
|
|
t.atoms.text,
|
|
flatten(style),
|
|
])}
|
|
/>
|
|
)
|
|
}
|
|
|
|
export function H4({style, ...rest}: TextProps) {
|
|
const t = useTheme()
|
|
const attr =
|
|
web({
|
|
role: 'heading',
|
|
'aria-level': 4,
|
|
}) || {}
|
|
return (
|
|
<RNText
|
|
{...attr}
|
|
{...rest}
|
|
style={normalizeTextStyles([
|
|
atoms.text_2xl,
|
|
atoms.font_bold,
|
|
t.atoms.text,
|
|
flatten(style),
|
|
])}
|
|
/>
|
|
)
|
|
}
|
|
|
|
export function H5({style, ...rest}: TextProps) {
|
|
const t = useTheme()
|
|
const attr =
|
|
web({
|
|
role: 'heading',
|
|
'aria-level': 5,
|
|
}) || {}
|
|
return (
|
|
<RNText
|
|
{...attr}
|
|
{...rest}
|
|
style={normalizeTextStyles([
|
|
atoms.text_xl,
|
|
atoms.font_bold,
|
|
t.atoms.text,
|
|
flatten(style),
|
|
])}
|
|
/>
|
|
)
|
|
}
|
|
|
|
export function H6({style, ...rest}: TextProps) {
|
|
const t = useTheme()
|
|
const attr =
|
|
web({
|
|
role: 'heading',
|
|
'aria-level': 6,
|
|
}) || {}
|
|
return (
|
|
<RNText
|
|
{...attr}
|
|
{...rest}
|
|
style={normalizeTextStyles([
|
|
atoms.text_lg,
|
|
atoms.font_bold,
|
|
t.atoms.text,
|
|
flatten(style),
|
|
])}
|
|
/>
|
|
)
|
|
}
|
|
|
|
export function P({style, ...rest}: TextProps) {
|
|
const t = useTheme()
|
|
const attr =
|
|
web({
|
|
role: 'paragraph',
|
|
}) || {}
|
|
return (
|
|
<RNText
|
|
{...attr}
|
|
{...rest}
|
|
style={normalizeTextStyles([
|
|
atoms.text_md,
|
|
atoms.leading_normal,
|
|
t.atoms.text,
|
|
flatten(style),
|
|
])}
|
|
/>
|
|
)
|
|
}
|