From cf449ac825db23db74b3cbef181d728497b30311 Mon Sep 17 00:00:00 2001 From: April Arcus Date: Thu, 16 Apr 2026 15:07:14 -0700 Subject: [PATCH] move layout components to @app/client Moves and everything that depends on it to the @app/client tree. Rationale: needs to read process.env.T_AND_C_URL, which is a detail of the build that @app/components shouldn't know about. When environment variable injection changes with Turbopack, we'll want to limit the blast radius. The other option was passing termsAndConditionsUrl as a prop from @app/client into everywhere we render it. But these layout components aren't logically reusable outside of their new locations in pages/ anyway, so it makes more sense to relocate them. unblocks turbopack --- .../layouts}/OrganizationSettingsLayout.tsx | 2 +- .../src => client/src/layouts}/Redirect.tsx | 3 +-- .../src/layouts}/SettingsLayout.tsx | 3 +-- .../src/layouts}/SharedLayout.tsx | 13 +------------ @app/client/src/pages/_error.tsx | 10 +++------- .../src/pages/create-organization/index.tsx | 4 +++- @app/client/src/pages/forgot.tsx | 3 ++- @app/client/src/pages/index.tsx | 3 ++- @app/client/src/pages/invitations/accept.tsx | 12 ++++-------- @app/client/src/pages/login.tsx | 18 ++++++++---------- @app/client/src/pages/o/[slug]/index.tsx | 3 ++- .../src/pages/o/[slug]/settings/delete.tsx | 6 +++--- .../src/pages/o/[slug]/settings/index.tsx | 13 +++++-------- .../src/pages/o/[slug]/settings/members.tsx | 13 +++++-------- @app/client/src/pages/register.tsx | 9 +++------ @app/client/src/pages/reset.tsx | 10 +++------- @app/client/src/pages/settings/accounts.tsx | 3 ++- @app/client/src/pages/settings/delete.tsx | 4 +++- @app/client/src/pages/settings/emails.tsx | 11 ++++------- @app/client/src/pages/settings/index.tsx | 5 ++++- @app/client/src/pages/settings/security.tsx | 9 +++------ @app/client/src/pages/verify.tsx | 4 +++- @app/components/src/index.tsx | 19 +++++++++++++++---- 23 files changed, 81 insertions(+), 99 deletions(-) rename @app/{components/src => client/src/layouts}/OrganizationSettingsLayout.tsx (98%) rename @app/{components/src => client/src/layouts}/Redirect.tsx (92%) rename @app/{components/src => client/src/layouts}/SettingsLayout.tsx (97%) rename @app/{components/src => client/src/layouts}/SharedLayout.tsx (95%) diff --git a/@app/components/src/OrganizationSettingsLayout.tsx b/@app/client/src/layouts/OrganizationSettingsLayout.tsx similarity index 98% rename from @app/components/src/OrganizationSettingsLayout.tsx rename to @app/client/src/layouts/OrganizationSettingsLayout.tsx index 781a8578..71223784 100644 --- a/@app/components/src/OrganizationSettingsLayout.tsx +++ b/@app/client/src/layouts/OrganizationSettingsLayout.tsx @@ -1,10 +1,10 @@ +import { StandardWidth } from "@app/components"; import { type OrganizationPage_OrganizationFragment } from "@app/graphql"; import { Layout, Menu, Typography } from "antd"; import Link from "next/link"; import React, { useMemo } from "react"; import { contentMinHeight } from "./SharedLayout"; -import { StandardWidth } from "./StandardWidth"; type TextProps = React.ComponentProps; const { Text } = Typography; diff --git a/@app/components/src/Redirect.tsx b/@app/client/src/layouts/Redirect.tsx similarity index 92% rename from @app/components/src/Redirect.tsx rename to @app/client/src/layouts/Redirect.tsx index a0407500..b296fd1c 100644 --- a/@app/components/src/Redirect.tsx +++ b/@app/client/src/layouts/Redirect.tsx @@ -1,11 +1,10 @@ import { NetworkStatus, useApolloClient } from "@apollo/client"; +import { H3, StandardWidth } from "@app/components"; import { Skeleton } from "antd"; import Router from "next/router"; import React, { useEffect } from "react"; import { SharedLayout } from "./SharedLayout"; -import { StandardWidth } from "./StandardWidth"; -import { H3 } from "./Text"; export interface RedirectProps { href: string; diff --git a/@app/components/src/SettingsLayout.tsx b/@app/client/src/layouts/SettingsLayout.tsx similarity index 97% rename from @app/components/src/SettingsLayout.tsx rename to @app/client/src/layouts/SettingsLayout.tsx index 6c85b599..cf23d179 100644 --- a/@app/components/src/SettingsLayout.tsx +++ b/@app/client/src/layouts/SettingsLayout.tsx @@ -1,3 +1,4 @@ +import { StandardWidth, Warn } from "@app/components"; import { Layout, Menu, Typography } from "antd"; import Link from "next/link"; import { type NextRouter, useRouter } from "next/router"; @@ -12,8 +13,6 @@ import { type SharedLayoutChildProps, type SharedLayoutProps, } from "./SharedLayout"; -import { StandardWidth } from "./StandardWidth"; -import { Warn } from "./Warn"; type TextProps = React.ComponentProps; const { Text } = Typography; diff --git a/@app/components/src/SharedLayout.tsx b/@app/client/src/layouts/SharedLayout.tsx similarity index 95% rename from @app/components/src/SharedLayout.tsx rename to @app/client/src/layouts/SharedLayout.tsx index 844e453b..31472d8e 100644 --- a/@app/components/src/SharedLayout.tsx +++ b/@app/client/src/layouts/SharedLayout.tsx @@ -4,6 +4,7 @@ import { type QueryResult, useApolloClient, } from "@apollo/client"; +import { ErrorAlert, H3, StandardWidth, Warn } from "@app/components"; import { companyName, projectName } from "@app/config"; import { type SharedLayout_QueryFragment, @@ -18,22 +19,10 @@ import Router, { useRouter } from "next/router"; import * as React from "react"; import { useCallback } from "react"; -import { ErrorAlert, H3, StandardWidth, Warn } from "."; import { Redirect } from "./Redirect"; const { Header, Content, Footer } = Layout; const { Text } = Typography; -/* - * For some reason, possibly related to the interaction between - * `babel-plugin-import` and https://github.com/babel/babel/pull/9766, we can't - * directly export these values, but if we reference them and re-export then we - * can. - * - * TODO: change back to `export { Row, Col, Link }` when this issue is fixed. - */ -const _babelHackRow = Row; -const _babelHackCol = Col; -export { _babelHackCol as Col, Link, _babelHackRow as Row }; export const contentMinHeight = "calc(100vh - 64px - 70px)"; diff --git a/@app/client/src/pages/_error.tsx b/@app/client/src/pages/_error.tsx index de1ce9b1..6bd79d6f 100644 --- a/@app/client/src/pages/_error.tsx +++ b/@app/client/src/pages/_error.tsx @@ -1,16 +1,12 @@ -import { - ErrorOccurred, - FourOhFour, - H2, - P, - SharedLayout, -} from "@app/components"; +import { ErrorOccurred, FourOhFour, H2, P } from "@app/components"; import { useSharedQuery } from "@app/graphql"; import { Alert, Col, Row } from "antd"; import { type NextPage } from "next"; import Link from "next/link"; import * as React from "react"; +import { SharedLayout } from "../layouts/SharedLayout"; + const isDev = process.env.NODE_ENV !== "production"; interface SocialAuthErrorProps { diff --git a/@app/client/src/pages/create-organization/index.tsx b/@app/client/src/pages/create-organization/index.tsx index 26f41d53..fef4165a 100644 --- a/@app/client/src/pages/create-organization/index.tsx +++ b/@app/client/src/pages/create-organization/index.tsx @@ -1,6 +1,5 @@ import { PageHeader } from "@ant-design/pro-layout"; import { type ApolloError } from "@apollo/client"; -import { AuthRestrict, Redirect, SharedLayout } from "@app/components"; import { type CreatedOrganizationFragment, useCreateOrganizationMutation, @@ -20,6 +19,9 @@ import { type Store } from "rc-field-form/lib/interface"; import React, { useCallback, useEffect, useMemo, useState } from "react"; import slugify from "slugify"; +import { Redirect } from "../../layouts/Redirect"; +import { AuthRestrict, SharedLayout } from "../../layouts/SharedLayout"; + const { useForm } = Form; const { Text } = Typography; diff --git a/@app/client/src/pages/forgot.tsx b/@app/client/src/pages/forgot.tsx index d2244a8b..3d567e09 100644 --- a/@app/client/src/pages/forgot.tsx +++ b/@app/client/src/pages/forgot.tsx @@ -1,6 +1,5 @@ import { UserOutlined } from "@ant-design/icons"; import { type ApolloError } from "@apollo/client"; -import { AuthRestrict, SharedLayout } from "@app/components"; import { useForgotPasswordMutation, useSharedQuery } from "@app/graphql"; import { extractError, getCodeFromError } from "@app/lib"; import { Alert, Button, Form, Input, type InputRef } from "antd"; @@ -9,6 +8,8 @@ import Link from "next/link"; import { type Store } from "rc-field-form/lib/interface"; import React, { useCallback, useEffect, useRef, useState } from "react"; +import { AuthRestrict, SharedLayout } from "../layouts/SharedLayout"; + const { useForm } = Form; const ForgotPassword: NextPage = () => { diff --git a/@app/client/src/pages/index.tsx b/@app/client/src/pages/index.tsx index 484e613c..dcd8a253 100644 --- a/@app/client/src/pages/index.tsx +++ b/@app/client/src/pages/index.tsx @@ -1,10 +1,11 @@ import { Button, Col, Divider, Row, Typography } from "antd"; import * as React from "react"; const { Text, Title, Paragraph } = Typography; -import { SharedLayout } from "@app/components"; import { useSharedQuery } from "@app/graphql"; import { type NextPage } from "next"; +import { SharedLayout } from "../layouts/SharedLayout"; + // Convenience helper const Li = ({ children, ...props }: any) => (
  • diff --git a/@app/client/src/pages/invitations/accept.tsx b/@app/client/src/pages/invitations/accept.tsx index 887e2db0..4b90b371 100644 --- a/@app/client/src/pages/invitations/accept.tsx +++ b/@app/client/src/pages/invitations/accept.tsx @@ -1,12 +1,5 @@ import { type QueryResult } from "@apollo/client"; -import { - AuthRestrict, - ButtonLink, - ErrorAlert, - Redirect, - SharedLayout, - SpinPadded, -} from "@app/components"; +import { ButtonLink, ErrorAlert, SpinPadded } from "@app/components"; import { type InvitationDetailQuery, type InvitationDetailQueryVariables, @@ -21,6 +14,9 @@ import Router, { type NextRouter, useRouter } from "next/router"; import * as qs from "querystring"; import React, { type FC } from "react"; +import { Redirect } from "../../layouts/Redirect"; +import { AuthRestrict, SharedLayout } from "../../layouts/SharedLayout"; + interface IProps { id: string | null; code: string | null; diff --git a/@app/client/src/pages/login.tsx b/@app/client/src/pages/login.tsx index d0bff524..3ca34bb3 100644 --- a/@app/client/src/pages/login.tsx +++ b/@app/client/src/pages/login.tsx @@ -1,15 +1,6 @@ import { LockOutlined, UserAddOutlined, UserOutlined } from "@ant-design/icons"; import { type ApolloError, useApolloClient } from "@apollo/client"; -import { - AuthRestrict, - ButtonLink, - Col, - Redirect, - Row, - SharedLayout, - type SharedLayoutChildProps, - SocialLoginOptions, -} from "@app/components"; +import { ButtonLink, Col, Row, SocialLoginOptions } from "@app/components"; import { useLoginMutation, useSharedQuery } from "@app/graphql"; import { extractError, @@ -23,6 +14,13 @@ import Router from "next/router"; import { type Store } from "rc-field-form/lib/interface"; import React, { useCallback, useEffect, useRef, useState } from "react"; +import { Redirect } from "../layouts/Redirect"; +import { + AuthRestrict, + SharedLayout, + type SharedLayoutChildProps, +} from "../layouts/SharedLayout"; + interface LoginProps { next: string | null; } diff --git a/@app/client/src/pages/o/[slug]/index.tsx b/@app/client/src/pages/o/[slug]/index.tsx index 37c22ee7..ba7a1497 100644 --- a/@app/client/src/pages/o/[slug]/index.tsx +++ b/@app/client/src/pages/o/[slug]/index.tsx @@ -1,7 +1,6 @@ import { PageHeader } from "@ant-design/pro-layout"; import { ButtonLink, - SharedLayout, useOrganizationLoading, useOrganizationSlug, } from "@app/components"; @@ -13,6 +12,8 @@ import { Col, Empty, Row } from "antd"; import { type NextPage } from "next"; import React, { type FC } from "react"; +import { SharedLayout } from "../../../layouts/SharedLayout"; + const OrganizationPage: NextPage = () => { const slug = useOrganizationSlug(); const query = useOrganizationPageQuery({ variables: { slug } }); diff --git a/@app/client/src/pages/o/[slug]/settings/delete.tsx b/@app/client/src/pages/o/[slug]/settings/delete.tsx index a289fe6d..0c3ffedd 100644 --- a/@app/client/src/pages/o/[slug]/settings/delete.tsx +++ b/@app/client/src/pages/o/[slug]/settings/delete.tsx @@ -1,11 +1,8 @@ import { PageHeader } from "@ant-design/pro-layout"; import { type ApolloError } from "@apollo/client"; import { - AuthRestrict, ErrorAlert, - OrganizationSettingsLayout, P, - SharedLayout, useOrganizationLoading, useOrganizationSlug, } from "@app/components"; @@ -20,6 +17,9 @@ import { type NextPage } from "next"; import { useRouter } from "next/router"; import React, { type FC, useCallback, useState } from "react"; +import { OrganizationSettingsLayout } from "../../../../layouts/OrganizationSettingsLayout"; +import { AuthRestrict, SharedLayout } from "../../../../layouts/SharedLayout"; + const OrganizationSettingsPage: NextPage = () => { const slug = useOrganizationSlug(); const query = useOrganizationPageQuery({ variables: { slug } }); diff --git a/@app/client/src/pages/o/[slug]/settings/index.tsx b/@app/client/src/pages/o/[slug]/settings/index.tsx index cf325a75..776ac2cb 100644 --- a/@app/client/src/pages/o/[slug]/settings/index.tsx +++ b/@app/client/src/pages/o/[slug]/settings/index.tsx @@ -1,12 +1,5 @@ import { PageHeader } from "@ant-design/pro-layout"; -import { - AuthRestrict, - OrganizationSettingsLayout, - Redirect, - SharedLayout, - useOrganizationLoading, - useOrganizationSlug, -} from "@app/components"; +import { useOrganizationLoading, useOrganizationSlug } from "@app/components"; import { type OrganizationPage_OrganizationFragment, useOrganizationPageQuery, @@ -19,6 +12,10 @@ import Router, { useRouter } from "next/router"; import { type Store } from "rc-field-form/lib/interface"; import React, { type FC, useCallback, useState } from "react"; +import { OrganizationSettingsLayout } from "../../../../layouts/OrganizationSettingsLayout"; +import { Redirect } from "../../../../layouts/Redirect"; +import { AuthRestrict, SharedLayout } from "../../../../layouts/SharedLayout"; + const { useForm } = Form; const OrganizationSettingsPage: NextPage = () => { diff --git a/@app/client/src/pages/o/[slug]/settings/members.tsx b/@app/client/src/pages/o/[slug]/settings/members.tsx index 44769309..b111cab8 100644 --- a/@app/client/src/pages/o/[slug]/settings/members.tsx +++ b/@app/client/src/pages/o/[slug]/settings/members.tsx @@ -1,12 +1,5 @@ import { PageHeader } from "@ant-design/pro-layout"; -import { - AuthRestrict, - OrganizationSettingsLayout, - Redirect, - SharedLayout, - useOrganizationLoading, - useOrganizationSlug, -} from "@app/components"; +import { useOrganizationLoading, useOrganizationSlug } from "@app/components"; import { type OrganizationMembers_MembershipFragment, type OrganizationMembers_OrganizationFragment, @@ -34,6 +27,10 @@ import { useRouter } from "next/router"; import { type Store } from "rc-field-form/lib/interface"; import React, { type FC, useCallback, useState } from "react"; +import { OrganizationSettingsLayout } from "../../../../layouts/OrganizationSettingsLayout"; +import { Redirect } from "../../../../layouts/Redirect"; +import { AuthRestrict, SharedLayout } from "../../../../layouts/SharedLayout"; + const { useForm } = Form; const OrganizationSettingsPage: NextPage = () => { diff --git a/@app/client/src/pages/register.tsx b/@app/client/src/pages/register.tsx index 5faf4dce..64768e36 100644 --- a/@app/client/src/pages/register.tsx +++ b/@app/client/src/pages/register.tsx @@ -1,11 +1,6 @@ import { QuestionCircleOutlined } from "@ant-design/icons"; import { type ApolloError, useApolloClient } from "@apollo/client"; -import { - AuthRestrict, - PasswordStrength, - Redirect, - SharedLayout, -} from "@app/components"; +import { PasswordStrength } from "@app/components"; import { useRegisterMutation, useSharedQuery } from "@app/graphql"; import { extractError, @@ -28,6 +23,8 @@ import React, { useState, } from "react"; +import { Redirect } from "../layouts/Redirect"; +import { AuthRestrict, SharedLayout } from "../layouts/SharedLayout"; import { isSafe } from "./login"; const { useForm } = Form; diff --git a/@app/client/src/pages/reset.tsx b/@app/client/src/pages/reset.tsx index 5edddf60..59b1af5e 100644 --- a/@app/client/src/pages/reset.tsx +++ b/@app/client/src/pages/reset.tsx @@ -1,10 +1,4 @@ -import { - AuthRestrict, - Col, - PasswordStrength, - Row, - SharedLayout, -} from "@app/components"; +import { Col, PasswordStrength, Row } from "@app/components"; import { useResetPasswordMutation, useSharedQuery } from "@app/graphql"; import { formItemLayout, setPasswordInfo, tailFormItemLayout } from "@app/lib"; import { Alert, Button, Form, Input } from "antd"; @@ -13,6 +7,8 @@ import { type NextPage } from "next"; import { type Store } from "rc-field-form/lib/interface"; import React, { type FocusEvent, useCallback, useState } from "react"; +import { AuthRestrict, SharedLayout } from "../layouts/SharedLayout"; + const { useForm } = Form; interface IProps { diff --git a/@app/client/src/pages/settings/accounts.tsx b/@app/client/src/pages/settings/accounts.tsx index 652d70f1..ad621930 100644 --- a/@app/client/src/pages/settings/accounts.tsx +++ b/@app/client/src/pages/settings/accounts.tsx @@ -2,7 +2,6 @@ import { GithubFilled } from "@ant-design/icons"; import { PageHeader } from "@ant-design/pro-layout"; import { ErrorAlert, - SettingsLayout, SocialLoginOptions, SpinPadded, Strong, @@ -17,6 +16,8 @@ import { Avatar, Card, List, Modal, Spin } from "antd"; import { type NextPage } from "next"; import React, { useCallback, useState } from "react"; +import { SettingsLayout } from "../../layouts/SettingsLayout"; + const AUTH_NAME_LOOKUP: Record = { github: "GitHub", facebook: "Facebook", diff --git a/@app/client/src/pages/settings/delete.tsx b/@app/client/src/pages/settings/delete.tsx index 020ec9ce..039c695a 100644 --- a/@app/client/src/pages/settings/delete.tsx +++ b/@app/client/src/pages/settings/delete.tsx @@ -1,6 +1,6 @@ import { PageHeader } from "@ant-design/pro-layout"; import { type ApolloError } from "@apollo/client"; -import { ErrorAlert, P, SettingsLayout } from "@app/components"; +import { ErrorAlert, P } from "@app/components"; import { useConfirmAccountDeletionMutation, useRequestAccountDeletionMutation, @@ -12,6 +12,8 @@ import { type NextPage } from "next"; import { useRouter } from "next/router"; import React, { useCallback, useState } from "react"; +import { SettingsLayout } from "../../layouts/SettingsLayout"; + const { Text } = Typography; const Settings_Accounts: NextPage = () => { diff --git a/@app/client/src/pages/settings/emails.tsx b/@app/client/src/pages/settings/emails.tsx index c36c1c95..8edf484e 100644 --- a/@app/client/src/pages/settings/emails.tsx +++ b/@app/client/src/pages/settings/emails.tsx @@ -1,12 +1,6 @@ import { PageHeader } from "@ant-design/pro-layout"; import { type ApolloError } from "@apollo/client"; -import { - ErrorAlert, - P, - Redirect, - SettingsLayout, - Strong, -} from "@app/components"; +import { ErrorAlert, P, Strong } from "@app/components"; import { type EmailsForm_UserEmailFragment, useAddEmailMutation, @@ -26,6 +20,9 @@ import { type NextPage } from "next"; import { type Store } from "rc-field-form/lib/interface"; import React, { useCallback, useState } from "react"; +import { Redirect } from "../../layouts/Redirect"; +import { SettingsLayout } from "../../layouts/SettingsLayout"; + const { useForm } = Form; function Email({ diff --git a/@app/client/src/pages/settings/index.tsx b/@app/client/src/pages/settings/index.tsx index 002dec27..658a587e 100644 --- a/@app/client/src/pages/settings/index.tsx +++ b/@app/client/src/pages/settings/index.tsx @@ -1,6 +1,6 @@ import { PageHeader } from "@ant-design/pro-layout"; import { type ApolloError } from "@apollo/client"; -import { ErrorAlert, Redirect, SettingsLayout } from "@app/components"; +import { ErrorAlert } from "@app/components"; import { type ProfileSettingsForm_UserFragment, useSettingsProfileQuery, @@ -17,6 +17,9 @@ import { type NextPage } from "next"; import { type Store } from "rc-field-form/lib/interface"; import React, { useCallback, useState } from "react"; +import { Redirect } from "../../layouts/Redirect"; +import { SettingsLayout } from "../../layouts/SettingsLayout"; + const { useForm } = Form; const Settings_Profile: NextPage = () => { diff --git a/@app/client/src/pages/settings/security.tsx b/@app/client/src/pages/settings/security.tsx index 012e85a9..4b558894 100644 --- a/@app/client/src/pages/settings/security.tsx +++ b/@app/client/src/pages/settings/security.tsx @@ -1,11 +1,6 @@ import { PageHeader } from "@ant-design/pro-layout"; import { type ApolloError } from "@apollo/client"; -import { - ErrorAlert, - P, - PasswordStrength, - SettingsLayout, -} from "@app/components"; +import { ErrorAlert, P, PasswordStrength } from "@app/components"; import { useChangePasswordMutation, useForgotPasswordMutation, @@ -25,6 +20,8 @@ import Link from "next/link"; import { type Store } from "rc-field-form/lib/interface"; import React, { useCallback, useState } from "react"; +import { SettingsLayout } from "../../layouts/SettingsLayout"; + const { useForm } = Form; const Settings_Security: NextPage = () => { diff --git a/@app/client/src/pages/verify.tsx b/@app/client/src/pages/verify.tsx index 772836a2..b5586fde 100644 --- a/@app/client/src/pages/verify.tsx +++ b/@app/client/src/pages/verify.tsx @@ -1,10 +1,12 @@ -import { Col, Row, SharedLayout } from "@app/components"; +import { Col, Row } from "@app/components"; import { useSharedQuery, useVerifyEmailMutation } from "@app/graphql"; import { Alert } from "antd"; import get from "lodash/get"; import { type NextPage } from "next"; import React, { useEffect } from "react"; +import { SharedLayout } from "../layouts/SharedLayout"; + interface IProps { id: string | null; token: string | null; diff --git a/@app/components/src/index.tsx b/@app/components/src/index.tsx index eba7cf68..074cb6e9 100644 --- a/@app/components/src/index.tsx +++ b/@app/components/src/index.tsx @@ -1,13 +1,24 @@ +import { Col, Row } from "antd"; +import Link from "next/link"; + +/* + * For some reason, possibly related to the interaction between + * `babel-plugin-import` and https://github.com/babel/babel/pull/9766, we can't + * directly export these values, but if we reference them and re-export then we + * can. + * + * TODO: change back to `export { Row, Col, Link }` when this issue is fixed. + */ +const _babelHackRow = Row; +const _babelHackCol = Col; +export { _babelHackCol as Col, Link, _babelHackRow as Row }; + export * from "./ButtonLink"; export * from "./ErrorAlert"; export * from "./ErrorOccurred"; export * from "./FourOhFour"; export * from "./organizationHooks"; -export * from "./OrganizationSettingsLayout"; export * from "./PasswordStrength"; -export * from "./Redirect"; -export * from "./SettingsLayout"; -export * from "./SharedLayout"; export * from "./SocialLoginOptions"; export * from "./SpinPadded"; export * from "./StandardWidth";