UNPKG

@revenuecat/purchases-ui-js

Version:

Web components for Paywalls. Powered by RevenueCat

129 lines (128 loc) 5.48 kB
import { defaultColor, getTextComponentStyles, } from "../text/text-utils"; import { getBorderStyle, getColor, getCornerRadiusStyle, getSizeStyle, prefixObject, stringifyStyles, } from "../../utils/style-utils"; import { getLabelAndReplaceVariables } from "../../utils/variable-utils"; export function getTimelineStyles(props) { const styles = { "--item-spacing": `${props.item_spacing}px`, "--width": "initial", "--height": "initial", "--flex": "0 1 auto", "--position": "relative", "--inset": "0", "--transform": "initial", }; Object.assign(styles, getSizeStyle(props.size)); Object.assign(styles, props.zStackChildStyles); const prefixedStyles = prefixObject(styles, "timeline"); return stringifyStyles(prefixedStyles); } export function getTimelineItemStyles(props) { const styles = { "--icon-size": `${props.icon.width_and_height}px`, "--icon-padding": `${props.icon.padding}px`, "--icon-color": getColor({ colorMap: props.icon.color, colorMode: props.purchaseState?.colorMode, }), "--icon-background-color": getColor({ colorMap: props.icon_background?.color, colorMode: props.purchaseState.colorMode, }), "--icon-border": getBorderStyle(props.icon_background?.border, props.purchaseState?.colorMode), "--text-spacing": `${props.text_spacing}px`, "--border-start-start-radius": `0px`, "--border-start-end-radius": `0px`, "--border-end-start-radius": `0px`, "--border-end-end-radius": `0px`, "--connector-color": getColor({ colorMap: props.connector?.color, colorMode: props.purchaseState.colorMode, }), "--connector-width": `${props.connector?.width || 0}px`, "--connector-top": "0px", "--connector-height": `${props.item_spacing}px`, }; Object.assign(styles, props.icon_background?.shape?.type === "rectangle" ? getCornerRadiusStyle(props.icon_background?.shape?.corners) : { "--border-start-start-radius": "50%", "--border-start-end-radius": "50%", "--border-end-start-radius": "50%", "--border-end-end-radius": "50%", }); if (props.connector) { const hasMarginTop = props.connector.margin.top !== 0; const hasMarginBottom = props.connector.margin.bottom !== 0; const itemBackgroundSize = props.icon.padding + props.icon.width_and_height / 2; if (!hasMarginTop && !hasMarginBottom) { styles["--connector-height"] = `${props.item_spacing + itemBackgroundSize * 2}px`; styles["--connector-top"] = `50%`; } if (hasMarginTop && hasMarginBottom) { styles["--connector-height"] = `${props.item_spacing - props.connector.margin.top - props.connector.margin.bottom}px`; styles["--connector-top"] = `calc(100% + ${props.connector.margin.top}px)`; } if (!hasMarginTop && hasMarginBottom) { styles["--connector-height"] = `${props.item_spacing - props.connector.margin.bottom + itemBackgroundSize}px`; styles["--connector-top"] = `50%`; } if (hasMarginTop && !hasMarginBottom) { styles["--connector-height"] = `${props.item_spacing + itemBackgroundSize}px`; styles["--connector-top"] = `calc(100% + ${props.connector.margin.top}px)`; } } const prefixedStyles = prefixObject(styles, "timeline-item"); return stringifyStyles(prefixedStyles); } export function getTimelineItemTextStyles(props, kind = "title") { const styles = { "--text-color": "inherit", "--text-font-size": "initial", "--text-font-weight": "initial", "--text-horizontal-alignment": "initial", "--text-margin-block-start": "0px", "--text-margin-inline-end": "0px", "--text-margin-block-end": "0px", "--text-margin-inline-start": "0px", "--text-padding-block-start": "0px", "--text-padding-inline-end": "0px", "--text-padding-block-end": "0px", "--text-padding-inline-start": "0px", }; const textProps = { color: props[kind]?.color || defaultColor, font_size: props[kind]?.font_size || "body_m", font_weight: props[kind]?.font_weight || "regular", horizontal_alignment: props[kind]?.horizontal_alignment || "leading", }; const { tagToRender, textStyles } = getTextComponentStyles({ ...props, components: [], ...textProps, size: { width: { type: "fit" }, height: { type: "fit" } }, type: "text", margin: { top: 0, bottom: 0, leading: 0, trailing: 0 }, padding: { top: 0, bottom: 0, leading: 0, trailing: 0 }, text_lid: "", }); Object.assign(styles, textStyles); const stringifiedStyles = stringifyStyles(prefixObject(styles, "timeline-item")); const textLabel = getLabelAndReplaceVariables({ text_lid: props[kind]?.text_lid, locale: props.purchaseState.locale, defaultLocale: props.purchaseState.defaultLocale, labels: props.labels, variableDictionary: props.variableDictionary, }); return { textStyles: stringifiedStyles, tagToRender, textLabel, }; }