diff --git a/apps/cyberstorm-remix/app/c/Community.css b/apps/cyberstorm-remix/app/c/Community.css index 1548c945b..1d5d40e0d 100644 --- a/apps/cyberstorm-remix/app/c/Community.css +++ b/apps/cyberstorm-remix/app/c/Community.css @@ -26,7 +26,7 @@ align-items: center; align-self: stretch; justify-content: center; - height: 12.5rem; + max-height: 12.5rem; border-radius: 0.5rem; overflow-y: hidden; transition: height 2s; @@ -36,6 +36,10 @@ background: var(--color-ui-surface-1); opacity: 0.8; } + + .skeleton { + height: 12.5rem; + } } .community__background--packagePage { @@ -47,12 +51,14 @@ } } - .community__content-header { + .community__content-header-wrapper { z-index: 1; display: flex; + flex-wrap: wrap; gap: 1.5rem; - align-items: flex-end; + place-items: flex-end stretch; align-self: stretch; + justify-content: space-between; height: max-content; margin-top: -1rem; padding-left: 1rem; @@ -62,6 +68,16 @@ visibility 1s 0s; } + .community__content-header { + display: flex; + flex-grow: 1; + gap: 1.5rem; + align-items: flex-end; + align-self: stretch; + min-width: 75%; + height: max-content; + } + .community__content-header--hide { height: 0; visibility: collapse; @@ -101,11 +117,10 @@ .community__content-header-content { display: flex; flex-direction: column; + flex-grow: 1; gap: 0.75rem; align-items: flex-start; justify-content: center; - width: 100%; - height: 5rem; } .community__header-info { @@ -115,16 +130,26 @@ gap: 0.25rem; align-items: flex-start; align-self: stretch; - width: 40%; + min-width: 60%; + max-width: 100%; + + > h1 { + line-height: 80%; + overflow-wrap: anywhere; + } } .community__header-meta { display: flex; - flex: 0 1 0; + flex: 0 1 60%; gap: 1.5rem; align-items: center; - width: 60%; - min-height: 16px; + min-width: 60%; + height: 16px; + + > .skeleton { + height: 1rem; + } } .community__small-image { @@ -151,7 +176,7 @@ .community__meta { display: flex; flex-wrap: wrap; - gap: var(--gap-xxxl); + gap: var(--gap-3xl); align-items: center; } @@ -169,9 +194,36 @@ } } + @media (width >= 41rem) { + .community__background { + height: 12.5rem; + } + } + + @media (width < 41rem) { + .community__background { + .skeleton { + height: 8rem; + } + } + + .community__header { + gap: 1rem; + } + + .community__content-header-wrapper { + margin-top: 0; + padding-left: 0; + } + + .community__game-icon { + display: none; + } + } + @media (width <= 48rem) { .community__meta { - gap: var(--gap-xxs); + gap: var(--gap-2xs); } .community__item { diff --git a/apps/cyberstorm-remix/app/c/community.tsx b/apps/cyberstorm-remix/app/c/community.tsx index ade0f3bcf..c89b611a4 100644 --- a/apps/cyberstorm-remix/app/c/community.tsx +++ b/apps/cyberstorm-remix/app/c/community.tsx @@ -39,8 +39,7 @@ export async function loader({ params }: LoaderFunctionArgs) { sessionId: undefined, }; }); - const community = dapper.getCommunity(params.communityId); - + const community = await dapper.getCommunity(params.communityId); return { community: community, }; @@ -152,91 +151,99 @@ export default function Community() {
-
-
- }> - - {(resolvedValue) => - resolvedValue.community_icon_url ? ( - {resolvedValue.name} - ) : null - } - - +
+
+
+ }> + + {(resolvedValue) => + resolvedValue.community_icon_url ? ( + {resolvedValue.name} + ) : null + } + + +
-
-
-
- }> - - {(resolvedValue) => ( - - {resolvedValue.name} - - )} - - -
-
- }> - - {(resolvedValue) => - resolvedValue.wiki_url ? ( - - - - - Modding Wiki - - - - - ) : null - } - - - }> - - {(resolvedValue) => - resolvedValue.discord_url ? ( - +
+ }> + + {(resolvedValue) => ( + - - - - Modding Discord - - - - - ) : null - } - - + {resolvedValue.name} + + )} + + +
+
+ }> + + {(resolvedValue) => + resolvedValue.wiki_url ? ( + + + + + Modding Wiki + + + + + ) : null + } + + + }> + + {(resolvedValue) => + resolvedValue.discord_url ? ( + + + + + Modding Discord + + + + + ) : null + } + + +
- + diff --git a/apps/cyberstorm-remix/app/c/tabs/PackageSearch/PackageSearch.tsx b/apps/cyberstorm-remix/app/c/tabs/PackageSearch/PackageSearch.tsx index 2cf8be887..71b1b0a0c 100644 --- a/apps/cyberstorm-remix/app/c/tabs/PackageSearch/PackageSearch.tsx +++ b/apps/cyberstorm-remix/app/c/tabs/PackageSearch/PackageSearch.tsx @@ -1,4 +1,3 @@ -import type { LoaderFunctionArgs } from "react-router"; import { useLoaderData, useOutletContext } from "react-router"; import { PackageSearch } from "~/commonComponents/PackageSearch/PackageSearch"; import { PackageOrderOptions } from "~/commonComponents/PackageSearch/components/PackageOrder"; @@ -8,8 +7,9 @@ import { getSessionTools, } from "cyberstorm/security/publicEnvVariables"; import { OutletContextShape } from "~/root"; +import { Route } from "./+types/PackageSearch"; -export async function loader({ request, params }: LoaderFunctionArgs) { +export async function loader({ params, request }: Route.LoaderArgs) { if (params.communityId) { const publicEnvVariables = getPublicEnvVariables(["VITE_API_URL"]); const dapper = new DapperTs(() => { @@ -28,11 +28,11 @@ export async function loader({ request, params }: LoaderFunctionArgs) { const section = searchParams.get("section"); const nsfw = searchParams.get("nsfw"); const deprecated = searchParams.get("deprecated"); - const filters = dapper.getCommunityFilters(params.communityId); + const filters = await dapper.getCommunityFilters(params.communityId); return { filters: filters, - listings: dapper.getPackageListings( + listings: await dapper.getPackageListings( { kind: "community", communityId: params.communityId, @@ -51,7 +51,10 @@ export async function loader({ request, params }: LoaderFunctionArgs) { throw new Response("Community not found", { status: 404 }); } -export async function clientLoader({ request, params }: LoaderFunctionArgs) { +export async function clientLoader({ + request, + params, +}: Route.ClientLoaderArgs) { if (params.communityId) { const tools = getSessionTools(); const dapper = new DapperTs(() => { diff --git a/apps/cyberstorm-remix/app/commonComponents/CheckboxList/CheckboxList.css b/apps/cyberstorm-remix/app/commonComponents/CheckboxList/CheckboxList.css index 25af9390e..f5f80bba8 100644 --- a/apps/cyberstorm-remix/app/commonComponents/CheckboxList/CheckboxList.css +++ b/apps/cyberstorm-remix/app/commonComponents/CheckboxList/CheckboxList.css @@ -16,30 +16,49 @@ transition: var(--animation-duration-xs); user-select: none; + > span { + display: inline-flex; + flex-wrap: nowrap; + gap: 0.75rem; + align-items: center; + } + &.checkbox-list__label--off { color: var(--color-text-secondary); svg { --icon-color: var(--color-surface-a8); } + + .checkbox-list__exclude-button svg { + --icon-color: transparent; + } } &.checkbox-list__label--include { color: var(--color-cyber-green-7); font-weight: var(--font-weight-bold); - svg { + .checkbox-list__checkbox-button svg { --icon-color: var(--color-cyber-green-7); } + + .checkbox-list__exclude-button svg { + --icon-color: transparent; + } } &.checkbox-list__label--exclude { color: var(--color-accent-red-7); font-weight: var(--font-weight-bold); - svg { + .checkbox-list__exclude-button svg { --icon-color: var(--color-accent-red-7); } + + .checkbox-list__checkbox-button svg { + --icon-color: var(--color-surface-a8); + } } &:hover { @@ -57,22 +76,30 @@ &.checkbox-list__label--include { color: var(--color-cyber-green-8); - svg { + .checkbox-list__checkbox-button svg { --icon-color: var(--color-cyber-green-8); } + + .checkbox-list__exclude-button svg { + --icon-color: var(--color-accent-red-8); + } } &.checkbox-list__label--exclude { color: var(--color-accent-red-8); - svg { + .checkbox-list__checkbox-button svg { + --icon-color: var(--color-surface-a10); + } + + .checkbox-list__exclude-button svg { --icon-color: var(--color-accent-red-8); } } } } - .checkbox-list__checkbox { + .checkbox-list__icon { display: flex; align-items: center; justify-content: center; @@ -83,6 +110,17 @@ background-color: transparent; transition: ease-out var(--animation-duration-xs); + + &.checkbox-list__exclude-button { + --icon-inline-size: var(--space-16); + + width: var(--space-20); + height: var(--space-20); + + &:hover { + --icon-color: var(--color-accent-red-8); + } + } } } } diff --git a/apps/cyberstorm-remix/app/commonComponents/CheckboxList/CheckboxList.tsx b/apps/cyberstorm-remix/app/commonComponents/CheckboxList/CheckboxList.tsx index 1e7ef018d..468b8e062 100644 --- a/apps/cyberstorm-remix/app/commonComponents/CheckboxList/CheckboxList.tsx +++ b/apps/cyberstorm-remix/app/commonComponents/CheckboxList/CheckboxList.tsx @@ -1,12 +1,12 @@ import { + faBan, faSquare, faSquareCheck, - faSquareXmark, } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import "./CheckboxList.css"; -import { CycleButton, NewIcon } from "@thunderstore/cyberstorm"; +import { Actionable, NewIcon } from "@thunderstore/cyberstorm"; import { classnames } from "@thunderstore/cyberstorm/src/utils/utils"; import { resolveTriState } from "~/commonComponents/utils"; import { TRISTATE } from "~/commonComponents/types"; @@ -45,28 +45,48 @@ export const CheckboxList = memo(function CheckboxList(props: Props) { "checkbox-list__label", `checkbox-list__label--${cs}` )} + htmlFor={`checkbox-list__checkbox__${item.label}`} > - {item.label} - { - item.setStateFunc(nextStateResolve(item.state)); - }} - rootClasses="checkbox-list__checkbox" - value={`checkbox-list__label--${cs}`} - noState - > - - + { + if (typeof item.state === "string") { + item.setStateFunc( + item.state !== "include" ? "include" : "off" + ); + } else { + item.setStateFunc(!item.state); } - /> - - + }} + rootClasses="checkbox-list__icon checkbox-list__checkbox-button" + id={`checkbox-list__checkbox__${item.label}`} + > + + + + + {item.label} + + {typeof item.state === "string" && ( + { + if (item.state === "exclude") { + item.setStateFunc("off"); + } else { + item.setStateFunc("exclude"); + } + }} + rootClasses="checkbox-list__icon checkbox-list__exclude-button" + > + + + + + )} ); diff --git a/apps/cyberstorm-remix/app/commonComponents/Collapsible/Collapsible.css b/apps/cyberstorm-remix/app/commonComponents/Collapsible/Collapsible.css index 126fd96de..1099eb8d4 100644 --- a/apps/cyberstorm-remix/app/commonComponents/Collapsible/Collapsible.css +++ b/apps/cyberstorm-remix/app/commonComponents/Collapsible/Collapsible.css @@ -3,8 +3,7 @@ display: flex; flex: 1; flex-direction: column; - align-items: flex-start; - align-self: stretch; + align-items: stretch; padding: 0.5rem; border-radius: var(--Radius-md, 0.5rem); font-size: var(--font-size-body-md); diff --git a/apps/cyberstorm-remix/app/commonComponents/Connection/Connection.css b/apps/cyberstorm-remix/app/commonComponents/Connection/Connection.css index 982599319..2496be7ba 100644 --- a/apps/cyberstorm-remix/app/commonComponents/Connection/Connection.css +++ b/apps/cyberstorm-remix/app/commonComponents/Connection/Connection.css @@ -1,7 +1,7 @@ @layer nimbus-components { .connection { display: flex; - gap: var(--gap-xxxl); + gap: var(--gap-3xl); align-items: center; align-self: stretch; padding: var(--space-16) var(--space-32); @@ -48,7 +48,7 @@ .connection__actions { display: flex; - gap: var(--gap-xxxl); + gap: var(--gap-3xl); align-items: center; justify-content: flex-end; } @@ -56,7 +56,7 @@ .connection__description { display: flex; flex-direction: column; - gap: var(--gap-xxxs); + gap: var(--gap-3xs); align-items: flex-end; justify-content: center; } diff --git a/apps/cyberstorm-remix/app/commonComponents/Footer/Footer.css b/apps/cyberstorm-remix/app/commonComponents/Footer/Footer.css index dc80f1e21..718fd0109 100644 --- a/apps/cyberstorm-remix/app/commonComponents/Footer/Footer.css +++ b/apps/cyberstorm-remix/app/commonComponents/Footer/Footer.css @@ -21,7 +21,7 @@ .footer__links-wrapper { display: flex; flex-wrap: wrap; - gap: var(--gap-xxxl); + gap: var(--gap-3xl); justify-content: space-between; margin-left: 3.5rem; } @@ -47,7 +47,7 @@ .footer__icon-links { display: flex; flex-shrink: 0; - gap: var(--gap-xxxl); + gap: var(--gap-3xl); justify-content: center; } @@ -181,7 +181,7 @@ .footnote__inner { display: flex; flex-grow: 1; - gap: var(--gap-xxl); + gap: var(--gap-2xl); max-width: calc(var(--footer-half-width) * 2); margin-right: 3.5rem; margin-left: 3.5rem; @@ -191,7 +191,7 @@ display: flex; flex: 1 0 0; flex-wrap: wrap; - gap: var(--gap-xxxl); + gap: var(--gap-3xl); align-items: flex-start; > a { @@ -240,7 +240,7 @@ display: flex; flex-flow: column wrap; flex-shrink: 0; - gap: var(--gap-xxxl); + gap: var(--gap-3xl); justify-content: space-between; max-width: unset; margin-left: unset; diff --git a/apps/cyberstorm-remix/app/commonComponents/ListingDependency/ListingDependency.css b/apps/cyberstorm-remix/app/commonComponents/ListingDependency/ListingDependency.css index b8e2e5b3f..787069f08 100644 --- a/apps/cyberstorm-remix/app/commonComponents/ListingDependency/ListingDependency.css +++ b/apps/cyberstorm-remix/app/commonComponents/ListingDependency/ListingDependency.css @@ -29,7 +29,7 @@ .listing-dependency__title { display: flex; - gap: var(--gap-xxs); + gap: var(--gap-2xs); align-items: center; align-self: stretch; font-weight: var(--font-weight-regular); diff --git a/apps/cyberstorm-remix/app/commonComponents/PackageSearch/PackageSearch.css b/apps/cyberstorm-remix/app/commonComponents/PackageSearch/PackageSearch.css index d16f40b92..31218c261 100644 --- a/apps/cyberstorm-remix/app/commonComponents/PackageSearch/PackageSearch.css +++ b/apps/cyberstorm-remix/app/commonComponents/PackageSearch/PackageSearch.css @@ -46,11 +46,17 @@ .package-search__pagination { display: flex; - gap: var(--gap-xxs); + gap: var(--gap-2xs); align-items: center; align-self: stretch; justify-content: center; padding-top: var(--space-40); + + > .skeleton { + width: 100%; + max-width: 20rem; + height: 2.5rem; + } } .package-search__search-params { @@ -102,8 +108,14 @@ .package-search__results { display: flex; flex: 1; - gap: var(--gap-xxs); + gap: var(--gap-2xs); align-items: center; + justify-content: flex-end; + + .skeleton { + width: 18ch; + height: 1rem; + } } .package-search__packages { @@ -120,6 +132,10 @@ grid-template-columns: repeat(auto-fill, minmax(14rem, 1fr)); gap: var(--gap-sm); width: 100%; + + > .skeleton { + height: 30rem; + } } @media (width <= 48rem) { @@ -145,6 +161,7 @@ @media (width <= 475px) { .package-search { flex-direction: column; + gap: 0.25rem; } .package-search__sidebar { @@ -153,8 +170,13 @@ width: 100%; } + .package-search__filters { + width: unset; + } + .package-search__tools { flex-direction: column; + gap: 0.5rem; align-items: stretch; } @@ -165,9 +187,14 @@ .package-search__grid { grid-template-columns: repeat(auto-fill, minmax(12rem, 1fr)); + + > .skeleton { + height: 28rem; + } } .package-search__content { + gap: 0.5rem; align-self: stretch; } } diff --git a/apps/cyberstorm-remix/app/commonComponents/PackageSearch/PackageSearch.tsx b/apps/cyberstorm-remix/app/commonComponents/PackageSearch/PackageSearch.tsx index 6ebe0e050..c063cd317 100644 --- a/apps/cyberstorm-remix/app/commonComponents/PackageSearch/PackageSearch.tsx +++ b/apps/cyberstorm-remix/app/commonComponents/PackageSearch/PackageSearch.tsx @@ -5,7 +5,7 @@ import { PackageListings, Section, } from "@thunderstore/dapper/types"; -import { Suspense, useEffect, useRef, useState } from "react"; +import { memo, Suspense, useEffect, useRef, useState } from "react"; import { useDebounce } from "use-debounce"; import "./PackageSearch.css"; @@ -16,6 +16,7 @@ import { NewButton, NewPagination, NewTextInput, + SkeletonBox, } from "@thunderstore/cyberstorm"; import { Await, useNavigationType, useSearchParams } from "react-router"; import { PackageCount } from "./components/PackageCount/PackageCount"; @@ -35,12 +36,13 @@ import { RequestConfig, } from "@thunderstore/thunderstore-api"; import { DapperTs } from "@thunderstore/dapper-ts"; +import { isPromise } from "cyberstorm/utils/typeChecks"; const PER_PAGE = 20; interface Props { - listings: Promise; - filters: Promise; + listings: Promise | PackageListings; + filters: Promise | CommunityFilters; config: () => RequestConfig; currentUser?: CurrentUser; dapper: DapperTs; @@ -148,34 +150,26 @@ const compareSearchParamBlobs = ( export function PackageSearch(props: Props) { const { listings, filters, config, currentUser, dapper } = props; - // const navigation = useNavigation(); - const navigationType = useNavigationType(); - // const listingsAndFiltersMemo = useMemo( - // () => Promise.all([listings, filters]), - // [listings, filters] - // ); + // This exists to resolve insert the initial sections and categories on server-side + // so that we don't have to await the clientLoader to get the options, to then be able to + // do the initial fetch + const possibleFilters = isPromise(filters) ? undefined : filters; - const [sortedSections, setSortedSections] = - useState(); - const [categories, setCategories] = useState(); + const [sortedSections, setSortedSections] = useState< + CommunityFilters["sections"] | undefined + >(possibleFilters?.sections); - const [searchParams, setSearchParams] = useSearchParams(); + const [categories, setCategories] = useState( + possibleFilters?.package_categories + .sort((a, b) => a.slug.localeCompare(b.slug)) + .map((c) => ({ ...c, selection: "off" })) + ); - // filters.then((resolvedFilters) => { - // // Set sorted sections - // setSortedSections( - // resolvedFilters.sections.sort((a, b) => b.priority - a.priority) - // ); - // // Set current "initial" categories - // const categories: CategorySelection[] = resolvedFilters.package_categories - // .sort((a, b) => a.slug.localeCompare(b.slug)) - // .map((c) => ({ ...c, selection: "off" })); - // setCategories(categories); - // }); + const [searchParams, setSearchParams] = useSearchParams(); - const initialParams = searchParamsToBlob(searchParams); + const initialParams = searchParamsToBlob(searchParams, sortedSections); const [searchParamsBlob, setSearchParamsBlob] = useState(initialParams); @@ -184,6 +178,37 @@ export function PackageSearch(props: Props) { searchParams.get("page") ? Number(searchParams.get("page")) : 1 ); + const categoriesRef = useRef< + undefined | Awaited>["package_categories"] + >(undefined); + + useEffect(() => { + if (isPromise(filters)) { + // On mount, resolve filters promise and set sections and categories states + filters.then((resolvedFilters) => { + // Set sorted sections + setSortedSections( + resolvedFilters.sections.sort((a, b) => b.priority - a.priority) + ); + if (sortedSections && sortedSections.length !== 0) { + setSearchParamsBlob((prev) => ({ + ...prev, + section: sortedSections[0].uuid, + })); + } + if (resolvedFilters.package_categories !== categoriesRef.current) { + // Set current "initial" categories + const categories: CategorySelection[] = + resolvedFilters.package_categories + .sort((a, b) => a.slug.localeCompare(b.slug)) + .map((c) => ({ ...c, selection: "off" })); + setCategories(categories); + categoriesRef.current = resolvedFilters.package_categories; + } + }); + } + }, []); + // Categories start const parsedCategories = parseCategories( @@ -307,38 +332,30 @@ export function PackageSearch(props: Props) { resetPage = true; } // Section - // Because of the first section being a empty value, the logic check is a bit funky - - // If no section in search params, delete - if (sortedSections && sortedSections.length === 0) - searchParams.delete("section"); - - // If new section is empty, delete (defaults to first) - if (debouncedSearchParamsBlob.section === "") - searchParams.delete("section"); - - // If new section is the first one, delete. And reset page number if section is different from last render. if ( - sortedSections && - debouncedSearchParamsBlob.section === sortedSections[0]?.uuid + debouncedSearchParamsBlob.section === "" || + (sortedSections && sortedSections.length === 0) ) { - if ( - searchParamsBlobRef.current.section !== - debouncedSearchParamsBlob.section - ) { - resetPage = true; - } searchParams.delete("section"); + } else { + if (sortedSections && sortedSections.length !== 0) { + if (debouncedSearchParamsBlob.section === sortedSections[0]?.uuid) { + // If the first one, ensure the search param isn't set as it's defaulted to the first one in SearchParmsToBlob function. + searchParams.delete("section"); + } else { + searchParams.set("section", debouncedSearchParamsBlob.section); + } + } else { + // This else is for completeness + searchParams.delete("section"); + } } - // If new section is different and not the first one, set it. + // Reset page if section has changed if ( - sortedSections && searchParamsBlobRef.current.section !== - debouncedSearchParamsBlob.section && - debouncedSearchParamsBlob.section !== sortedSections[0]?.uuid + debouncedSearchParamsBlob.section ) { - searchParams.set("section", debouncedSearchParamsBlob.section); resetPage = true; } @@ -470,7 +487,11 @@ export function PackageSearch(props: Props) { priority: -999999999, }, ]} - selected={searchParamsBlob.section ?? sortedSections[0]?.uuid} + selected={ + searchParamsBlob.section === "" + ? sortedSections[0]?.uuid + : searchParamsBlob.section + } setSelected={setParamsBlobValue( setSearchParamsBlob, searchParamsBlob, @@ -581,13 +602,7 @@ export function PackageSearch(props: Props) {
- - Loading... - - } - > + }> {(resolvedValue) => (
- - Loading... - - } - > + }> {(resolvedValue) => ( <> @@ -686,13 +695,7 @@ export function PackageSearch(props: Props) {
- - Loading... - - } - > + }> {(resolvedValue) => ( + {Array.from({ length: 12 }).map((_, index) => ( + + ))} +
+ ); + } +); diff --git a/apps/cyberstorm-remix/app/communities/Communities.css b/apps/cyberstorm-remix/app/communities/Communities.css index 13224fec1..ad7868656 100644 --- a/apps/cyberstorm-remix/app/communities/Communities.css +++ b/apps/cyberstorm-remix/app/communities/Communities.css @@ -12,7 +12,7 @@ .communities__content { display: flex; flex-direction: column; - gap: var(--gap-xxxl); + gap: var(--gap-3xl); align-items: flex-start; align-self: stretch; } @@ -38,7 +38,7 @@ display: grid; flex-flow: row wrap; grid-template-columns: repeat(auto-fill, minmax(10.5rem, 1fr)); - gap: var(--gap-xxxxxxxl) var(--gap-xl); + gap: var(--gap-7xl) var(--gap-xl); width: 100%; } @@ -77,6 +77,12 @@ } } + @media (width <= 41rem) { + .communities__communities-list { + gap: var(--gap-3xl) var(--gap-xl); + } + } + @media (width <= 39rem) { .communities__tools { flex-direction: column; diff --git a/apps/cyberstorm-remix/app/communities/communities.tsx b/apps/cyberstorm-remix/app/communities/communities.tsx index 4707d2b05..709e5f561 100644 --- a/apps/cyberstorm-remix/app/communities/communities.tsx +++ b/apps/cyberstorm-remix/app/communities/communities.tsx @@ -175,6 +175,7 @@ export default function CommunitiesPage() { leftIcon={} type="search" rootClasses="communities__search" + csSize="small" /> = ({ data }) => { - return [ - { title: data?.community.name }, - { name: "description", content: `Mods for ${data?.community.name}` }, - ]; -}; - -export async function loader({ request, params }: LoaderFunctionArgs) { - if (params.communityId && params.namespaceId && params.packageId) { - try { - const publicEnvVariables = getPublicEnvVariables(["VITE_API_URL"]); - const dapper = new DapperTs(() => { - return { - apiHost: publicEnvVariables.VITE_API_URL, - sessionId: undefined, - }; - }); - const searchParams = new URL(request.url).searchParams; - const ordering = - searchParams.get("ordering") ?? PackageOrderOptions.Updated; - const page = searchParams.get("page"); - const search = searchParams.get("search"); - const includedCategories = searchParams.get("includedCategories"); - const excludedCategories = searchParams.get("excludedCategories"); - const section = searchParams.get("section"); - const nsfw = searchParams.get("nsfw"); - const deprecated = searchParams.get("deprecated"); - const community = await dapper.getCommunity(params.communityId); - const filters = await dapper.getCommunityFilters(params.communityId); - const sortedSections = filters.sections.sort( - (a, b) => b.priority - a.priority - ); +export async function loader({ params, request }: Route.LoaderArgs) { + if (params.communityId && params.packageId && params.namespaceId) { + const publicEnvVariables = getPublicEnvVariables(["VITE_API_URL"]); + const dapper = new DapperTs(() => { return { - community: community, - filters: filters, - listing: await dapper.getPackageListingDetails( - params.communityId, - params.namespaceId, - params.packageId - ), - listings: await dapper.getPackageListings( - { - kind: "package-dependants", - communityId: params.communityId, - namespaceId: params.namespaceId, - packageName: params.packageId, - }, - ordering ?? "", - page === null ? undefined : Number(page), - search ?? "", - includedCategories?.split(",") ?? undefined, - excludedCategories?.split(",") ?? undefined, - section - ? section === "all" - ? "" - : section - : sortedSections && sortedSections[0] - ? sortedSections[0].uuid - : "", - nsfw === "true" ? true : false, - deprecated === "true" ? true : false - ), - sortedSections: sortedSections, + apiHost: publicEnvVariables.VITE_API_URL, + sessionId: undefined, }; - } catch (error) { - if (error instanceof ApiError) { - throw new Response("Package not found", { status: 404 }); - } else { - throw error; - } - } + }); + const searchParams = new URL(request.url).searchParams; + const ordering = + searchParams.get("ordering") ?? PackageOrderOptions.Updated; + const page = searchParams.get("page"); + const search = searchParams.get("search"); + const includedCategories = searchParams.get("includedCategories"); + const excludedCategories = searchParams.get("excludedCategories"); + const section = searchParams.get("section"); + const nsfw = searchParams.get("nsfw"); + const deprecated = searchParams.get("deprecated"); + const filters = await dapper.getCommunityFilters(params.communityId); + + return { + community: dapper.getCommunity(params.communityId), + listing: dapper.getPackageListingDetails( + params.communityId, + params.namespaceId, + params.packageId + ), + filters: filters, + listings: await dapper.getPackageListings( + { + kind: "package-dependants", + communityId: params.communityId, + namespaceId: params.namespaceId, + packageName: params.packageId, + }, + ordering ?? "", + page === null ? undefined : Number(page), + search ?? "", + includedCategories?.split(",") ?? undefined, + excludedCategories?.split(",") ?? undefined, + section ? (section === "all" ? "" : section) : "", + nsfw === "true" ? true : false, + deprecated === "true" ? true : false + ), + }; } - throw new Response("Package not found", { status: 404 }); + throw new Response("Community not found", { status: 404 }); } -export async function clientLoader({ request, params }: LoaderFunctionArgs) { - if (params.communityId && params.namespaceId && params.packageId) { - try { - const tools = getSessionTools(); - const dapper = new DapperTs(() => { - return { - apiHost: tools?.getConfig().apiHost, - sessionId: tools?.getConfig().sessionId, - }; - }); - const searchParams = new URL(request.url).searchParams; - const ordering = - searchParams.get("ordering") ?? PackageOrderOptions.Updated; - const page = searchParams.get("page"); - const search = searchParams.get("search"); - const includedCategories = searchParams.get("includedCategories"); - const excludedCategories = searchParams.get("excludedCategories"); - const section = searchParams.get("section"); - const nsfw = searchParams.get("nsfw"); - const deprecated = searchParams.get("deprecated"); - const community = await dapper.getCommunity(params.communityId); - const filters = await dapper.getCommunityFilters(params.communityId); - const sortedSections = filters.sections.sort( - (a, b) => b.priority - a.priority - ); +export async function clientLoader({ + request, + params, +}: Route.ClientLoaderArgs) { + if (params.communityId && params.packageId && params.namespaceId) { + const tools = getSessionTools(); + const dapper = new DapperTs(() => { return { - community: community, - filters: filters, - listing: await dapper.getPackageListingDetails( - params.communityId, - params.namespaceId, - params.packageId - ), - listings: await dapper.getPackageListings( - { - kind: "package-dependants", - communityId: params.communityId, - namespaceId: params.namespaceId, - packageName: params.packageId, - }, - ordering ?? "", - page === null ? undefined : Number(page), - search ?? "", - includedCategories?.split(",") ?? undefined, - excludedCategories?.split(",") ?? undefined, - section - ? section === "all" - ? "" - : section - : sortedSections && sortedSections[0] - ? sortedSections[0].uuid - : "", - nsfw === "true" ? true : false, - deprecated === "true" ? true : false - ), - sortedSections: sortedSections, + apiHost: tools?.getConfig().apiHost, + sessionId: tools?.getConfig().sessionId, }; - } catch (error) { - if (error instanceof ApiError) { - throw new Response("Package not found", { status: 404 }); - } else { - throw error; - } - } + }); + const searchParams = new URL(request.url).searchParams; + const ordering = + searchParams.get("ordering") ?? PackageOrderOptions.Updated; + const page = searchParams.get("page"); + const search = searchParams.get("search"); + const includedCategories = searchParams.get("includedCategories"); + const excludedCategories = searchParams.get("excludedCategories"); + const section = searchParams.get("section"); + const nsfw = searchParams.get("nsfw"); + const deprecated = searchParams.get("deprecated"); + const filters = dapper.getCommunityFilters(params.communityId); + return { + community: dapper.getCommunity(params.communityId), + listing: dapper.getPackageListingDetails( + params.communityId, + params.namespaceId, + params.packageId + ), + filters: filters, + listings: dapper.getPackageListings( + { + kind: "package-dependants", + communityId: params.communityId, + namespaceId: params.namespaceId, + packageName: params.packageId, + }, + ordering ?? "", + page === null ? undefined : Number(page), + search ?? "", + includedCategories?.split(",") ?? undefined, + excludedCategories?.split(",") ?? undefined, + section ? (section === "all" ? "" : section) : "", + nsfw === "true" ? true : false, + deprecated === "true" ? true : false + ), + }; } - throw new Response("Package not found", { status: 404 }); + throw new Response("Community not found", { status: 404 }); } export default function Dependants() { - const { community, filters, listing, listings, sortedSections } = - useLoaderData(); + const { filters, listing, listings } = useLoaderData< + typeof loader | typeof clientLoader + >(); const outletContext = useOutletContext() as OutletContextShape; return ( <> - - - Communities - - - {community.name} - - - {listing.namespace} - - - {formatToDisplayName(listing.name)} - - - Dependants - -
- - Mods that depend on{" "} - - {formatToDisplayName(listing.name)} - - {" by "} - - {listing.namespace} - - - + }> + + {(resolvedValue) => ( + + Mods that depend on{" "} + + {formatToDisplayName(resolvedValue.name)} + + {" by "} + + {resolvedValue.namespace} + + + )} + + + <> + +
); diff --git a/apps/cyberstorm-remix/app/p/packageEdit.css b/apps/cyberstorm-remix/app/p/packageEdit.css index f5c8a93e3..0ba9d6f4f 100644 --- a/apps/cyberstorm-remix/app/p/packageEdit.css +++ b/apps/cyberstorm-remix/app/p/packageEdit.css @@ -1,7 +1,7 @@ @layer nimbus-layout { .package-edit__main { display: flex; - gap: var(--gap-xxxl); + gap: var(--gap-3xl); align-items: center; align-self: stretch; } diff --git a/apps/cyberstorm-remix/app/p/packageEdit.tsx b/apps/cyberstorm-remix/app/p/packageEdit.tsx index 1ccf2704e..a146434af 100644 --- a/apps/cyberstorm-remix/app/p/packageEdit.tsx +++ b/apps/cyberstorm-remix/app/p/packageEdit.tsx @@ -2,8 +2,6 @@ import type { LoaderFunctionArgs, MetaFunction } from "react-router"; import { useLoaderData, useOutletContext, useRevalidator } from "react-router"; import { NewAlert, - NewBreadCrumbs, - NewBreadCrumbsLink, NewButton, NewIcon, NewSelectSearch, @@ -237,45 +235,6 @@ export default function PackageListing() { return ( <> - - - Communities - - - {community.name} - - - {listing.namespace} - - - {listing.name} - - - Edit package - - Edit package diff --git a/apps/cyberstorm-remix/app/p/packageListing.css b/apps/cyberstorm-remix/app/p/packageListing.css index a5e6c41f3..2e9ccdfb6 100644 --- a/apps/cyberstorm-remix/app/p/packageListing.css +++ b/apps/cyberstorm-remix/app/p/packageListing.css @@ -1,7 +1,7 @@ @layer nimbus-layout { .package-listing__main { display: flex; - gap: var(--gap-xxxl); + gap: var(--gap-3xl); align-items: flex-start; align-self: stretch; } @@ -129,7 +129,7 @@ display: flex; flex: 1 0 0; flex-direction: column; - gap: var(--gap-xxxl); + gap: var(--gap-3xl); align-items: flex-start; align-self: stretch; } @@ -188,7 +188,7 @@ .package-listing-sidebar__meta { display: flex; flex-direction: column; - gap: var(--gap-xxxs); + gap: var(--gap-3xs); align-items: flex-start; align-self: stretch; @@ -203,7 +203,7 @@ .package-listing-sidebar__item { display: flex; - gap: var(--gap-xxxl); + gap: var(--gap-3xl); align-items: center; align-self: stretch; padding: var(--space-8) var(--space-12); @@ -294,6 +294,21 @@ width: 100%; } + @media (width < 41rem) { + .package-listing__actions { + position: unset; + top: unset; + right: unset; + display: flex; + flex: 1 1 0; + } + + .package-listing-management-tools { + flex: 1 1 0; + flex-flow: row wrap; + } + } + /* Sidebar narrow/wide switch breakpoint */ @media (width <= 990px) { .package-listing-sidebar { diff --git a/apps/cyberstorm-remix/app/p/tabs/Required/Required.css b/apps/cyberstorm-remix/app/p/tabs/Required/Required.css index b71878a7a..c446dac8a 100644 --- a/apps/cyberstorm-remix/app/p/tabs/Required/Required.css +++ b/apps/cyberstorm-remix/app/p/tabs/Required/Required.css @@ -29,7 +29,7 @@ .package-required__body { display: flex; flex-direction: column; - gap: var(--gap-xxxs); + gap: var(--gap-3xs); align-items: flex-start; align-self: stretch; padding-bottom: var(--space-32); diff --git a/apps/cyberstorm-remix/app/p/team/Team.tsx b/apps/cyberstorm-remix/app/p/team/Team.tsx index 0f66077de..aa80d6847 100644 --- a/apps/cyberstorm-remix/app/p/team/Team.tsx +++ b/apps/cyberstorm-remix/app/p/team/Team.tsx @@ -1,9 +1,6 @@ -import type { LoaderFunctionArgs, MetaFunction } from "react-router"; import { useLoaderData, useOutletContext } from "react-router"; -import { NewBreadCrumbs, NewBreadCrumbsLink } from "@thunderstore/cyberstorm"; import "./Team.css"; import { PackageSearch } from "~/commonComponents/PackageSearch/PackageSearch"; -import { ApiError } from "@thunderstore/thunderstore-api"; import { DapperTs } from "@thunderstore/dapper-ts"; import { PackageOrderOptions } from "../../commonComponents/PackageSearch/components/PackageOrder"; import { OutletContextShape } from "../../root"; @@ -12,142 +9,100 @@ import { getPublicEnvVariables, getSessionTools, } from "cyberstorm/security/publicEnvVariables"; +import { Route } from "./+types/Team"; -export const meta: MetaFunction = ({ data }) => { - return [ - { title: data?.community.name }, - { name: "description", content: `Mods for ${data?.community.name}` }, - ]; -}; - -export async function loader({ request, params }: LoaderFunctionArgs) { +export async function loader({ params, request }: Route.LoaderArgs) { if (params.communityId && params.namespaceId) { - try { - const publicEnvVariables = getPublicEnvVariables(["VITE_API_URL"]); - const dapper = new DapperTs(() => { - return { - apiHost: publicEnvVariables.VITE_API_URL, - sessionId: undefined, - }; - }); - const searchParams = new URL(request.url).searchParams; - const ordering = - searchParams.get("ordering") ?? PackageOrderOptions.Updated; - const page = searchParams.get("page"); - const search = searchParams.get("search"); - const includedCategories = searchParams.get("includedCategories"); - const excludedCategories = searchParams.get("excludedCategories"); - const section = searchParams.get("section"); - const nsfw = searchParams.get("nsfw"); - const deprecated = searchParams.get("deprecated"); - const community = await dapper.getCommunity(params.communityId); - const filters = await dapper.getCommunityFilters(params.communityId); - const sortedSections = filters.sections.sort( - (a, b) => b.priority - a.priority - ); + const publicEnvVariables = getPublicEnvVariables(["VITE_API_URL"]); + const dapper = new DapperTs(() => { return { - community: community, - team: params.namespaceId, - filters: filters, - listings: await dapper.getPackageListings( - { - kind: "namespace", - communityId: params.communityId, - namespaceId: params.namespaceId, - }, - ordering ?? "", - page === null ? undefined : Number(page), - search ?? "", - includedCategories?.split(",") ?? undefined, - excludedCategories?.split(",") ?? undefined, - section - ? section === "all" - ? "" - : section - : sortedSections && sortedSections[0] - ? sortedSections[0].uuid - : "", - nsfw === "true" ? true : false, - deprecated === "true" ? true : false - ), - sortedSections: sortedSections, + apiHost: publicEnvVariables.VITE_API_URL, + sessionId: undefined, }; - } catch (error) { - if (error instanceof ApiError) { - throw new Response("Package not found", { status: 404 }); - } else { - throw error; - } - } + }); + const searchParams = new URL(request.url).searchParams; + const ordering = + searchParams.get("ordering") ?? PackageOrderOptions.Updated; + const page = searchParams.get("page"); + const search = searchParams.get("search"); + const includedCategories = searchParams.get("includedCategories"); + const excludedCategories = searchParams.get("excludedCategories"); + const section = searchParams.get("section"); + const nsfw = searchParams.get("nsfw"); + const deprecated = searchParams.get("deprecated"); + const filters = await dapper.getCommunityFilters(params.communityId); + + return { + teamId: params.namespaceId, + filters: filters, + listings: await dapper.getPackageListings( + { + kind: "namespace", + communityId: params.communityId, + namespaceId: params.namespaceId, + }, + ordering ?? "", + page === null ? undefined : Number(page), + search ?? "", + includedCategories?.split(",") ?? undefined, + excludedCategories?.split(",") ?? undefined, + section ? (section === "all" ? "" : section) : "", + nsfw === "true" ? true : false, + deprecated === "true" ? true : false + ), + }; } - throw new Response("Package not found", { status: 404 }); + throw new Response("Community not found", { status: 404 }); } -export async function clientLoader({ request, params }: LoaderFunctionArgs) { +export async function clientLoader({ + request, + params, +}: Route.ClientLoaderArgs) { if (params.communityId && params.namespaceId) { - try { - const tools = getSessionTools(); - const dapper = new DapperTs(() => { - return { - apiHost: tools?.getConfig().apiHost, - sessionId: tools?.getConfig().sessionId, - }; - }); - const searchParams = new URL(request.url).searchParams; - const ordering = - searchParams.get("ordering") ?? PackageOrderOptions.Updated; - const page = searchParams.get("page"); - const search = searchParams.get("search"); - const includedCategories = searchParams.get("includedCategories"); - const excludedCategories = searchParams.get("excludedCategories"); - const section = searchParams.get("section"); - const nsfw = searchParams.get("nsfw"); - const deprecated = searchParams.get("deprecated"); - const community = await dapper.getCommunity(params.communityId); - const filters = await dapper.getCommunityFilters(params.communityId); - const sortedSections = filters.sections.sort( - (a, b) => b.priority - a.priority - ); + const tools = getSessionTools(); + const dapper = new DapperTs(() => { return { - community: community, - team: params.namespaceId, - filters: filters, - listings: await dapper.getPackageListings( - { - kind: "namespace", - communityId: params.communityId, - namespaceId: params.namespaceId, - }, - ordering ?? "", - page === null ? undefined : Number(page), - search ?? "", - includedCategories?.split(",") ?? undefined, - excludedCategories?.split(",") ?? undefined, - section - ? section === "all" - ? "" - : section - : sortedSections && sortedSections[0] - ? sortedSections[0].uuid - : "", - nsfw === "true" ? true : false, - deprecated === "true" ? true : false - ), - sortedSections: sortedSections, + apiHost: tools?.getConfig().apiHost, + sessionId: tools?.getConfig().sessionId, }; - } catch (error) { - if (error instanceof ApiError) { - throw new Response("Package not found", { status: 404 }); - } else { - throw error; - } - } + }); + const searchParams = new URL(request.url).searchParams; + const ordering = + searchParams.get("ordering") ?? PackageOrderOptions.Updated; + const page = searchParams.get("page"); + const search = searchParams.get("search"); + const includedCategories = searchParams.get("includedCategories"); + const excludedCategories = searchParams.get("excludedCategories"); + const section = searchParams.get("section"); + const nsfw = searchParams.get("nsfw"); + const deprecated = searchParams.get("deprecated"); + const filters = dapper.getCommunityFilters(params.communityId); + return { + teamId: params.namespaceId, + filters: filters, + listings: dapper.getPackageListings( + { + kind: "namespace", + communityId: params.communityId, + namespaceId: params.namespaceId, + }, + ordering ?? "", + page === null ? undefined : Number(page), + search ?? "", + includedCategories?.split(",") ?? undefined, + excludedCategories?.split(",") ?? undefined, + section ? (section === "all" ? "" : section) : "", + nsfw === "true" ? true : false, + deprecated === "true" ? true : false + ), + }; } - throw new Response("Package not found", { status: 404 }); + throw new Response("Community not found", { status: 404 }); } export default function Team() { - const { community, team, filters, listings, sortedSections } = useLoaderData< + const { filters, listings, teamId } = useLoaderData< typeof loader | typeof clientLoader >(); @@ -155,38 +110,19 @@ export default function Team() { return ( <> - - - Communities - - - {community.name} - - - {team} - -
- Mods uploaded by {team} + Mods uploaded by {teamId} - + <> + +
); diff --git a/apps/cyberstorm-remix/app/root.tsx b/apps/cyberstorm-remix/app/root.tsx index eb091d430..1b5d5840b 100644 --- a/apps/cyberstorm-remix/app/root.tsx +++ b/apps/cyberstorm-remix/app/root.tsx @@ -9,6 +9,7 @@ import { Scripts, ScrollRestoration, ShouldRevalidateFunctionArgs, + UIMatch, isRouteErrorResponse, useLoaderData, useLocation, @@ -49,7 +50,6 @@ import { publicEnvVariablesType, } from "cyberstorm/security/publicEnvVariables"; import { StorageManager } from "@thunderstore/ts-api-react/src/storage"; -import { isPromise } from "cyberstorm/utils/typeChecks"; // REMIX TODO: https://remix.run/docs/en/main/route/links // export const links: LinksFunction = () => [{ rel: "stylesheet", href: styles }]; @@ -220,8 +220,24 @@ export function Layout({ children }: { children: React.ReactNode }) { const communitiesPage = matches.find( (m) => m.id === "communities/communities" ); + const uploadPage = matches.find((m) => m.id === "upload/upload"); const communityPage = matches.find((m) => m.id === "c/community"); const packageListingPage = matches.find((m) => m.id === "p/packageListing"); + const packageEditPage = matches.find((m) => m.id === "p/packageEdit"); + const packageDependantsPage = matches.find( + (m) => m.id === "p/dependants/Dependants" + ); + const packageTeamPage = matches.find((m) => m.id === "p/team/Team"); + const packageFormatDocsPage = matches.find( + (m) => m.id === "tools/package-format-docs/packageFormatDocs" + ); + const manifestValidatorPage = matches.find( + (m) => m.id === "tools/manifest-validator/manifestValidator" + ); + const markdownPreviewPage = matches.find( + (m) => m.id === "tools/markdown-preview/markdownPreview" + ); + const shouldShowAds = location.pathname.startsWith("/teams") ? false : location.pathname.startsWith("/settings") @@ -284,114 +300,78 @@ export function Layout({ children }: { children: React.ReactNode }) {
{/* Breadcrumbs are build progressively */} + {/* Upload */} + {uploadPage ? ( + + Upload + + ) : null} {/* Communities page */} - {communitiesPage || communityPage ? ( - - Communities - + {communitiesPage || + communityPage || + packageDependantsPage || + packageTeamPage ? ( + communityPage || + packageDependantsPage || + packageTeamPage ? ( + + Communities + + ) : ( + + Communities + + ) ) : null} {/* Community page */} - {communityPage && - isRecord(communityPage.data) && - Object.prototype.hasOwnProperty.call( - communityPage.data, - "community" - ) && - isPromise(communityPage.data.community) ? ( - - Loading... - - } - > - - {(resolvedValue) => { - let label = undefined; - let icon = undefined; - if (isRecord(resolvedValue)) { - label = - Object.prototype.hasOwnProperty.call( - resolvedValue, - "name" - ) && typeof resolvedValue.name === "string" - ? resolvedValue.name - : communityPage.params.communityId; - icon = - Object.prototype.hasOwnProperty.call( - resolvedValue, - "community_icon_url" - ) && - typeof resolvedValue.community_icon_url === - "string" ? ( - - ) : undefined; - } - return matches[matches.length - 1] === - communityPage ? ( - - - {icon} - {label} - - - ) : ( - - {icon} - {label} - - ); - }} - - - ) : null} + {getCommunityBreadcrumb( + communityPage || + packageListingPage || + packageDependantsPage || + packageTeamPage, + Boolean(packageListingPage) || + Boolean(packageDependantsPage) || + Boolean(packageTeamPage) + )} {/* Package listing page */} - {packageListingPage && - isRecord(packageListingPage.data) && - Object.prototype.hasOwnProperty.call( - packageListingPage.data, - "listing" - ) && - isPromise(packageListingPage.data.listing) ? ( - - Loading... - - } - > - - {(resolvedValue) => { - let label = undefined; - if (isRecord(resolvedValue)) { - label = - Object.prototype.hasOwnProperty.call( - resolvedValue, - "name" - ) && typeof resolvedValue.name === "string" - ? resolvedValue.name - : packageListingPage.params.packageId; - } - return ( - - {label} - - ); - }} - - + {getPackageListingBreadcrumb( + packageListingPage, + packageEditPage, + packageDependantsPage + )} + {packageEditPage ? ( + + Edit package + + ) : null} + {packageDependantsPage ? ( + + Dependants + + ) : null} + {packageTeamPage ? ( + + {packageTeamPage.params.namespaceId} + + ) : null} + {packageFormatDocsPage ? ( + + Package Format Docs + + ) : null} + {manifestValidatorPage ? ( + + Manifest Validator + + ) : null} + {markdownPreviewPage ? ( + + Markdown Preview + ) : null} {children} @@ -568,3 +548,106 @@ function BetaButtonInit() { return <>; } + +function getCommunityBreadcrumb( + communityPage: UIMatch | undefined, + isNotLast: boolean +) { + if (!communityPage) return null; + return ( + <> + {communityPage && + isRecord(communityPage.data) && + Object.prototype.hasOwnProperty.call(communityPage.data, "community") ? ( + + Loading... + + } + > + + {(resolvedValue) => { + let label = undefined; + let icon = undefined; + if (isRecord(resolvedValue)) { + label = + Object.prototype.hasOwnProperty.call(resolvedValue, "name") && + typeof resolvedValue.name === "string" + ? resolvedValue.name + : communityPage.params.communityId; + icon = + Object.prototype.hasOwnProperty.call( + resolvedValue, + "community_icon_url" + ) && typeof resolvedValue.community_icon_url === "string" ? ( + + ) : undefined; + } + return isNotLast ? ( + + {icon} + {label} + + ) : ( + + + {icon} + {label} + + + ); + }} + + + ) : null} + + ); +} + +function getPackageListingBreadcrumb( + packageListingPage: UIMatch | undefined, + packageEditPage: UIMatch | undefined, + packageDependantsPage: UIMatch | undefined +) { + if (!packageListingPage && !packageEditPage && !packageDependantsPage) + return null; + return ( + <> + {packageListingPage ? ( + + {packageListingPage.params.packageId} + + ) : null} + {packageEditPage ? ( + + {packageEditPage.params.packageId} + + ) : null} + {packageDependantsPage ? ( + + {packageDependantsPage.params.packageId} + + ) : null} + + ); +} diff --git a/apps/cyberstorm-remix/app/routes.ts b/apps/cyberstorm-remix/app/routes.ts index 68b4cea2e..cda5def83 100644 --- a/apps/cyberstorm-remix/app/routes.ts +++ b/apps/cyberstorm-remix/app/routes.ts @@ -13,10 +13,13 @@ export default [ route("/communities", "./communities/communities.tsx"), route("/c/:communityId", "c/community.tsx", [ - route("", "c/tabs/PackageSearch/PackageSearch.tsx", { index: true }), + route("/c/:communityId/", "c/tabs/PackageSearch/PackageSearch.tsx"), ...prefix("p", [ route(":namespaceId/:packageId", "p/packageListing.tsx", [ - route("", "p/tabs/Readme/Readme.tsx", { index: true }), + route( + "/c/:communityId/p/:namespaceId/:packageId/", + "p/tabs/Readme/Readme.tsx" + ), route("required", "p/tabs/Required/Required.tsx"), route("changelog", "p/tabs/Changelog/Changelog.tsx"), route("versions", "p/tabs/Versions/Versions.tsx"), @@ -28,15 +31,15 @@ export default [ route("/:slug/edit", "p/tabs/Wiki/WikiPageEdit.tsx"), ]), ]), - route("edit", "p/packageEdit.tsx"), ]), - route( - ":namespaceId/:packageId/dependants", - "p/dependants/Dependants.tsx" - ), - route(":namespaceId", "p/team/Team.tsx"), + route(":namespaceId/:packageId/edit", "p/packageEdit.tsx"), ]), ]), + route( + "/c/:communityId/p/:namespaceId/:packageId/dependants", + "p/dependants/Dependants.tsx" + ), + route("/c/:communityId/p/:namespaceId", "p/team/Team.tsx"), route( "/package/create/docs", "tools/package-format-docs/packageFormatDocs.tsx" diff --git a/apps/cyberstorm-remix/app/settings/teams/Teams.css b/apps/cyberstorm-remix/app/settings/teams/Teams.css index 33892da32..4df457ed8 100644 --- a/apps/cyberstorm-remix/app/settings/teams/Teams.css +++ b/apps/cyberstorm-remix/app/settings/teams/Teams.css @@ -21,7 +21,7 @@ .create-team-form__body { display: flex; flex-direction: column; - gap: var(--gap-xxl); + gap: var(--gap-2xl); align-items: flex-start; align-self: stretch; } diff --git a/apps/cyberstorm-remix/app/settings/teams/team/tabs/Members/Members.css b/apps/cyberstorm-remix/app/settings/teams/team/tabs/Members/Members.css index 6c5bccc2c..19a50be02 100644 --- a/apps/cyberstorm-remix/app/settings/teams/team/tabs/Members/Members.css +++ b/apps/cyberstorm-remix/app/settings/teams/team/tabs/Members/Members.css @@ -19,7 +19,7 @@ .add-member-form__body { display: flex; flex-direction: column; - gap: var(--gap-xxl); + gap: var(--gap-2xl); align-items: flex-start; align-self: stretch; } @@ -73,7 +73,7 @@ .remove-member-form__body { display: flex; flex-direction: column; - gap: var(--gap-xxl); + gap: var(--gap-2xl); align-items: flex-start; align-self: stretch; } diff --git a/apps/cyberstorm-remix/app/settings/teams/team/tabs/Settings/Settings.css b/apps/cyberstorm-remix/app/settings/teams/team/tabs/Settings/Settings.css index c07d0dd09..a39d9c96e 100644 --- a/apps/cyberstorm-remix/app/settings/teams/team/tabs/Settings/Settings.css +++ b/apps/cyberstorm-remix/app/settings/teams/team/tabs/Settings/Settings.css @@ -7,7 +7,7 @@ .leave-team-form__body { display: flex; flex-direction: column; - gap: var(--gap-xxl); + gap: var(--gap-2xl); align-items: flex-start; align-self: stretch; } @@ -24,7 +24,7 @@ .disband-team-form__body { display: flex; flex-direction: column; - gap: var(--gap-xxl); + gap: var(--gap-2xl); align-items: flex-start; align-self: stretch; } diff --git a/apps/cyberstorm-remix/app/settings/user/Account/Account.css b/apps/cyberstorm-remix/app/settings/user/Account/Account.css index 8a222b6ca..2ba30dfd6 100644 --- a/apps/cyberstorm-remix/app/settings/user/Account/Account.css +++ b/apps/cyberstorm-remix/app/settings/user/Account/Account.css @@ -2,7 +2,7 @@ .user-account__delete-user-form { display: flex; flex-direction: column; - gap: var(--gap-xxl); + gap: var(--gap-2xl); align-items: flex-start; align-self: stretch; justify-content: center; diff --git a/apps/cyberstorm-remix/app/tools/manifest-validator/manifestValidator.css b/apps/cyberstorm-remix/app/tools/manifest-validator/manifestValidator.css index ae5847771..0610eea67 100644 --- a/apps/cyberstorm-remix/app/tools/manifest-validator/manifestValidator.css +++ b/apps/cyberstorm-remix/app/tools/manifest-validator/manifestValidator.css @@ -41,7 +41,7 @@ @media (width <= 475px) { .manifest-validator__row { flex-direction: column; - gap: var(--gap-xxxl); + gap: var(--gap-3xl); } .manifest-validator__content { diff --git a/apps/cyberstorm-remix/app/tools/manifest-validator/manifestValidator.tsx b/apps/cyberstorm-remix/app/tools/manifest-validator/manifestValidator.tsx index edbc715dd..f0ceef115 100644 --- a/apps/cyberstorm-remix/app/tools/manifest-validator/manifestValidator.tsx +++ b/apps/cyberstorm-remix/app/tools/manifest-validator/manifestValidator.tsx @@ -1,7 +1,6 @@ import { CodeInput, NewAlert, - NewBreadCrumbs, NewSelect, isRecord, isStringArray, @@ -75,11 +74,6 @@ export default function ManifestValidator() { return ( <> - - - Manifest Validator - - Manifest Validator diff --git a/apps/cyberstorm-remix/app/tools/markdown-preview/MarkdownPreview.css b/apps/cyberstorm-remix/app/tools/markdown-preview/MarkdownPreview.css index 6a826dea8..f6b03b198 100644 --- a/apps/cyberstorm-remix/app/tools/markdown-preview/MarkdownPreview.css +++ b/apps/cyberstorm-remix/app/tools/markdown-preview/MarkdownPreview.css @@ -1,6 +1,6 @@ @layer nimbus-layout { .markdown-preview { - gap: var(--gap-xxxxxxxl); + gap: var(--gap-7xl); } .markdown-preview__row { @@ -57,7 +57,7 @@ @media (width <= 475px) { .markdown-preview__row { flex-direction: column; - gap: var(--gap-xxxl); + gap: var(--gap-3xl); } .markdown-preview__content { diff --git a/apps/cyberstorm-remix/app/tools/markdown-preview/markdownPreview.tsx b/apps/cyberstorm-remix/app/tools/markdown-preview/markdownPreview.tsx index 109a9d3be..27eb3e7cd 100644 --- a/apps/cyberstorm-remix/app/tools/markdown-preview/markdownPreview.tsx +++ b/apps/cyberstorm-remix/app/tools/markdown-preview/markdownPreview.tsx @@ -1,6 +1,6 @@ import { useOutletContext } from "react-router"; import "./MarkdownPreview.css"; -import { CodeInput, NewBreadCrumbs, isRecord } from "@thunderstore/cyberstorm"; +import { CodeInput, isRecord } from "@thunderstore/cyberstorm"; import { isApiError, RequestConfig, @@ -54,11 +54,6 @@ export default function MarkdownPreview() { return ( <> - - - Markdown Preview - - Markdown Preview diff --git a/apps/cyberstorm-remix/app/tools/package-format-docs/PackageFormatDocs.css b/apps/cyberstorm-remix/app/tools/package-format-docs/PackageFormatDocs.css index 330279266..7513d8735 100644 --- a/apps/cyberstorm-remix/app/tools/package-format-docs/PackageFormatDocs.css +++ b/apps/cyberstorm-remix/app/tools/package-format-docs/PackageFormatDocs.css @@ -1,6 +1,6 @@ @layer nimbus-layout { .package-format-docs { - gap: var(--gap-xxxxxl); + gap: var(--gap-5xl); } .package-format-docs__title { diff --git a/apps/cyberstorm-remix/app/tools/package-format-docs/packageFormatDocs.tsx b/apps/cyberstorm-remix/app/tools/package-format-docs/packageFormatDocs.tsx index 0aef7e819..da356a5aa 100644 --- a/apps/cyberstorm-remix/app/tools/package-format-docs/packageFormatDocs.tsx +++ b/apps/cyberstorm-remix/app/tools/package-format-docs/packageFormatDocs.tsx @@ -1,22 +1,12 @@ import "./PackageFormatDocs.css"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faCheck, faXmark } from "@fortawesome/free-solid-svg-icons"; -import { - CodeBox, - NewBreadCrumbs, - NewIcon, - NewTable, -} from "@thunderstore/cyberstorm"; +import { CodeBox, NewIcon, NewTable } from "@thunderstore/cyberstorm"; import { PageHeader } from "~/commonComponents/PageHeader/PageHeader"; export default function PackageFormatDocs() { return ( <> - - - Package Format Docs - - Package Format Docs diff --git a/apps/cyberstorm-remix/app/upload/Upload.css b/apps/cyberstorm-remix/app/upload/Upload.css index 12fcdca9a..e33b18032 100644 --- a/apps/cyberstorm-remix/app/upload/Upload.css +++ b/apps/cyberstorm-remix/app/upload/Upload.css @@ -1,6 +1,6 @@ @layer nimbus-layout { .upload { - gap: var(--gap-xxxxxxxl); + gap: var(--gap-7xl); } .upload__row { @@ -173,7 +173,7 @@ @media (width <= 475px) { .upload__row { flex-direction: column; - gap: var(--gap-xxxl); + gap: var(--gap-3xl); } .upload__content { diff --git a/apps/cyberstorm-remix/app/upload/upload.tsx b/apps/cyberstorm-remix/app/upload/upload.tsx index 1fa5277b5..c63566c0c 100644 --- a/apps/cyberstorm-remix/app/upload/upload.tsx +++ b/apps/cyberstorm-remix/app/upload/upload.tsx @@ -1,6 +1,5 @@ import "./Upload.css"; import { - NewBreadCrumbs, NewButton, NewIcon, NewSelectSearch, @@ -366,11 +365,6 @@ export default function Upload() { return ( <> - - - Upload - - Upload package diff --git a/packages/cyberstorm-theme/src/components/TextInput/TextInput.css b/packages/cyberstorm-theme/src/components/TextInput/TextInput.css index 0aca729a4..95cff966b 100644 --- a/packages/cyberstorm-theme/src/components/TextInput/TextInput.css +++ b/packages/cyberstorm-theme/src/components/TextInput/TextInput.css @@ -35,14 +35,14 @@ .text-input:where(.text-input--size--default) { --text-input-height: var(--input-md-height); - --text-input-padding: var(--space-10) - calc(var(--space-16) + var(--right-padding-bonus, 0px)) var(--space-10) + --text-input-padding: var(--space-12) + calc(var(--space-16) + var(--right-padding-bonus, 0px)) var(--space-12) calc(var(--space-16) + var(--left-padding-bonus, 0px)); } .text-input:where(.text-input--size--small) { --text-input-height: var(--input-sm-height); - --text-input-padding: var(--space-8) + --text-input-padding: var(--space-10) calc(var(--space-16) + var(--right-padding-bonus, 0px)) var(--space-10) calc(var(--space-16) + var(--left-padding-bonus, 0px)); } diff --git a/packages/cyberstorm-theme/src/components/componentsColors.css b/packages/cyberstorm-theme/src/components/componentsColors.css index 279b0bf2e..7f0604a23 100644 --- a/packages/cyberstorm-theme/src/components/componentsColors.css +++ b/packages/cyberstorm-theme/src/components/componentsColors.css @@ -1,7 +1,7 @@ @layer theme-components-colors { /* These variables are copied from Figma with the plugin variables2css */ :root { - --ad-bg-color--default: var(--color-surface-4); + --ad-bg-color--default: var(--color-nightsky-4); --ad-text-color--default: var(--color-text-tertiary); --alert-danger-bg-color--default: var(--color-accent-red-2); --alert-danger-border-color--default: var(--color-accent-red-7); @@ -19,9 +19,9 @@ --alert-warning-border-color--default: var(--color-accent-yellow-7); --alert-warning-icon-color--default: var(--color-accent-yellow-7); --alert-warning-text-color--default: var(--color-accent-yellow-11); - --breadcrumb-item-bg-color--current: var(--color-surface-8); - --breadcrumb-item-bg-color--default: var(--color-surface-6); - --breadcrumb-item-bg-color--hover: var(--color-surface-8); + --breadcrumb-item-bg-color--current: var(--color-nightsky-5); + --breadcrumb-item-bg-color--default: var(--color-nightsky-6); + --breadcrumb-item-bg-color--hover: var(--color-nightsky-8); --breadcrumb-item-text-color--current: var(--color-text-primary); --breadcrumb-item-text-color--default: var(--color-cyber-green-7); --breadcrumb-item-text-color--hover: var(--color-cyber-green-7); @@ -52,18 +52,18 @@ --button-info-text-color--active: var(--color-accent-blue-11); --button-info-text-color--default: var(--color-accent-blue-11); --button-info-text-color--hover: var(--color-accent-blue-11); - --button-primary-bg-color--active: #4d2bab; - --button-primary-bg-color--default: #623bce; - --button-primary-bg-color--hover: #6c44da; + --button-primary-bg-color--active: hsl(256deg 60% 42%); + --button-primary-bg-color--default: hsl(256deg 60% 52%); + --button-primary-bg-color--hover: hsl(256deg 67% 56%); --button-primary-icon-color--active: var(--color-text-primary); --button-primary-icon-color--default: var(--color-text-primary); --button-primary-icon-color--hover: var(--color-text-primary); --button-primary-text-color--active: var(--color-text-primary); --button-primary-text-color--default: var(--color-text-primary); --button-primary-text-color--hover: var(--color-text-primary); - --button-secondary-bg-color--active: var(--color-surface-a7); - --button-secondary-bg-color--default: var(--color-surface-a8); - --button-secondary-bg-color--hover: var(--color-surface-a9); + --button-secondary-bg-color--active: var(--color-nightsky-a7); + --button-secondary-bg-color--default: var(--color-nightsky-a8); + --button-secondary-bg-color--hover: var(--color-nightsky-a9); --button-secondary-icon-color--active: var(--color-text-primary); --button-secondary-icon-color--default: var(--color-text-primary); --button-secondary-icon-color--hover: var(--color-text-primary); @@ -150,9 +150,9 @@ --card-package-fullwidth-hover-background-color: var(--color-surface-a6); --card-package-secondary-background-color: rgb(63 63 136 / 0.55); --card-package-secondary-hover-background-color: rgb(63 63 136 / 0.55); - --checkbox-bg-color--active: var(--color-surface-a10); - --checkbox-bg-color--default: var(--color-surface-a8); - --checkbox-bg-color--hover: var(--color-surface-a10); + --checkbox-bg-color--active: var(--color-nightsky-a10); + --checkbox-bg-color--default: var(--color-nightsky-a8); + --checkbox-bg-color--hover: var(--color-nightsky-a10); --checkbox-bg-color--selected: var(--color-cyber-green-7); --code-input-wrapper-bg-color--default: rgb(59 63 125 / 0.24); --code-input-wrapper-border-color--default: var(--color-surface-8); @@ -166,23 +166,26 @@ --validation-bar-border-top-color--failure: var(--color-accent-red-7); --validation-bar-background-color--failure: var(--color-accent-red-2); --validation-bar-color--failure: var(--color-accent-red-7); - --divider-bg-color: var(--color-surface-a6); + --divider-bg-color: var(--color-nightsky-a6); + --code-bg-color--default: var(--color-ui-surface-3); + --code-border-color--default: var(--color-ui-element-1); + --code-text-color--default: var(--color-text-primary); --dropdown-bg-color--default: var(--color-surface-4); --dropdown-border-color--default: var(--color-surface-a6); - --dropdown-item-bg-color--default: #0000; - --dropdown-item-bg-color--hover: var(--color-surface-a7); + --dropdown-item-bg-color--default: hsl(0deg 0 0% / 0); + --dropdown-item-bg-color--hover: var(--color-nightsky-a7); --dropdown-item-icon-color--default: var(--color-text-tertiary); --dropdown-item-icon-color--hover: var(--color-text-primary); --dropdown-item-text-color--default: var(--color-text-primary); --dropdown-item-text-color--hover: var(--color-text-primary); - --dropdown-item-danger-bg-color--default: #0000; + --dropdown-item-danger-bg-color--default: hsl(0deg 0 0% / 0); --dropdown-item-danger-bg-color--hover: var(--color-accent-red-6); --dropdown-item-danger-icon-color--default: var(--color-accent-red-7); - --dropdown-item-danger-icon-color--hover: #fff; + --dropdown-item-danger-icon-color--hover: hsl(0deg 0 100%); --dropdown-item-danger-text-color--default: var(--color-accent-red-7); - --dropdown-item-danger-text-color--hover: #fff; - --dropdown-item-disabled-bg-color--default: #0000; - --dropdown-item-disabled-bg-color--hover: #0000; + --dropdown-item-danger-text-color--hover: hsl(0deg 0 100%); + --dropdown-item-disabled-bg-color--default: hsl(0deg 0 0% / 0); + --dropdown-item-disabled-bg-color--hover: hsl(0deg 0 0% / 0); --dropdown-item-disabled-icon-color--default: var(--color-text-tertiary); --dropdown-item-disabled-icon-color--hover: var(--color-text-tertiary); --dropdown-item-disabled-text-color--default: var(--color-text-tertiary); @@ -255,12 +258,14 @@ --icon-cyber-color--default: var(--color-cyber-green-7); --image-primary-color--default: hsl(240deg 42% 45%); --image-primary-background-color--default: var(--color-surface-a4); - --input-bg-color--default: var(--color-surface-a4); - --input-bg-color--focus: var(--color-surface-1); - --input-bg-color--hover: var(--color-surface-a6); - --input-border-color--default: var(--color-surface-a10); + --icon-button-accent-color--default: var(--color-text-accent); + --icon-button-muted-color--default: var(--color-text-tertiary); + --input-bg-color--default: var(--color-nightsky-a4); + --input-bg-color--focus: var(--color-nightsky-1); + --input-bg-color--hover: var(--color-nightsky-a6); + --input-border-color--default: var(--color-nightsky-a10); --input-border-color--focus: var(--color-cyber-green-7); - --input-border-color--hover: var(--color-surface-a10); + --input-border-color--hover: var(--color-nightsky-a10); --input-icon-color--default: var(--color-text-tertiary); --input-icon-color--focus: var(--color-text-secondary); --input-icon-color--hover: var(--color-text-tertiary); @@ -268,8 +273,8 @@ --input-text-color--default: var(--color-text-secondary); --input-text-color--focus: var(--color-text-primary); --input-text-color--hover: var(--color-text-secondary); - --kbd-bg-color--default: #0000; - --kbd-border-color--default: var(--color-surface-a10); + --kbd-bg-color--default: hsl(0deg 0 0% / 0); + --kbd-border-color--default: var(--color-nightsky-a10); --kbd-text-color--default: var(--color-text-tertiary); --link-primary-color--default: var(--color-text-accent); --link-primary-color--hover: var(--color-text-primary); @@ -279,24 +284,27 @@ --menu-primary-color--hover: var(--color-text-primary); --meta-item-icon-color--default: var(--color-text-tertiary); --meta-item-text-color--default: var(--color-text-tertiary); - --modal-bg-color--default: var(--color-surface-2); - --modal-border-color--default: var(--color-surface-7); - --modal-box-shadow--default: var(--shadow-lg); + --modal-bg-color--default: var(--color-nightsky-3); + --modal-border-color--default: var(--color-nightsky-a6); --modal-text-color--default: var(--color-text-secondary); - --pagination-item-bg-color--active: var(--color-surface-a6); - --pagination-item-bg-color--current: #623bce; - --pagination-item-bg-color--default: var(--color-surface-a7); - --pagination-item-bg-color--hover: var(--color-surface-a8); + --pagination-item-bg-color--active: var(--color-nightsky-a6); + --pagination-item-bg-color--current: hsl(256deg 60% 52%); + --pagination-item-bg-color--default: var(--color-nightsky-a7); + --pagination-item-bg-color--hover: var(--color-nightsky-a8); + --pagination-item-icon-color--active: var(--color-text-primary); + --pagination-item-icon-color--current: var(--color-text-primary); + --pagination-item-icon-color--default: var(--color-text-secondary); + --pagination-item-icon-color--hover: var(--color-text-primary); --pagination-item-text-color--active: var(--color-text-primary); --pagination-item-text-color--current: var(--color-text-primary); --pagination-item-text-color--default: var(--color-text-secondary); --pagination-item-text-color--hover: var(--color-text-primary); - --pre-bg-color--default: var(--color-surface-1); - --pre-border-color--default: var(--color-surface-a10); + --pre-bg-color--default: var(--color-ui-surface-1); + --pre-border-color--default: var(--color-ui-element-1); --pre-text-color--default: var(--color-text-primary); - --radio-bg-color--active: var(--color-surface-a10); - --radio-bg-color--default: var(--color-surface-a8); - --radio-bg-color--hover: var(--color-surface-a10); + --radio-bg-color--active: var(--color-nightsky-a10); + --radio-bg-color--default: var(--color-nightsky-a8); + --radio-bg-color--hover: var(--color-nightsky-a10); --radio-bg-color--selected: var(--color-cyber-green-7); --select-bg-color--default: var(--color-surface-4); --select-border-color--default: var(--color-surface-a6); @@ -330,8 +338,8 @@ --table-bg-color--default: var(--color-surface-4); --tab-nav-item-border-color--active: var(--color-surface-9); --tab-nav-item-border-color--current: var(--color-cyber-green-7); - --tab-nav-item-border-color--default: #0000; - --tab-nav-item-border-color--hover: var(--color-surface-9); + --tab-nav-item-border-color--default: hsl(0deg 0 0% / 0); + --tab-nav-item-border-color--hover: var(--color-nightsky-9); --tab-nav-item-icon-color--active: var(--color-text-secondary); --tab-nav-item-icon-color--current: var(--color-cyber-green-7); --tab-nav-item-icon-color--default: var(--color-text-tertiary); @@ -344,54 +352,62 @@ --tab-nav-item-text-color--current: var(--color-cyber-green-7); --tab-nav-item-text-color--default: var(--color-text-tertiary); --tab-nav-item-text-color--hover: var(--color-text-primary); - --tag-dark-blue-bg-color--default: var(--color-accent-blue-2); - --tag-dark-blue-bg-color--hover: var(--color-accent-blue-3); - --tag-dark-blue-icon-color--default: var(--color-accent-blue-9); - --tag-dark-blue-icon-color--hover: var(--color-accent-blue-9); - --tag-dark-blue-text-color--default: var(--color-accent-blue-9); - --tag-dark-blue-text-color--hover: var(--color-accent-blue-9); - --tag-dark-green-bg-color--default: var(--color-accent-green-2); - --tag-dark-green-bg-color--hover: var(--color-accent-green-3); - --tag-dark-green-icon-color--default: var(--color-accent-green-9); - --tag-dark-green-icon-color--hover: var(--color-accent-green-9); - --tag-dark-green-text-color--default: var(--color-accent-green-9); - --tag-dark-green-text-color--hover: var(--color-accent-green-9); - --tag-dark-orange-bg-color--default: var(--color-accent-orange-2); - --tag-dark-orange-bg-color--hover: var(--color-accent-orange-3); - --tag-dark-orange-icon-color--default: var(--color-accent-orange-9); - --tag-dark-orange-icon-color--hover: var(--color-accent-orange-9); - --tag-dark-orange-text-color--default: var(--color-accent-orange-9); - --tag-dark-orange-text-color--hover: var(--color-accent-orange-9); - --tag-dark-pink-bg-color--default: var(--color-accent-pink-2); - --tag-dark-pink-bg-color--hover: var(--color-accent-pink-3); - --tag-dark-pink-icon-color--default: var(--color-accent-pink-9); - --tag-dark-pink-icon-color--hover: var(--color-accent-pink-9); - --tag-dark-pink-text-color--default: var(--color-accent-pink-9); - --tag-dark-pink-text-color--hover: var(--color-accent-pink-9); - --tag-dark-primary-bg-color--default: var(--color-surface-8); - --tag-dark-primary-bg-color--hover: var(--color-surface-9); + --table-border-color--default: var(--color-nightsky-8); + --table-cell-bg-color--default: hsl(0deg 0 100%); + --table-cell-border-color--default: hsl(0deg 0 100%); + --table-header-bg-color--default: hsl(0deg 0 100%); + --table-header-bg-color--hover: hsl(0deg 0 100%); + --table-header-text-color--default: var(--color-text-accent); + --table-row-bg-color--default: var(--color-nightsky-a5); + --table-row-bg-color--hover: var(--color-nightsky-a6); + --tag-dark-blue-bg-color--default: var(--color-accent-blue-3); + --tag-dark-blue-bg-color--hover: var(--color-accent-blue-4); + --tag-dark-blue-icon-color--default: var(--color-accent-blue-10); + --tag-dark-blue-icon-color--hover: var(--color-accent-blue-11); + --tag-dark-blue-text-color--default: var(--color-accent-blue-10); + --tag-dark-blue-text-color--hover: var(--color-accent-blue-11); + --tag-dark-green-bg-color--default: var(--color-accent-green-3); + --tag-dark-green-bg-color--hover: var(--color-accent-green-4); + --tag-dark-green-icon-color--default: var(--color-accent-green-10); + --tag-dark-green-icon-color--hover: var(--color-accent-green-11); + --tag-dark-green-text-color--default: var(--color-accent-green-10); + --tag-dark-green-text-color--hover: var(--color-accent-green-11); + --tag-dark-orange-bg-color--default: var(--color-accent-orange-3); + --tag-dark-orange-bg-color--hover: var(--color-accent-orange-4); + --tag-dark-orange-icon-color--default: var(--color-accent-orange-10); + --tag-dark-orange-icon-color--hover: var(--color-accent-orange-11); + --tag-dark-orange-text-color--default: var(--color-accent-orange-10); + --tag-dark-orange-text-color--hover: var(--color-accent-orange-11); + --tag-dark-pink-bg-color--default: var(--color-accent-pink-3); + --tag-dark-pink-bg-color--hover: var(--color-accent-pink-4); + --tag-dark-pink-icon-color--default: var(--color-accent-pink-10); + --tag-dark-pink-icon-color--hover: var(--color-accent-pink-11); + --tag-dark-pink-text-color--default: var(--color-accent-pink-10); + --tag-dark-pink-text-color--hover: var(--color-accent-pink-11); + --tag-dark-primary-bg-color--default: var(--color-nightsky-a8); + --tag-dark-primary-bg-color--hover: var(--color-nightsky-a9); --tag-dark-primary-icon-color--default: var(--color-text-primary); --tag-dark-primary-icon-color--hover: var(--color-text-primary); --tag-dark-primary-text-color--default: var(--color-text-primary); --tag-dark-primary-text-color--hover: var(--color-text-primary); - --tag-dark-purple-bg-color--default: var(--color-accent-purple-2); - --tag-dark-purple-bg-color--hover: var(--color-accent-purple-3); - --tag-dark-purple-icon-color--default: var(--color-accent-purple-9); - --tag-dark-purple-icon-color--hover: var(--color-accent-purple-9); - --tag-dark-purple-text-color--default: var(--color-accent-purple-9); - --tag-dark-purple-text-color--hover: var(--color-accent-purple-9); - --tag-dark-red-bg-color--default: var(--color-accent-red-2); - --tag-dark-red-bg-color--hover: var(--color-accent-red-3); - --tag-dark-red-icon-color--default: var(--color-accent-red-9); - --tag-dark-red-icon-color--hover: var(--color-accent-red-9); - --tag-dark-red-text-color--default: var(--color-accent-red-9); - --tag-dark-red-text-color--hover: var(--color-accent-red-9); - --tag-dark-yellow-bg-color--default: var(--color-accent-yellow-2); - --tag-dark-yellow-bg-color--hover: var(--color-accent-yellow-3); - --tag-dark-yellow-icon-color--default: var(--color-accent-yellow-9); - --tag-dark-yellow-icon-color--hover: var(--color-accent-yellow-9); - --tag-dark-yellow-text-color--default: var(--color-accent-yellow-9); - --tag-dark-yellow-text-color--hover: var(--color-accent-yellow-9); + --tag-dark-purple-bg-color--default: var(--color-accent-purple-3); + --tag-dark-purple-bg-color--hover: var(--color-accent-purple-4); + --tag-dark-purple-icon-color--default: var(--color-accent-purple-10); + --tag-dark-purple-icon-color--hover: var(--color-accent-purple-11); + --tag-dark-purple-text-color--default: var(--color-accent-purple-10); + --tag-dark-purple-text-color--hover: var(--color-accent-purple-11); + --tag-dark-red-bg-color--default: var(--color-accent-red-3); + --tag-dark-red-bg-color--hover: var(--color-accent-red-4); + --tag-dark-red-icon-color--default: var(--color-accent-red-10); + --tag-dark-red-icon-color--hover: var(--color-accent-red-11); + --tag-dark-red-text-color--default: var(--color-accent-red-10); + --tag-dark-red-text-color--hover: var(--color-accent-red-11); + --tag-dark-yellow-bg-color--default: var(--color-accent-yellow-3); + --tag-dark-yellow-bg-color--hover: var(--color-accent-yellow-4); + --tag-dark-yellow-icon-color--default: var(--color-accent-yellow-10); + --tag-dark-yellow-icon-color--hover: var(--color-accent-yellow-11); + --tag-dark-yellow-text-color--default: var(--color-accent-yellow-10); + --tag-dark-yellow-text-color--hover: var(--color-accent-yellow-11); --tag-light-blue-bg-color--default: var(--color-accent-blue-7); --tag-light-blue-bg-color--hover: var(--color-accent-blue-8); --tag-light-blue-icon-color--default: var(--color-accent-blue-1); @@ -416,8 +432,8 @@ --tag-light-pink-icon-color--hover: var(--color-accent-pink-1); --tag-light-pink-text-color--default: var(--color-accent-pink-1); --tag-light-pink-text-color--hover: var(--color-accent-pink-1); - --tag-light-primary-bg-color--default: var(--color-surface-10); - --tag-light-primary-bg-color--hover: #5a5abf; + --tag-light-primary-bg-color--default: var(--color-nightsky-10); + --tag-light-primary-bg-color--hover: hsl(240deg 44% 55%); --tag-light-primary-icon-color--default: var(--color-text-primary); --tag-light-primary-icon-color--hover: var(--color-text-primary); --tag-light-primary-text-color--default: var(--color-text-primary); @@ -447,7 +463,7 @@ --toast-danger-icon-color--default: var(--color-accent-red-7); --toast-danger-text-color--default: var(--color-accent-red-11); --toast-default-bg-color--default: var(--color-surface-6); - --toast-default-border-color--default: #5d5a9f; + --toast-default-border-color--default: hsl(243deg 28% 49%); --toast-default-close-color--default: var(--color-text-tertiary); --toast-default-close-color--hover: var(--color-text-secondary); --toast-default-icon-color--default: var(--color-text-accent); @@ -470,7 +486,7 @@ --toast-warning-close-color--hover: var(--color-accent-yellow-10); --toast-warning-icon-color--default: var(--color-accent-yellow-7); --toast-warning-text-color--default: var(--color-accent-yellow-11); - --tooltip-bg-color--default: var(--color-surface-8); + --tooltip-bg-color--default: var(--color-nightsky-8); --tooltip-text-color--default: var(--color-text-primary); } } diff --git a/packages/cyberstorm-theme/src/components/componentsSizes.css b/packages/cyberstorm-theme/src/components/componentsSizes.css index f60e2f349..5f602ea31 100644 --- a/packages/cyberstorm-theme/src/components/componentsSizes.css +++ b/packages/cyberstorm-theme/src/components/componentsSizes.css @@ -15,17 +15,17 @@ --button-lg-font-size: var(--font-size-body-lg); --button-lg-gap: var(--space-16); --button-lg-padding-inline: var(--space-16); - --button-lg-height: 2.75rem; + --button-lg-height: 2.5rem; --button-lg-icon-inline-size: 1em; - --button-lg-icon-inline-size--only-icon: var(--font-size-body-lg); + --button-lg-icon-inline-size--only-icon: 1rem; --button-md-border-radius: var(--radius-md); --button-md-padding-block: 0rem; --button-md-font-size: var(--font-size-body-md); --button-md-gap: var(--space-16); --button-md-padding-inline: var(--space-16); - --button-md-height: 2.75rem; + --button-md-height: 2.5rem; --button-md-icon-inline-size: 1em; - --button-md-icon-inline-size--only-icon: var(--font-size-body-lg); + --button-md-icon-inline-size--only-icon: 1rem; --button-sm-border-radius: var(--radius-md); --button-sm-padding-block: 0rem; --button-sm-gap: var(--space-12); @@ -33,7 +33,7 @@ --button-sm-font-size: var(--font-size-body-md); --button-sm-height: 2.25rem; --button-sm-icon-inline-size: 1em; - --button-sm-icon-inline-size--only-icon: var(--font-size-body-lg); + --button-sm-icon-inline-size--only-icon: 1rem; --button-xs-border-radius: var(--radius-md); --button-xs-padding-block: 0rem; --button-xs-font-size: var(--font-size-body-sm); @@ -41,7 +41,7 @@ --button-xs-padding-inline: var(--space-12); --button-xs-height: 1.875rem; --button-xs-icon-inline-size: 1em; - --button-xs-icon-inline-size--only-icon: var(--font-size-body-lg); + --button-xs-icon-inline-size--only-icon: 0.875rem; --card-package-shared-border-radius: var(--radius-md); --card-package-shared--author-font-weight: var(--font-weight-regular); --card-package-shared--prefix-padding-right: var(--space-4); @@ -50,7 +50,7 @@ --card-package-shared--description-font-style: normal; --card-package-shared--description-font-weight: var(--font-weight-regular); --card-package-shared--description-line-height: var(--line-height-md); - --card-package-shared--tags-gap: var(--gap-xxs); + --card-package-shared--tags-gap: var(--gap-2xs); --card-package-shared--footer-gap: var(--gap-sm); --card-package-md-card--image-wrapper-border-bottom-left-radius: 0; --card-package-md-card--image-wrapper-border-bottom-right-radius: 0; @@ -78,7 +78,7 @@ --radius-md ); --card-package-md-featured--content-padding: var(--space-16) var(--space-24); - --card-package-md-featured--info-gap: var(--gap-xxxs); + --card-package-md-featured--info-gap: var(--gap-3xs); --card-package-md-featured--title-font-size: 1.313rem; --card-package-md-featured--title-line-height: 160%; --card-package-md-featured--author-font-size: var(--font-size-body-md); @@ -142,7 +142,7 @@ --divider-height: 0.063rem; --divider-md-margin: 0.25rem 0rem; --input-md-border-radius: var(--radius-md); - --input-md-height: 2.75rem; + --input-md-height: 2.5rem; --input-sm-border-radius: var(--radius-md); --input-sm-height: 2.25rem; --meta-item-16-font-size: var(--font-size-body-lg, 1rem); @@ -200,23 +200,23 @@ --switch-knob-sm-border-radius: var(--radius-full); --tab-nav-item-border-style--default: solid; --tag-md-border-radius: var(--radius-md); - --tag-md-padding-block: var(--space-4); - --tag-md-gap: var(--space-6); - --tag-md-padding-inline: var(--space-8); --tag-md-font-size: var(--font-size-body-md); + --tag-md-gap: var(--space-6); --tag-md-height: 1.875rem; + --tag-md-padding-block: var(--space-4); + --tag-md-padding-inline: var(--space-8); --tag-sm-border-radius: var(--radius-md); - --tag-sm-padding-block: var(--space-4); - --tag-sm-gap: var(--space-6); - --tag-sm-padding-inline: var(--space-6); --tag-sm-font-size: var(--font-size-body-sm); + --tag-sm-gap: var(--space-6); --tag-sm-height: 1.5rem; + --tag-sm-padding-block: var(--space-4); + --tag-sm-padding-inline: var(--space-6); --tag-xs-border-radius: var(--radius-md); + --tag-xs-font-size: var(--font-size-body-xs); --tag-xs-gap: var(--space-4); + --tag-xs-height: var(--space-20); --tag-xs-padding-block: var(--space-4); --tag-xs-padding-inline: var(--space-6); - --tag-xs-font-size: var(--font-size-body-xs); - --tag-xs-height: var(--space-20); --toast-md-gap: var(--space-16); --toast-md-padding-block: var(--space-16); --toast-md-padding-inline: var(--space-24); diff --git a/packages/cyberstorm-theme/src/styles/colors.css b/packages/cyberstorm-theme/src/styles/colors.css index 7f62da99d..78851b593 100644 --- a/packages/cyberstorm-theme/src/styles/colors.css +++ b/packages/cyberstorm-theme/src/styles/colors.css @@ -13,8 +13,10 @@ /* Misc */ --color-crown: var(--color-accent-yellow-5); --animation-timing-1: cubic-bezier(0.16, 1, 0.3, 1); - --shadow-lg: 0px 0px 4px 0px rgb(0 0 0 / 0.4), - 0px 6px 8px 0px rgb(0 0 0 / 0.5); + --shadow-lg: 0 0 4px 0 rgb(0 0 0 / 0.4), 0 6px 8px 0 rgb(0 0 0 / 0.5); + --shadow-md: 0 0 4px 0 rgb(0 0 0 / 0.4), 0 4px 8px 0 rgb(0 0 0 / 0.4); + --shadow-sm: 0 0 1px 0 rgb(0 0 0 / 0.4), 0 1px 2px 0 rgb(0 0 0 / 0.9); + --shadow-xl: 0 0 4px 0 rgb(0 0 0 / 0.4), 0 12px 32px 0 rgb(0 0 0 / 0.5); --dropshadow-default: drop-shadow(0 1px 1px #0d0d21); --textshadow-default: 0 1px 1px #0d0d21; diff --git a/packages/cyberstorm-theme/src/styles/globals.css b/packages/cyberstorm-theme/src/styles/globals.css index 9cbe32565..e6c4f0c50 100644 --- a/packages/cyberstorm-theme/src/styles/globals.css +++ b/packages/cyberstorm-theme/src/styles/globals.css @@ -27,18 +27,19 @@ /* Space affecting layout values */ - --gap-xxxs: var(--space-2); - --gap-xxs: var(--space-4); + --gap-3xs: var(--space-2); + --gap-2xs: var(--space-4); --gap-xs: var(--space-8); --gap-sm: var(--space-12); --gap-md: var(--space-16); + --gap-lg: var(--space-20); --gap-xl: var(--space-24); - --gap-xxl: var(--space-28); - --gap-xxxl: var(--space-32); - --gap-xxxxl: var(--space-36); - --gap-xxxxxl: var(--space-40); - --gap-xxxxxxl: var(--space-44); - --gap-xxxxxxxl: var(--space-48); + --gap-2xl: var(--space-28); + --gap-3xl: var(--space-32); + --gap-4xl: var(--space-36); + --gap-5xl: var(--space-40); + --gap-6xl: var(--space-44); + --gap-7xl: var(--space-48); --page-margin: 16rem; --page-margin-top: 25px; diff --git a/packages/cyberstorm-theme/src/styles/layout.css b/packages/cyberstorm-theme/src/styles/layout.css index 1aafae6bb..1fbe0fc10 100644 --- a/packages/cyberstorm-theme/src/styles/layout.css +++ b/packages/cyberstorm-theme/src/styles/layout.css @@ -2,7 +2,7 @@ :root { --section-bg: var(--color-surface-2); --section-border-radius: var(--radius-sm); - --section-gap: var(--gap-xxs); + --section-gap: var(--gap-2xs); } /* CONTAINER, basically flex wrapper utility class */ diff --git a/packages/cyberstorm/src/components/CodeInput/CodeInput.module.css b/packages/cyberstorm/src/components/CodeInput/CodeInput.module.css index a80d36d1f..17045185c 100644 --- a/packages/cyberstorm/src/components/CodeInput/CodeInput.module.css +++ b/packages/cyberstorm/src/components/CodeInput/CodeInput.module.css @@ -1,7 +1,7 @@ .root { display: flex; flex-direction: column; - gap: var(--gap-xxxxxxxl); + gap: var(--gap-7xl); } .inputContainer { diff --git a/packages/cyberstorm/src/components/ValidationBar/ValidationBar.module.css b/packages/cyberstorm/src/components/ValidationBar/ValidationBar.module.css index 94685b9c8..049214e8d 100644 --- a/packages/cyberstorm/src/components/ValidationBar/ValidationBar.module.css +++ b/packages/cyberstorm/src/components/ValidationBar/ValidationBar.module.css @@ -1,7 +1,7 @@ .root { display: flex; flex-direction: column; - gap: var(--gap-xxxxxxxl); + gap: var(--gap-7xl); } .inputContainer { diff --git a/packages/cyberstorm/src/newComponents/Drawer/Drawer.css b/packages/cyberstorm/src/newComponents/Drawer/Drawer.css index d939f57d9..f20f513d2 100644 --- a/packages/cyberstorm/src/newComponents/Drawer/Drawer.css +++ b/packages/cyberstorm/src/newComponents/Drawer/Drawer.css @@ -30,7 +30,7 @@ .drawer__fake-backdrop { width: 100%; - height: 10%; + height: 40%; background: transparent; } @@ -43,7 +43,7 @@ width: 100%; height: max-content; - max-height: 90%; + max-height: 60%; border: var(--drawer-border); border-radius: var(--drawer-border-radius); diff --git a/packages/cyberstorm/src/newComponents/EmptyState/EmptyState.css b/packages/cyberstorm/src/newComponents/EmptyState/EmptyState.css index 53cecdace..5800a00a5 100644 --- a/packages/cyberstorm/src/newComponents/EmptyState/EmptyState.css +++ b/packages/cyberstorm/src/newComponents/EmptyState/EmptyState.css @@ -1,7 +1,7 @@ .empty-state { display: flex; flex-direction: column; - gap: var(--gap-xxxl); + gap: var(--gap-3xl); color: var(--color-text--default); } diff --git a/packages/cyberstorm/src/newComponents/SelectSearch/SelectSearch.css b/packages/cyberstorm/src/newComponents/SelectSearch/SelectSearch.css index 804b5d9ee..9947f584c 100644 --- a/packages/cyberstorm/src/newComponents/SelectSearch/SelectSearch.css +++ b/packages/cyberstorm/src/newComponents/SelectSearch/SelectSearch.css @@ -136,7 +136,7 @@ z-index: 9999; display: flex; flex-direction: column; - gap: var(--gap-xxs); + gap: var(--gap-2xs); width: 100%; min-height: 1.5rem; max-height: 12rem; diff --git a/packages/cyberstorm/src/newComponents/TextInput/TextInput.tsx b/packages/cyberstorm/src/newComponents/TextInput/TextInput.tsx index e3a7689f1..f9fcdb060 100644 --- a/packages/cyberstorm/src/newComponents/TextInput/TextInput.tsx +++ b/packages/cyberstorm/src/newComponents/TextInput/TextInput.tsx @@ -77,32 +77,32 @@ export const TextInput = memo(function TextInput(props: TextInputProps) { {leftIcon} ) : null} - {csSize === "default" ? ( + {csSize === "textarea" ? ( {children} ) : ( {children}